From 6f5e6e46629d2b5d44c0f51d9fee81a072089d71 Mon Sep 17 00:00:00 2001 From: xwxuan <412658282@qq.com> Date: Thu, 8 Feb 2024 20:44:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=B0=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E5=88=86=E9=94=80=E5=95=86=20=E7=A7=AF=E5=88=86=20=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 59 +- sql/yshop_pro.sql | 201 ++- sql/初始化分销商.sql | 7 + yshop-dependencies/pom.xml | 22 +- yshop-framework/yshop-common/pom.xml | 4 + .../common/constant/ShopConstants.java | 23 + .../framework/common/enums/EnableEnum.java | 22 + .../framework/common/enums/OrderInfoEnum.java | 6 +- .../framework/common/util/date/DateUtils.java | 79 + .../common/util/date/LocalDateTimeUtils.java | 43 +- .../DistanceCalculatorUtil.java | 46 + .../framework/common/util/http/HttpUtils.java | 37 +- .../framework/common/util/io/IoUtils.java | 2 +- .../common/util/object/PageUtils.java | 2 +- .../aop/DataPermissionAnnotationAdvisor.java | 2 +- .../client/impl/SmsClientFactoryImpl.java | 1 - .../weixin/config/WxMiniProgramConfig.java | 52 + .../config/WxMiniProgramProperties.java | 18 + .../config/YshopFlowableConfiguration.java | 1 - .../core/scheduler/SchedulerManager.java | 2 +- ...efaultStreamMessageListenerContainerX.java | 2 +- .../core/query/LambdaQueryWrapperX.java | 14 + .../mybatis/core/type/EncryptTypeHandler.java | 2 +- .../config/YshopRedisAutoConfiguration.java | 12 + .../framework/redis/util/RedissonUtil.java | 87 ++ .../YshopWebSecurityConfigurerAdapter.java | 2 +- .../dto/KdniaoElectronicsOrderGoodsDTO.java | 1 + .../admin/express/ExpressController.java | 8 + .../module/infra/api/config/ConfigApi.java | 17 + .../infra/api/config/dto/ConfigDTO.java | 34 + .../yshop-module-infra-biz/pom.xml | 6 + .../infra/api/config/ConfigApiImpl.java | 25 + .../admin/config/ConfigController.java | 8 + .../app/qrcode/QrCodeController.java | 70 + .../app/qrcode/vo/QrCodeGenerateDTO.java | 14 + .../app/qrcode/vo/QrCodeGenerateMiniDTO.java | 18 + .../infra/convert/config/ConfigConvert.java | 5 + .../service/codegen/inner/CodegenBuilder.java | 2 +- .../infra/service/config/ConfigService.java | 7 + .../service/config/ConfigServiceImpl.java | 5 + yshop-module-mall/pom.xml | 2 + .../yshop/module/cart/enums/CartTypeEnum.java | 4 +- .../module/cart/enums/ErrorCodeConstants.java | 2 + .../module/cart/enums/OrderTypeEnum.java | 37 + .../app/cart/AppCartController.java | 21 +- .../app/cart/param/AppCartParam.java | 9 + .../storecart/AppStoreCartService.java | 2 +- .../storecart/AppStoreCartServiceImpl.java | 52 +- .../yshop-module-distributor-api/pom.xml | 40 + .../distributor/api/DistributorOrderApi.java | 15 + .../api/dto/DistributorOrderDTO.java | 27 + .../api/dto/DistributorProductDTO.java | 40 + .../enums/DistributorConstants.java | 27 + .../enums/DistributorLevelTypeEnum.java | 27 + .../enums/DistributorLevelUpTypeEnum.java | 27 + .../enums/DistributorOrderStatusEnum.java | 27 + .../enums/DistributorProductTypeEnum.java | 27 + .../enums/DistributorSettlementTypeEnum.java | 27 + .../enums/DistributorStatusEnum.java | 28 + .../enums/DistributorWagesLogTypeEnum.java | 31 + .../DistributorWithdrawalMethodTypeEnum.java | 28 + .../distributor/enums/ErrorCodeConstants.java | 47 + .../yshop-module-distributor-biz/pom.xml | 84 ++ .../api/DistributorOrderApiImpl.java | 279 ++++ .../distributor/DistributorController.java | 103 ++ .../distributor/vo/DistributorApplyReqVO.java | 27 + .../distributor/vo/DistributorBaseVO.java | 59 + .../vo/DistributorClearanceReqVO.java | 20 + .../vo/DistributorCreateReqVO.java | 25 + .../distributor/vo/DistributorExcelVO.java | 66 + .../vo/DistributorExportReqVO.java | 64 + .../distributor/vo/DistributorPageReqVO.java | 80 ++ .../distributor/vo/DistributorRespVO.java | 92 ++ .../vo/DistributorUpdateReqVO.java | 18 + .../DistributorDynamicsController.java | 102 ++ .../vo/DistributorDynamicsBaseVO.java | 29 + .../vo/DistributorDynamicsCreateReqVO.java | 14 + .../vo/DistributorDynamicsExcelVO.java | 37 + .../vo/DistributorDynamicsExportReqVO.java | 32 + .../vo/DistributorDynamicsPageReqVO.java | 34 + .../vo/DistributorDynamicsRespVO.java | 19 + .../vo/DistributorDynamicsUpdateReqVO.java | 18 + .../DistributorLevelController.java | 122 ++ .../vo/DistributorLevelBaseVO.java | 46 + .../vo/DistributorLevelCreateReqVO.java | 14 + .../vo/DistributorLevelExcelVO.java | 52 + .../vo/DistributorLevelExportReqVO.java | 47 + .../vo/DistributorLevelPageReqVO.java | 49 + .../vo/DistributorLevelRespVO.java | 22 + .../vo/DistributorLevelUpdateReqVO.java | 18 + .../DistributorOrderController.java | 93 ++ .../vo/DistributorOrderBaseVO.java | 94 ++ .../vo/DistributorOrderCreateReqVO.java | 14 + .../vo/DistributorOrderDetailsRespVO.java | 43 + .../vo/DistributorOrderExcelVO.java | 98 ++ .../vo/DistributorOrderExportReqVO.java | 98 ++ .../vo/DistributorOrderPageReqVO.java | 94 ++ .../vo/DistributorOrderRespVO.java | 19 + .../vo/DistributorOrderUpdateReqVO.java | 18 + .../DistributorUserController.java | 102 ++ .../vo/DistributorUserBaseVO.java | 62 + .../vo/DistributorUserCreateReqVO.java | 14 + .../vo/DistributorUserExcelVO.java | 60 + .../vo/DistributorUserExportReqVO.java | 62 + .../vo/DistributorUserPageReqVO.java | 58 + .../vo/DistributorUserRespVO.java | 16 + .../vo/DistributorUserUpdateReqVO.java | 18 + .../DistributorWagesController.java | 102 ++ .../vo/DistributorWagesBaseVO.java | 31 + .../vo/DistributorWagesCreateReqVO.java | 14 + .../vo/DistributorWagesExcelVO.java | 39 + .../vo/DistributorWagesExportReqVO.java | 34 + .../vo/DistributorWagesPageReqVO.java | 37 + .../vo/DistributorWagesRespVO.java | 19 + .../vo/DistributorWagesUpdateReqVO.java | 18 + .../DistributorWagesLogController.java | 182 +++ .../vo/DistributorWagesLogBaseVO.java | 51 + .../vo/DistributorWagesLogCreateReqVO.java | 14 + .../vo/DistributorWagesLogExcelVO.java | 50 + .../vo/DistributorWagesLogExportReqVO.java | 56 + .../vo/DistributorWagesLogPageReqVO.java | 53 + .../vo/DistributorWagesLogRespVO.java | 28 + .../vo/DistributorWagesLogUpdateReqVO.java | 18 + .../vo/DistributorWagesLogVerifyReqVO.java | 25 + .../vo/DistributorWithdrawExcelVO.java | 35 + ...DistributorWithdrawalMethodController.java | 102 ++ .../vo/DistributorWithdrawalMethodBaseVO.java | 35 + ...istributorWithdrawalMethodCreateReqVO.java | 14 + .../DistributorWithdrawalMethodExcelVO.java | 40 + ...istributorWithdrawalMethodExportReqVO.java | 37 + .../DistributorWithdrawalMethodPageReqVO.java | 39 + .../vo/DistributorWithdrawalMethodRespVO.java | 19 + ...istributorWithdrawalMethodUpdateReqVO.java | 18 + .../distributor/AppDistributorController.java | 54 + .../vo/AppDistributorApplyReqVO.java | 23 + .../vo/AppDistributorDetailsRespVO.java | 54 + .../vo/AppDistributorOrderPageReqVO.java | 26 + .../vo/AppDistributorQrcodeRespVO.java | 22 + .../distributor/vo/AppDistributorReqVO.java | 29 + .../vo/AppDistributorUpdateReqVO.java | 21 + .../vo/AppDistributorUserRespVO.java | 38 + .../AppDistributorOrderController.java | 48 + .../vo/AppDistributorOrderWagesRespVO.java | 22 + .../AppDistributorProductController.java | 45 + .../vo/AppDistributorProductRespVO.java | 29 + .../AppDistributorUserController.java | 60 + .../app/distributoruser/package-info.java | 4 + .../vo/AppDistributorUserCountRespVO.java | 18 + .../vo/AppDistributorUserPageReqVO.java | 27 + .../AppDistributorWagesController.java | 79 + .../vo/AppDistributorWagesPageReqVO.java | 28 + .../vo/AppDistributorWagesPageRespVO.java | 22 + .../vo/AppDistributorWagesRespVO.java | 24 + .../vo/AppDistributorWagesWithdrawReqVO.java | 27 + .../controller/app/package-info.java | 4 + .../distributor/DistributorConvert.java | 34 + .../DistributorDynamicsConvert.java | 34 + .../DistributorLevelConvert.java | 34 + .../DistributorOrderConvert.java | 34 + .../DistributorUserConvert.java | 34 + .../DistributorWagesConvert.java | 34 + .../DistributorWagesLogConvert.java | 34 + .../DistributorWithdrawalMethodConvert.java | 34 + .../dataobject/distributor/DistributorDO.java | 95 ++ .../DistributorDynamicsDO.java | 47 + .../distributorlevel/DistributorLevelDO.java | 65 + .../distributororder/DistributorOrderDO.java | 137 ++ .../distributoruser/DistributorUserDO.java | 87 ++ .../distributorwages/DistributorWagesDO.java | 49 + .../DistributorWagesLogDO.java | 77 + .../DistributorWithdrawalMethodDO.java | 55 + .../mysql/distributor/DistributorMapper.java | 74 + .../DistributorDynamicsMapper.java | 40 + .../DistributorLevelMapper.java | 48 + .../DistributorOrderMapper.java | 95 ++ .../DistributorUserMapper.java | 65 + .../DistributorWagesMapper.java | 58 + .../DistributorWagesLogMapper.java | 54 + .../DistributorWithdrawalMethodMapper.java | 44 + .../distributor/framework/package-info.java | 6 + .../config/DistributorWebConfiguration.java | 24 + .../framework/web/package-info.java | 4 + .../distributor/DistributorFacade.java | 84 ++ .../distributor/DistributorFacadeImpl.java | 444 ++++++ .../distributor/DistributorService.java | 82 ++ .../distributor/DistributorServiceImpl.java | 117 ++ .../DistributorDynamicsService.java | 70 + .../DistributorDynamicsServiceImpl.java | 82 ++ .../DistributorLevelFacade.java | 21 + .../DistributorLevelFacadeImpl.java | 177 +++ .../DistributorLevelService.java | 73 + .../DistributorLevelServiceImpl.java | 87 ++ .../DistributorOrderFacade.java | 17 + .../DistributorOrderFacadeImpl.java | 100 ++ .../DistributorOrderService.java | 83 ++ .../DistributorOrderServiceImpl.java | 116 ++ .../DistributorUserFacade.java | 16 + .../DistributorUserFacadeImpl.java | 151 ++ .../DistributorUserService.java | 74 + .../DistributorUserServiceImpl.java | 93 ++ .../DistributorWagesFacade.java | 35 + .../DistributorWagesFacadeImpl.java | 229 +++ .../DistributorWagesService.java | 93 ++ .../DistributorWagesServiceImpl.java | 115 ++ .../DistributorWagesLogFacade.java | 16 + .../DistributorWagesLogFacadeImpl.java | 54 + .../DistributorWagesLogService.java | 79 + .../DistributorWagesLogServiceImpl.java | 105 ++ .../DistributorWithdrawalMethodService.java | 70 + ...istributorWithdrawalMethodServiceImpl.java | 82 ++ .../mapper/distributor/DistributorMapper.xml | 12 + .../DistributorDynamicsMapper.xml | 12 + .../DistributorLevelMapper.xml | 12 + .../DistributorOrderMapper.xml | 12 + .../distributoruser/DistributorUserMapper.xml | 12 + .../DistributorWagesMapper.xml | 12 + .../DistributorWagesLogMapper.xml | 12 + .../DistributorWithdrawalMethodMapper.xml | 12 + .../DistributorServiceImplTest.java | 0 .../DistributorDynamicsServiceImplTest.java | 183 +++ .../DistributorLevelServiceImplTest.java | 0 .../DistributorOrderServiceImplTest.java | 335 +++++ .../DistributorUserServiceImplTest.java | 239 ++++ .../DistributorWagesServiceImplTest.java | 183 +++ .../DistributorWagesLogServiceImplTest.java | 215 +++ ...ibutorWithdrawalMethodServiceImplTest.java | 191 +++ .../api/productorder/ProductOrderApi.java | 22 + .../api/productorder/dto/ProductOrderDTO.java | 27 + .../api/rechargeorder/RechargeOrderApi.java | 13 + .../rechargeorder/dto/RechargeOrderDTO.java | 27 + .../order/enums/ErrorCodeConstants.java | 14 + .../order/enums/OrderDetailStateEnum.java | 38 + .../module/order/enums/OrderStatusEnum.java | 4 +- .../module/order/enums/OrderTypeEnum.java | 37 + .../order/enums/OrderWriteOffStatusEnum.java | 22 + .../order/enums/ReachargeOrderStatusEnum.java | 38 + .../enums/RechargePackageStatusEnum.java | 25 + .../module/order/enums/ShippingTypeEnum.java | 20 + .../yshop-module-order-biz/pom.xml | 22 + .../module/order/api/ProductOrderApiImpl.java | 70 + .../order/api/RechargeOrderApiImpl.java | 66 + .../RechargeConfigController.java | 120 ++ .../vo/RechargeAllConfigVO.java | 28 + .../vo/RechargeConfigBaseVO.java | 26 + .../vo/RechargeConfigCreateReqVO.java | 14 + .../vo/RechargeConfigExcelVO.java | 34 + .../vo/RechargeConfigExportReqVO.java | 29 + .../vo/RechargeConfigPageReqVO.java | 31 + .../vo/RechargeConfigRespVO.java | 19 + .../vo/RechargeConfigUpdateReqVO.java | 18 + .../RechargeOrderController.java | 108 ++ .../rechargeorder/vo/RechargeOrderBaseVO.java | 34 + .../vo/RechargeOrderCreateReqVO.java | 14 + .../vo/RechargeOrderExcelVO.java | 40 + .../vo/RechargeOrderExportReqVO.java | 35 + .../vo/RechargeOrderPageReqVO.java | 37 + .../rechargeorder/vo/RechargeOrderRespVO.java | 19 + .../vo/RechargeOrderUpdateReqVO.java | 18 + .../RechargePackageController.java | 102 ++ .../vo/RechargePackageBaseVO.java | 26 + .../vo/RechargePackageCreateReqVO.java | 14 + .../vo/RechargePackageExcelVO.java | 34 + .../vo/RechargePackageExportReqVO.java | 29 + .../vo/RechargePackagePageReqVO.java | 31 + .../vo/RechargePackageRespVO.java | 19 + .../vo/RechargePackageUpdateReqVO.java | 18 + .../vo/StoreAfterSalesBaseVO.java | 3 + .../storeorder/StoreOrderController.java | 25 +- .../admin/storeorder/vo/StoreOrderBaseVO.java | 14 +- .../storeorder/vo/StoreOrderPageReqVO.java | 19 +- .../admin/storeorder/vo/StoreOrderRespVO.java | 3 +- .../vo/StoreOrderDetailBaseVO.java | 47 + .../vo/StoreOrderDetailCreateReqVO.java | 14 + .../vo/StoreOrderDetailExcelVO.java | 49 + .../vo/StoreOrderDetailExportReqVO.java | 41 + .../vo/StoreOrderDetailPageReqVO.java | 44 + .../vo/StoreOrderDetailRespVO.java | 19 + .../vo/StoreOrderDetailUpdateReqVO.java | 18 + .../controller/app/TestOrderController.java | 37 + .../AppOrderAfterSalesController.java | 7 +- .../afterorder/param/AppOrderRefundParam.java | 45 + .../app/afterorder/param/AppProsuctParam.java | 5 + .../vo/AppAfterSalesDetailQueryVo.java | 24 + .../vo/AppAfterSalesProductDetailQueryVo.java | 21 + .../vo/AppStoreOrderAfterSalesDetailVo.java | 6 + .../vo/AppStoreOrderCartInfoVo.java | 6 + .../app/order/AppOrderController.java | 49 +- .../app/order/param/AppComputeOrderParam.java | 13 +- .../app/order/param/AppConfirmOrderParam.java | 12 +- .../app/order/param/AppOrderParam.java | 29 +- .../app/order/param/AppPayParam.java | 2 +- .../controller/app/order/vo/AppComputeVo.java | 8 +- .../app/order/vo/AppConfirmOrderVo.java | 7 - .../app/order/vo/AppOrderDetailVO.java | 35 + .../app/order/vo/AppStoreOrderQueryVo.java | 34 +- .../AppRechargeOrderController.java | 38 + .../vo/AppRechargeOrderCreateReqVO.java | 23 + .../AppRechargePackageController.java | 35 + .../rechargeconfig/RechargeConfigConvert.java | 37 + .../rechargeorder/RechargeOrderConvert.java | 37 + .../RechargePackageConvert.java | 37 + .../StoreOrderDetailConvert.java | 36 + .../rechargeconfig/RechargeConfigDO.java | 43 + .../rechargeorder/RechargeOrderDO.java | 52 + .../rechargepackage/RechargePackageDO.java | 43 + .../storeaftersales/StoreAfterSalesDO.java | 18 +- .../dataobject/storeorder/StoreOrderDO.java | 49 +- .../StoreOrderCartInfoDO.java | 17 +- .../storeorderdetail/StoreOrderDetailDO.java | 81 ++ .../rechargeconfig/RechargeConfigMapper.java | 38 + .../rechargeorder/RechargeOrderMapper.java | 42 + .../RechargePackageMapper.java | 38 + .../mysql/storeorder/StoreOrderMapper.java | 18 +- .../StoreOrderDetailMapper.java | 58 + .../order/dal/redis/RedisKeyConstants.java | 4 + .../module/order/handle/RedisDelayHandle.java | 96 +- .../order/mq/consumer/PayRefundConsumer.java | 32 + .../rechargeconfig/RechargeConfigFacade.java | 11 + .../RechargeConfigFacadeImpl.java | 53 + .../rechargeconfig/RechargeConfigService.java | 70 + .../RechargeConfigServiceImpl.java | 82 ++ .../service/rechargeorder/RechargeFacade.java | 9 + .../rechargeorder/RechargeFacadeImpl.java | 73 + .../rechargeorder/RechargeOrderService.java | 72 + .../RechargeOrderServiceImpl.java | 122 ++ .../RechargePackageService.java | 70 + .../RechargePackageServiceImpl.java | 82 ++ .../AppStoreAfterSalesService.java | 6 +- .../AppStoreAfterSalesServiceImpl.java | 206 ++- .../StoreAfterSalesServiceImpl.java | 79 +- .../storeorder/AppDistributorOrderFacade.java | 19 + .../AppDistributorOrderFacadeImpl.java | 119 ++ .../storeorder/AppStoreOrderService.java | 51 +- .../storeorder/AppStoreOrderServiceImpl.java | 1272 ++++++++++++----- .../service/storeorder/StoreOrderService.java | 19 +- .../storeorder/StoreOrderServiceImpl.java | 223 ++- .../service/storeorder/dto/PriceGroupDto.java | 50 +- .../service/storeorder/dto/StatusDto.java | 1 + .../dto/applet/AppletNoticeDto.java | 37 + .../storeorder/dto/applet/Contact.java | 23 + .../storeorder/dto/applet/OrderKey.java | 17 + .../service/storeorder/dto/applet/Payer.java | 13 + .../storeorder/dto/applet/ShippingList.java | 20 + .../storeorder/dto/applet/TokenResult.java | 16 + .../StoreOrderCartInfoServiceImpl.java | 6 +- .../StoreOrderDetailService.java | 97 ++ .../StoreOrderDetailServiceImpl.java | 124 ++ .../rechargeconfig/RechargeConfigMapper.xml | 12 + .../rechargeorder/RechargeOrderMapper.xml | 12 + .../rechargepackage/RechargePackageMapper.xml | 12 + .../mapper/storeorder/StoreOrderMapper.xml | 13 + .../StoreOrderDetailMapper.xml | 35 + .../src/test/java/DistrTest.java | 21 + .../RechargeConfigServiceImplTest.java | 175 +++ .../RechargePackageServiceImplTest.java | 175 +++ .../module/product/api/coupon/CouponApi.java | 19 + .../product/api/product/ProductApi.java | 7 + .../product/api/product/dto/ProductDTO.java | 22 + .../api/product/dto/ProductPageReqVO.java | 26 + .../product/enums/ErrorCodeConstants.java | 14 + .../enums/campaign/CampaignCommonEnum.java | 18 + .../enums/campaign/CampaignStateEnum.java | 20 + .../enums/campaign/CampaignTypeEnum.java | 19 + .../enums/campaign/TeamworkStateEnum.java | 19 + .../product/enums/common/PageTypeEnum.java | 18 + .../enums/product/StockBackTypeEnum.java | 22 + .../enums/teamworkinfo/TeamworkStateEnum.java | 19 + .../enums/teamworkinfo/TeamworkTypeEnum.java | 18 + .../enums/teamworkinfo/VirtuallyEnum.java | 18 + .../yshop-module-product-biz/pom.xml | 10 + .../product/api/coupon/CouponApiImpl.java | 26 + .../product/api/product/ProductApiImpl.java | 63 +- .../vo/CampaignDetailBaseVO.java | 48 + .../vo/CampaignDetailCreateReqVO.java | 32 + .../vo/CampaignDetailExcelVO.java | 49 + .../vo/CampaignDetailExportReqVO.java | 43 + .../vo/CampaignDetailPageReqVO.java | 45 + .../vo/CampaignDetailRespVO.java | 48 + .../vo/CampaignDetailUpdateReqVO.java | 18 + .../vo/CampaignSkuDetailRespVO.java | 55 + .../campaigninfo/CampaignInfoController.java | 142 ++ .../param/CampaignJudgmentParam.java | 26 + .../vo/CampaignDataDetailPageReqVO.java | 20 + .../vo/CampaignDataDetailRespVO.java | 44 + .../campaigninfo/vo/CampaignDataRespVO.java | 34 + .../campaigninfo/vo/CampaignInfoBaseVO.java | 61 + .../vo/CampaignInfoCreateReqVO.java | 63 + .../campaigninfo/vo/CampaignInfoExcelVO.java | 59 + .../vo/CampaignInfoExportReqVO.java | 59 + .../vo/CampaignInfoPageReqVO.java | 29 + .../vo/CampaignInfoPageRespVO.java | 42 + .../campaigninfo/vo/CampaignInfoRespVO.java | 27 + .../vo/CampaignInfoUpdateReqVO.java | 64 + .../campaigninfo/vo/CampaignOrderVo.java | 32 + .../vo/CanvasCampaignPageReqVO.java | 31 + .../vo/CanvasCampaignPageRespVO.java | 33 + .../category/ProductCategoryController.java | 12 +- .../vo/ProductCategoryTreeRespVO.java | 28 + .../ProductCouponController.java | 11 +- .../vo/CanvasProductCouponPageReqVO.java | 28 + .../vo/CanvasProductCouponRespVO.java | 18 + .../storeproduct/StoreProductController.java | 17 +- .../vo/CampaignProductPageReqVO.java | 23 + .../vo/CampaignProductRespVO.java | 40 + .../storeproduct/vo/CampaignSkuRespVO.java | 32 + .../vo/CanvasProductPageReqVO.java | 32 + .../storeproduct/vo/StoreProductBaseVO.java | 26 + .../vo/StoreProductPageReqVO.java | 5 +- .../storeproduct/vo/StoreProductRespVO.java | 38 + .../vo/StoreProductUpdateReqVO.java | 5 + .../teamworkinfo/TeamworkInfoController.java | 54 + .../param/TeamworkRefundParam.java | 18 + .../teamworkinfo/vo/TeamworkInfoBaseVO.java | 32 + .../vo/TeamworkInfoCreateReqVO.java | 14 + .../teamworkinfo/vo/TeamworkInfoCreateVO.java | 24 + .../vo/TeamworkInfoPageReqVO.java | 30 + .../teamworkinfo/vo/TeamworkInfoRespVO.java | 53 + .../vo/TeamworkInfoUpdateReqVO.java | 18 + .../vo/TeamworkOrderInfoPageReqVO.java | 18 + .../vo/TeamworkOrderInfoRespVO.java | 26 + .../campaigninfo/AppCampaignController.java | 47 + .../campaigninfo/vo/AppCampaignSkuRespVO.java | 65 + .../vo/CampaignNumberJudgeVO.java | 27 + .../campaigninfo/vo/CampaignProductReqVO.java | 35 + .../vo/CampaignProductRespVO.java | 44 + .../app/campaigninfo/vo/CampaignSkuVO.java | 23 + .../app/cart/vo/AppStoreCartQueryVo.java | 12 + .../app/coupon/AppCouponController.java | 20 +- .../AppCouponRelationController.java | 6 +- .../product/AppStoreProductController.java | 22 +- .../param/AppStoreProductQueryParam.java | 3 + .../app/product/vo/AppProductVo.java | 2 +- .../vo/AppStoreProductAttrQueryVo.java | 4 +- .../vo/AppStoreProductAttrValueVo.java | 153 ++ .../vo/AppStoreProductDetailReqVo.java | 25 + .../app/product/vo/AppStoreProductRespVo.java | 28 + .../teamworkinfo/AppTeamworkController.java | 74 + .../vo/AppTeamworkProductDetailRespVO.java | 48 + .../teamworkinfo/vo/AppWaitTeamworkReqVO.java | 20 + .../vo/AppWaitTeamworkRespVO.java | 36 + .../vo/AppWaitTeamworkUserRespVO.java | 29 + .../campaigndetail/CampaignDetailConvert.java | 36 + .../campaigninfo/CampaignInfoConvert.java | 45 + .../category/ProductCategoryConvert.java | 3 + .../storeproduct/StoreProductConvert.java | 2 + .../StoreProductAttrValueConvert.java | 11 +- .../StoreProductCouponConvert.java | 3 + .../teamworkinfo/TeamworkInfoConvert.java | 32 + .../campaigndetail/CampaignDetailDO.java | 57 + .../campaigninfo/CampaignInfoDO.java | 84 ++ .../storeproduct/StoreProductDO.java | 21 + .../StoreProductAttrValueDO.java | 24 +- .../teamworkinfo/TeamworkInfoDO.java | 53 + .../campaigndetail/CampaignDetailMapper.java | 60 + .../campaigninfo/CampaignInfoMapper.java | 81 ++ .../productcoupon/ProductCouponMapper.java | 22 + .../ProductCouponRelationMapper.java | 2 + .../storeproduct/StoreProductMapper.java | 70 +- .../teamworkinfo/TeamworkInfoMapper.java | 54 + .../mq/producer/PayRefundProducer.java | 25 + .../campaigndetail/CampaignDetailService.java | 24 + .../CampaignDetailServiceImpl.java | 30 + .../campaigninfo/AppCampaignInfoService.java | 41 + .../AppCampaignInfoServiceImpl.java | 70 + .../campaigninfo/CampaignInfoService.java | 107 ++ .../campaigninfo/CampaignInfoServiceImpl.java | 594 ++++++++ .../category/ProductCategoryService.java | 8 + .../category/ProductCategoryServiceImpl.java | 35 + .../productcoupon/AppCouponService.java | 3 +- .../productcoupon/AppCouponServiceImpl.java | 29 +- .../productcoupon/ProductCouponService.java | 13 +- .../ProductCouponServiceImpl.java | 18 +- .../AppCouponRelationService.java | 19 +- .../AppCouponRelationServiceImpl.java | 24 +- .../storeproduct/AppStoreProductService.java | 27 +- .../AppStoreProductServiceImpl.java | 122 +- .../storeproduct/StoreProductService.java | 26 +- .../storeproduct/StoreProductServiceImpl.java | 159 ++- .../storeproduct/dto/AttrValueDto.java | 2 +- .../service/storeproduct/dto/DetailDto.java | 2 +- .../storeproduct/dto/FormatDetailDto.java | 2 +- .../service/storeproduct/dto/ProductDto.java | 26 +- .../storeproduct/dto/ProductFormatDto.java | 12 +- .../storeproduct/dto/ProductResultDto.java | 2 +- .../storeproduct/dto/StoreProductDto.java | 33 +- .../storeproduct/dto/YxStoreProductDto.java | 2 +- .../dto/YxStoreProductRelationDto.java | 2 +- .../dto/YxStoreProductReplyDto.java | 2 +- .../dto/YxStoreProductRuleDto.java | 2 +- .../dto/YxStoreProductSmallDto.java | 2 +- .../AppStoreProductAttrServiceImpl.java | 6 +- .../StoreProductAttrService.java | 6 +- .../StoreProductAttrServiceImpl.java | 12 +- .../StoreProductAttrValueService.java | 10 + .../StoreProductAttrValueServiceImpl.java | 13 + .../teamworkinfo/TeamworkInfoService.java | 132 ++ .../teamworkinfo/TeamworkInfoServiceImpl.java | 279 ++++ .../backuprecord/BackupRecordMapper.xml | 12 +- .../campaigndetail/CampaignDetailMapper.xml | 59 + .../campaigninfo/CampaignInfoMapper.xml | 122 ++ .../ProductCouponRelationMapper.xml | 13 + .../teamworkinfo/TeamworkInfoMapper.xml | 133 ++ .../module/shop/enums/ErrorCodeConstants.java | 20 + .../shop/enums/canvas/CanvasTerminalEnum.java | 19 + .../module/shop/enums/common/StateEnum.java | 18 + .../shop/enums/popup/PopupJumpTypeEnum.java | 21 + .../yshop-module-shop-biz/pom.xml | 6 + .../admin/canvas/CanvasController.java | 123 ++ .../admin/canvas/vo/CanvasBaseVO.java | 28 + .../admin/canvas/vo/CanvasCreateReqVO.java | 19 + .../admin/canvas/vo/CanvasDetailReqVO.java | 17 + .../admin/canvas/vo/CanvasExcelVO.java | 31 + .../admin/canvas/vo/CanvasExportReqVO.java | 26 + .../canvas/vo/CanvasJsonUpdateReqVO.java | 25 + .../admin/canvas/vo/CanvasPageReqVO.java | 33 + .../admin/canvas/vo/CanvasPageRespVO.java | 29 + .../admin/canvas/vo/CanvasRespVO.java | 31 + .../admin/canvas/vo/CanvasUpdateReqVO.java | 25 + .../canvasdetail/vo/CanvasDetailBaseVO.java | 28 + .../canvasdetail/vo/CanvasDetailRespVO.java | 27 + .../vo/CanvasDetailUpdateReqVO.java | 22 + .../admin/material/MaterialController.java | 22 +- .../admin/material/vo/MaterialBaseVO.java | 4 +- .../vo/MaterialBatchUpdateGroupReqVO.java | 21 + .../admin/material/vo/MaterialRespVO.java | 4 +- .../material/vo/MaterialUpdateReqVO.java | 2 +- .../MaterialGroupController.java | 14 +- .../admin/popup/PopupController.java | 88 ++ .../admin/popup/param/PopupCheckParam.java | 18 + .../admin/popup/vo/PopupBaseVO.java | 47 + .../admin/popup/vo/PopupCreateReqVO.java | 41 + .../admin/popup/vo/PopupPageReqVO.java | 31 + .../admin/popup/vo/PopupRespVO.java | 19 + .../admin/popup/vo/PopupUpdateReqVO.java | 46 + .../controller/admin/shop/ShopController.java | 109 ++ .../controller/admin/shop/vo/ShopBaseVO.java | 66 + .../admin/shop/vo/ShopCreateReqVO.java | 14 + .../controller/admin/shop/vo/ShopExcelVO.java | 58 + .../admin/shop/vo/ShopExportReqVO.java | 57 + .../admin/shop/vo/ShopPageReqVO.java | 62 + .../controller/admin/shop/vo/ShopRespVO.java | 22 + .../admin/shop/vo/ShopUpdateReqVO.java | 18 + .../ShopAssistantController.java | 100 ++ .../shopassistant/vo/ShopAssistantBaseVO.java | 34 + .../vo/ShopAssistantCreateReqVO.java | 14 + .../vo/ShopAssistantExcelVO.java | 40 + .../vo/ShopAssistantExportReqVO.java | 35 + .../vo/ShopAssistantPageReqVO.java | 37 + .../shopassistant/vo/ShopAssistantRespVO.java | 28 + .../vo/ShopAssistantUpdateReqVO.java | 18 + .../controller/app/AppShopController.java | 38 + .../app/canvas/AppCanvasController.java | 41 + .../app/canvas/vo/CanvasEnableReqVO.java | 17 + .../app/popup/AppPopupController.java | 35 + .../app/popup/vo/PopupInfoRespVO.java | 39 + .../shop/controller/app/vo/ShopDTO.java | 19 + .../shop/controller/app/vo/WriteOffDTO.java | 17 + .../shop/convert/canvas/CanvasConvert.java | 35 + .../canvasdetail/CanvasDetailConvert.java | 30 + .../shop/convert/popup/PopupConvert.java | 40 + .../module/shop/convert/shop/ShopConvert.java | 37 + .../shopassistant/ShopAssistantConvert.java | 37 + .../shop/dal/dataobject/canvas/CanvasDO.java | 40 + .../canvasdetail/CanvasDetailDO.java | 43 + .../shop/dal/dataobject/popup/PopupDO.java | 62 + .../shop/dal/dataobject/shop/ShopDO.java | 80 ++ .../shopassistant/ShopAssistantDO.java | 51 + .../shop/dal/mysql/canvas/CanvasMapper.java | 37 + .../canvasdetail/CanvasDetailMapper.java | 15 + .../shop/dal/mysql/popup/PopupMapper.java | 33 + .../shop/dal/mysql/shop/ShopMapper.java | 56 + .../shopassistant/ShopAssistantMapper.java | 43 + .../shop/service/canvas/CanvasService.java | 93 ++ .../service/canvas/CanvasServiceImpl.java | 140 ++ .../canvasdetail/CanvasDetailService.java | 30 + .../canvasdetail/CanvasDetailServiceImpl.java | 114 ++ .../service/material/MaterialService.java | 2 + .../service/material/MaterialServiceImpl.java | 11 + .../shop/service/popup/PopupService.java | 78 + .../shop/service/popup/PopupServiceImpl.java | 186 +++ .../module/shop/service/shop/ShopService.java | 79 + .../shop/service/shop/ShopServiceImpl.java | 116 ++ .../shopassistant/ShopAssistantService.java | 74 + .../ShopAssistantServiceImpl.java | 166 +++ .../resources/mapper/canvas/CanvasMapper.xml | 12 + .../canvasdetail/CanvasDetailMapper.xml | 12 + .../resources/mapper/popup/PopupMapper.xml | 24 + .../main/resources/mapper/shop/ShopMapper.xml | 12 + .../shopassistant/ShopAssistantMapper.xml | 12 + .../api/integralRule/IntegralRuleDTO.java | 46 + .../module/member/api/user/MemberUserApi.java | 4 +- .../api/user/MemberUserNowMoneyApi.java | 9 + .../api/user/dto/IncreaseNowMoneyDTO.java | 30 + .../api/user/dto/MemberUserRespDTO.java | 13 + .../member/api/user/dto/WechatUserDto.java | 6 +- .../module/member/enums/BillDetailEnum.java | 15 +- .../member/enums/ErrorCodeConstants.java | 28 + .../module/member/enums/LevelEquityEnum.java | 23 + .../member/enums/LevelGrowthValueEnum.java | 21 + .../yshop-module-member-biz/pom.xml | 5 + .../member/api/user/MemberUserApiImpl.java | 8 +- .../api/user/MemberUserNowMoneyApiImpl.java | 35 + .../admin/burypoint/BuryPointController.java | 108 ++ .../admin/burypoint/vo/BuryPointBaseVO.java | 29 + .../burypoint/vo/BuryPointCreateReqVO.java | 14 + .../admin/burypoint/vo/BuryPointExcelVO.java | 37 + .../burypoint/vo/BuryPointExportReqVO.java | 32 + .../burypoint/vo/BuryPointPageReqVO.java | 34 + .../admin/burypoint/vo/BuryPointRespVO.java | 19 + .../burypoint/vo/BuryPointUpdateReqVO.java | 18 + .../integralrule/IntegralRuleController.java | 114 ++ .../integralrule/vo/IntegralRuleBaseVO.java | 35 + .../vo/IntegralRuleCreateReqVO.java | 14 + .../integralrule/vo/IntegralRuleExcelVO.java | 38 + .../vo/IntegralRuleExportReqVO.java | 32 + .../vo/IntegralRulePageReqVO.java | 34 + .../integralrule/vo/IntegralRuleRespVO.java | 19 + .../vo/IntegralRuleUpdateReqVO.java | 18 + .../admin/integralrule/vo/IntegralRuleVO.java | 24 + .../signinrecord/SignInRecordController.java | 102 ++ .../signinrecord/vo/SignInRecordBaseVO.java | 25 + .../vo/SignInRecordCreateReqVO.java | 14 + .../signinrecord/vo/SignInRecordExcelVO.java | 31 + .../vo/SignInRecordExportReqVO.java | 26 + .../vo/SignInRecordPageReqVO.java | 28 + .../signinrecord/vo/SignInRecordRespVO.java | 25 + .../vo/SignInRecordUpdateReqVO.java | 18 + .../admin/user/MemberUserController.java | 58 +- .../admin/user/vo/MemberUserExcelVO.java | 38 + .../controller/admin/user/vo/UserBaseVO.java | 39 +- .../admin/user/vo/UserCreateReqVO.java | 1 - .../admin/user/vo/UserExportReqVO.java | 11 +- .../admin/user/vo/UserPageReqVO.java | 5 + .../controller/admin/user/vo/UserRespVO.java | 7 + .../admin/user/vo/UserUpdateMoneyReqVO.java | 2 +- .../admin/user/vo/UserUpdateTagDTO.java | 19 + .../useraddress/vo/UserAddressBaseVO.java | 25 +- .../useraddress/vo/UserAddressRespVO.java | 4 +- .../vo/UserAddressUpdateReqVO.java | 2 +- .../admin/userbill/UserBillController.java | 43 +- .../admin/userbill/vo/UserBillModifyDTO.java | 31 + .../admin/userbill/vo/UserBillPageReqVO.java | 14 +- .../admin/userbill/vo/UserBillRespVO.java | 8 + .../UserInviteLogController.java | 102 ++ .../userinvitelog/vo/UserInviteLogBaseVO.java | 25 + .../vo/UserInviteLogCreateReqVO.java | 14 + .../vo/UserInviteLogExcelVO.java | 31 + .../vo/UserInviteLogExportReqVO.java | 26 + .../vo/UserInviteLogPageReqVO.java | 28 + .../userinvitelog/vo/UserInviteLogRespVO.java | 19 + .../vo/UserInviteLogUpdateReqVO.java | 18 + .../UserLevelConfigController.java | 102 ++ .../vo/UserLevelConfigBaseVO.java | 42 + .../vo/UserLevelConfigCreateReqVO.java | 18 + .../vo/UserLevelConfigExcelVO.java | 46 + .../vo/UserLevelConfigExportReqVO.java | 41 + .../vo/UserLevelConfigPageReqVO.java | 43 + .../vo/UserLevelConfigRespVO.java | 26 + .../vo/UserLevelConfigUpdateReqVO.java | 22 + .../UserLevelEquityController.java | 101 ++ .../vo/UserLevelEquityBaseVO.java | 28 + .../vo/UserLevelEquityCreateReqVO.java | 14 + .../vo/UserLevelEquityExcelVO.java | 36 + .../vo/UserLevelEquityExportReqVO.java | 30 + .../vo/UserLevelEquityPageReqVO.java | 32 + .../vo/UserLevelEquityRespVO.java | 19 + .../vo/UserLevelEquityUpdateReqVO.java | 18 + .../UserLevelEquityRefController.java | 102 ++ .../vo/UserLevelEquityRefBaseVO.java | 28 + .../vo/UserLevelEquityRefCreateReqVO.java | 14 + .../vo/UserLevelEquityRefExcelVO.java | 33 + .../vo/UserLevelEquityRefExportReqVO.java | 30 + .../vo/UserLevelEquityRefPageReqVO.java | 28 + .../vo/UserLevelEquityRefRespVO.java | 20 + .../vo/UserLevelEquityRefUpdateReqVO.java | 18 + .../UserLevelGrowthValueConfigController.java | 102 ++ .../vo/UserLevelGrowthValueConfigBaseVO.java | 25 + ...UserLevelGrowthValueConfigCreateReqVO.java | 14 + .../vo/UserLevelGrowthValueConfigExcelVO.java | 34 + ...UserLevelGrowthValueConfigExportReqVO.java | 29 + .../UserLevelGrowthValueConfigPageReqVO.java | 31 + .../vo/UserLevelGrowthValueConfigRespVO.java | 19 + ...UserLevelGrowthValueConfigUpdateReqVO.java | 18 + .../admin/usertag/UserTagController.java | 101 ++ .../admin/usertag/vo/UserTagBaseVO.java | 23 + .../admin/usertag/vo/UserTagCreateReqVO.java | 14 + .../admin/usertag/vo/UserTagExcelVO.java | 31 + .../admin/usertag/vo/UserTagExportReqVO.java | 26 + .../admin/usertag/vo/UserTagPageReqVO.java | 28 + .../admin/usertag/vo/UserTagRespVO.java | 26 + .../admin/usertag/vo/UserTagUpdateReqVO.java | 18 + .../usertaggroup/UserTagGroupController.java | 101 ++ .../usertaggroup/vo/UserTagGroupBaseVO.java | 23 + .../vo/UserTagGroupCreateReqVO.java | 14 + .../usertaggroup/vo/UserTagGroupExcelVO.java | 31 + .../vo/UserTagGroupExportReqVO.java | 26 + .../vo/UserTagGroupPageReqVO.java | 28 + .../usertaggroup/vo/UserTagGroupRespVO.java | 19 + .../vo/UserTagGroupUpdateReqVO.java | 18 + .../admin/usertagref/vo/UserTagRefBaseVO.java | 23 + .../usertagref/vo/UserTagRefCreateReqVO.java | 15 + .../usertagref/vo/UserTagRefExcelVO.java | 31 + .../usertagref/vo/UserTagRefExportReqVO.java | 33 + .../usertagref/vo/UserTagRefPageReqVO.java | 28 + .../admin/usertagref/vo/UserTagRefRespVO.java | 19 + .../usertagref/vo/UserTagRefUpdateReqVO.java | 18 + .../app/address/AppUserAddressController.java | 2 - .../app/address/vo/AppUserAddressQueryVo.java | 26 +- .../app/address/vo/AreaNodeRespVO.java | 4 +- .../app/auth/vo/AppAuthCheckCodeReqVO.java | 2 +- .../app/auth/vo/AppAuthLoginReqVO.java | 10 +- .../app/auth/vo/AppAuthLoginRespVO.java | 8 +- .../auth/vo/AppAuthResetPasswordReqVO.java | 6 +- .../app/auth/vo/AppAuthSmsLoginReqVO.java | 15 +- .../app/auth/vo/AppAuthSocialLoginReqVO.java | 6 +- .../auth/vo/AppAuthUpdatePasswordReqVO.java | 4 +- .../vo/AppAuthWeixinMiniAppLoginReqVO.java | 3 + .../app/burypoint/AppBuryPointController.java | 45 + .../AppSignInRecordController.java | 64 + .../app/signinrecord/vo/SignInInfoVO.java | 27 + .../app/social/vo/AppSocialUserBindReqVO.java | 6 +- .../social/vo/AppSocialUserUnbindReqVO.java | 4 +- .../app/user/AppUserController.java | 10 +- .../app/user/vo/AppUserInfoRespVO.java | 32 +- .../app/user/vo/AppUserOrderCountVo.java | 16 +- .../app/user/vo/AppUserQueryVo.java | 46 +- .../app/user/vo/AppUserUpdateMobileReqVO.java | 8 +- .../app/userbill/AppUserBillController.java | 43 + .../app/userlevel/AppUserLevelController.java | 89 ++ .../app/userlevel/vo/SettleLevelInfoVO.java | 22 + .../app/userlevel/vo/UserLevelInfoVO.java | 23 + .../convert/burypoint/BuryPointConvert.java | 34 + .../integralrule/IntegralRuleConvert.java | 34 + .../signinrecord/SignInRecordConvert.java | 34 + .../member/convert/user/UserConvert.java | 3 + .../userinvitelog/UserInviteLogConvert.java | 34 + .../UserLevelConfigConvert.java | 34 + .../UserLevelEquityConvert.java | 34 + .../UserLevelEquityRefConvert.java | 34 + .../UserLevelGrowthValueConfigConvert.java | 34 + .../convert/usertag/UserTagConvert.java | 34 + .../usertaggroup/UserTagGroupConvert.java | 34 + .../convert/usertagref/UserTagRefConvert.java | 34 + .../dal/dataobject/burypoint/BuryPointDO.java | 47 + .../burypoint/TrendChartRespVO.java | 18 + .../integralrule/IntegralRuleDO.java | 56 + .../signinrecord/SignInRecordDO.java | 41 + .../dal/dataobject/user/MemberUserDO.java | 30 +- .../userinvitelog/UserInviteLogDO.java | 39 + .../userlevelconfig/UserLevelConfigDO.java | 63 + .../userlevelequity/UserLevelEquityDO.java | 48 + .../UserLevelEquityRefDO.java | 44 + .../UserLevelGrowthValueConfigDO.java | 47 + .../dal/dataobject/usertag/UserTagDO.java | 52 + .../usertaggroup/UserTagGroupDO.java | 39 + .../dataobject/usertagref/UserTagRefDO.java | 45 + .../dal/mysql/burypoint/BuryPointMapper.java | 43 + .../integralrule/IntegralRuleMapper.java | 44 + .../signinrecord/SignInRecordMapper.java | 36 + .../dal/mysql/user/MemberUserMapper.java | 29 +- .../dal/mysql/userbill/UserBillMapper.java | 36 +- .../userinvitelog/UserInviteLogMapper.java | 36 + .../UserLevelConfigMapper.java | 46 + .../UserLevelEquityMapper.java | 38 + .../UserLevelEquityRefMapper.java | 39 + .../UserLevelGrowthValueConfigMapper.java | 38 + .../dal/mysql/usertag/UserTagMapper.java | 38 + .../usertaggroup/UserTagGroupMapper.java | 36 + .../mysql/usertagref/UserTagRefMapper.java | 39 + .../service/auth/MemberAuthServiceImpl.java | 36 +- .../service/burypoint/BuryPointService.java | 73 + .../burypoint/BuryPointServiceImpl.java | 88 ++ .../integralrule/IntegralRuleService.java | 90 ++ .../integralrule/IntegralRuleServiceImpl.java | 120 ++ .../AbstractIntegralRuleStrategy.java | 74 + .../strategy/IntegralRuleContext.java | 55 + .../strategy/IntegralRuleStrategy.java | 33 + .../impl/ConsumeIntegralRuleStrategy.java | 31 + .../impl/DefaultIntegralRuleStrategy.java | 26 + .../signinrecord/SignInRecordService.java | 103 ++ .../signinrecord/SignInRecordServiceImpl.java | 284 ++++ .../service/user/MemberUserService.java | 17 +- .../service/user/MemberUserServiceImpl.java | 122 +- .../member/service/user/UserService.java | 47 +- .../member/service/user/UserServiceImpl.java | 160 ++- .../service/user/dto/WechatUserDto.java | 2 +- .../useraddress/UserAddressServiceImpl.java | 6 + .../service/userbill/UserBillService.java | 58 +- .../service/userbill/UserBillServiceImpl.java | 76 +- .../userinvitelog/UserInviteLogService.java | 81 ++ .../UserInviteLogServiceImpl.java | 93 ++ .../UserLevelConfigService.java | 107 ++ .../UserLevelConfigServiceImpl.java | 251 ++++ .../UserLevelEquityService.java | 69 + .../UserLevelEquityServiceImpl.java | 82 ++ .../UserLevelEquityRefService.java | 87 ++ .../UserLevelEquityRefServiceImpl.java | 120 ++ .../UserLevelGrowthValueConfigService.java | 76 + ...UserLevelGrowthValueConfigServiceImpl.java | 87 ++ .../service/usertag/UserTagService.java | 76 + .../service/usertag/UserTagServiceImpl.java | 98 ++ .../usertaggroup/UserTagGroupService.java | 69 + .../usertaggroup/UserTagGroupServiceImpl.java | 83 ++ .../service/usertagref/UserTagRefService.java | 84 ++ .../usertagref/UserTagRefServiceImpl.java | 114 ++ .../mapper/burypoint/BuryPointMapper.xml | 24 + .../integralrule/IntegralRuleMapper.xml | 12 + .../signinrecord/SignInRecordMapper.xml | 12 + .../mapper/userbill/UserBillMapper.xml | 41 + .../userinvitelog/UserInviteLogMapper.xml | 12 + .../userlevelconfig/UserLevelConfigMapper.xml | 12 + .../userlevelequity/UserLevelEquityMapper.xml | 12 + .../UserLevelEquityRefMapper.xml | 23 + .../UserLevelGrowthValueConfigMapper.xml | 12 + .../mapper/usertag/UserTagMapper.xml | 22 + .../usertaggroup/UserTagGroupMapper.xml | 12 + .../mapper/usertagref/UserTagRefMapper.xml | 33 + .../burypoint/BuryPointServiceImplTest.java | 183 +++ .../IntegralRuleServiceImplTest.java | 183 +++ .../SignInRecordServiceImplTest.java | 167 +++ .../UserInviteLogServiceImplTest.java | 167 +++ .../UserLevelConfigServiceImplTest.java | 207 +++ .../UserLevelEquityServiceImplTest.java | 176 +++ .../UserLevelEquityRefServiceImplTest.java | 167 +++ ...LevelGrowthValueConfigServiceImplTest.java | 179 +++ .../usertag/UserTagServiceImplTest.java | 167 +++ .../UserTagGroupServiceImplTest.java | 167 +++ .../usertagref/UserTagRefServiceImplTest.java | 165 +++ .../vo/WechatTemplateBaseVO.java | 8 +- .../vo/WechatTemplateRespVO.java | 4 +- .../vo/WechatTemplateUpdateReqVO.java | 2 +- .../wechattemplate/WechatTemplateService.java | 15 +- .../WechatTemplateServiceImpl.java | 23 +- .../supply/WeiXinSubscribeService.java | 9 +- .../message/supply/WeixinTemplateService.java | 8 +- .../module/mp/enums/CpKfServiceStateEnum.java | 25 + yshop-module-mp/yshop-module-mp-biz/pom.xml | 13 + .../CustomerServiceController.java | 147 ++ .../customerservice/vo/AddServicerDTO.java | 19 + .../customerservice/vo/CustomerServiceVO.java | 23 + .../admin/customerservice/vo/ServicerVO.java | 14 + .../material/vo/MpMaterialPageReqVO.java | 2 +- .../vo/MpMaterialUploadNewsImageReqVO.java | 4 +- .../vo/MpMaterialUploadPermanentReqVO.java | 6 +- .../material/vo/MpMaterialUploadRespVO.java | 4 +- .../vo/MpMaterialUploadTemporaryReqVO.java | 6 +- .../vo/autoreply/MpAutoReplyCreateReqVO.java | 2 +- .../vo/autoreply/MpAutoReplyUpdateReqVO.java | 2 +- .../admin/open/WxPortalController.java | 82 ++ .../statistics/vo/MpStatisticsGetReqVO.java | 2 +- .../MpStatisticsInterfaceSummaryRespVO.java | 10 +- .../vo/MpStatisticsUpstreamMessageRespVO.java | 6 +- .../vo/MpStatisticsUserCumulateRespVO.java | 4 +- .../vo/MpStatisticsUserSummaryRespVO.java | 8 +- .../mini/AppCustomerServiceController.java | 57 + .../app/mini/AppMiniProgramController.java | 85 ++ .../app/mini/vo/AppCustomerServiceVO.java | 17 + .../customerservice/CustomerServiceDO.java | 48 + .../dal/dataobject/message/MpAutoReplyDO.java | 24 +- .../CustomerServiceMapper.java | 13 + .../framework/cp/builder/AbstractBuilder.java | 16 + .../mp/framework/cp/builder/ImageBuilder.java | 25 + .../mp/framework/cp/builder/TextBuilder.java | 22 + .../cp/config/WxCpConfiguration.java | 130 ++ .../framework/cp/config/WxCpProperties.java | 54 + .../mp/framework/cp/config/WxCpTest.java | 31 + .../framework/mp/config/MpConfiguration.java | 20 +- .../mp/core/DefaultMpServiceFactory.java | 21 +- .../CustomerServiceService.java | 29 + .../CustomerServiceServiceImpl.java | 98 ++ .../service/handler/cp/AbstractHandler.java | 12 + .../handler/cp/EnterSessionHandler.java | 82 ++ .../mp/service/handler/cp/LogHandler.java | 24 + .../mp/service/handler/cp/MsgHandler.java | 40 + .../service/handler/mp/menu/MenuHandler.java | 33 + .../mp/message/MessageAutoReplyHandler.java | 41 + .../mp/message/MessageReceiveHandler.java | 36 + .../handler/mp/other/KfSessionHandler.java | 26 + .../service/handler/mp/other/NullHandler.java | 24 + .../service/handler/mp/other/ScanHandler.java | 25 + .../mp/other/StoreCheckNotifyHandler.java | 24 + .../handler/mp/other/package-info.java | 4 + .../handler/mp/user/LocationHandler.java | 49 + .../handler/mp/user/SubscribeHandler.java | 52 + .../handler/mp/user/UnsubscribeHandler.java | 39 + .../material/MpMaterialServiceImpl.java | 1 - .../message/MpAutoReplyServiceImpl.java | 1 - .../mp/service/user/MpUserServiceImpl.java | 6 +- .../config/handlers/AliPayMessageHandler.java | 40 +- .../config/handlers/WxPayMessageHandler.java | 2 +- .../module/pay/enums/ErrorCodeConstants.java | 2 + .../module/pay/enums/PayOrderConstants.java | 19 + .../yshop/module/pay/enums/PayTypeEnum.java | 12 +- .../pay/mq/message/PayRefundMessage.java | 19 + yshop-module-pay/yshop-module-pay-biz/pom.xml | 26 + .../yixiang/yshop/module/pay/PayContext.java | 3 - .../admin/merchantdetails/vo/PayParam.java | 10 +- .../pay/controller/app/AppPayController.java | 134 ++ .../pay/controller/app/vo/AppPayParam.java | 30 + .../pay/processor/PayOrderProcessor.java | 21 + .../pay/processor/PayOrderProcessorImpl.java | 142 ++ .../MerchantDetailsService.java | 2 + .../MerchantDetailsServiceImpl.java | 5 + .../yshop/module/pay/strategy/Pay.java | 2 +- .../yshop/module/pay/strategy/PayClient.java | 19 + .../module/pay/strategy/PayClientFactory.java | 15 + .../pay/strategy/PayClientFactoryImpl.java | 47 + .../yshop/module/pay/strategy/PayFactory.java | 3 +- .../module/pay/strategy/type/AliPay.java | 11 +- .../module/pay/strategy/type/IntegralPay.java | 17 + .../module/pay/strategy/type/NowMoneyPay.java | 23 + .../module/pay/strategy/type/WeChatPay.java | 31 +- .../weixin/service/WxPayServiceUtils.java | 19 +- .../weixin/service/impl/WxPayServiceImpl.java | 12 +- .../system/enums/DictTypeConstants.java | 7 + .../system/enums/DistributorDictEnum.java | 33 + .../admin/dict/DictDataController.java | 14 + .../admin/notice/NoticeController.java | 2 +- .../app/dict/AppDictDataController.java | 33 +- .../system/dal/mysql/dict/DictDataMapper.java | 4 + .../backuprecord/BackupRecordServiceImpl.java | 29 +- .../system/service/dict/DictDataService.java | 26 +- .../service/dict/DictDataServiceImpl.java | 49 +- .../permission/PermissionServiceImpl.java | 3 - yshop-server/pom.xml | 5 + .../src/main/resources/application-dev.yaml | 16 +- .../src/main/resources/application-local.yaml | 28 +- .../src/main/resources/application-prod.yaml | 254 ++++ 928 files changed, 39318 insertions(+), 1408 deletions(-) create mode 100644 sql/初始化分销商.sql create mode 100644 yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java create mode 100644 yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java create mode 100644 yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java create mode 100644 yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java create mode 100644 yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java create mode 100644 yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApi.java create mode 100644 yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/dto/ConfigDTO.java create mode 100644 yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApiImpl.java create mode 100644 yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/QrCodeController.java create mode 100644 yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateDTO.java create mode 100644 yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateMiniDTO.java create mode 100644 yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/OrderTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/pom.xml create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApi.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorOrderDTO.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorProductDTO.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorConstants.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelUpTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorOrderStatusEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorProductTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorSettlementTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorStatusEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWagesLogTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWithdrawalMethodTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/ErrorCodeConstants.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/pom.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApiImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/DistributorController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorApplyReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorClearanceReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/DistributorDynamicsController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/DistributorLevelController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/DistributorOrderController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderDetailsRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/DistributorUserController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/DistributorWagesController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/DistributorWagesLogController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogVerifyReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWithdrawExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/DistributorWithdrawalMethodController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodBaseVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExcelVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/AppDistributorController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorApplyReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorDetailsRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorOrderPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorQrcodeRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUserRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/AppDistributorOrderController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/vo/AppDistributorOrderWagesRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/AppDistributorProductController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/vo/AppDistributorProductRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/AppDistributorUserController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/package-info.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserCountRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/AppDistributorWagesController.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesRespVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesWithdrawReqVO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/package-info.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributor/DistributorConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributordynamics/DistributorDynamicsConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorlevel/DistributorLevelConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributororder/DistributorOrderConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributoruser/DistributorUserConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwages/DistributorWagesConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwageslog/DistributorWagesLogConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwithdrawalmethod/DistributorWithdrawalMethodConvert.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributor/DistributorDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributordynamics/DistributorDynamicsDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorlevel/DistributorLevelDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributororder/DistributorOrderDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributoruser/DistributorUserDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwages/DistributorWagesDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwageslog/DistributorWagesLogDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwithdrawalmethod/DistributorWithdrawalMethodDO.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributor/DistributorMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributordynamics/DistributorDynamicsMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorlevel/DistributorLevelMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributororder/DistributorOrderMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributoruser/DistributorUserMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwages/DistributorWagesMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwageslog/DistributorWagesLogMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/package-info.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/config/DistributorWebConfiguration.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/package-info.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacade.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacade.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacade.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacade.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacade.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacade.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodService.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributor/DistributorMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributordynamics/DistributorDynamicsMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorlevel/DistributorLevelMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributororder/DistributorOrderMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributoruser/DistributorUserMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwages/DistributorWagesMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwageslog/DistributorWagesLogMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.xml create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/ProductOrderApi.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/dto/ProductOrderDTO.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/RechargeOrderApi.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/dto/RechargeOrderDTO.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderDetailStateEnum.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderWriteOffStatusEnum.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ReachargeOrderStatusEnum.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/RechargePackageStatusEnum.java create mode 100644 yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/ProductOrderApiImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/RechargeOrderApiImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/RechargeConfigController.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeAllConfigVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigBaseVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExcelVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigRespVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/RechargeOrderController.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderBaseVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExcelVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderRespVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/RechargePackageController.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageBaseVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExcelVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackagePageReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageRespVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailBaseVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExcelVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailRespVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/TestOrderController.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppOrderRefundParam.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesDetailQueryVo.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesProductDetailQueryVo.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppOrderDetailVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/AppRechargeOrderController.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/vo/AppRechargeOrderCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargepackage/AppRechargePackageController.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeconfig/RechargeConfigConvert.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeorder/RechargeOrderConvert.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargepackage/RechargePackageConvert.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorderdetail/StoreOrderDetailConvert.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeconfig/RechargeConfigDO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeorder/RechargeOrderDO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargepackage/RechargePackageDO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorderdetail/StoreOrderDetailDO.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeconfig/RechargeConfigMapper.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeorder/RechargeOrderMapper.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargepackage/RechargePackageMapper.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayRefundConsumer.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacade.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigService.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacade.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderService.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageService.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacade.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacadeImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/AppletNoticeDto.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Contact.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/OrderKey.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Payer.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/ShippingList.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/TokenResult.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderdetail/StoreOrderDetailService.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderdetail/StoreOrderDetailServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeconfig/RechargeConfigMapper.xml create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeorder/RechargeOrderMapper.xml create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargepackage/RechargePackageMapper.xml create mode 100644 yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorderdetail/StoreOrderDetailMapper.xml create mode 100644 yshop-module-mall/yshop-module-order-biz/src/test/java/DistrTest.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImplTest.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApi.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductDTO.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignCommonEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignStateEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/TeamworkStateEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/common/PageTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/StockBackTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkStateEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/VirtuallyEnum.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApiImpl.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailBaseVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExcelVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignSkuDetailRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/CampaignInfoController.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/param/CampaignJudgmentParam.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoBaseVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExcelVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignOrderVo.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/vo/ProductCategoryTreeRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignSkuRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CanvasProductPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/TeamworkInfoController.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/param/TeamworkRefundParam.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoBaseVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/AppCampaignController.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/AppCampaignSkuRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignNumberJudgeVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignSkuVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrValueVo.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductDetailReqVo.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/AppTeamworkController.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppTeamworkProductDetailRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkReqVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkUserRespVO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigndetail/CampaignDetailConvert.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigninfo/CampaignInfoConvert.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/teamworkinfo/TeamworkInfoConvert.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigndetail/CampaignDetailDO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigninfo/CampaignInfoDO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/teamworkinfo/TeamworkInfoDO.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigndetail/CampaignDetailMapper.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigninfo/CampaignInfoMapper.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/teamworkinfo/TeamworkInfoMapper.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/mq/producer/PayRefundProducer.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailService.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoService.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoService.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoService.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/campaigndetail/CampaignDetailMapper.xml create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/campaigninfo/CampaignInfoMapper.xml create mode 100644 yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/teamworkinfo/TeamworkInfoMapper.xml create mode 100644 yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/canvas/CanvasTerminalEnum.java create mode 100644 yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/common/StateEnum.java create mode 100644 yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/popup/PopupJumpTypeEnum.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/CanvasController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasBaseVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasDetailReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExcelVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasJsonUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailBaseVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBatchUpdateGroupReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/PopupController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/param/PopupCheckParam.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupBaseVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/ShopController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopBaseVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExcelVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/ShopAssistantController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantBaseVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantCreateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExcelVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExportReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantPageReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantUpdateReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/AppShopController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/AppCanvasController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/vo/CanvasEnableReqVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/AppPopupController.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/vo/PopupInfoRespVO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/ShopDTO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/WriteOffDTO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvas/CanvasConvert.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvasdetail/CanvasDetailConvert.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/popup/PopupConvert.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shop/ShopConvert.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shopassistant/ShopAssistantConvert.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvas/CanvasDO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvasdetail/CanvasDetailDO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/popup/PopupDO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shop/ShopDO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shopassistant/ShopAssistantDO.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvas/CanvasMapper.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvasdetail/CanvasDetailMapper.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/popup/PopupMapper.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shop/ShopMapper.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shopassistant/ShopAssistantMapper.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasService.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailService.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupService.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopService.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantService.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantServiceImpl.java create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvas/CanvasMapper.xml create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvasdetail/CanvasDetailMapper.xml create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/popup/PopupMapper.xml create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shop/ShopMapper.xml create mode 100644 yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shopassistant/ShopAssistantMapper.xml create mode 100644 yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/integralRule/IntegralRuleDTO.java create mode 100644 yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApi.java create mode 100644 yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/IncreaseNowMoneyDTO.java create mode 100644 yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelEquityEnum.java create mode 100644 yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelGrowthValueEnum.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApiImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/BuryPointController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/IntegralRuleController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRulePageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/SignInRecordController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/MemberUserExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateTagDTO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillModifyDTO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/UserInviteLogController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/UserLevelConfigController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/UserLevelEquityController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/UserLevelEquityRefController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/UserTagController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/UserTagGroupController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefBaseVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefCreateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExcelVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExportReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefPageReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefUpdateReqVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/burypoint/AppBuryPointController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/AppSignInRecordController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/vo/SignInInfoVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userbill/AppUserBillController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/AppUserLevelController.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/SettleLevelInfoVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/UserLevelInfoVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/burypoint/BuryPointConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/integralrule/IntegralRuleConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/signinrecord/SignInRecordConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userinvitelog/UserInviteLogConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelconfig/UserLevelConfigConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequity/UserLevelEquityConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequityref/UserLevelEquityRefConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertag/UserTagConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertaggroup/UserTagGroupConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertagref/UserTagRefConvert.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/BuryPointDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/TrendChartRespVO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/integralrule/IntegralRuleDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/signinrecord/SignInRecordDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userinvitelog/UserInviteLogDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelconfig/UserLevelConfigDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequity/UserLevelEquityDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequityref/UserLevelEquityRefDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertag/UserTagDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertaggroup/UserTagGroupDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertagref/UserTagRefDO.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/burypoint/BuryPointMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/integralrule/IntegralRuleMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/signinrecord/SignInRecordMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userinvitelog/UserInviteLogMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelconfig/UserLevelConfigMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequity/UserLevelEquityMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequityref/UserLevelEquityRefMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertag/UserTagMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertaggroup/UserTagGroupMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertagref/UserTagRefMapper.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/AbstractIntegralRuleStrategy.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleContext.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleStrategy.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/ConsumeIntegralRuleStrategy.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/DefaultIntegralRuleStrategy.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefService.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImpl.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/burypoint/BuryPointMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/integralrule/IntegralRuleMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/signinrecord/SignInRecordMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userbill/UserBillMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userinvitelog/UserInviteLogMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelconfig/UserLevelConfigMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequity/UserLevelEquityMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequityref/UserLevelEquityRefMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertag/UserTagMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertaggroup/UserTagGroupMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertagref/UserTagRefMapper.xml create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImplTest.java create mode 100644 yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImplTest.java create mode 100644 yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/CpKfServiceStateEnum.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/AddServicerDTO.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/ServicerVO.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/WxPortalController.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppCustomerServiceController.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppMiniProgramController.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/vo/AppCustomerServiceVO.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/mysql/customerservice/CustomerServiceMapper.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/AbstractBuilder.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/ImageBuilder.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/TextBuilder.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpConfiguration.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpProperties.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpTest.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/AbstractHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/EnterSessionHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/LogHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/MsgHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/menu/MenuHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageAutoReplyHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageReceiveHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/KfSessionHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/NullHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/ScanHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/StoreCheckNotifyHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/package-info.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/LocationHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/SubscribeHandler.java create mode 100644 yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/UnsubscribeHandler.java create mode 100644 yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/enums/PayOrderConstants.java create mode 100644 yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/mq/message/PayRefundMessage.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/AppPayController.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/vo/AppPayParam.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessor.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessorImpl.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClient.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactory.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactoryImpl.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/IntegralPay.java create mode 100644 yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/NowMoneyPay.java create mode 100644 yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DistributorDictEnum.java create mode 100644 yshop-server/src/main/resources/application-prod.yaml diff --git a/.gitignore b/.gitignore index 8575d42..e3a09bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,51 +1,36 @@ -###################################################################### -# Build Tools +*.class +.DS_Store -.gradle -/build/ -!gradle/wrapper/gradle-wrapper.jar +# Package Files # +*.jar +*.war +*.ear +**/target/ +**/**/target/ -target/ -!.mvn/wrapper/maven-wrapper.jar +# eclipse +.settings/ +.classpath +.project +logs/ -###################################################################### -# IDE +# idea +.idea/ +*.iml +.murphy.yml + +*velocity.log* ### STS ### .apt_generated -.classpath .factorypath -.project -.settings .springBeans ### IntelliJ IDEA ### .idea *.iws -*.iml *.ipr - -### NetBeans ### -nbproject/private/ -build/* -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ - -###################################################################### -# Others *.log -*.xml.versionsBackup -*.swp - -!*/build/*.java -!*/build/*.html -!*/build/*.xml - -### JRebel ### -rebel.xml - -application-my.yaml - -/yshop-ui-app/unpackage/ +tmp/ +!DmJdbcDriver18.jar +!kingbase8-8.6.0.jar diff --git a/sql/yshop_pro.sql b/sql/yshop_pro.sql index a4047c8..8255f6e 100644 --- a/sql/yshop_pro.sql +++ b/sql/yshop_pro.sql @@ -7542,7 +7542,7 @@ CREATE TABLE `yshop_store_product_attr_bak` ( `attr_values` varchar(256) NOT NULL COMMENT '属性值', PRIMARY KEY (`id`) USING BTREE, KEY `store_id` (`product_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=538 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性表备份'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性表备份'; -- ---------------------------- -- Records of yshop_store_product_attr_bak @@ -7561,7 +7561,7 @@ CREATE TABLE `yshop_store_product_attr_result` ( `change_time` datetime NOT NULL COMMENT '上次修改时间', PRIMARY KEY (`id`) USING BTREE, KEY `product_id` (`product_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=349 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表'; -- ---------------------------- -- Records of yshop_store_product_attr_result @@ -7634,7 +7634,7 @@ CREATE TABLE `yshop_store_product_attr_result_bak` ( `change_time` datetime NOT NULL COMMENT '上次修改时间', PRIMARY KEY (`id`) USING BTREE, KEY `product_id` (`product_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=346 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表备份'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表备份'; -- ---------------------------- -- Records of yshop_store_product_attr_result_bak @@ -7670,7 +7670,7 @@ CREATE TABLE `yshop_store_product_attr_value` ( PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `unique` (`unique`,`sku`) USING BTREE, KEY `store_id` (`product_id`,`sku`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=515 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表'; -- ---------------------------- -- Records of yshop_store_product_attr_value @@ -7862,7 +7862,7 @@ CREATE TABLE `yshop_store_product_attr_value_bak` ( PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `unique` (`unique`,`sku`) USING BTREE, KEY `store_id` (`product_id`,`sku`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=515 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表备份'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表备份'; -- ---------------------------- -- Records of yshop_store_product_attr_value_bak @@ -8087,7 +8087,7 @@ CREATE TABLE `yshop_store_product_bak` ( KEY `sales` (`sales`) USING BTREE, KEY `add_time` (`create_time`) USING BTREE, KEY `is_postage` (`is_postage`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品表'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品表'; -- ---------------------------- -- Records of yshop_store_product_bak @@ -8113,7 +8113,7 @@ CREATE TABLE `yshop_store_product_brand` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌'; -- ---------------------------- -- Records of yshop_store_product_brand @@ -8144,7 +8144,7 @@ CREATE TABLE `yshop_store_product_brand_bak` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌备份'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌备份'; -- ---------------------------- -- Records of yshop_store_product_brand_bak @@ -8176,7 +8176,7 @@ CREATE TABLE `yshop_store_product_category` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类'; -- ---------------------------- -- Records of yshop_store_product_category @@ -8230,7 +8230,7 @@ CREATE TABLE `yshop_store_product_category_bak` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类备份'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类备份'; -- ---------------------------- -- Records of yshop_store_product_category_bak @@ -8354,7 +8354,7 @@ CREATE TABLE `yshop_store_product_coupon_relation_bak` ( `deleted` bit(1) DEFAULT b'0' COMMENT '删除', `tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品优惠券关联表备份'; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品优惠券关联表备份'; -- ---------------------------- -- Records of yshop_store_product_coupon_relation_bak @@ -8642,3 +8642,182 @@ INSERT INTO `yshop_wechat_template` (`id`, `tempkey`, `name`, `content`, `tempid COMMIT; SET FOREIGN_KEY_CHECKS = 1; + + +-- ---------------------------- +-- Table structure for yshop_material_bak 2023/11/24 素材库备份表 +-- ---------------------------- +DROP TABLE IF EXISTS `yshop_material_bak`; +CREATE TABLE `yshop_material_bak` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `creator` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建者', + `type` char(2) COLLATE utf8mb4_bin NOT NULL COMMENT '类型1、图片;2、视频', + `group_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分组ID', + `name` varchar(200) COLLATE utf8mb4_bin NOT NULL COMMENT '素材名', + `url` varchar(500) COLLATE utf8mb4_bin DEFAULT '' COMMENT '素材链接', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='素材库备份表'; + +SET FOREIGN_KEY_CHECKS = 1; + + +-- ---------------------------- +-- Table structure for yshop_material_group_bak +-- ---------------------------- +DROP TABLE IF EXISTS `yshop_material_group_bak`; +CREATE TABLE `yshop_material_group_bak` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `creator` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建者', + `name` varchar(200) COLLATE utf8mb4_bin NOT NULL COMMENT '分组名', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='素材分组备份表'; + +SET FOREIGN_KEY_CHECKS = 1; + +-- 2024-1-15 +CREATE TABLE `yshop_campaign_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '营销活动id', + `name` varchar(50) NOT NULL COMMENT '活动名称', + `type` tinyint(4) NOT NULL COMMENT '活动类型:1、拼团,2、秒杀,3、限时折扣', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `start_time` varchar(20) NOT NULL COMMENT '活动开始时间', + `end_time` varchar(20) NOT NULL COMMENT '活动结束时间', + `if_limit` tinyint(1) NOT NULL COMMENT '商品限购 1-不限购 2-限购', + `limit_number` int(11) DEFAULT NULL COMMENT '限购几件/人', + `if_enable` tinyint(1) NOT NULL COMMENT '活动预热 1-停用 2-启用', + `enable_time` int(11) DEFAULT NULL COMMENT '预热几分钟前', + `state` tinyint(1) DEFAULT NULL COMMENT '活动状态 0-未开始 1-进行中 2-已结束', + `person` int(11) DEFAULT NULL COMMENT '成团人数', + `effective_time` int(11) DEFAULT NULL COMMENT '成团有效时间几(分钟)', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活动信息表'; + +CREATE TABLE `yshop_campaign_detail` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '营销活动明细id', + `campaign_id` bigint(20) NOT NULL COMMENT '营销活动id', + `product_id` bigint(20) NOT NULL COMMENT '商品id', + `sku_id` bigint(20) NOT NULL COMMENT '规格id', + `original_price` decimal(15,2) NOT NULL COMMENT '原价', + `price` decimal(15,2) NOT NULL COMMENT '活动价格', + `discount` decimal(4,2) DEFAULT NULL COMMENT '折扣比例', + `stock` int(11) NOT NULL COMMENT '活动库存剩余数量', + `total` int(11) NOT NULL COMMENT '活动库存总数量', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='营销活动明细表'; + +-- 订单表新增字段 +ALTER TABLE yshop_store_order ADD `campaign_detail_id` bigint(20) DEFAULT NULL COMMENT '营销活动明细id'; +ALTER TABLE yshop_store_order ADD `campaign_type` tinyint(4) DEFAULT NULL COMMENT '活动类型:1、拼团,2、秒杀,3、限时折扣'; + +CREATE TABLE `yshop_store_order_detail` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单明细id', + `oid` bigint(20) NOT NULL COMMENT '订单id', + `order_cart_id` bigint(20) NOT NULL COMMENT '订单购物详情id', + `product_id` bigint(20) NOT NULL COMMENT '商品ID', + `sku_id` bigint(20) NOT NULL COMMENT '规格id', + `product_attr_unique` varchar(50) NOT NULL DEFAULT '' COMMENT '唯一id', + `original_price` decimal(15,2) NOT NULL COMMENT '原价', + `price` decimal(15,2) NOT NULL COMMENT '实际价格', + `postage_price` decimal(8,2) DEFAULT '0.00' COMMENT '邮费金额', + `state` tinyint(1) DEFAULT '0' COMMENT '状态:1、正常,2、售后中,3、售后完成', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单明细表'; + +CREATE TABLE `yshop_canvas` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '画布id', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称', + `json` longtext COMMENT '画布json数据', + `state` tinyint(1) DEFAULT NULL COMMENT '状态 0-关闭 1-开启', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='画布信息表'; + +CREATE TABLE `yshop_popup` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '弹窗id', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称', + `start_time` varchar(20) NOT NULL COMMENT '开始时间', + `end_time` varchar(20) NOT NULL COMMENT '结束时间', + `popup_image` text NOT NULL COMMENT '弹窗图', + `button_image` text NOT NULL COMMENT '按钮图', + `type` tinyint(4) NOT NULL COMMENT '跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序', + `link` text DEFAULT NULL COMMENT '链接', + `state` tinyint(1) DEFAULT NULL COMMENT '状态 0-关闭 1-开启', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='弹窗表'; + +-- 2024-1-16 -- +alter table yshop_store_order_detail add `order_id` varchar(32) NOT NULL COMMENT '订单号'; +alter table yshop_store_product add `is_distribution` tinyint(1) DEFAULT '0' COMMENT '是否分销:0-否,1-是'; +alter table yshop_campaign_info add `is_virtually` tinyint(1) DEFAULT '0' COMMENT '是否虚拟成团:0-否,1-是'; +alter table yshop_store_order add `teamwork_id` bigint(20) DEFAULT NULL COMMENT '拼团id'; + +CREATE TABLE `yshop_teamwork_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '拼团id', + `campaign_id` bigint(20) NOT NULL COMMENT '拼团活动id', + `people` int(11) NOT NULL COMMENT '参团人数', + `state` tinyint(1) NOT NULL COMMENT '成团状态 0-拼团中 1-拼团成功 2-拼团失败', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拼团信息表' + + +alter table yshop_teamwork_info add `regimental_commander_id` bigint(20) NOT NULL COMMENT '团长id'; +alter table yshop_teamwork_info add `campaign_detail_id` bigint(20) NOT NULL COMMENT '营销活动明细id'; +alter table yshop_canvas add `type` tinyint(1) NOT NULL COMMENT '画布类型 1-首页 2-我的'; + +CREATE TABLE `yshop_canvas_detail` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '画布明细id', + `canvas_id` bigint(20) NOT NULL COMMENT '画布id', + `terminal` tinyint(1) NOT NULL COMMENT '终端 1-小程序 2-H5 3-APP', + `json` longtext COMMENT '画布json数据', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='画布明细表'; + diff --git a/sql/初始化分销商.sql b/sql/初始化分销商.sql new file mode 100644 index 0000000..9c24309 --- /dev/null +++ b/sql/初始化分销商.sql @@ -0,0 +1,7 @@ +TRUNCATE TABLE yshop_distributor; +TRUNCATE TABLE yshop_distributor_dynamics; +TRUNCATE TABLE yshop_distributor_order; +TRUNCATE TABLE yshop_distributor_user; +TRUNCATE TABLE yshop_distributor_wages; +TRUNCATE TABLE yshop_distributor_wages_log; +TRUNCATE TABLE yshop_distributor_withdrawal_method; \ No newline at end of file diff --git a/yshop-dependencies/pom.xml b/yshop-dependencies/pom.xml index 75ea747..1420b88 100644 --- a/yshop-dependencies/pom.xml +++ b/yshop-dependencies/pom.xml @@ -72,7 +72,9 @@ 4.3.0 1.0.3 2.14.5 + 3.3.3 + 4.6.0 @@ -87,6 +89,11 @@ + + co.yixiang.boot + yshop-module-distributor-biz + ${revision} + co.yixiang.boot yshop-spring-boot-starter-banner @@ -584,12 +591,19 @@ justauth-spring-boot-starter ${justauth.version} - + com.github.binarywang wx-java-mp-spring-boot-starter ${wx-java-mp.version} + + + com.github.binarywang + weixin-java-cp + ${weixin-java-cp.version} + + @@ -635,6 +649,12 @@ pay-java-web-support ${pay.version} + + + com.google.zxing + core + ${qrcode.version} + diff --git a/yshop-framework/yshop-common/pom.xml b/yshop-framework/yshop-common/pom.xml index df50609..38c27cc 100644 --- a/yshop-framework/yshop-common/pom.xml +++ b/yshop-framework/yshop-common/pom.xml @@ -137,6 +137,10 @@ com.alibaba transmittable-thread-local + + com.squareup.okhttp3 + okhttp + diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java index efe8c73..1b5cb30 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java @@ -194,4 +194,27 @@ public interface ShopConstants { //快递查询接口Logistic String KDNIAO_LOGISTIC_QUERY="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"; + + /** + * redis营销活动状态变更key + */ + String CAMPAIGN_CHANGE = "campaign-change-queue"; + + /** + * redis广告弹窗状态变更key + */ + String POPUP_CHANGE = "popup-change-queue"; + + /** + * redis拼团状态变更key + */ + String TEAMWORK_CHANGE = "teamwork-change-queue"; + + String DAY_FORMAT_STR = "yyyy-MM-dd"; + + /** + * redis 订单收货后不可关闭售后 key + */ + String CLOSE_AFTER_SALE_KEY = "close-after-sale-key"; + } diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java new file mode 100644 index 0000000..d7fff87 --- /dev/null +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.framework.common.enums; + +import lombok.Getter; + +/** + * @author pepis + * @apiNote 开启关闭枚举 + **/ +@Getter +public enum EnableEnum { + DISABLE(0,"禁用"), + ENABLE(1,"启用"), + ; + private final Integer value; + + private final String desc; + + EnableEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java index 0185202..913697c 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java @@ -20,11 +20,13 @@ public enum OrderInfoEnum { STATUS_APPLY_REFUND(-1,"申请退款"), STATUS_REFUND_SUCCESS(-2,"退款成功"), + STATUS_GROUP_FAILURE(-4,"成团失败"), STATUS_DEFAULT(0,"默认"), STATUS_WAIT_RECEIVED(1,"待收货"), STATUS_RECEIVED(2,"已收货"), STATUS_FINISHED(3,"已完成"), STATUS_CANCEL(4,"取消"), + STATUS_WAIT_GROUP(5,"待成团"), PAY_STATUS_UNPAID(0,"未支付"), PAY_STATUS_HAVE_PAID(1,"已支付"), @@ -61,7 +63,9 @@ public enum OrderInfoEnum { SHIPPING_TYPE_STORE_PICKUP(2,"门店自提"), UNABLE_AFTER_SALES(0,"不能售后"), - ABLE_AFTER_SALES(1,"能售后"); + ABLE_AFTER_SALES(1,"能售后"), + + CAMPAIGN_ORDER(2,"活动订单"); diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java index 2ab53b0..e15cbae 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java @@ -1,5 +1,6 @@ package co.yixiang.yshop.framework.common.util.date; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import java.time.*; @@ -170,4 +171,82 @@ public class DateUtils { return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now()); } + + /** + * 判断当前时间是否处在开始时间和结束时间之间 + * + * @param start + * @param end + * @return 是否 + */ + public static boolean isBelong(LocalDateTime start,LocalDateTime end) { + return isBefore(end) && isAfter(start); + } + + /** + * 判断当前时间是否处在传入时间前 + * + * @param time + * @return 是否 + */ + public static boolean isBefore(LocalDateTime time) { + return toTimeStamp(time) > System.currentTimeMillis(); + } + + /** + * 判断当前时间是否处在传入时间后 + * + * @param time 时间 + * @return 是否 + */ + public static boolean isAfter(LocalDateTime time) { + return toTimeStamp(time) < System.currentTimeMillis(); + } + + /** + * 传入时间累加 + * + * @param time 时间 + * @param + * @return + */ + public static LocalDateTime getMoreMinuteAfter(LocalDateTime time, int minute) { + return time.plusMinutes(minute); + } + + /** + * 计算与当前时间的差值(毫秒) + * + * @param time + * @param + * @return + */ + public static long getMoreMillisecondAfter(LocalDateTime time) { + return toTimeStamp(time) - System.currentTimeMillis(); + } + + /** + * 计算时间戳 + * + * @param time + * @param + * @return + */ + public static long toTimeStamp(LocalDateTime time) { + return time.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); + } + + /** + * 判断两个日期是否同一天 + * @param date1 / + * @param date2 / + * @return / + */ + public static Boolean isSameDay(Date date1,Date date2){ + return DateUtil.formatDate(date1).equals(DateUtil.formatDate(date2)); + } + + + + } diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java index f007b71..afb8d60 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java @@ -3,10 +3,13 @@ package co.yixiang.yshop.framework.common.util.date; import cn.hutool.core.date.LocalDateTimeUtil; import java.time.Duration; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.TemporalAdjusters; /** - * 时间工具类,用于 {@link LocalDateTime} + * 时间工具类,用于 {@link java.time.LocalDateTime} * * @author yshop */ @@ -60,4 +63,42 @@ public class LocalDateTimeUtils { return LocalDateTimeUtil.isIn(LocalDateTime.now(), startTime, endTime); } + /** + * 本周开始时间 + * + * @return + */ + public static LocalDateTime weekStartTime() { + LocalDate now = LocalDate.now(); + return LocalDateTime.of(now.minusDays(now.getDayOfWeek().getValue() - 1), LocalTime.MIN); + } + + /** + * 本周结束时间 + * + * @return + */ + public static LocalDateTime weekEndTime() { + LocalDate now = LocalDate.now(); + return LocalDateTime.of(now.plusDays(7 - now.getDayOfWeek().getValue()), LocalTime.MAX); + } + + /** + * 本月开始时间 + * + * @return + */ + public static LocalDateTime monthStartTime() { + return LocalDateTime.of(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()), LocalTime.MIN); + } + + /** + * 本月结束时间 + * + * @return + */ + public static LocalDateTime monthEndTime() { + return LocalDateTime.of(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX); + } + } diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java new file mode 100644 index 0000000..b36435c --- /dev/null +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java @@ -0,0 +1,46 @@ +package co.yixiang.yshop.framework.common.util.distancecalculator; + +/** + * @author pepis + * @apiNote + **/ +public class DistanceCalculatorUtil { + public static void main(String[] args) { + double lat1 = 37.7749; // 第一个点的纬度 + double lon1 = -122.4194; // 第一个点的经度 + + double lat2 = 34.0522; // 第二个点的纬度 + double lon2 = -118.2437; // 第二个点的经度 + + double distance = calculateDistance(lat1, lon1, lat2, lon2); + System.out.println("Distance: " + distance + " m"); + } + + /** + * 计算两地之间距离 + * @param lat1 第一个点的纬度 + * @param lon1 第一个点的经度 + * @param lat2 第二个点的纬度 + * @param lon2 第二个点的经度 + * @return 距离单位 米 + */ + public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) { + // 地球半径,单位:千米 + final double R = 6371.0; + + // 将经纬度转换为弧度 + double radLat1 = Math.toRadians(lat1); + double radLon1 = Math.toRadians(lon1); + double radLat2 = Math.toRadians(lat2); + double radLon2 = Math.toRadians(lon2); + + // Haversine公式计算距离 + double dlon = radLon2 - radLon1; + double dlat = radLat2 - radLat1; + double a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(dlon / 2), 2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + + // 计算距离 + return Math.round(R * c * 1000); + } +} diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java index 3016a28..92ccb07 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java @@ -5,11 +5,13 @@ import cn.hutool.core.map.TableMap; import cn.hutool.core.net.url.UrlBuilder; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; +import okhttp3.*; import org.springframework.util.StringUtils; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; import java.util.Map; @@ -39,12 +41,11 @@ public class HttpUtils { /** * 拼接 URL - * * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 append 方法 * - * @param base 基础 URL - * @param query 查询参数 - * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射 + * @param base 基础 URL + * @param query 查询参数 + * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射 * @param fragment URL 的 fragment,即拼接到 # 中 * @return 拼接后的 URL */ @@ -109,7 +110,7 @@ public class HttpUtils { authorization = Base64.decodeStr(authorization); clientId = StrUtil.subBefore(authorization, ":", false); clientSecret = StrUtil.subAfter(authorization, ":", false); - // 再从 Param 中获取 + // 再从 Param 中获取 } else { clientId = request.getParameter("client_id"); clientSecret = request.getParameter("client_secret"); @@ -122,5 +123,31 @@ public class HttpUtils { return null; } + public static String getAppletNoticeToken(String appid, String secret) throws IOException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + Request request = new Request.Builder() + .url("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret) + .get() + .build(); + Response response = client.newCall(request).execute(); + assert response.body() != null; + return response.body().string(); + } + + public static String sendAppletNotice(String token,String bodyString) throws IOException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + MediaType mediaType = MediaType.parse("text/plain"); + RequestBody body = RequestBody.create(mediaType, bodyString); + Request request = new Request.Builder() + .url("https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token="+token) + .method("POST", body) + .build(); + Response response = client.newCall(request).execute(); + assert response.body() != null; + return response.body().string(); + } + } diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java index 28d5b27..55d16fa 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java @@ -7,7 +7,7 @@ import cn.hutool.core.util.StrUtil; import java.io.InputStream; /** - * IO 工具类,用于 {@link IoUtil} 缺失的方法 + * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法 * * @author yshop */ diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java index 1a0d633..5f0a2f1 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java @@ -3,7 +3,7 @@ package co.yixiang.yshop.framework.common.util.object; import co.yixiang.yshop.framework.common.pojo.PageParam; /** - * {@link PageParam} 工具类 + * {@link co.yixiang.yshop.framework.common.pojo.PageParam} 工具类 * * @author yshop */ diff --git a/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java b/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java index 49b98a7..8fa8656 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java @@ -10,7 +10,7 @@ import org.springframework.aop.support.ComposablePointcut; import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; /** - * {@link DataPermission} 注解的 Advisor 实现类 + * {@link co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission} 注解的 Advisor 实现类 * * @author yshop */ diff --git a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java index b5f550b..d86d7ed 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java @@ -43,7 +43,6 @@ public class SmsClientFactoryImpl implements SmsClientFactory { /** * 短信客户端 Map * key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()} - * * 注意,一些场景下,需要获得某个渠道类型的客户端,所以需要使用它。 * 例如说,解析短信接收结果,是相对通用的,不需要使用某个渠道编号的 {@link #channelIdClients} */ diff --git a/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java new file mode 100644 index 0000000..2f8ce89 --- /dev/null +++ b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java @@ -0,0 +1,52 @@ +package co.yixiang.yshop.framework.weixin.config; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.WxMaConfig; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 微信小程序配置文件 + * + * @author: moxiangrong + **/ +@Configuration +@ConditionalOnClass(WxMaService.class) +@EnableConfigurationProperties(WxMiniProgramProperties.class) +public class WxMiniProgramConfig { + + /*注入小程序相关配置*/ + @Autowired + private WxMiniProgramProperties properties; + + /** + * 配置默认参数 + */ + @Bean + @ConditionalOnMissingBean + public WxMaConfig wxMaConfig() { + WxMaDefaultConfigImpl wxMaDefaultConfig = new WxMaDefaultConfigImpl(); + //设置默认参数-appid,secret + wxMaDefaultConfig.setAppid(this.properties.getAppid()); + wxMaDefaultConfig.setSecret(this.properties.getSecret()); + return wxMaDefaultConfig; + } + + /** + * 配置WxMaService + */ + @Bean + @ConditionalOnMissingBean + public WxMaService wxMaService(WxMaConfig wxMaConfig) { + WxMaService wxMaService = new WxMaServiceImpl(); + wxMaService.setWxMaConfig(wxMaConfig); + return wxMaService; + } + + +} diff --git a/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java new file mode 100644 index 0000000..4bfc4c1 --- /dev/null +++ b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.framework.weixin.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +@ConfigurationProperties(prefix = "wx.miniapp") +@Validated +@Data +public class WxMiniProgramProperties { + + /*微信小程序app_id*/ + private String appid; + + /*微信小程序app_secret*/ + private String secret; + +} diff --git a/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java b/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java index c663632..ed1102b 100644 --- a/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java +++ b/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java @@ -13,7 +13,6 @@ public class YshopFlowableConfiguration { /** * 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean - * * 如果不创建,会导致项目启动时,Flowable 报错的问题 */ @Bean diff --git a/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java b/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java index 85beff3..9f28585 100644 --- a/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java +++ b/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java @@ -5,7 +5,7 @@ import co.yixiang.yshop.framework.quartz.core.handler.JobHandlerInvoker; import org.quartz.*; /** - * {@link Scheduler} 的管理器,负责创建任务 + * {@link org.quartz.Scheduler} 的管理器,负责创建任务 * * 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即: * 1. Job 的 {@link JobDetail#getKey()} diff --git a/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java b/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java index 09c19f3..77d60ca 100644 --- a/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java +++ b/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java @@ -23,7 +23,7 @@ public class DefaultStreamMessageListenerContainerX> e /** * 参考 {@link StreamMessageListenerContainer#create(RedisConnectionFactory, StreamMessageListenerContainerOptions)} 的实现 */ - public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainerOptions options) { + public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainer.StreamMessageListenerContainerOptions options) { Assert.notNull(connectionFactory, "RedisConnectionFactory must not be null!"); Assert.notNull(options, "StreamMessageListenerContainerOptions must not be null!"); return new DefaultStreamMessageListenerContainerX<>(connectionFactory, options); diff --git a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java index bd15d49..0414e02 100644 --- a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java +++ b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java @@ -27,6 +27,20 @@ public class LambdaQueryWrapperX extends LambdaQueryWrapper { return this; } + public LambdaQueryWrapperX likeRightIfPresent(SFunction column, String val) { + if (StringUtils.hasText(val)) { + return (LambdaQueryWrapperX) super.likeRight(column, val); + } + return this; + } + + public LambdaQueryWrapperX likeLeftIfPresent(SFunction column, String val) { + if (StringUtils.hasText(val)) { + return (LambdaQueryWrapperX) super.likeLeft(column, val); + } + return this; + } + public LambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { if (!CollectionUtils.isEmpty(values)) { return (LambdaQueryWrapperX) super.in(column, values); diff --git a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java index 7cabf91..f50d4be 100644 --- a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java +++ b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java @@ -13,7 +13,7 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * 字段字段的 TypeHandler 实现类,基于 {@link AES} 实现 + * 字段字段的 TypeHandler 实现类,基于 {@link cn.hutool.crypto.symmetric.AES} 实现 * 可通过 jasypt.encryptor.password 配置项,设置密钥 * * @author yshop diff --git a/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java index fa8f5c1..23477e5 100644 --- a/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java +++ b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java @@ -1,5 +1,7 @@ package co.yixiang.yshop.framework.redis.config; +import co.yixiang.yshop.framework.redis.util.RedissonUtil; +import org.redisson.api.RedissonClient; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -30,4 +32,14 @@ public class YshopRedisAutoConfiguration { return template; } + /** + * / + * @param redissonClient / + * @return Redisson 操作工具类 + */ + @Bean + public RedissonUtil redissonUtil(RedissonClient redissonClient){ + return new RedissonUtil(redissonClient); + } + } diff --git a/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java new file mode 100644 index 0000000..2bdda2d --- /dev/null +++ b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java @@ -0,0 +1,87 @@ +package co.yixiang.yshop.framework.redis.util; + +import co.yixiang.yshop.framework.common.exception.ErrorCode; +import co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil; +import org.redisson.api.RBlockingDeque; +import org.redisson.api.RDelayedQueue; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.TimeUnit; + +/** + * @author pepis + * @apiNote Redisson 操作工具类 + **/ +public class RedissonUtil { + private final RedissonClient redissonClient; + Logger logger = LoggerFactory.getLogger(RedissonUtil.class); + + public RedissonUtil(RedissonClient redissonClient) { + this.redissonClient = redissonClient; + } + + /** + * 向指定key的延时队列中添加任务 + * @param key 延时队列 + * @param v 订单id + * @param delay 延时时长 + * @param timeUnit 延时单位 + * @param id类型 + */ + public void delayedOffer(String key,V v,long delay, TimeUnit timeUnit){ + try { + RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(key); + RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); + delayedQueue.offer(v, delay, timeUnit); + String s = delay + timeUnit.toString(); + logger.info("添加延时队列成功 ,延迟时间:" + s + "订单id: " + v); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + + /** + * 向指定key的延时队列中添加任务 + * @param key 延时队列 + * @param v 订单id + * @param delay 延时时长 + * @param timeUnit 延时单位 + * @param code 添加失败抛出异常 + * @param id类型 + */ + public void delayedOfferThrow(String key, V v, long delay, TimeUnit timeUnit, ErrorCode code){ + try { + RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(key); + RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); + delayedQueue.offer(v, delay, timeUnit); + String s = delay + timeUnit.toString(); + logger.info("添加延时队列成功 ,延迟时间:" + s + "订单id: " + v); + } catch (Exception e) { + logger.error(e.getMessage()); + throw ServiceExceptionUtil.exception(code,e.getMessage()); + } + } + + /** + * 向指定key的延时队列中删除任务 + * @param key 延时队列 + * @param v 订单id + * @param code 添加失败抛出异常 + * @param id类型 + */ + public void delayedRemoveThrow(String key, V v, ErrorCode code){ + try { + RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(key); + RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); + delayedQueue.remove(v); + logger.info("删除延时队列成功 , 订单id: " + v); + } catch (Exception e) { + logger.error(e.getMessage()); + throw ServiceExceptionUtil.exception(code,e.getMessage()); + } + } + + +} diff --git a/yshop-framework/yshop-spring-boot-starter-security/src/main/java/co/yixiang/yshop/framework/security/config/YshopWebSecurityConfigurerAdapter.java b/yshop-framework/yshop-spring-boot-starter-security/src/main/java/co/yixiang/yshop/framework/security/config/YshopWebSecurityConfigurerAdapter.java index 1983ea6..6d50ff6 100644 --- a/yshop-framework/yshop-spring-boot-starter-security/src/main/java/co/yixiang/yshop/framework/security/config/YshopWebSecurityConfigurerAdapter.java +++ b/yshop-framework/yshop-spring-boot-starter-security/src/main/java/co/yixiang/yshop/framework/security/config/YshopWebSecurityConfigurerAdapter.java @@ -186,4 +186,4 @@ public class YshopWebSecurityConfigurerAdapter { return result; } -} +} \ No newline at end of file diff --git a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java index 6a8cf47..7e2387a 100644 --- a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java +++ b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.express.kdniao.model.dto; import lombok.*; +import org.omg.PortableInterceptor.INACTIVE; /** * 电子面单 DTO diff --git a/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/admin/express/ExpressController.java b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/admin/express/ExpressController.java index ee6f579..7c891ba 100644 --- a/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/admin/express/ExpressController.java +++ b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/admin/express/ExpressController.java @@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.Objects; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -107,6 +108,13 @@ public class ExpressController { @Operation(summary = "获得快递鸟配置") public CommonResult getExpressSet() { KdniaoApiBaseDTO kdniaoApiBaseDTO = expressRedisDAO.get(); + if(Objects.isNull(kdniaoApiBaseDTO)){ + kdniaoApiBaseDTO = new KdniaoApiBaseDTO(); + kdniaoApiBaseDTO.setApiKey(""); + kdniaoApiBaseDTO.setReqURL(""); + kdniaoApiBaseDTO.setEBusinessID(""); + expressRedisDAO.set(kdniaoApiBaseDTO); + } //返回数据加密一下 String genSalt = BCrypt.gensalt(); //这个是盐 29个字符,随机生成 System.out.println(gensalt); diff --git a/yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApi.java b/yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApi.java new file mode 100644 index 0000000..92a9350 --- /dev/null +++ b/yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApi.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.infra.api.config; + +import co.yixiang.yshop.module.infra.api.config.dto.ConfigDTO; + +/** + * @author pepis + * @apiNote + **/ +public interface ConfigApi { + /** + * 根据参数键,获得参数配置 + * + * @param key 配置键 + * @return 参数配置 + */ + ConfigDTO getConfigByKey(String key); +} diff --git a/yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/dto/ConfigDTO.java b/yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/dto/ConfigDTO.java new file mode 100644 index 0000000..d9b4a5a --- /dev/null +++ b/yshop-module-infra/yshop-module-infra-api/src/main/java/co/yixiang/yshop/module/infra/api/config/dto/ConfigDTO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.infra.api.config.dto; + +import lombok.Data; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class ConfigDTO { + private Long id; + /** + * 参数分类 + */ + private String category; + /** + * 参数名称 + */ + private String name; + /** + * 参数键名 + * + * 支持多 DB 类型时,无法直接使用 key + @TableField("config_key") 来实现转换,原因是 "config_key" AS key 而存在报错 + */ + private String configKey; + /** + * 参数键值 + */ + private String value; + /** + * 参数类型 + */ + private Integer type; +} diff --git a/yshop-module-infra/yshop-module-infra-biz/pom.xml b/yshop-module-infra/yshop-module-infra-biz/pom.xml index ab6f9cd..42a7cb6 100644 --- a/yshop-module-infra/yshop-module-infra-biz/pom.xml +++ b/yshop-module-infra/yshop-module-infra-biz/pom.xml @@ -117,6 +117,12 @@ org.springframework.boot spring-boot-starter-websocket + + com.github.binarywang + weixin-java-miniapp + 4.4.0 + compile + diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApiImpl.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApiImpl.java new file mode 100644 index 0000000..b01c7d5 --- /dev/null +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/api/config/ConfigApiImpl.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.infra.api.config; + +import co.yixiang.yshop.module.infra.api.config.dto.ConfigDTO; +import co.yixiang.yshop.module.infra.convert.config.ConfigConvert; +import co.yixiang.yshop.module.infra.dal.dataobject.config.ConfigDO; +import co.yixiang.yshop.module.infra.service.config.ConfigService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author pepis + * @apiNote + **/ +@Service +public class ConfigApiImpl implements ConfigApi { + @Resource + private ConfigService configService; + + @Override + public ConfigDTO getConfigByKey(String key) { + ConfigDO configDO = configService.getConfigByKey(key); + return ConfigConvert.INSTANCE.convert2DTO(configDO); + } +} diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/admin/config/ConfigController.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/admin/config/ConfigController.java index 20cc2ee..8f834a3 100644 --- a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/admin/config/ConfigController.java +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/admin/config/ConfigController.java @@ -81,6 +81,14 @@ public class ConfigController { return success(config.getValue()); } + @GetMapping(value = "/get-value-by-category") + @Operation(summary = "根据参数分类查询参数值") + @Parameter(name = "category", description = "分类", required = true, example = "url") + public CommonResult> getConfigCategory(@RequestParam("category") String category) { + List configs = configService.getConfigByCategory(category); + return success(ConfigConvert.INSTANCE.convertList02(configs)); + } + @GetMapping("/page") @Operation(summary = "获取参数配置分页") @PreAuthorize("@ss.hasPermission('infra:config:query')") diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/QrCodeController.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/QrCodeController.java new file mode 100644 index 0000000..396b3d4 --- /dev/null +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/QrCodeController.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.infra.controller.app.qrcode; + +import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; +import co.yixiang.yshop.framework.common.exception.ServiceException; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.infra.controller.app.qrcode.vo.QrCodeGenerateDTO; +import co.yixiang.yshop.module.infra.controller.app.qrcode.vo.QrCodeGenerateMiniDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +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 javax.annotation.Resource; +import java.util.Base64; + +import static cn.hutool.core.img.ImgUtil.IMAGE_TYPE_JPG; + +/** + * @author pepis + * @apiNote + **/ +@Tag(name = "用户 APP - 二维码") +@RestController +@RequestMapping("/infra/QrCode") +@Validated +@Slf4j +public class QrCodeController { + + @Resource + private WxMaService wxMaService; + + @PostMapping("generate") + @Operation(summary = "生成二维码") + public CommonResult generate(@RequestBody QrCodeGenerateDTO dto){ + String content = dto.getContent(); + if(StrUtil.isBlank(content)){ + throw new ServiceException(); + } + String base64 = QrCodeUtil.generateAsBase64(content, QrConfig.create(), IMAGE_TYPE_JPG); + return CommonResult.success(base64); + } + + @PostMapping("generate-mini") + @Operation(summary = "生成小程序码") + public CommonResult generateMini(@RequestBody QrCodeGenerateMiniDTO dto){ + try { + WxMaQrcodeService wxMaQrcodeService = wxMaService.getQrcodeService(); + /* 获取二维码字节数组 */ + byte[] bytes = wxMaQrcodeService.createWxaCodeUnlimitBytes + (dto.getName(), dto.getPath(), false,"trial",430, true, + new WxMaCodeLineColor("0", "0", "0"), true); + return CommonResult.success(Base64.getEncoder().encodeToString(bytes)); + + } catch (Exception ex) { + log.info("生成小程序码失败,message:{}", ex.getMessage()); + return CommonResult.success(null); + } + + } + +} diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateDTO.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateDTO.java new file mode 100644 index 0000000..1a88930 --- /dev/null +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateDTO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.infra.controller.app.qrcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class QrCodeGenerateDTO { + @Schema(description = "二维码内容") + private String content; +} diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateMiniDTO.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateMiniDTO.java new file mode 100644 index 0000000..db82617 --- /dev/null +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/controller/app/qrcode/vo/QrCodeGenerateMiniDTO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.infra.controller.app.qrcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class QrCodeGenerateMiniDTO { + + @Schema(description = "标头") + private String name; + + @Schema(description = "小程序跳转地址") + private String path; +} diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/convert/config/ConfigConvert.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/convert/config/ConfigConvert.java index 2622ee7..9b43b63 100644 --- a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/convert/config/ConfigConvert.java +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/convert/config/ConfigConvert.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.infra.convert.config; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.infra.api.config.dto.ConfigDTO; import co.yixiang.yshop.module.infra.controller.admin.config.vo.ConfigCreateReqVO; import co.yixiang.yshop.module.infra.controller.admin.config.vo.ConfigExcelVO; import co.yixiang.yshop.module.infra.controller.admin.config.vo.ConfigRespVO; @@ -30,4 +31,8 @@ public interface ConfigConvert { @Mapping(source = "configKey", target = "key") List convertList(List list); + ConfigDTO convert2DTO(ConfigDO configDO); + + @Mapping(source = "configKey", target = "key") + List convertList02(List configs); } diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java index 8ee4225..52cf0b2 100644 --- a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java @@ -63,7 +63,7 @@ public class CodegenBuilder { */ public static final String TENANT_ID_FIELD = "tenantId"; /** - * {@link BaseDO} 的字段 + * {@link co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO} 的字段 */ public static final Set BASE_DO_FIELDS = new HashSet<>(); /** diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigService.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigService.java index b1f3f1d..e92f714 100644 --- a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigService.java +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigService.java @@ -72,4 +72,11 @@ public interface ConfigService { List getConfigList(@Valid ConfigExportReqVO reqVO); + /** + * 根据分类,获得参数配置 + * + * @param category 分类 + * @return 参数配置 + */ + List getConfigByCategory(String category); } diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigServiceImpl.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigServiceImpl.java index 5c6bb80..d73525c 100644 --- a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigServiceImpl.java +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/config/ConfigServiceImpl.java @@ -84,6 +84,11 @@ public class ConfigServiceImpl implements ConfigService { return configMapper.selectList(reqVO); } + @Override + public List getConfigByCategory(String category) { + return configMapper.selectList(ConfigDO::getCategory,category); + } + private void validateConfigForCreateOrUpdate(Long id, String key) { // 校验自己存在 validateConfigExists(id); diff --git a/yshop-module-mall/pom.xml b/yshop-module-mall/pom.xml index 6fc519b..49e54c9 100644 --- a/yshop-module-mall/pom.xml +++ b/yshop-module-mall/pom.xml @@ -26,6 +26,8 @@ yshop-module-cart-biz yshop-module-order-api yshop-module-order-biz + yshop-module-distributor-api + yshop-module-distributor-biz diff --git a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java index 7ad0cf8..57f3dcf 100644 --- a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java +++ b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java @@ -5,13 +5,13 @@ import lombok.Getter; /** * @author hupeng - * 优惠券类型枚举 + * 购物车类型枚举 */ @Getter @AllArgsConstructor public enum CartTypeEnum { ADD_SHOPPING_CART(0,"加入购物车"), - DIRECT_PURCHASING(1,"加入购物车直接购买"); + DIRECT_PURCHASING(1,"直接购买"); private Integer value; private String desc; diff --git a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/ErrorCodeConstants.java b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/ErrorCodeConstants.java index 90d86eb..c43a41e 100644 --- a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/ErrorCodeConstants.java +++ b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/ErrorCodeConstants.java @@ -11,4 +11,6 @@ public interface ErrorCodeConstants { // ========== 购物车 1008006000 ========== ErrorCode STORE_CART_NOT_EXISTS = new ErrorCode(1008006000, "购物车不存在"); ErrorCode STORE_STOCK_ERROR = new ErrorCode(1008006001, "库存错误"); + + ErrorCode CAMPAIGN_NOT_EXISTS = new ErrorCode(1008006002, "规格未参加活动"); } diff --git a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/OrderTypeEnum.java b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/OrderTypeEnum.java new file mode 100644 index 0000000..27b5c28 --- /dev/null +++ b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/OrderTypeEnum.java @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.cart.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * @author moxiangrong + * 下单类型枚举 + */ +@Getter +@AllArgsConstructor +public enum OrderTypeEnum { + + NORMAL_ORDER(1,"正常下单"), + CAMPAIGN_ORDER(2,"活动下单"); + + + + private Integer value; + private String desc; + + public static OrderTypeEnum toType(int value) { + return Stream.of(OrderTypeEnum.values()) + .filter(p -> p.value == value) + .findAny() + .orElse(null); + } + + +} diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java index 92903cb..5835f2c 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java @@ -8,15 +8,19 @@ */ package co.yixiang.yshop.module.cart.controller.app.cart; +import cn.hutool.core.util.ObjectUtil; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartChangeSkuParam; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartIdsParm; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartNumParam; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartParam; +import co.yixiang.yshop.module.cart.enums.OrderTypeEnum; import co.yixiang.yshop.module.cart.service.storecart.AppStoreCartService; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignNumberJudgeVO; import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; -import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; +import co.yixiang.yshop.module.product.service.campaigninfo.AppCampaignInfoService; +import co.yixiang.yshop.module.product.service.teamworkinfo.TeamworkInfoService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -50,6 +54,10 @@ public class AppCartController { private final AppStoreCartService appStoreCartService; + private final TeamworkInfoService teamworkInfoService; + + private final AppCampaignInfoService appCampaignInfoService; + /** * 购物车 获取数量 */ @@ -71,8 +79,17 @@ public class AppCartController { @Operation(summary = "添加购物车") public CommonResult> add(@Validated @RequestBody AppCartParam cartParam){ - Map map = new LinkedHashMap<>(); Long uid = getLoginUserId(); + if(OrderTypeEnum.CAMPAIGN_ORDER.getValue().equals(cartParam.getOrderType())){ + // 判断是否重复参加拼团 + if(ObjectUtil.isNotEmpty(cartParam.getTeamworkId())) + teamworkInfoService.joinJudge(uid, cartParam.getTeamworkId()); + // 活动商品购买数量限制 + appCampaignInfoService.numberJudge(new CampaignNumberJudgeVO + (cartParam.getUniqueId(), uid, cartParam.getCartNum())); + } + // 加入购物车并返回购物车id + Map map = new LinkedHashMap<>(); map.put("cartId",appStoreCartService.addCart(uid,cartParam.getProductId(),cartParam.getCartNum(), cartParam.getUniqueId(),cartParam.getIsNew(),cartParam.getCombinationId(), cartParam.getSecKillId(),cartParam.getBargainId())); diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java index 5b65877..f4a4d56 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java @@ -43,4 +43,13 @@ public class AppCartParam { @Schema(description = "产品砍价ID", required = true) private Long bargainId = 0L; + + @Schema(description = "活动id", required = true) + private Long campaignId; + + @Schema(description = "下单类型:1、普通下单,2、商品活动下单", required = true) + private Integer orderType; + + @Schema(description = "拼团id", required = true) + private Long teamworkId; } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java index c35621d..60d0cd5 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java @@ -55,7 +55,7 @@ public interface AppStoreCartService extends IService { * 购物车列表 * @param uid 用户id * @param cartIds 购物车id,多个逗号隔开 - * @param status 0-购购物车列表 + * @param status 0-购购物车列表,2-活动商品 * @return map valid-有效购物车 invalid-失效购物车 */ Map getUserProductCartList(Long uid, String cartIds, Integer status); diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java index cbee8f0..4bf9c4b 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java @@ -12,16 +12,19 @@ import co.yixiang.yshop.module.cart.convert.storecart.StoreCartConvert; import co.yixiang.yshop.module.cart.dal.dataobject.storecart.StoreCartDO; import co.yixiang.yshop.module.cart.dal.mysql.storecart.StoreCartMapper; import co.yixiang.yshop.module.cart.enums.CartTypeEnum; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignSkuVO; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; +import co.yixiang.yshop.module.product.service.campaigninfo.AppCampaignInfoService; import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; import co.yixiang.yshop.module.product.service.productcouponrelation.dto.CartCouponDto; import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; @@ -32,13 +35,13 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.STORE_STOCK_ERROR; +import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.*; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_NOT_EXISTS; -import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.STORE_CART_NOT_EXISTS; /** * 购物车 Service 实现类 @@ -60,6 +63,9 @@ public class AppStoreCartServiceImpl extends ServiceImpl valid = new ArrayList<>(); List invalid = new ArrayList<>(); + Map productMap = null; + Map skuMap = null; + Map campaignSkuVOMap = null; + if(CollectionUtils.isNotEmpty(carts)){ + // 查询商品列表 + List productIds = carts.stream().map(StoreCartDO::getProductId).collect(Collectors.toList()); + List products = appStoreProductService.getStoreProductByIds(productIds); + productMap = products.stream().collect(Collectors.toMap(AppStoreProductRespVo::getId, Function.identity())); + // 查询商品规格列表 + List skuUniques = + carts.stream().map(StoreCartDO::getProductAttrUnique).collect(Collectors.toList()); + List skus = + storeProductAttrValueService.list(Wrappers.lambdaQuery() + .in(StoreProductAttrValueDO::getUnique, skuUniques)); + skuMap = skus.stream().collect(Collectors.toMap(StoreProductAttrValueDO::getUnique, Function.identity())); + // 活动下单查询 + if (OrderInfoEnum.CAMPAIGN_ORDER.getValue().equals(status)) { + List campaignSkuVOS = appCampaignInfoService.getCampaignsByProductAttrUniques(skuUniques); + if (CollectionUtils.isEmpty(campaignSkuVOS)) throw exception(CAMPAIGN_NOT_EXISTS); + campaignSkuVOMap = + campaignSkuVOS.stream().collect(Collectors + .toMap(CampaignSkuVO::getProductAttrUnique, Function.identity())); + } + } + for (StoreCartDO storeCart : carts) { - AppStoreProductRespVo storeProduct = appStoreProductService.getStoreProductById(storeCart.getProductId()); + AppStoreProductRespVo storeProduct = productMap.get(storeCart.getProductId()); AppStoreCartQueryVo storeCartQueryVo = StoreCartConvert.INSTANCE.convert01(storeCart); if (ObjectUtil.isNull(storeProduct)) { this.removeById(storeCart.getId()); @@ -191,9 +222,7 @@ public class AppStoreCartServiceImpl extends ServiceImpllambdaQuery() - .eq(StoreProductAttrValueDO::getUnique, storeCart.getProductAttrUnique())); + StoreProductAttrValueDO productAttrValue = skuMap.get(storeCart.getProductAttrUnique()); if (ObjectUtil.isNull(productAttrValue) || productAttrValue.getStock() == 0) { storeCartQueryVo.setProductInfo(storeProduct); invalid.add(storeCartQueryVo); @@ -202,6 +231,7 @@ public class AppStoreCartServiceImpl extends ServiceImpl 0) { truePrice = productAttrValue.getPinkPrice(); @@ -210,8 +240,14 @@ public class AppStoreCartServiceImpl extends ServiceImpl 0) { truePrice = productAttrValue.getSeckillPrice(); } + // 设置活动价格 + if (ObjectUtil.isNotNull(campaignSkuVOMap) && + campaignSkuVOMap.containsKey(productAttrValue.getUnique())) { + truePrice = campaignSkuVOMap.get(productAttrValue.getUnique()).getPrice(); + stock = campaignSkuVOMap.get(productAttrValue.getUnique()).getStock(); + } storeCartQueryVo.setTruePrice(truePrice); - storeCartQueryVo.setTrueStock(productAttrValue.getStock()); + storeCartQueryVo.setTrueStock(stock); valid.add(storeCartQueryVo); } diff --git a/yshop-module-mall/yshop-module-distributor-api/pom.xml b/yshop-module-mall/yshop-module-distributor-api/pom.xml new file mode 100644 index 0000000..68a3283 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + co.yixiang.boot + yshop-module-mall + ${revision} + + + yshop-module-distributor-api + jar + + ${project.artifactId} + + 分销商 API 模块 + + + + + co.yixiang.boot + yshop-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + io.swagger.core.v3 + swagger-annotations + 2.2.8 + compile + + + + diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApi.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApi.java new file mode 100644 index 0000000..d6e70df --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApi.java @@ -0,0 +1,15 @@ +package co.yixiang.yshop.module.distributor.api; + +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; + +import java.util.List; + +public interface DistributorOrderApi { + + void createDistributorOrder(DistributorOrderDTO distributorOrderDTO); + + void cancelDistributorOrder(List ids); + + void updateDistributorOrder(DistributorOrderDTO distributorOrderDTO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorOrderDTO.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorOrderDTO.java new file mode 100644 index 0000000..17c4761 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorOrderDTO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.api.dto; + +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +@Data +@ToString(callSuper = true) +public class DistributorOrderDTO { + + // 订单ID + private Long oid; + // 订单号 + private String orderId; + // 下单用户 + private Long userId; + // 用户昵称 + private String userName; + // 分销商ID + private Long distributorId; + // 商品 + private List productDTOList; + // 结算类型 + private Integer distributorSettlementType; + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorProductDTO.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorProductDTO.java new file mode 100644 index 0000000..62fed9f --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/api/dto/DistributorProductDTO.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.distributor.api.dto; + + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Data +@ToString(callSuper = true) +public class DistributorProductDTO { + + // 商品ID + private Long productId; + // 商品规格ID + private Long productAttrValueId; + // 商品名称 + private String productName; + // 原价 + private BigDecimal productOriginalPrice; + // 商品金额 + private BigDecimal productPrice; + // 订单详情id + private Long detailId; + // 分销规则 0-默认 1-自定义 + private Integer distributionRule; + // 分销自购 0-关闭 1-开启 + private Integer distributionPurchase; + // 商品结算方式 0-实际支付价格 1-商品价格 + private Integer distributionProductSettlement; + // 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + private Integer distributionWagesSettlement; + // 分销规则 1-一级 2-二级 + private Integer distributionLevel; + // 一级佣金比例 + private Integer firstWages; + // 二级佣金比例 + private Integer secondWages; + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorConstants.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorConstants.java new file mode 100644 index 0000000..4108eed --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorConstants.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.enums; + +public interface DistributorConstants { + + // 不自动通过 + String APPLY_FALSE = "0"; + + // 自动通过 + String APPLY_TRUE = "1"; + + // 无限制客户保护 + String UNLIMITED_USER_EXPIRE = "-1"; + + // 无限制年数 + Integer UNLIMITED_YEAR = 100; + + String FALSE_STR = "0"; + + String TURE_STR = "1"; + + Integer FALSE_INTEGER = 0; + + Integer TURE_INTEGER = 1; + + Integer DEFAULT_LEVEL = 1; + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelTypeEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelTypeEnum.java new file mode 100644 index 0000000..9ef6258 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelTypeEnum.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorLevelTypeEnum { + + P1(1,"一级分销商"), + P2(2,"二级分销商"),; + + private Integer type; + + private String name; + + public static DistributorLevelTypeEnum toType(Integer type) { + return Stream.of(DistributorLevelTypeEnum.values()) + .filter(p -> Objects.equals(p.type, type)) + .findAny() + .orElse(null); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelUpTypeEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelUpTypeEnum.java new file mode 100644 index 0000000..a80a702 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorLevelUpTypeEnum.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorLevelUpTypeEnum { + + ONLY(0,"任意"), + ALL(1,"全部"),; + + private Integer type; + + private String name; + + public static DistributorLevelUpTypeEnum toType(Integer type) { + return Stream.of(DistributorLevelUpTypeEnum.values()) + .filter(p -> Objects.equals(p.type, type)) + .findAny() + .orElse(null); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorOrderStatusEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorOrderStatusEnum.java new file mode 100644 index 0000000..5764edb --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorOrderStatusEnum.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorOrderStatusEnum { + + WAIT(0,"待结算"), + COMPLETE(1,"已结算"), + CANCEL(2,"已取消"); + + private Integer status; + + private String name; + + public static DistributorOrderStatusEnum toStatus(Integer status) { + return Stream.of(DistributorOrderStatusEnum.values()) + .filter(p -> Objects.equals(p.status, status)) + .findAny() + .orElse(null); + } +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorProductTypeEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorProductTypeEnum.java new file mode 100644 index 0000000..3351483 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorProductTypeEnum.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorProductTypeEnum { + + NO(0,"不参加分销"), + YES(1,"参加分销"),; + + private Integer type; + + private String name; + + public static DistributorProductTypeEnum toType(Integer type) { + return Stream.of(DistributorProductTypeEnum.values()) + .filter(p -> Objects.equals(p.type, type)) + .findAny() + .orElse(null); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorSettlementTypeEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorSettlementTypeEnum.java new file mode 100644 index 0000000..ed86e38 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorSettlementTypeEnum.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorSettlementTypeEnum { + + PAY(0,"支付后结算"), + CONFIRM(1,"确认收获后结算"), + COMPLETE(2,"订单完成结算"); + + private Integer type; + + private String name; + + public static DistributorSettlementTypeEnum toType(Integer type) { + return Stream.of(DistributorSettlementTypeEnum.values()) + .filter(p -> Objects.equals(p.type, type)) + .findAny() + .orElse(null); + } +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorStatusEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorStatusEnum.java new file mode 100644 index 0000000..3301c4a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorStatusEnum.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorStatusEnum { + + NOT_APPLIED(-1,"已清退"), + AUDIT(0,"待审核"), + PASSED(1,"已通过"), + REFUSED(2,"已拒绝"); + + private Integer status; + + private String name; + + public static DistributorStatusEnum toStatus(Integer status) { + return Stream.of(DistributorStatusEnum.values()) + .filter(p -> Objects.equals(p.status, status)) + .findAny() + .orElse(null); + } +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWagesLogTypeEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWagesLogTypeEnum.java new file mode 100644 index 0000000..e55b42c --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWagesLogTypeEnum.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorWagesLogTypeEnum { + + WAIT(0,"待入账"), + COMPLETE(1,"已入账"), + CANCEL(2,"已取消"), + WITHDRAW_WAIT(3,"提现中"), + WITHDRAW_COMPLETE(4,"提现成功"), + WITHDRAW_FAIL(5,"提现失败"), + ; + + private Integer type; + + private String name; + + public static DistributorWagesLogTypeEnum toType(Integer type) { + return Stream.of(DistributorWagesLogTypeEnum.values()) + .filter(p -> Objects.equals(p.type, type)) + .findAny() + .orElse(null); + } +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWithdrawalMethodTypeEnum.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWithdrawalMethodTypeEnum.java new file mode 100644 index 0000000..c5e1122 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/DistributorWithdrawalMethodTypeEnum.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.distributor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum DistributorWithdrawalMethodTypeEnum { + + BALANCE(0,"余额"), + AIL_PAY(1,"支付宝"), + ; + + private Integer type; + + private String paymentMethod; + + public static DistributorWithdrawalMethodTypeEnum toType(Integer type) { + return Stream.of(DistributorWithdrawalMethodTypeEnum.values()) + .filter(p -> Objects.equals(p.type, type)) + .findAny() + .orElse(null); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/ErrorCodeConstants.java b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..3a5560a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-api/src/main/java/co/yixiang/yshop/module/distributor/enums/ErrorCodeConstants.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.distributor.enums; + +import co.yixiang.yshop.framework.common.exception.ErrorCode; + +public interface ErrorCodeConstants { + ErrorCode DISTRIBUTOR_NOT_EXISTS = new ErrorCode(1000001, "分销商不存在"); + + ErrorCode DISTRIBUTOR_USER_EXISTS = new ErrorCode(1000002, "您已申请过成为分销商请勿重复申请"); + + ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1100001, "分销商等级不存在"); + + ErrorCode LEVEL_EXISTS = new ErrorCode(1100002, "分销商等级已存在,请从新选择"); + + ErrorCode LEVEL_SUPERIOR_NOT_EXISTS = new ErrorCode(1100003, "上一等级未设置,请从新选择"); + + ErrorCode LEVEL_USERCOUNT_ERROR = new ErrorCode(1100004, "累计金额需要大于上一等级"); + + ErrorCode LEVEL_AMOUNT_ERROR = new ErrorCode(1100005, "累计用户需要大于上一等级"); + + ErrorCode LEVEL_WAGES_ERROR = new ErrorCode(1100006, "累计佣金需要大于上一等级"); + + ErrorCode LEVEL_USERCOUNT_LESS_ERROR = new ErrorCode(1100007, "累计金额需要小于下一等级"); + + ErrorCode LEVEL_AMOUNT_LESS_ERROR = new ErrorCode(1100008, "累计用户需要小于下一等级"); + + ErrorCode LEVEL_WAGES_LESS_ERROR = new ErrorCode(1100009, "累计佣金需要小于下一等级"); + + + ErrorCode ORDER_NOT_EXISTS = new ErrorCode(80003, "分销商订单不存在"); + + ErrorCode USER_NOT_EXISTS = new ErrorCode(80004, "分销商所属用户不存在"); + + ErrorCode WAGES_NOT_EXISTS = new ErrorCode(80005, "分销商佣金不存在"); + + ErrorCode WAGES_LOG_NOT_EXISTS = new ErrorCode(80006, "分销商佣金记录不存在"); + + ErrorCode DYNAMICS_NOT_EXISTS = new ErrorCode(80007, "分销商动态不存在"); + + ErrorCode WITHDRAWAL_METHOD_NOT_EXISTS = new ErrorCode(80008, "分销商提现方式不存在"); + + ErrorCode WITHDRAWAL_METHOD_EXISTS_USER = new ErrorCode(1200001, "提现方式不属于此登录用户"); + + ErrorCode WITHDRAWAL_AMOUNT_INSUFFICIENT = new ErrorCode(1200002, "可提现余额不足"); + + ErrorCode WITHDRAWAL_ALI_NOT_EXISTS = new ErrorCode(1200003, "未绑定支付宝账号"); +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/pom.xml b/yshop-module-mall/yshop-module-distributor-biz/pom.xml new file mode 100644 index 0000000..6688de1 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/pom.xml @@ -0,0 +1,84 @@ + + + + co.yixiang.boot + yshop-module-mall + ${revision} + + 4.0.0 + yshop-module-distributor-biz + jar + + ${project.artifactId} + + 分销商模块 + + + + + co.yixiang.boot + yshop-module-distributor-api + ${revision} + + + + + co.yixiang.boot + yshop-spring-boot-starter-biz-operatelog + + + + + co.yixiang.boot + yshop-spring-boot-starter-web + + + co.yixiang.boot + yshop-spring-boot-starter-security + + + + + co.yixiang.boot + yshop-spring-boot-starter-mybatis + + + + + co.yixiang.boot + yshop-spring-boot-starter-test + + + + + co.yixiang.boot + yshop-spring-boot-starter-excel + + + co.yixiang.boot + yshop-spring-boot-starter-redis + + + co.yixiang.boot + yshop-module-member-api + 1.0.0 + compile + + + co.yixiang.boot + yshop-module-product-api + 1.0.0 + compile + + + co.yixiang.boot + yshop-module-member-biz + 1.0.0 + compile + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApiImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApiImpl.java new file mode 100644 index 0000000..a2489bf --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/api/DistributorOrderApiImpl.java @@ -0,0 +1,279 @@ +package co.yixiang.yshop.module.distributor.api; + +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; +import co.yixiang.yshop.framework.dict.core.util.DictFrameworkUtils; +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; +import co.yixiang.yshop.module.distributor.api.dto.DistributorProductDTO; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderUpdateReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.enums.DistributorConstants; +import co.yixiang.yshop.module.distributor.enums.DistributorLevelTypeEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorOrderStatusEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorSettlementTypeEnum; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorFacade; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorService; +import co.yixiang.yshop.module.distributor.service.distributorlevel.DistributorLevelService; +import co.yixiang.yshop.module.distributor.service.distributororder.DistributorOrderService; +import co.yixiang.yshop.module.distributor.service.distributoruser.DistributorUserFacade; +import co.yixiang.yshop.module.distributor.service.distributoruser.DistributorUserService; +import co.yixiang.yshop.module.distributor.service.distributorwages.DistributorWagesFacade; +import co.yixiang.yshop.module.system.enums.DistributorDictEnum; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +public class DistributorOrderApiImpl implements DistributorOrderApi { + + @Resource + private DistributorUserService distributorUserService; + + @Resource + private DistributorService distributorService; + + @Resource + private DistributorLevelService distributorLevelService; + + @Resource + private DistributorFacade distributorFacade; + + @Resource + private DistributorOrderService distributorOrderService; + + @Resource + private DistributorWagesFacade distributorWagesFacade; + + @Override + public void createDistributorOrder(DistributorOrderDTO distributorOrderDTO) { + List list = new ArrayList<>(); + + // 所属一级ID + Long superiorIdP1 = null; + // 一级名称 + String superiorNameP1 = null; + // 所属二级ID + Long superiorIdP2 = null; + // 二级名称 + String superiorNameP2 = null; + // 下单是不是分销商 + Boolean isDistributor = Boolean.FALSE; + + Integer distributorWager = 0; + Integer firstWages = 0; + Integer secondWages = 0; + + // 获取全局自购返佣 + String purchase = DictFrameworkUtils.parseDictDataValue(DistributorDictEnum.DISTRIBUTOR_PURCHASE.getDictType(), DistributorDictEnum.DISTRIBUTOR_PURCHASE.getLabel()); + + // 获取下单用户是不是分销商 + DistributorDO distributorDO = distributorService.getDistributorByUserId(distributorOrderDTO.getUserId()); + DistributorLevelDO levelP0 = null; + if (distributorDO != null) { + isDistributor = Boolean.TRUE; + levelP0 = distributorLevelService.getLevel(distributorDO.getLevelId()); + distributorWager = levelP0.getFirstWages(); + } + + // 没有分销商id 获取绑定关系 订单分销商id为空 + if (distributorOrderDTO.getDistributorId() == null) { + // 获取绑定关系 + DistributorUserDO distributorUserDO = distributorUserService.getByUserId(distributorOrderDTO.getUserId()); + if (distributorUserDO != null && distributorUserDO.getExpireTime().isAfter(LocalDateTime.now())) { + // 有绑定搞关系 + superiorIdP1 = distributorUserDO.getSuperiorIdP1(); + superiorNameP1 = distributorUserDO.getSuperiorNameP1(); + superiorIdP2 = distributorUserDO.getSuperiorIdP2(); + superiorNameP2 = distributorUserDO.getSuperiorNameP2(); + }else if (!isDistributor){ + // 不是分销并且没有绑定关系 + return; + } + }else { + // 有分销商id绑定用户 + Long distributorUserId = distributorFacade.bindUser(distributorOrderDTO.getDistributorId(), distributorOrderDTO.getUserId(), DistributorConstants.FALSE_INTEGER); + // 获取用户绑定关系 + DistributorUserDO distributorUserDO = distributorUserService.getUser(distributorUserId); + superiorIdP1 = distributorUserDO.getSuperiorIdP1(); + superiorNameP1 = distributorUserDO.getSuperiorNameP1(); + superiorIdP2 = distributorUserDO.getSuperiorIdP2(); + superiorNameP2 = distributorUserDO.getSuperiorNameP2(); + } + + // 一级分销商 + DistributorDO superiorP1; + DistributorLevelDO levelP1; + + if (superiorIdP1 != null) { + // 一级分销商 + superiorP1 = distributorService.get(superiorIdP1); + levelP1 = distributorLevelService.getLevel(superiorP1.getLevelId()); + firstWages = levelP1.getFirstWages(); + } + + // 二级分销商 + DistributorDO superiorP2; + DistributorLevelDO levelP2; + + if (superiorIdP2 != null) { + superiorP2 = distributorService.get(superiorIdP2); + levelP2 = distributorLevelService.getLevel(superiorP2.getLevelId()); + secondWages = levelP2.getSecondWages(); + } + + // 保存订单 + List productDTOList = distributorOrderDTO.getProductDTOList(); + for (DistributorProductDTO dto: productDTOList) { + DistributorOrderDO distributorOrderDO = new DistributorOrderDO(); + distributorOrderDO.setOid(distributorOrderDTO.getOid()); + distributorOrderDO.setOrderId(distributorOrderDTO.getOrderId()); + distributorOrderDO.setUserId(distributorOrderDTO.getUserId()); + distributorOrderDO.setUserName(distributorOrderDTO.getUserName()); + distributorOrderDO.setProductOriginalPrice(dto.getProductOriginalPrice()); + distributorOrderDO.setProductPrice(dto.getProductPrice()); + distributorOrderDO.setProductId(dto.getProductId()); + distributorOrderDO.setProductName(dto.getProductName()); + distributorOrderDO.setProductAttrValueId(dto.getProductAttrValueId()); + distributorOrderDO.setDetailId(dto.getDetailId()); + distributorOrderDO.setDistributionRule(dto.getDistributionRule()); + + // 判断商品结算方式 + BigDecimal price; + distributorOrderDO.setDistributionProductSettlement(dto.getDistributionProductSettlement()); + if (dto.getDistributionProductSettlement().equals(DistributorConstants.FALSE_INTEGER)) { + // 实际支付 + price = dto.getProductPrice(); + }else { + // 商品价格 + price = dto.getProductOriginalPrice(); + } + // 判断分销等级 + distributorOrderDO.setDistributionLevel(dto.getDistributionLevel()); + // 判断全局自购开启并且商品支持自购 + if (purchase.equals(DistributorConstants.TURE_STR) && dto.getDistributionPurchase().equals(DistributorConstants.TURE_INTEGER) && isDistributor) { + // 自购逻辑 + distributorOrderDO.setSuperiorIdP1(distributorDO.getId()); + distributorOrderDO.setSuperiorNameP1(distributorDO.getRealName()); + + // 判断商品分销规则 + if (dto.getDistributionRule().equals(DistributorConstants.FALSE_INTEGER)) { + // 默认 + distributorOrderDO.setFirstWages(distributorWager); + distributorOrderDO.setSecondWages(firstWages); + }else { + // 自定义 + distributorOrderDO.setFirstWages(dto.getFirstWages()); + distributorOrderDO.setSecondWages(dto.getSecondWages()); + } + + distributorOrderDO.setFirstAmount(new BigDecimal(distributorOrderDO.getFirstWages()).multiply(price).divide(new BigDecimal(100), RoundingMode.HALF_DOWN)); + + // 判断开启二级分销 + if (dto.getDistributionLevel().equals(DistributorLevelTypeEnum.P2.getType())) { + // 有二级 + distributorOrderDO.setSuperiorIdP2(superiorIdP1); + distributorOrderDO.setSuperiorNameP2(superiorNameP1); + distributorOrderDO.setSecondAmount(new BigDecimal(distributorOrderDO.getSecondWages()).multiply(price).divide(new BigDecimal(100), RoundingMode.HALF_DOWN)); + } + }else { + // 正常逻辑 + distributorOrderDO.setSuperiorIdP1(superiorIdP1); + distributorOrderDO.setSuperiorNameP1(superiorNameP1); + // 判断商品分销规则 + if (dto.getDistributionRule().equals(DistributorConstants.FALSE_INTEGER)) { + // 默认 + distributorOrderDO.setFirstWages(firstWages); + distributorOrderDO.setSecondWages(secondWages); + }else { + // 自定义 + distributorOrderDO.setFirstWages(dto.getFirstWages()); + distributorOrderDO.setSecondWages(dto.getSecondWages()); + } + + distributorOrderDO.setFirstAmount(new BigDecimal(distributorOrderDO.getFirstWages()).multiply(price).divide(new BigDecimal(100), RoundingMode.HALF_DOWN)); + + // 判断开启二级分销 + if (dto.getDistributionLevel().equals(DistributorLevelTypeEnum.P2.getType())) { + // 有二级 + distributorOrderDO.setSuperiorIdP2(superiorIdP2); + distributorOrderDO.setSuperiorNameP2(superiorNameP2); + distributorOrderDO.setSecondAmount(new BigDecimal(distributorOrderDO.getSecondWages()).multiply(price).divide(new BigDecimal(100), RoundingMode.HALF_DOWN)); + } + } + + + + // 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + distributorOrderDO.setDistributionWagesSettlement(dto.getDistributionWagesSettlement()); + if (dto.getDistributionWagesSettlement().equals(DistributorSettlementTypeEnum.PAY.getType())) { + // 支付后结算 + distributorOrderDO.setStatus(DistributorOrderStatusEnum.COMPLETE.getStatus()); + distributorOrderDO.setSettlementTime(LocalDateTime.now()); + }else { + distributorOrderDO.setStatus(DistributorOrderStatusEnum.WAIT.getStatus()); + } + + + // 保存集合 + list.add(distributorOrderDO); + } + + // 批量保存 + distributorOrderService.insertBatch(list); + // 结算佣金 + list.forEach(x -> { + distributorWagesFacade.saveWages(x); + if (x.getStatus().equals(DistributorOrderStatusEnum.COMPLETE.getStatus())) { + distributorWagesFacade.settlementWages(x); + } + }); + } + + @Override + public void cancelDistributorOrder(List ids) { + List orderList = distributorOrderService.getOrderList(new DistributorOrderExportReqVO().setDetailIds(ids)); + // 所有详情id + List distributorOrderIds = CollectionUtils.convertList(orderList, DistributorOrderDO::getId); + distributorWagesFacade.cancelWages(distributorOrderIds); + } + + @Override + public void updateDistributorOrder(DistributorOrderDTO distributorOrderDTO) { + // 所有商品 + List productDTOList = distributorOrderDTO.getProductDTOList(); + + for (DistributorProductDTO dto : productDTOList) { + // 查询此订单 + DistributorOrderDO distributorOrderDO = distributorOrderService.getOrderByDetailId(dto.getDetailId()); + if (distributorOrderDO.getStatus().equals(DistributorOrderStatusEnum.WAIT.getStatus())) { + // 判断结算步骤 + boolean isCompleteSettlementType = distributorOrderDTO.getDistributorSettlementType().equals(DistributorSettlementTypeEnum.COMPLETE.getType()); + boolean isMatchingDistributionProductSettlement = distributorOrderDTO.getDistributorSettlementType().equals(distributorOrderDO.getDistributionProductSettlement()); + + if (isCompleteSettlementType || isMatchingDistributionProductSettlement) { + // 直接结算 + settleOrderAndWages(distributorOrderDO); + } + } + } + } + + private void settleOrderAndWages(DistributorOrderDO distributorOrderDO) { + // 更新订单状态订单 + DistributorOrderUpdateReqVO distributorOrderUpdateReqVO = new DistributorOrderUpdateReqVO(); + distributorOrderUpdateReqVO.setId(distributorOrderDO.getId()); + distributorOrderUpdateReqVO.setStatus(DistributorOrderStatusEnum.COMPLETE.getStatus()); + distributorOrderUpdateReqVO.setSettlementTime(LocalDateTime.now()); + distributorOrderService.updateOrder(distributorOrderUpdateReqVO); + distributorWagesFacade.settlementWages(distributorOrderDO); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/DistributorController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/DistributorController.java new file mode 100644 index 0000000..e77f799 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/DistributorController.java @@ -0,0 +1,103 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.*; +import co.yixiang.yshop.module.distributor.convert.distributor.DistributorConvert; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorFacade; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 分销商") +@RestController +@RequestMapping("/distributor/distributor") +@Validated +public class DistributorController { + + @Resource + private DistributorService distributorService; + + @Resource + private DistributorFacade distributorFacade; + + @PutMapping("/update") + @Operation(summary = "更新分销商") + @PreAuthorize("@ss.hasPermission('distributor::update')") + public CommonResult update(@Valid @RequestBody DistributorUpdateReqVO updateReqVO) { + distributorService.update(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor::delete')") + public CommonResult delete(@RequestParam("id") Long id) { + distributorService.delete(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商详情") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor::query')") + public CommonResult get(@RequestParam("id") Long id) { + return success(distributorFacade.getDetails(id)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = distributorService.getList(ids); + return success(DistributorConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商分页") + @PreAuthorize("@ss.hasPermission('distributor::query')") + public CommonResult> getPage(@Valid DistributorPageReqVO pageVO) { + PageResult pageResult = distributorFacade.getPage(pageVO); + return success(DistributorConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/verify") + @Operation(summary = "审核分销商") + @PreAuthorize("@ss.hasPermission('distributor::create')") + public CommonResult verify(@Valid @RequestBody DistributorApplyReqVO reqVO) { + distributorFacade.verify(reqVO); + return success(Boolean.TRUE); + } + + // 清退分销商 + @PostMapping("/clearance") + @Operation(summary = "清退/恢复分销商") + @PreAuthorize("@ss.hasPermission('distributor::create')") + public CommonResult clearance(@Valid @RequestBody DistributorClearanceReqVO reqVO) { + distributorFacade.clearance(reqVO); + return success(Boolean.TRUE); + } + + @PostMapping("/restore") + @Operation(summary = "恢复分销商") + @PreAuthorize("@ss.hasPermission('distributor::create')") + public CommonResult restore(@Valid @RequestBody DistributorClearanceReqVO reqVO) { + distributorFacade.restore(reqVO); + return success(Boolean.TRUE); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorApplyReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorApplyReqVO.java new file mode 100644 index 0000000..5bba898 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorApplyReqVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** +* 分销商 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorApplyReqVO { + + @Schema(description = "主键", required = true, example = "463") + @NotNull(message = "主键不能为空") + private Long id; + + @Schema(description = "拒绝原因") + private String refuse; + + @Schema(description = "状态 -1-清退 0-待审核 1-已通过 2-已拒绝", example = "1") + private Integer status; + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorBaseVO.java new file mode 100644 index 0000000..3a9137a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorBaseVO.java @@ -0,0 +1,59 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** + * 分销商 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DistributorBaseVO { + + @Schema(description = "用户ID", example = "12876") + private Long userId; + + @Schema(description = "真实姓名", example = "王五") + private String realName; + + @Schema(description = "等级ID", example = "7188") + private Long levelId; + + @Schema(description = "上级ID", example = "16998") + private Long superiorId; + + @Schema(description = "上级名称", example = "yshop") + private String superiorName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "申请原因", example = "不对") + private String reason; + + @Schema(description = "拒绝原因") + private String refuse; + + @Schema(description = "状态 -1-清退 0-待审核 1-已通过 2-已拒绝", example = "1") + private Integer status; + + @Schema(description = "累计金额") + private BigDecimal addUpAmount; + + @Schema(description = "累计佣金") + private BigDecimal addUpWages; + + @Schema(description = "累计用户") + private Integer addUpUser; + + @Schema(description = "累计下级经销商") + private Integer addUpDistributor; + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorClearanceReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorClearanceReqVO.java new file mode 100644 index 0000000..beae055 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorClearanceReqVO.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 分销商 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorClearanceReqVO { + + @Schema(description = "主键", required = true, example = "463") + @NotNull(message = "主键不能为空") + private Long id; + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorCreateReqVO.java new file mode 100644 index 0000000..ecc6c46 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorCreateReqVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "创建分销商") +@Data +@ToString(callSuper = true) +public class DistributorCreateReqVO { + + @Schema(description = "用户ID", example = "12876") + private Long userId; + + @Schema(description = "等级ID", example = "7188") + private Long levelId; + + @Schema(description = "真实姓名", example = "王五") + private String realName; + + @Schema(description = "上级ID") + private Long superiorId; + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExcelVO.java new file mode 100644 index 0000000..d028fdd --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExcelVO.java @@ -0,0 +1,66 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商 Excel VO + * + * @author admin + */ +@Data +public class DistributorExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("真实姓名") + private String realName; + + @ExcelProperty("等级ID") + private Long levelId; + + @ExcelProperty("上级ID") + private Long superiorId; + + @ExcelProperty("上级名称") + private String superiorName; + + @ExcelProperty("地址") + private String address; + + @ExcelProperty("申请原因") + private String reason; + + @ExcelProperty("拒绝原因") + private String refuse; + + @ExcelProperty("状态 0-待审核 1-已通过 2-已拒绝") + private Integer status; + + @ExcelProperty("累计金额") + private BigDecimal addUpAmount; + + @ExcelProperty("累计佣金") + private BigDecimal addUpWages; + + @ExcelProperty("累计用户") + private Integer addUpUser; + + @ExcelProperty("累计下级经销商") + private Integer addUpDistributor; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExportReqVO.java new file mode 100644 index 0000000..8aee490 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorExportReqVO.java @@ -0,0 +1,64 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商 Excel 导出 Request VO,参数和 DistributorPageReqVO 是一致的") +@Data +public class DistributorExportReqVO { + + @Schema(description = "用户ID", example = "12876") + private Long userId; + + @Schema(description = "真实姓名", example = "王五") + private String realName; + + @Schema(description = "等级ID", example = "7188") + private Long levelId; + + @Schema(description = "地址") + private String address; + + @Schema(description = "申请原因", example = "不对") + private String reason; + + @Schema(description = "拒绝原因") + private String refuse; + + @Schema(description = "累计金额") + private BigDecimal addUpAmount; + + @Schema(description = "累计佣金") + private BigDecimal addUpWages; + + @Schema(description = "累计下级经销商") + private Integer addUpDistributor; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "上级名称") + private String superiorNameP1; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "上级名称") + private String superiorNameP2; + + @Schema(description = "状态-1-清退 0-待审核 1-已通过 2-已拒绝", example = "2") + private Integer status; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorPageReqVO.java new file mode 100644 index 0000000..c5fa2bf --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorPageReqVO.java @@ -0,0 +1,80 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorPageReqVO extends PageParam { + + @Schema(description = "用户ID", example = "12876") + private Long userId; + + @Schema(description = "真实姓名", example = "王五") + private String realName; + + @Schema(description = "等级ID", example = "7188") + private Long levelId; + + @Schema(description = "上级ID", example = "16998") + private Long superiorId; + + @Schema(description = "上级名称", example = "yshop") + private String superiorName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "申请原因", example = "不对") + private String reason; + + @Schema(description = "拒绝原因") + private String refuse; + + @Schema(description = "状态 0-待审核 1-已通过 2-已拒绝", example = "1") + private Integer status; + + @Schema(description = "累计金额") + private BigDecimal addUpAmount; + + @Schema(description = "累计佣金") + private BigDecimal addUpWages; + + @Schema(description = "累计用户") + private Integer addUpUser; + + @Schema(description = "累计下级经销商") + private Integer addUpDistributor; + + /** + * 所属一级ID + */ + private Long superiorIdP1; + /** + * 上级名称 + */ + private String superiorNameP1; + /** + * 所属二级ID + */ + private Long superiorIdP2; + /** + * 上级名称 + */ + private String superiorNameP2; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorRespVO.java new file mode 100644 index 0000000..407030a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorRespVO.java @@ -0,0 +1,92 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorRespVO extends DistributorBaseVO { + + @Schema(description = "主键") + private Long id; + + @Schema(description = "分销商等级名称") + private String levelName; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "手机号") + private String mobile; + + // 一级佣金比例 + @Schema(description = "一级佣金比例") + private Integer firstWages; + + // 二级佣金比例 + @Schema(description = "二级佣金比例") + private Integer secondWages; + + // 团队人数 + @Schema(description = "团队人数") + private Integer userCount; + + // 一级团队人数 + @Schema(description = "一级团队人数") + private Integer p1UserCount; + + // 二级团队人数 + @Schema(description = "二级团队人数") + private Integer p2UserCount; + + // 一级分销商数 + @Schema(description = "一级分销商数") + private Integer firstDistributorCount; + + // 二级分销商数 + @Schema(description = "二级分销商数") + private Integer secondDistributorCount; + + // 团队分销金额 + @Schema(description = "团队分销金额") + private BigDecimal amountCount; + + // 团队分销订单数 + @Schema(description = "团队分销订单数") + private Integer orderCount; + + @Schema(description = "一级分销商分销金额") + private BigDecimal firstAmountCount; + + @Schema(description = "一级分销商订单数") + private Integer firstOrderCount; + + @Schema(description = "二级分销商分销金额") + private BigDecimal secondAmountCount; + + @Schema(description = "二级分销商订单数") + private Integer secondOrderCount; + + /** + * 所属一级ID + */ + private Long superiorIdP1; + /** + * 上级名称 + */ + private String superiorNameP1; + /** + * 所属二级ID + */ + private Long superiorIdP2; + /** + * 上级名称 + */ + private String superiorNameP2; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorUpdateReqVO.java new file mode 100644 index 0000000..d36c63e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributor/vo/DistributorUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorUpdateReqVO extends DistributorBaseVO { + + @Schema(description = "主键", required = true, example = "463") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/DistributorDynamicsController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/DistributorDynamicsController.java new file mode 100644 index 0000000..a6f9399 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/DistributorDynamicsController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics.DistributorDynamicsDO; +import co.yixiang.yshop.module.distributor.convert.distributordynamics.DistributorDynamicsConvert; +import co.yixiang.yshop.module.distributor.service.distributordynamics.DistributorDynamicsService; + +@Tag(name = "管理后台 - 分销商动态") +@RestController +@RequestMapping("/distributor/dynamics") +@Validated +public class DistributorDynamicsController { + + @Resource + private DistributorDynamicsService dynamicsService; + + @PostMapping("/create") + @Operation(summary = "创建分销商动态") + @PreAuthorize("@ss.hasPermission('distributor:dynamics:create')") + public CommonResult createDynamics(@Valid @RequestBody DistributorDynamicsCreateReqVO createReqVO) { + return success(dynamicsService.createDynamics(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商动态") + @PreAuthorize("@ss.hasPermission('distributor:dynamics:update')") + public CommonResult updateDynamics(@Valid @RequestBody DistributorDynamicsUpdateReqVO updateReqVO) { + dynamicsService.updateDynamics(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商动态") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:dynamics:delete')") + public CommonResult deleteDynamics(@RequestParam("id") Long id) { + dynamicsService.deleteDynamics(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商动态") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:dynamics:query')") + public CommonResult getDynamics(@RequestParam("id") Long id) { + DistributorDynamicsDO dynamics = dynamicsService.getDynamics(id); + return success(DistributorDynamicsConvert.INSTANCE.convert(dynamics)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商动态列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:dynamics:query')") + public CommonResult> getDynamicsList(@RequestParam("ids") Collection ids) { + List list = dynamicsService.getDynamicsList(ids); + return success(DistributorDynamicsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商动态分页") + @PreAuthorize("@ss.hasPermission('distributor:dynamics:query')") + public CommonResult> getDynamicsPage(@Valid DistributorDynamicsPageReqVO pageVO) { + PageResult pageResult = dynamicsService.getDynamicsPage(pageVO); + return success(DistributorDynamicsConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出分销商动态 Excel") + @PreAuthorize("@ss.hasPermission('distributor:dynamics:export')") + @OperateLog(type = EXPORT) + public void exportDynamicsExcel(@Valid DistributorDynamicsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = dynamicsService.getDynamicsList(exportReqVO); + // 导出 Excel + List datas = DistributorDynamicsConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "分销商动态.xls", "数据", DistributorDynamicsExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsBaseVO.java new file mode 100644 index 0000000..77800a8 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsBaseVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 分销商动态 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorDynamicsBaseVO { + + @Schema(description = "动态类型", example = "2") + private Integer type; + + @Schema(description = "分销商ID", example = "27176") + private Long distributorId; + + @Schema(description = "分销商名称", example = "张三") + private String distributorName; + + @Schema(description = "内容") + private String content; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsCreateReqVO.java new file mode 100644 index 0000000..8955bc6 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商动态创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorDynamicsCreateReqVO extends DistributorDynamicsBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExcelVO.java new file mode 100644 index 0000000..61cb133 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExcelVO.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商动态 Excel VO + * + * @author admin + */ +@Data +public class DistributorDynamicsExcelVO { + + @ExcelProperty("主键ID") + private Long id; + + @ExcelProperty("动态类型") + private Integer type; + + @ExcelProperty("分销商ID") + private Long distributorId; + + @ExcelProperty("分销商名称") + private String distributorName; + + @ExcelProperty("内容") + private String content; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExportReqVO.java new file mode 100644 index 0000000..9d4dbf0 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsExportReqVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商动态 Excel 导出 Request VO,参数和 DistributorDynamicsPageReqVO 是一致的") +@Data +public class DistributorDynamicsExportReqVO { + + @Schema(description = "动态类型", example = "2") + private Integer type; + + @Schema(description = "分销商ID", example = "27176") + private Long distributorId; + + @Schema(description = "分销商名称", example = "张三") + private String distributorName; + + @Schema(description = "内容") + private String content; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsPageReqVO.java new file mode 100644 index 0000000..264652d --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsPageReqVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商动态分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorDynamicsPageReqVO extends PageParam { + + @Schema(description = "动态类型", example = "2") + private Integer type; + + @Schema(description = "分销商ID", example = "27176") + private Long distributorId; + + @Schema(description = "分销商名称", example = "张三") + private String distributorName; + + @Schema(description = "内容") + private String content; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsRespVO.java new file mode 100644 index 0000000..affe5a8 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商动态 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorDynamicsRespVO extends DistributorDynamicsBaseVO { + + @Schema(description = "主键ID", required = true, example = "7459") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsUpdateReqVO.java new file mode 100644 index 0000000..1202316 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributordynamics/vo/DistributorDynamicsUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商动态更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorDynamicsUpdateReqVO extends DistributorDynamicsBaseVO { + + @Schema(description = "主键ID", required = true, example = "7459") + @NotNull(message = "主键ID不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/DistributorLevelController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/DistributorLevelController.java new file mode 100644 index 0000000..95fe987 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/DistributorLevelController.java @@ -0,0 +1,122 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.*; +import co.yixiang.yshop.module.distributor.convert.distributorlevel.DistributorLevelConvert; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import co.yixiang.yshop.module.distributor.service.distributorlevel.DistributorLevelFacade; +import co.yixiang.yshop.module.distributor.service.distributorlevel.DistributorLevelService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.common.util.collection.CollectionUtils.convertList; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 分销商等级") +@RestController +@RequestMapping("/distributor/level") +@Validated +public class DistributorLevelController { + + @Resource + private DistributorLevelService levelService; + + @Resource + private DistributorLevelFacade distributorLevelFacade; + + // 获取已有分销商等级 + @GetMapping("/get-all") + @Operation(summary = "获取已有分销商等级") + @PreAuthorize("@ss.hasPermission('distributor:level:query')") + public CommonResult> getAllLevel() { + List levelList = levelService.getLevelList(new DistributorLevelExportReqVO()); + List levels = convertList(levelList, DistributorLevelDO::getLevel); + return success(levels); + } + + + @PostMapping("/create") + @Operation(summary = "创建分销商等级") + @PreAuthorize("@ss.hasPermission('distributor:level:create')") + public CommonResult createLevel(@Valid @RequestBody DistributorLevelCreateReqVO createReqVO) { + Long level = distributorLevelFacade.createLevel(createReqVO); + return success(level); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商等级") + @PreAuthorize("@ss.hasPermission('distributor:level:update')") + public CommonResult updateLevel(@Valid @RequestBody DistributorLevelUpdateReqVO updateReqVO) { + distributorLevelFacade.updateLevel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商等级") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:level:delete')") + public CommonResult deleteLevel(@RequestParam("id") Long id) { + levelService.deleteLevel(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商等级") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:level:query')") + public CommonResult getLevel(@RequestParam("id") Long id) { + DistributorLevelDO level = levelService.getLevel(id); + return success(DistributorLevelConvert.INSTANCE.convert(level)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商等级列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:level:query')") + public CommonResult> getLevelList(@RequestParam("ids") Collection ids) { + List list = levelService.getLevelList(ids); + return success(DistributorLevelConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商等级分页") + @PreAuthorize("@ss.hasPermission('distributor:level:query')") + public CommonResult> getLevelPage(@Valid DistributorLevelPageReqVO pageVO) { + return success(distributorLevelFacade.getLevelPage(pageVO)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出分销商等级 Excel") + @PreAuthorize("@ss.hasPermission('distributor:level:export')") + @OperateLog(type = EXPORT) + public void exportLevelExcel(@Valid DistributorLevelExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = levelService.getLevelList(exportReqVO); + // 导出 Excel + List datas = DistributorLevelConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "分销商等级.xls", "数据", DistributorLevelExcelVO.class, datas); + } + + @PostMapping("/level-up") + @Operation(summary = "分销商升级") + public CommonResult levelUp(@RequestParam("id") Long id) { + distributorLevelFacade.levelUp(id); + return success(Boolean.TRUE); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelBaseVO.java new file mode 100644 index 0000000..e71bda8 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelBaseVO.java @@ -0,0 +1,46 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 分销商等级 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorLevelBaseVO { + + @Schema(description = "等级 1-10") + private Integer level; + + @Schema(description = "等级名称", example = "张三") + private String name; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "三级佣金比例") + private Integer thirdWages; + + @Schema(description = "升级类型 0-满足任意 1-满足全部", example = "2") + private Integer upType; + + @Schema(description = "人数 值为-1是未选中", example = "2581") + private Integer userCount; + + @Schema(description = "金额 值为-1是未选中") + private BigDecimal amount; + + @Schema(description = "佣金 值为-1是未选中") + private BigDecimal wages; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelCreateReqVO.java new file mode 100644 index 0000000..9e4a7b9 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商等级创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorLevelCreateReqVO extends DistributorLevelBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExcelVO.java new file mode 100644 index 0000000..7793eda --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExcelVO.java @@ -0,0 +1,52 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商等级 Excel VO + * + * @author admin + */ +@Data +public class DistributorLevelExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("等级 1-10") + private Integer level; + + @ExcelProperty("等级名称") + private String name; + + @ExcelProperty("一级佣金比例") + private Integer firstWages; + + @ExcelProperty("二级佣金比例") + private Integer secondWages; + + @ExcelProperty("三级佣金比例") + private Integer thirdWages; + + @ExcelProperty("升级类型 0-满足任意 1-满足全部") + private Integer upType; + + @ExcelProperty("人数 值为-1是未选中") + private Integer userCount; + + @ExcelProperty("金额 值为-1是未选中") + private Integer amount; + + @ExcelProperty("佣金 值为-1是未选中") + private Integer wages; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExportReqVO.java new file mode 100644 index 0000000..3d3d8d6 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelExportReqVO.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商等级 Excel 导出 Request VO,参数和 DistributorLevelPageReqVO 是一致的") +@Data +public class DistributorLevelExportReqVO { + + @Schema(description = "等级 1-10") + private Integer level; + + @Schema(description = "等级名称", example = "张三") + private String name; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "三级佣金比例") + private Integer thirdWages; + + @Schema(description = "升级类型 0-满足任意 1-满足全部", example = "2") + private Integer upType; + + @Schema(description = "人数 值为-1是未选中", example = "2581") + private Integer userCount; + + @Schema(description = "金额 值为-1是未选中") + private Integer amount; + + @Schema(description = "佣金 值为-1是未选中") + private Integer wages; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelPageReqVO.java new file mode 100644 index 0000000..594a205 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelPageReqVO.java @@ -0,0 +1,49 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商等级分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorLevelPageReqVO extends PageParam { + + @Schema(description = "等级 1-10") + private Integer level; + + @Schema(description = "等级名称", example = "张三") + private String name; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "三级佣金比例") + private Integer thirdWages; + + @Schema(description = "升级类型 0-满足任意 1-满足全部", example = "2") + private Integer upType; + + @Schema(description = "人数 值为-1是未选中", example = "2581") + private Integer userCount; + + @Schema(description = "金额 值为-1是未选中") + private Integer amount; + + @Schema(description = "佣金 值为-1是未选中") + private Integer wages; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelRespVO.java new file mode 100644 index 0000000..5bb8899 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelRespVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商等级 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorLevelRespVO extends DistributorLevelBaseVO { + + @Schema(description = "主键", required = true, example = "9364") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "分销商数量", required = true) + private Integer count; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelUpdateReqVO.java new file mode 100644 index 0000000..5507fa7 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorlevel/vo/DistributorLevelUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商等级更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorLevelUpdateReqVO extends DistributorLevelBaseVO { + + @Schema(description = "主键", required = true, example = "9364") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/DistributorOrderController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/DistributorOrderController.java new file mode 100644 index 0000000..299f441 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/DistributorOrderController.java @@ -0,0 +1,93 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.convert.distributororder.DistributorOrderConvert; +import co.yixiang.yshop.module.distributor.service.distributororder.DistributorOrderService; + +@Tag(name = "管理后台 - 分销商订单") +@RestController +@RequestMapping("/distributor/order") +@Validated +public class DistributorOrderController { + + @Resource + private DistributorOrderService orderService; + + @PostMapping("/create") + @Operation(summary = "创建分销商订单") + @PreAuthorize("@ss.hasPermission('distributor:order:create')") + public CommonResult createOrder(@Valid @RequestBody DistributorOrderCreateReqVO createReqVO) { + return success(orderService.createOrder(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商订单") + @PreAuthorize("@ss.hasPermission('distributor:order:update')") + public CommonResult updateOrder(@Valid @RequestBody DistributorOrderUpdateReqVO updateReqVO) { + orderService.updateOrder(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商订单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:order:delete')") + public CommonResult deleteOrder(@RequestParam("id") Long id) { + orderService.deleteOrder(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商订单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:order:query')") + public CommonResult getOrder(@RequestParam("id") Long id) { + DistributorOrderDO order = orderService.getOrder(id); + return success(DistributorOrderConvert.INSTANCE.convert(order)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商订单列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:order:query')") + public CommonResult> getOrderList(@RequestParam("ids") Collection ids) { + List list = orderService.getOrderList(ids); + return success(DistributorOrderConvert.INSTANCE.convertList(list)); + } + + + + @GetMapping("/page") + @Operation(summary = "获得分销商订单分页") + @PreAuthorize("@ss.hasPermission('distributor:order:query')") + public CommonResult> getOrderPage(@Valid DistributorOrderPageReqVO pageVO) { + PageResult pageResult = orderService.getOrderPage(pageVO); + return success(DistributorOrderConvert.INSTANCE.convertPage(pageResult)); + } + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderBaseVO.java new file mode 100644 index 0000000..ec5958b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderBaseVO.java @@ -0,0 +1,94 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 分销商订单 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorOrderBaseVO { + + @Schema(description = "结算时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime settlementTime; + + @Schema(description = "订单ID", example = "18018") + private Long oid; + + @Schema(description = "订单号", example = "32634") + private String orderId; + + @Schema(description = "佣金状态", example = "1") + private Integer status; + + @Schema(description = "分销规则 0-默认 1-自定义") + private Integer distributionRule; + + @Schema(description = "分销自购 0-关闭 1-开启") + private Integer distributionPurchase; + + @Schema(description = "商品结算方式 0-实际支付价格 1-商品价格") + private Integer distributionProductSettlement; + + @Schema(description = "佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算") + private Integer distributionWagesSettlement; + + @Schema(description = "下单用户", example = "625") + private Long userId; + + @Schema(description = "用户昵称", example = "王五") + private String userName; + + @Schema(description = "商品ID", example = "32461") + private Long productId; + + @Schema(description = "商品规格ID", example = "20034") + private Long productAttrValueId; + + @Schema(description = "商品名称", example = "张三") + private String productName; + + @Schema(description = "商品金额", example = "27614") + private BigDecimal productPrice; + + @Schema(description = "订单详情id", example = "12663") + private Long detailId; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "所属一级名称") + private String superiorNameP1; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "所属二级名称") + private String superiorNameP2; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "一级佣金") + private BigDecimal firstAmount; + + @Schema(description = "二级佣金") + private BigDecimal secondAmount; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderCreateReqVO.java new file mode 100644 index 0000000..2992077 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商订单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorOrderCreateReqVO extends DistributorOrderBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderDetailsRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderDetailsRespVO.java new file mode 100644 index 0000000..2696e2c --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderDetailsRespVO.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商订单 Response VO") +@Data +@ToString(callSuper = true) +public class DistributorOrderDetailsRespVO { + + @Schema(description = "主键", required = true, example = "22172") + private Long id; + + @Schema(description = "订单号", example = "32634") + private String orderId; + + @Schema(description = "一级分销商", example = "12335") + private String p1Name; + + @Schema(description = "二级分销商", example = "12335") + private String p2Name; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + // 二级佣金比例 + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "一级佣金") + private BigDecimal firstAmount; + + // 二级佣金比例 + @Schema(description = "二级佣金") + private BigDecimal secondAmount; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExcelVO.java new file mode 100644 index 0000000..9193a90 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExcelVO.java @@ -0,0 +1,98 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商订单 Excel VO + * + * @author admin + */ +@Data +public class DistributorOrderExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("结算时间") + private LocalDateTime settlementTime; + + @ExcelProperty("订单ID") + private Long oid; + + @ExcelProperty("订单号") + private String orderId; + + @ExcelProperty("佣金状态") + private Integer status; + + @ExcelProperty("分销规则 0-默认 1-自定义") + private Integer distributionRule; + + @ExcelProperty("分销自购 0-关闭 1-开启") + private Integer distributionPurchase; + + @ExcelProperty("商品结算方式 0-实际支付价格 1-商品价格") + private Integer distributionProductSettlement; + + @ExcelProperty("佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算") + private Integer distributionWagesSettlement; + + @ExcelProperty("下单用户") + private Long userId; + + @ExcelProperty("用户昵称") + private String userName; + + @ExcelProperty("商品ID") + private Long productId; + + @ExcelProperty("商品规格ID") + private Long productAttrValueId; + + @ExcelProperty("商品名称") + private String productName; + + @ExcelProperty("商品金额") + private BigDecimal productPrice; + + @ExcelProperty("订单详情id") + private Long detailId; + + @ExcelProperty("所属一级ID") + private Long superiorIdP1; + + @ExcelProperty("上级名称") + private String superiorNameP1; + + @ExcelProperty("所属二级ID") + private Long superiorIdP2; + + @ExcelProperty("上级名称") + private String superiorNameP2; + + @ExcelProperty("一级佣金比例") + private Integer firstWages; + + @ExcelProperty("二级佣金比例") + private Integer secondWages; + + @ExcelProperty("一级佣金") + private BigDecimal firstAmount; + + @ExcelProperty("二级佣金") + private BigDecimal secondAmount; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExportReqVO.java new file mode 100644 index 0000000..d69930b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderExportReqVO.java @@ -0,0 +1,98 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商订单 Excel 导出 Request VO,参数和 DistributorOrderPageReqVO 是一致的") +@Data +public class DistributorOrderExportReqVO { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "结算时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] settlementTime; + + @Schema(description = "订单ID", example = "18018") + private Long oid; + + @Schema(description = "订单号", example = "32634") + private String orderId; + + @Schema(description = "佣金状态", example = "1") + private Integer status; + + @Schema(description = "分销规则 0-默认 1-自定义") + private Integer distributionRule; + + @Schema(description = "分销自购 0-关闭 1-开启") + private Integer distributionPurchase; + + @Schema(description = "商品结算方式 0-实际支付价格 1-商品价格") + private Integer distributionProductSettlement; + + @Schema(description = "佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算") + private Integer distributionWagesSettlement; + + @Schema(description = "下单用户", example = "625") + private Long userId; + + @Schema(description = "用户昵称", example = "王五") + private String userName; + + @Schema(description = "商品ID", example = "32461") + private Long productId; + + @Schema(description = "商品规格ID", example = "20034") + private Long productAttrValueId; + + @Schema(description = "商品名称", example = "张三") + private String productName; + + @Schema(description = "商品金额", example = "27614") + private BigDecimal productPrice; + + @Schema(description = "订单详情id", example = "12663") + private Long detailId; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "上级名称") + private String superiorNameP1; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "上级名称") + private String superiorNameP2; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "一级佣金") + private BigDecimal firstAmount; + + @Schema(description = "二级佣金") + private BigDecimal secondAmount; + + @Schema(description = "下单用户ids", example = "625") + private List userIds; + + @Schema(description = "订单详情ids", example = "12663") + private List detailIds; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderPageReqVO.java new file mode 100644 index 0000000..d083498 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderPageReqVO.java @@ -0,0 +1,94 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商订单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorOrderPageReqVO extends PageParam { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "结算时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] settlementTime; + + @Schema(description = "订单ID", example = "18018") + private Long oid; + + @Schema(description = "订单号", example = "32634") + private String orderId; + + @Schema(description = "佣金状态", example = "1") + private Integer status; + + @Schema(description = "分销规则 0-默认 1-自定义") + private Integer distributionRule; + + @Schema(description = "分销自购 0-关闭 1-开启") + private Integer distributionPurchase; + + @Schema(description = "商品结算方式 0-实际支付价格 1-商品价格") + private Integer distributionProductSettlement; + + @Schema(description = "佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算") + private Integer distributionWagesSettlement; + + @Schema(description = "下单用户", example = "625") + private Long userId; + + @Schema(description = "用户昵称", example = "王五") + private String userName; + + @Schema(description = "商品ID", example = "32461") + private Long productId; + + @Schema(description = "商品规格ID", example = "20034") + private Long productAttrValueId; + + @Schema(description = "商品名称", example = "张三") + private String productName; + + @Schema(description = "商品金额", example = "27614") + private BigDecimal productPrice; + + @Schema(description = "订单详情id", example = "12663") + private Long detailId; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "上级名称") + private String superiorNameP1; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "上级名称") + private String superiorNameP2; + + @Schema(description = "一级佣金比例") + private Integer firstWages; + + @Schema(description = "二级佣金比例") + private Integer secondWages; + + @Schema(description = "一级佣金") + private BigDecimal firstAmount; + + @Schema(description = "二级佣金") + private BigDecimal secondAmount; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderRespVO.java new file mode 100644 index 0000000..d3137e5 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商订单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorOrderRespVO extends DistributorOrderBaseVO { + + @Schema(description = "主键", required = true, example = "22172") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderUpdateReqVO.java new file mode 100644 index 0000000..9e64905 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributororder/vo/DistributorOrderUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商订单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorOrderUpdateReqVO extends DistributorOrderBaseVO { + + @Schema(description = "主键", required = true, example = "22172") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/DistributorUserController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/DistributorUserController.java new file mode 100644 index 0000000..585306e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/DistributorUserController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.convert.distributoruser.DistributorUserConvert; +import co.yixiang.yshop.module.distributor.service.distributoruser.DistributorUserService; + +@Tag(name = "管理后台 - 分销商所属用户") +@RestController +@RequestMapping("/distributor/user") +@Validated +public class DistributorUserController { + + @Resource + private DistributorUserService userService; + + @PostMapping("/create") + @Operation(summary = "创建分销商所属用户") + @PreAuthorize("@ss.hasPermission('distributor:user:create')") + public CommonResult createUser(@Valid @RequestBody DistributorUserCreateReqVO createReqVO) { + return success(userService.createUser(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商所属用户") + @PreAuthorize("@ss.hasPermission('distributor:user:update')") + public CommonResult updateUser(@Valid @RequestBody DistributorUserUpdateReqVO updateReqVO) { + userService.updateUser(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商所属用户") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商所属用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:user:query')") + public CommonResult getUser(@RequestParam("id") Long id) { + DistributorUserDO user = userService.getUser(id); + return success(DistributorUserConvert.INSTANCE.convert(user)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商所属用户列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:user:query')") + public CommonResult> getUserList(@RequestParam("ids") Collection ids) { + List list = userService.getUserList(ids); + return success(DistributorUserConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商所属用户分页") + @PreAuthorize("@ss.hasPermission('distributor:user:query')") + public CommonResult> getUserPage(@Valid DistributorUserPageReqVO pageVO) { + PageResult pageResult = userService.getUserPage(pageVO); + return success(DistributorUserConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出分销商所属用户 Excel") + @PreAuthorize("@ss.hasPermission('distributor:user:export')") + @OperateLog(type = EXPORT) + public void exportUserExcel(@Valid DistributorUserExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userService.getUserList(exportReqVO); + // 导出 Excel + List datas = DistributorUserConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "分销商所属用户.xls", "数据", DistributorUserExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserBaseVO.java new file mode 100644 index 0000000..e3fa0d4 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserBaseVO.java @@ -0,0 +1,62 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 分销商所属用户 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorUserBaseVO { + + @Schema(description = "用户ID", example = "29341") + private Long userId; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "上级名称") + private String superiorNameP1; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "上级名称") + private String superiorNameP2; + + @Schema(description = "过期时间", required = true) + @NotNull(message = "过期时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expireTime; + + @Schema(description = "用户昵称", example = "张三") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + + @Schema(description = "商品数", example = "30188") + private Integer productCount; + + @Schema(description = "订单数", example = "11278") + private Integer orderCount; + + @Schema(description = "佣金数") + private BigDecimal wages; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + private Integer isDistributor; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserCreateReqVO.java new file mode 100644 index 0000000..3b440de --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商所属用户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorUserCreateReqVO extends DistributorUserBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExcelVO.java new file mode 100644 index 0000000..4f255e9 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExcelVO.java @@ -0,0 +1,60 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商所属用户 Excel VO + * + * @author admin + */ +@Data +public class DistributorUserExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("所属一级ID") + private Long superiorIdP1; + + @ExcelProperty("上级名称") + private String superiorNameP1; + + @ExcelProperty("所属二级ID") + private Long superiorIdP2; + + @ExcelProperty("上级名称") + private String superiorNameP2; + + @ExcelProperty("过期时间") + private LocalDateTime expireTime; + + @ExcelProperty("用户昵称") + private String nickname; + + @ExcelProperty("用户头像") + private String avatar; + + @ExcelProperty("商品数") + private Integer productCount; + + @ExcelProperty("订单数") + private Integer orderCount; + + @ExcelProperty("佣金数") + private BigDecimal wages; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExportReqVO.java new file mode 100644 index 0000000..d32616d --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserExportReqVO.java @@ -0,0 +1,62 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商所属用户 Excel 导出 Request VO,参数和 DistributorUserPageReqVO 是一致的") +@Data +public class DistributorUserExportReqVO { + + @Schema(description = "用户ID", example = "29341") + private Long userId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "上级名称") + private String superiorNameP1; + + @Schema(description = "所属一级IDS") + private List superiorIdP1s; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "上级名称") + private String superiorNameP2; + + @Schema(description = "所属二级IDS") + private List superiorIdP2s; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] expireTime; + + @Schema(description = "用户昵称", example = "张三") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + + @Schema(description = "商品数", example = "30188") + private Integer productCount; + + @Schema(description = "订单数", example = "11278") + private Integer orderCount; + + @Schema(description = "佣金数") + private BigDecimal wages; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserPageReqVO.java new file mode 100644 index 0000000..92c20d6 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserPageReqVO.java @@ -0,0 +1,58 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商所属用户分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorUserPageReqVO extends PageParam { + + @Schema(description = "用户ID", example = "29341") + private Long userId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "所属一级ID") + private Long superiorIdP1; + + @Schema(description = "上级名称") + private String superiorNameP1; + + @Schema(description = "所属二级ID") + private Long superiorIdP2; + + @Schema(description = "上级名称") + private String superiorNameP2; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] expireTime; + + @Schema(description = "用户昵称", example = "张三") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + + @Schema(description = "商品数", example = "30188") + private Integer productCount; + + @Schema(description = "订单数", example = "11278") + private Integer orderCount; + + @Schema(description = "佣金数") + private BigDecimal wages; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserRespVO.java new file mode 100644 index 0000000..c8e88c2 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserRespVO.java @@ -0,0 +1,16 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商所属用户 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorUserRespVO extends DistributorUserBaseVO { + + @Schema(description = "主键", required = true, example = "11207") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserUpdateReqVO.java new file mode 100644 index 0000000..edc5a2b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributoruser/vo/DistributorUserUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商所属用户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorUserUpdateReqVO extends DistributorUserBaseVO { + + @Schema(description = "主键", required = true, example = "11207") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/DistributorWagesController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/DistributorWagesController.java new file mode 100644 index 0000000..7c90c49 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/DistributorWagesController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import co.yixiang.yshop.module.distributor.convert.distributorwages.DistributorWagesConvert; +import co.yixiang.yshop.module.distributor.service.distributorwages.DistributorWagesService; + +@Tag(name = "管理后台 - 分销商佣金") +@RestController +@RequestMapping("/distributor/wages") +@Validated +public class DistributorWagesController { + + @Resource + private DistributorWagesService wagesService; + + @PostMapping("/create") + @Operation(summary = "创建分销商佣金") + @PreAuthorize("@ss.hasPermission('distributor:wages:create')") + public CommonResult createWages(@Valid @RequestBody DistributorWagesCreateReqVO createReqVO) { + return success(wagesService.createWages(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商佣金") + @PreAuthorize("@ss.hasPermission('distributor:wages:update')") + public CommonResult updateWages(@Valid @RequestBody DistributorWagesUpdateReqVO updateReqVO) { + wagesService.updateWages(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商佣金") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:wages:delete')") + public CommonResult deleteWages(@RequestParam("id") Long id) { + wagesService.deleteWages(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商佣金") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:wages:query')") + public CommonResult getWages(@RequestParam("id") Long id) { + DistributorWagesDO wages = wagesService.getWages(id); + return success(DistributorWagesConvert.INSTANCE.convert(wages)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商佣金列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:wages:query')") + public CommonResult> getWagesList(@RequestParam("ids") Collection ids) { + List list = wagesService.getWagesList(ids); + return success(DistributorWagesConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商佣金分页") + @PreAuthorize("@ss.hasPermission('distributor:wages:query')") + public CommonResult> getWagesPage(@Valid DistributorWagesPageReqVO pageVO) { + PageResult pageResult = wagesService.getWagesPage(pageVO); + return success(DistributorWagesConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出分销商佣金 Excel") + @PreAuthorize("@ss.hasPermission('distributor:wages:export')") + @OperateLog(type = EXPORT) + public void exportWagesExcel(@Valid DistributorWagesExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = wagesService.getWagesList(exportReqVO); + // 导出 Excel + List datas = DistributorWagesConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "分销商佣金.xls", "数据", DistributorWagesExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesBaseVO.java new file mode 100644 index 0000000..b8230e2 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesBaseVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; +import javax.validation.constraints.*; + +/** +* 分销商佣金 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorWagesBaseVO { + + @Schema(description = "用户ID", example = "17956") + private Long userId; + + @Schema(description = "佣金") + private BigDecimal amount; + + @Schema(description = "待入账佣金") + private BigDecimal refuseAmount; + + @Schema(description = "分销商ID", example = "13832") + private Long distributorId; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesCreateReqVO.java new file mode 100644 index 0000000..d929935 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商佣金创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesCreateReqVO extends DistributorWagesBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExcelVO.java new file mode 100644 index 0000000..0d95564 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExcelVO.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商佣金 Excel VO + * + * @author admin + */ +@Data +public class DistributorWagesExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("佣金") + private BigDecimal amount; + + @ExcelProperty("待入账佣金") + private BigDecimal refuseAmount; + + @ExcelProperty("分销商ID") + private Long distributorId; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExportReqVO.java new file mode 100644 index 0000000..2763fbb --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesExportReqVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商佣金 Excel 导出 Request VO,参数和 DistributorWagesPageReqVO 是一致的") +@Data +public class DistributorWagesExportReqVO { + + @Schema(description = "用户ID", example = "17956") + private Long userId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "佣金") + private BigDecimal amount; + + @Schema(description = "待入账佣金") + private BigDecimal refuseAmount; + + @Schema(description = "分销商ID", example = "13832") + private Long distributorId; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesPageReqVO.java new file mode 100644 index 0000000..73f9862 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesPageReqVO.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商佣金分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesPageReqVO extends PageParam { + + @Schema(description = "用户ID", example = "17956") + private Long userId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "佣金") + private BigDecimal amount; + + @Schema(description = "待入账佣金") + private BigDecimal refuseAmount; + + @Schema(description = "分销商ID", example = "13832") + private Long distributorId; + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesRespVO.java new file mode 100644 index 0000000..f1f1da4 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商佣金 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesRespVO extends DistributorWagesBaseVO { + + @Schema(description = "主键", required = true, example = "9411") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesUpdateReqVO.java new file mode 100644 index 0000000..3ae1285 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwages/vo/DistributorWagesUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商佣金更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesUpdateReqVO extends DistributorWagesBaseVO { + + @Schema(description = "主键", required = true, example = "9411") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/DistributorWagesLogController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/DistributorWagesLogController.java new file mode 100644 index 0000000..af30364 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/DistributorWagesLogController.java @@ -0,0 +1,182 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog; + +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodExportReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import co.yixiang.yshop.module.distributor.enums.DistributorWagesLogTypeEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorWithdrawalMethodTypeEnum; +import co.yixiang.yshop.module.distributor.service.distributorwageslog.DistributorWagesLogFacade; +import co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod.DistributorWithdrawalMethodService; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.module.distributor.convert.distributorwageslog.DistributorWagesLogConvert; +import co.yixiang.yshop.module.distributor.service.distributorwageslog.DistributorWagesLogService; + +@Tag(name = "管理后台 - 分销商佣金记录") +@RestController +@RequestMapping("/distributor/wages-log") +@Validated +public class DistributorWagesLogController { + + @Resource + private DistributorWagesLogService wagesLogService; + + @Resource + private DistributorWagesLogFacade distributorWagesLogFacade; + + @Resource + private DistributorWithdrawalMethodService distributorWithdrawalMethodService; + + @PostMapping("/create") + @Operation(summary = "创建分销商佣金记录") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:create')") + public CommonResult createWagesLog(@Valid @RequestBody DistributorWagesLogCreateReqVO createReqVO) { + return success(wagesLogService.createWagesLog(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商佣金记录") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:update')") + public CommonResult updateWagesLog(@Valid @RequestBody DistributorWagesLogUpdateReqVO updateReqVO) { + wagesLogService.updateWagesLog(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商佣金记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:wages-log:delete')") + public CommonResult deleteWagesLog(@RequestParam("id") Long id) { + wagesLogService.deleteWagesLog(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商佣金记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:query')") + public CommonResult getWagesLog(@RequestParam("id") Long id) { + DistributorWagesLogDO wagesLog = wagesLogService.getWagesLog(id); + return success(DistributorWagesLogConvert.INSTANCE.convert(wagesLog)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商佣金记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:query')") + public CommonResult> getWagesLogList(@RequestParam("ids") Collection ids) { + List list = wagesLogService.getWagesLogList(ids); + return success(DistributorWagesLogConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商佣金记录分页") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:query')") + public CommonResult> getWagesLogPage(@Valid DistributorWagesLogPageReqVO pageVO) { + PageResult pageResult = wagesLogService.getWagesLogPage(pageVO); + return success(DistributorWagesLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/verify-page") + @Operation(summary = "获得分销商佣金提现记录分页") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:query')") + public CommonResult> getWagesLogVerifyPage(@Valid DistributorWagesLogPageReqVO pageVO) { + List list = new ArrayList<>(); + list.add(DistributorWagesLogTypeEnum.WITHDRAW_WAIT.getType()); + list.add(DistributorWagesLogTypeEnum.WITHDRAW_COMPLETE.getType()); + list.add(DistributorWagesLogTypeEnum.WITHDRAW_FAIL.getType()); + pageVO.setTypeList(list); + PageResult pageResult = wagesLogService.getWagesLogPage(pageVO); + return success(DistributorWagesLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出分销商佣金记录 Excel") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:export')") + @OperateLog(type = EXPORT) + public void exportWagesLogExcel(@Valid DistributorWagesLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List datas = new ArrayList<>(); + // 获取所有记录 + List typeList = new ArrayList<>(); + typeList.add(DistributorWagesLogTypeEnum.WITHDRAW_WAIT.getType()); + typeList.add(DistributorWagesLogTypeEnum.WITHDRAW_COMPLETE.getType()); + typeList.add(DistributorWagesLogTypeEnum.WITHDRAW_FAIL.getType()); + + exportReqVO.setTypeList(typeList); + exportReqVO.setMethodType(DistributorWithdrawalMethodTypeEnum.AIL_PAY.getType()); + List list = wagesLogService.getWagesLogList(exportReqVO); + for (DistributorWagesLogDO wagesLogDO : list) { + DistributorWithdrawExcelVO excelVO = new DistributorWithdrawExcelVO(); + excelVO.setId(wagesLogDO.getId()); + excelVO.setPaymentMethod(DistributorWithdrawalMethodTypeEnum.AIL_PAY.getPaymentMethod()); + excelVO.setUserName(wagesLogDO.getDistributorName()); + List withdrawalMethodList = distributorWithdrawalMethodService.getWithdrawalMethodList( + new DistributorWithdrawalMethodExportReqVO().setType(wagesLogDO.getMethodType()).setDistributorId(wagesLogDO.getDistributorId()) + ); + DistributorWithdrawalMethodDO distributorWithdrawalMethodDO = withdrawalMethodList.get(0); + excelVO.setAccountNum(distributorWithdrawalMethodDO.getAccountNum()); + if (wagesLogDO.getType().equals(DistributorWagesLogTypeEnum.WITHDRAW_WAIT.getType())) { + excelVO.setStatusStr(DistributorWagesLogTypeEnum.WITHDRAW_WAIT.getName()); + } else if (wagesLogDO.getType().equals(DistributorWagesLogTypeEnum.WITHDRAW_COMPLETE.getType())) { + excelVO.setStatusStr(DistributorWagesLogTypeEnum.WITHDRAW_COMPLETE.getName()); + }if (wagesLogDO.getType().equals(DistributorWagesLogTypeEnum.WITHDRAW_FAIL.getType())) { + excelVO.setStatusStr(DistributorWagesLogTypeEnum.WITHDRAW_FAIL.getName()); + } + datas.add(excelVO); + } + + ExcelUtils.write(response, "分销商提现记录.xls", "数据", DistributorWithdrawExcelVO.class, datas); + } + + @GetMapping("/get-verify") + @Operation(summary = "提现详情") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:wages-log:query')") + public CommonResult getVerify(@RequestParam("id") Long id) { + DistributorWagesLogDO wagesLog = wagesLogService.getWagesLog(id); + DistributorWagesLogRespVO resp = DistributorWagesLogConvert.INSTANCE.convert(wagesLog); + if (wagesLog.getMethodType().equals(DistributorWithdrawalMethodTypeEnum.AIL_PAY.getType())) { + List withdrawalMethodList = distributorWithdrawalMethodService.getWithdrawalMethodList( + new DistributorWithdrawalMethodExportReqVO().setType(wagesLog.getMethodType()).setDistributorId(wagesLog.getDistributorId()) + ); + DistributorWithdrawalMethodDO distributorWithdrawalMethodDO = withdrawalMethodList.get(0); + resp.setPaymentMethod(distributorWithdrawalMethodDO.getPaymentMethod()); + resp.setRealName(distributorWithdrawalMethodDO.getRealName()); + resp.setAccountNum(distributorWithdrawalMethodDO.getAccountNum()); + } + return success(resp); + } + + // 提现审核通过 + @PostMapping("/verify") + @Operation(summary = "审核提现记录 4-通过 5-拒绝") + public CommonResult verify(@Valid @RequestBody DistributorWagesLogVerifyReqVO reqVO) { + distributorWagesLogFacade.verify(reqVO); + return success(Boolean.TRUE); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogBaseVO.java new file mode 100644 index 0000000..b3dd28a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogBaseVO.java @@ -0,0 +1,51 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 分销商佣金记录 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorWagesLogBaseVO { + + @Schema(description = "佣金ID", example = "31395") + private Long wagesId; + + @Schema(description = "用户ID", example = "32187") + private Long userId; + + @Schema(description = "佣金类型", example = "2") + private Integer type; + + @Schema(description = "佣金金额") + private BigDecimal amount; + + @Schema(description = "分销商ID", example = "618") + private Long distributorId; + + @Schema(description = "用户昵称", example = "赵六") + private String userName; + + @Schema(description = "分销商名称", example = "张三") + private String distributorName; + + @Schema(description = "提取类型", example = "2") + private Integer methodType; + + @Schema(description = "分销商订单ID", example = "2") + private Long distributorOrderId; + + @Schema(description = "订单ID", example = "2") + private String orderId; + + @Schema(description = "说明") + private String content; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogCreateReqVO.java new file mode 100644 index 0000000..a791d84 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商佣金记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesLogCreateReqVO extends DistributorWagesLogBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExcelVO.java new file mode 100644 index 0000000..57907c4 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExcelVO.java @@ -0,0 +1,50 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商佣金记录 Excel VO + * + * @author admin + */ +@Data +public class DistributorWagesLogExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("佣金ID") + private Long wagesId; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("佣金类型") + private Integer type; + + @ExcelProperty("佣金金额") + private BigDecimal amount; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("分销商ID") + private Long distributorId; + + @ExcelProperty("记录状态") + private Integer status; + + @ExcelProperty("用户昵称") + private String userName; + + @ExcelProperty("分销商名称") + private String distributorName; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExportReqVO.java new file mode 100644 index 0000000..5a41a52 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogExportReqVO.java @@ -0,0 +1,56 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商佣金记录 Excel 导出 Request VO,参数和 DistributorWagesLogPageReqVO 是一致的") +@Data +public class DistributorWagesLogExportReqVO { + + @Schema(description = "佣金ID", example = "31395") + private Long wagesId; + + @Schema(description = "用户ID", example = "32187") + private Long userId; + + @Schema(description = "佣金类型", example = "2") + private Integer type; + + @Schema(description = "佣金金额") + private BigDecimal amount; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "分销商ID", example = "618") + private Long distributorId; + + @Schema(description = "记录状态", example = "1") + private Integer status; + + @Schema(description = "用户昵称", example = "赵六") + private String userName; + + @Schema(description = "分销商名称", example = "张三") + private String distributorName; + + @Schema(description = "记录状态列表", example = "1") + private List typeList; + + @Schema(description = "订单详情id", example = "1") + private List distributorOrderIds; + + @Schema(description = "订单ID", example = "2") + private String orderId; + + private Integer methodType; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogPageReqVO.java new file mode 100644 index 0000000..2892f8e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogPageReqVO.java @@ -0,0 +1,53 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商佣金记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesLogPageReqVO extends PageParam { + + @Schema(description = "佣金ID", example = "31395") + private Long wagesId; + + @Schema(description = "用户ID", example = "32187") + private Long userId; + + @Schema(description = "佣金类型", example = "2") + private Integer type; + + @Schema(description = "佣金金额") + private BigDecimal amount; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "分销商ID", example = "618") + private Long distributorId; + + @Schema(description = "记录状态", example = "1") + private Integer status; + + @Schema(description = "用户昵称", example = "赵六") + private String userName; + + @Schema(description = "分销商名称", example = "张三") + private String distributorName; + + @Schema(description = "记录状态列表", example = "1") + private List typeList; + + @Schema(description = "订单ID", example = "2") + private String orderId; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogRespVO.java new file mode 100644 index 0000000..0924df7 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogRespVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商佣金记录 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesLogRespVO extends DistributorWagesLogBaseVO { + + @Schema(description = "主键", required = true, example = "6259") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "支付方式") + private String paymentMethod; + + @Schema(description = "账号") + private String accountNum; + + @Schema(description = "真实姓名", example = "张三") + private String realName; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogUpdateReqVO.java new file mode 100644 index 0000000..380bf35 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商佣金记录更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWagesLogUpdateReqVO extends DistributorWagesLogBaseVO { + + @Schema(description = "主键", required = true, example = "6259") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogVerifyReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogVerifyReqVO.java new file mode 100644 index 0000000..6676e3d --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWagesLogVerifyReqVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 分销商佣金记录更新 Request VO") +@Data +@ToString(callSuper = true) +public class DistributorWagesLogVerifyReqVO{ + + @Schema(description = "主键", required = true, example = "6259") + @NotNull(message = "主键不能为空") + private Long id; + + @Schema(description = "记录状态", example = "1") + private Integer type; + + @Schema(description = "说明") + private String content; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWithdrawExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWithdrawExcelVO.java new file mode 100644 index 0000000..e89e720 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwageslog/vo/DistributorWithdrawExcelVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 分销商提现详情 + * + * @author admin + */ +@Data +public class DistributorWithdrawExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("会员信息") + private String userName; + + @ExcelProperty("提现方式") + private String paymentMethod; + + @ExcelProperty("账号") + private String accountNum; + + @ExcelProperty("佣金金额") + private String amountStr; + + @ExcelProperty("记录状态") + private String statusStr; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/DistributorWithdrawalMethodController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/DistributorWithdrawalMethodController.java new file mode 100644 index 0000000..9c773ad --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/DistributorWithdrawalMethodController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import co.yixiang.yshop.module.distributor.convert.distributorwithdrawalmethod.DistributorWithdrawalMethodConvert; +import co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod.DistributorWithdrawalMethodService; + +@Tag(name = "管理后台 - 分销商提现方式") +@RestController +@RequestMapping("/distributor/withdrawal-method") +@Validated +public class DistributorWithdrawalMethodController { + + @Resource + private DistributorWithdrawalMethodService withdrawalMethodService; + + @PostMapping("/create") + @Operation(summary = "创建分销商提现方式") + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:create')") + public CommonResult createWithdrawalMethod(@Valid @RequestBody DistributorWithdrawalMethodCreateReqVO createReqVO) { + return success(withdrawalMethodService.createWithdrawalMethod(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新分销商提现方式") + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:update')") + public CommonResult updateWithdrawalMethod(@Valid @RequestBody DistributorWithdrawalMethodUpdateReqVO updateReqVO) { + withdrawalMethodService.updateWithdrawalMethod(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除分销商提现方式") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:delete')") + public CommonResult deleteWithdrawalMethod(@RequestParam("id") Long id) { + withdrawalMethodService.deleteWithdrawalMethod(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得分销商提现方式") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:query')") + public CommonResult getWithdrawalMethod(@RequestParam("id") Long id) { + DistributorWithdrawalMethodDO withdrawalMethod = withdrawalMethodService.getWithdrawalMethod(id); + return success(DistributorWithdrawalMethodConvert.INSTANCE.convert(withdrawalMethod)); + } + + @GetMapping("/list") + @Operation(summary = "获得分销商提现方式列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:query')") + public CommonResult> getWithdrawalMethodList(@RequestParam("ids") Collection ids) { + List list = withdrawalMethodService.getWithdrawalMethodList(ids); + return success(DistributorWithdrawalMethodConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得分销商提现方式分页") + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:query')") + public CommonResult> getWithdrawalMethodPage(@Valid DistributorWithdrawalMethodPageReqVO pageVO) { + PageResult pageResult = withdrawalMethodService.getWithdrawalMethodPage(pageVO); + return success(DistributorWithdrawalMethodConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出分销商提现方式 Excel") + @PreAuthorize("@ss.hasPermission('distributor:withdrawal-method:export')") + @OperateLog(type = EXPORT) + public void exportWithdrawalMethodExcel(@Valid DistributorWithdrawalMethodExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = withdrawalMethodService.getWithdrawalMethodList(exportReqVO); + // 导出 Excel + List datas = DistributorWithdrawalMethodConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "分销商提现方式.xls", "数据", DistributorWithdrawalMethodExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodBaseVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodBaseVO.java new file mode 100644 index 0000000..6721c37 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodBaseVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 分销商提现方式 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DistributorWithdrawalMethodBaseVO { + + @Schema(description = "用户ID", example = "14122") + private Long userId; + + @Schema(description = "分销商ID", example = "26097") + private Long distributorId; + + @Schema(description = "支付方式") + private String paymentMethod; + + @Schema(description = "账号") + private String accountNum; + + @Schema(description = "真实姓名", example = "张三") + private String realName; + + @Schema(description = "类型") + private Integer type; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodCreateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodCreateReqVO.java new file mode 100644 index 0000000..7499b9a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商提现方式创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWithdrawalMethodCreateReqVO extends DistributorWithdrawalMethodBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExcelVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExcelVO.java new file mode 100644 index 0000000..acd3674 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExcelVO.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 分销商提现方式 Excel VO + * + * @author admin + */ +@Data +public class DistributorWithdrawalMethodExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("分销商ID") + private Long distributorId; + + @ExcelProperty("支付方式") + private String paymentMethod; + + @ExcelProperty("账号") + private String acountNum; + + @ExcelProperty("真实姓名") + private String realName; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExportReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExportReqVO.java new file mode 100644 index 0000000..6ea633e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodExportReqVO.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商提现方式 Excel 导出 Request VO,参数和 DistributorWithdrawalMethodPageReqVO 是一致的") +@Data +public class DistributorWithdrawalMethodExportReqVO { + + @Schema(description = "用户ID", example = "14122") + private Long userId; + + @Schema(description = "分销商ID", example = "26097") + private Long distributorId; + + @Schema(description = "支付方式") + private String paymentMethod; + + @Schema(description = "账号") + private String acountNum; + + @Schema(description = "真实姓名", example = "张三") + private String realName; + + private Integer type; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodPageReqVO.java new file mode 100644 index 0000000..2514241 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodPageReqVO.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 分销商提现方式分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWithdrawalMethodPageReqVO extends PageParam { + + @Schema(description = "用户ID", example = "14122") + private Long userId; + + @Schema(description = "分销商ID", example = "26097") + private Long distributorId; + + @Schema(description = "支付方式") + private String paymentMethod; + + @Schema(description = "账号") + private String acountNum; + + @Schema(description = "真实姓名", example = "张三") + private String realName; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + private Integer type; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodRespVO.java new file mode 100644 index 0000000..cb483e2 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 分销商提现方式 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWithdrawalMethodRespVO extends DistributorWithdrawalMethodBaseVO { + + @Schema(description = "主键", required = true, example = "18118") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodUpdateReqVO.java new file mode 100644 index 0000000..a9d625e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/admin/distributorwithdrawalmethod/vo/DistributorWithdrawalMethodUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 分销商提现方式更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DistributorWithdrawalMethodUpdateReqVO extends DistributorWithdrawalMethodBaseVO { + + @Schema(description = "主键", required = true, example = "18118") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/AppDistributorController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/AppDistributorController.java new file mode 100644 index 0000000..24ff99b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/AppDistributorController.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorDetailsRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorUpdateReqVO; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorFacade; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@Tag(name = "APP - 分销商模块") +@RequestMapping("/app/distributor") +public class AppDistributorController { + + @Resource + private DistributorFacade distributorFacade; + + // 获取详情 + @PreAuthenticated + @GetMapping("/details") + @Operation(summary = "分销商详情") + public CommonResult getDetails() { + return success(distributorFacade.getAppDetails()); + } + + // 修改我的资料 + @PreAuthenticated + @PostMapping("/update") + @Operation(summary = "修改我的资料") + public CommonResult appUpdate(@Valid @RequestBody AppDistributorUpdateReqVO reqVO) { + distributorFacade.appUpdate(reqVO); + return success(Boolean.TRUE); + } + + // 申请成为经销商 + @PreAuthenticated + @PostMapping("/apply") + @Operation(summary = "申请成为经销商") + public CommonResult apply(@Valid @RequestBody AppDistributorApplyReqVO reqVO) { + distributorFacade.apply(reqVO); + return success(Boolean.TRUE); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorApplyReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorApplyReqVO.java new file mode 100644 index 0000000..4723526 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorApplyReqVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "申请分销商ReqVO") +@Data +@ToString(callSuper = true) +public class AppDistributorApplyReqVO { + + @Schema(description = "真实姓名", example = "王五") + private String realName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "申请原因", example = "不对") + private String reason; + + @Schema(description = "上级ID") + private Long superiorIdP1; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorDetailsRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorDetailsRespVO.java new file mode 100644 index 0000000..26c93d9 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorDetailsRespVO.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "分销商详情RespVO") +@Data +@ToString(callSuper = true) +public class AppDistributorDetailsRespVO { + + @Schema(description = "代理商ID") + private Long id; + + @Schema(description = "状态 -1-清退 0-待审核 1-已通过 2-已拒绝 null-未申请") + private Integer status; + + /** + * 地址 + */ + @Schema(description = "地址") + private String address; + /** + * 申请原因 + */ + @Schema(description = "申请原因") + private String reason; + + @Schema(description = "拒绝原因") + private String refuse; + + @Schema(description = "真实姓名") + private String realName; + + @Schema(description = "分销等级") + private String levelName; + + @Schema(description = "推荐人") + private String superiorName; + + @Schema(description = "总收益") + private BigDecimal addUpWages = BigDecimal.ZERO; + + @Schema(description = "待入账佣金") + private BigDecimal refuseAmount = BigDecimal.ZERO; + + @Schema(description = "已入账佣金") + private BigDecimal amount = BigDecimal.ZERO; + + @Schema(description = "手机号") + private String mobile; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorOrderPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorOrderPageReqVO.java new file mode 100644 index 0000000..a79c09d --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorOrderPageReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "我的分销订单 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppDistributorOrderPageReqVO extends PageParam { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorQrcodeRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorQrcodeRespVO.java new file mode 100644 index 0000000..fcce6f9 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorQrcodeRespVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "邀请详情") +@Data +@ToString(callSuper = true) +public class AppDistributorQrcodeRespVO { + + @Schema(description = "分享链接") + private String url; + + @Schema(description = "小程序码") + private String miniQRcode; + + @Schema(description = "二维码") + private String QRcode; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorReqVO.java new file mode 100644 index 0000000..640a15d --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorReqVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "分销商 RespVO") +@Data +@ToString(callSuper = true) +public class AppDistributorReqVO { + + @Schema(description = "加入时间") + private LocalDateTime createTime; + + @Schema(description = "真实姓名") + private String realName; + + @Schema(description = "商品金额") + private String productAmount; + + @Schema(description = "订单数") + private String orderCount; + + @Schema(description = "佣金收益") + private BigDecimal addUpWages; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUpdateReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUpdateReqVO.java new file mode 100644 index 0000000..dd41c63 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUpdateReqVO.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "分销商信息修改RespVO") +@Data +@ToString(callSuper = true) +public class AppDistributorUpdateReqVO { + + @Schema(description = "真实姓名", example = "王五") + private String realName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "申请原因", example = "不对") + private String reason; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUserRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUserRespVO.java new file mode 100644 index 0000000..6ad074b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributor/vo/AppDistributorUserRespVO.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributor.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "我的团队 Resp VO") +@Data +@ToString(callSuper = true) +public class AppDistributorUserRespVO { + + // 头像 + @Schema(description = "用户头像", required = true) + private String avatar; + + // 昵称 + @Schema(description = "用户昵称", required = true) + private String nickname; + + // 加入时间 + @Schema(description = "加入时间", required = true) + private LocalDateTime createTime; + + // 商品数 + @Schema(description = "商品数", required = true) + private Integer productCount; + + // 订单数 + @Schema(description = "订单数", required = true) + private Integer orderCount; + + // 佣金数 + @Schema(description = "佣金数") + private BigDecimal wages; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/AppDistributorOrderController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/AppDistributorOrderController.java new file mode 100644 index 0000000..6774096 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/AppDistributorOrderController.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributororder; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorOrderPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributororder.vo.AppDistributorOrderWagesRespVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.service.distributororder.DistributorOrderFacade; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@Tag(name = "APP - 分销商订单模块") +@RequestMapping("/app/distributor/order") +public class AppDistributorOrderController { + + @Resource + private DistributorOrderFacade distributorOrderFacade; + + // 分销订单收益 + @PreAuthenticated + @GetMapping("/wages") + @Operation(summary = "分销收益") + public CommonResult getAppWages(LocalDateTime[] createTime) { + return success(distributorOrderFacade.getAppWages(createTime)); + } + + // 分销订单 + @PreAuthenticated + @GetMapping("/page") + @Operation(summary = "分销订单分页") + public CommonResult> getAppPage(AppDistributorOrderPageReqVO reqVO) { + return success(distributorOrderFacade.getAppPage(reqVO)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/vo/AppDistributorOrderWagesRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/vo/AppDistributorOrderWagesRespVO.java new file mode 100644 index 0000000..72cce80 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributororder/vo/AppDistributorOrderWagesRespVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributororder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "订单 Resp VO") +@Data +@ToString(callSuper = true) +public class AppDistributorOrderWagesRespVO { + + @Schema(description = "订单数量") + private Integer orderCount = 0; + + @Schema(description = "待入账佣金") + private BigDecimal refuseAmount = BigDecimal.ZERO; + + @Schema(description = "已入账佣金") + private BigDecimal amount = BigDecimal.ZERO; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/AppDistributorProductController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/AppDistributorProductController.java new file mode 100644 index 0000000..b004316 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/AppDistributorProductController.java @@ -0,0 +1,45 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorproduct; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorOrderPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorproduct.vo.AppDistributorProductRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserCountRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserPageReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorFacade; +import co.yixiang.yshop.module.distributor.service.distributororder.DistributorOrderService; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@Tag(name = "APP - 分销商商品模块") +@RequestMapping("/app/distributor/product") +public class AppDistributorProductController { + + @Resource + private DistributorFacade distributorFacade; + + // 获取可分销商品列表 + @PreAuthenticated + @GetMapping("/page") + @Operation(summary = "分销订单分页") + public CommonResult> getProductPage(ProductPageReqVO reqVO) { + return success(distributorFacade.getProductPage(reqVO)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/vo/AppDistributorProductRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/vo/AppDistributorProductRespVO.java new file mode 100644 index 0000000..0cd9ae6 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorproduct/vo/AppDistributorProductRespVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorproduct.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "商品 Resp VO") +@Data +@ToString(callSuper = true) +public class AppDistributorProductRespVO { + + @Schema(description = "商品ID") + private Long id; + + @Schema(description = "商品图片") + private String image; + + @Schema(description = "商品名") + private String storeName; + + @Schema(description = "商品金额") + private BigDecimal price; + + @Schema(description = "预计佣金") + private BigDecimal expectPrice; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/AppDistributorUserController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/AppDistributorUserController.java new file mode 100644 index 0000000..8877d58 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/AppDistributorUserController.java @@ -0,0 +1,60 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributoruser; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserCountRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserPageReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.service.distributoruser.DistributorUserFacade; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@Tag(name = "APP - 分销商用户模块") +@RequestMapping("/app/distributor/user") +public class AppDistributorUserController { + + @Resource + private DistributorUserFacade distributorUserFacade; + + /** + * 获取今日用户数量 + * @param type 团队等级 + * @return / + */ + @PreAuthenticated + @GetMapping("/today-count") + @Operation(summary = "今日加入我的用户") + @Parameter(name = "type", description = "团队等级 一级 二级") + public CommonResult getTodayCount(@RequestParam("type") Integer type) { + return success(distributorUserFacade.getTodayCount(type)); + } + + @PreAuthenticated + @GetMapping("/count") + @Operation(summary = "获取一级二级用户总数") + public CommonResult getCount() { + return success(distributorUserFacade.getCount()); + } + + // 获取我的用户详情 + @PreAuthenticated + @GetMapping("/page") + @Operation(summary = "我的团队分页(我的用户)") + public CommonResult> getAppPage(AppDistributorUserPageReqVO reqVO) { + return success(distributorUserFacade.getAppPage(reqVO)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/package-info.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/package-info.java new file mode 100644 index 0000000..ef574a9 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的 web 配置 + */ +package co.yixiang.yshop.module.distributor.controller.app.distributoruser; diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserCountRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserCountRespVO.java new file mode 100644 index 0000000..fd68b1b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserCountRespVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "一二级团队数量 Resp VO") +@Data +@ToString(callSuper = true) +public class AppDistributorUserCountRespVO { + + @Schema(description = "一级数量", required = true) + private Integer p1Count; + + @Schema(description = "二级数量", required = true) + private Integer p2Count; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserPageReqVO.java new file mode 100644 index 0000000..108017e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributoruser/vo/AppDistributorUserPageReqVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.RequestParam; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "我的团队 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppDistributorUserPageReqVO extends PageParam { + + @Schema(description = "我的团队 1-一级 2-二级", required = true) + private Integer type; + +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/AppDistributorWagesController.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/AppDistributorWagesController.java new file mode 100644 index 0000000..651e48b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/AppDistributorWagesController.java @@ -0,0 +1,79 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorwages; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodCreateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodRespVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesPageRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesWithdrawReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.module.distributor.service.distributorwages.DistributorWagesFacade; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.time.LocalDateTime; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@Tag(name = "APP - 分销商佣金模块") +@RequestMapping("/app/distributor/wages") +public class AppDistributorWagesController { + + @Resource + private DistributorWagesFacade distributorWagesFacade; + + // 我的佣金 + @PreAuthenticated + @GetMapping("/get") + @Operation(summary = "我的佣金") + public CommonResult getWages(LocalDateTime[] createTime) { + return success(distributorWagesFacade.getWages(createTime)); + } + + // 我的佣金分页 + @PreAuthenticated + @GetMapping("/page") + @Operation(summary = "我的佣金分页") + public CommonResult> getWagesPage(AppDistributorWagesPageReqVO reqVO) { + return success(distributorWagesFacade.getWagesPage(reqVO)); + } + + + @PreAuthenticated + @PostMapping("/withdraw") + @Operation(summary = "提现") + public CommonResult withdraw(@Valid @RequestBody AppDistributorWagesWithdrawReqVO reqVO) { + distributorWagesFacade.withdraw(reqVO); + return success(Boolean.TRUE); + } + + @PreAuthenticated + @PostMapping("/update") + @Operation(summary = "更新分销商提现方式") + public CommonResult updateWithdrawalMethod(@Valid @RequestBody DistributorWithdrawalMethodUpdateReqVO updateReqVO) { + distributorWagesFacade.updateWithdrawalMethod(updateReqVO); + return success(Boolean.TRUE); + } + + // 我的提现列表 + @PreAuthenticated + @GetMapping("/withdrawal-method-list") + @Operation(summary = "我的提现列表") + public CommonResult> getWithdrawalMethodList() { + return success(distributorWagesFacade.getWithdrawalMethodList()); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageReqVO.java new file mode 100644 index 0000000..ddd991b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "我的分销订单 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppDistributorWagesPageReqVO extends PageParam { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "类型 0-收入 1-支出") + private Integer type; + +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageRespVO.java new file mode 100644 index 0000000..8a96284 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesPageRespVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "APP佣金 Resp VO") +@Data +@ToString(callSuper = true) +public class AppDistributorWagesPageRespVO { + + @Schema(description = "总收入") + private BigDecimal income = BigDecimal.ZERO; + + @Schema(description = "总支出") + private BigDecimal expenses = BigDecimal.ZERO; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesRespVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesRespVO.java new file mode 100644 index 0000000..041327a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesRespVO.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "订单 Resp VO") +@Data +@ToString(callSuper = true) +public class AppDistributorWagesRespVO { + + @Schema(description = "订单分页") + PageResult pageResult; + + @Schema(description = "待入账佣金") + private BigDecimal refuseAmount = BigDecimal.ZERO; + + @Schema(description = "已入账佣金") + private BigDecimal amount = BigDecimal.ZERO; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesWithdrawReqVO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesWithdrawReqVO.java new file mode 100644 index 0000000..deb9454 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/distributorwages/vo/AppDistributorWagesWithdrawReqVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "提现 Request VO") +@Data +@ToString(callSuper = true) +public class AppDistributorWagesWithdrawReqVO { + + @Schema(description = "提现金额") + private BigDecimal amount; + + @Schema(description = "提现方式ID") + private Long id; + +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/package-info.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/package-info.java new file mode 100644 index 0000000..68feb22 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的 web 配置 + */ +package co.yixiang.yshop.module.distributor.controller.app; diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributor/DistributorConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributor/DistributorConvert.java new file mode 100644 index 0000000..e60747a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributor/DistributorConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributor; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; + +/** + * 分销商 Convert + * + * @author admin + */ +@Mapper +public interface DistributorConvert { + + DistributorConvert INSTANCE = Mappers.getMapper(DistributorConvert.class); + + DistributorDO convert(DistributorCreateReqVO bean); + + DistributorDO convert(DistributorUpdateReqVO bean); + + DistributorRespVO convert(DistributorDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributordynamics/DistributorDynamicsConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributordynamics/DistributorDynamicsConvert.java new file mode 100644 index 0000000..1143511 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributordynamics/DistributorDynamicsConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributordynamics; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics.DistributorDynamicsDO; + +/** + * 分销商动态 Convert + * + * @author admin + */ +@Mapper +public interface DistributorDynamicsConvert { + + DistributorDynamicsConvert INSTANCE = Mappers.getMapper(DistributorDynamicsConvert.class); + + DistributorDynamicsDO convert(DistributorDynamicsCreateReqVO bean); + + DistributorDynamicsDO convert(DistributorDynamicsUpdateReqVO bean); + + DistributorDynamicsRespVO convert(DistributorDynamicsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorlevel/DistributorLevelConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorlevel/DistributorLevelConvert.java new file mode 100644 index 0000000..0ce8289 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorlevel/DistributorLevelConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributorlevel; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; + +/** + * 分销商等级 Convert + * + * @author admin + */ +@Mapper +public interface DistributorLevelConvert { + + DistributorLevelConvert INSTANCE = Mappers.getMapper(DistributorLevelConvert.class); + + DistributorLevelDO convert(DistributorLevelCreateReqVO bean); + + DistributorLevelDO convert(DistributorLevelUpdateReqVO bean); + + DistributorLevelRespVO convert(DistributorLevelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributororder/DistributorOrderConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributororder/DistributorOrderConvert.java new file mode 100644 index 0000000..e4df166 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributororder/DistributorOrderConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributororder; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; + +/** + * 分销商订单 Convert + * + * @author admin + */ +@Mapper +public interface DistributorOrderConvert { + + DistributorOrderConvert INSTANCE = Mappers.getMapper(DistributorOrderConvert.class); + + DistributorOrderDO convert(DistributorOrderCreateReqVO bean); + + DistributorOrderDO convert(DistributorOrderUpdateReqVO bean); + + DistributorOrderRespVO convert(DistributorOrderDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributoruser/DistributorUserConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributoruser/DistributorUserConvert.java new file mode 100644 index 0000000..c78aabe --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributoruser/DistributorUserConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributoruser; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; + +/** + * 分销商所属用户 Convert + * + * @author admin + */ +@Mapper +public interface DistributorUserConvert { + + DistributorUserConvert INSTANCE = Mappers.getMapper(DistributorUserConvert.class); + + DistributorUserDO convert(DistributorUserCreateReqVO bean); + + DistributorUserDO convert(DistributorUserUpdateReqVO bean); + + DistributorUserRespVO convert(DistributorUserDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwages/DistributorWagesConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwages/DistributorWagesConvert.java new file mode 100644 index 0000000..52039a0 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwages/DistributorWagesConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributorwages; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; + +/** + * 分销商佣金 Convert + * + * @author admin + */ +@Mapper +public interface DistributorWagesConvert { + + DistributorWagesConvert INSTANCE = Mappers.getMapper(DistributorWagesConvert.class); + + DistributorWagesDO convert(DistributorWagesCreateReqVO bean); + + DistributorWagesDO convert(DistributorWagesUpdateReqVO bean); + + DistributorWagesRespVO convert(DistributorWagesDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwageslog/DistributorWagesLogConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwageslog/DistributorWagesLogConvert.java new file mode 100644 index 0000000..7296c5e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwageslog/DistributorWagesLogConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributorwageslog; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; + +/** + * 分销商佣金记录 Convert + * + * @author admin + */ +@Mapper +public interface DistributorWagesLogConvert { + + DistributorWagesLogConvert INSTANCE = Mappers.getMapper(DistributorWagesLogConvert.class); + + DistributorWagesLogDO convert(DistributorWagesLogCreateReqVO bean); + + DistributorWagesLogDO convert(DistributorWagesLogUpdateReqVO bean); + + DistributorWagesLogRespVO convert(DistributorWagesLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwithdrawalmethod/DistributorWithdrawalMethodConvert.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwithdrawalmethod/DistributorWithdrawalMethodConvert.java new file mode 100644 index 0000000..0beae3e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/convert/distributorwithdrawalmethod/DistributorWithdrawalMethodConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.distributor.convert.distributorwithdrawalmethod; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; + +/** + * 分销商提现方式 Convert + * + * @author admin + */ +@Mapper +public interface DistributorWithdrawalMethodConvert { + + DistributorWithdrawalMethodConvert INSTANCE = Mappers.getMapper(DistributorWithdrawalMethodConvert.class); + + DistributorWithdrawalMethodDO convert(DistributorWithdrawalMethodCreateReqVO bean); + + DistributorWithdrawalMethodDO convert(DistributorWithdrawalMethodUpdateReqVO bean); + + DistributorWithdrawalMethodRespVO convert(DistributorWithdrawalMethodDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributor/DistributorDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributor/DistributorDO.java new file mode 100644 index 0000000..71819b7 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributor/DistributorDO.java @@ -0,0 +1,95 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributor; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import org.springframework.data.annotation.Transient; + +/** + * 分销商 DO + * + * @author admin + */ +@TableName("yshop_distributor") +@KeySequence("yshop_distributor_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 真实姓名 + */ + private String realName; + /** + * 等级ID + */ + private Long levelId; + /** + * 地址 + */ + private String address; + /** + * 申请原因 + */ + private String reason; + /** + * 拒绝原因 + */ + private String refuse; + /** + * 累计金额 + */ + private BigDecimal addUpAmount; + /** + * 累计佣金 + */ + private BigDecimal addUpWages; + /** + * 累计下级经销商 + */ + private Integer addUpDistributor; + /** + * 所属一级ID + */ + private Long superiorIdP1; + /** + * 上级名称 + */ + private String superiorNameP1; + /** + * 所属二级ID + */ + private Long superiorIdP2; + /** + * 上级名称 + */ + private String superiorNameP2; + /** + * 状态-1-清退 0-待审核 1-已通过 2-已拒绝 + */ + private Integer status; + + @TableField(exist = false) + private String levelName; + + @TableField(exist = false) + private Integer userCount; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributordynamics/DistributorDynamicsDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributordynamics/DistributorDynamicsDO.java new file mode 100644 index 0000000..cb115a0 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributordynamics/DistributorDynamicsDO.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商动态 DO + * + * @author admin + */ +@TableName("yshop_distributor_dynamics") +@KeySequence("yshop_distributor_dynamics_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorDynamicsDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 动态类型 + */ + private Integer type; + /** + * 分销商ID + */ + private Long distributorId; + /** + * 分销商名称 + */ + private String distributorName; + /** + * 内容 + */ + private String content; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorlevel/DistributorLevelDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorlevel/DistributorLevelDO.java new file mode 100644 index 0000000..1ebdfb4 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorlevel/DistributorLevelDO.java @@ -0,0 +1,65 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商等级 DO + * + * @author admin + */ +@TableName("yshop_distributor_level") +@KeySequence("yshop_distributor_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorLevelDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 等级 1-10 + */ + private Integer level; + /** + * 等级名称 + */ + private String name; + /** + * 一级佣金比例 + */ + private Integer firstWages; + /** + * 二级佣金比例 + */ + private Integer secondWages; + /** + * 升级类型 0-满足任意 1-满足全部 + */ + private Integer upType; + /** + * 人数 值为-1是未选中 + */ + private Integer userCount; + /** + * 金额 值为-1是未选中 + */ + private BigDecimal amount; + /** + * 佣金 值为-1是未选中 + */ + private BigDecimal wages; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributororder/DistributorOrderDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributororder/DistributorOrderDO.java new file mode 100644 index 0000000..7694a01 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributororder/DistributorOrderDO.java @@ -0,0 +1,137 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributororder; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商订单 DO + * + * @author admin + */ +@TableName("yshop_distributor_order") +@KeySequence("yshop_distributor_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorOrderDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 结算时间 + */ + private LocalDateTime settlementTime; + /** + * 订单ID + */ + private Long oid; + /** + * 订单号 + */ + private String orderId; + /** + * 佣金状态 + */ + private Integer status; + /** + * 分销规则 0-默认 1-自定义 + */ + private Integer distributionRule; + /** + * 分销自购 0-关闭 1-开启 + */ + private Integer distributionPurchase; + /** + * 商品结算方式 0-实际支付价格 1-商品价格 + */ + private Integer distributionProductSettlement; + /** + * 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + */ + private Integer distributionWagesSettlement; + /** + * 分销规则 1-一级 2-二级 + */ + private Integer distributionLevel; + /** + * 下单用户 + */ + private Long userId; + /** + * 用户昵称 + */ + private String userName; + /** + * 商品ID + */ + private Long productId; + /** + * 商品规格ID + */ + private Long productAttrValueId; + /** + * 商品名称 + */ + private String productName; + /** + * 商品金额 + */ + private BigDecimal productPrice; + /** + * 商品原价 + */ + private BigDecimal productOriginalPrice; + /** + * 订单详情id + */ + private Long detailId; + /** + * 所属一级ID + */ + private Long superiorIdP1; + /** + * 上级名称 + */ + private String superiorNameP1; + /** + * 所属二级ID + */ + private Long superiorIdP2; + /** + * 上级名称 + */ + private String superiorNameP2; + /** + * 一级佣金比例 + */ + private Integer firstWages; + /** + * 二级佣金比例 + */ + private Integer secondWages; + /** + * 一级佣金 + */ + private BigDecimal firstAmount; + /** + * 二级佣金 + */ + private BigDecimal secondAmount; + + @TableField(exist = false) + private BigDecimal wages; +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributoruser/DistributorUserDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributoruser/DistributorUserDO.java new file mode 100644 index 0000000..13fda89 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributoruser/DistributorUserDO.java @@ -0,0 +1,87 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商所属用户 DO + * + * @author admin + */ +@TableName("yshop_distributor_user") +@KeySequence("yshop_distributor_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorUserDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 所属一级ID + */ + private Long superiorIdP1; + /** + * 上级名称 + */ + private String superiorNameP1; + /** + * 所属二级ID + */ + private Long superiorIdP2; + /** + * 上级名称 + */ + private String superiorNameP2; + /** + * 过期时间 + */ + private LocalDateTime expireTime; + /** + * 用户昵称 + */ + private String nickname; + /** + * 用户头像 + */ + private String avatar; + /** + * 商品数 + */ + private Integer productCount; + + /** + * 商品金额 + */ + @TableField(exist = false) + private BigDecimal productAmount; + /** + * 订单数 + */ + private Integer orderCount; + /** + * 佣金数 + */ + private BigDecimal wages; + /** + * 是否分销商 0-否 1-是 + */ + private Integer isDistributor; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwages/DistributorWagesDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwages/DistributorWagesDO.java new file mode 100644 index 0000000..9b15fac --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwages/DistributorWagesDO.java @@ -0,0 +1,49 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商佣金 DO + * + * @author admin + */ +@TableName("yshop_distributor_wages") +@KeySequence("yshop_distributor_wages_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorWagesDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 佣金 + */ + private BigDecimal amount; + /** + * 待入账佣金 + */ + private BigDecimal refuseAmount; + /** + * 分销商ID + */ + private Long distributorId; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwageslog/DistributorWagesLogDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwageslog/DistributorWagesLogDO.java new file mode 100644 index 0000000..b867201 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwageslog/DistributorWagesLogDO.java @@ -0,0 +1,77 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商佣金记录 DO + * + * @author admin + */ +@TableName("yshop_distributor_wages_log") +@KeySequence("yshop_distributor_wages_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorWagesLogDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 佣金ID + */ + private Long wagesId; + /** + * 用户ID + */ + private Long userId; + /** + * 佣金类型 + */ + private Integer type; + /** + * 佣金金额 + */ + private BigDecimal amount; + /** + * 分销商ID + */ + private Long distributorId; + /** + * 记录状态 + */ + private Integer status; + /** + * 用户昵称 + */ + private String userName; + /** + * 分销商名称 + */ + private String distributorName; + + // 提取类型 + private Integer methodType; + + // 分销商订单ID + private Long distributorOrderId; + + // 订单ID + private String orderId; + + // 说明 + private String content; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwithdrawalmethod/DistributorWithdrawalMethodDO.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwithdrawalmethod/DistributorWithdrawalMethodDO.java new file mode 100644 index 0000000..59c54a6 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/dataobject/distributorwithdrawalmethod/DistributorWithdrawalMethodDO.java @@ -0,0 +1,55 @@ +package co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 分销商提现方式 DO + * + * @author admin + */ +@TableName("yshop_distributor_withdrawal_method") +@KeySequence("yshop_distributor_withdrawal_method_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistributorWithdrawalMethodDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 分销商ID + */ + private Long distributorId; + /** + * 支付方式 + */ + private String paymentMethod; + /** + * 账号 + */ + private String accountNum; + /** + * 真实姓名 + */ + private String realName; + /** + * 类型 + */ + private Integer type; + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributor/DistributorMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributor/DistributorMapper.java new file mode 100644 index 0000000..f6a8f85 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributor/DistributorMapper.java @@ -0,0 +1,74 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributor; + +import java.math.BigDecimal; +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 分销商 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorMapper extends BaseMapperX { + + default PageResult selectPage(DistributorPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorDO::getUserId, reqVO.getUserId()) + .likeIfPresent(DistributorDO::getRealName, reqVO.getRealName()) + .eqIfPresent(DistributorDO::getLevelId, reqVO.getLevelId()) + .eqIfPresent(DistributorDO::getAddress, reqVO.getAddress()) + .eqIfPresent(DistributorDO::getReason, reqVO.getReason()) + .eqIfPresent(DistributorDO::getRefuse, reqVO.getRefuse()) + .eqIfPresent(DistributorDO::getAddUpAmount, reqVO.getAddUpAmount()) + .eqIfPresent(DistributorDO::getAddUpWages, reqVO.getAddUpWages()) + .eqIfPresent(DistributorDO::getAddUpDistributor, reqVO.getAddUpDistributor()) + .betweenIfPresent(DistributorDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()) + .eqIfPresent(DistributorDO::getSuperiorNameP1, reqVO.getSuperiorNameP1()) + .eqIfPresent(DistributorDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()) + .eqIfPresent(DistributorDO::getSuperiorNameP2, reqVO.getSuperiorNameP2()) + .eqIfPresent(DistributorDO::getStatus, reqVO.getStatus()) + .orderByDesc(DistributorDO::getId)); + } + + default List selectList(DistributorExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorDO::getUserId, reqVO.getUserId()) + .likeIfPresent(DistributorDO::getRealName, reqVO.getRealName()) + .eqIfPresent(DistributorDO::getLevelId, reqVO.getLevelId()) + .eqIfPresent(DistributorDO::getAddress, reqVO.getAddress()) + .eqIfPresent(DistributorDO::getReason, reqVO.getReason()) + .eqIfPresent(DistributorDO::getRefuse, reqVO.getRefuse()) + .eqIfPresent(DistributorDO::getAddUpAmount, reqVO.getAddUpAmount()) + .eqIfPresent(DistributorDO::getAddUpWages, reqVO.getAddUpWages()) + .eqIfPresent(DistributorDO::getAddUpDistributor, reqVO.getAddUpDistributor()) + .betweenIfPresent(DistributorDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()) + .eqIfPresent(DistributorDO::getSuperiorNameP1, reqVO.getSuperiorNameP1()) + .eqIfPresent(DistributorDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()) + .eqIfPresent(DistributorDO::getSuperiorNameP2, reqVO.getSuperiorNameP2()) + .eqIfPresent(DistributorDO::getStatus, reqVO.getStatus()) + .orderByDesc(DistributorDO::getId)); + } + + @Update("update yshop_distributor set superior_id_p1 = null where superior_id_p1 = #{id}") + void updateP1(@Param("id") Long id); + + @Update("update yshop_distributor set superior_id_p2 = null where superior_id_p2 = #{id}") + void updateP2(@Param("id") Long id); + + @Update("update yshop_distributor set add_up_distributor = add_up_distributor + 1 where id = #{id}") + void addUpDistributor(@Param("id") Long id); + + @Update("update yshop_distributor set add_up_wages = add_up_wages + #{addUpWages},add_up_amount = add_up_amount + #{productPrice} where id = #{id}") + void addAmount(@Param("id") Long id, @Param("productPrice") BigDecimal productPrice, @Param("addUpWages") BigDecimal addUpWages); +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributordynamics/DistributorDynamicsMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributordynamics/DistributorDynamicsMapper.java new file mode 100644 index 0000000..e7047fb --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributordynamics/DistributorDynamicsMapper.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributordynamics; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics.DistributorDynamicsDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.*; + +/** + * 分销商动态 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorDynamicsMapper extends BaseMapperX { + + default PageResult selectPage(DistributorDynamicsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorDynamicsDO::getType, reqVO.getType()) + .eqIfPresent(DistributorDynamicsDO::getDistributorId, reqVO.getDistributorId()) + .likeIfPresent(DistributorDynamicsDO::getDistributorName, reqVO.getDistributorName()) + .eqIfPresent(DistributorDynamicsDO::getContent, reqVO.getContent()) + .betweenIfPresent(DistributorDynamicsDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DistributorDynamicsDO::getId)); + } + + default List selectList(DistributorDynamicsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorDynamicsDO::getType, reqVO.getType()) + .eqIfPresent(DistributorDynamicsDO::getDistributorId, reqVO.getDistributorId()) + .likeIfPresent(DistributorDynamicsDO::getDistributorName, reqVO.getDistributorName()) + .eqIfPresent(DistributorDynamicsDO::getContent, reqVO.getContent()) + .betweenIfPresent(DistributorDynamicsDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DistributorDynamicsDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorlevel/DistributorLevelMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorlevel/DistributorLevelMapper.java new file mode 100644 index 0000000..11fbe2d --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorlevel/DistributorLevelMapper.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributorlevel; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.*; + +/** + * 分销商等级 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorLevelMapper extends BaseMapperX { + + default PageResult selectPage(DistributorLevelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorLevelDO::getLevel, reqVO.getLevel()) + .likeIfPresent(DistributorLevelDO::getName, reqVO.getName()) + .eqIfPresent(DistributorLevelDO::getFirstWages, reqVO.getFirstWages()) + .eqIfPresent(DistributorLevelDO::getSecondWages, reqVO.getSecondWages()) + .eqIfPresent(DistributorLevelDO::getUpType, reqVO.getUpType()) + .eqIfPresent(DistributorLevelDO::getUserCount, reqVO.getUserCount()) + .eqIfPresent(DistributorLevelDO::getAmount, reqVO.getAmount()) + .eqIfPresent(DistributorLevelDO::getWages, reqVO.getWages()) + .betweenIfPresent(DistributorLevelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DistributorLevelDO::getId)); + } + + default List selectList(DistributorLevelExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorLevelDO::getLevel, reqVO.getLevel()) + .likeIfPresent(DistributorLevelDO::getName, reqVO.getName()) + .eqIfPresent(DistributorLevelDO::getFirstWages, reqVO.getFirstWages()) + .eqIfPresent(DistributorLevelDO::getSecondWages, reqVO.getSecondWages()) + .eqIfPresent(DistributorLevelDO::getUpType, reqVO.getUpType()) + .eqIfPresent(DistributorLevelDO::getUserCount, reqVO.getUserCount()) + .eqIfPresent(DistributorLevelDO::getAmount, reqVO.getAmount()) + .eqIfPresent(DistributorLevelDO::getWages, reqVO.getWages()) + .betweenIfPresent(DistributorLevelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DistributorLevelDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributororder/DistributorOrderMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributororder/DistributorOrderMapper.java new file mode 100644 index 0000000..9aab761 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributororder/DistributorOrderMapper.java @@ -0,0 +1,95 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributororder; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.*; + +/** + * 分销商订单 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorOrderMapper extends BaseMapperX { + + default PageResult selectPage(DistributorOrderPageReqVO reqVO) { + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX<>(); + if (reqVO.getSuperiorIdP1() != null && reqVO.getSuperiorIdP2() != null) { + wrapperX.or(w -> w + .eq(DistributorOrderDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()).or() + .eq(DistributorOrderDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()) + ); + }else { + wrapperX.eqIfPresent(DistributorOrderDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()); + wrapperX.eqIfPresent(DistributorOrderDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()); + } + return selectPage(reqVO, wrapperX + .betweenIfPresent(DistributorOrderDO::getCreateTime, reqVO.getCreateTime()) + .betweenIfPresent(DistributorOrderDO::getSettlementTime, reqVO.getSettlementTime()) + .eqIfPresent(DistributorOrderDO::getOid, reqVO.getOid()) + .eqIfPresent(DistributorOrderDO::getOrderId, reqVO.getOrderId()) + .eqIfPresent(DistributorOrderDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DistributorOrderDO::getDistributionRule, reqVO.getDistributionRule()) + .eqIfPresent(DistributorOrderDO::getDistributionPurchase, reqVO.getDistributionPurchase()) + .eqIfPresent(DistributorOrderDO::getDistributionProductSettlement, reqVO.getDistributionProductSettlement()) + .eqIfPresent(DistributorOrderDO::getDistributionWagesSettlement, reqVO.getDistributionWagesSettlement()) + .eqIfPresent(DistributorOrderDO::getUserId, reqVO.getUserId()) + .likeIfPresent(DistributorOrderDO::getUserName, reqVO.getUserName()) + .eqIfPresent(DistributorOrderDO::getProductId, reqVO.getProductId()) + .eqIfPresent(DistributorOrderDO::getProductAttrValueId, reqVO.getProductAttrValueId()) + .likeIfPresent(DistributorOrderDO::getProductName, reqVO.getProductName()) + .eqIfPresent(DistributorOrderDO::getProductPrice, reqVO.getProductPrice()) + .eqIfPresent(DistributorOrderDO::getDetailId, reqVO.getDetailId()) + .eqIfPresent(DistributorOrderDO::getSuperiorNameP1, reqVO.getSuperiorNameP1()) + .eqIfPresent(DistributorOrderDO::getSuperiorNameP2, reqVO.getSuperiorNameP2()) + .eqIfPresent(DistributorOrderDO::getFirstWages, reqVO.getFirstWages()) + .eqIfPresent(DistributorOrderDO::getSecondWages, reqVO.getSecondWages()) + .eqIfPresent(DistributorOrderDO::getFirstAmount, reqVO.getFirstAmount()) + .eqIfPresent(DistributorOrderDO::getSecondAmount, reqVO.getSecondAmount()) + .orderByDesc(DistributorOrderDO::getId)); + } + + default List selectList(DistributorOrderExportReqVO reqVO) { + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX<>(); + if (reqVO.getSuperiorIdP1() != null && reqVO.getSuperiorIdP2() != null) { + wrapperX.or(w -> w + .eq(DistributorOrderDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()).or() + .eq(DistributorOrderDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()) + ); + }else { + wrapperX.eqIfPresent(DistributorOrderDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()); + wrapperX.eqIfPresent(DistributorOrderDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()); + } + return selectList(wrapperX + .betweenIfPresent(DistributorOrderDO::getCreateTime, reqVO.getCreateTime()) + .betweenIfPresent(DistributorOrderDO::getSettlementTime, reqVO.getSettlementTime()) + .eqIfPresent(DistributorOrderDO::getOid, reqVO.getOid()) + .eqIfPresent(DistributorOrderDO::getOrderId, reqVO.getOrderId()) + .eqIfPresent(DistributorOrderDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DistributorOrderDO::getDistributionRule, reqVO.getDistributionRule()) + .eqIfPresent(DistributorOrderDO::getDistributionPurchase, reqVO.getDistributionPurchase()) + .eqIfPresent(DistributorOrderDO::getDistributionProductSettlement, reqVO.getDistributionProductSettlement()) + .eqIfPresent(DistributorOrderDO::getDistributionWagesSettlement, reqVO.getDistributionWagesSettlement()) + .eqIfPresent(DistributorOrderDO::getUserId, reqVO.getUserId()) + .likeIfPresent(DistributorOrderDO::getUserName, reqVO.getUserName()) + .eqIfPresent(DistributorOrderDO::getProductId, reqVO.getProductId()) + .eqIfPresent(DistributorOrderDO::getProductAttrValueId, reqVO.getProductAttrValueId()) + .likeIfPresent(DistributorOrderDO::getProductName, reqVO.getProductName()) + .eqIfPresent(DistributorOrderDO::getProductPrice, reqVO.getProductPrice()) + .eqIfPresent(DistributorOrderDO::getDetailId, reqVO.getDetailId()) + .eqIfPresent(DistributorOrderDO::getSuperiorNameP1, reqVO.getSuperiorNameP1()) + .eqIfPresent(DistributorOrderDO::getSuperiorNameP2, reqVO.getSuperiorNameP2()) + .eqIfPresent(DistributorOrderDO::getFirstWages, reqVO.getFirstWages()) + .eqIfPresent(DistributorOrderDO::getSecondWages, reqVO.getSecondWages()) + .eqIfPresent(DistributorOrderDO::getFirstAmount, reqVO.getFirstAmount()) + .eqIfPresent(DistributorOrderDO::getSecondAmount, reqVO.getSecondAmount()) + .inIfPresent(DistributorOrderDO::getDetailId, reqVO.getDetailIds()) + .orderByDesc(DistributorOrderDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributoruser/DistributorUserMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributoruser/DistributorUserMapper.java new file mode 100644 index 0000000..c4d9179 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributoruser/DistributorUserMapper.java @@ -0,0 +1,65 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributoruser; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 分销商所属用户 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorUserMapper extends BaseMapperX { + + default PageResult selectPage(DistributorUserPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorUserDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(DistributorUserDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorUserDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()) + .eqIfPresent(DistributorUserDO::getSuperiorNameP1, reqVO.getSuperiorNameP1()) + .eqIfPresent(DistributorUserDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()) + .eqIfPresent(DistributorUserDO::getSuperiorNameP2, reqVO.getSuperiorNameP2()) + .betweenIfPresent(DistributorUserDO::getExpireTime, reqVO.getExpireTime()) + .likeIfPresent(DistributorUserDO::getNickname, reqVO.getNickname()) + .eqIfPresent(DistributorUserDO::getAvatar, reqVO.getAvatar()) + .eqIfPresent(DistributorUserDO::getProductCount, reqVO.getProductCount()) + .eqIfPresent(DistributorUserDO::getOrderCount, reqVO.getOrderCount()) + .eqIfPresent(DistributorUserDO::getWages, reqVO.getWages()) + .orderByDesc(DistributorUserDO::getId)); + } + + default List selectList(DistributorUserExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorUserDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(DistributorUserDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorUserDO::getSuperiorIdP1, reqVO.getSuperiorIdP1()) + .eqIfPresent(DistributorUserDO::getSuperiorNameP1, reqVO.getSuperiorNameP1()) + .eqIfPresent(DistributorUserDO::getSuperiorIdP2, reqVO.getSuperiorIdP2()) + .eqIfPresent(DistributorUserDO::getSuperiorNameP2, reqVO.getSuperiorNameP2()) + .betweenIfPresent(DistributorUserDO::getExpireTime, reqVO.getExpireTime()) + .likeIfPresent(DistributorUserDO::getNickname, reqVO.getNickname()) + .eqIfPresent(DistributorUserDO::getAvatar, reqVO.getAvatar()) + .eqIfPresent(DistributorUserDO::getProductCount, reqVO.getProductCount()) + .eqIfPresent(DistributorUserDO::getOrderCount, reqVO.getOrderCount()) + .eqIfPresent(DistributorUserDO::getWages, reqVO.getWages()) + .inIfPresent(DistributorUserDO::getSuperiorIdP1, reqVO.getSuperiorIdP1s()) + .inIfPresent(DistributorUserDO::getSuperiorIdP2, reqVO.getSuperiorIdP2s()) + .orderByDesc(DistributorUserDO::getId)); + } + + @Update("delete from yshop_distributor_user where superior_id_p1 = #{id}") + void deleteP1(@Param("id") Long id); + + @Update("delete from yshop_distributor_user where superior_id_p2 = #{id}") + void deleteP2(@Param("id") Long id); + +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwages/DistributorWagesMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwages/DistributorWagesMapper.java new file mode 100644 index 0000000..44149c0 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwages/DistributorWagesMapper.java @@ -0,0 +1,58 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributorwages; + +import java.math.BigDecimal; +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 分销商佣金 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorWagesMapper extends BaseMapperX { + + default PageResult selectPage(DistributorWagesPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorWagesDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(DistributorWagesDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorWagesDO::getAmount, reqVO.getAmount()) + .eqIfPresent(DistributorWagesDO::getRefuseAmount, reqVO.getRefuseAmount()) + .eqIfPresent(DistributorWagesDO::getDistributorId, reqVO.getDistributorId()) + .orderByDesc(DistributorWagesDO::getId)); + } + + default List selectList(DistributorWagesExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorWagesDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(DistributorWagesDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorWagesDO::getAmount, reqVO.getAmount()) + .eqIfPresent(DistributorWagesDO::getRefuseAmount, reqVO.getRefuseAmount()) + .eqIfPresent(DistributorWagesDO::getDistributorId, reqVO.getDistributorId()) + .orderByDesc(DistributorWagesDO::getId)); + } + + @Update("UPDATE yshop_distributor_wages SET amount = amount - #{amount} WHERE distributor_id = #{id} and (amount - #{amount}) > 0") + int reduceAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); + + @Update("UPDATE yshop_distributor_wages SET refuse_amount = refuse_amount - #{amount} WHERE distributor_id = #{id}") + int reduceRefuseAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); + + @Update("UPDATE yshop_distributor_wages SET refuse_amount = refuse_amount + #{amount} WHERE distributor_id = #{id}") + int increaseRefuseAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); + + @Update("UPDATE yshop_distributor_wages SET amount = amount + #{amount}, refuse_amount = refuse_amount - #{amount} WHERE distributor_id = #{id}") + int settlementAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); + + @Update("UPDATE yshop_distributor_wages SET amount = amount + #{amount} WHERE distributor_id = #{id}") + int increaseAmount(@Param("id") Long id, @Param("amount") BigDecimal amount); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwageslog/DistributorWagesLogMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwageslog/DistributorWagesLogMapper.java new file mode 100644 index 0000000..8997edb --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwageslog/DistributorWagesLogMapper.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributorwageslog; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.*; + +/** + * 分销商佣金记录 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorWagesLogMapper extends BaseMapperX { + + default PageResult selectPage(DistributorWagesLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorWagesLogDO::getWagesId, reqVO.getWagesId()) + .eqIfPresent(DistributorWagesLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(DistributorWagesLogDO::getType, reqVO.getType()) + .eqIfPresent(DistributorWagesLogDO::getAmount, reqVO.getAmount()) + .betweenIfPresent(DistributorWagesLogDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorWagesLogDO::getDistributorId, reqVO.getDistributorId()) + .eqIfPresent(DistributorWagesLogDO::getStatus, reqVO.getStatus()) + .likeIfPresent(DistributorWagesLogDO::getUserName, reqVO.getUserName()) + .likeIfPresent(DistributorWagesLogDO::getDistributorName, reqVO.getDistributorName()) + .inIfPresent(DistributorWagesLogDO::getType, reqVO.getTypeList()) + .eqIfPresent(DistributorWagesLogDO::getOrderId, reqVO.getOrderId()) + .orderByDesc(DistributorWagesLogDO::getId)); + } + + default List selectList(DistributorWagesLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorWagesLogDO::getWagesId, reqVO.getWagesId()) + .eqIfPresent(DistributorWagesLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(DistributorWagesLogDO::getType, reqVO.getType()) + .eqIfPresent(DistributorWagesLogDO::getAmount, reqVO.getAmount()) + .betweenIfPresent(DistributorWagesLogDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorWagesLogDO::getDistributorId, reqVO.getDistributorId()) + .eqIfPresent(DistributorWagesLogDO::getStatus, reqVO.getStatus()) + .likeIfPresent(DistributorWagesLogDO::getUserName, reqVO.getUserName()) + .likeIfPresent(DistributorWagesLogDO::getDistributorName, reqVO.getDistributorName()) + .inIfPresent(DistributorWagesLogDO::getDistributorOrderId, reqVO.getDistributorOrderIds()) + .inIfPresent(DistributorWagesLogDO::getType, reqVO.getTypeList()) + .eqIfPresent(DistributorWagesLogDO::getOrderId, reqVO.getOrderId()) + .eqIfPresent(DistributorWagesLogDO::getMethodType, reqVO.getMethodType()) + .orderByDesc(DistributorWagesLogDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.java new file mode 100644 index 0000000..5139f5b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/dal/mysql/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.java @@ -0,0 +1,44 @@ +package co.yixiang.yshop.module.distributor.dal.mysql.distributorwithdrawalmethod; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.*; + +/** + * 分销商提现方式 Mapper + * + * @author admin + */ +@Mapper +public interface DistributorWithdrawalMethodMapper extends BaseMapperX { + + default PageResult selectPage(DistributorWithdrawalMethodPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DistributorWithdrawalMethodDO::getUserId, reqVO.getUserId()) + .eqIfPresent(DistributorWithdrawalMethodDO::getDistributorId, reqVO.getDistributorId()) + .eqIfPresent(DistributorWithdrawalMethodDO::getPaymentMethod, reqVO.getPaymentMethod()) + .eqIfPresent(DistributorWithdrawalMethodDO::getAccountNum, reqVO.getAcountNum()) + .likeIfPresent(DistributorWithdrawalMethodDO::getRealName, reqVO.getRealName()) + .betweenIfPresent(DistributorWithdrawalMethodDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorWithdrawalMethodDO::getType, reqVO.getType()) + .orderByDesc(DistributorWithdrawalMethodDO::getId)); + } + + default List selectList(DistributorWithdrawalMethodExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DistributorWithdrawalMethodDO::getUserId, reqVO.getUserId()) + .eqIfPresent(DistributorWithdrawalMethodDO::getDistributorId, reqVO.getDistributorId()) + .eqIfPresent(DistributorWithdrawalMethodDO::getPaymentMethod, reqVO.getPaymentMethod()) + .eqIfPresent(DistributorWithdrawalMethodDO::getAccountNum, reqVO.getAcountNum()) + .likeIfPresent(DistributorWithdrawalMethodDO::getRealName, reqVO.getRealName()) + .betweenIfPresent(DistributorWithdrawalMethodDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DistributorWithdrawalMethodDO::getType, reqVO.getType()) + .orderByDesc(DistributorWithdrawalMethodDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/package-info.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/package-info.java new file mode 100644 index 0000000..7d309c8 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 product 模块的 framework 封装 + * + * @author yshop + */ +package co.yixiang.yshop.module.distributor.framework; diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/config/DistributorWebConfiguration.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/config/DistributorWebConfiguration.java new file mode 100644 index 0000000..fef14d2 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/config/DistributorWebConfiguration.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.distributor.framework.web.config; + +import co.yixiang.yshop.framework.swagger.config.YshopSwaggerAutoConfiguration; +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * product 模块的 web 组件的 Configuration + * + * @author yshop + */ +@Configuration(proxyBeanMethods = false) +public class DistributorWebConfiguration { + + /** + * product 模块的 API 分组 + */ + @Bean + public GroupedOpenApi distributorGroupedOpenApi() { + return YshopSwaggerAutoConfiguration.buildGroupedOpenApi("distributor"); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/package-info.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/package-info.java new file mode 100644 index 0000000..d889eb3 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * product 模块的 web 配置 + */ +package co.yixiang.yshop.module.distributor.framework.web; diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacade.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacade.java new file mode 100644 index 0000000..d3dda9a --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacade.java @@ -0,0 +1,84 @@ +package co.yixiang.yshop.module.distributor.service.distributor; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorClearanceReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorPageReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorDetailsRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorproduct.vo.AppDistributorProductRespVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; +@Service +@Validated +public interface DistributorFacade { + + /** + * APP获取分销商详情 + * @return 详情 + */ + AppDistributorDetailsRespVO getAppDetails(); + + /** + * APP提交分销商申请 + * @param reqVO 传参 + */ + void apply(@Valid AppDistributorApplyReqVO reqVO); + + /** + * APP更新分销商信息 + * @param reqVO 传参 + */ + void appUpdate(@Valid AppDistributorUpdateReqVO reqVO); + + /** + * 后台分销商详情 + * @param id 分销商ID + * @return 分销商 + */ + DistributorRespVO getDetails(Long id); + + /** + * 后台分销商审核 + * @param reqVO 传参 + */ + void verify(DistributorApplyReqVO reqVO); + + /** + * 后台清退分销商 + * @param reqVO 传参 + */ + void clearance(DistributorClearanceReqVO reqVO); + + + /** + * 后台恢复分销商 + * @param reqVO 传参 + */ + void restore(DistributorClearanceReqVO reqVO); + + + /** + * 分页获取可分销商品 + * @param reqVO 参数 + * @return 商品 + */ + PageResult getProductPage(ProductPageReqVO reqVO); + + /** + * 绑定用户 + * @param id 分销商ID + * @param userId 用户ID + */ + Long bindUser(Long id, Long userId, Integer isDistributor); + + PageResult getPage(DistributorPageReqVO pageReqVO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacadeImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacadeImpl.java new file mode 100644 index 0000000..0289408 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorFacadeImpl.java @@ -0,0 +1,444 @@ +package co.yixiang.yshop.module.distributor.service.distributor; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; +import co.yixiang.yshop.framework.dict.core.util.DictFrameworkUtils; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.DistributorLevelExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.DistributorUserCreateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.DistributorUserExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.DistributorUserUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.DistributorWagesCreateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodCreateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorDetailsRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorproduct.vo.AppDistributorProductRespVO; +import co.yixiang.yshop.module.distributor.convert.distributor.DistributorConvert; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import co.yixiang.yshop.module.distributor.enums.*; +import co.yixiang.yshop.module.distributor.service.distributorlevel.DistributorLevelFacade; +import co.yixiang.yshop.module.distributor.service.distributorlevel.DistributorLevelService; +import co.yixiang.yshop.module.distributor.service.distributororder.DistributorOrderService; +import co.yixiang.yshop.module.distributor.service.distributoruser.DistributorUserService; +import co.yixiang.yshop.module.distributor.service.distributorwages.DistributorWagesService; +import co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod.DistributorWithdrawalMethodService; +import co.yixiang.yshop.module.member.api.user.MemberUserApi; +import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; +import co.yixiang.yshop.module.product.api.product.ProductApi; +import co.yixiang.yshop.module.product.api.product.dto.ProductDTO; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; +import co.yixiang.yshop.module.system.enums.DistributorDictEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Slf4j +@Service +@Validated +public class DistributorFacadeImpl implements DistributorFacade { + + @Resource + private DistributorService distributorService; + + @Resource + private DistributorLevelService distributorLevelService; + + @Resource + private DistributorUserService distributorUserService; + + @Resource + private DistributorWagesService distributorWagesService; + + @Resource + private DistributorWithdrawalMethodService distributorWithdrawalMethodService; + + @Resource + private MemberUserApi memberUserApi; + + @Resource + private DistributorOrderService distributorOrderService; + + @Resource + private ProductApi productApi; + + @Lazy + @Resource + private DistributorLevelFacade distributorLevelFacade; + + /** + * APP获取分销商详情 + * 根据状态判断分销商步骤 + * @return 分销商详情 + */ + @Override + public AppDistributorDetailsRespVO getAppDetails() { + AppDistributorDetailsRespVO respVO = new AppDistributorDetailsRespVO(); + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + if (distributorDO != null) { + // 获取等级 + DistributorLevelDO level = distributorLevelService.getLevel(distributorDO.getLevelId()); + BeanUtil.copyProperties(distributorDO,respVO); + respVO.setLevelName(level.getName()); + if (distributorDO.getSuperiorIdP1() != null) { + // 所属一级分销商 + DistributorDO superiorDistributorDO = distributorService.get(distributorDO.getSuperiorIdP1()); + respVO.setSuperiorName(superiorDistributorDO.getRealName()); + } + // 佣金 + respVO.setAddUpWages(distributorDO.getAddUpWages()); + DistributorWagesDO distributorWagesDO = distributorWagesService.getWagesByDistributorId(distributorDO.getId()); + if (distributorWagesDO != null) { + respVO.setAmount(distributorWagesDO.getAmount()); + respVO.setRefuseAmount(distributorWagesDO.getRefuseAmount()); + } + } + return respVO; + } + + @Override + public void apply(AppDistributorApplyReqVO reqVO) { + // 获取分销商 + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + if (distributorDO != null) { + // 不是拒绝 + if (!DistributorStatusEnum.REFUSED.getStatus().equals(distributorDO.getStatus())) { + throw exception(ErrorCodeConstants.DISTRIBUTOR_USER_EXISTS); + } + + }else { + // 未申请过分销商 + distributorDO = new DistributorDO(); + } + + distributorDO.setUserId(userId); + distributorDO.setRealName(reqVO.getRealName()); + distributorDO.setAddress(reqVO.getAddress()); + distributorDO.setReason(reqVO.getReason()); + + // 默认等级 + DistributorLevelDO defaultLevel = distributorLevelService.getDefaultLevel(); + distributorDO.setLevelId(defaultLevel.getId()); + distributorDO.setStatus(DistributorStatusEnum.AUDIT.getStatus()); + + // 判断是否别人邀请推荐 + if (reqVO.getSuperiorIdP1() != null) { + // 绑定一级分销商 + DistributorDO p1 = distributorService.get(reqVO.getSuperiorIdP1()); + distributorDO.setSuperiorIdP1(p1.getId()); + distributorDO.setSuperiorNameP1(p1.getRealName()); + distributorDO.setSuperiorIdP2(p1.getSuperiorIdP1()); + distributorDO.setSuperiorNameP2(p1.getSuperiorNameP1()); + // 绑定用户 + this.bindUser(reqVO.getSuperiorIdP1(), userId, DistributorConstants.TURE_INTEGER); + // 增加邀请分销商数 + distributorService.addUpDistributor(p1.getId()); + + } + if (distributorDO.getId() == null) { + // 保存 + Long id = distributorService.save(distributorDO); + distributorDO.setId(id); + }else { + distributorService.update(distributorDO); + } + + String apply = DictFrameworkUtils.parseDictDataValue(DistributorDictEnum.DISTRIBUTOR_APPLY.getDictType(), DistributorDictEnum.DISTRIBUTOR_APPLY.getLabel()); + if (DistributorConstants.APPLY_TRUE.equals(apply)) { + // 自动通过 + this.verify(new DistributorApplyReqVO().setId(distributorDO.getId()).setStatus(DistributorStatusEnum.PASSED.getStatus())); + } + } + + @Override + public void appUpdate(AppDistributorUpdateReqVO reqVO) { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + DistributorUpdateReqVO distributorUpdateReqVO = new DistributorUpdateReqVO(); + distributorUpdateReqVO.setId(distributorDO.getId()); + distributorUpdateReqVO.setRealName(reqVO.getRealName()); + distributorUpdateReqVO.setAddress(reqVO.getAddress()); + distributorUpdateReqVO.setReason(reqVO.getReason()); + distributorService.update(distributorUpdateReqVO); + } + + @Override + public DistributorRespVO getDetails(Long id) { + DistributorDO distributorDO = distributorService.get(id); + if (distributorDO == null) { + throw exception(ErrorCodeConstants.DISTRIBUTOR_NOT_EXISTS); + } + DistributorRespVO respVO = DistributorConvert.INSTANCE.convert(distributorDO); + // 获取等级 + DistributorLevelDO level = distributorLevelService.getLevel(respVO.getLevelId()); + // 费率 + respVO.setLevelName(level.getName()); + respVO.setFirstWages(level.getFirstWages()); + respVO.setSecondWages(level.getSecondWages()); + + MemberUserRespDTO user = memberUserApi.getUser(distributorDO.getUserId()); + respVO.setMobile(user.getMobile()); + + // 获取我的用户 + List p1UserList = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP1(id)); + List p2UserList = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP2(id)); + respVO.setP1UserCount(p1UserList.size()); + respVO.setP2UserCount(p2UserList.size()); + respVO.setUserCount(p1UserList.size() + p2UserList.size()); + + // 我的分销商 + List p1Distributor = distributorService.getList(new DistributorExportReqVO().setSuperiorIdP1(id)); + List p2Distributor = distributorService.getList(new DistributorExportReqVO().setSuperiorIdP2(id)); + respVO.setFirstDistributorCount(p1Distributor.size()); + respVO.setSecondDistributorCount(p2Distributor.size()); + + // 我的分销订单 + List p1OrderList = distributorOrderService.getOrderList(new DistributorOrderExportReqVO().setSuperiorIdP1(id)); + List p2OrderList = distributorOrderService.getOrderList(new DistributorOrderExportReqVO().setSuperiorIdP2(id)); + respVO.setOrderCount(p1OrderList.size() + p2OrderList.size()); + respVO.setFirstOrderCount(p1OrderList.size()); + respVO.setSecondOrderCount(p2OrderList.size()); + + BigDecimal p1Amount = p1OrderList.stream() + .map(DistributorOrderDO::getProductPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal p2Amount = p2OrderList.stream() + .map(DistributorOrderDO::getProductPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + respVO.setFirstAmountCount(p1Amount); + respVO.setSecondAmountCount(p2Amount); + respVO.setAmountCount(p1Amount.add(p2Amount)); + return respVO; + } + + @Override + public void verify(DistributorApplyReqVO reqVO) { + DistributorDO distributorDO = distributorService.get(reqVO.getId()); + // 更新状态 + DistributorUpdateReqVO distributorUpdateReqVO = new DistributorUpdateReqVO(); + distributorUpdateReqVO.setId(reqVO.getId()); + distributorUpdateReqVO.setStatus(reqVO.getStatus()); + distributorUpdateReqVO.setRefuse(reqVO.getRefuse()); + distributorService.update(distributorUpdateReqVO); + // 判断是否通过 保存余额 + if (DistributorStatusEnum.PASSED.getStatus().equals(reqVO.getStatus())) { + // 保存分销余额 + DistributorWagesCreateReqVO createReqVO = new DistributorWagesCreateReqVO(); + createReqVO.setDistributorId(reqVO.getId()); + createReqVO.setAmount(BigDecimal.ZERO); + createReqVO.setRefuseAmount(BigDecimal.ZERO); + createReqVO.setUserId(distributorDO.getUserId()); + distributorWagesService.createWages(createReqVO); + // 保存提现方式 + DistributorWithdrawalMethodTypeEnum[] distributorWithdrawalMethodTypeEnums = DistributorWithdrawalMethodTypeEnum.values(); + for (DistributorWithdrawalMethodTypeEnum x:distributorWithdrawalMethodTypeEnums) { + Integer type = x.getType(); + String paymentMethod = x.getPaymentMethod(); + DistributorWithdrawalMethodCreateReqVO distributorWithdrawalMethodCreateReqVO = new DistributorWithdrawalMethodCreateReqVO(); + distributorWithdrawalMethodCreateReqVO.setDistributorId(reqVO.getId()); + distributorWithdrawalMethodCreateReqVO.setType(type); + distributorWithdrawalMethodCreateReqVO.setPaymentMethod(paymentMethod); + distributorWithdrawalMethodService.createWithdrawalMethod(distributorWithdrawalMethodCreateReqVO); + } + } + } + + /** + * 后台清退分销商 + * @param reqVO 传参 + */ + @Override + public void clearance(DistributorClearanceReqVO reqVO) { + DistributorDO distributorDO = distributorService.get(reqVO.getId()); + if (distributorDO == null) { + throw exception(ErrorCodeConstants.DISTRIBUTOR_NOT_EXISTS); + } + if (DistributorStatusEnum.NOT_APPLIED.getStatus().equals(distributorDO.getStatus())) { + // 恢复 + DistributorUpdateReqVO distributorUpdateReqVO = new DistributorUpdateReqVO(); + distributorUpdateReqVO.setId(distributorDO.getId()); + distributorUpdateReqVO.setStatus(DistributorStatusEnum.PASSED.getStatus()); + distributorService.update(distributorUpdateReqVO); + return; + } + DistributorUpdateReqVO distributorUpdateReqVO = new DistributorUpdateReqVO(); + distributorUpdateReqVO.setId(distributorDO.getId()); + distributorUpdateReqVO.setStatus(DistributorStatusEnum.NOT_APPLIED.getStatus()); + distributorUpdateReqVO.setAddUpUser(0); + distributorUpdateReqVO.setAddUpDistributor(0); + distributorService.update(distributorUpdateReqVO); + // 清除所有下级绑定 分销商 用户 + distributorService.clearance(distributorDO.getId()); + distributorUserService.clearance(distributorDO.getId()); + } + + @Override + public void restore(DistributorClearanceReqVO reqVO) { + DistributorDO distributorDO = distributorService.get(reqVO.getId()); + if (distributorDO == null) { + throw exception(ErrorCodeConstants.DISTRIBUTOR_NOT_EXISTS); + } + DistributorUpdateReqVO distributorUpdateReqVO = new DistributorUpdateReqVO(); + distributorUpdateReqVO.setId(distributorDO.getId()); + distributorUpdateReqVO.setStatus(DistributorStatusEnum.PASSED.getStatus()); + distributorService.update(distributorUpdateReqVO); + } + + @Override + public PageResult getProductPage(ProductPageReqVO reqVO) { + // 获取分销商 + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + if (distributorDO == null) { + throw exception(ErrorCodeConstants.DISTRIBUTOR_NOT_EXISTS); + } + // 获取分销商等级 + DistributorLevelDO level = distributorLevelService.getLevel(distributorDO.getId()); + + // 返回值 + PageResult result = new PageResult<>(); + List list = new ArrayList<>(); + + // 获取商品 + reqVO.setIsDistribution(DistributorProductTypeEnum.YES.getType()); + PageResult productPage = productApi.getProductPage(reqVO); + // 获取商品 + List productDTOList = productPage.getList(); + // 计算佣金 + for (ProductDTO productDTO : productDTOList) { + AppDistributorProductRespVO appDistributorProductRespVO = BeanUtil.copyProperties(productDTO, AppDistributorProductRespVO.class); + appDistributorProductRespVO.setExpectPrice(productDTO.getPrice().multiply(new BigDecimal(100)).divide(new BigDecimal(level.getFirstWages()),2, RoundingMode.DOWN)); + list.add(appDistributorProductRespVO); + } + result.setList(list); + result.setTotal(productPage.getTotal()); + return result; + } + + /** + * 绑定用户 + * @param id 分销商ID + * @param userId 用户ID + * @param isDistributor + * @return + */ + @Override + public Long bindUser(Long id, Long userId, Integer isDistributor) { + // 获取一级分销商 + DistributorDO p1 = distributorService.get(id); + + Date afterSevenDays; + // 获取客户保护天数 + String day = DictFrameworkUtils.parseDictDataValue(DistributorDictEnum.DISTRIBUTOR_USER_EXPIRE.getDictType(), DistributorDictEnum.DISTRIBUTOR_USER_EXPIRE.getLabel()); + if (day.equals(DistributorConstants.UNLIMITED_USER_EXPIRE)) { + afterSevenDays = DateUtil.offset(DateUtil.date(), DateField.YEAR, DistributorConstants.UNLIMITED_YEAR); + } else { + afterSevenDays = DateUtil.offset(DateUtil.date(), DateField.DAY_OF_MONTH, Integer.parseInt(day)); + } + // 使用ZoneId系统默认时区将Instant转换为ZonedDateTime + ZonedDateTime zonedDateTime = afterSevenDays.toInstant().atZone(ZoneId.systemDefault()); + LocalDateTime expireTime = zonedDateTime.toLocalDateTime(); + + + // 判断用户是否已经绑定 + DistributorUserDO distributorUserDO = distributorUserService.getByUserId(userId); + if (distributorUserDO == null) { + // 未绑定 + DistributorUserCreateReqVO createReqVO = new DistributorUserCreateReqVO(); + MemberUserRespDTO user = memberUserApi.getUser(userId); + createReqVO.setNickname(user.getNickname()); + createReqVO.setAvatar(user.getAvatar()); + createReqVO.setUserId(userId); + createReqVO.setSuperiorIdP1(p1.getId()); + createReqVO.setSuperiorNameP1(p1.getRealName()); + createReqVO.setSuperiorIdP2(p1.getSuperiorIdP1()); + createReqVO.setSuperiorNameP2(p1.getSuperiorNameP1()); + createReqVO.setExpireTime(expireTime); + createReqVO.setIsDistributor(isDistributor); + // 保存绑定关系 + Long user1 = distributorUserService.createUser(createReqVO); + distributorLevelFacade.levelUp(p1.getId()); + return user1; + } + + if (distributorUserDO.getExpireTime().isAfter(LocalDateTime.now())) { + // 已绑定用户 不处理 + return distributorUserDO.getId(); + } + + // 更新绑定关系 + DistributorUserUpdateReqVO updateReqVO = new DistributorUserUpdateReqVO(); + updateReqVO.setSuperiorIdP1(p1.getId()); + updateReqVO.setSuperiorNameP1(p1.getRealName()); + updateReqVO.setSuperiorIdP2(p1.getSuperiorIdP1()); + updateReqVO.setSuperiorNameP2(p1.getSuperiorNameP1()); + updateReqVO.setExpireTime(expireTime); + updateReqVO.setCreateTime(LocalDateTime.now()); + updateReqVO.setIsDistributor(isDistributor); + distributorUserService.updateUser(updateReqVO); + + distributorLevelFacade.levelUp(p1.getId()); + return distributorUserDO.getId(); + } + + @Override + public PageResult getPage(DistributorPageReqVO pageReqVO) { + // 获取所有等级 + List levelList = distributorLevelService.getLevelList(new DistributorLevelExportReqVO()); + Map distributorLevelMap = levelList.stream().collect(Collectors.toMap(DistributorLevelDO::getId, p -> p, (existingValue, newValue) -> existingValue)); + + // 查询 + PageResult page = distributorService.getPage(pageReqVO); + List list = page.getList(); + + // 获取用户 + List ids = CollectionUtils.convertList(list, DistributorDO::getId); + List userList = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP1s(ids)); + Map> map = userList.stream().collect(Collectors.groupingBy(DistributorUserDO::getSuperiorIdP1)); + + // 组装用户数量 + list.forEach(distributorDO -> { + DistributorLevelDO distributorLevelDO = distributorLevelMap.get(distributorDO.getLevelId()); + distributorDO.setLevelName(distributorLevelDO.getName()); + if (CollUtil.isNotEmpty(map)) { + List distributorUserDOS = map.get(distributorDO.getId()); + if (CollUtil.isNotEmpty(distributorUserDOS)) { + distributorDO.setUserCount(distributorUserDOS.size()); + }else { + distributorDO.setUserCount(0); + } + } + }); + return page; + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorService.java new file mode 100644 index 0000000..6d2c2b0 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorService.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.distributor.service.distributor; + +import java.math.BigDecimal; +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商 Service 接口 + * + * @author admin + */ +public interface DistributorService { + + /** + * 创建分销商 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid DistributorCreateReqVO createReqVO); + + Long save(DistributorDO distributorDO); + + /** + * 更新分销商 + * + * @param updateReqVO 更新信息 + */ + void update(@Valid DistributorUpdateReqVO updateReqVO); + + void update(DistributorDO distributorDO); + + /** + * 删除分销商 + * + * @param id 编号 + */ + void delete(Long id); + + /** + * 获得分销商 + * + * @param id 编号 + * @return 分销商 + */ + DistributorDO get(Long id); + + /** + * 获得分销商列表 + * + * @param ids 编号 + * @return 分销商列表 + */ + List getList(Collection ids); + + /** + * 获得分销商分页 + * + * @param pageReqVO 分页查询 + * @return 分销商分页 + */ + PageResult getPage(DistributorPageReqVO pageReqVO); + + /** + * 获得分销商列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商列表 + */ + List getList(DistributorExportReqVO exportReqVO); + + DistributorDO getDistributorByUserId(Long userId); + + void clearance(Long id); + + void addUpDistributor(Long id); + + void addAmount(Long id, BigDecimal productPrice, BigDecimal addUpWages); +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImpl.java new file mode 100644 index 0000000..a2f27ee --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImpl.java @@ -0,0 +1,117 @@ +package co.yixiang.yshop.module.distributor.service.distributor; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributor.DistributorConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributor.DistributorMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorServiceImpl implements DistributorService { + + @Resource + private DistributorMapper distributorMapper; + + @Override + public Long create(DistributorCreateReqVO createReqVO) { + // 插入 + DistributorDO distributorDO = DistributorConvert.INSTANCE.convert(createReqVO); + distributorMapper.insert(distributorDO); + // 返回 + return distributorDO.getId(); + } + + @Override + public Long save(DistributorDO distributorDO) { + distributorMapper.insert(distributorDO); + // 返回 + return distributorDO.getId(); + } + + @Override + public void update(DistributorUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + DistributorDO updateObj = DistributorConvert.INSTANCE.convert(updateReqVO); + distributorMapper.updateById(updateObj); + } + + @Override + public void update(DistributorDO distributorDO) { + validateExists(distributorDO.getId()); + distributorMapper.updateById(distributorDO); + } + + @Override + public void delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + distributorMapper.deleteById(id); + } + + private void validateExists(Long id) { + if (distributorMapper.selectById(id) == null) { + throw exception(DISTRIBUTOR_NOT_EXISTS); + } + } + + @Override + public DistributorDO get(Long id) { + return distributorMapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return distributorMapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(DistributorPageReqVO pageReqVO) { + return distributorMapper.selectPage(pageReqVO); + } + + @Override + public List getList(DistributorExportReqVO exportReqVO) { + return distributorMapper.selectList(exportReqVO); + } + + @Override + public DistributorDO getDistributorByUserId(Long userId) { + return distributorMapper.selectOne(DistributorDO::getUserId, userId); + } + + @Override + public void clearance(Long id) { + distributorMapper.updateP1(id); + distributorMapper.updateP2(id); + } + + @Override + public void addUpDistributor(Long id) { + distributorMapper.addUpDistributor(id); + } + + @Override + public void addAmount(Long id, BigDecimal productPrice, BigDecimal addUpWages) { + distributorMapper.addAmount(id, productPrice, addUpWages); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsService.java new file mode 100644 index 0000000..b0ed5db --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsService.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.distributor.service.distributordynamics; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics.DistributorDynamicsDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商动态 Service 接口 + * + * @author admin + */ +public interface DistributorDynamicsService { + + /** + * 创建分销商动态 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDynamics(@Valid DistributorDynamicsCreateReqVO createReqVO); + + /** + * 更新分销商动态 + * + * @param updateReqVO 更新信息 + */ + void updateDynamics(@Valid DistributorDynamicsUpdateReqVO updateReqVO); + + /** + * 删除分销商动态 + * + * @param id 编号 + */ + void deleteDynamics(Long id); + + /** + * 获得分销商动态 + * + * @param id 编号 + * @return 分销商动态 + */ + DistributorDynamicsDO getDynamics(Long id); + + /** + * 获得分销商动态列表 + * + * @param ids 编号 + * @return 分销商动态列表 + */ + List getDynamicsList(Collection ids); + + /** + * 获得分销商动态分页 + * + * @param pageReqVO 分页查询 + * @return 分销商动态分页 + */ + PageResult getDynamicsPage(DistributorDynamicsPageReqVO pageReqVO); + + /** + * 获得分销商动态列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商动态列表 + */ + List getDynamicsList(DistributorDynamicsExportReqVO exportReqVO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImpl.java new file mode 100644 index 0000000..852f1aa --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImpl.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.distributor.service.distributordynamics; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics.DistributorDynamicsDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributordynamics.DistributorDynamicsConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributordynamics.DistributorDynamicsMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商动态 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorDynamicsServiceImpl implements DistributorDynamicsService { + + @Resource + private DistributorDynamicsMapper dynamicsMapper; + + @Override + public Long createDynamics(DistributorDynamicsCreateReqVO createReqVO) { + // 插入 + DistributorDynamicsDO dynamics = DistributorDynamicsConvert.INSTANCE.convert(createReqVO); + dynamicsMapper.insert(dynamics); + // 返回 + return dynamics.getId(); + } + + @Override + public void updateDynamics(DistributorDynamicsUpdateReqVO updateReqVO) { + // 校验存在 + validateDynamicsExists(updateReqVO.getId()); + // 更新 + DistributorDynamicsDO updateObj = DistributorDynamicsConvert.INSTANCE.convert(updateReqVO); + dynamicsMapper.updateById(updateObj); + } + + @Override + public void deleteDynamics(Long id) { + // 校验存在 + validateDynamicsExists(id); + // 删除 + dynamicsMapper.deleteById(id); + } + + private void validateDynamicsExists(Long id) { + if (dynamicsMapper.selectById(id) == null) { + throw exception(DYNAMICS_NOT_EXISTS); + } + } + + @Override + public DistributorDynamicsDO getDynamics(Long id) { + return dynamicsMapper.selectById(id); + } + + @Override + public List getDynamicsList(Collection ids) { + return dynamicsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDynamicsPage(DistributorDynamicsPageReqVO pageReqVO) { + return dynamicsMapper.selectPage(pageReqVO); + } + + @Override + public List getDynamicsList(DistributorDynamicsExportReqVO exportReqVO) { + return dynamicsMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacade.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacade.java new file mode 100644 index 0000000..cab9aef --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacade.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.distributor.service.distributorlevel; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.DistributorLevelCreateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.DistributorLevelPageReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.DistributorLevelRespVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.DistributorLevelUpdateReqVO; + +import javax.validation.Valid; + +public interface DistributorLevelFacade { + + Long createLevel(@Valid DistributorLevelCreateReqVO createReqVO); + + void updateLevel(@Valid DistributorLevelUpdateReqVO updateReqVO); + + PageResult getLevelPage(DistributorLevelPageReqVO pageVO); + + // 升级 + void levelUp(Long id); +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacadeImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacadeImpl.java new file mode 100644 index 0000000..414ec98 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelFacadeImpl.java @@ -0,0 +1,177 @@ +package co.yixiang.yshop.module.distributor.service.distributorlevel; + +import cn.hutool.core.collection.CollUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.DistributorUserExportReqVO; +import co.yixiang.yshop.module.distributor.convert.distributorlevel.DistributorLevelConvert; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.enums.DistributorConstants; +import co.yixiang.yshop.module.distributor.enums.DistributorLevelUpTypeEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorStatusEnum; +import co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorService; +import co.yixiang.yshop.module.distributor.service.distributoruser.DistributorUserService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; + +@Service +@Validated +public class DistributorLevelFacadeImpl implements DistributorLevelFacade { + + @Resource + private DistributorLevelService distributorLevelService; + + @Resource + private DistributorService distributorService; + + @Resource + private DistributorUserService distributorUserService; + + @Override + public Long createLevel(DistributorLevelCreateReqVO createReqVO) { + Integer level = createReqVO.getLevel(); + // 校验是否重复 + List levelList = distributorLevelService.getLevelList(new DistributorLevelExportReqVO().setLevel(level)); + if (CollUtil.isNotEmpty(levelList)) { + throw exception(ErrorCodeConstants.LEVEL_EXISTS); + } + // 不是第一级 + if (level > DistributorConstants.DEFAULT_LEVEL) { + // 获取上级分销等级 + List superiorLevelList = distributorLevelService.getLevelList(new DistributorLevelExportReqVO().setLevel(level-1)); + if (CollUtil.isEmpty(superiorLevelList)) { + throw exception(ErrorCodeConstants.LEVEL_SUPERIOR_NOT_EXISTS); + } + DistributorLevelDO superiorLevelDO = superiorLevelList.get(0); + if (superiorLevelDO.getUserCount() > createReqVO.getUserCount()) { + throw exception(ErrorCodeConstants.LEVEL_USERCOUNT_ERROR); + } + + if (superiorLevelDO.getAmount().compareTo(createReqVO.getAmount()) > 0) { + throw exception(ErrorCodeConstants.LEVEL_AMOUNT_ERROR); + } + + if (superiorLevelDO.getWages().compareTo(createReqVO.getWages()) > 0) { + throw exception(ErrorCodeConstants.LEVEL_WAGES_ERROR); + } + } + + Long id = distributorLevelService.createLevel(createReqVO); + return id; + } + + @Override + public void updateLevel(DistributorLevelUpdateReqVO updateReqVO) { + // 校验 + Integer level = updateReqVO.getLevel(); + // 不是第一级 + if (level > DistributorConstants.DEFAULT_LEVEL) { + // 获取上级分销等级 + List superiorLevelList = distributorLevelService.getLevelList(new DistributorLevelExportReqVO().setLevel(level-1)); + if (CollUtil.isEmpty(superiorLevelList)) { + throw exception(ErrorCodeConstants.LEVEL_SUPERIOR_NOT_EXISTS); + } + DistributorLevelDO superiorLevelDO = superiorLevelList.get(0); + if (superiorLevelDO.getUserCount() > updateReqVO.getUserCount()) { + throw exception(ErrorCodeConstants.LEVEL_USERCOUNT_ERROR); + } + + if (superiorLevelDO.getAmount().compareTo(updateReqVO.getAmount()) > 0) { + throw exception(ErrorCodeConstants.LEVEL_AMOUNT_ERROR); + } + + if (superiorLevelDO.getWages().compareTo(updateReqVO.getWages()) > 0) { + throw exception(ErrorCodeConstants.LEVEL_WAGES_ERROR); + } + } + // 获取下级 + List subordinateLevelList = distributorLevelService.getLevelList(new DistributorLevelExportReqVO().setLevel(level+1)); + if (CollUtil.isNotEmpty(subordinateLevelList)) { + DistributorLevelDO subordinateLevelDO = subordinateLevelList.get(0); + if (subordinateLevelDO.getUserCount() < updateReqVO.getUserCount()) { + throw exception(ErrorCodeConstants.LEVEL_USERCOUNT_LESS_ERROR); + } + + if (subordinateLevelDO.getAmount().compareTo(updateReqVO.getAmount()) < 0) { + throw exception(ErrorCodeConstants.LEVEL_AMOUNT_LESS_ERROR); + } + + if (subordinateLevelDO.getWages().compareTo(updateReqVO.getWages()) < 0) { + throw exception(ErrorCodeConstants.LEVEL_WAGES_LESS_ERROR); + } + } + + distributorLevelService.updateLevel(updateReqVO); + } + + @Override + public PageResult getLevelPage(DistributorLevelPageReqVO pageVO) { + List distributorList = distributorService.getList(new DistributorExportReqVO().setStatus(DistributorStatusEnum.PASSED.getStatus())); + Map> map = distributorList.stream().collect(Collectors.groupingBy(DistributorDO::getLevelId)); + PageResult resp = DistributorLevelConvert.INSTANCE.convertPage(distributorLevelService.getLevelPage(pageVO)); + resp.getList().forEach(x -> { + List distributorDOList = map.get(x.getId()); + if (CollUtil.isNotEmpty(distributorDOList)) { + x.setCount(distributorDOList.size()); + }else { + x.setCount(0); + } + }); + return resp; + } + + @Async + @Override + public void levelUp(Long id) { + // 获取分销商 + DistributorDO distributorDO = distributorService.get(id); + // 获取等级 + DistributorLevelDO level = distributorLevelService.getLevel(distributorDO.getLevelId()); + List subordinateLevelList = distributorLevelService.getLevelList(new DistributorLevelExportReqVO().setLevel(level.getLevel()+1)); + if (CollUtil.isNotEmpty(subordinateLevelList)) { + // 团队 + List p1UserList = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP1(distributorDO.getId())); + List p2UserList = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP2(distributorDO.getId())); + Integer userCount = p1UserList.size() + p2UserList.size(); + + DistributorLevelDO distributorLevelDO = subordinateLevelList.get(0); + DistributorUpdateReqVO distributorUpdateReqVO = new DistributorUpdateReqVO(); + distributorUpdateReqVO.setId(distributorDO.getId()).setLevelId(distributorLevelDO.getId()); + if (distributorLevelDO.getUpType().equals(DistributorLevelUpTypeEnum.ONLY.getType())) { + // 任意 + if (distributorLevelDO.getUserCount() != -1 && userCount >= distributorLevelDO.getUserCount()) { + distributorService.update(distributorUpdateReqVO); + }else if (!distributorLevelDO.getWages().equals(new BigDecimal(-1)) && distributorDO.getAddUpWages().compareTo(distributorLevelDO.getWages()) >= 0) { + distributorService.update(distributorUpdateReqVO); + }else if (!distributorLevelDO.getAmount().equals(new BigDecimal(-1)) && distributorDO.getAddUpAmount().compareTo(distributorLevelDO.getAmount()) >= 0) { + distributorService.update(distributorUpdateReqVO); + } + }else { + // 全部 + if (userCount >= distributorLevelDO.getUserCount() + && distributorDO.getAddUpWages().compareTo(distributorLevelDO.getWages()) >= 0 + && distributorDO.getAddUpAmount().compareTo(distributorLevelDO.getAmount()) >= 0 + ) { + // 升级 + distributorService.update(distributorUpdateReqVO); + } + } + + } + } +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelService.java new file mode 100644 index 0000000..b53216b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelService.java @@ -0,0 +1,73 @@ +package co.yixiang.yshop.module.distributor.service.distributorlevel; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商等级 Service 接口 + * + * @author admin + */ +public interface DistributorLevelService { + + /** + * 创建分销商等级 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLevel(@Valid DistributorLevelCreateReqVO createReqVO); + + /** + * 更新分销商等级 + * + * @param updateReqVO 更新信息 + */ + void updateLevel(@Valid DistributorLevelUpdateReqVO updateReqVO); + + /** + * 删除分销商等级 + * + * @param id 编号 + */ + void deleteLevel(Long id); + + /** + * 获得分销商等级 + * + * @param id 编号 + * @return 分销商等级 + */ + DistributorLevelDO getLevel(Long id); + + /** + * 获得分销商等级列表 + * + * @param ids 编号 + * @return 分销商等级列表 + */ + List getLevelList(Collection ids); + + /** + * 获得分销商等级分页 + * + * @param pageReqVO 分页查询 + * @return 分销商等级分页 + */ + PageResult getLevelPage(DistributorLevelPageReqVO pageReqVO); + + /** + * 获得分销商等级列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商等级列表 + */ + List getLevelList(DistributorLevelExportReqVO exportReqVO); + + // 获取默认等级 + DistributorLevelDO getDefaultLevel(); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImpl.java new file mode 100644 index 0000000..b85f79e --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImpl.java @@ -0,0 +1,87 @@ +package co.yixiang.yshop.module.distributor.service.distributorlevel; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorlevel.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorlevel.DistributorLevelDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributorlevel.DistributorLevelConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorlevel.DistributorLevelMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商等级 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorLevelServiceImpl implements DistributorLevelService { + + @Resource + private DistributorLevelMapper levelMapper; + + @Override + public Long createLevel(DistributorLevelCreateReqVO createReqVO) { + // 插入 + DistributorLevelDO level = DistributorLevelConvert.INSTANCE.convert(createReqVO); + levelMapper.insert(level); + // 返回 + return level.getId(); + } + + @Override + public void updateLevel(DistributorLevelUpdateReqVO updateReqVO) { + // 校验存在 + validateLevelExists(updateReqVO.getId()); + // 更新 + DistributorLevelDO updateObj = DistributorLevelConvert.INSTANCE.convert(updateReqVO); + levelMapper.updateById(updateObj); + } + + @Override + public void deleteLevel(Long id) { + // 校验存在 + validateLevelExists(id); + // 删除 + levelMapper.deleteById(id); + } + + private void validateLevelExists(Long id) { + if (levelMapper.selectById(id) == null) { + throw exception(LEVEL_NOT_EXISTS); + } + } + + @Override + public DistributorLevelDO getLevel(Long id) { + return levelMapper.selectById(id); + } + + @Override + public List getLevelList(Collection ids) { + return levelMapper.selectBatchIds(ids); + } + + @Override + public PageResult getLevelPage(DistributorLevelPageReqVO pageReqVO) { + return levelMapper.selectPage(pageReqVO); + } + + @Override + public List getLevelList(DistributorLevelExportReqVO exportReqVO) { + return levelMapper.selectList(exportReqVO); + } + + @Override + public DistributorLevelDO getDefaultLevel() { + return levelMapper.selectOne(DistributorLevelDO::getLevel, 1); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacade.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacade.java new file mode 100644 index 0000000..2e937dd --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacade.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.distributor.service.distributororder; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderDetailsRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorOrderPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributororder.vo.AppDistributorOrderWagesRespVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; + +import java.time.LocalDateTime; + +public interface DistributorOrderFacade { + + AppDistributorOrderWagesRespVO getAppWages(LocalDateTime[] createTime); + + PageResult getAppPage(AppDistributorOrderPageReqVO reqVO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacadeImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacadeImpl.java new file mode 100644 index 0000000..6108f43 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderFacadeImpl.java @@ -0,0 +1,100 @@ +package co.yixiang.yshop.module.distributor.service.distributororder; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderDetailsRespVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributor.vo.AppDistributorOrderPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributororder.vo.AppDistributorOrderWagesRespVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.enums.DistributorOrderStatusEnum; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Service +@Validated +public class DistributorOrderFacadeImpl implements DistributorOrderFacade { + + @Resource + private DistributorOrderService distributorOrderService; + + @Resource + private DistributorService distributorService; + + @Override + public AppDistributorOrderWagesRespVO getAppWages(LocalDateTime[] createTime) { + AppDistributorOrderWagesRespVO respVO = new AppDistributorOrderWagesRespVO(); + // 获取分销商 + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + + // 已入账p1 + DistributorOrderDO sumP1 = distributorOrderService.sumFirstAmount(distributorDO.getId(), createTime, DistributorOrderStatusEnum.COMPLETE.getStatus()); + // 已入账p2 + DistributorOrderDO sumP2 = distributorOrderService.sumSecondAmount(distributorDO.getId(), createTime, DistributorOrderStatusEnum.COMPLETE.getStatus()); + if (sumP1 == null) { + sumP1 = new DistributorOrderDO(); + sumP1.setFirstAmount(BigDecimal.ZERO); + } + if (sumP2 == null) { + sumP2 = new DistributorOrderDO(); + sumP2.setSecondAmount(BigDecimal.ZERO); + } + + // 未入账p1 + DistributorOrderDO waitSumP1 = distributorOrderService.sumFirstAmount(distributorDO.getId(), createTime, DistributorOrderStatusEnum.WAIT.getStatus()); + // 未入账p2 + DistributorOrderDO waitSumP2 = distributorOrderService.sumSecondAmount(distributorDO.getId(), createTime, DistributorOrderStatusEnum.WAIT.getStatus()); + if (waitSumP1 == null) { + waitSumP1 = new DistributorOrderDO(); + waitSumP1.setFirstAmount(BigDecimal.ZERO); + } + if (waitSumP2 == null) { + waitSumP2 = new DistributorOrderDO(); + waitSumP2.setSecondAmount(BigDecimal.ZERO); + } + + DistributorOrderExportReqVO listReqVO = new DistributorOrderExportReqVO(); + listReqVO.setSuperiorIdP1(distributorDO.getId()); + listReqVO.setSuperiorIdP2(distributorDO.getId()); + listReqVO.setCreateTime(createTime); + List orderList = distributorOrderService.getOrderList(listReqVO); + + respVO.setAmount(sumP1.getFirstAmount().add(sumP2.getSecondAmount())); + respVO.setRefuseAmount(waitSumP1.getFirstAmount().add(waitSumP2.getSecondAmount())); + respVO.setOrderCount(orderList.size()); + return respVO; + } + + @Override + public PageResult getAppPage(AppDistributorOrderPageReqVO reqVO) { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + DistributorOrderPageReqVO pageReqVO = new DistributorOrderPageReqVO(); + pageReqVO.setSuperiorIdP1(distributorDO.getId()); + pageReqVO.setSuperiorIdP2(distributorDO.getId()); + pageReqVO.setPageNo(reqVO.getPageNo()); + pageReqVO.setPageSize(reqVO.getPageSize()); + pageReqVO.setCreateTime(reqVO.getCreateTime()); + PageResult orderPage = distributorOrderService.getOrderPage(pageReqVO); + orderPage.getList().forEach(x -> { + if (distributorDO.getId().equals(x.getSuperiorIdP1())) { + x.setWages(x.getFirstAmount()); + }else { + x.setWages(x.getSecondAmount()); + } + }); + return orderPage; + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderService.java new file mode 100644 index 0000000..94bdbbc --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderService.java @@ -0,0 +1,83 @@ +package co.yixiang.yshop.module.distributor.service.distributororder; + +import java.time.LocalDateTime; +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商订单 Service 接口 + * + * @author admin + */ +public interface DistributorOrderService { + + /** + * 创建分销商订单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOrder(@Valid DistributorOrderCreateReqVO createReqVO); + + /** + * 更新分销商订单 + * + * @param updateReqVO 更新信息 + */ + void updateOrder(@Valid DistributorOrderUpdateReqVO updateReqVO); + + /** + * 删除分销商订单 + * + * @param id 编号 + */ + void deleteOrder(Long id); + + /** + * 获得分销商订单 + * + * @param id 编号 + * @return 分销商订单 + */ + DistributorOrderDO getOrder(Long id); + + DistributorOrderDO getOrderByDetailId(Long detailId); + + /** + * 获得分销商订单列表 + * + * @param ids 编号 + * @return 分销商订单列表 + */ + List getOrderList(Collection ids); + + /** + * 获得分销商订单分页 + * + * @param pageReqVO 分页查询 + * @return 分销商订单分页 + */ + PageResult getOrderPage(DistributorOrderPageReqVO pageReqVO); + + /** + * 获得分销商订单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商订单列表 + */ + List getOrderList(DistributorOrderExportReqVO exportReqVO); + + /** + * 获取佣金金额 + * @param id + * @return + */ + DistributorOrderDO sumFirstAmount(Long id, LocalDateTime[] createTime, Integer status); + + DistributorOrderDO sumSecondAmount(Long id, LocalDateTime[] createTime, Integer status); + + void insertBatch(List list); +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImpl.java new file mode 100644 index 0000000..73eb556 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImpl.java @@ -0,0 +1,116 @@ +package co.yixiang.yshop.module.distributor.service.distributororder; + +import co.yixiang.yshop.framework.mybatis.core.query.QueryWrapperX; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributororder.DistributorOrderConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributororder.DistributorOrderMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商订单 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorOrderServiceImpl implements DistributorOrderService { + + @Resource + private DistributorOrderMapper orderMapper; + + @Override + public Long createOrder(DistributorOrderCreateReqVO createReqVO) { + // 插入 + DistributorOrderDO order = DistributorOrderConvert.INSTANCE.convert(createReqVO); + orderMapper.insert(order); + // 返回 + return order.getId(); + } + + @Override + public void updateOrder(DistributorOrderUpdateReqVO updateReqVO) { + // 校验存在 + validateOrderExists(updateReqVO.getId()); + // 更新 + DistributorOrderDO updateObj = DistributorOrderConvert.INSTANCE.convert(updateReqVO); + orderMapper.updateById(updateObj); + } + + @Override + public void deleteOrder(Long id) { + // 校验存在 + validateOrderExists(id); + // 删除 + orderMapper.deleteById(id); + } + + private void validateOrderExists(Long id) { + if (orderMapper.selectById(id) == null) { + throw exception(ORDER_NOT_EXISTS); + } + } + + @Override + public DistributorOrderDO getOrder(Long id) { + return orderMapper.selectById(id); + } + + @Override + public DistributorOrderDO getOrderByDetailId(Long detailId) { + return orderMapper.selectOne(DistributorOrderDO::getDetailId, detailId); + } + + @Override + public List getOrderList(Collection ids) { + return orderMapper.selectBatchIds(ids); + } + + @Override + public PageResult getOrderPage(DistributorOrderPageReqVO pageReqVO) { + return orderMapper.selectPage(pageReqVO); + } + + @Override + public List getOrderList(DistributorOrderExportReqVO exportReqVO) { + return orderMapper.selectList(exportReqVO); + } + + @Override + public DistributorOrderDO sumFirstAmount(Long id, LocalDateTime[] createTime, Integer status) { + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX.select("sum(first_amount) as first_amount"); + queryWrapperX.betweenIfPresent("create_time", createTime); + queryWrapperX.eqIfPresent("superior_id_p1", id); + queryWrapperX.eqIfPresent("status", status); + return orderMapper.selectOne(queryWrapperX); + } + + @Override + public DistributorOrderDO sumSecondAmount(Long id, LocalDateTime[] createTime, Integer status) { + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX.select("sum(second_amount) as second_amount"); + queryWrapperX.betweenIfPresent("create_time", createTime); + queryWrapperX.eqIfPresent("superior_id_p2", id); + queryWrapperX.eqIfPresent("status", status); + return orderMapper.selectOne(queryWrapperX); + } + + @Override + public void insertBatch(List list) { + orderMapper.insertBatch(list); + } + + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacade.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacade.java new file mode 100644 index 0000000..509cfb3 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacade.java @@ -0,0 +1,16 @@ +package co.yixiang.yshop.module.distributor.service.distributoruser; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserCountRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserPageReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; + +public interface DistributorUserFacade { + + Integer getTodayCount(Integer type); + + AppDistributorUserCountRespVO getCount(); + + PageResult getAppPage(AppDistributorUserPageReqVO reqVO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacadeImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacadeImpl.java new file mode 100644 index 0000000..431eacd --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserFacadeImpl.java @@ -0,0 +1,151 @@ +package co.yixiang.yshop.module.distributor.service.distributoruser; + +import cn.hutool.core.collection.CollUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.DistributorUserExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.DistributorUserPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserCountRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributoruser.vo.AppDistributorUserPageReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.enums.DistributorLevelTypeEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorOrderStatusEnum; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorService; +import co.yixiang.yshop.module.distributor.service.distributororder.DistributorOrderService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Service +@Validated +public class DistributorUserFacadeImpl implements DistributorUserFacade { + + @Resource + private DistributorService distributorService; + + @Resource + private DistributorUserService distributorUserService; + + @Resource + private DistributorOrderService distributorOrderService; + + + /** + * 获取今日用户数量 + * @param type 一级 二级 + * @return 数量 + */ + @Override + public Integer getTodayCount(Integer type) { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + + DistributorUserExportReqVO distributorUserExportReqVO = new DistributorUserExportReqVO(); + if (DistributorLevelTypeEnum.P1.getType().equals(type)) { + distributorUserExportReqVO.setSuperiorIdP1(distributorDO.getId()); + }else if (DistributorLevelTypeEnum.P2.getType().equals(type)) { + distributorUserExportReqVO.setSuperiorIdP2(distributorDO.getId()); + } + + LocalDateTime[] expireTime = new LocalDateTime[2]; + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startTime = now.withHour(0).withMinute(0).withSecond(0); + LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59); + expireTime[0] = startTime; + expireTime[1] = endTime; + + distributorUserExportReqVO.setCreateTime(expireTime); + List userList = distributorUserService.getUserList(distributorUserExportReqVO); + return userList.size(); + } + + /** + * 获取一级 二级用户总数 + * @return 用户总数 + */ + @Override + public AppDistributorUserCountRespVO getCount() { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + + AppDistributorUserCountRespVO respVO = new AppDistributorUserCountRespVO(); + + List p1List = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP1(distributorDO.getId())); + + List p2List = distributorUserService.getUserList(new DistributorUserExportReqVO().setSuperiorIdP2(distributorDO.getId())); + + respVO.setP1Count(p1List.size()); + respVO.setP2Count(p2List.size()); + return respVO; + } + + @Override + public PageResult getAppPage(AppDistributorUserPageReqVO reqVO) { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + + DistributorUserPageReqVO distributorUserPageReqVO = new DistributorUserPageReqVO(); + + // 订单查询条件 + DistributorOrderExportReqVO orderExportReqVO = new DistributorOrderExportReqVO(); + + // 判断一级用户还是二级用户 + if (DistributorLevelTypeEnum.P1.getType().equals(reqVO.getType())) { + distributorUserPageReqVO.setSuperiorIdP1(distributorDO.getId()); + orderExportReqVO.setSuperiorIdP1(distributorDO.getId()); + }else if (DistributorLevelTypeEnum.P2.getType().equals(reqVO.getType())) { + distributorUserPageReqVO.setSuperiorIdP2(distributorDO.getId()); + orderExportReqVO.setSuperiorIdP2(distributorDO.getId()); + }else { + return new PageResult<>(0L); + } + + // 查询所有分销商下用户 + PageResult userPage = distributorUserService.getUserPage(distributorUserPageReqVO); + List list = userPage.getList(); + // 获取用户 + List userIds = CollectionUtils.convertList(list, DistributorUserDO::getUserId); + // 查询用户所有此分销商的分销订单 + orderExportReqVO.setUserIds(userIds); + List orderList = distributorOrderService.getOrderList(orderExportReqVO); + + Map> map = orderList.stream().collect(Collectors.groupingBy(DistributorOrderDO::getUserId)); + list.forEach(distributorUserDO -> { + List orderDOList = map.get(distributorUserDO.getUserId()); + if (CollUtil.isNotEmpty(orderDOList)) { + BigDecimal productAmount = BigDecimal.ZERO; + BigDecimal wages = BigDecimal.ZERO; + for (DistributorOrderDO orderDO : orderDOList) { + productAmount = productAmount.add(orderDO.getProductPrice()); + if (orderDO.getStatus().equals(DistributorOrderStatusEnum.COMPLETE.getStatus())) { + if (DistributorLevelTypeEnum.P1.getType().equals(reqVO.getType())) { + wages = wages.add(orderDO.getFirstAmount()); + }else if (DistributorLevelTypeEnum.P2.getType().equals(reqVO.getType())) { + wages = wages.add(orderDO.getSecondAmount()); + } + } + } + distributorUserDO.setProductAmount(productAmount); + distributorUserDO.setWages(wages); + distributorUserDO.setOrderCount(orderDOList.size()); + }else { + distributorUserDO.setProductAmount(BigDecimal.ZERO); + distributorUserDO.setWages(BigDecimal.ZERO); + distributorUserDO.setOrderCount(0); + } + }); + + return userPage; + } +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserService.java new file mode 100644 index 0000000..ca1467f --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserService.java @@ -0,0 +1,74 @@ +package co.yixiang.yshop.module.distributor.service.distributoruser; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商所属用户 Service 接口 + * + * @author admin + */ +public interface DistributorUserService { + + /** + * 创建分销商所属用户 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUser(@Valid DistributorUserCreateReqVO createReqVO); + + /** + * 更新分销商所属用户 + * + * @param updateReqVO 更新信息 + */ + void updateUser(@Valid DistributorUserUpdateReqVO updateReqVO); + + /** + * 删除分销商所属用户 + * + * @param id 编号 + */ + void deleteUser(Long id); + + /** + * 获得分销商所属用户 + * + * @param id 编号 + * @return 分销商所属用户 + */ + DistributorUserDO getUser(Long id); + + /** + * 获得分销商所属用户列表 + * + * @param ids 编号 + * @return 分销商所属用户列表 + */ + List getUserList(Collection ids); + + /** + * 获得分销商所属用户分页 + * + * @param pageReqVO 分页查询 + * @return 分销商所属用户分页 + */ + PageResult getUserPage(DistributorUserPageReqVO pageReqVO); + + /** + * 获得分销商所属用户列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商所属用户列表 + */ + List getUserList(DistributorUserExportReqVO exportReqVO); + + void clearance(Long id); + + DistributorUserDO getByUserId(Long userId); +} + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImpl.java new file mode 100644 index 0000000..caede4c --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImpl.java @@ -0,0 +1,93 @@ +package co.yixiang.yshop.module.distributor.service.distributoruser; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributoruser.DistributorUserConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributoruser.DistributorUserMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商所属用户 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorUserServiceImpl implements DistributorUserService { + + @Resource + private DistributorUserMapper userMapper; + + @Override + public Long createUser(DistributorUserCreateReqVO createReqVO) { + // 插入 + DistributorUserDO user = DistributorUserConvert.INSTANCE.convert(createReqVO); + userMapper.insert(user); + // 返回 + return user.getId(); + } + + @Override + public void updateUser(DistributorUserUpdateReqVO updateReqVO) { + // 校验存在 + validateUserExists(updateReqVO.getId()); + // 更新 + DistributorUserDO updateObj = DistributorUserConvert.INSTANCE.convert(updateReqVO); + userMapper.updateById(updateObj); + } + + @Override + public void deleteUser(Long id) { + // 校验存在 + validateUserExists(id); + // 删除 + userMapper.deleteById(id); + } + + private void validateUserExists(Long id) { + if (userMapper.selectById(id) == null) { + throw exception(USER_NOT_EXISTS); + } + } + + @Override + public DistributorUserDO getUser(Long id) { + return userMapper.selectById(id); + } + + @Override + public List getUserList(Collection ids) { + return userMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserPage(DistributorUserPageReqVO pageReqVO) { + return userMapper.selectPage(pageReqVO); + } + + @Override + public List getUserList(DistributorUserExportReqVO exportReqVO) { + return userMapper.selectList(exportReqVO); + } + + @Override + public void clearance(Long id) { + userMapper.deleteP1(id); + userMapper.deleteP2(id); + } + + @Override + public DistributorUserDO getByUserId(Long userId) { + return userMapper.selectOne(DistributorUserDO::getUserId, userId); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacade.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacade.java new file mode 100644 index 0000000..2076e35 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacade.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.distributor.service.distributorwages; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodRespVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesPageRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesWithdrawReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; + +import java.time.LocalDateTime; +import java.util.List; + +public interface DistributorWagesFacade { + + AppDistributorWagesPageRespVO getWages(LocalDateTime[] createTime); + + PageResult getWagesPage(AppDistributorWagesPageReqVO reqVO); + + void withdraw(AppDistributorWagesWithdrawReqVO reqVO); + + void updateWithdrawalMethod(DistributorWithdrawalMethodUpdateReqVO updateReqVO); + + List getWithdrawalMethodList(); + + // 保存佣金 + void saveWages(DistributorOrderDO distributorOrder); + + // 结算佣金 + void settlementWages(DistributorOrderDO distributorOrder); + + // 取消订单退回佣金 + void cancelWages(List distributorOrderIds); +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacadeImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacadeImpl.java new file mode 100644 index 0000000..1fb69fb --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesFacadeImpl.java @@ -0,0 +1,229 @@ +package co.yixiang.yshop.module.distributor.service.distributorwages; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogCreateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogPageReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodRespVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.DistributorWithdrawalMethodUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorproduct.vo.AppDistributorProductRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesPageReqVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesPageRespVO; +import co.yixiang.yshop.module.distributor.controller.app.distributorwages.vo.AppDistributorWagesWithdrawReqVO; +import co.yixiang.yshop.module.distributor.convert.distributorwithdrawalmethod.DistributorWithdrawalMethodConvert; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributor.DistributorDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import co.yixiang.yshop.module.distributor.enums.DistributorWagesLogTypeEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorWithdrawalMethodTypeEnum; +import co.yixiang.yshop.module.distributor.service.distributor.DistributorService; +import co.yixiang.yshop.module.distributor.service.distributorlevel.DistributorLevelFacade; +import co.yixiang.yshop.module.distributor.service.distributorwageslog.DistributorWagesLogService; +import co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod.DistributorWithdrawalMethodService; +import co.yixiang.yshop.module.system.api.logger.dto.OperateLogCreateReqDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +@Service +@Validated +public class DistributorWagesFacadeImpl implements DistributorWagesFacade { + + @Resource + private DistributorService distributorService; + + @Resource + private DistributorWagesLogService distributorWagesLogService; + + @Resource + private DistributorWithdrawalMethodService distributorWithdrawalMethodService; + + @Resource + private DistributorWagesService distributorWagesService; + + @Resource + private DistributorLevelFacade distributorLevelFacade; + + /** + * 我的佣金总计 + * @param createTime 时间 + * @return 佣金 + */ + @Override + public AppDistributorWagesPageRespVO getWages(LocalDateTime[] createTime) { + AppDistributorWagesPageRespVO respVO = new AppDistributorWagesPageRespVO(); + + // 获取分销商 + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + DistributorWagesLogExportReqVO wagesLogExportReqVO = new DistributorWagesLogExportReqVO(); + wagesLogExportReqVO.setDistributorId(distributorDO.getId()); + wagesLogExportReqVO.setType(DistributorWagesLogTypeEnum.COMPLETE.getType()); + wagesLogExportReqVO.setCreateTime(createTime); + // 收入 只有已入账 + DistributorWagesLogDO incomeSum = distributorWagesLogService.sumAmount(wagesLogExportReqVO); + if (incomeSum != null) { + respVO.setIncome(incomeSum.getAmount()); + } + wagesLogExportReqVO.setType(DistributorWagesLogTypeEnum.WITHDRAW_COMPLETE.getType()); + // 支出 只有已提现 + + DistributorWagesLogDO expensesSum = distributorWagesLogService.sumAmount(wagesLogExportReqVO); + if (expensesSum != null) { + respVO.setExpenses(expensesSum.getAmount()); + } + + return respVO; + } + + @Override + public PageResult getWagesPage(AppDistributorWagesPageReqVO reqVO) { + // 获取分销商 + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + + DistributorWagesLogPageReqVO pageReqVO = BeanUtil.copyProperties(reqVO, DistributorWagesLogPageReqVO.class); + pageReqVO.setDistributorId(distributorDO.getId()); + return distributorWagesLogService.getWagesLogPage(pageReqVO); + } + + @Override + public void withdraw(AppDistributorWagesWithdrawReqVO reqVO) { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + DistributorWithdrawalMethodDO withdrawalMethod = distributorWithdrawalMethodService.getWithdrawalMethod(reqVO.getId()); + // 匹配提现方式与用户 + if (!withdrawalMethod.getDistributorId().equals(distributorDO.getId())) { + throw exception(WITHDRAWAL_METHOD_EXISTS_USER); + } + // 获取用户佣金余额 + DistributorWagesDO distributorWagesDO = distributorWagesService.getWagesByDistributorId(distributorDO.getId()); + // 判断佣金小于提现金额 + if (distributorWagesDO.getAmount().compareTo(reqVO.getAmount()) < 0) { + throw exception(WITHDRAWAL_AMOUNT_INSUFFICIENT); + } + + if (withdrawalMethod.getType().equals(DistributorWithdrawalMethodTypeEnum.AIL_PAY.getType()) && StrUtil.isEmpty(withdrawalMethod.getAccountNum())) { + throw exception(WITHDRAWAL_ALI_NOT_EXISTS); + } + + if (!distributorWagesService.reduceAmount(distributorDO.getId(), reqVO.getAmount())) { + throw exception(WITHDRAWAL_AMOUNT_INSUFFICIENT); + } + + // 保存记录 + DistributorWagesLogCreateReqVO distributorWagesLogCreateReqVO = new DistributorWagesLogCreateReqVO(); + distributorWagesLogCreateReqVO.setWagesId(distributorWagesDO.getId()); + distributorWagesLogCreateReqVO.setUserId(userId); + + distributorWagesLogCreateReqVO.setType(DistributorWagesLogTypeEnum.WITHDRAW_WAIT.getType()); + distributorWagesLogCreateReqVO.setAmount(reqVO.getAmount()); + distributorWagesLogCreateReqVO.setDistributorId(distributorDO.getId()); + distributorWagesLogCreateReqVO.setDistributorName(distributorDO.getRealName()); + distributorWagesLogCreateReqVO.setMethodType(withdrawalMethod.getType()); + distributorWagesLogService.createWagesLog(distributorWagesLogCreateReqVO); + + } + + @Override + public void updateWithdrawalMethod(DistributorWithdrawalMethodUpdateReqVO updateReqVO) { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + DistributorWithdrawalMethodDO withdrawalMethod = distributorWithdrawalMethodService.getWithdrawalMethod(updateReqVO.getId()); + // 匹配提现方式与用户 + if (!withdrawalMethod.getDistributorId().equals(distributorDO.getId())) { + throw exception(WITHDRAWAL_METHOD_EXISTS_USER); + } + distributorWithdrawalMethodService.updateWithdrawalMethod(updateReqVO); + } + + @Override + public List getWithdrawalMethodList() { + Long userId = getLoginUserId(); + DistributorDO distributorDO = distributorService.getDistributorByUserId(userId); + return DistributorWithdrawalMethodConvert.INSTANCE.convertList(distributorWithdrawalMethodService.getWithdrawalMethodList(new DistributorWithdrawalMethodExportReqVO().setDistributorId(distributorDO.getId()))); + } + + @Override + public void saveWages(DistributorOrderDO x) { + if (x.getSuperiorIdP1() != null) { + DistributorWagesDO distributorWages = distributorWagesService.getWagesByDistributorId(x.getSuperiorIdP1()); + distributorWagesService.increaseRefuseAmount(x.getSuperiorIdP1(), x.getFirstAmount()); + DistributorWagesLogCreateReqVO createReqVO = new DistributorWagesLogCreateReqVO(); + createReqVO.setWagesId(distributorWages.getId()); + createReqVO.setUserId(x.getUserId()); + createReqVO.setUserName(x.getUserName()); + createReqVO.setType(DistributorWagesLogTypeEnum.WAIT.getType()); + createReqVO.setAmount(x.getFirstAmount()); + createReqVO.setDistributorId(x.getSuperiorIdP1()); + createReqVO.setDistributorName(x.getSuperiorNameP1()); + createReqVO.setDistributorOrderId(x.getId()); + createReqVO.setOrderId(x.getOrderId()); + distributorWagesLogService.createWagesLog(createReqVO); + } + if (x.getSuperiorIdP2() != null) { + DistributorWagesDO distributorWages = distributorWagesService.getWagesByDistributorId(x.getSuperiorIdP2()); + distributorWagesService.increaseRefuseAmount(x.getSuperiorIdP2(), x.getSecondAmount()); + DistributorWagesLogCreateReqVO createReqVO = new DistributorWagesLogCreateReqVO(); + createReqVO.setWagesId(distributorWages.getId()); + createReqVO.setUserId(x.getUserId()); + createReqVO.setUserName(x.getUserName()); + createReqVO.setType(DistributorWagesLogTypeEnum.WAIT.getType()); + createReqVO.setAmount(x.getSecondAmount()); + createReqVO.setDistributorId(x.getSuperiorIdP2()); + createReqVO.setDistributorName(x.getSuperiorNameP2()); + createReqVO.setDistributorOrderId(x.getId()); + createReqVO.setOrderId(x.getOrderId()); + distributorWagesLogService.createWagesLog(createReqVO); + } + + + } + + @Override + public void settlementWages(DistributorOrderDO x) { + if (x.getSuperiorIdP1() != null) { + distributorWagesService.settlementAmount(x.getSuperiorIdP1(), x.getFirstAmount()); + distributorWagesLogService.updateWagesLogType(x.getSuperiorIdP1(), x.getId(), DistributorWagesLogTypeEnum.COMPLETE.getType()); + distributorService.addAmount(x.getSuperiorIdP1(), x.getProductPrice(), x.getFirstAmount()); + distributorLevelFacade.levelUp(x.getSuperiorIdP1()); + + } + if (x.getSuperiorIdP2() != null) { + distributorWagesService.settlementAmount(x.getSuperiorIdP2(), x.getSecondAmount()); + distributorWagesLogService.updateWagesLogType(x.getSuperiorIdP2(), x.getId(), DistributorWagesLogTypeEnum.COMPLETE.getType()); + distributorService.addAmount(x.getSuperiorIdP2(), x.getProductPrice(), x.getSecondAmount()); + distributorLevelFacade.levelUp(x.getSuperiorIdP2()); + } + } + + @Override + public void cancelWages(List distributorOrderIds) { + List distributorWagesLogDOS = distributorWagesLogService.getWagesLogList(new DistributorWagesLogExportReqVO().setDistributorOrderIds(distributorOrderIds)); + for (DistributorWagesLogDO distributorWagesLogDO : distributorWagesLogDOS) { + // 判断是待入账状态 + if (distributorWagesLogDO.getType().equals(DistributorWagesLogTypeEnum.WAIT.getType())) { + DistributorWagesLogUpdateReqVO distributorWagesLogUpdateReqVO = new DistributorWagesLogUpdateReqVO(); + distributorWagesLogUpdateReqVO.setId(distributorWagesLogDO.getId()).setType(DistributorWagesLogTypeEnum.CANCEL.getType()); + // 更新记录为取消 + distributorWagesLogService.updateWagesLog(distributorWagesLogUpdateReqVO); + // 退款佣金 + distributorWagesService.reduceRefuseAmount(distributorWagesLogDO.getDistributorId(), distributorWagesLogDO.getAmount()); + } + } + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesService.java new file mode 100644 index 0000000..3783499 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesService.java @@ -0,0 +1,93 @@ +package co.yixiang.yshop.module.distributor.service.distributorwages; + +import java.math.BigDecimal; +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商佣金 Service 接口 + * + * @author admin + */ +public interface DistributorWagesService { + + /** + * 创建分销商佣金 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWages(@Valid DistributorWagesCreateReqVO createReqVO); + + /** + * 更新分销商佣金 + * + * @param updateReqVO 更新信息 + */ + void updateWages(@Valid DistributorWagesUpdateReqVO updateReqVO); + + /** + * 删除分销商佣金 + * + * @param id 编号 + */ + void deleteWages(Long id); + + /** + * 获得分销商佣金 + * + * @param id 编号 + * @return 分销商佣金 + */ + DistributorWagesDO getWages(Long id); + + /** + * 获得分销商佣金列表 + * + * @param ids 编号 + * @return 分销商佣金列表 + */ + List getWagesList(Collection ids); + + /** + * 获得分销商佣金分页 + * + * @param pageReqVO 分页查询 + * @return 分销商佣金分页 + */ + PageResult getWagesPage(DistributorWagesPageReqVO pageReqVO); + + /** + * 获得分销商佣金列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商佣金列表 + */ + List getWagesList(DistributorWagesExportReqVO exportReqVO); + + /** + * 通过代理商id获取佣金余额 + * @param id 代理商id + * @return 佣金 + */ + DistributorWagesDO getWagesByDistributorId(Long id); + + // 减少余额 + Boolean reduceAmount(Long id, BigDecimal amount); + + // 减少待入账余额 + void reduceRefuseAmount(Long id, BigDecimal amount); + + // 增加待入账 + void increaseRefuseAmount(Long id, BigDecimal amount); + + // 结算余额 + void settlementAmount(Long id, BigDecimal amount); + + // 增加余额 + void increaseAmount(Long id, BigDecimal amount); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImpl.java new file mode 100644 index 0000000..592d244 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImpl.java @@ -0,0 +1,115 @@ +package co.yixiang.yshop.module.distributor.service.distributorwages; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributorwages.DistributorWagesConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorwages.DistributorWagesMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商佣金 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorWagesServiceImpl implements DistributorWagesService { + + @Resource + private DistributorWagesMapper wagesMapper; + + @Override + public Long createWages(DistributorWagesCreateReqVO createReqVO) { + // 插入 + DistributorWagesDO wages = DistributorWagesConvert.INSTANCE.convert(createReqVO); + wagesMapper.insert(wages); + // 返回 + return wages.getId(); + } + + @Override + public void updateWages(DistributorWagesUpdateReqVO updateReqVO) { + // 校验存在 + validateWagesExists(updateReqVO.getId()); + // 更新 + DistributorWagesDO updateObj = DistributorWagesConvert.INSTANCE.convert(updateReqVO); + wagesMapper.updateById(updateObj); + } + + @Override + public void deleteWages(Long id) { + // 校验存在 + validateWagesExists(id); + // 删除 + wagesMapper.deleteById(id); + } + + private void validateWagesExists(Long id) { + if (wagesMapper.selectById(id) == null) { + throw exception(WAGES_NOT_EXISTS); + } + } + + @Override + public DistributorWagesDO getWages(Long id) { + return wagesMapper.selectById(id); + } + + @Override + public List getWagesList(Collection ids) { + return wagesMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWagesPage(DistributorWagesPageReqVO pageReqVO) { + return wagesMapper.selectPage(pageReqVO); + } + + @Override + public List getWagesList(DistributorWagesExportReqVO exportReqVO) { + return wagesMapper.selectList(exportReqVO); + } + + @Override + public DistributorWagesDO getWagesByDistributorId(Long id) { + return wagesMapper.selectOne(DistributorWagesDO::getDistributorId, id); + } + + @Override + public Boolean reduceAmount(Long id, BigDecimal amount) { + int i = wagesMapper.reduceAmount(id, amount); + return i > 0; + } + + @Override + public void reduceRefuseAmount(Long id, BigDecimal amount) { + wagesMapper.reduceRefuseAmount(id, amount); + } + + @Override + public void increaseRefuseAmount(Long id, BigDecimal amount) { + wagesMapper.increaseRefuseAmount(id, amount); + } + + @Override + public void settlementAmount(Long id, BigDecimal amount) { + wagesMapper.settlementAmount(id, amount); + } + + + @Override + public void increaseAmount(Long id, BigDecimal amount) { + wagesMapper.increaseAmount(id, amount); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacade.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacade.java new file mode 100644 index 0000000..d2d1ab5 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacade.java @@ -0,0 +1,16 @@ +package co.yixiang.yshop.module.distributor.service.distributorwageslog; + +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogVerifyReqVO; + +/** + * 分销商佣金记录 Service 接口 + * + * @author admin + */ +public interface DistributorWagesLogFacade { + + // 审核 + void verify(DistributorWagesLogVerifyReqVO reqVO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacadeImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacadeImpl.java new file mode 100644 index 0000000..2fafbf7 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogFacadeImpl.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.distributor.service.distributorwageslog; + +import co.yixiang.yshop.module.distributor.controller.admin.distributor.vo.DistributorApplyReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogUpdateReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.DistributorWagesLogVerifyReqVO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.module.distributor.enums.DistributorWagesLogTypeEnum; +import co.yixiang.yshop.module.distributor.enums.DistributorWithdrawalMethodTypeEnum; +import co.yixiang.yshop.module.distributor.service.distributorwages.DistributorWagesService; +import co.yixiang.yshop.module.member.api.user.MemberUserNowMoneyApiImpl; +import co.yixiang.yshop.module.member.api.user.dto.IncreaseNowMoneyDTO; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class DistributorWagesLogFacadeImpl implements DistributorWagesLogFacade { + + @Resource + private DistributorWagesLogService distributorWagesLogService; + + @Resource + private MemberUserNowMoneyApiImpl memberUserNowMoneyApi; + + @Resource + private DistributorWagesService distributorWagesService; + + @Override + public void verify(DistributorWagesLogVerifyReqVO reqVO) { + DistributorWagesLogDO wagesLog = distributorWagesLogService.getWagesLog(reqVO.getId()); + // 更新状态 + DistributorWagesLogUpdateReqVO updateReqVO = new DistributorWagesLogUpdateReqVO(); + updateReqVO.setId(reqVO.getId()); + updateReqVO.setType(reqVO.getType()); + updateReqVO.setContent(reqVO.getContent()); + distributorWagesLogService.updateWagesLog(updateReqVO); + + // 判断是否为拒绝 + if (reqVO.getType().equals(DistributorWagesLogTypeEnum.WITHDRAW_FAIL.getType())) { + // 退回佣金 + distributorWagesService.increaseAmount(wagesLog.getDistributorId(), wagesLog.getAmount()); + } + + // 判断是否为通过 并且为余额 + if (reqVO.getType().equals(DistributorWagesLogTypeEnum.WITHDRAW_COMPLETE.getType()) && wagesLog.getMethodType().equals(DistributorWithdrawalMethodTypeEnum.BALANCE.getType())) { + IncreaseNowMoneyDTO increaseNowMoneyDTO = new IncreaseNowMoneyDTO(); + increaseNowMoneyDTO.setId(wagesLog.getUserId()); + increaseNowMoneyDTO.setAmount(wagesLog.getAmount()); + increaseNowMoneyDTO.setLink(wagesLog.getId().toString()); + increaseNowMoneyDTO.setMark("佣金提现" + increaseNowMoneyDTO.getAmount() + "元"); + memberUserNowMoneyApi.increaseNowMoney(increaseNowMoneyDTO); + } + } +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogService.java new file mode 100644 index 0000000..278e696 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogService.java @@ -0,0 +1,79 @@ +package co.yixiang.yshop.module.distributor.service.distributorwageslog; + +import java.util.*; +import javax.validation.*; + +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.DistributorOrderExportReqVO; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商佣金记录 Service 接口 + * + * @author admin + */ +public interface DistributorWagesLogService { + + /** + * 创建分销商佣金记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWagesLog(@Valid DistributorWagesLogCreateReqVO createReqVO); + + /** + * 更新分销商佣金记录 + * + * @param updateReqVO 更新信息 + */ + void updateWagesLog(@Valid DistributorWagesLogUpdateReqVO updateReqVO); + + /** + * 删除分销商佣金记录 + * + * @param id 编号 + */ + void deleteWagesLog(Long id); + + /** + * 获得分销商佣金记录 + * + * @param id 编号 + * @return 分销商佣金记录 + */ + DistributorWagesLogDO getWagesLog(Long id); + + /** + * 获得分销商佣金记录列表 + * + * @param ids 编号 + * @return 分销商佣金记录列表 + */ + List getWagesLogList(Collection ids); + + /** + * 获得分销商佣金记录分页 + * + * @param pageReqVO 分页查询 + * @return 分销商佣金记录分页 + */ + PageResult getWagesLogPage(DistributorWagesLogPageReqVO pageReqVO); + + /** + * 获得分销商佣金记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商佣金记录列表 + */ + List getWagesLogList(DistributorWagesLogExportReqVO exportReqVO); + + + DistributorWagesLogDO sumAmount(DistributorWagesLogExportReqVO exportReqVO); + + + void updateWagesLogType(Long distributorId, Long distributorOrderId, Integer status); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImpl.java new file mode 100644 index 0000000..dd39993 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImpl.java @@ -0,0 +1,105 @@ +package co.yixiang.yshop.module.distributor.service.distributorwageslog; + +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.query.QueryWrapperX; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.sql.Wrapper; +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributorwageslog.DistributorWagesLogConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorwageslog.DistributorWagesLogMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商佣金记录 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorWagesLogServiceImpl implements DistributorWagesLogService { + + @Resource + private DistributorWagesLogMapper wagesLogMapper; + + @Override + public Long createWagesLog(DistributorWagesLogCreateReqVO createReqVO) { + // 插入 + DistributorWagesLogDO wagesLog = DistributorWagesLogConvert.INSTANCE.convert(createReqVO); + wagesLogMapper.insert(wagesLog); + // 返回 + return wagesLog.getId(); + } + + @Override + public void updateWagesLog(DistributorWagesLogUpdateReqVO updateReqVO) { + // 校验存在 + validateWagesLogExists(updateReqVO.getId()); + // 更新 + DistributorWagesLogDO updateObj = DistributorWagesLogConvert.INSTANCE.convert(updateReqVO); + wagesLogMapper.updateById(updateObj); + } + + @Override + public void deleteWagesLog(Long id) { + // 校验存在 + validateWagesLogExists(id); + // 删除 + wagesLogMapper.deleteById(id); + } + + private void validateWagesLogExists(Long id) { + if (wagesLogMapper.selectById(id) == null) { + throw exception(WAGES_LOG_NOT_EXISTS); + } + } + + @Override + public DistributorWagesLogDO getWagesLog(Long id) { + return wagesLogMapper.selectById(id); + } + + @Override + public List getWagesLogList(Collection ids) { + return wagesLogMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWagesLogPage(DistributorWagesLogPageReqVO pageReqVO) { + return wagesLogMapper.selectPage(pageReqVO); + } + + @Override + public List getWagesLogList(DistributorWagesLogExportReqVO exportReqVO) { + return wagesLogMapper.selectList(exportReqVO); + } + + @Override + public DistributorWagesLogDO sumAmount(DistributorWagesLogExportReqVO exportReqVO) { + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX.select("sum(amount) as amount"); + queryWrapperX.betweenIfPresent("create_time", exportReqVO.getCreateTime()); + queryWrapperX.eqIfPresent("distributor_id",exportReqVO.getDistributorId()); + queryWrapperX.eqIfPresent("type", exportReqVO.getType()); + return wagesLogMapper.selectOne(queryWrapperX); + } + + @Override + public void updateWagesLogType(Long distributorId, Long distributorOrderId, Integer type) { + wagesLogMapper.update(new DistributorWagesLogDO() + .setType(type), new LambdaQueryWrapperX() + .eq(DistributorWagesLogDO::getDistributorId, distributorId) + .eq(DistributorWagesLogDO::getDistributorOrderId, distributorOrderId) + ); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodService.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodService.java new file mode 100644 index 0000000..790a586 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodService.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 分销商提现方式 Service 接口 + * + * @author admin + */ +public interface DistributorWithdrawalMethodService { + + /** + * 创建分销商提现方式 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWithdrawalMethod(@Valid DistributorWithdrawalMethodCreateReqVO createReqVO); + + /** + * 更新分销商提现方式 + * + * @param updateReqVO 更新信息 + */ + void updateWithdrawalMethod(@Valid DistributorWithdrawalMethodUpdateReqVO updateReqVO); + + /** + * 删除分销商提现方式 + * + * @param id 编号 + */ + void deleteWithdrawalMethod(Long id); + + /** + * 获得分销商提现方式 + * + * @param id 编号 + * @return 分销商提现方式 + */ + DistributorWithdrawalMethodDO getWithdrawalMethod(Long id); + + /** + * 获得分销商提现方式列表 + * + * @param ids 编号 + * @return 分销商提现方式列表 + */ + List getWithdrawalMethodList(Collection ids); + + /** + * 获得分销商提现方式分页 + * + * @param pageReqVO 分页查询 + * @return 分销商提现方式分页 + */ + PageResult getWithdrawalMethodPage(DistributorWithdrawalMethodPageReqVO pageReqVO); + + /** + * 获得分销商提现方式列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 分销商提现方式列表 + */ + List getWithdrawalMethodList(DistributorWithdrawalMethodExportReqVO exportReqVO); + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImpl.java b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImpl.java new file mode 100644 index 0000000..471c8cb --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImpl.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.distributor.convert.distributorwithdrawalmethod.DistributorWithdrawalMethodConvert; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorwithdrawalmethod.DistributorWithdrawalMethodMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; + +/** + * 分销商提现方式 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DistributorWithdrawalMethodServiceImpl implements DistributorWithdrawalMethodService { + + @Resource + private DistributorWithdrawalMethodMapper withdrawalMethodMapper; + + @Override + public Long createWithdrawalMethod(DistributorWithdrawalMethodCreateReqVO createReqVO) { + // 插入 + DistributorWithdrawalMethodDO withdrawalMethod = DistributorWithdrawalMethodConvert.INSTANCE.convert(createReqVO); + withdrawalMethodMapper.insert(withdrawalMethod); + // 返回 + return withdrawalMethod.getId(); + } + + @Override + public void updateWithdrawalMethod(DistributorWithdrawalMethodUpdateReqVO updateReqVO) { + // 校验存在 + validateWithdrawalMethodExists(updateReqVO.getId()); + // 更新 + DistributorWithdrawalMethodDO updateObj = DistributorWithdrawalMethodConvert.INSTANCE.convert(updateReqVO); + withdrawalMethodMapper.updateById(updateObj); + } + + @Override + public void deleteWithdrawalMethod(Long id) { + // 校验存在 + validateWithdrawalMethodExists(id); + // 删除 + withdrawalMethodMapper.deleteById(id); + } + + private void validateWithdrawalMethodExists(Long id) { + if (withdrawalMethodMapper.selectById(id) == null) { + throw exception(WITHDRAWAL_METHOD_NOT_EXISTS); + } + } + + @Override + public DistributorWithdrawalMethodDO getWithdrawalMethod(Long id) { + return withdrawalMethodMapper.selectById(id); + } + + @Override + public List getWithdrawalMethodList(Collection ids) { + return withdrawalMethodMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWithdrawalMethodPage(DistributorWithdrawalMethodPageReqVO pageReqVO) { + return withdrawalMethodMapper.selectPage(pageReqVO); + } + + @Override + public List getWithdrawalMethodList(DistributorWithdrawalMethodExportReqVO exportReqVO) { + return withdrawalMethodMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributor/DistributorMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributor/DistributorMapper.xml new file mode 100644 index 0000000..802f454 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributor/DistributorMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributordynamics/DistributorDynamicsMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributordynamics/DistributorDynamicsMapper.xml new file mode 100644 index 0000000..97c08f6 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributordynamics/DistributorDynamicsMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorlevel/DistributorLevelMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorlevel/DistributorLevelMapper.xml new file mode 100644 index 0000000..4150b18 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorlevel/DistributorLevelMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributororder/DistributorOrderMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributororder/DistributorOrderMapper.xml new file mode 100644 index 0000000..6288b3c --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributororder/DistributorOrderMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributoruser/DistributorUserMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributoruser/DistributorUserMapper.xml new file mode 100644 index 0000000..dae0e40 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributoruser/DistributorUserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwages/DistributorWagesMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwages/DistributorWagesMapper.xml new file mode 100644 index 0000000..c4ccffd --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwages/DistributorWagesMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwageslog/DistributorWagesLogMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwageslog/DistributorWagesLogMapper.xml new file mode 100644 index 0000000..a9aada5 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwageslog/DistributorWagesLogMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.xml b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.xml new file mode 100644 index 0000000..0bb16a8 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/main/resources/mapper/distributorwithdrawalmethod/DistributorWithdrawalMethodMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributor/DistributorServiceImplTest.java new file mode 100644 index 0000000..e69de29 diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImplTest.java new file mode 100644 index 0000000..455c266 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributordynamics/DistributorDynamicsServiceImplTest.java @@ -0,0 +1,183 @@ +package co.yixiang.yshop.module.distributor.service.distributordynamics; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributordynamics.DistributorDynamicsDO; +import co.yixiang.yshop.module.distributor.dal.mysql.distributordynamics.DistributorDynamicsMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link DistributorDynamicsServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(DistributorDynamicsServiceImpl.class) +public class DistributorDynamicsServiceImplTest extends BaseDbUnitTest { + + @Resource + private DistributorDynamicsServiceImpl dynamicsService; + + @Resource + private DistributorDynamicsMapper dynamicsMapper; + + @Test + public void testCreateDynamics_success() { + // 准备参数 + DistributorDynamicsCreateReqVO reqVO = randomPojo(DistributorDynamicsCreateReqVO.class); + + // 调用 + Long dynamicsId = dynamicsService.createDynamics(reqVO); + // 断言 + assertNotNull(dynamicsId); + // 校验记录的属性是否正确 + DistributorDynamicsDO dynamics = dynamicsMapper.selectById(dynamicsId); + assertPojoEquals(reqVO, dynamics); + } + + @Test + public void testUpdateDynamics_success() { + // mock 数据 + DistributorDynamicsDO dbDynamics = randomPojo(DistributorDynamicsDO.class); + dynamicsMapper.insert(dbDynamics);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DistributorDynamicsUpdateReqVO reqVO = randomPojo(DistributorDynamicsUpdateReqVO.class, o -> { + o.setId(dbDynamics.getId()); // 设置更新的 ID + }); + + // 调用 + dynamicsService.updateDynamics(reqVO); + // 校验是否更新正确 + DistributorDynamicsDO dynamics = dynamicsMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dynamics); + } + + @Test + public void testUpdateDynamics_notExists() { + // 准备参数 + DistributorDynamicsUpdateReqVO reqVO = randomPojo(DistributorDynamicsUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> dynamicsService.updateDynamics(reqVO), DYNAMICS_NOT_EXISTS); + } + + @Test + public void testDeleteDynamics_success() { + // mock 数据 + DistributorDynamicsDO dbDynamics = randomPojo(DistributorDynamicsDO.class); + dynamicsMapper.insert(dbDynamics);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDynamics.getId(); + + // 调用 + dynamicsService.deleteDynamics(id); + // 校验数据不存在了 + assertNull(dynamicsMapper.selectById(id)); + } + + @Test + public void testDeleteDynamics_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> dynamicsService.deleteDynamics(id), DYNAMICS_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetDynamicsPage() { + // mock 数据 + DistributorDynamicsDO dbDynamics = randomPojo(DistributorDynamicsDO.class, o -> { // 等会查询到 + o.setType(null); + o.setDistributorId(null); + o.setDistributorName(null); + o.setContent(null); + o.setCreateTime(null); + }); + dynamicsMapper.insert(dbDynamics); + // 测试 type 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setType(null))); + // 测试 distributorId 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setDistributorId(null))); + // 测试 distributorName 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setDistributorName(null))); + // 测试 content 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setContent(null))); + // 测试 createTime 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setCreateTime(null))); + // 准备参数 + DistributorDynamicsPageReqVO reqVO = new DistributorDynamicsPageReqVO(); + reqVO.setType(null); + reqVO.setDistributorId(null); + reqVO.setDistributorName(null); + reqVO.setContent(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = dynamicsService.getDynamicsPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDynamics, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetDynamicsList() { + // mock 数据 + DistributorDynamicsDO dbDynamics = randomPojo(DistributorDynamicsDO.class, o -> { // 等会查询到 + o.setType(null); + o.setDistributorId(null); + o.setDistributorName(null); + o.setContent(null); + o.setCreateTime(null); + }); + dynamicsMapper.insert(dbDynamics); + // 测试 type 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setType(null))); + // 测试 distributorId 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setDistributorId(null))); + // 测试 distributorName 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setDistributorName(null))); + // 测试 content 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setContent(null))); + // 测试 createTime 不匹配 + dynamicsMapper.insert(cloneIgnoreId(dbDynamics, o -> o.setCreateTime(null))); + // 准备参数 + DistributorDynamicsExportReqVO reqVO = new DistributorDynamicsExportReqVO(); + reqVO.setType(null); + reqVO.setDistributorId(null); + reqVO.setDistributorName(null); + reqVO.setContent(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = dynamicsService.getDynamicsList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDynamics, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorlevel/DistributorLevelServiceImplTest.java new file mode 100644 index 0000000..e69de29 diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImplTest.java new file mode 100644 index 0000000..26bbf5b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributororder/DistributorOrderServiceImplTest.java @@ -0,0 +1,335 @@ +package co.yixiang.yshop.module.distributor.service.distributororder; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.distributor.controller.admin.distributororder.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributororder.DistributorOrderDO; +import co.yixiang.yshop.module.distributor.dal.mysql.distributororder.DistributorOrderMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link DistributorOrderServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(DistributorOrderServiceImpl.class) +public class DistributorOrderServiceImplTest extends BaseDbUnitTest { + + @Resource + private DistributorOrderServiceImpl orderService; + + @Resource + private DistributorOrderMapper orderMapper; + + @Test + public void testCreateOrder_success() { + // 准备参数 + DistributorOrderCreateReqVO reqVO = randomPojo(DistributorOrderCreateReqVO.class); + + // 调用 + Long orderId = orderService.createOrder(reqVO); + // 断言 + assertNotNull(orderId); + // 校验记录的属性是否正确 + DistributorOrderDO order = orderMapper.selectById(orderId); + assertPojoEquals(reqVO, order); + } + + @Test + public void testUpdateOrder_success() { + // mock 数据 + DistributorOrderDO dbOrder = randomPojo(DistributorOrderDO.class); + orderMapper.insert(dbOrder);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DistributorOrderUpdateReqVO reqVO = randomPojo(DistributorOrderUpdateReqVO.class, o -> { + o.setId(dbOrder.getId()); // 设置更新的 ID + }); + + // 调用 + orderService.updateOrder(reqVO); + // 校验是否更新正确 + DistributorOrderDO order = orderMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, order); + } + + @Test + public void testUpdateOrder_notExists() { + // 准备参数 + DistributorOrderUpdateReqVO reqVO = randomPojo(DistributorOrderUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> orderService.updateOrder(reqVO), ORDER_NOT_EXISTS); + } + + @Test + public void testDeleteOrder_success() { + // mock 数据 + DistributorOrderDO dbOrder = randomPojo(DistributorOrderDO.class); + orderMapper.insert(dbOrder);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbOrder.getId(); + + // 调用 + orderService.deleteOrder(id); + // 校验数据不存在了 + assertNull(orderMapper.selectById(id)); + } + + @Test + public void testDeleteOrder_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> orderService.deleteOrder(id), ORDER_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetOrderPage() { + // mock 数据 + DistributorOrderDO dbOrder = randomPojo(DistributorOrderDO.class, o -> { // 等会查询到 + o.setCreateTime(null); + o.setSettlementTime(null); + o.setOid(null); + o.setOrderId(null); + o.setStatus(null); + o.setDistributionRule(null); + o.setDistributionPurchase(null); + o.setDistributionProductSettlement(null); + o.setDistributionWagesSettlement(null); + o.setUserId(null); + o.setUserName(null); + o.setProductId(null); + o.setProductAttrValueId(null); + o.setProductName(null); + o.setProductPrice(null); + o.setDetailId(null); + o.setSuperiorIdP1(null); + o.setSuperiorNameP1(null); + o.setSuperiorIdP2(null); + o.setSuperiorNameP2(null); + o.setFirstWages(null); + o.setSecondWages(null); + o.setFirstAmount(null); + o.setSecondAmount(null); + }); + orderMapper.insert(dbOrder); + // 测试 createTime 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setCreateTime(null))); + // 测试 settlementTime 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSettlementTime(null))); + // 测试 oid 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setOid(null))); + // 测试 orderId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setOrderId(null))); + // 测试 status 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setStatus(null))); + // 测试 distributionRule 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionRule(null))); + // 测试 distributionPurchase 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionPurchase(null))); + // 测试 distributionProductSettlement 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionProductSettlement(null))); + // 测试 distributionWagesSettlement 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionWagesSettlement(null))); + // 测试 userId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setUserId(null))); + // 测试 userName 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setUserName(null))); + // 测试 productId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductId(null))); + // 测试 productAttrValueId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductAttrValueId(null))); + // 测试 productName 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductName(null))); + // 测试 productPrice 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductPrice(null))); + // 测试 detailId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDetailId(null))); + // 测试 superiorIdP1 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorIdP1(null))); + // 测试 superiorNameP1 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorNameP1(null))); + // 测试 superiorIdP2 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorIdP2(null))); + // 测试 superiorNameP2 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorNameP2(null))); + // 测试 firstWages 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setFirstWages(null))); + // 测试 secondWages 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSecondWages(null))); + // 测试 firstAmount 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setFirstAmount(null))); + // 测试 secondAmount 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSecondAmount(null))); + // 准备参数 + DistributorOrderPageReqVO reqVO = new DistributorOrderPageReqVO(); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setSettlementTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setOid(null); + reqVO.setOrderId(null); + reqVO.setStatus(null); + reqVO.setDistributionRule(null); + reqVO.setDistributionPurchase(null); + reqVO.setDistributionProductSettlement(null); + reqVO.setDistributionWagesSettlement(null); + reqVO.setUserId(null); + reqVO.setUserName(null); + reqVO.setProductId(null); + reqVO.setProductAttrValueId(null); + reqVO.setProductName(null); + reqVO.setProductPrice(null); + reqVO.setDetailId(null); + reqVO.setSuperiorIdP1(null); + reqVO.setSuperiorNameP1(null); + reqVO.setSuperiorIdP2(null); + reqVO.setSuperiorNameP2(null); + reqVO.setFirstWages(null); + reqVO.setSecondWages(null); + reqVO.setFirstAmount(null); + reqVO.setSecondAmount(null); + + // 调用 + PageResult pageResult = orderService.getOrderPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbOrder, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetOrderList() { + // mock 数据 + DistributorOrderDO dbOrder = randomPojo(DistributorOrderDO.class, o -> { // 等会查询到 + o.setCreateTime(null); + o.setSettlementTime(null); + o.setOid(null); + o.setOrderId(null); + o.setStatus(null); + o.setDistributionRule(null); + o.setDistributionPurchase(null); + o.setDistributionProductSettlement(null); + o.setDistributionWagesSettlement(null); + o.setUserId(null); + o.setUserName(null); + o.setProductId(null); + o.setProductAttrValueId(null); + o.setProductName(null); + o.setProductPrice(null); + o.setDetailId(null); + o.setSuperiorIdP1(null); + o.setSuperiorNameP1(null); + o.setSuperiorIdP2(null); + o.setSuperiorNameP2(null); + o.setFirstWages(null); + o.setSecondWages(null); + o.setFirstAmount(null); + o.setSecondAmount(null); + }); + orderMapper.insert(dbOrder); + // 测试 createTime 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setCreateTime(null))); + // 测试 settlementTime 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSettlementTime(null))); + // 测试 oid 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setOid(null))); + // 测试 orderId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setOrderId(null))); + // 测试 status 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setStatus(null))); + // 测试 distributionRule 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionRule(null))); + // 测试 distributionPurchase 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionPurchase(null))); + // 测试 distributionProductSettlement 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionProductSettlement(null))); + // 测试 distributionWagesSettlement 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDistributionWagesSettlement(null))); + // 测试 userId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setUserId(null))); + // 测试 userName 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setUserName(null))); + // 测试 productId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductId(null))); + // 测试 productAttrValueId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductAttrValueId(null))); + // 测试 productName 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductName(null))); + // 测试 productPrice 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setProductPrice(null))); + // 测试 detailId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setDetailId(null))); + // 测试 superiorIdP1 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorIdP1(null))); + // 测试 superiorNameP1 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorNameP1(null))); + // 测试 superiorIdP2 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorIdP2(null))); + // 测试 superiorNameP2 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSuperiorNameP2(null))); + // 测试 firstWages 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setFirstWages(null))); + // 测试 secondWages 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSecondWages(null))); + // 测试 firstAmount 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setFirstAmount(null))); + // 测试 secondAmount 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setSecondAmount(null))); + // 准备参数 + DistributorOrderExportReqVO reqVO = new DistributorOrderExportReqVO(); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setSettlementTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setOid(null); + reqVO.setOrderId(null); + reqVO.setStatus(null); + reqVO.setDistributionRule(null); + reqVO.setDistributionPurchase(null); + reqVO.setDistributionProductSettlement(null); + reqVO.setDistributionWagesSettlement(null); + reqVO.setUserId(null); + reqVO.setUserName(null); + reqVO.setProductId(null); + reqVO.setProductAttrValueId(null); + reqVO.setProductName(null); + reqVO.setProductPrice(null); + reqVO.setDetailId(null); + reqVO.setSuperiorIdP1(null); + reqVO.setSuperiorNameP1(null); + reqVO.setSuperiorIdP2(null); + reqVO.setSuperiorNameP2(null); + reqVO.setFirstWages(null); + reqVO.setSecondWages(null); + reqVO.setFirstAmount(null); + reqVO.setSecondAmount(null); + + // 调用 + List list = orderService.getOrderList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbOrder, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImplTest.java new file mode 100644 index 0000000..591866b --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributoruser/DistributorUserServiceImplTest.java @@ -0,0 +1,239 @@ +package co.yixiang.yshop.module.distributor.service.distributoruser; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.distributor.controller.admin.distributoruser.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributoruser.DistributorUserDO; +import co.yixiang.yshop.module.distributor.dal.mysql.distributoruser.DistributorUserMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link DistributorUserServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(DistributorUserServiceImpl.class) +public class DistributorUserServiceImplTest extends BaseDbUnitTest { + + @Resource + private DistributorUserServiceImpl userService; + + @Resource + private DistributorUserMapper userMapper; + + @Test + public void testCreateUser_success() { + // 准备参数 + DistributorUserCreateReqVO reqVO = randomPojo(DistributorUserCreateReqVO.class); + + // 调用 + Long userId = userService.createUser(reqVO); + // 断言 + assertNotNull(userId); + // 校验记录的属性是否正确 + DistributorUserDO user = userMapper.selectById(userId); + assertPojoEquals(reqVO, user); + } + + @Test + public void testUpdateUser_success() { + // mock 数据 + DistributorUserDO dbUser = randomPojo(DistributorUserDO.class); + userMapper.insert(dbUser);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DistributorUserUpdateReqVO reqVO = randomPojo(DistributorUserUpdateReqVO.class, o -> { + o.setId(dbUser.getId()); // 设置更新的 ID + }); + + // 调用 + userService.updateUser(reqVO); + // 校验是否更新正确 + DistributorUserDO user = userMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, user); + } + + @Test + public void testUpdateUser_notExists() { + // 准备参数 + DistributorUserUpdateReqVO reqVO = randomPojo(DistributorUserUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userService.updateUser(reqVO), USER_NOT_EXISTS); + } + + @Test + public void testDeleteUser_success() { + // mock 数据 + DistributorUserDO dbUser = randomPojo(DistributorUserDO.class); + userMapper.insert(dbUser);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUser.getId(); + + // 调用 + userService.deleteUser(id); + // 校验数据不存在了 + assertNull(userMapper.selectById(id)); + } + + @Test + public void testDeleteUser_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userService.deleteUser(id), USER_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserPage() { + // mock 数据 + DistributorUserDO dbUser = randomPojo(DistributorUserDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setCreateTime(null); + o.setSuperiorIdP1(null); + o.setSuperiorNameP1(null); + o.setSuperiorIdP2(null); + o.setSuperiorNameP2(null); + o.setExpireTime(null); + o.setNickname(null); + o.setAvatar(null); + o.setProductCount(null); + o.setOrderCount(null); + o.setWages(null); + }); + userMapper.insert(dbUser); + // 测试 userId 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setUserId(null))); + // 测试 createTime 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setCreateTime(null))); + // 测试 superiorIdP1 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorIdP1(null))); + // 测试 superiorNameP1 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorNameP1(null))); + // 测试 superiorIdP2 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorIdP2(null))); + // 测试 superiorNameP2 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorNameP2(null))); + // 测试 expireTime 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setExpireTime(null))); + // 测试 nickname 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setNickname(null))); + // 测试 avatar 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setAvatar(null))); + // 测试 productCount 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setProductCount(null))); + // 测试 orderCount 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setOrderCount(null))); + // 测试 wages 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setWages(null))); + // 准备参数 + DistributorUserPageReqVO reqVO = new DistributorUserPageReqVO(); + reqVO.setUserId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setSuperiorIdP1(null); + reqVO.setSuperiorNameP1(null); + reqVO.setSuperiorIdP2(null); + reqVO.setSuperiorNameP2(null); + reqVO.setExpireTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setNickname(null); + reqVO.setAvatar(null); + reqVO.setProductCount(null); + reqVO.setOrderCount(null); + reqVO.setWages(null); + + // 调用 + PageResult pageResult = userService.getUserPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUser, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserList() { + // mock 数据 + DistributorUserDO dbUser = randomPojo(DistributorUserDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setCreateTime(null); + o.setSuperiorIdP1(null); + o.setSuperiorNameP1(null); + o.setSuperiorIdP2(null); + o.setSuperiorNameP2(null); + o.setExpireTime(null); + o.setNickname(null); + o.setAvatar(null); + o.setProductCount(null); + o.setOrderCount(null); + o.setWages(null); + }); + userMapper.insert(dbUser); + // 测试 userId 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setUserId(null))); + // 测试 createTime 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setCreateTime(null))); + // 测试 superiorIdP1 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorIdP1(null))); + // 测试 superiorNameP1 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorNameP1(null))); + // 测试 superiorIdP2 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorIdP2(null))); + // 测试 superiorNameP2 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setSuperiorNameP2(null))); + // 测试 expireTime 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setExpireTime(null))); + // 测试 nickname 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setNickname(null))); + // 测试 avatar 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setAvatar(null))); + // 测试 productCount 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setProductCount(null))); + // 测试 orderCount 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setOrderCount(null))); + // 测试 wages 不匹配 + userMapper.insert(cloneIgnoreId(dbUser, o -> o.setWages(null))); + // 准备参数 + DistributorUserExportReqVO reqVO = new DistributorUserExportReqVO(); + reqVO.setUserId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setSuperiorIdP1(null); + reqVO.setSuperiorNameP1(null); + reqVO.setSuperiorIdP2(null); + reqVO.setSuperiorNameP2(null); + reqVO.setExpireTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setNickname(null); + reqVO.setAvatar(null); + reqVO.setProductCount(null); + reqVO.setOrderCount(null); + reqVO.setWages(null); + + // 调用 + List list = userService.getUserList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUser, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImplTest.java new file mode 100644 index 0000000..0ccc869 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwages/DistributorWagesServiceImplTest.java @@ -0,0 +1,183 @@ +package co.yixiang.yshop.module.distributor.service.distributorwages; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.distributor.controller.admin.distributorwages.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwages.DistributorWagesDO; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorwages.DistributorWagesMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link DistributorWagesServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(DistributorWagesServiceImpl.class) +public class DistributorWagesServiceImplTest extends BaseDbUnitTest { + + @Resource + private DistributorWagesServiceImpl wagesService; + + @Resource + private DistributorWagesMapper wagesMapper; + + @Test + public void testCreateWages_success() { + // 准备参数 + DistributorWagesCreateReqVO reqVO = randomPojo(DistributorWagesCreateReqVO.class); + + // 调用 + Long wagesId = wagesService.createWages(reqVO); + // 断言 + assertNotNull(wagesId); + // 校验记录的属性是否正确 + DistributorWagesDO wages = wagesMapper.selectById(wagesId); + assertPojoEquals(reqVO, wages); + } + + @Test + public void testUpdateWages_success() { + // mock 数据 + DistributorWagesDO dbWages = randomPojo(DistributorWagesDO.class); + wagesMapper.insert(dbWages);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DistributorWagesUpdateReqVO reqVO = randomPojo(DistributorWagesUpdateReqVO.class, o -> { + o.setId(dbWages.getId()); // 设置更新的 ID + }); + + // 调用 + wagesService.updateWages(reqVO); + // 校验是否更新正确 + DistributorWagesDO wages = wagesMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, wages); + } + + @Test + public void testUpdateWages_notExists() { + // 准备参数 + DistributorWagesUpdateReqVO reqVO = randomPojo(DistributorWagesUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> wagesService.updateWages(reqVO), WAGES_NOT_EXISTS); + } + + @Test + public void testDeleteWages_success() { + // mock 数据 + DistributorWagesDO dbWages = randomPojo(DistributorWagesDO.class); + wagesMapper.insert(dbWages);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbWages.getId(); + + // 调用 + wagesService.deleteWages(id); + // 校验数据不存在了 + assertNull(wagesMapper.selectById(id)); + } + + @Test + public void testDeleteWages_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> wagesService.deleteWages(id), WAGES_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWagesPage() { + // mock 数据 + DistributorWagesDO dbWages = randomPojo(DistributorWagesDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setCreateTime(null); + o.setAmount(null); + o.setRefuseAmount(null); + o.setDistributorId(null); + }); + wagesMapper.insert(dbWages); + // 测试 userId 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setUserId(null))); + // 测试 createTime 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setCreateTime(null))); + // 测试 amount 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setAmount(null))); + // 测试 refuseAmount 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setRefuseAmount(null))); + // 测试 distributorId 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setDistributorId(null))); + // 准备参数 + DistributorWagesPageReqVO reqVO = new DistributorWagesPageReqVO(); + reqVO.setUserId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setAmount(null); + reqVO.setRefuseAmount(null); + reqVO.setDistributorId(null); + + // 调用 + PageResult pageResult = wagesService.getWagesPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbWages, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWagesList() { + // mock 数据 + DistributorWagesDO dbWages = randomPojo(DistributorWagesDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setCreateTime(null); + o.setAmount(null); + o.setRefuseAmount(null); + o.setDistributorId(null); + }); + wagesMapper.insert(dbWages); + // 测试 userId 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setUserId(null))); + // 测试 createTime 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setCreateTime(null))); + // 测试 amount 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setAmount(null))); + // 测试 refuseAmount 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setRefuseAmount(null))); + // 测试 distributorId 不匹配 + wagesMapper.insert(cloneIgnoreId(dbWages, o -> o.setDistributorId(null))); + // 准备参数 + DistributorWagesExportReqVO reqVO = new DistributorWagesExportReqVO(); + reqVO.setUserId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setAmount(null); + reqVO.setRefuseAmount(null); + reqVO.setDistributorId(null); + + // 调用 + List list = wagesService.getWagesList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbWages, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImplTest.java new file mode 100644 index 0000000..0d922f0 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwageslog/DistributorWagesLogServiceImplTest.java @@ -0,0 +1,215 @@ +package co.yixiang.yshop.module.distributor.service.distributorwageslog; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.distributor.controller.admin.distributorwageslog.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwageslog.DistributorWagesLogDO; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorwageslog.DistributorWagesLogMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link DistributorWagesLogServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(DistributorWagesLogServiceImpl.class) +public class DistributorWagesLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private DistributorWagesLogServiceImpl wagesLogService; + + @Resource + private DistributorWagesLogMapper wagesLogMapper; + + @Test + public void testCreateWagesLog_success() { + // 准备参数 + DistributorWagesLogCreateReqVO reqVO = randomPojo(DistributorWagesLogCreateReqVO.class); + + // 调用 + Long wagesLogId = wagesLogService.createWagesLog(reqVO); + // 断言 + assertNotNull(wagesLogId); + // 校验记录的属性是否正确 + DistributorWagesLogDO wagesLog = wagesLogMapper.selectById(wagesLogId); + assertPojoEquals(reqVO, wagesLog); + } + + @Test + public void testUpdateWagesLog_success() { + // mock 数据 + DistributorWagesLogDO dbWagesLog = randomPojo(DistributorWagesLogDO.class); + wagesLogMapper.insert(dbWagesLog);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DistributorWagesLogUpdateReqVO reqVO = randomPojo(DistributorWagesLogUpdateReqVO.class, o -> { + o.setId(dbWagesLog.getId()); // 设置更新的 ID + }); + + // 调用 + wagesLogService.updateWagesLog(reqVO); + // 校验是否更新正确 + DistributorWagesLogDO wagesLog = wagesLogMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, wagesLog); + } + + @Test + public void testUpdateWagesLog_notExists() { + // 准备参数 + DistributorWagesLogUpdateReqVO reqVO = randomPojo(DistributorWagesLogUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> wagesLogService.updateWagesLog(reqVO), WAGES_LOG_NOT_EXISTS); + } + + @Test + public void testDeleteWagesLog_success() { + // mock 数据 + DistributorWagesLogDO dbWagesLog = randomPojo(DistributorWagesLogDO.class); + wagesLogMapper.insert(dbWagesLog);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbWagesLog.getId(); + + // 调用 + wagesLogService.deleteWagesLog(id); + // 校验数据不存在了 + assertNull(wagesLogMapper.selectById(id)); + } + + @Test + public void testDeleteWagesLog_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> wagesLogService.deleteWagesLog(id), WAGES_LOG_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWagesLogPage() { + // mock 数据 + DistributorWagesLogDO dbWagesLog = randomPojo(DistributorWagesLogDO.class, o -> { // 等会查询到 + o.setWagesId(null); + o.setUserId(null); + o.setType(null); + o.setAmount(null); + o.setCreateTime(null); + o.setDistributorId(null); + o.setStatus(null); + o.setUserName(null); + o.setDistributorName(null); + }); + wagesLogMapper.insert(dbWagesLog); + // 测试 wagesId 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setWagesId(null))); + // 测试 userId 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setUserId(null))); + // 测试 type 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setType(null))); + // 测试 amount 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setAmount(null))); + // 测试 createTime 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setCreateTime(null))); + // 测试 distributorId 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setDistributorId(null))); + // 测试 status 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setStatus(null))); + // 测试 userName 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setUserName(null))); + // 测试 distributorName 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setDistributorName(null))); + // 准备参数 + DistributorWagesLogPageReqVO reqVO = new DistributorWagesLogPageReqVO(); + reqVO.setWagesId(null); + reqVO.setUserId(null); + reqVO.setType(null); + reqVO.setAmount(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setDistributorId(null); + reqVO.setStatus(null); + reqVO.setUserName(null); + reqVO.setDistributorName(null); + + // 调用 + PageResult pageResult = wagesLogService.getWagesLogPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbWagesLog, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWagesLogList() { + // mock 数据 + DistributorWagesLogDO dbWagesLog = randomPojo(DistributorWagesLogDO.class, o -> { // 等会查询到 + o.setWagesId(null); + o.setUserId(null); + o.setType(null); + o.setAmount(null); + o.setCreateTime(null); + o.setDistributorId(null); + o.setStatus(null); + o.setUserName(null); + o.setDistributorName(null); + }); + wagesLogMapper.insert(dbWagesLog); + // 测试 wagesId 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setWagesId(null))); + // 测试 userId 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setUserId(null))); + // 测试 type 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setType(null))); + // 测试 amount 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setAmount(null))); + // 测试 createTime 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setCreateTime(null))); + // 测试 distributorId 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setDistributorId(null))); + // 测试 status 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setStatus(null))); + // 测试 userName 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setUserName(null))); + // 测试 distributorName 不匹配 + wagesLogMapper.insert(cloneIgnoreId(dbWagesLog, o -> o.setDistributorName(null))); + // 准备参数 + DistributorWagesLogExportReqVO reqVO = new DistributorWagesLogExportReqVO(); + reqVO.setWagesId(null); + reqVO.setUserId(null); + reqVO.setType(null); + reqVO.setAmount(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setDistributorId(null); + reqVO.setStatus(null); + reqVO.setUserName(null); + reqVO.setDistributorName(null); + + // 调用 + List list = wagesLogService.getWagesLogList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbWagesLog, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImplTest.java b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImplTest.java new file mode 100644 index 0000000..bfe8769 --- /dev/null +++ b/yshop-module-mall/yshop-module-distributor-biz/src/test/java/co/yixiang/yshop/module/distributor/service/distributorwithdrawalmethod/DistributorWithdrawalMethodServiceImplTest.java @@ -0,0 +1,191 @@ +package co.yixiang.yshop.module.distributor.service.distributorwithdrawalmethod; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.distributor.controller.admin.distributorwithdrawalmethod.vo.*; +import co.yixiang.yshop.module.distributor.dal.dataobject.distributorwithdrawalmethod.DistributorWithdrawalMethodDO; +import co.yixiang.yshop.module.distributor.dal.mysql.distributorwithdrawalmethod.DistributorWithdrawalMethodMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.distributor.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link DistributorWithdrawalMethodServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(DistributorWithdrawalMethodServiceImpl.class) +public class DistributorWithdrawalMethodServiceImplTest extends BaseDbUnitTest { + + @Resource + private DistributorWithdrawalMethodServiceImpl withdrawalMethodService; + + @Resource + private DistributorWithdrawalMethodMapper withdrawalMethodMapper; + + @Test + public void testCreateWithdrawalMethod_success() { + // 准备参数 + DistributorWithdrawalMethodCreateReqVO reqVO = randomPojo(DistributorWithdrawalMethodCreateReqVO.class); + + // 调用 + Long withdrawalMethodId = withdrawalMethodService.createWithdrawalMethod(reqVO); + // 断言 + assertNotNull(withdrawalMethodId); + // 校验记录的属性是否正确 + DistributorWithdrawalMethodDO withdrawalMethod = withdrawalMethodMapper.selectById(withdrawalMethodId); + assertPojoEquals(reqVO, withdrawalMethod); + } + + @Test + public void testUpdateWithdrawalMethod_success() { + // mock 数据 + DistributorWithdrawalMethodDO dbWithdrawalMethod = randomPojo(DistributorWithdrawalMethodDO.class); + withdrawalMethodMapper.insert(dbWithdrawalMethod);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DistributorWithdrawalMethodUpdateReqVO reqVO = randomPojo(DistributorWithdrawalMethodUpdateReqVO.class, o -> { + o.setId(dbWithdrawalMethod.getId()); // 设置更新的 ID + }); + + // 调用 + withdrawalMethodService.updateWithdrawalMethod(reqVO); + // 校验是否更新正确 + DistributorWithdrawalMethodDO withdrawalMethod = withdrawalMethodMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, withdrawalMethod); + } + + @Test + public void testUpdateWithdrawalMethod_notExists() { + // 准备参数 + DistributorWithdrawalMethodUpdateReqVO reqVO = randomPojo(DistributorWithdrawalMethodUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> withdrawalMethodService.updateWithdrawalMethod(reqVO), WITHDRAWAL_METHOD_NOT_EXISTS); + } + + @Test + public void testDeleteWithdrawalMethod_success() { + // mock 数据 + DistributorWithdrawalMethodDO dbWithdrawalMethod = randomPojo(DistributorWithdrawalMethodDO.class); + withdrawalMethodMapper.insert(dbWithdrawalMethod);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbWithdrawalMethod.getId(); + + // 调用 + withdrawalMethodService.deleteWithdrawalMethod(id); + // 校验数据不存在了 + assertNull(withdrawalMethodMapper.selectById(id)); + } + + @Test + public void testDeleteWithdrawalMethod_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> withdrawalMethodService.deleteWithdrawalMethod(id), WITHDRAWAL_METHOD_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWithdrawalMethodPage() { + // mock 数据 + DistributorWithdrawalMethodDO dbWithdrawalMethod = randomPojo(DistributorWithdrawalMethodDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setDistributorId(null); + o.setPaymentMethod(null); + o.setAccountNum(null); + o.setRealName(null); + o.setCreateTime(null); + }); + withdrawalMethodMapper.insert(dbWithdrawalMethod); + // 测试 userId 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setUserId(null))); + // 测试 distributorId 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setDistributorId(null))); + // 测试 paymentMethod 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setPaymentMethod(null))); + // 测试 acountNum 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setAccountNum(null))); + // 测试 realName 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setRealName(null))); + // 测试 createTime 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setCreateTime(null))); + // 准备参数 + DistributorWithdrawalMethodPageReqVO reqVO = new DistributorWithdrawalMethodPageReqVO(); + reqVO.setUserId(null); + reqVO.setDistributorId(null); + reqVO.setPaymentMethod(null); + reqVO.setAcountNum(null); + reqVO.setRealName(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = withdrawalMethodService.getWithdrawalMethodPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbWithdrawalMethod, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWithdrawalMethodList() { + // mock 数据 + DistributorWithdrawalMethodDO dbWithdrawalMethod = randomPojo(DistributorWithdrawalMethodDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setDistributorId(null); + o.setPaymentMethod(null); + o.setAccountNum(null); + o.setRealName(null); + o.setCreateTime(null); + }); + withdrawalMethodMapper.insert(dbWithdrawalMethod); + // 测试 userId 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setUserId(null))); + // 测试 distributorId 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setDistributorId(null))); + // 测试 paymentMethod 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setPaymentMethod(null))); + // 测试 acountNum 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setAccountNum(null))); + // 测试 realName 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setRealName(null))); + // 测试 createTime 不匹配 + withdrawalMethodMapper.insert(cloneIgnoreId(dbWithdrawalMethod, o -> o.setCreateTime(null))); + // 准备参数 + DistributorWithdrawalMethodExportReqVO reqVO = new DistributorWithdrawalMethodExportReqVO(); + reqVO.setUserId(null); + reqVO.setDistributorId(null); + reqVO.setPaymentMethod(null); + reqVO.setAcountNum(null); + reqVO.setRealName(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = withdrawalMethodService.getWithdrawalMethodList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbWithdrawalMethod, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/ProductOrderApi.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/ProductOrderApi.java new file mode 100644 index 0000000..3e93a8b --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/ProductOrderApi.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.order.api.productorder; + +import co.yixiang.yshop.module.order.api.productorder.dto.ProductOrderDTO; + +import java.util.Map; + +public interface ProductOrderApi { + + ProductOrderDTO getPayParam(String orderId); + + void handleOrder(String orderId, Map packageParams); + + void handleWeChatPayNotify(String orderId, Map resultMap) throws Exception; + + /** + * 余额支付 + * @param orderId 订单号 + * @param uid 用户id + */ + void yuePay(String orderId,Long uid); + +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/dto/ProductOrderDTO.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/dto/ProductOrderDTO.java new file mode 100644 index 0000000..ff97c2c --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/productorder/dto/ProductOrderDTO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.order.api.productorder.dto; + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Data +@ToString(callSuper = true) +public class ProductOrderDTO { + /** + * 订单ID + */ + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 充值状态 0-未支付 1-已支付 + */ + private Integer status; + /** + * 金额 + */ + private BigDecimal amount; +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/RechargeOrderApi.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/RechargeOrderApi.java new file mode 100644 index 0000000..f190e60 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/RechargeOrderApi.java @@ -0,0 +1,13 @@ +package co.yixiang.yshop.module.order.api.rechargeorder; + +import co.yixiang.yshop.module.order.api.rechargeorder.dto.RechargeOrderDTO; + +import java.util.Map; + +public interface RechargeOrderApi { + + RechargeOrderDTO getPayParam(String id); + + void handleWeChatPayNotify(String orderId) throws Exception; + +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/dto/RechargeOrderDTO.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/dto/RechargeOrderDTO.java new file mode 100644 index 0000000..62b80ee --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/api/rechargeorder/dto/RechargeOrderDTO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.order.api.rechargeorder.dto; + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Data +@ToString(callSuper = true) +public class RechargeOrderDTO { + /** + * 订单ID + */ + private String id; + /** + * 用户id + */ + private Long userId; + /** + * 充值状态 0-未支付 1-已支付 + */ + private Integer status; + /** + * 金额 + */ + private Integer rechargeAmount; +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java index 3600ced..97ec31e 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java @@ -19,6 +19,7 @@ public interface ErrorCodeConstants { ErrorCode ORDER_PAY_FINISH = new ErrorCode(1008007010, "该订单已支付"); ErrorCode USER_NOT_BINDING_WX_APPLET = new ErrorCode(1008007011, "该用户未绑定微信小程序!openid为空!"); + ErrorCode USER_NOT_BINDING_WX = new ErrorCode(1008007011, "该用户未绑定微信手机号无法调起支付"); ErrorCode PAY_YUE_NOT = new ErrorCode(1008007011, "余额不足"); ErrorCode ORDER_STATUS_ERROR = new ErrorCode(1008007012, "订单状态错误"); ErrorCode COMMENT_PRODUCT_NOT_EXISTS = new ErrorCode(1008007013, "评价产品不存在"); @@ -31,6 +32,15 @@ public interface ErrorCodeConstants { ErrorCode ORDER_ADDRESS_REQUERED = new ErrorCode(1008007019, "请输入商家收货人信息"); ErrorCode ORDER_PAYINFO_ERROR = new ErrorCode(1008007020, "获取订单支付信息异常"); + ErrorCode ORDER_WRITTEN_OFF = new ErrorCode(1008007021, "该订单已核销"); + ErrorCode ORDER_WRITE_OFF_CODE_ERROR = new ErrorCode(1008007022, "核销码错误"); + ErrorCode ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1008007023, "订单明细不存在!"); + + ErrorCode ORDER_REFUND_NUMBER_LACK_ERROR = new ErrorCode(1008007024, "可退款商品数量不足!"); + + ErrorCode ORDER_REFUND_NOT_STORE_PICKUP = new ErrorCode(1008007025, "自提订单不能售后"); + + ErrorCode NO_WRITE_OFF_AUTHORITY = new ErrorCode(1008007026, "无核销权限"); // ========== 订单电子面单记录 ========== ErrorCode STORE_ORDER_ELECTRONICS_NOT_EXISTS = new ErrorCode(1008010000, "订单电子面单记录不存在"); @@ -43,5 +53,9 @@ public interface ErrorCodeConstants { ErrorCode ORDER_QUERY_NO_MERCHANT = new ErrorCode(1008012001, "未查到商户配置信息id=4!"); + ErrorCode RECHARGE_ORDER_NOT_EXISTS = new ErrorCode(1010000001, "充值订单不存在"); + ErrorCode RECHARGE_CONFIG_NOT_EXISTS = new ErrorCode(1010000002, "充值配置不存在"); + ErrorCode RECHARGE_PACKAGE_NOT_EXISTS = new ErrorCode(1010000003, "充值套餐配置不存在"); + ErrorCode RECHARGE_MIN_ERROR = new ErrorCode(1010000004, "小于最小充值金额"); } diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderDetailStateEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderDetailStateEnum.java new file mode 100644 index 0000000..d3ed8f4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderDetailStateEnum.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * @author moxiangrong + * 订单详情状态枚举 + */ +@Getter +@AllArgsConstructor +public enum OrderDetailStateEnum { + + NORMAL(1,"正常"), + IN_AFTER_SALES(2,"售后中"), + AFTER_SALES_COMPLETE(3,"售后完成"); + + + + private Integer value; + private String desc; + + public static OrderDetailStateEnum toType(int value) { + return Stream.of(OrderDetailStateEnum.values()) + .filter(p -> p.value == value) + .findAny() + .orElse(null); + } + + +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java index 8ca8944..233cf80 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java @@ -24,9 +24,11 @@ public enum OrderStatusEnum { STATUS_WAIT_RECEIVED(2,"待收货"), STATUS_WAIT_EVALUATE(3,"待评价"), STATUS_FINISH(4,"已完成"), + STATUS_WAIT_FOR_GROUP(5,"待成团"), STATUS_MINUS_BEING_REFUND(-1,"退款中"), STATUS_MINUS_REFUNDED(-2,"已退款"), - STATUS_MINUS_REFUND(-3,"退款"); + STATUS_MINUS_REFUND(-3,"退款"), + STATUS_GROUP_FAILURE(-4,"成团失败"); diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderTypeEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderTypeEnum.java new file mode 100644 index 0000000..9bee5f4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderTypeEnum.java @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * @author moxiangrong + * 下单类型枚举 + */ +@Getter +@AllArgsConstructor +public enum OrderTypeEnum { + + NORMAL_ORDER(1,"正常下单"), + CAMPAIGN_ORDER(2,"活动下单"); + + + + private Integer value; + private String desc; + + public static OrderTypeEnum toType(int value) { + return Stream.of(OrderTypeEnum.values()) + .filter(p -> p.value == value) + .findAny() + .orElse(null); + } + + +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderWriteOffStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderWriteOffStatusEnum.java new file mode 100644 index 0000000..8e2de8c --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderWriteOffStatusEnum.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.order.enums; + +import lombok.Getter; + +/** + * @author pepis + * @apiNote 订单核销枚举类 + **/ +@Getter +public enum OrderWriteOffStatusEnum { + TO_BE_WRITTEN_OFF(0, "待核销"), + WRITTEN_OFF(1, "已核销"); + + private final Integer value; + + private final String desc; + + OrderWriteOffStatusEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ReachargeOrderStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ReachargeOrderStatusEnum.java new file mode 100644 index 0000000..0ecfb87 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ReachargeOrderStatusEnum.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +/** + * 售后状态枚举 + * + * @author hupeng + * @date 2023/6/23 + */ +@Getter +@AllArgsConstructor +public enum ReachargeOrderStatusEnum { + + WAIT(0,"待支付"), + SUCCESS(1,"已支付"); + + private Integer value; + + private String name; + + public static ReachargeOrderStatusEnum toType(int value) { + return Stream.of(ReachargeOrderStatusEnum.values()) + .filter(p -> p.value == value) + .findAny() + .orElse(null); + } + + +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/RechargePackageStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/RechargePackageStatusEnum.java new file mode 100644 index 0000000..37f8f45 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/RechargePackageStatusEnum.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum RechargePackageStatusEnum { + + CLOSE(0,"关闭"), + OPEN(1,"开启"), + ; + + private Integer status; + private String name; + + public static RechargePackageStatusEnum toStatus(Integer status) { + return Stream.of(RechargePackageStatusEnum.values()) + .filter(p -> p.status.equals(status)) + .findAny() + .orElse(null); + } +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTypeEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTypeEnum.java new file mode 100644 index 0000000..a8c27c7 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTypeEnum.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.order.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 配送方式 1=快递 ,2=门店自提 + */ +@Getter +@AllArgsConstructor +public enum ShippingTypeEnum { + SHIPPING_TYPE_EXPRESS_DELIVERY(1,"快递"), + SHIPPING_TYPE_STORE(2,"门店自提"), + ; + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-order-biz/pom.xml b/yshop-module-mall/yshop-module-order-biz/pom.xml index 596af81..a244b3b 100644 --- a/yshop-module-mall/yshop-module-order-biz/pom.xml +++ b/yshop-module-mall/yshop-module-order-biz/pom.xml @@ -42,6 +42,11 @@ yshop-module-message-biz ${revision} + + co.yixiang.boot + yshop-module-shop-biz + ${revision} + @@ -78,6 +83,23 @@ yshop-spring-boot-starter-excel + + + com.google.zxing + core + + + co.yixiang.boot + yshop-module-distributor-api + 1.0.0 + compile + + + co.yixiang.boot + yshop-module-distributor-biz + test + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/ProductOrderApiImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/ProductOrderApiImpl.java new file mode 100644 index 0000000..0cae12a --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/ProductOrderApiImpl.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.order.api; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; +import co.yixiang.yshop.module.order.api.productorder.ProductOrderApi; +import co.yixiang.yshop.module.order.api.productorder.dto.ProductOrderDTO; +import co.yixiang.yshop.module.order.controller.app.order.vo.AppStoreOrderQueryVo; +import co.yixiang.yshop.module.order.service.storeorder.AppStoreOrderService; +import co.yixiang.yshop.module.order.service.storeorder.AsyncStoreOrderService; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Map; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.ORDER_PAY_FINISH; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.STORE_ORDER_NOT_EXISTS; + + +@Service +public class ProductOrderApiImpl implements ProductOrderApi { + + @Resource + @Lazy + private AppStoreOrderService appStoreOrderService; + + @Resource + private AsyncStoreOrderService asyncStoreOrderService; + + @Override + public ProductOrderDTO getPayParam(String orderId) { + Long userId = getLoginUserId(); + + AppStoreOrderQueryVo orderInfo = appStoreOrderService.getOrderInfo(orderId, userId); + if (ObjectUtil.isNull(orderInfo)) { + throw exception(STORE_ORDER_NOT_EXISTS); + } + if (orderInfo.getPaid().equals(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue())) { + throw exception(ORDER_PAY_FINISH); + } + + ProductOrderDTO productOrderDTO = new ProductOrderDTO(); + productOrderDTO.setAmount(orderInfo.getPayPrice()); + return productOrderDTO; + } + + @Override + public void handleOrder(String orderId, Map packageParams) { + Long userId = getLoginUserId(); + + AppStoreOrderQueryVo orderInfo = appStoreOrderService.getOrderInfo(orderId, userId); + appStoreOrderService.updatePayInfo(orderInfo, packageParams); + // 异步统计 + asyncStoreOrderService.orderData(userId); + } + + @Override + public void handleWeChatPayNotify(String orderId, Map resultMap) throws Exception { + appStoreOrderService.wxPayNotify(orderId, resultMap); + } + + @Override + public void yuePay(String orderId, Long uid) { + appStoreOrderService.yuePay(orderId,uid); + } + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/RechargeOrderApiImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/RechargeOrderApiImpl.java new file mode 100644 index 0000000..11c18d3 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/api/RechargeOrderApiImpl.java @@ -0,0 +1,66 @@ +package co.yixiang.yshop.module.order.api; + +import co.yixiang.yshop.module.member.api.user.MemberUserNowMoneyApi; +import co.yixiang.yshop.module.member.api.user.dto.IncreaseNowMoneyDTO; +import co.yixiang.yshop.module.order.api.rechargeorder.RechargeOrderApi; +import co.yixiang.yshop.module.order.api.rechargeorder.dto.RechargeOrderDTO; +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.RechargeOrderUpdateReqVO; +import co.yixiang.yshop.module.order.convert.rechargeorder.RechargeOrderConvert; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeorder.RechargeOrderDO; +import co.yixiang.yshop.module.order.enums.ReachargeOrderStatusEnum; +import co.yixiang.yshop.module.order.service.rechargeorder.RechargeOrderService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +@Service +public class RechargeOrderApiImpl implements RechargeOrderApi { + + @Resource + private RechargeOrderService rechargeOrderService; + + @Resource + private MemberUserNowMoneyApi memberUserNowMoneyApi; + + @Override + public RechargeOrderDTO getPayParam(String id) { + RechargeOrderDO rechargeOrder = rechargeOrderService.getRechargeOrder(id); + return RechargeOrderConvert.INSTANCE.convert02(rechargeOrder); + } + + @Override + public void handleWeChatPayNotify(String orderId) throws Exception { + // 增加余额 + RechargeOrderDO rechargeOrder = rechargeOrderService.getRechargeOrder(orderId); + // 判断重复回调 + if (rechargeOrder.getStatus().equals(ReachargeOrderStatusEnum.SUCCESS.getValue())) { + return; + } + RechargeOrderUpdateReqVO updateReqVO = new RechargeOrderUpdateReqVO(); + updateReqVO.setId(rechargeOrder.getId()); + updateReqVO.setStatus(ReachargeOrderStatusEnum.SUCCESS.getValue()); + // 更新状态 + rechargeOrderService.updateRechargeOrder(updateReqVO); + // 增加余额 + + IncreaseNowMoneyDTO increaseNowMoneyDTO = new IncreaseNowMoneyDTO(); + increaseNowMoneyDTO.setId(rechargeOrder.getUserId()); + increaseNowMoneyDTO.setAmount(new BigDecimal(rechargeOrder.getRechargeAmount())); + increaseNowMoneyDTO.setLink(orderId); + increaseNowMoneyDTO.setMark("微信支付充值" + rechargeOrder.getRechargeAmount() + "元"); + + memberUserNowMoneyApi.increaseNowMoney(increaseNowMoneyDTO); + + if (rechargeOrder.getGiftAmount() != null && rechargeOrder.getGiftAmount() > 0) { + increaseNowMoneyDTO = new IncreaseNowMoneyDTO(); + increaseNowMoneyDTO.setId(rechargeOrder.getUserId()); + increaseNowMoneyDTO.setAmount(new BigDecimal(rechargeOrder.getGiftAmount())); + increaseNowMoneyDTO.setLink(orderId); + increaseNowMoneyDTO.setMark("充值赠送" + rechargeOrder.getGiftAmount() + "元"); + + memberUserNowMoneyApi.increaseNowMoney(increaseNowMoneyDTO); + } + + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/RechargeConfigController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/RechargeConfigController.java new file mode 100644 index 0000000..4210eb2 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/RechargeConfigController.java @@ -0,0 +1,120 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig; + +import co.yixiang.yshop.module.order.service.rechargeconfig.RechargeConfigFacade; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import co.yixiang.yshop.module.order.convert.rechargeconfig.RechargeConfigConvert; +import co.yixiang.yshop.module.order.service.rechargeconfig.RechargeConfigService; + +@Tag(name = "管理后台 - 充值配置") +@RestController +@RequestMapping("/order/recharge-config") +@Validated +public class RechargeConfigController { + + @Resource + private RechargeConfigService rechargeConfigService; + + @Resource + private RechargeConfigFacade rechargeConfigFacade; + + @GetMapping("/get-all-config") + @Operation(summary = "获取所有配置") + public CommonResult getAllConfig() { + return success(rechargeConfigFacade.getAllConfig(null)); + } + + @PostMapping("/update-all-config") + @Operation(summary = "更新所有配置") + public CommonResult updateAllConfig(@Valid @RequestBody RechargeAllConfigVO rechargeAllConfigVO) { + rechargeConfigFacade.updateAllConfig(rechargeAllConfigVO); + return success(Boolean.TRUE); + } + + + @PostMapping("/create") + @Operation(summary = "创建充值配置") + @PreAuthorize("@ss.hasPermission('order:recharge-config:create')") + public CommonResult createRechargeConfig(@Valid @RequestBody RechargeConfigCreateReqVO createReqVO) { + return success(rechargeConfigService.createRechargeConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新充值配置") + @PreAuthorize("@ss.hasPermission('order:recharge-config:update')") + public CommonResult updateRechargeConfig(@Valid @RequestBody RechargeConfigUpdateReqVO updateReqVO) { + rechargeConfigService.updateRechargeConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除充值配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('order:recharge-config:delete')") + public CommonResult deleteRechargeConfig(@RequestParam("id") Long id) { + rechargeConfigService.deleteRechargeConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得充值配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('order:recharge-config:query')") + public CommonResult getRechargeConfig(@RequestParam("id") Long id) { + RechargeConfigDO rechargeConfig = rechargeConfigService.getRechargeConfig(id); + return success(RechargeConfigConvert.INSTANCE.convert(rechargeConfig)); + } + + @GetMapping("/list") + @Operation(summary = "获得充值配置列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('order:recharge-config:query')") + public CommonResult> getRechargeConfigList(@RequestParam("ids") Collection ids) { + List list = rechargeConfigService.getRechargeConfigList(ids); + return success(RechargeConfigConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得充值配置分页") + @PreAuthorize("@ss.hasPermission('order:recharge-config:query')") + public CommonResult> getRechargeConfigPage(@Valid RechargeConfigPageReqVO pageVO) { + PageResult pageResult = rechargeConfigService.getRechargeConfigPage(pageVO); + return success(RechargeConfigConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出充值配置 Excel") + @PreAuthorize("@ss.hasPermission('order:recharge-config:export')") + @OperateLog(type = EXPORT) + public void exportRechargeConfigExcel(@Valid RechargeConfigExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = rechargeConfigService.getRechargeConfigList(exportReqVO); + // 导出 Excel + List datas = RechargeConfigConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "充值配置.xls", "数据", RechargeConfigExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeAllConfigVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeAllConfigVO.java new file mode 100644 index 0000000..2b81c69 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeAllConfigVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.RechargePackageRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** +* 充值配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class RechargeAllConfigVO { + + @Schema(description = "自定义金额开关 0-关闭 1-开启") + private Integer customSwitch; + + @Schema(description = "最小金额") + private Integer customMin; + + @Schema(description = "说明") + private String content; + + @Schema(description = "规则列表") + private List rechargePackageBaseVOS; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigBaseVO.java new file mode 100644 index 0000000..3260ffd --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigBaseVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 充值配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class RechargeConfigBaseVO { + + @Schema(description = "自定义金额开关 0-关闭 1-开启") + private Integer customSwitch; + + @Schema(description = "最小金额") + private Integer customMin; + + @Schema(description = "说明") + private String content; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigCreateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigCreateReqVO.java new file mode 100644 index 0000000..f9c142d --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 充值配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeConfigCreateReqVO extends RechargeConfigBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExcelVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExcelVO.java new file mode 100644 index 0000000..f64f6a2 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExcelVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 充值配置 Excel VO + * + * @author admin + */ +@Data +public class RechargeConfigExcelVO { + + @ExcelProperty("主键ID") + private Long id; + + @ExcelProperty("自定义金额开关 0-关闭 1-开启") + private Integer customSwitch; + + @ExcelProperty("最小金额") + private Integer customMin; + + @ExcelProperty("说明") + private String content; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExportReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExportReqVO.java new file mode 100644 index 0000000..b4a4ff0 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigExportReqVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 充值配置 Excel 导出 Request VO,参数和 RechargeConfigPageReqVO 是一致的") +@Data +public class RechargeConfigExportReqVO { + + @Schema(description = "自定义金额开关 0-关闭 1-开启") + private Integer customSwitch; + + @Schema(description = "最小金额") + private Integer customMin; + + @Schema(description = "说明") + private String content; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigPageReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigPageReqVO.java new file mode 100644 index 0000000..4efc7ff --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigPageReqVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 充值配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeConfigPageReqVO extends PageParam { + + @Schema(description = "自定义金额开关 0-关闭 1-开启") + private Integer customSwitch; + + @Schema(description = "最小金额") + private Integer customMin; + + @Schema(description = "说明") + private String content; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigRespVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigRespVO.java new file mode 100644 index 0000000..c114e2d --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 充值配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeConfigRespVO extends RechargeConfigBaseVO { + + @Schema(description = "主键ID", required = true, example = "21259") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigUpdateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigUpdateReqVO.java new file mode 100644 index 0000000..e28edc3 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeconfig/vo/RechargeConfigUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 充值配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeConfigUpdateReqVO extends RechargeConfigBaseVO { + + @Schema(description = "主键ID", required = true, example = "21259") + @NotNull(message = "主键ID不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/RechargeOrderController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/RechargeOrderController.java new file mode 100644 index 0000000..74ad4e9 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/RechargeOrderController.java @@ -0,0 +1,108 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeorder.RechargeOrderDO; +import co.yixiang.yshop.module.order.convert.rechargeorder.RechargeOrderConvert; +import co.yixiang.yshop.module.order.service.rechargeorder.RechargeOrderService; + +@Tag(name = "管理后台 - 充值订单") +@RestController +@RequestMapping("/order/recharge-order") +@Validated +public class RechargeOrderController { + + @Resource + private RechargeOrderService rechargeOrderService; + + @PostMapping("/create") + @Operation(summary = "创建充值订单") + @PreAuthorize("@ss.hasPermission('order:recharge-order:create')") + public CommonResult createRechargeOrder(@Valid @RequestBody RechargeOrderCreateReqVO createReqVO) { + return success(rechargeOrderService.createRechargeOrder(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新充值订单") + @PreAuthorize("@ss.hasPermission('order:recharge-order:update')") + public CommonResult updateRechargeOrder(@Valid @RequestBody RechargeOrderUpdateReqVO updateReqVO) { + rechargeOrderService.updateRechargeOrder(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除充值订单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('order:recharge-order:delete')") + public CommonResult deleteRechargeOrder(@RequestParam("id") String id) { + rechargeOrderService.deleteRechargeOrder(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得充值订单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('order:recharge-order:query')") + public CommonResult getRechargeOrder(@RequestParam("id") String id) { + RechargeOrderDO rechargeOrder = rechargeOrderService.getRechargeOrder(id); + return success(RechargeOrderConvert.INSTANCE.convert(rechargeOrder)); + } + + @GetMapping("/list") + @Operation(summary = "获得充值订单列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('order:recharge-order:query')") + public CommonResult> getRechargeOrderList(@RequestParam("ids") Collection ids) { + List list = rechargeOrderService.getRechargeOrderList(ids); + return success(RechargeOrderConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得充值订单分页") + @PreAuthorize("@ss.hasPermission('order:recharge-order:query')") + public CommonResult> getRechargeOrderPage(@Valid RechargeOrderPageReqVO pageVO) { + PageResult pageResult = rechargeOrderService.getRechargeOrderPage(pageVO); + return success(RechargeOrderConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出充值订单 Excel") + @PreAuthorize("@ss.hasPermission('order:recharge-order:export')") + @OperateLog(type = EXPORT) + public void exportRechargeOrderExcel(@Valid RechargeOrderExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = rechargeOrderService.getRechargeOrderList(exportReqVO); + // 导出 Excel + List datas = RechargeOrderConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "充值订单.xls", "数据", RechargeOrderExcelVO.class, datas); + } + + @PostMapping("/refund") + @Operation(summary = "批量退款") + public CommonResult refund() throws Exception { + rechargeOrderService.refund(); + return success(Boolean.TRUE); + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderBaseVO.java new file mode 100644 index 0000000..cd88340 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderBaseVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 充值订单 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class RechargeOrderBaseVO { + + private String id; + + @Schema(description = "用户id", example = "15798") + private Long userId; + + @Schema(description = "充值状态 0-未支付 1-已支付", example = "2") + private Integer status; + + @Schema(description = "充值金额") + private Integer rechargeAmount; + + @Schema(description = "赠送金额") + private Integer giftAmount; + + @Schema(description = "充值套餐ID", example = "8014") + private Long packageId; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderCreateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderCreateReqVO.java new file mode 100644 index 0000000..5812295 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 充值订单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeOrderCreateReqVO extends RechargeOrderBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExcelVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExcelVO.java new file mode 100644 index 0000000..d614753 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExcelVO.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 充值订单 Excel VO + * + * @author admin + */ +@Data +public class RechargeOrderExcelVO { + + @ExcelProperty("订单ID") + private String id; + + @ExcelProperty("用户id") + private Long userId; + + @ExcelProperty("充值状态 0-未支付 1-已支付") + private Integer status; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("充值金额") + private Integer rechargeAmount; + + @ExcelProperty("赠送金额") + private Integer giftAmount; + + @ExcelProperty("充值套餐ID") + private Long packageId; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExportReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExportReqVO.java new file mode 100644 index 0000000..724c194 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderExportReqVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 充值订单 Excel 导出 Request VO,参数和 RechargeOrderPageReqVO 是一致的") +@Data +public class RechargeOrderExportReqVO { + + @Schema(description = "用户id", example = "15798") + private Long userId; + + @Schema(description = "充值状态 0-未支付 1-已支付", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "充值金额") + private Integer rechargeAmount; + + @Schema(description = "赠送金额") + private Integer giftAmount; + + @Schema(description = "充值套餐ID", example = "8014") + private Long packageId; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderPageReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderPageReqVO.java new file mode 100644 index 0000000..89ca61f --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderPageReqVO.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 充值订单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeOrderPageReqVO extends PageParam { + + @Schema(description = "用户id", example = "15798") + private Long userId; + + @Schema(description = "充值状态 0-未支付 1-已支付", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "充值金额") + private Integer rechargeAmount; + + @Schema(description = "赠送金额") + private Integer giftAmount; + + @Schema(description = "充值套餐ID", example = "8014") + private Long packageId; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderRespVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderRespVO.java new file mode 100644 index 0000000..9959a24 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 充值订单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeOrderRespVO extends RechargeOrderBaseVO { + + @Schema(description = "订单ID", required = true, example = "12534") + private String id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderUpdateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderUpdateReqVO.java new file mode 100644 index 0000000..eb3b8d5 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargeorder/vo/RechargeOrderUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 充值订单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargeOrderUpdateReqVO extends RechargeOrderBaseVO { + + @Schema(description = "订单ID", required = true, example = "12534") + @NotNull(message = "订单ID不能为空") + private String id; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/RechargePackageController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/RechargePackageController.java new file mode 100644 index 0000000..7524444 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/RechargePackageController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.module.order.convert.rechargepackage.RechargePackageConvert; +import co.yixiang.yshop.module.order.service.rechargepackage.RechargePackageService; + +@Tag(name = "管理后台 - 充值套餐配置") +@RestController +@RequestMapping("/order/recharge-package") +@Validated +public class RechargePackageController { + + @Resource + private RechargePackageService rechargePackageService; + + @PostMapping("/create") + @Operation(summary = "创建充值套餐配置") + @PreAuthorize("@ss.hasPermission('order:recharge-package:create')") + public CommonResult createRechargePackage(@Valid @RequestBody RechargePackageCreateReqVO createReqVO) { + return success(rechargePackageService.createRechargePackage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新充值套餐配置") + @PreAuthorize("@ss.hasPermission('order:recharge-package:update')") + public CommonResult updateRechargePackage(@Valid @RequestBody RechargePackageUpdateReqVO updateReqVO) { + rechargePackageService.updateRechargePackage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除充值套餐配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('order:recharge-package:delete')") + public CommonResult deleteRechargePackage(@RequestParam("id") Long id) { + rechargePackageService.deleteRechargePackage(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得充值套餐配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('order:recharge-package:query')") + public CommonResult getRechargePackage(@RequestParam("id") Long id) { + RechargePackageDO rechargePackage = rechargePackageService.getRechargePackage(id); + return success(RechargePackageConvert.INSTANCE.convert(rechargePackage)); + } + + @GetMapping("/list") + @Operation(summary = "获得充值套餐配置列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('order:recharge-package:query')") + public CommonResult> getRechargePackageList(@RequestParam("ids") Collection ids) { + List list = rechargePackageService.getRechargePackageList(ids); + return success(RechargePackageConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得充值套餐配置分页") + @PreAuthorize("@ss.hasPermission('order:recharge-package:query')") + public CommonResult> getRechargePackagePage(@Valid RechargePackagePageReqVO pageVO) { + PageResult pageResult = rechargePackageService.getRechargePackagePage(pageVO); + return success(RechargePackageConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出充值套餐配置 Excel") + @PreAuthorize("@ss.hasPermission('order:recharge-package:export')") + @OperateLog(type = EXPORT) + public void exportRechargePackageExcel(@Valid RechargePackageExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = rechargePackageService.getRechargePackageList(exportReqVO); + // 导出 Excel + List datas = RechargePackageConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "充值套餐配置.xls", "数据", RechargePackageExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageBaseVO.java new file mode 100644 index 0000000..0ee5b80 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageBaseVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 充值套餐配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class RechargePackageBaseVO { + + @Schema(description = "充值金额") + private Integer rechargeAmount; + + @Schema(description = "赠送金额") + private Integer giftAmount; + + @Schema(description = "状态 0-开启 1-关闭", example = "2") + private Integer status; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageCreateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageCreateReqVO.java new file mode 100644 index 0000000..0e0edd3 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 充值套餐配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargePackageCreateReqVO extends RechargePackageBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExcelVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExcelVO.java new file mode 100644 index 0000000..3b56b15 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExcelVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 充值套餐配置 Excel VO + * + * @author admin + */ +@Data +public class RechargePackageExcelVO { + + @ExcelProperty("订单ID") + private Long id; + + @ExcelProperty("充值金额") + private Integer rechargeAmount; + + @ExcelProperty("赠送金额") + private Integer giftAmount; + + @ExcelProperty("状态 0-开启 1-关闭") + private Integer status; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExportReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExportReqVO.java new file mode 100644 index 0000000..22cdce1 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageExportReqVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 充值套餐配置 Excel 导出 Request VO,参数和 RechargePackagePageReqVO 是一致的") +@Data +public class RechargePackageExportReqVO { + + @Schema(description = "充值金额") + private Integer rechargeAmount; + + @Schema(description = "赠送金额") + private Integer giftAmount; + + @Schema(description = "状态 0-开启 1-关闭", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackagePageReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackagePageReqVO.java new file mode 100644 index 0000000..620da86 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackagePageReqVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 充值套餐配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargePackagePageReqVO extends PageParam { + + @Schema(description = "充值金额") + private Integer rechargeAmount; + + @Schema(description = "赠送金额") + private Integer giftAmount; + + @Schema(description = "状态 0-开启 1-关闭", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageRespVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageRespVO.java new file mode 100644 index 0000000..203e899 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 充值套餐配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargePackageRespVO extends RechargePackageBaseVO { + + @Schema(description = "配置ID", example = "23375") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageUpdateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageUpdateReqVO.java new file mode 100644 index 0000000..a14d892 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/rechargepackage/vo/RechargePackageUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 充值套餐配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RechargePackageUpdateReqVO extends RechargePackageBaseVO { + + @Schema(description = "订单ID", required = true, example = "23375") + @NotNull(message = "订单ID不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java index 57c8275..f5e8a83 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java @@ -61,4 +61,7 @@ public class StoreAfterSalesBaseVO { @Schema(description = "收货状态:0、未收到,1、已收到", required = true, example = "0") private Integer receivingStatus; + @Schema(description = "退款积分") + private BigDecimal refundIntegral; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/StoreOrderController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/StoreOrderController.java index 8746afb..9a698c4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/StoreOrderController.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/StoreOrderController.java @@ -4,15 +4,20 @@ import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.*; import co.yixiang.yshop.module.order.convert.storeorder.StoreOrderConvert; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.dal.dataobject.storeorderstatus.StoreOrderStatusDO; import co.yixiang.yshop.module.order.dal.redis.order.AsyncCountRedisDAO; +import co.yixiang.yshop.module.order.service.storeorder.AppStoreOrderService; import co.yixiang.yshop.module.order.service.storeorder.AsyncStoreOrderService; import co.yixiang.yshop.module.order.service.storeorder.StoreOrderService; import co.yixiang.yshop.module.order.service.storeorder.dto.OrderTimeDataDto; import co.yixiang.yshop.module.order.service.storeorderstatus.StoreOrderStatusService; +import co.yixiang.yshop.module.shop.controller.app.vo.WriteOffDTO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -47,6 +52,9 @@ public class StoreOrderController { @Resource private AsyncStoreOrderService asyncStoreOrderService; + @Resource + private AppStoreOrderService appStoreOrderService; + @PostMapping("/create") @Operation(summary = "创建订单") @PreAuthorize("@ss.hasPermission('order:store-order:create')") @@ -57,7 +65,7 @@ public class StoreOrderController { @PutMapping("/update") @Operation(summary = "更新订单") @PreAuthorize("@ss.hasPermission('order:store-order:update')") - public CommonResult updateStoreOrder(@Valid @RequestBody StoreOrderUpdateReqVO updateReqVO) { + public CommonResult updateStoreOrder(@Valid @RequestBody StoreOrderUpdateReqVO updateReqVO) throws Exception { storeOrderService.updateStoreOrder(updateReqVO); return success(true); } @@ -154,6 +162,21 @@ public class StoreOrderController { return success(asyncCountRedisDAO.get()); } + /** + * 订单核销 + */ + @PreAuthenticated + @PostMapping("writeOff") + @Operation(summary = "订单核销") + public CommonResult writeOff(@RequestBody WriteOffDTO dto){ + appStoreOrderService.writeOff(SecurityFrameworkUtils.getLoginUser(),dto); + return CommonResult.success(true); + } + @GetMapping("/get-trend-chart") + @Operation(summary = "获取趋势图") + public CommonResult> getTrendChart() { + return success(storeOrderService.getTrendChart()); + } } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java index 821b40f..9301f46 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java @@ -188,7 +188,7 @@ public class StoreOrderBaseVO { @Schema(description = "门店id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12064") @NotNull(message = "门店id不能为空") - private Integer storeId; + private Long storeId; @Schema(description = "配送方式 1=快递 ,2=门店自提", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @NotNull(message = "配送方式 1=快递 ,2=门店自提不能为空") @@ -203,4 +203,16 @@ public class StoreOrderBaseVO { @Schema(description = "订单类型") private String orderType; + @Schema(description = "核销状态") + private Integer writeOffStatus; + + @Schema(description = "核销时间") + private LocalDateTime writeOffDate; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "分销商ID") + private Long distributorId; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderPageReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderPageReqVO.java index 3d004bb..a17b9c4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderPageReqVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderPageReqVO.java @@ -1,12 +1,12 @@ package co.yixiang.yshop.module.order.controller.admin.storeorder.vo; -import lombok.*; - -import java.math.BigDecimal; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -36,4 +36,13 @@ public class StoreOrderPageReqVO extends PageParam { @Schema(description = "支付状态搜索值") private String payStatus; + @Schema(description = "配送方式 1=快递 ,2=门店自提", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer shippingType; + + @Schema(description = "核销状态") + private Integer writeOffStatus; + + @Schema(description = "门店id") + private Long storeId; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderRespVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderRespVO.java index 3a8ed7a..0cce83a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderRespVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderRespVO.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.order.controller.admin.storeorder.vo; import co.yixiang.yshop.module.member.controller.admin.user.vo.UserRespVO; +import co.yixiang.yshop.module.order.controller.app.order.vo.PayInfo; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -28,6 +29,4 @@ public class StoreOrderRespVO extends StoreOrderBaseVO { @Schema(description = "订单状态", required = true) private String StatusStr; - - } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailBaseVO.java new file mode 100644 index 0000000..46e0ffb --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailBaseVO.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 订单明细 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class StoreOrderDetailBaseVO { + + @Schema(description = "订单id", required = true, example = "31287") + @NotNull(message = "订单id不能为空") + private Long oid; + + @Schema(description = "商品ID", required = true, example = "18855") + @NotNull(message = "商品ID不能为空") + private Long productId; + + @Schema(description = "规格id", required = true, example = "27117") + @NotNull(message = "规格id不能为空") + private Long skuId; + + @Schema(description = "唯一id", required = true) + @NotNull(message = "唯一id不能为空") + private String productAttrUnique; + + @Schema(description = "原价", required = true, example = "13719") + @NotNull(message = "原价不能为空") + private BigDecimal originalPrice; + + @Schema(description = "实际价格", required = true, example = "10651") + @NotNull(message = "实际价格不能为空") + private BigDecimal price; + + @Schema(description = "状态:1、正常,2、售后中,3、售后完成") + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailCreateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailCreateReqVO.java new file mode 100644 index 0000000..9ffda27 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 订单明细创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StoreOrderDetailCreateReqVO extends StoreOrderDetailBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExcelVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExcelVO.java new file mode 100644 index 0000000..f978ec8 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExcelVO.java @@ -0,0 +1,49 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 订单明细 Excel VO + * + * @author moxiangrong + */ +@Data +public class StoreOrderDetailExcelVO { + + @ExcelProperty("订单明细id") + private Long id; + + @ExcelProperty("订单id") + private Long oid; + + @ExcelProperty("商品ID") + private Long productId; + + @ExcelProperty("规格id") + private Long skuId; + + @ExcelProperty("唯一id") + private String productAttrUnique; + + @ExcelProperty("原价") + private BigDecimal originalPrice; + + @ExcelProperty("实际价格") + private BigDecimal price; + + @Schema(description = "状态:1、正常,2、售后中,3、售后完成") + private Integer state; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExportReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExportReqVO.java new file mode 100644 index 0000000..347d927 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailExportReqVO.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 订单明细 Excel 导出 Request VO,参数和 StoreOrderDetailPageReqVO 是一致的") +@Data +public class StoreOrderDetailExportReqVO { + + @Schema(description = "订单id", example = "31287") + private Long oid; + + @Schema(description = "商品ID", example = "18855") + private Long productId; + + @Schema(description = "规格id", example = "27117") + private Long skuId; + + @Schema(description = "唯一id") + private String productAttrUnique; + + @Schema(description = "原价", example = "13719") + private BigDecimal originalPrice; + + @Schema(description = "实际价格", example = "10651") + private BigDecimal price; + + @Schema(description = "状态:1、正常,2、售后中,3、售后完成") + private Integer state; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailPageReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailPageReqVO.java new file mode 100644 index 0000000..ca826b6 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailPageReqVO.java @@ -0,0 +1,44 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import lombok.*; + +import java.math.BigDecimal; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 订单明细分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StoreOrderDetailPageReqVO extends PageParam { + + @Schema(description = "订单id", example = "31287") + private Long oid; + + @Schema(description = "商品ID", example = "18855") + private Long productId; + + @Schema(description = "规格id", example = "27117") + private Long skuId; + + @Schema(description = "唯一id") + private String productAttrUnique; + + @Schema(description = "原价", example = "13719") + private BigDecimal originalPrice; + + @Schema(description = "实际价格", example = "10651") + private BigDecimal price; + + @Schema(description = "状态:1、正常,2、售后中,3、售后完成") + private Integer state; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailRespVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailRespVO.java new file mode 100644 index 0000000..1622eb7 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 订单明细 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StoreOrderDetailRespVO extends StoreOrderDetailBaseVO { + + @Schema(description = "订单明细id", required = true, example = "29901") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailUpdateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailUpdateReqVO.java new file mode 100644 index 0000000..0afd584 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorderdetail/vo/StoreOrderDetailUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 订单明细更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StoreOrderDetailUpdateReqVO extends StoreOrderDetailBaseVO { + + @Schema(description = "订单明细id", required = true, example = "29901") + @NotNull(message = "订单明细id不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/TestOrderController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/TestOrderController.java new file mode 100644 index 0000000..7b29d82 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/TestOrderController.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.order.controller.app; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; +import co.yixiang.yshop.module.order.service.storeorder.AppDistributorOrderFacade; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Tag(name = "用户 APP - 订单模块") +@RequestMapping("/test") +public class TestOrderController { + + @Resource + private AppDistributorOrderFacade appDistributorOrderFacade; + + @PermitAll + @PostMapping("/save") + public CommonResult save() { + appDistributorOrderFacade.createDistributorOrder(new DistributorOrderDTO().setOid(91L).setDistributorId(1L).setUserId(17L)); + return success(Boolean.TRUE); + + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java index 5aa43cf..bd889ae 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java @@ -4,6 +4,7 @@ import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppReturnLogisticsParam; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppStoreAfterSalesParam; +import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppAfterSalesDetailQueryVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreAfterSalesVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderAfterSalesDetailVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderCartInfoVo; @@ -44,11 +45,11 @@ public class AppOrderAfterSalesController { } @PreAuthenticated - @GetMapping("/applyForAfterSales/{key}") + @PostMapping("/applyForAfterSales/get") @Operation(summary = "查询订单详情") @Parameter(name = "key", description = "唯一的uni值或者订单号", required = true, example = "10") - public CommonResult> checkOrderDetails(@PathVariable String key, @RequestParam(value = "goods", defaultValue = "") String goods) { - return success(appStoreAfterSalesService.checkOrderDetails(key, goods)); + public CommonResult> checkOrderDetails(@RequestBody AppAfterSalesDetailQueryVo vo) { + return success(appStoreAfterSalesService.checkOrderDetails(vo)); } @PreAuthenticated diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppOrderRefundParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppOrderRefundParam.java new file mode 100644 index 0000000..635d068 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppOrderRefundParam.java @@ -0,0 +1,45 @@ +package co.yixiang.yshop.module.order.controller.app.afterorder.param; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + + +/** + * 订单退款参数 + * + * @author moxiangrong + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AppOrderRefundParam { + + /** + * 售后id + */ + private Long afterSalesId; + + /** + * 订单编号 + */ + private String orderId; + + /** + * 退款金额 + */ + private BigDecimal price; + + /** + * 商品类型 + */ + private Integer type; + + /** + * 退回积分 + */ + private BigDecimal refundIntegral; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppProsuctParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppProsuctParam.java index 72a6fbd..ff6f8f0 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppProsuctParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppProsuctParam.java @@ -18,4 +18,9 @@ public class AppProsuctParam { */ private String productAttrUnique; + /** + * 商品数量 + */ + private Integer number; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesDetailQueryVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesDetailQueryVo.java new file mode 100644 index 0000000..a9a1365 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesDetailQueryVo.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.order.controller.app.afterorder.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +@Data +@Schema(description = "用户 APP - 售后详情查询参数") +public class AppAfterSalesDetailQueryVo { + + @NotBlank(message="订单key") + private String key; + + @NotBlank(message="退款类型") + private String refundType; + + @NotBlank(message="退款商品信息") + List productDetails; + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesProductDetailQueryVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesProductDetailQueryVo.java new file mode 100644 index 0000000..99da9f4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppAfterSalesProductDetailQueryVo.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.order.controller.app.afterorder.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@Schema(description = "用户 APP - 售后商品详情查询参数") +public class AppAfterSalesProductDetailQueryVo { + + @NotBlank(message="商品规格") + private String goods; + + @NotBlank(message="售后数量") + private Integer number; + + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java index 6a96a70..37f34f4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java @@ -82,6 +82,9 @@ public class AppStoreOrderAfterSalesDetailVo implements Serializable { @Schema(description = "退款金额" ) private BigDecimal refundAmount; + /** 退款积分 */ + private BigDecimal refundableIntegral; + /** 申请原因 */ private String reasons; @@ -103,4 +106,7 @@ public class AppStoreOrderAfterSalesDetailVo implements Serializable { /** 剩余自动确认时间 */ private String remainTime; + @Schema(description = "总优惠金额 会员,优惠券,积分抵扣") + private BigDecimal totalCouponPrice; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java index 9aea6ad..34d1453 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java @@ -58,4 +58,10 @@ public class AppStoreOrderCartInfoVo { /** 订单状态 */ private Integer status; + + /** 退款积分 */ + private BigDecimal refundableIntegral; + + /** 总优惠金额 */ + private BigDecimal totalCouponPrice; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java index 0317ad1..167b766 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java @@ -8,10 +8,10 @@ */ package co.yixiang.yshop.module.order.controller.app.order; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; import co.yixiang.yshop.module.express.dal.redis.express.ExpressRedisDAO; import co.yixiang.yshop.module.express.kdniao.model.dto.KdniaoApiBaseDTO; import co.yixiang.yshop.module.express.kdniao.model.dto.KdniaoApiDTO; @@ -23,6 +23,7 @@ import co.yixiang.yshop.module.order.controller.app.order.vo.AppConfirmOrderVo; import co.yixiang.yshop.module.order.controller.app.order.vo.AppStoreOrderQueryVo; import co.yixiang.yshop.module.order.dal.redis.order.AsyncOrderRedisDAO; import co.yixiang.yshop.module.order.service.storeorder.AppStoreOrderService; +import co.yixiang.yshop.module.shop.controller.app.vo.WriteOffDTO; import com.egzosn.pay.spring.boot.core.PayServiceManager; import com.egzosn.pay.web.support.HttpRequestNoticeParams; import io.swagger.v3.oas.annotations.Operation; @@ -42,12 +43,12 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.List; import java.util.Map; +import java.util.Objects; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.PARAM_ERROR; -import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.STORE_ORDER_NOT_EXISTS; /** *

@@ -71,16 +72,12 @@ public class AppOrderController { @Resource private ExpressRedisDAO expressRedisDAO; - - - - - @PreAuthenticated @PostMapping("/confirm") @Operation(summary = "订单确认") public CommonResult confirm(@Validated @RequestBody AppConfirmOrderParam param) { Long uid = getLoginUserId(); + param.setUseIntegral(Objects.isNull(param.getUseIntegral()) ? Boolean.FALSE : param.getUseIntegral()); return success(appStoreOrderService.confirmOrder(uid, param)); } @@ -104,10 +101,11 @@ public class AppOrderController { @PreAuthenticated @PostMapping("/create/{key}") @Operation(summary = "订单创建") - @Parameter(name = "key", description = "唯一的uni值或者订单号", required = true, example = "10 ") + @Parameter(name = "key", description = "唯一的uni值或者订单号", required = true, example = "10") public CommonResult> create(@Valid @RequestBody AppOrderParam param, @PathVariable String key) { Long uid = getLoginUserId(); + param.setUseIntegral(Objects.isNull(param.getUseIntegral()) ? Boolean.FALSE : param.getUseIntegral()); return success(appStoreOrderService.createOrder(uid, key, param)); } @@ -135,7 +133,6 @@ public class AppOrderController { return success(appStoreOrderService.pay(uid,param)); } - /** * 微信支付回调 * @param request @@ -146,7 +143,7 @@ public class AppOrderController { @Operation(summary = "微信支付回调") @PermitAll public void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { - appStoreOrderService.wxPayNotify(request,response); +// appStoreOrderService.wxPayNotify(request,response); } /** @@ -197,11 +194,8 @@ public class AppOrderController { if (StrUtil.isEmpty(key)) { throw exception(PARAM_ERROR); } - AppStoreOrderQueryVo storeOrder = appStoreOrderService.getOrderInfo(key, uid); - if (ObjectUtil.isNull(storeOrder)) { - throw exception(STORE_ORDER_NOT_EXISTS); - } - return success(appStoreOrderService.handleOrder(storeOrder)); + AppStoreOrderQueryVo vo = appStoreOrderService.orderDetail(key,uid); + return success(vo); } @@ -267,6 +261,18 @@ public class AppOrderController { return success(true); } + /** + * 订单退款 已支付未发货的订单退款,回退积分,回退优惠券,回退库存 + */ + @PreAuthenticated + @PostMapping("/refund") + @Operation(summary = "已支付未发货订单退款") + public CommonResult refundOrder(@Validated @RequestBody AppHandleOrderParam param) { + Long uid = getLoginUserId(); + appStoreOrderService.refundOrder(param.getId(), uid); + return success(true); + } + /** * 个人中心订单统计 */ @@ -300,9 +306,16 @@ public class AppOrderController { } - - - + /** + * 订单核销 + */ + @PreAuthenticated + @PostMapping("writeOff") + @Operation(summary = "订单核销") + public CommonResult writeOff(@RequestBody WriteOffDTO dto){ + appStoreOrderService.writeOff(SecurityFrameworkUtils.getLoginUser(),dto); + return CommonResult.success(true); + } } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java index 6578ef0..7138fa4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java @@ -25,15 +25,16 @@ public class AppComputeOrderParam { @Schema(description = "支付方式", required = true) private String payType; - @Schema(description = "使用积分 1-表示使用", required = true) - private String useIntegral; + @Schema(description = "是否使用积分", required = true) + private Boolean useIntegral; @Schema(description = "配送方式 1=快递 ,2=门店自提", required = true) private Integer shippingType; - @Schema(description = "拼团ID", required = true) - private String pinkId; - @Schema(description = "拼团产品ID", required = true) - private String combinationId; + @Schema(description = "活动类型", required = true) + private Integer campaignType; + + @Schema(description = "营销活动明细id") + private Long campaignDetailId; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java index 89b02a4..46ef1fa 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java @@ -5,7 +5,6 @@ import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; /** * @ClassName 确认订单ConfirmOrderDTO @@ -26,4 +25,15 @@ public class AppConfirmOrderParam { @Schema(description = "优惠券ID", required = true) private Long couponId; + @Schema(description = "下单类型:1、普通下单,2、商品活动下单", required = true) + private Integer orderType; + + @Schema(description = "配送方式 1=快递 ,2=门店自提", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer shippingType; + + @Schema(description = "门店id") + private Long storeId; + + @Schema(description = "是否使用积分", required = true) + private Boolean useIntegral; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java index 8468df8..ae33a24 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java @@ -17,12 +17,6 @@ public class AppOrderParam implements Serializable { @Schema(description = "地址ID", requiredMode = Schema.RequiredMode.REQUIRED) private String addressId; - @Schema(description = "砍价产品ID", requiredMode = Schema.RequiredMode.REQUIRED) - private String bargainId; - - @Schema(description = "拼团ID", requiredMode = Schema.RequiredMode.REQUIRED) - private String combinationId; - @Schema(description = "优惠券ID", requiredMode = Schema.RequiredMode.REQUIRED) private Long couponId; @@ -33,18 +27,11 @@ public class AppOrderParam implements Serializable { @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) private String mark; - - @Schema(description = "拼团id 0没有拼团", requiredMode = Schema.RequiredMode.REQUIRED) - private String pinkId; - - @Schema(description = "秒杀产品ID", requiredMode = Schema.RequiredMode.REQUIRED) - private String seckillId; - @Schema(description = "配送方式 1=快递 ,2=门店自提", requiredMode = Schema.RequiredMode.REQUIRED) private Integer shippingType; @Schema(description = "使用积分 1-表示使用", requiredMode = Schema.RequiredMode.REQUIRED) - private String useIntegral; + private Boolean useIntegral; @Schema(description = "支付渠道(0微信公众号1微信小程序)", requiredMode = Schema.RequiredMode.REQUIRED) private String isChannel; @@ -52,5 +39,19 @@ public class AppOrderParam implements Serializable { @Schema(description = "支付类型 weixin|alipay|yue|integral", requiredMode = Schema.RequiredMode.REQUIRED) private String payType; + @Schema(description = "门店id") + private Long storeId; + + @Schema(description = "活动类型", required = true) + private Integer campaignType; + + @Schema(description = "营销活动明细id") + private Long campaignDetailId; + + @Schema(description = "拼团id", required = true) + private Long teamworkId; + + @Schema(description = "分销商ID", required = true) + private Long distributorId; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java index 4781b1b..86a31b6 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java @@ -19,7 +19,7 @@ public class AppPayParam implements Serializable { @NotBlank(message = "选择支付类型 PayTypeEnum类型(weixin_h5|weixin_applet|weixin_app)") @Schema(description = "支付类型", requiredMode = Schema.RequiredMode.REQUIRED) - private String paytype; + private String payType; @NotBlank(message = "参数错误") @Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java index 513835c..1e06870 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java @@ -3,6 +3,7 @@ package co.yixiang.yshop.module.order.controller.app.order.vo; import co.yixiang.yshop.framework.common.serializer.BigDecimalSerializer; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -25,6 +26,7 @@ public class AppComputeVo implements Serializable { @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal couponPrice; + @Schema(description = "积分抵扣金额") @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal deductionPrice; @@ -37,8 +39,12 @@ public class AppComputeVo implements Serializable { @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal totalPrice; - private Double usedIntegral; //使用了多少积分 + private BigDecimal usedIntegral; //使用了多少积分 @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal payIntegral; + + @Schema(description = "总优惠金额 会员,优惠券,积分抵扣") + private BigDecimal totalCouponPrice; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java index 4117fe9..aad3492 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java @@ -38,13 +38,6 @@ public class AppConfirmOrderVo implements Serializable { //优惠券减 private Boolean deduction; - private Boolean enableIntegral; - - private Double enableIntegralNum; - - //积分抵扣 - private Integer integralRatio; - private String orderKey; private PriceGroupDto priceGroup; diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppOrderDetailVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppOrderDetailVO.java new file mode 100644 index 0000000..3fc20d3 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppOrderDetailVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.order.controller.app.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "用户 APP - 订单明细 VO") +@Data +@ToString(callSuper = true) +public class AppOrderDetailVO { + + @Schema(description = "订单id", required = true, example = "31287") + private Long oid; + + @Schema(description = "商品ID", required = true, example = "18855") + private Long productId; + + @Schema(description = "规格id", required = true, example = "27117") + private Long skuId; + + @Schema(description = "唯一id", required = true) + private String productAttrUnique; + + @Schema(description = "原价", required = true, example = "13719") + private BigDecimal originalPrice; + + @Schema(description = "实际价格", required = true, example = "10651") + private BigDecimal price; + + @Schema(description = "售后状态:1、正常,2、售后中,3、售后完成") + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java index 354cd2d..d34145a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java @@ -178,12 +178,38 @@ public class AppStoreOrderQueryVo implements Serializable { @Schema(description = "更新时间") private LocalDateTime updateTime; - - /** - * 支付信息 - */ + @Schema(description = "支付信息" ) private String payInfo; + @Schema(description = "核销状态" ) + private Integer writeOffStatus; + + @Schema(description = "核销时间" ) + private LocalDateTime writeOffDate; + + @Schema(description = "核销码" ) + private String writeOffCode; + + @Schema(description = "门店id") + private Long storeId; + + @Schema(description = "门店名称") + private String storeName; + + @Schema(description = "门店地址") + private String shopAddress; + + @Schema(description = "营销活动明细id") + private Long campaignDetailId; + + @Schema(description = "活动类型") + private Integer campaignType; + + @Schema(description = "拼团id") + private Long teamworkId; + + @Schema(description = "总优惠金额 会员,优惠券,积分抵扣") + private BigDecimal totalCouponPrice; diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/AppRechargeOrderController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/AppRechargeOrderController.java new file mode 100644 index 0000000..ce4d48d --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/AppRechargeOrderController.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.order.controller.app.rechargeorder; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.order.controller.app.rechargeorder.vo.AppRechargeOrderCreateReqVO; +import co.yixiang.yshop.module.order.service.rechargeorder.RechargeFacade; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Tag(name = "APP - 充值模块") +@RequestMapping("/recharge-order") +public class AppRechargeOrderController { + + @Resource + private RechargeFacade rechargeFacade; + + @PreAuthenticated + @PostMapping(value = "/create") + @Operation(summary = "充值") + public CommonResult create(@Valid @RequestBody AppRechargeOrderCreateReqVO createReqVO) throws Exception { + return success(rechargeFacade.create(createReqVO)); + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/vo/AppRechargeOrderCreateReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/vo/AppRechargeOrderCreateReqVO.java new file mode 100644 index 0000000..fc30116 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargeorder/vo/AppRechargeOrderCreateReqVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.order.controller.app.rechargeorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @Author xwx + * @Date 2024/1/24 + **/ +@Data +@Schema(description = "APP - 充值参数") +public class AppRechargeOrderCreateReqVO { + + @Schema(description = "充值套餐ID", example = "8014") + private Long packageId; + + @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer amount; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargepackage/AppRechargePackageController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargepackage/AppRechargePackageController.java new file mode 100644 index 0000000..262a3e7 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/rechargepackage/AppRechargePackageController.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.order.controller.app.rechargepackage; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeAllConfigVO; +import co.yixiang.yshop.module.order.enums.RechargePackageStatusEnum; +import co.yixiang.yshop.module.order.service.rechargeconfig.RechargeConfigFacade; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Slf4j +@RestController +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Tag(name = "APP - 充值规则模块") +@RequestMapping("/recharge-package") +public class AppRechargePackageController { + + @Resource + private RechargeConfigFacade rechargeConfigFacade; + + @GetMapping("/get-all-config") + @Operation(summary = "获取所有配置") + public CommonResult getAllConfig() { + return success(rechargeConfigFacade.getAllConfig(RechargePackageStatusEnum.OPEN.getStatus())); + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeconfig/RechargeConfigConvert.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeconfig/RechargeConfigConvert.java new file mode 100644 index 0000000..471b789 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeconfig/RechargeConfigConvert.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.order.convert.rechargeconfig; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; + +/** + * 充值配置 Convert + * + * @author admin + */ +@Mapper +public interface RechargeConfigConvert { + + RechargeConfigConvert INSTANCE = Mappers.getMapper(RechargeConfigConvert.class); + + RechargeConfigDO convert(RechargeConfigCreateReqVO bean); + + RechargeConfigDO convert(RechargeConfigUpdateReqVO bean); + + RechargeConfigRespVO convert(RechargeConfigDO bean); + + RechargeAllConfigVO convert02(RechargeConfigDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeorder/RechargeOrderConvert.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeorder/RechargeOrderConvert.java new file mode 100644 index 0000000..ff680d5 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargeorder/RechargeOrderConvert.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.order.convert.rechargeorder; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.order.api.rechargeorder.dto.RechargeOrderDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeorder.RechargeOrderDO; + +/** + * 充值订单 Convert + * + * @author admin + */ +@Mapper +public interface RechargeOrderConvert { + + RechargeOrderConvert INSTANCE = Mappers.getMapper(RechargeOrderConvert.class); + + RechargeOrderDO convert(RechargeOrderCreateReqVO bean); + + RechargeOrderDO convert(RechargeOrderUpdateReqVO bean); + + RechargeOrderRespVO convert(RechargeOrderDO bean); + + RechargeOrderDTO convert02(RechargeOrderDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargepackage/RechargePackageConvert.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargepackage/RechargePackageConvert.java new file mode 100644 index 0000000..2a6b9f6 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/rechargepackage/RechargePackageConvert.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.order.convert.rechargepackage; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeAllConfigVO; + +/** + * 充值套餐配置 Convert + * + * @author admin + */ +@Mapper +public interface RechargePackageConvert { + + RechargePackageConvert INSTANCE = Mappers.getMapper(RechargePackageConvert.class); + + RechargePackageDO convert(RechargePackageCreateReqVO bean); + + RechargePackageDO convert(RechargePackageUpdateReqVO bean); + + RechargePackageUpdateReqVO convert(RechargePackageRespVO bean); + + RechargePackageRespVO convert(RechargePackageDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorderdetail/StoreOrderDetailConvert.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorderdetail/StoreOrderDetailConvert.java new file mode 100644 index 0000000..1b28f7a --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorderdetail/StoreOrderDetailConvert.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.order.convert.storeorderdetail; + + +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailCreateReqVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailExcelVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailRespVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailUpdateReqVO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail.StoreOrderDetailDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import java.util.List; + +/** + * 订单明细 Convert + * + * @author moxiangrong + */ +@Mapper +public interface StoreOrderDetailConvert { + + StoreOrderDetailConvert INSTANCE = Mappers.getMapper(StoreOrderDetailConvert.class); + + StoreOrderDetailDO convert(StoreOrderDetailCreateReqVO bean); + + StoreOrderDetailDO convert(StoreOrderDetailUpdateReqVO bean); + + StoreOrderDetailRespVO convert(StoreOrderDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeconfig/RechargeConfigDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeconfig/RechargeConfigDO.java new file mode 100644 index 0000000..f29a0d9 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeconfig/RechargeConfigDO.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 充值配置 DO + * + * @author admin + */ +@TableName("yshop_recharge_config") +@KeySequence("yshop_recharge_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RechargeConfigDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 自定义金额开关 0-关闭 1-开启 + */ + private Integer customSwitch; + /** + * 最小金额 + */ + private Integer customMin; + /** + * 说明 + */ + private String content; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeorder/RechargeOrderDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeorder/RechargeOrderDO.java new file mode 100644 index 0000000..32fc158 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargeorder/RechargeOrderDO.java @@ -0,0 +1,52 @@ +package co.yixiang.yshop.module.order.dal.dataobject.rechargeorder; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 充值订单 DO + * + * @author admin + */ +@TableName("yshop_recharge_order") +@KeySequence("yshop_recharge_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RechargeOrderDO extends BaseDO { + + /** + * 订单ID + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 用户id + */ + private Long userId; + /** + * 充值状态 0-未支付 1-已支付 + */ + private Integer status; + /** + * 充值金额 + */ + private Integer rechargeAmount; + /** + * 赠送金额 + */ + private Integer giftAmount; + /** + * 充值套餐ID + */ + private Long packageId; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargepackage/RechargePackageDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargepackage/RechargePackageDO.java new file mode 100644 index 0000000..72e8b54 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/rechargepackage/RechargePackageDO.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.order.dal.dataobject.rechargepackage; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 充值套餐配置 DO + * + * @author admin + */ +@TableName("yshop_recharge_package") +@KeySequence("yshop_recharge_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RechargePackageDO extends BaseDO { + + /** + * 订单ID + */ + @TableId + private Long id; + /** + * 充值金额 + */ + private Integer rechargeAmount; + /** + * 赠送金额 + */ + private Integer giftAmount; + /** + * 状态 0-开启 1-关闭 + */ + private Integer status; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java index d56b535..508b14e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java @@ -1,12 +1,12 @@ package co.yixiang.yshop.module.order.dal.dataobject.storeaftersales; -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; /** * 售后记录 DO @@ -36,6 +36,12 @@ public class StoreAfterSalesDO extends BaseDO { * 退款金额 */ private BigDecimal refundAmount; + + /** + * 退款积分 + */ + private BigDecimal refundIntegral; + /** * 服务类型0仅退款1退货退款 */ diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java index 7cfd60f..2775d06 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java @@ -219,7 +219,7 @@ public class StoreOrderDO extends BaseDO { /** * 门店id */ - private Integer storeId; + private Long storeId; /** * 配送方式 1=快递 ,2=门店自提 */ @@ -243,4 +243,51 @@ public class StoreOrderDO extends BaseDO { */ private Integer cityId; +// /** +// * 营销活动id +// */ +// private Long campaignId; + + /** + * 营销活动明细id + */ + private Long campaignDetailId; + + /** + * 活动类型 + */ + private Integer campaignType; + + /** + * 核销状态 + */ + private Integer writeOffStatus; + + /** + * 核销时间 + */ + private LocalDateTime writeOffDate; + + /** + * 核销码 + */ + private String writeOffCode; + + /** + * 拼团id + */ + private Long teamworkId; + + /** + * 是否能售后0不能1能 + */ + private Integer isAfterSales; + + private Long distributorId; + + /** + * 总优惠金额 会员,优惠券,积分抵扣 + */ + private BigDecimal totalCouponPrice; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeordercartinfo/StoreOrderCartInfoDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeordercartinfo/StoreOrderCartInfoDO.java index 03b87d7..89410bd 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeordercartinfo/StoreOrderCartInfoDO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeordercartinfo/StoreOrderCartInfoDO.java @@ -1,11 +1,13 @@ package co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.math.BigDecimal; -import java.util.*; -import com.baomidou.mybatisplus.annotation.*; -import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; /** * 订单购物详情 DO @@ -65,4 +67,13 @@ public class StoreOrderCartInfoDO { * 邮费金额 */ private BigDecimal postagePrice; + + @Schema(description = "积分抵扣金额") + private BigDecimal integralDeductionAmount; + + @Schema(description = "使用积分") + private BigDecimal useIntegral; + + @Schema(description = "实际支付金额") + private BigDecimal payPrice; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorderdetail/StoreOrderDetailDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorderdetail/StoreOrderDetailDO.java new file mode 100644 index 0000000..003d050 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorderdetail/StoreOrderDetailDO.java @@ -0,0 +1,81 @@ +package co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 订单明细 DO + * + * @author moxiangrong + */ +@TableName("yshop_store_order_detail") +@KeySequence("yshop_store_order_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StoreOrderDetailDO extends BaseDO { + + /** + * 订单明细id + */ + @TableId + private Long id; + /** + * 订单id + */ + private Long oid; + /** + * 商品ID + */ + private Long productId; + /** + * 规格id + */ + private Long skuId; + /** + * sku唯一id + */ + private String productAttrUnique; + /** + * 原价 + */ + private BigDecimal originalPrice; + /** + * 实际价格 + */ + private BigDecimal price; + + /** + * 状态:1、正常,2、售后中,3、售后完成 + */ + private Integer state; + + /** + * 订单编号 + */ + private String orderId; + + /** + * 售后id + */ + private Long afterSalesId; + + /** + * 积分抵扣金额 + */ + private BigDecimal integralDeductionAmount; + + /** + * 使用积分 + */ + private BigDecimal useIntegral; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeconfig/RechargeConfigMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeconfig/RechargeConfigMapper.java new file mode 100644 index 0000000..0c9c302 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeconfig/RechargeConfigMapper.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.order.dal.mysql.rechargeconfig; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.*; + +/** + * 充值配置 Mapper + * + * @author admin + */ +@Mapper +public interface RechargeConfigMapper extends BaseMapperX { + + default PageResult selectPage(RechargeConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RechargeConfigDO::getCustomSwitch, reqVO.getCustomSwitch()) + .eqIfPresent(RechargeConfigDO::getCustomMin, reqVO.getCustomMin()) + .eqIfPresent(RechargeConfigDO::getContent, reqVO.getContent()) + .betweenIfPresent(RechargeConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(RechargeConfigDO::getId)); + } + + default List selectList(RechargeConfigExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(RechargeConfigDO::getCustomSwitch, reqVO.getCustomSwitch()) + .eqIfPresent(RechargeConfigDO::getCustomMin, reqVO.getCustomMin()) + .eqIfPresent(RechargeConfigDO::getContent, reqVO.getContent()) + .betweenIfPresent(RechargeConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(RechargeConfigDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeorder/RechargeOrderMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeorder/RechargeOrderMapper.java new file mode 100644 index 0000000..3eb0d40 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargeorder/RechargeOrderMapper.java @@ -0,0 +1,42 @@ +package co.yixiang.yshop.module.order.dal.mysql.rechargeorder; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeorder.RechargeOrderDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.*; + +/** + * 充值订单 Mapper + * + * @author admin + */ +@Mapper +public interface RechargeOrderMapper extends BaseMapperX { + + default PageResult selectPage(RechargeOrderPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RechargeOrderDO::getUserId, reqVO.getUserId()) + .eqIfPresent(RechargeOrderDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(RechargeOrderDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(RechargeOrderDO::getRechargeAmount, reqVO.getRechargeAmount()) + .eqIfPresent(RechargeOrderDO::getGiftAmount, reqVO.getGiftAmount()) + .eqIfPresent(RechargeOrderDO::getPackageId, reqVO.getPackageId()) + .orderByDesc(RechargeOrderDO::getId)); + } + + default List selectList(RechargeOrderExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(RechargeOrderDO::getUserId, reqVO.getUserId()) + .eqIfPresent(RechargeOrderDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(RechargeOrderDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(RechargeOrderDO::getRechargeAmount, reqVO.getRechargeAmount()) + .eqIfPresent(RechargeOrderDO::getGiftAmount, reqVO.getGiftAmount()) + .eqIfPresent(RechargeOrderDO::getPackageId, reqVO.getPackageId()) + .orderByDesc(RechargeOrderDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargepackage/RechargePackageMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargepackage/RechargePackageMapper.java new file mode 100644 index 0000000..02fad3d --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/rechargepackage/RechargePackageMapper.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.order.dal.mysql.rechargepackage; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.*; + +/** + * 充值套餐配置 Mapper + * + * @author admin + */ +@Mapper +public interface RechargePackageMapper extends BaseMapperX { + + default PageResult selectPage(RechargePackagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RechargePackageDO::getRechargeAmount, reqVO.getRechargeAmount()) + .eqIfPresent(RechargePackageDO::getGiftAmount, reqVO.getGiftAmount()) + .eqIfPresent(RechargePackageDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(RechargePackageDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(RechargePackageDO::getId)); + } + + default List selectList(RechargePackageExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(RechargePackageDO::getRechargeAmount, reqVO.getRechargeAmount()) + .eqIfPresent(RechargePackageDO::getGiftAmount, reqVO.getGiftAmount()) + .eqIfPresent(RechargePackageDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(RechargePackageDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(RechargePackageDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java index 75b418b..9b981e5 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java @@ -1,21 +1,24 @@ package co.yixiang.yshop.module.order.dal.mysql.storeorder; -import java.util.*; - import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; +import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.StoreOrderExportReqVO; +import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.StoreOrderPageReqVO; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.enums.AdminOrderStatusEnum; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Mapper; -import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.*; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; /** * 订单 Mapper @@ -31,6 +34,9 @@ public interface StoreOrderMapper extends BaseMapperX { wrapper.eqIfPresent(StoreOrderDO::getOrderId, reqVO.getOrderId()) .likeIfPresent(StoreOrderDO::getRealName, reqVO.getRealName()) .eqIfPresent(StoreOrderDO::getUserPhone, reqVO.getUserPhone()) + .eqIfPresent(StoreOrderDO::getShippingType, reqVO.getShippingType()) + .eqIfPresent(StoreOrderDO::getWriteOffStatus, reqVO.getWriteOffStatus()) + .eqIfPresent(StoreOrderDO::getStoreId, reqVO.getStoreId()) .betweenIfPresent(StoreOrderDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(StoreOrderDO::getId); if (reqVO.getOrderStatus() != null) { @@ -107,4 +113,8 @@ public interface StoreOrderMapper extends BaseMapperX { "where refund_status=0 and deleted=0 and paid=1") Double sumTotalPrice(); + @Update("update yshop_store_order set is_after_sales = #{isAfterSales} where id = #{orderId}") + void closeAfterSaleOrder(@Param("orderId")Long orderId, @Param("isAfterSales")Integer isAfterSales); + + List getTrendChart(); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java new file mode 100644 index 0000000..9839ce6 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java @@ -0,0 +1,58 @@ +package co.yixiang.yshop.module.order.dal.mysql.storeorderdetail; + + +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailExportReqVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailPageReqVO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail.StoreOrderDetailDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.order.controller.app.order.vo.AppOrderDetailVO; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单明细 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface StoreOrderDetailMapper extends BaseMapperX { + + default PageResult selectPage(StoreOrderDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StoreOrderDetailDO::getOid, reqVO.getOid()) + .eqIfPresent(StoreOrderDetailDO::getProductId, reqVO.getProductId()) + .eqIfPresent(StoreOrderDetailDO::getSkuId, reqVO.getSkuId()) + .eqIfPresent(StoreOrderDetailDO::getProductAttrUnique, reqVO.getProductAttrUnique()) + .eqIfPresent(StoreOrderDetailDO::getOriginalPrice, reqVO.getOriginalPrice()) + .eqIfPresent(StoreOrderDetailDO::getPrice, reqVO.getPrice()) + .eqIfPresent(StoreOrderDetailDO::getState, reqVO.getState()) + .betweenIfPresent(StoreOrderDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StoreOrderDetailDO::getId)); + } + + default List selectList(StoreOrderDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(StoreOrderDetailDO::getOid, reqVO.getOid()) + .eqIfPresent(StoreOrderDetailDO::getProductId, reqVO.getProductId()) + .eqIfPresent(StoreOrderDetailDO::getSkuId, reqVO.getSkuId()) + .eqIfPresent(StoreOrderDetailDO::getProductAttrUnique, reqVO.getProductAttrUnique()) + .eqIfPresent(StoreOrderDetailDO::getOriginalPrice, reqVO.getOriginalPrice()) + .eqIfPresent(StoreOrderDetailDO::getPrice, reqVO.getPrice()) + .eqIfPresent(StoreOrderDetailDO::getState, reqVO.getState()) + .betweenIfPresent(StoreOrderDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StoreOrderDetailDO::getId)); + } + + + List getOrderDetails(@Param("productAttrUniques") List productAttrUniques, + @Param("oid") Long oid); + + + void batchInsert(@Param("list") List list); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/RedisKeyConstants.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/RedisKeyConstants.java index c0f32fc..87b31dd 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/RedisKeyConstants.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/RedisKeyConstants.java @@ -33,5 +33,9 @@ public interface RedisKeyConstants { "yshop_order_status:%s", // 参数为访问uid+key STRING, Integer.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + RedisKeyDefine YSHOP_APPLET_NOTICE_TOKEN = new RedisKeyDefine("小程序发货通知token", + "yshop_applet_notice_token:", // 参数为访问uid+key + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java index a5acefe..2d07d4d 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java @@ -6,6 +6,9 @@ import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.module.order.service.storeaftersales.StoreAfterSalesService; import co.yixiang.yshop.module.order.service.storeorder.AppStoreOrderService; +import co.yixiang.yshop.module.order.service.storeorder.StoreOrderService; +import co.yixiang.yshop.module.product.service.campaigninfo.CampaignInfoService; +import co.yixiang.yshop.module.shop.service.popup.PopupService; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RBlockingDeque; @@ -33,6 +36,13 @@ public class RedisDelayHandle { @Resource private StoreAfterSalesService storeAfterSalesService; + @Resource + private CampaignInfoService campaignInfoService; + @Resource + private PopupService popupService; + + @Resource + private StoreOrderService storeOrderService; @PostConstruct @@ -40,7 +50,7 @@ public class RedisDelayHandle { ThreadFactory threadFactory = new ThreadFactoryBuilder().setNamePrefix("delay-job-service").build(); log.info("========延时队列开始========="); ExecutorService executorService = ExecutorBuilder.create() - .setCorePoolSize(4) + .setCorePoolSize(7) .setMaxPoolSize(10) .setKeepAliveTime(0) .setThreadFactory(threadFactory) @@ -49,6 +59,10 @@ public class RedisDelayHandle { executorService.execute(new ExecutorTaskUnPay()); executorService.execute(new ExecutorTaskUnConfirm()); executorService.execute(new ExecutorTaskAfterSalesConfirm()); + executorService.execute(new ExecutorTaskCampaign()); + executorService.execute(new ExecutorTaskPopup()); + executorService.execute(new ExecutorTaskTeamwork()); + executorService.execute(new ExecutorCloseAfterSale()); } class ExecutorTaskUnPay implements Runnable { @@ -114,4 +128,84 @@ public class RedisDelayHandle { } } + class ExecutorTaskCampaign implements Runnable { + @SneakyThrows + @Override + public void run() { + RBlockingDeque blockingCampaignDeque = redissonClient.getBlockingDeque(ShopConstants.CAMPAIGN_CHANGE); + while (true) { + log.info("======延时营销活动循环任务====="); + Long id; + try { + id = blockingCampaignDeque.take(); + log.info("获取到营销活动id:{}", id); + campaignInfoService.campaignStateHandle(id); + } catch (Exception e) { + e.printStackTrace(); + log.error("延时营销活动操作失败,"+e.getMessage()); + } + } + } + } + + class ExecutorTaskPopup implements Runnable { + @SneakyThrows + @Override + public void run() { + RBlockingDeque blockingCampaignDeque = redissonClient.getBlockingDeque(ShopConstants.POPUP_CHANGE); + while (true) { + log.info("======延时广告弹窗循环任务====="); + Long id; + try { + id = blockingCampaignDeque.take(); + log.info("获取到广告弹窗id:{}", id); + popupService.stateChange(id); + } catch (Exception e) { + e.printStackTrace(); + log.error("延时广告弹窗操作失败,"+e.getMessage()); + } + } + } + } + + class ExecutorTaskTeamwork implements Runnable { + @SneakyThrows + @Override + public void run() { + RBlockingDeque blockingCampaignDeque = redissonClient.getBlockingDeque(ShopConstants.TEAMWORK_CHANGE); + while (true) { + log.info("======延时拼团循环任务====="); + Long id; + try { + id = blockingCampaignDeque.take(); + log.info("获取到拼团id:{}", id); + // 拼团结束 + appStoreOrderService.teamworkEnd(id); + } catch (Exception e) { + e.printStackTrace(); + log.error("延时拼团操作失败,"+e.getMessage()); + } + } + } + } + + class ExecutorCloseAfterSale implements Runnable { + + @Override + public void run() { + RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(ShopConstants.CLOSE_AFTER_SALE_KEY); + while (true) { + log.info("======延时关闭订单售后任务====="); + Long id; + try { + id = blockingDeque.take(); + storeOrderService.closeAfterSaleOrder(id); + } catch (Exception e) { + e.printStackTrace(); + log.error("延时关闭订单售后任务,"+e.getMessage()); + } + } + } + } + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayRefundConsumer.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayRefundConsumer.java new file mode 100644 index 0000000..d281225 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayRefundConsumer.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.order.mq.consumer; + +import co.yixiang.yshop.framework.mq.core.stream.AbstractStreamMessageListener; +import co.yixiang.yshop.module.order.service.storeorder.AppStoreOrderService; +import co.yixiang.yshop.module.pay.mq.message.PayRefundMessage; +import co.yixiang.yshop.module.product.enums.product.StockBackTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 消息队列处理支付退款 + */ +@Component +@Slf4j +public class PayRefundConsumer extends AbstractStreamMessageListener { + + @Resource + private AppStoreOrderService appStoreOrderService; + + @Override + public void onMessage(PayRefundMessage message) { + log.info("[onMessage][支付退款处理消息内容({})]", message); + try { + appStoreOrderService.batchRefund(message.getIds(), StockBackTypeEnum.NORMAL.getValue()); + } catch (Exception e) { + throw new RuntimeException(e); + } + log.info("支付退款消息处理完毕【{}】",message.getIds()); + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacade.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacade.java new file mode 100644 index 0000000..d3710dc --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacade.java @@ -0,0 +1,11 @@ +package co.yixiang.yshop.module.order.service.rechargeconfig; + +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeAllConfigVO; + +public interface RechargeConfigFacade { + + RechargeAllConfigVO getAllConfig(Integer status); + + void updateAllConfig(RechargeAllConfigVO rechargeAllConfigVO); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacadeImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacadeImpl.java new file mode 100644 index 0000000..40c6975 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigFacadeImpl.java @@ -0,0 +1,53 @@ +package co.yixiang.yshop.module.order.service.rechargeconfig; + +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeAllConfigVO; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeConfigExportReqVO; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeConfigUpdateReqVO; +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.RechargePackageExportReqVO; +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.RechargePackageRespVO; +import co.yixiang.yshop.module.order.convert.rechargeconfig.RechargeConfigConvert; +import co.yixiang.yshop.module.order.convert.rechargepackage.RechargePackageConvert; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.module.order.service.rechargepackage.RechargePackageService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class RechargeConfigFacadeImpl implements RechargeConfigFacade { + + @Resource + private RechargeConfigService rechargeConfigService; + + @Resource + private RechargePackageService rechargePackageService; + + @Override + public RechargeAllConfigVO getAllConfig(Integer status) { + List rechargeConfigList = rechargeConfigService.getRechargeConfigList(new RechargeConfigExportReqVO()); + RechargeConfigDO rechargeConfigDO = rechargeConfigList.get(0); + RechargeAllConfigVO rechargeAllConfigVO = RechargeConfigConvert.INSTANCE.convert02(rechargeConfigDO); + List rechargePackageList = rechargePackageService.getRechargePackageList(new RechargePackageExportReqVO().setStatus(status)); + List rechargePackageRespVOS = RechargePackageConvert.INSTANCE.convertList(rechargePackageList); + rechargeAllConfigVO.setRechargePackageBaseVOS(rechargePackageRespVOS); + return rechargeAllConfigVO; + } + + @Override + public void updateAllConfig(RechargeAllConfigVO rechargeAllConfigVO) { + List rechargeConfigList = rechargeConfigService.getRechargeConfigList(new RechargeConfigExportReqVO()); + RechargeConfigDO rechargeConfigDO = rechargeConfigList.get(0); + RechargeConfigUpdateReqVO updateReqVO = new RechargeConfigUpdateReqVO(); + updateReqVO.setId(rechargeConfigDO.getId()); + updateReqVO.setCustomSwitch(rechargeAllConfigVO.getCustomSwitch()); + updateReqVO.setCustomMin(rechargeAllConfigVO.getCustomMin()); + updateReqVO.setContent(rechargeAllConfigVO.getContent()); + rechargeConfigService.updateRechargeConfig(updateReqVO); + List rechargePackageBaseVOS = rechargeAllConfigVO.getRechargePackageBaseVOS(); + for (RechargePackageRespVO r:rechargePackageBaseVOS) { + rechargePackageService.updateRechargePackage(RechargePackageConvert.INSTANCE.convert(r)); + } + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigService.java new file mode 100644 index 0000000..e6ea9e4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigService.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.order.service.rechargeconfig; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 充值配置 Service 接口 + * + * @author admin + */ +public interface RechargeConfigService { + + /** + * 创建充值配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRechargeConfig(@Valid RechargeConfigCreateReqVO createReqVO); + + /** + * 更新充值配置 + * + * @param updateReqVO 更新信息 + */ + void updateRechargeConfig(@Valid RechargeConfigUpdateReqVO updateReqVO); + + /** + * 删除充值配置 + * + * @param id 编号 + */ + void deleteRechargeConfig(Long id); + + /** + * 获得充值配置 + * + * @param id 编号 + * @return 充值配置 + */ + RechargeConfigDO getRechargeConfig(Long id); + + /** + * 获得充值配置列表 + * + * @param ids 编号 + * @return 充值配置列表 + */ + List getRechargeConfigList(Collection ids); + + /** + * 获得充值配置分页 + * + * @param pageReqVO 分页查询 + * @return 充值配置分页 + */ + PageResult getRechargeConfigPage(RechargeConfigPageReqVO pageReqVO); + + /** + * 获得充值配置列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 充值配置列表 + */ + List getRechargeConfigList(RechargeConfigExportReqVO exportReqVO); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImpl.java new file mode 100644 index 0000000..2fad2a2 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImpl.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.order.service.rechargeconfig; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.order.convert.rechargeconfig.RechargeConfigConvert; +import co.yixiang.yshop.module.order.dal.mysql.rechargeconfig.RechargeConfigMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; + +/** + * 充值配置 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class RechargeConfigServiceImpl implements RechargeConfigService { + + @Resource + private RechargeConfigMapper rechargeConfigMapper; + + @Override + public Long createRechargeConfig(RechargeConfigCreateReqVO createReqVO) { + // 插入 + RechargeConfigDO rechargeConfig = RechargeConfigConvert.INSTANCE.convert(createReqVO); + rechargeConfigMapper.insert(rechargeConfig); + // 返回 + return rechargeConfig.getId(); + } + + @Override + public void updateRechargeConfig(RechargeConfigUpdateReqVO updateReqVO) { + // 校验存在 + validateRechargeConfigExists(updateReqVO.getId()); + // 更新 + RechargeConfigDO updateObj = RechargeConfigConvert.INSTANCE.convert(updateReqVO); + rechargeConfigMapper.updateById(updateObj); + } + + @Override + public void deleteRechargeConfig(Long id) { + // 校验存在 + validateRechargeConfigExists(id); + // 删除 + rechargeConfigMapper.deleteById(id); + } + + private void validateRechargeConfigExists(Long id) { + if (rechargeConfigMapper.selectById(id) == null) { + throw exception(RECHARGE_CONFIG_NOT_EXISTS); + } + } + + @Override + public RechargeConfigDO getRechargeConfig(Long id) { + return rechargeConfigMapper.selectById(id); + } + + @Override + public List getRechargeConfigList(Collection ids) { + return rechargeConfigMapper.selectBatchIds(ids); + } + + @Override + public PageResult getRechargeConfigPage(RechargeConfigPageReqVO pageReqVO) { + return rechargeConfigMapper.selectPage(pageReqVO); + } + + @Override + public List getRechargeConfigList(RechargeConfigExportReqVO exportReqVO) { + return rechargeConfigMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacade.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacade.java new file mode 100644 index 0000000..5779cde --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacade.java @@ -0,0 +1,9 @@ +package co.yixiang.yshop.module.order.service.rechargeorder; + +import co.yixiang.yshop.module.order.controller.app.rechargeorder.vo.AppRechargeOrderCreateReqVO; + +public interface RechargeFacade { + + String create(AppRechargeOrderCreateReqVO createReqVO); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacadeImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacadeImpl.java new file mode 100644 index 0000000..905fa46 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeFacadeImpl.java @@ -0,0 +1,73 @@ +package co.yixiang.yshop.module.order.service.rechargeorder; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; +import co.yixiang.yshop.module.member.api.user.MemberUserApi; +import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.RechargeConfigExportReqVO; +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.RechargeOrderCreateReqVO; +import co.yixiang.yshop.module.order.controller.app.rechargeorder.vo.AppRechargeOrderCreateReqVO; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.module.order.enums.ReachargeOrderStatusEnum; +import co.yixiang.yshop.module.order.service.rechargeconfig.RechargeConfigService; +import co.yixiang.yshop.module.order.service.rechargepackage.RechargePackageService; +import co.yixiang.yshop.module.pay.enums.PayOrderConstants; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.RECHARGE_MIN_ERROR; + +@Service +public class RechargeFacadeImpl implements RechargeFacade { + + @Resource + private RechargeOrderService rechargeOrderService; + + @Resource + private RechargePackageService rechargePackageService; + + @Resource + private RechargeConfigService rechargeConfigService; + + @Resource + private MemberUserApi memberUserApi; + + @Override + public String create(AppRechargeOrderCreateReqVO createReqVO) { + // 充值套餐 + + Long userId = getLoginUserId(); + MemberUserRespDTO user = memberUserApi.getUser(userId); + // 获取id工具 + Snowflake snowflake = IdUtil.createSnowflake(1, 1); + String nextIdStr = PayOrderConstants.RECHARGE_ORDER_PREFIX + snowflake.nextIdStr(); + + // 保存充值订单 + RechargeOrderCreateReqVO rechargeOrderCreateReqVO = new RechargeOrderCreateReqVO(); + rechargeOrderCreateReqVO.setId(nextIdStr); + rechargeOrderCreateReqVO.setUserId(userId); + if (createReqVO.getPackageId() != null) { + RechargePackageDO rechargePackage = rechargePackageService.getRechargePackage(createReqVO.getPackageId()); + rechargeOrderCreateReqVO.setRechargeAmount(rechargePackage.getRechargeAmount()); + rechargeOrderCreateReqVO.setGiftAmount(rechargePackage.getGiftAmount()); + rechargeOrderCreateReqVO.setPackageId(createReqVO.getPackageId()); + }else { + List rechargeConfigList = rechargeConfigService.getRechargeConfigList(new RechargeConfigExportReqVO()); + if (createReqVO.getAmount() < rechargeConfigList.get(0).getCustomMin()) { + throw exception(RECHARGE_MIN_ERROR); + } + rechargeOrderCreateReqVO.setRechargeAmount(createReqVO.getAmount()); + rechargeOrderCreateReqVO.setGiftAmount(0); + } + + rechargeOrderCreateReqVO.setStatus(ReachargeOrderStatusEnum.WAIT.getValue()); + rechargeOrderService.createRechargeOrder(rechargeOrderCreateReqVO); + + return nextIdStr; + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderService.java new file mode 100644 index 0000000..77fc99c --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderService.java @@ -0,0 +1,72 @@ +package co.yixiang.yshop.module.order.service.rechargeorder; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeorder.RechargeOrderDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 充值订单 Service 接口 + * + * @author admin + */ +public interface RechargeOrderService { + + /** + * 创建充值订单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + String createRechargeOrder(@Valid RechargeOrderCreateReqVO createReqVO); + + /** + * 更新充值订单 + * + * @param updateReqVO 更新信息 + */ + void updateRechargeOrder(@Valid RechargeOrderUpdateReqVO updateReqVO); + + /** + * 删除充值订单 + * + * @param id 编号 + */ + void deleteRechargeOrder(String id); + + /** + * 获得充值订单 + * + * @param id 编号 + * @return 充值订单 + */ + RechargeOrderDO getRechargeOrder(String id); + + /** + * 获得充值订单列表 + * + * @param ids 编号 + * @return 充值订单列表 + */ + List getRechargeOrderList(Collection ids); + + /** + * 获得充值订单分页 + * + * @param pageReqVO 分页查询 + * @return 充值订单分页 + */ + PageResult getRechargeOrderPage(RechargeOrderPageReqVO pageReqVO); + + /** + * 获得充值订单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 充值订单列表 + */ + List getRechargeOrderList(RechargeOrderExportReqVO exportReqVO); + + void refund() throws Exception; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderServiceImpl.java new file mode 100644 index 0000000..7b931d9 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargeorder/RechargeOrderServiceImpl.java @@ -0,0 +1,122 @@ +package co.yixiang.yshop.module.order.service.rechargeorder; + +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentKit; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.WXPayUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.*; +import co.yixiang.yshop.module.order.controller.admin.rechargeorder.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeorder.RechargeOrderDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.order.convert.rechargeorder.RechargeOrderConvert; +import co.yixiang.yshop.module.order.dal.mysql.rechargeorder.RechargeOrderMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; + +/** + * 充值订单 Service 实现类 + * + * @author admin + */ +@Service +@Validated +@Slf4j +public class RechargeOrderServiceImpl implements RechargeOrderService { + + @Resource + private RechargeOrderMapper rechargeOrderMapper; + + @Value("${weixin.certurl}") + private String cert_url; + + @Override + public String createRechargeOrder(RechargeOrderCreateReqVO createReqVO) { + // 插入 + RechargeOrderDO rechargeOrder = RechargeOrderConvert.INSTANCE.convert(createReqVO); + rechargeOrderMapper.insert(rechargeOrder); + // 返回 + return rechargeOrder.getId(); + } + + @Override + public void updateRechargeOrder(RechargeOrderUpdateReqVO updateReqVO) { + // 校验存在 + validateRechargeOrderExists(updateReqVO.getId()); + // 更新 + RechargeOrderDO updateObj = RechargeOrderConvert.INSTANCE.convert(updateReqVO); + rechargeOrderMapper.updateById(updateObj); + } + + @Override + public void deleteRechargeOrder(String id) { + // 校验存在 + validateRechargeOrderExists(id); + // 删除 + rechargeOrderMapper.deleteById(id); + } + + private void validateRechargeOrderExists(String id) { + if (rechargeOrderMapper.selectById(id) == null) { + throw exception(RECHARGE_ORDER_NOT_EXISTS); + } + } + + @Override + public RechargeOrderDO getRechargeOrder(String id) { + return rechargeOrderMapper.selectById(id); + } + + @Override + public List getRechargeOrderList(Collection ids) { + return rechargeOrderMapper.selectBatchIds(ids); + } + + @Override + public PageResult getRechargeOrderPage(RechargeOrderPageReqVO pageReqVO) { + return rechargeOrderMapper.selectPage(pageReqVO); + } + + @Override + public List getRechargeOrderList(RechargeOrderExportReqVO exportReqVO) { + return rechargeOrderMapper.selectList(exportReqVO); + } + + @Override + public void refund() throws Exception { + List rechargeOrderDOS = rechargeOrderMapper.selectList(new RechargeOrderExportReqVO().setStatus(1)); + for (RechargeOrderDO r:rechargeOrderDOS) { + //退款资金来源-可用余额退款 + String refundAccount="REFUND_SOURCE_RECHARGE_FUNDS"; + Map params = new HashMap<>(); + params.put("appid", "wxf0713a10bbae8732"); + params.put("mch_id","1558500071"); + params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //商户订单号和微信订单号二选一 + params.put("out_refund_no", r.getId()); + params.put("total_fee", new BigDecimal(r.getRechargeAmount()).multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_fee", new BigDecimal(r.getRechargeAmount()).multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_account", refundAccount); + // 退款原因,若商户传入,会在下发给用户的退款消息中体现退款原因 + params.put("refund_desc","退款"); + //退款回调 先不做 + // params.put("notify_url", pc_refund_notify_url); + //签名算法 + String sign = WXPayUtil.generateSignature(params, "zk7BHJJWThinkSztbI6zye9ZA70uNFtT"); + params.put("sign", sign); + String xml = PaymentKit.toXml(params); + String xmlStr = WXPayUtil.doRefund("https://api.mch.weixin.qq.com/secapi/pay/refund", xml, cert_url, "1558500071"); + //加入微信支付日志 + Map stringStringMap = PaymentKit.xmlToMap(xmlStr); + log.info(stringStringMap.toString()); + } + + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageService.java new file mode 100644 index 0000000..1a96b94 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageService.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.order.service.rechargepackage; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 充值套餐配置 Service 接口 + * + * @author admin + */ +public interface RechargePackageService { + + /** + * 创建充值套餐配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRechargePackage(@Valid RechargePackageCreateReqVO createReqVO); + + /** + * 更新充值套餐配置 + * + * @param updateReqVO 更新信息 + */ + void updateRechargePackage(@Valid RechargePackageUpdateReqVO updateReqVO); + + /** + * 删除充值套餐配置 + * + * @param id 编号 + */ + void deleteRechargePackage(Long id); + + /** + * 获得充值套餐配置 + * + * @param id 编号 + * @return 充值套餐配置 + */ + RechargePackageDO getRechargePackage(Long id); + + /** + * 获得充值套餐配置列表 + * + * @param ids 编号 + * @return 充值套餐配置列表 + */ + List getRechargePackageList(Collection ids); + + /** + * 获得充值套餐配置分页 + * + * @param pageReqVO 分页查询 + * @return 充值套餐配置分页 + */ + PageResult getRechargePackagePage(RechargePackagePageReqVO pageReqVO); + + /** + * 获得充值套餐配置列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 充值套餐配置列表 + */ + List getRechargePackageList(RechargePackageExportReqVO exportReqVO); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImpl.java new file mode 100644 index 0000000..0f6eff4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImpl.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.order.service.rechargepackage; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.order.convert.rechargepackage.RechargePackageConvert; +import co.yixiang.yshop.module.order.dal.mysql.rechargepackage.RechargePackageMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; + +/** + * 充值套餐配置 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class RechargePackageServiceImpl implements RechargePackageService { + + @Resource + private RechargePackageMapper rechargePackageMapper; + + @Override + public Long createRechargePackage(RechargePackageCreateReqVO createReqVO) { + // 插入 + RechargePackageDO rechargePackage = RechargePackageConvert.INSTANCE.convert(createReqVO); + rechargePackageMapper.insert(rechargePackage); + // 返回 + return rechargePackage.getId(); + } + + @Override + public void updateRechargePackage(RechargePackageUpdateReqVO updateReqVO) { + // 校验存在 + validateRechargePackageExists(updateReqVO.getId()); + // 更新 + RechargePackageDO updateObj = RechargePackageConvert.INSTANCE.convert(updateReqVO); + rechargePackageMapper.updateById(updateObj); + } + + @Override + public void deleteRechargePackage(Long id) { + // 校验存在 + validateRechargePackageExists(id); + // 删除 + rechargePackageMapper.deleteById(id); + } + + private void validateRechargePackageExists(Long id) { + if (rechargePackageMapper.selectById(id) == null) { + throw exception(RECHARGE_PACKAGE_NOT_EXISTS); + } + } + + @Override + public RechargePackageDO getRechargePackage(Long id) { + return rechargePackageMapper.selectById(id); + } + + @Override + public List getRechargePackageList(Collection ids) { + return rechargePackageMapper.selectBatchIds(ids); + } + + @Override + public PageResult getRechargePackagePage(RechargePackagePageReqVO pageReqVO) { + return rechargePackageMapper.selectPage(pageReqVO); + } + + @Override + public List getRechargePackageList(RechargePackageExportReqVO exportReqVO) { + return rechargePackageMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesService.java index 6b3d0ab..bcd7fdd 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesService.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesService.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.order.service.storeaftersales; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppReturnLogisticsParam; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppStoreAfterSalesParam; +import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppAfterSalesDetailQueryVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreAfterSalesVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderAfterSalesDetailVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderCartInfoVo; @@ -28,11 +29,10 @@ public interface AppStoreAfterSalesService extends IService { /** * 查询订单详情 - * @param key 订单号 - * @param goods 商品规格 + * @param vo * @return */ - List checkOrderDetails(String key, String goods); + List checkOrderDetails(AppAfterSalesDetailQueryVo vo); /** * 查询订单详情 diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java index 7197825..cee740a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java @@ -6,32 +6,31 @@ import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; +import co.yixiang.yshop.framework.redis.util.RedissonUtil; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppProsuctParam; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppReturnLogisticsParam; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppStoreAfterSalesParam; -import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreAfterSalesVo; -import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderAfterSalesDetailVo; -import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderCartInfoVo; +import co.yixiang.yshop.module.order.controller.app.afterorder.vo.*; import co.yixiang.yshop.module.order.convert.storeaftersales.StoreAfterSalesConvert; import co.yixiang.yshop.module.order.dal.dataobject.storeaftersales.StoreAfterSalesDO; import co.yixiang.yshop.module.order.dal.dataobject.storeaftersalesitem.StoreAfterSalesItemDO; import co.yixiang.yshop.module.order.dal.dataobject.storeaftersalesstatus.StoreAfterSalesStatusDO; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail.StoreOrderDetailDO; import co.yixiang.yshop.module.order.dal.dataobject.storeorderstatus.StoreOrderStatusDO; import co.yixiang.yshop.module.order.dal.mysql.storeaftersales.StoreAfterSalesMapper; import co.yixiang.yshop.module.order.dal.mysql.storeaftersalesitem.StoreAfterSalesItemMapper; import co.yixiang.yshop.module.order.dal.mysql.storeaftersalesstatus.StoreAfterSalesStatusMapper; import co.yixiang.yshop.module.order.dal.mysql.storeorder.StoreOrderMapper; import co.yixiang.yshop.module.order.dal.mysql.storeordercartinfo.StoreOrderCartInfoMapper; +import co.yixiang.yshop.module.order.dal.mysql.storeorderdetail.StoreOrderDetailMapper; import co.yixiang.yshop.module.order.dal.mysql.storeorderstatus.StoreOrderStatusMapper; import co.yixiang.yshop.module.order.dal.redis.ofterorder.AfterOrderRedisDAO; import co.yixiang.yshop.module.order.enums.*; import co.yixiang.yshop.module.order.service.storeaftersalesstatus.StoreAfterSalesStatusService; -import co.yixiang.yshop.module.order.service.storeorder.AppStoreOrderServiceImpl; import co.yixiang.yshop.module.order.service.storeorderstatus.StoreOrderStatusService; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; -import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -42,9 +41,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.redisson.api.RBlockingDeque; -import org.redisson.api.RDelayedQueue; -import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -57,11 +53,12 @@ import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; -import static co.yixiang.yshop.framework.common.enums.OrderInfoEnum.STATUS_DEFAULT; -import static co.yixiang.yshop.framework.common.enums.OrderInfoEnum.UNABLE_AFTER_SALES; +import static co.yixiang.yshop.framework.common.enums.OrderInfoEnum.*; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.module.order.enums.AfterSalesStatusEnum.USER_CANCELLED; import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; @@ -94,7 +91,9 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery().eq(StoreOrderDO::getOrderId, storeAfterSalesParam.getOrderId()).eq(StoreOrderDO::getUid, userId)); - System.out.println("storeAfterSalesParam:" + storeAfterSalesParam); + log.info("storeAfterSalesParam:{}", JSONObject.toJSONString(storeAfterSalesParam)); + // 查询订单信息 + StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery() + .eq(StoreOrderDO::getOrderId, storeAfterSalesParam.getOrderId()).eq(StoreOrderDO::getUid, userId)); + //自提切已经核销订单不可申请售后 + if(yxStoreOrder.getShippingType().equals(SHIPPING_TYPE_STORE_PICKUP.getValue()) && yxStoreOrder.getWriteOffStatus().equals(OrderWriteOffStatusEnum.WRITTEN_OFF.getValue())){ + throw exception(ORDER_REFUND_NOT_STORE_PICKUP); + } afterOrderRedisDAO.set(userId, storeAfterSalesParam.getOrderId(), yxStoreOrder.getStatus().toString()); - checkOrder(yxStoreOrder); + // checkOrder(yxStoreOrder); // 退款金额 BigDecimal refundAmount = BigDecimal.ZERO; + BigDecimal refundIntegral = BigDecimal.ZERO; //拿到所有的商品 - List yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery().eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); + List yxStoreOrderCartInfos = + storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery() + .eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); + // 查询出可以售后的订单明细 + List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery() + .eq(StoreOrderDetailDO::getOid, yxStoreOrder.getId()) + .eq(StoreOrderDetailDO::getState, OrderDetailStateEnum.NORMAL.getValue()) + ); + if (CollectionUtils.isEmpty(orderDetailDOS)) throw exception(ORDER_REFUND_NOT); + Map> orderDetailmap = + orderDetailDOS.stream().collect(Collectors.groupingBy(StoreOrderDetailDO::getProductAttrUnique)); List insertAfterSalesItems = new ArrayList<>(); // 发货标识 boolean sendFlag = STATUS_DEFAULT.getValue().equals(yxStoreOrder.getStatus()); + Map productParamMap = + storeAfterSalesParam.getProductParamList().stream().collect(Collectors + .toMap(AppProsuctParam::getProductAttrUnique, Function.identity())); + List updateOrderDetails = new ArrayList<>(); for (StoreOrderCartInfoDO yxStoreOrderCartInfo : yxStoreOrderCartInfos) { - AppStoreCartQueryVo cartInfo = JSONObject.parseObject(yxStoreOrderCartInfo.getCartInfo(), AppStoreCartQueryVo.class); + AppStoreCartQueryVo cartInfo = + JSONObject.parseObject(yxStoreOrderCartInfo.getCartInfo(), AppStoreCartQueryVo.class); // 过滤出对应规格的商品 - AppProsuctParam productParam = storeAfterSalesParam.getProductParamList().stream() - .filter(item -> cartInfo.getProductAttrUnique().equals(item.getProductAttrUnique())) - .findFirst().orElse(new AppProsuctParam()); - if (productParam.getProductId() != null) { - // 商品优惠前总金额 - BigDecimal totalAmountOfGoods = NumberUtil.mul(cartInfo.getTruePrice(), cartInfo.getCartNum()); - refundAmount = refundAmount.add(totalAmountOfGoods).subtract(yxStoreOrderCartInfo.getCouponPrice()); - // 未发货退运费 - if (sendFlag) { + AppProsuctParam productParam = productParamMap.get(cartInfo.getProductAttrUnique()); + List skuOrderDetails = orderDetailmap.get(cartInfo.getProductAttrUnique()); + if (ObjectUtil.isNotNull(productParam) && productParam.getProductId() != null) { + // 退款不可超过购买数量 + if (CollectionUtils.isEmpty(skuOrderDetails) || skuOrderDetails.size() < productParam.getNumber()) { + throw exception(ORDER_REFUND_NUMBER_LACK_ERROR); + } + // 计算退款金额 + refundAmount = refundAmount.add(NumberUtil.mul(yxStoreOrderCartInfo.getPayPrice(),productParam.getNumber())); + //计算退款积分 + refundIntegral = refundIntegral.add(NumberUtil.mul(yxStoreOrderCartInfo.getUseIntegral(),productParam.getNumber())); + // 未发货且全部退货退运费 + if (sendFlag && skuOrderDetails.size() == productParam.getNumber()) { refundAmount = refundAmount.add(yxStoreOrderCartInfo.getPostagePrice()); } yxStoreOrderCartInfo.setIsAfterSales(UNABLE_AFTER_SALES.getValue()); @@ -136,13 +160,16 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl res.setStoreAfterSalesId(storeAfterSales.getId())); // 售后明细批量保存 storeAfterSalesItemMapper.insertBatch(insertAfterSalesItems); + updateOrderDetails.forEach(res -> { + res.setAfterSalesId(storeAfterSales.getId()); + res.setState(OrderDetailStateEnum.IN_AFTER_SALES.getValue()); + }); + // 定单明细批量修改 + orderDetailMapper.updateBatch(updateOrderDetails, updateOrderDetails.size()); // 记录订单操作 storeOrderStatusService.create(yxStoreOrder.getUid(), yxStoreOrder.getId(), APPLY_AFTER_SALES.getValue(), APPLY_AFTER_SALES.getDesc()); @@ -172,11 +206,8 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl blockingDeque = redissonClient.getBlockingDeque(ShopConstants.REDIS_AFTERSALESORDER_UNCONFIRM); - RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); - delayedQueue.offer(storeAfterSales.getId(), ShopConstants.AFTER_SALES_ORDER_OUTTIME_UNCONFIRM, TimeUnit.DAYS); - String s = ShopConstants.AFTER_SALES_ORDER_OUTTIME_UNCONFIRM + "天"; - log.info("添加延时队列成功 ,延迟时间:" + s); + redissonUtil.delayedOffer(ShopConstants.REDIS_AFTERSALESORDER_UNCONFIRM, storeAfterSales.getId(), ShopConstants.AFTER_SALES_ORDER_OUTTIME_UNCONFIRM, TimeUnit.DAYS); + return storeAfterSales.getId(); } @@ -204,8 +235,16 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl orderDetailDOS = + orderDetailMapper.selectList(new LambdaQueryWrapper() + .eq(StoreOrderDetailDO::getAfterSalesId, afterSales.getId())); + Map> orderDetailDOMap = + orderDetailDOS.stream().collect(Collectors.groupingBy(StoreOrderDetailDO::getProductAttrUnique)); for (AppStoreCartQueryVo cart : cartInfo) { totalPrice = totalPrice.add(cart.getTruePrice().multiply(BigDecimal.valueOf(cart.getCartNum()))); + cart.setCartNum(CollectionUtils.isNotEmpty(orderDetailDOMap.get(cart.getProductAttrUnique())) ? + orderDetailDOMap.get(cart.getProductAttrUnique()).size() : cart.getCartNum()); } // 查询是否发货 @@ -223,7 +262,9 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl checkOrderDetails(String key, String goods) { + public List checkOrderDetails(AppAfterSalesDetailQueryVo vo) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and(i -> i.eq(StoreOrderCartInfoDO::getOrderId, key) - .or().eq(StoreOrderCartInfoDO::getUnique, key).or() - .eq(StoreOrderCartInfoDO::getOid, key)); + wrapper.and(i -> i.eq(StoreOrderCartInfoDO::getOrderId, vo.getKey()) + .or().eq(StoreOrderCartInfoDO::getUnique, vo.getKey()).or() + .eq(StoreOrderCartInfoDO::getOid, vo.getKey())); List yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(wrapper); if (yxStoreOrderCartInfos == null || yxStoreOrderCartInfos.isEmpty()) { throw exception(STORE_ORDER_NOT_EXISTS); } // 查询订单信息 - StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery().eq(StoreOrderDO::getOrderId, yxStoreOrderCartInfos.get(0).getOrderId())); + StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery() + .eq(StoreOrderDO::getOrderId, yxStoreOrderCartInfos.get(0).getOrderId())); + // 查询可售后的订单详情 + List orderDetailDOS = + orderDetailMapper.selectList(Wrappers.lambdaQuery() + .eq(StoreOrderDetailDO::getOid, yxStoreOrder.getId()) + .eq(StoreOrderDetailDO::getState, OrderDetailStateEnum.NORMAL.getValue())); + if (CollectionUtils.isEmpty(orderDetailDOS)) throw exception(ORDER_DETAIL_NOT_EXISTS); + Map> orderDetailDOSMap = + orderDetailDOS.stream().collect(Collectors.groupingBy(StoreOrderDetailDO::getProductAttrUnique)); + List yxStoreOrderCartInfoVos = new ArrayList<>(); List productAttrUniques = null; - if (StringUtils.isNotBlank(goods)) { - productAttrUniques = Arrays.asList(goods.split(",")); + Map productDetailMap = null; + if (CollectionUtils.isNotEmpty(vo.getProductDetails())) { + productAttrUniques = vo.getProductDetails().stream() + .map(AppAfterSalesProductDetailQueryVo::getGoods).collect(Collectors.toList()); + productDetailMap = + vo.getProductDetails().stream().collect(Collectors.toMap(e -> e.getGoods(), e -> e.getNumber())); } for (StoreOrderCartInfoDO yxStoreOrderCartInfo : yxStoreOrderCartInfos) { - AppStoreCartQueryVo cartInfo = JSONObject.parseObject(yxStoreOrderCartInfo.getCartInfo(), AppStoreCartQueryVo.class); - if (CollectionUtils.isNotEmpty(productAttrUniques) && !productAttrUniques.contains(cartInfo.getProductAttrUnique())) { + AppStoreCartQueryVo cartInfo = + JSONObject.parseObject(yxStoreOrderCartInfo.getCartInfo(), AppStoreCartQueryVo.class); + if (CollectionUtils.isEmpty(orderDetailDOSMap.get(cartInfo.getProductAttrUnique()))) continue; + // 记录总数 + Integer total = orderDetailDOSMap.get(cartInfo.getProductAttrUnique()).size(); + // 设置选中退款的总数 + if (ObjectUtil.isNotNull(productDetailMap) && + ObjectUtil.isNotNull(productDetailMap.get(cartInfo.getProductAttrUnique()))) { + total = productDetailMap.get(cartInfo.getProductAttrUnique()); + } + if (CollectionUtils.isNotEmpty(productAttrUniques) && + !productAttrUniques.contains(cartInfo.getProductAttrUnique())) { continue; } AppStoreOrderCartInfoVo yxStoreOrderCartInfoVo = new AppStoreOrderCartInfoVo(); @@ -283,23 +350,19 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery() + List yxStoreOrderCartInfos = + storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery() .eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); for (StoreOrderCartInfoDO yxStoreOrderCartInfo : yxStoreOrderCartInfos) { yxStoreOrderCartInfo.setIsAfterSales(ShopCommonEnum.YES.getValue()); storeOrderCartInfoMapper.updateById(yxStoreOrderCartInfo); } + // 修改订单明细状态 + orderDetailMapper.update(null, new LambdaUpdateWrapper() + .eq(StoreOrderDetailDO::getAfterSalesId, id) + .set(StoreOrderDetailDO::getState, OrderDetailStateEnum.NORMAL.getValue()) + ); + //操作记录 storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId(), AfterChangeTypeEnum.USER_REVOCATION.getValue(), AfterChangeTypeEnum.USER_REVOCATION.getDesc()); @@ -495,8 +565,20 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl storeAfterSalesItems = storeAfterSalesItemMapper.selectList(Wrappers.lambdaQuery().eq(StoreAfterSalesItemDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); List cartInfo = storeAfterSalesItems.stream().map(cart -> JSON.parseObject(cart.getCartInfo(), AppStoreCartQueryVo.class)).collect(Collectors.toList()); + // 查询订单明细详情 + List orderDetailDOS = + orderDetailMapper.selectList(new LambdaQueryWrapper() + .eq(StoreOrderDetailDO::getAfterSalesId, storeAfterSalesVo.getId())); + Map> orderDetailDOMap = + orderDetailDOS.stream().collect(Collectors.groupingBy(StoreOrderDetailDO::getProductAttrUnique)); + cartInfo.forEach(res -> { + res.setCartNum(CollectionUtils.isNotEmpty(orderDetailDOMap.get(res.getProductAttrUnique())) ? + orderDetailDOMap.get(res.getProductAttrUnique()).size() : res.getCartNum()); + }); storeAfterSalesVo.setCartInfo(cartInfo); - List storeAfterSalesStatuses = storeAfterSalesStatusMapper.selectList(Wrappers.lambdaQuery().eq(StoreAfterSalesStatusDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); + List storeAfterSalesStatuses = + storeAfterSalesStatusMapper.selectList(Wrappers.lambdaQuery() + .eq(StoreAfterSalesStatusDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); StoreOrderDO storeOrderDO = storeOrderMapper.selectOne(new LambdaQueryWrapper() @@ -522,7 +604,7 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery() .eq(StoreAfterSalesDO::getOrderCode, orderCode).eq(StoreAfterSalesDO::getId, salesId)); //审核成功 if (AfterTypeEnum.AGREE.getValue().equals(approvalStatus)) { + // 退款参数 + AppOrderRefundParam param = new AppOrderRefundParam(salesId, storeAfterSales.getOrderCode(), + storeAfterSales.getRefundAmount(), StockBackTypeEnum.DEFAULT.getValue(), + storeAfterSales.getRefundIntegral()); //退货退款 - if(AfterTypeEnum.RETURNS_REFUNDS.getValue().equals(storeAfterSales.getServiceType())) { - if(Objects.equals(AfterSalesStatusEnum.USER_SHIPPED.getValue(), storeAfterSales.getState())){ - //退款金额大于0才生成退款单 - appStoreOrderService.orderRefund(storeAfterSales.getOrderCode(), storeAfterSales.getRefundAmount()); + if (AfterTypeEnum.RETURNS_REFUNDS.getValue().equals(storeAfterSales.getServiceType())) { + if (Objects.equals(AfterSalesStatusEnum.USER_SHIPPED.getValue(), storeAfterSales.getState())) { + //退款金额大于0才生成退款单 + appStoreOrderService.orderRefund(param); storeAfterSales.setState(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.PAYMENT.getValue(),AfterChangeTypeEnum.PAYMENT.getDesc()); - }else { + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId() + , AfterChangeTypeEnum.PAYMENT.getValue(), AfterChangeTypeEnum.PAYMENT.getDesc()); + } else { if (StringUtils.isEmpty(consignee) || StringUtils.isEmpty(phoneNumber) || StringUtils.isEmpty(address)) { throw exception(ORDER_ADDRESS_REQUERED); } storeAfterSales.setConsignee(consignee); storeAfterSales.setPhoneNumber(phoneNumber); storeAfterSales.setAddress(address); - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.AUDIT_SUCCESS.getValue(),AfterChangeTypeEnum.AUDIT_SUCCESS.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId() + , AfterChangeTypeEnum.AUDIT_SUCCESS.getValue(), AfterChangeTypeEnum.AUDIT_SUCCESS.getDesc()); storeAfterSales.setState(AfterSalesStatusEnum.AUDITED.getValue()); } //退款退货得后面一步同意退款才退 - }else { + } else { //仅仅退款直接退款 - appStoreOrderService.orderRefund(storeAfterSales.getOrderCode(),storeAfterSales.getRefundAmount()); + appStoreOrderService.orderRefund(param); storeAfterSales.setState(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.PAYMENT.getValue(),AfterChangeTypeEnum.PAYMENT.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId() + , AfterChangeTypeEnum.PAYMENT.getValue(), AfterChangeTypeEnum.PAYMENT.getDesc()); } @@ -130,8 +140,8 @@ public class StoreAfterSalesServiceImpl implements StoreAfterSalesService { storeAfterSales.setState(AfterSalesStatusEnum.MERCHANT_REJECTION.getValue()); // storeAfterSales.setSalesState(AfterTypeEnum.REFUSE.getValue()); //操作记录 - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.AUDIT_FAILED.getValue(),AfterChangeTypeEnum.AUDIT_FAILED.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId() + , AfterChangeTypeEnum.AUDIT_FAILED.getValue(), AfterChangeTypeEnum.AUDIT_FAILED.getDesc()); StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery().eq(StoreOrderDO::getOrderId, storeAfterSales.getOrderCode())); String o = afterOrderRedisDAO.get(yxStoreOrder.getOrderId(), yxStoreOrder.getUid()); @@ -139,7 +149,7 @@ public class StoreAfterSalesServiceImpl implements StoreAfterSalesService { // 退款状态重置 yxStoreOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()); storeOrderMapper.updateById(yxStoreOrder); - afterOrderRedisDAO.delete(storeAfterSales.getOrderCode(),storeAfterSales.getUserId()); + afterOrderRedisDAO.delete(storeAfterSales.getOrderCode(), storeAfterSales.getUserId()); // 订单详情重置是否售后字段 List yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery() .eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); @@ -154,17 +164,23 @@ public class StoreAfterSalesServiceImpl implements StoreAfterSalesService { /** * 立即退款 + * * @param id 编号 */ @Override - public void payStoreAfterSales(Long id) throws Exception{ + public void payStoreAfterSales(Long id) throws Exception { StoreAfterSalesDO storeAfterSales = storeAfterSalesMapper.selectOne(Wrappers.lambdaQuery() .eq(StoreAfterSalesDO::getId, id)); - appStoreOrderService.orderRefund(storeAfterSales.getOrderCode(),storeAfterSales.getRefundAmount()); storeAfterSales.setState(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.PAYMENT.getValue(),AfterChangeTypeEnum.PAYMENT.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId() + , AfterChangeTypeEnum.PAYMENT.getValue(), AfterChangeTypeEnum.PAYMENT.getDesc()); + // 退款参数 + AppOrderRefundParam param = new AppOrderRefundParam(id, storeAfterSales.getOrderCode(), + storeAfterSales.getRefundAmount(), StockBackTypeEnum.DEFAULT.getValue(), + storeAfterSales.getRefundIntegral()); + appStoreOrderService.orderRefund(param); + } @@ -192,7 +208,7 @@ public class StoreAfterSalesServiceImpl implements StoreAfterSalesService { PageResult storeAfterSalesRespVOPageResult = StoreAfterSalesConvert.INSTANCE.convertPage(pageResult); for (StoreAfterSalesRespVO storeAfterSalesRespVO : storeAfterSalesRespVOPageResult.getList()) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreAfterSalesItemDO::getStoreAfterSalesId,storeAfterSalesRespVO.getId()); + wrapper.eq(StoreAfterSalesItemDO::getStoreAfterSalesId, storeAfterSalesRespVO.getId()); List storeAfterSalesItemDOS = storeAfterSalesItemMapper.selectList(wrapper); MemberUserDO memberUserDO = memberUserMapper.selectById(storeAfterSalesRespVO.getUserId()); UserRespVO userRespVO = UserConvert.INSTANCE.convert4(memberUserDO); @@ -203,5 +219,4 @@ public class StoreAfterSalesServiceImpl implements StoreAfterSalesService { } - } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacade.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacade.java new file mode 100644 index 0000000..973fd91 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacade.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.order.service.storeorder; + +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; + +/** + * 分销订单处理 + */ +public interface AppDistributorOrderFacade { + + // 创建订单 + void createDistributorOrder(DistributorOrderDTO distributorOrderDTO); + + // 取消订单 + void cancelDistributorOrder(DistributorOrderDTO distributorOrderDTO); + + // 更新订单 + void updateDistributorOrder(DistributorOrderDTO distributorOrderDTO); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacadeImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacadeImpl.java new file mode 100644 index 0000000..bcc71b4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppDistributorOrderFacadeImpl.java @@ -0,0 +1,119 @@ +package co.yixiang.yshop.module.order.service.storeorder; + +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; +import co.yixiang.yshop.module.distributor.api.DistributorOrderApi; +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; +import co.yixiang.yshop.module.distributor.api.dto.DistributorProductDTO; +import co.yixiang.yshop.module.distributor.enums.DistributorProductTypeEnum; +import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.StoreOrderRespVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailExportReqVO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail.StoreOrderDetailDO; +import co.yixiang.yshop.module.order.service.storeorderdetail.StoreOrderDetailService; +import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; +import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; +import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Service +@Validated +public class AppDistributorOrderFacadeImpl implements AppDistributorOrderFacade { + + @Resource + private StoreOrderService storeOrderService; + + @Resource + private StoreOrderDetailService storeOrderDetailService; + + @Resource + private StoreProductService storeProductService; + + @Resource + private StoreProductAttrValueService storeProductAttrValueService; + + @Resource + private DistributorOrderApi distributorOrderApi; + + @Override + public void createDistributorOrder(DistributorOrderDTO distributorOrderDTO) { + // 处理订单 + distributorOrderApi.createDistributorOrder(this.makeDistributorOrderDTO(distributorOrderDTO)); + } + + @Override + public void cancelDistributorOrder(DistributorOrderDTO distributorOrderDTO) { + // 获取全部详情 + List storeOrderDetailList = storeOrderDetailService.getStoreOrderDetailList(new StoreOrderDetailExportReqVO().setOid(distributorOrderDTO.getOid())); + // 所有详情id + List ids = CollectionUtils.convertList(storeOrderDetailList, StoreOrderDetailDO::getId); + distributorOrderApi.cancelDistributorOrder(ids); + } + + @Override + public void updateDistributorOrder(DistributorOrderDTO distributorOrderDTO) { + distributorOrderApi.updateDistributorOrder(this.makeDistributorOrderDTO(distributorOrderDTO)); + } + + private DistributorOrderDTO makeDistributorOrderDTO(DistributorOrderDTO distributorOrderDTO) { + List productDTOList = new ArrayList<>(); + + // 获取订单 + StoreOrderRespVO storeOrder = storeOrderService.getStoreOrder(distributorOrderDTO.getOid()); + // 获取全部详情 + List storeOrderDetailList = storeOrderDetailService.getStoreOrderDetailList(new StoreOrderDetailExportReqVO().setOid(distributorOrderDTO.getOid())); + + // 所有商品id + List productIds = CollectionUtils.convertList(storeOrderDetailList, StoreOrderDetailDO::getProductId); + List storeProductList = storeProductService.getStoreProductList(productIds); + Map storeProductMap = storeProductList.stream().collect(Collectors.toMap(StoreProductDO::getId, p -> p, (existingValue, newValue) -> existingValue)); + + // 所有商品唯一值 + List uniques = CollectionUtils.convertList(storeOrderDetailList, StoreOrderDetailDO::getProductAttrUnique); + List storeProductAttrValueList = storeProductAttrValueService.getStoreProductAttrValueListByUniques(uniques); + Map storeProductAttrValueMap = storeProductAttrValueList.stream().collect(Collectors.toMap(StoreProductAttrValueDO::getUnique, p -> p, (existingValue, newValue) -> existingValue)); + + // 赋值 + distributorOrderDTO.setOrderId(storeOrder.getOrderId()); + distributorOrderDTO.setUserId(storeOrder.getUid()); + distributorOrderDTO.setUserName(storeOrder.getRealName()); + distributorOrderDTO.setDistributorId(storeOrder.getDistributorId()); + + storeOrderDetailList.forEach(storeOrderDetailDO -> { + Long productId = storeOrderDetailDO.getProductId(); + DistributorProductDTO distributorProductDTO = new DistributorProductDTO(); + + StoreProductDO storeProductDO = storeProductMap.get(productId); + if (storeProductDO.getIsDistribution().equals(DistributorProductTypeEnum.YES.getType())) { + distributorProductDTO.setProductId(productId); + distributorProductDTO.setProductName(storeProductDO.getStoreName()); + distributorProductDTO.setProductOriginalPrice(storeOrderDetailDO.getOriginalPrice()); + distributorProductDTO.setProductPrice(storeOrderDetailDO.getPrice()); + distributorProductDTO.setDetailId(storeOrderDetailDO.getId()); + distributorProductDTO.setDistributionRule(storeProductDO.getDistributionRule()); + distributorProductDTO.setDistributionPurchase(storeProductDO.getDistributionPurchase()); + distributorProductDTO.setDistributionProductSettlement(storeProductDO.getDistributionProductSettlement()); + distributorProductDTO.setDistributionWagesSettlement(storeProductDO.getDistributionWagesSettlement()); + distributorProductDTO.setDistributionLevel(storeProductDO.getDistributionLevel()); + + StoreProductAttrValueDO storeProductAttrValueDO = storeProductAttrValueMap.get(storeOrderDetailDO.getProductAttrUnique()); + distributorProductDTO.setProductAttrValueId(storeProductAttrValueDO.getId()); + distributorProductDTO.setFirstWages(storeProductAttrValueDO.getFirstWages()); + distributorProductDTO.setSecondWages(storeProductAttrValueDO.getSecondWages()); + productDTOList.add(distributorProductDTO); + } + }); + + distributorOrderDTO.setProductDTOList(productDTOList); + return distributorOrderDTO; + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java index 644a56a..a8ec811 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java @@ -1,5 +1,7 @@ package co.yixiang.yshop.module.order.service.storeorder; +import co.yixiang.yshop.framework.security.core.LoginUser; +import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppOrderRefundParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppComputeOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppConfirmOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppOrderParam; @@ -7,12 +9,11 @@ import co.yixiang.yshop.module.order.controller.app.order.param.AppPayParam; import co.yixiang.yshop.module.order.controller.app.order.vo.AppConfirmOrderVo; import co.yixiang.yshop.module.order.controller.app.order.vo.AppStoreOrderQueryVo; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; +import co.yixiang.yshop.module.shop.controller.app.vo.WriteOffDTO; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.math.BigDecimal; -import java.text.ParseException; import java.util.List; import java.util.Map; @@ -79,6 +80,8 @@ public interface AppStoreOrderService extends IService { void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception; + void wxPayNotify(String orderId, Map resultMap) throws Exception; + /** * 余额支付 * @param orderId 订单号 @@ -147,11 +150,49 @@ public interface AppStoreOrderService extends IService { /** * 确认订单退款 * - * @param orderId 单号 - * @param price 金额 + * @param param 退款参数 */ - void orderRefund(String orderId, BigDecimal price) throws Exception; + void orderRefund(AppOrderRefundParam param) throws Exception; + + /** + * 批量退款 + * + * @param ids 退款id集合 + * @param type 退款商品类型 + */ + void batchRefund(List ids, Integer type) throws Exception; + /** + * 核销订单 + * @param user 用户信息 + * @param dto 核销信息 + */ + void writeOff(LoginUser user, WriteOffDTO dto); + /** + * 查询订单详情 + * @param key / + * @param uid / + * @return / + */ + AppStoreOrderQueryVo orderDetail(String key, Long uid); + + void updatePayInfo(AppStoreOrderQueryVo orderInfo, Map packageParams); + + void updatePayInfo(AppStoreOrderQueryVo orderInfo, String outTradeNo, String transactionId); + + /** + * 拼团结束 + * @param teamworkId + * @return + */ + void teamworkEnd(Long teamworkId) throws Exception; + + /** + * 订单退款 已支付未发货的订单退款,回退积分,回退优惠券,回退库存 + * @param id 订单id + * @param uid 用户id + */ + void refundOrder(String id, Long uid); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java index d63e407..327f5da 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java @@ -1,60 +1,80 @@ package co.yixiang.yshop.module.order.service.storeorder; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.*; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; +import co.yixiang.yshop.framework.common.enums.UserTypeEnum; import co.yixiang.yshop.framework.common.exception.ErrorCode; import co.yixiang.yshop.framework.common.util.json.JsonUtils; import co.yixiang.yshop.framework.common.util.servlet.ServletUtils; +import co.yixiang.yshop.framework.dict.core.util.DictFrameworkUtils; +import co.yixiang.yshop.framework.redis.util.RedissonUtil; +import co.yixiang.yshop.framework.security.core.LoginUser; import co.yixiang.yshop.module.cart.service.storecart.AppStoreCartService; +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; +import co.yixiang.yshop.module.distributor.enums.DistributorSettlementTypeEnum; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillModifyDTO; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.SettleLevelInfoVO; +import co.yixiang.yshop.module.member.convert.user.UserConvert; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.dal.dataobject.useraddress.UserAddressDO; import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.enums.BillEnum; +import co.yixiang.yshop.module.member.service.integralrule.strategy.IntegralRuleContext; import co.yixiang.yshop.module.member.service.user.MemberUserService; import co.yixiang.yshop.module.member.service.useraddress.AppUserAddressService; import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import co.yixiang.yshop.module.member.service.userlevelconfig.UserLevelConfigService; import co.yixiang.yshop.module.message.enums.WechatTempateEnum; import co.yixiang.yshop.module.message.mq.producer.WeixinNoticeProducer; +import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppOrderRefundParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppComputeOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppConfirmOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppPayParam; -import co.yixiang.yshop.module.order.controller.app.order.vo.AppComputeVo; -import co.yixiang.yshop.module.order.controller.app.order.vo.AppConfirmOrderVo; -import co.yixiang.yshop.module.order.controller.app.order.vo.AppStoreOrderQueryVo; -import co.yixiang.yshop.module.order.controller.app.order.vo.PayInfo; +import co.yixiang.yshop.module.order.controller.app.order.vo.*; import co.yixiang.yshop.module.order.convert.storeorder.StoreOrderConvert; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail.StoreOrderDetailDO; import co.yixiang.yshop.module.order.dal.dataobject.storeorderstatus.StoreOrderStatusDO; import co.yixiang.yshop.module.order.dal.mysql.storeorder.StoreOrderMapper; +import co.yixiang.yshop.module.order.dal.mysql.storeorderdetail.StoreOrderDetailMapper; import co.yixiang.yshop.module.order.dal.mysql.storeorderstatus.StoreOrderStatusMapper; import co.yixiang.yshop.module.order.dal.redis.order.OrderRedisDAO; import co.yixiang.yshop.module.order.enums.*; import co.yixiang.yshop.module.order.service.storeorder.dto.*; import co.yixiang.yshop.module.order.service.storeordercartinfo.StoreOrderCartInfoService; +import co.yixiang.yshop.module.order.service.storeorderdetail.StoreOrderDetailService; import co.yixiang.yshop.module.order.service.storeorderstatus.StoreOrderStatusService; import co.yixiang.yshop.module.pay.PayContext; import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import co.yixiang.yshop.module.pay.enums.PayOrderConstants; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; import co.yixiang.yshop.module.pay.service.merchantdetails.MerchantDetailsService; import co.yixiang.yshop.module.pay.strategy.weixin.service.WxPayServiceUtils; import co.yixiang.yshop.module.pay.strategy.weixin.skd.HttpKit; import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentApi; import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentKit; import co.yixiang.yshop.module.pay.strategy.weixin.skd.RandomStringUtil; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.param.TeamworkRefundParam; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.TeamworkInfoCreateVO; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponDetailVO; import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplates.ShippingTemplatesDO; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplatesfree.ShippingTemplatesFreeDO; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplatesregion.ShippingTemplatesRegionDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductreply.StoreProductReplyDO; +import co.yixiang.yshop.module.product.enums.campaign.CampaignTypeEnum; +import co.yixiang.yshop.module.product.enums.campaign.TeamworkStateEnum; +import co.yixiang.yshop.module.product.enums.product.StockBackTypeEnum; +import co.yixiang.yshop.module.product.enums.teamworkinfo.VirtuallyEnum; +import co.yixiang.yshop.module.product.service.campaigninfo.AppCampaignInfoService; import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; import co.yixiang.yshop.module.product.service.productcouponrelation.dto.CartCouponDto; import co.yixiang.yshop.module.product.service.shippingtemplates.ShippingTemplatesService; @@ -62,6 +82,12 @@ import co.yixiang.yshop.module.product.service.shippingtemplatesfree.ShippingTem import co.yixiang.yshop.module.product.service.shippingtemplatesregion.ShippingTemplatesRegionService; import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; import co.yixiang.yshop.module.product.service.storeproductreply.AppStoreProductReplyService; +import co.yixiang.yshop.module.product.service.teamworkinfo.TeamworkInfoService; +import co.yixiang.yshop.module.shop.controller.app.vo.WriteOffDTO; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; +import co.yixiang.yshop.module.shop.dal.dataobject.shopassistant.ShopAssistantDO; +import co.yixiang.yshop.module.shop.service.shop.ShopService; +import co.yixiang.yshop.module.shop.service.shopassistant.ShopAssistantService; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -74,13 +100,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.egzosn.pay.spring.boot.core.PayServiceManager; import com.egzosn.pay.spring.boot.core.bean.MerchantPayOrder; import com.google.common.collect.Maps; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.StringUtils; -import org.redisson.api.RBlockingDeque; -import org.redisson.api.RDelayedQueue; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -95,13 +123,20 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static co.yixiang.yshop.module.member.enums.BillDetailEnum.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.STORE_NOT_EXISTS; import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_ADDRESS_NOT_EXISTS; import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.order.enums.OrderWriteOffStatusEnum.TO_BE_WRITTEN_OFF; +import static co.yixiang.yshop.module.order.enums.OrderWriteOffStatusEnum.WRITTEN_OFF; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.SHOP_ASSISTANT_NOT_WRITE_OFF; +import static co.yixiang.yshop.module.system.enums.DictTypeConstants.*; /** * 订单 Service 实现类 @@ -161,12 +196,44 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartGroup = appStoreCartService.getUserProductCartList(uid, - param.getCartId(), ShopConstants.YSHOP_ONE_NUM); + param.getCartId(), OrderTypeEnum.CAMPAIGN_ORDER.getValue().equals(param.getOrderType()) + ? OrderTypeEnum.CAMPAIGN_ORDER.getValue() : ShopConstants.YSHOP_ONE_NUM); if (ObjectUtil.isNotEmpty(cartGroup.get("invalid"))) { throw exception(INVALID_PRODUCT); } if (ObjectUtil.isEmpty(cartGroup.get("valid"))) { throw exception(VALID_PRODUCT_EMPTY); } + //获取用户信息 + MemberUserDO user = memberUserService.getUser(uid); boolean deduction = false; - boolean enableIntegral = true; //获取默认地址 - UserAddressDO userAddress = appUserAddressService.getOne(Wrappers.lambdaQuery() - .eq(UserAddressDO::getUid, uid) - .eq(Objects.nonNull(param.getAddressId()) && param.getAddressId() != 0, UserAddressDO::getId, param.getAddressId()) - .orderByDesc(UserAddressDO::getIsDefault).last("limit 1")); + UserAddressDO userAddress = getUserDefaultAddress(uid, param); List cartInfo = (List) cartGroup.get("valid"); - PriceGroupDto priceGroup = this.getOrderPriceGroup(cartInfo, userAddress, param.getCouponId()); - + //计算订单价格信息 + PriceGroupDto priceGroup; + if (OrderTypeEnum.CAMPAIGN_ORDER.getValue().equals(param.getOrderType())) { + priceGroup = this.getOrderPriceGroupForCampaign(cartInfo, userAddress, param.getShippingType()); + } else { + priceGroup = this.getOrderPriceGroup(user, cartInfo, userAddress, param.getCouponId(), param.getShippingType(), param.getUseIntegral()); + } //缓存订单 CacheDto cacheDTO = new CacheDto(); cacheDTO.setCartInfo(cartInfo); @@ -202,22 +273,24 @@ public class AppStoreOrderServiceImpl extends ServiceImpllambdaQuery() + .eq(UserAddressDO::getUid, uid) + .eq(Objects.nonNull(param.getAddressId()) && param.getAddressId() != 0, UserAddressDO::getId, param.getAddressId()) + .orderByDesc(UserAddressDO::getIsDefault).last("limit 1")); + } + /** * 订单信息 * @@ -258,39 +331,35 @@ public class AppStoreOrderServiceImpl extends ServiceImpl map = this.computedOrder(uid, key, appComputeOrderParam); @@ -322,15 +393,13 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartIds = new ArrayList<>(); CacheDto cacheDTO = orderRedisDAO.get(key, uid); @@ -345,7 +414,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl blockingDeque = redissonClient.getBlockingDeque(ShopConstants.REDIS_ORDER_OUTTIME_UNPAY_QUEUE); - RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); - delayedQueue.offer(orderId, ShopConstants.ORDER_OUTTIME_UNPAY, TimeUnit.MINUTES); - String s = TimeUnit.SECONDS.toSeconds(ShopConstants.ORDER_OUTTIME_UNPAY) + "分钟"; - log.info("添加延时队列成功 ,延迟时间:" + s + "订单id: " + orderId); - } catch (Exception e) { - log.error(e.getMessage()); - } + redissonUtil.delayedOffer(ShopConstants.REDIS_ORDER_OUTTIME_UNPAY_QUEUE, orderId, ShopConstants.ORDER_OUTTIME_UNPAY, TimeUnit.MINUTES); OrderExtendDto orderDTO = new OrderExtendDto(); orderDTO.setKey(key); @@ -442,6 +525,70 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartInfo) { + BigDecimal gainIntegral = BigDecimal.ZERO; + for (AppStoreCartQueryVo cart : cartInfo) { + if (cart.getCombinationId() > 0 || cart.getSeckillId() > 0 || cart.getBargainId() > 0) { + continue; + } + BigDecimal cartInfoGainIntegral = BigDecimal.ZERO; + Double gain = cart.getProductInfo().getGiveIntegral().doubleValue(); + if (gain > 0) { + cartInfoGainIntegral = NumberUtil.round(NumberUtil.mul(cart.getCartNum(), gain), 2); + } + gainIntegral = NumberUtil.add(gainIntegral, cartInfoGainIntegral); + } + return gainIntegral; + } + + + /** + * 用户地址校验 + * + * @param param / + */ + private UserAddressDO verifyAndGetUserAddress(AppOrderParam param) { + if (ShippingTypeEnum.SHIPPING_TYPE_EXPRESS_DELIVERY.getValue().equals(param.getShippingType())) { + if (StrUtil.isEmpty(param.getAddressId())) { + throw exception(SELECT_ADDRESS); + } + UserAddressDO userAddress = appUserAddressService.getById(param.getAddressId()); + if (ObjectUtil.isNull(userAddress)) { + throw exception(USER_ADDRESS_NOT_EXISTS); + } + return userAddress; + } else if (ShippingTypeEnum.SHIPPING_TYPE_STORE.getValue().equals(param.getShippingType())) { + return new UserAddressDO(); + } else { + throw exception(PARAM_ERROR); + } + } + + + /** + * 门店相关校验 + * + * @param param + */ + private void verifyStore(AppOrderParam param) { + if (param.getShippingType().equals(ShippingTypeEnum.SHIPPING_TYPE_STORE.getValue())) { + if (Objects.isNull(param.getStoreId())) { + throw exception(STORE_NOT_EXISTS); + } + ShopDO shop = shopService.getShop(param.getStoreId()); + if (Objects.isNull(shop)) { + throw exception(STORE_NOT_EXISTS); + } + } + } + /** * 第三方支付查单 * @@ -458,7 +605,8 @@ public class AppStoreOrderServiceImpl extends ServiceImpl map = PaymentApi.queryByTransactionId(merchantDetailsDO.getAppid(), merchantDetailsDO.getMchId(), merchantDetailsDO.getKeyPrivate(), payInfo.getTransaction_id()); log.info("查询到微信订单信息:" + map.toString()); return map.get("return_code").equals("SUCCESS") && map.get("result_code").equals("SUCCESS") && map.get("trade_state").equals("SUCCESS"); - } else { - //其他支付查单 - return false; - } + }else return param.getPayType().contains(PayTypeEnum.YUE.getType()); } /** @@ -484,44 +629,51 @@ public class AppStoreOrderServiceImpl extends ServiceImpl pay(Long uid, AppPayParam param) throws Exception { - AppStoreOrderQueryVo orderInfo = getOrderInfo(param.getUni(), uid); - if (ObjectUtil.isNull(orderInfo)) { - throw exception(STORE_ORDER_NOT_EXISTS); - } - if (orderInfo.getPaid().equals(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue())) { - throw exception(ORDER_PAY_FINISH); - } - //如果是小程序或APP 先获取用户openid - MemberUserDO userDO = memberUserService.getUser(uid); - if (PayTypeEnum.WEIXIN_APPLET.getValue().equals(param.getPaytype())) { - //小程序支付需要openid - if (Objects.isNull(userDO.getRoutineOpenid())) throw exception(USER_NOT_BINDING_WX_APPLET); - } - //根据type得到支付商户配置 - MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.toType(param.getPaytype()).getCode()); - PayContext payContext = new PayContext(); - Map packageParams = new HashMap<>(); - if (param.getPaytype().contains(PayTypeEnum.ALI.getValue())) { - aliPay(orderInfo, param, packageParams); - updatePayInfo(orderInfo, packageParams); - } else if (param.getPaytype().contains(PayTypeEnum.WEIXIN.getValue())) { - packageParams = payContext.selectPayWay(PayTypeEnum.WEIXIN.getValue(), - new PayParam(orderInfo.getOrderId(), orderInfo.getPayPrice(), userDO.getRoutineOpenid(), ServletUtils.getClientIP(), - param.getPaytype(), "Yshop商城", merchantDetailsDO)); - updatePayInfo(orderInfo, packageParams); - } else if (param.getPaytype().contains(PayTypeEnum.YUE.getValue())) { - yuePay(param.getUni(), uid); - } - // 异步统计 - asyncStoreOrderService.orderData(uid); - return packageParams; +// AppStoreOrderQueryVo orderInfo = getOrderInfo(param.getUni(), uid); +// if (ObjectUtil.isNull(orderInfo)) { +// throw exception(STORE_ORDER_NOT_EXISTS); +// } +// if (orderInfo.getPaid().equals(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue())) { +// throw exception(ORDER_PAY_FINISH); +// } +// //如果是小程序或APP 先获取用户openid +// MemberUserDO userDO = memberUserService.getUser(uid); +// if (PayTypeEnum.WEIXIN_APPLET.getCode().equals(param.getPayType())) { +// //小程序支付需要openid +// if (Objects.isNull(userDO.getRoutineOpenId())) throw exception(USER_NOT_BINDING_WX_APPLET); +// } +// //根据type得到支付商户配置 +// MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.toType(param.getPayType()).getValue()); +// PayContext payContext = new PayContext(); +// Map packageParams = new HashMap<>(); +// if (param.getPayType().contains(PayTypeEnum.ALI.getValue())) { +// aliPay(orderInfo, param, packageParams); +// updatePayInfo(orderInfo, packageParams); +// } else if (param.getPayType().contains(PayTypeEnum.WEIXIN.getValue())) { +// packageParams = payContext.selectPayWay(PayTypeEnum.WEIXIN.getValue(), +// new PayParam(orderInfo.getOrderId(), orderInfo.getPayPrice(), userDO.getRoutineOpenId(), ServletUtils.getClientIP(), +// param.getPayType(), "Yshop商城", merchantDetailsDO, uid, PayOrderConstants.PAY_REDIRECT_URL)); +// updatePayInfo(orderInfo, packageParams); +// } else if (param.getPayType().contains(PayTypeEnum.YUE.getValue())) { +// yuePay(param.getUni(), uid); +// } +// // 异步统计 +// asyncStoreOrderService.orderData(uid); +// return packageParams; + return null; } - private void updatePayInfo(AppStoreOrderQueryVo orderInfo, Map packageParams) { + @Override + public void updatePayInfo(AppStoreOrderQueryVo orderInfo, Map packageParams) { + this.updatePayInfo(orderInfo, packageParams.get("out_trade_no"), packageParams.get("transaction_id")); + } + + @Override + public void updatePayInfo(AppStoreOrderQueryVo orderInfo, String outTradeNo, String transactionId) { PayInfo payInfo = new PayInfo(); payInfo.setOrderId(orderInfo.getOrderId()); - payInfo.setOut_trade_no(packageParams.get("out_trade_no")); - payInfo.setTransaction_id(packageParams.get("transaction_id")); + payInfo.setOut_trade_no(outTradeNo); + payInfo.setTransaction_id(transactionId); //更新订单支付信息 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StoreOrderDO::getOrderId, orderInfo.getOrderId()); @@ -531,102 +683,150 @@ public class AppStoreOrderServiceImpl extends ServiceImpl packageParams) { - if (PayTypeEnum.ALI_H5.getValue().equals(param.getPaytype())) { - MerchantPayOrder payOrder = new MerchantPayOrder("1", "WAP", "支付宝H5商品购买", - "h5商品购买", orderInfo.getPayPrice(), param.getUni() + "-" + RandomStringUtil.getRandomCode(3, 0) + "H5"); - String str = manager.toPay(payOrder); - log.info(str); - // packageParams.put("data",manager.toPay(payOrder)); - } else if (PayTypeEnum.ALI_APP.getValue().equals(param.getFrom())) { - MerchantPayOrder payOrder = new MerchantPayOrder("1", "APP", "支付宝APP商品购买", - "支付宝APP5商品购买", orderInfo.getPayPrice(), param.getUni() + "-" + RandomStringUtil.getRandomCode(3, 0) + "APP"); - // packageParams.put("data",manager.app(payOrder)); - } +// if (PayTypeEnum.ALI_H5.getValue().equals(param.getPayType())) { +// MerchantPayOrder payOrder = new MerchantPayOrder("1", "WAP", "支付宝H5商品购买", +// "h5商品购买", orderInfo.getPayPrice(), param.getUni() + "-" + RandomStringUtil.getRandomCode(3, 0) + "H5"); +// String str = manager.toPay(payOrder); +// log.info(str); +// // packageParams.put("data",manager.toPay(payOrder)); +// } else if (PayTypeEnum.ALI_APP.getValue().equals(param.getFrom())) { +// MerchantPayOrder payOrder = new MerchantPayOrder("1", "APP", "支付宝APP商品购买", +// "支付宝APP5商品购买", orderInfo.getPayPrice(), param.getUni() + "-" + RandomStringUtil.getRandomCode(3, 0) + "APP"); +// // packageParams.put("data",manager.app(payOrder)); +// } } @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { - log.info("进入微信支付回调"); - String xmlMsg = HttpKit.readData(request); - log.info("微信回调通知信息" + xmlMsg); - if (StringUtils.isEmpty(xmlMsg)) { - log.info("回调接口内容为空!"); +// log.info("进入微信支付回调"); +// String xmlMsg = HttpKit.readData(request); +// log.info("微信回调通知信息" + xmlMsg); +// if (StringUtils.isEmpty(xmlMsg)) { +// log.info("回调接口内容为空!"); +// return; +// } +// Map resultMap = PaymentKit.xmlToMap(xmlMsg); +// //验签 +// MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); +// boolean validSignResult = PaymentKit.verifyNotify(resultMap, merchantDetailsDO.getKeyPrivate()); +// log.info("验签结果{}", validSignResult); +// if (!MapUtils.isEmpty(resultMap)) { +// if (resultMap.get("return_code").equals("SUCCESS")) { +// String orderNo = resultMap.get("out_trade_no"); +// log.info("回调out_trade_no=" + orderNo); +// log.info("回调transaction_id=" + resultMap.get("transaction_id")); +// //截取订单编号 +// String[] split = orderNo.split("-"); +// if (split.length > 0) { +// String orderFormId = split[0]; +// if (!StringUtils.isEmpty(orderFormId)) { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.and( +// i -> i.eq(StoreOrderDO::getOrderId, orderFormId).or().eq(StoreOrderDO::getUnique, orderFormId).or() +// .eq(StoreOrderDO::getExtendOrderId, orderFormId)); +// StoreOrderDO orderInfo = storeOrderMapper.selectOne(wrapper); +// if (orderInfo == null) { +// log.info("订单已经取消或删除"); +// response.getWriter().write(PayOrderConstants.WEINXIN_RESULT); +// } +// //判断订单装态,如果已支付说明为重复回调,丢弃 +// assert orderInfo != null; +// if (OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue().equals(orderInfo.getPaid())) { +// log.info("订单【{}】已经支付完成", orderInfo.getOrderId()); +// response.getWriter().write(PayOrderConstants.WEINXIN_RESULT); +// } +// //判断金额是否一致 +// BigDecimal totalFee = new BigDecimal(resultMap.get("total_fee")); +// PayInfo payInfo = JsonUtils.parseObject(orderInfo.getPayInfo(), PayInfo.class); +// log.info(totalFee + ":" + orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))); +// if (!(totalFee.compareTo(orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))) == 0)) { +// log.info("支付金额与订单金额不一致,请查询相关订单信息与客户确认!"); +//// throw exception(STORE_ORDER_PAY_FEE_ERROR); +// //最简单做法 不一致退还支付金额,订单装态不变 +// assert payInfo != null; +// // 微信 根据不同付款方式进行退款 小程序 app +// if (payInfo.getOut_trade_no().contains("APPLET")) { +// merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.WEIXIN_APPLET.getCode()); +// } else { +// //app 和h5 appId目前一样 +// merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.WEIXIN_H5.getCode()); +// } +// Map map = wxPayServiceUtils.refund(resultMap.get("transaction_id"), payInfo.getOut_refund_no(), orderInfo.getTotalPrice(), totalFee, merchantDetailsDO); +// log.info("退款详情:" + map); +// response.getWriter().write(PayOrderConstants.WEINXIN_RESULT); +// } +// //更新订单状态,与支付单据信息 +// +// assert payInfo != null; +// payInfo.setTransaction_id(resultMap.get("transaction_id")); +// LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); +// updateWrapper.eq(StoreOrderDO::getOrderId, orderFormId); +// StoreOrderDO storeOrder = new StoreOrderDO(); +// storeOrder.setPayInfo(JsonUtils.toJsonString(payInfo)); +// this.update(storeOrder, updateWrapper); +// //支付完成回调的逻辑 修改订单装态等 +// this.paySuccess(orderFormId, PayTypeEnum.WEIXIN.getValue()); +// } +// } +// } +// } else { +// log.info("map为null"); +// } +// log.info("微信小程序支付回调成功"); +// response.getWriter().write(PayOrderConstants.WEINXIN_RESULT); + } + + @Override + public void wxPayNotify(String orderId, Map resultMap) throws Exception { + MerchantDetailsDO merchantDetailsDO; + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.and( + i -> i.eq(StoreOrderDO::getOrderId, orderId).or().eq(StoreOrderDO::getUnique, orderId).or() + .eq(StoreOrderDO::getExtendOrderId, orderId)); + StoreOrderDO orderInfo = storeOrderMapper.selectOne(wrapper); + if (orderInfo == null) { + log.info("订单已经取消或删除"); return; } - Map resultMap = PaymentKit.xmlToMap(xmlMsg); - //验签 - MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); - boolean validSignResult = PaymentKit.verifyNotify(resultMap, merchantDetailsDO.getKeyPrivate()); - log.info("验签结果{}", validSignResult); - if (!MapUtils.isEmpty(resultMap)) { - if (resultMap.get("return_code").equals("SUCCESS")) { - String orderNo = resultMap.get("out_trade_no"); - log.info("回调out_trade_no=" + orderNo); - log.info("回调transaction_id=" + resultMap.get("transaction_id")); - //截取订单编号 - String[] split = orderNo.split("-"); - if (split.length > 0) { - String orderFormId = split[0]; - if (!StringUtils.isEmpty(orderFormId)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and( - i -> i.eq(StoreOrderDO::getOrderId, orderFormId).or().eq(StoreOrderDO::getUnique, orderFormId).or() - .eq(StoreOrderDO::getExtendOrderId, orderFormId)); - StoreOrderDO orderInfo = storeOrderMapper.selectOne(wrapper); - if (orderInfo == null) { - log.info("订单已经取消或删除"); - String result = ""; - response.getWriter().write(result); - } - //判断订单装态,如果已支付说明为重复回调,丢弃 - assert orderInfo != null; - if (OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue().equals(orderInfo.getPaid())) { - log.info("订单【{}】已经支付完成", orderInfo.getOrderId()); - String result = ""; - response.getWriter().write(result); - } - //判断金额是否一致 - BigDecimal totalFee = new BigDecimal(resultMap.get("total_fee")); - PayInfo payInfo = JsonUtils.parseObject(orderInfo.getPayInfo(), PayInfo.class); - log.info(totalFee + ":" + orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))); - if (!(totalFee.compareTo(orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))) == 0)) { - log.info("支付金额与订单金额不一致,请查询相关订单信息与客户确认!"); -// throw exception(STORE_ORDER_PAY_FEE_ERROR); - //最简单做法 不一致退还支付金额,订单装态不变 - assert payInfo != null; - // 微信 根据不同付款方式进行退款 小程序 app - if (payInfo.getOut_trade_no().contains("APPLET")) { - merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.WEIXIN_APPLET.getCode()); - } else { - //app 和h5 appId目前一样 - merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.WEIXIN_H5.getCode()); - } - Map map = wxPayServiceUtils.refund(resultMap.get("transaction_id"), payInfo.getOut_refund_no(), orderInfo.getTotalPrice(), totalFee, merchantDetailsDO); - log.info("退款详情:" + map); - String result = ""; - response.getWriter().write(result); - } - //更新订单状态,与支付单据信息 - - assert payInfo != null; - payInfo.setTransaction_id(resultMap.get("transaction_id")); - LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); - updateWrapper.eq(StoreOrderDO::getOrderId, orderFormId); - StoreOrderDO storeOrder = new StoreOrderDO(); - storeOrder.setPayInfo(JsonUtils.toJsonString(payInfo)); - this.update(storeOrder, updateWrapper); - //支付完成回调的逻辑 修改订单装态等 - this.paySuccess(orderFormId, PayTypeEnum.WEIXIN.getValue()); - } - } - } - } else { - log.info("map为null"); + //判断订单装态,如果已支付说明为重复回调,丢弃 + assert orderInfo != null; + if (OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue().equals(orderInfo.getPaid())) { + log.info("订单【{}】已经支付完成", orderInfo.getOrderId()); + return; } - log.info("微信小程序支付回调成功"); - String result = ""; - response.getWriter().write(result); + //判断金额是否一致 + BigDecimal totalFee = new BigDecimal(resultMap.get("total_fee")); + PayInfo payInfo = JsonUtils.parseObject(orderInfo.getPayInfo(), PayInfo.class); + log.info(totalFee + ":" + orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))); + if (!(totalFee.compareTo(orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))) == 0)) { + log.info("支付金额与订单金额不一致,请查询相关订单信息与客户确认!"); + //最简单做法 不一致退还支付金额,订单装态不变 + assert payInfo != null; + // 微信 根据不同付款方式进行退款 小程序 app + if (payInfo.getOut_trade_no().contains("APPLET")) { + merchantDetailsDO = merchantDetailsService.getMerchantByType(PayTypeEnum.WEIXIN_APPLET.getType()); + } else { + //app 和h5 appId目前一样 + merchantDetailsDO = merchantDetailsService.getMerchantByType(PayTypeEnum.WEIXIN_H5.getType()); + } + Map map = wxPayServiceUtils.refund(resultMap.get("transaction_id"), payInfo.getOut_refund_no(), orderInfo.getTotalPrice(), totalFee, merchantDetailsDO); + log.info("退款详情:" + map); + return; + } + //更新订单状态,与支付单据信息 + + assert payInfo != null; + payInfo.setTransaction_id(resultMap.get("transaction_id")); + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.eq(StoreOrderDO::getOrderId, orderId); + StoreOrderDO storeOrder = new StoreOrderDO(); + storeOrder.setPayInfo(JsonUtils.toJsonString(payInfo)); + this.update(storeOrder, updateWrapper); + //支付完成回调的逻辑 修改订单装态等 + this.paySuccess(orderId, PayTypeEnum.WEIXIN.getType()); + + } /** @@ -656,7 +856,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl() + .set(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_DEFAULT.getValue()) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getTeamworkId, teamworkId)); + this.update(new LambdaUpdateWrapper() + .set(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_CANCEL.getValue()) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_UNPAID.getValue()) + .eq(StoreOrderDO::getTeamworkId, teamworkId)); + } else { + storeOrder.setStatus(OrderStatusEnum.STATUS_WAIT_FOR_GROUP.getValue()); + } + } this.update(storeOrder, wrapper); //增加用户购买次数 @@ -688,16 +916,24 @@ public class AppStoreOrderServiceImpl extends ServiceImpl() .eq(StoreOrderStatusDO::getOid, order.getId()) .eq(StoreOrderStatusDO::getChangeType, OrderLogEnum.DELIVERY_GOODS.getValue())); - if (orderStatusDO != null) { + if (Objects.nonNull(orderStatusDO)) { order.setDeliveryTime(orderStatusDO.getChangeTime()); } List cartInfo = cartInfos.stream() @@ -843,6 +1086,43 @@ public class AppStoreOrderServiceImpl extends ServiceImpl productAttrUniques = + cartInfo.stream().map(AppStoreCartQueryVo::getProductAttrUnique).collect(Collectors.toList()); + // 查询订单明细 + List orderDetailDOS = + orderDetailMapper.getOrderDetails(productAttrUniques, order.getId()); + if (CollectionUtils.isNotEmpty(orderDetailDOS)) { + Map> orderDetailMap = + orderDetailDOS.stream().collect(Collectors.groupingBy(AppOrderDetailVO::getProductAttrUnique)); + // 合并同规格同售后状态的订单详情,同规格不同售后状态的分开显示 + List addCartInfoList = new ArrayList<>(); + for (AppStoreCartQueryVo cartQueryVo : cartInfo) { + List detailDOS = orderDetailMap.get(cartQueryVo.getProductAttrUnique()); + if (CollectionUtils.isEmpty(detailDOS)) continue; + Map> orderDetailStatusMap = + detailDOS.stream().collect(Collectors.groupingBy(AppOrderDetailVO::getState)); + if (orderDetailStatusMap.keySet().size() > 1) { + for (Integer state : orderDetailStatusMap.keySet()) { + if (OrderDetailStateEnum.IN_AFTER_SALES.getValue().equals(state) || + OrderDetailStateEnum.AFTER_SALES_COMPLETE.getValue().equals(state)) { + AppStoreCartQueryVo cloneCartQueryVo = SerializationUtils.clone(cartQueryVo); + cloneCartQueryVo.setOrderDetailState(state); + cloneCartQueryVo.setCartNum(orderDetailStatusMap.get(state).size()); + addCartInfoList.add(cloneCartQueryVo); + } else { + cartQueryVo.setCartNum(orderDetailStatusMap.get(state).size()); + cartQueryVo.setOrderDetailState(state); + } + } + } else { + cartQueryVo.setOrderDetailState(orderDetailStatusMap.keySet().iterator().next()); + } + } + cartInfo.addAll(addCartInfoList); + } + // 按购物车排序 + cartInfo = cartInfo.stream().sorted(Comparator.comparingLong(AppStoreCartQueryVo::getId)) + .collect(Collectors.toList()); order.setCartInfo(cartInfo); StatusDto statusDTO = new StatusDto(); @@ -867,13 +1147,18 @@ public class AppStoreOrderServiceImpl extends ServiceImpl packageParams = new HashMap<>(); + // 查询用户信息 + MemberUserDO memberUserDO = memberUserService.getById(orderQueryVo.getUid()); //根据支付类型不同退款不同 - if (PayTypeEnum.YUE.getValue().equals(orderQueryVo.getPayType())) { - storeOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_HAVE_REFUNDED.getValue()); - storeOrder.setRefundPrice(price); - this.baseMapper.updateById(storeOrder); - //退款到余额 - memberUserService.incMoney(orderQueryVo.getUid(), price); - MemberUserDO memberUserDO = memberUserService.getById(orderQueryVo.getUid()); - - //增加流水 - billService.income(orderQueryVo.getUid(), "商品退款", BillDetailEnum.CATEGORY_1.getValue(), - BillDetailEnum.TYPE_5.getValue(), - price.doubleValue(), - NumberUtil.add(price, memberUserDO.getNowMoney()).doubleValue(), - "订单退款到余额" + price + "元", orderQueryVo.getId().toString()); - //退款得仅仅退库存,其他得 不退比如优惠券等 - this.regressionStock(orderQueryVo, 1); - - storeOrderStatusService.create(orderQueryVo.getUid(), orderQueryVo.getId(), - OrderLogEnum.REFUND_ORDER_SUCCESS.getValue(), "退款给用户:" + price + "元"); - } else if (PayTypeEnum.WEIXIN.getValue().equals(orderQueryVo.getPayType())) { - // 微信 根据不同付款方式进行退款 小程序 app - MerchantDetailsDO merchantDetailsDO; - if (payInfo.getOut_trade_no().contains("APPLET")) { - merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.WEIXIN_APPLET.getCode()); - } else { - merchantDetailsDO = merchantDetailsService.getMerchantDetails(PayTypeEnum.WEIXIN_H5.getCode()); - } - packageParams = wxPayServiceUtils.refund(payInfo.getTransaction_id(), payInfo.getOut_refund_no(), orderQueryVo.getTotalPrice(), price, merchantDetailsDO); - - log.info("退款信息:{}", packageParams); - //退款成功操作 应该在回调url中 - if (Objects.equals(packageParams.get("result_code"), "SUCCESS")) { - payInfo.setRefund_id(packageParams.get("refund_id")); - storeOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_HAVE_REFUNDED.getValue()); - storeOrder.setRefundPrice(price); - storeOrder.setPayInfo(JsonUtils.toJsonString(payInfo)); - this.baseMapper.updateById(storeOrder); + if(price.compareTo(BigDecimal.ZERO) >= 0) { + if (PayTypeEnum.YUE.getType().equals(orderQueryVo.getPayType())) { + //退款到余额 + memberUserService.incMoney(orderQueryVo.getUid(), price); + //增加流水 + billService.income(orderQueryVo.getUid(), "商品退款", BillDetailEnum.CATEGORY_1.getValue(), + BillDetailEnum.TYPE_5.getValue(), + price, + memberUserDO.getNowMoney().add(price), + "订单退款到余额" + price + "元", orderQueryVo.getId().toString()); //退款得仅仅退库存,其他得 不退比如优惠券等 - this.regressionStock(orderQueryVo, 1); + this.regressionStock(orderQueryVo, param.getType()); storeOrderStatusService.create(orderQueryVo.getUid(), orderQueryVo.getId(), OrderLogEnum.REFUND_ORDER_SUCCESS.getValue(), "退款给用户:" + price + "元"); - } else { - throw exception(STORE_ORDER_REFUND_ERROR); + } else if (PayTypeEnum.WEIXIN.getType().equals(orderQueryVo.getPayType())) { + if (payInfo.getTransaction_id() == null) + throw exception(ErrorCodeConstants.STORE_ORDER_REFUND_TRANSACTION_NULL_ERROR); + String orderRefundNo = orderId + "-" + RandomStringUtil.getRandomCode(3, 0) + + payInfo.getOut_trade_no().substring(payInfo.getOut_trade_no().lastIndexOf('-') + 1); + payInfo.setOut_refund_no(orderRefundNo); + // 微信 根据不同付款方式进行退款 小程序 app + MerchantDetailsDO merchantDetailsDO; + if (payInfo.getOut_trade_no().contains("APPLET")) { + merchantDetailsDO = merchantDetailsService.getMerchantByType(PayTypeEnum.WEIXIN_APPLET.getType()); + } else { + merchantDetailsDO = merchantDetailsService.getMerchantByType(PayTypeEnum.WEIXIN_H5.getType()); + } + Map packageParams = wxPayServiceUtils.refund(payInfo.getTransaction_id(), + payInfo.getOut_refund_no(), orderQueryVo.getTotalPrice(), price, merchantDetailsDO); + log.info("退款信息:{}", packageParams); + //退款成功操作 应该在回调url中 + if (Objects.equals(packageParams.get("result_code"), "SUCCESS")) { + payInfo.setRefund_id(packageParams.get("refund_id")); + updateOrderDO.setRefundPrice(price); + updateOrderDO.setPayInfo(JsonUtils.toJsonString(payInfo)); + //退款得仅仅退库存,其他得 不退比如优惠券等 + this.regressionStock(orderQueryVo, param.getType()); + storeOrderStatusService.create(orderQueryVo.getUid(), orderQueryVo.getId(), + OrderLogEnum.REFUND_ORDER_SUCCESS.getValue(), "退款给用户:" + price + "元"); + } else { + throw exception(STORE_ORDER_REFUND_ERROR); + } } } + // 修改订单信息 + updateOrderDO.setId(orderQueryVo.getId()); + // 修改明细状态,并获取订单下一步状态 + updateOrderDO.setRefundStatus(orderDetailService.updateState(param.getAfterSalesId(), orderQueryVo.getId())); + // 处理拼团订单 + if(ObjectUtil.isNotNull(orderQueryVo.getCampaignType()) && + CampaignTypeEnum.TEAMWORK.getValue().equals(orderQueryVo.getCampaignType())){ + teamworkInfoService.refundHandle(new TeamworkRefundParam() + .setUid(orderQueryVo.getUid()).setId(orderQueryVo.getTeamworkId())); + } + this.baseMapper.updateById(updateOrderDO); + + //积分退还 + memberUserService.addIntegral(UserBillModifyDTO.builder() + .uid(orderQueryVo.getUid()) + .amount(param.getRefundIntegral()) + .afterAmount(NumberUtil.add(memberUserDO.getIntegral(), param.getRefundIntegral())) + .linkId(orderQueryVo.getId()) + .typeEnum(TYPE_13) + .categoryEnum(CATEGORY_2) + .pmType(BillEnum.PM_1) + .build()); + + // 取消订单更新分销订单状态 + appDistributorOrderFacade.cancelDistributorOrder(new DistributorOrderDTO().setOid(updateOrderDO.getId())); + } + + @Override + public void batchRefund(List ids, Integer type) throws Exception { + List orders = storeOrderMapper.selectBatchIds(ids); + if (CollectionUtils.isNotEmpty(orders)) { + for (StoreOrderDO order : orders) { + this.orderRefund(new AppOrderRefundParam(null, order.getOrderId(), + order.getPayPrice(), type, order.getPayIntegral())); + } + } + } + + @Override + public void writeOff(LoginUser user, WriteOffDTO dto) { + ShopAssistantDO shopAssistantDO = shopAssistantService.selectByUserId(user.getId()); + // 用户校验权限 + if (UserTypeEnum.MEMBER.getValue().equals(user.getUserType()) && !shopAssistantDO.getStatus()) { + throw exception(SHOP_ASSISTANT_NOT_WRITE_OFF); + } + //查询订单 + StoreOrderDO storeOrderDO = storeOrderMapper.selectOne(StoreOrderDO::getWriteOffCode, dto.getWriteOffCode()); + if (Objects.isNull(storeOrderDO)) { + throw exception(ORDER_WRITE_OFF_CODE_ERROR); + } + if (!storeOrderDO.getWriteOffStatus().equals(TO_BE_WRITTEN_OFF.getValue())) { + throw exception(ORDER_WRITTEN_OFF); + } + //门店用户校验 + if(UserTypeEnum.MEMBER.getValue().equals(user.getUserType()) && !shopAssistantDO.getStoreId().equals(storeOrderDO.getStoreId())){ + throw exception(NO_WRITE_OFF_AUTHORITY); + } + //校验核销码 + if (!storeOrderDO.getWriteOffCode().equals(dto.getWriteOffCode())) + throw exception(ORDER_WRITE_OFF_CODE_ERROR); + //更新订单状态 + StoreOrderDO newOrder = new StoreOrderDO(); + newOrder.setId(storeOrderDO.getId()); + newOrder.setWriteOffStatus(WRITTEN_OFF.getValue()); + newOrder.setWriteOffDate(LocalDateTime.now()); + newOrder.setStatus(OrderInfoEnum.STATUS_FINISHED.getValue()); + storeOrderMapper.updateById(newOrder); + + //增加状态 + storeOrderStatusService.create(storeOrderDO.getUid(), storeOrderDO.getId(), OrderLogEnum.TAKE_ORDER_DELIVERY.getValue(), OrderLogEnum.TAKE_ORDER_DELIVERY.getDesc()); + + //核销完成 + redissonUtil.delayedOffer(ShopConstants.CLOSE_AFTER_SALE_KEY, storeOrderDO.getId(), 1, TimeUnit.MINUTES); + + } + + @Override + public AppStoreOrderQueryVo orderDetail(String key, Long uid) { + AppStoreOrderQueryVo storeOrder = this.getOrderInfo(key, uid); + if (ObjectUtil.isNull(storeOrder)) { + throw exception(STORE_ORDER_NOT_EXISTS); + } + //订单状态 + this.handleOrder(storeOrder); + //门店信息 + ShopDO shop = shopService.getShop(storeOrder.getStoreId()); + if (Objects.nonNull(shop)) { + storeOrder.setStoreName(shop.getStoreName()); + storeOrder.setShopAddress(shop.getAddress()); + } + return storeOrder; + } + + @Override + public void teamworkEnd(Long teamworkId) throws Exception { + // 获取拼团活动信息 + CampaignInfoDO campaignInfoDO = teamworkInfoService.getCampaignInfoById(teamworkId); + // 获取该拼团的所有订单 + List orderDOS = + storeOrderMapper.selectList(new LambdaQueryWrapper() + .eq(StoreOrderDO::getTeamworkId, teamworkId)); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); + updateWrapper.eq(StoreOrderDO::getTeamworkId, teamworkId); + // 判断是否虚拟拼团 + if (VirtuallyEnum.YES.getValue().equals(campaignInfoDO.getIsVirtually())) { + // 拼团成功,订单状态改为已发货 + updateWrapper.set(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_DEFAULT.getValue()); + // 修改拼团状态 + teamworkInfoService.teamworkSuccess(teamworkId); + } else { + // 拼团失败,订单状态改为成团失败 + updateWrapper.set(StoreOrderDO::getStatus, OrderStatusEnum.STATUS_GROUP_FAILURE.getValue()); + updateWrapper.set(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_HAVE_REFUNDED.getValue()); + // 退款,不退库存,退到活动库存 + List orderIds = orderDOS.stream().map(StoreOrderDO::getId).collect(Collectors.toList()); + batchRefund(orderIds, StockBackTypeEnum.DEFAULT.getValue()); + // 修改拼团状态 + teamworkInfoService.teamworkFail(teamworkId, orderDetailMapper.selectCount( + new LambdaQueryWrapper().in(StoreOrderDetailDO::getOid, orderIds)).intValue()); + } + // 修改订单状态 + storeOrderMapper.update(null, updateWrapper); + } + + @SneakyThrows + @Override + public void refundOrder(String id, Long uid) { + // 查询订单信息 + AppStoreOrderQueryVo orderQueryVo = getOrderInfo(id, null); + if(Objects.isNull(orderQueryVo)){ + throw exception(STORE_ORDER_NOT_EXISTS); + } + //判断订单状态是否为已经支付 + if(OrderInfoEnum.PAY_STATUS_UNPAID.getValue().equals(orderQueryVo.getPaid())){ + throw exception(ORDER_NOT_REVOKE); + } + AppOrderRefundParam param = new AppOrderRefundParam(); + param.setOrderId(id); + param.setType(StockBackTypeEnum.DEFAULT.getValue()); + param.setPrice(orderQueryVo.getPayPrice()); + param.setRefundIntegral(orderQueryVo.getPayIntegral()); + this.orderRefund(param); } @@ -1189,19 +1633,17 @@ public class AppStoreOrderServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.in(StoreOrderCartInfoDO::getCartId, Arrays.asList(order.getCartId().split(","))); - + type = ObjectUtil.isNotNull(order.getCampaignType()) && !StockBackTypeEnum.NORMAL.getValue().equals(type)? + StockBackTypeEnum.CAMPAIGN.getValue() : StockBackTypeEnum.NORMAL.getValue(); List cartInfoList = storeOrderCartInfoService.list(wrapper); for (StoreOrderCartInfoDO cartInfo : cartInfoList) { AppStoreCartQueryVo cart = JSONObject.parseObject(cartInfo.getCartInfo() , AppStoreCartQueryVo.class); - appStoreProductService.incProductStock(cart.getCartNum(), cart.getProductId() - , cart.getProductAttrUnique(), 0L, null); - + appStoreProductService.incProductStock(cart.getCartNum(), cart.getProductId(), + cart.getProductAttrUnique(), type); } } - /** - * 奖励积分 - * - * @param order 订单 - */ - private void gainUserIntegral(AppStoreOrderQueryVo order) { - if (order.getGainIntegral().compareTo(BigDecimal.ZERO) > 0) { - MemberUserDO user = memberUserService.getUser(order.getUid()); - - BigDecimal newIntegral = NumberUtil.add(user.getIntegral(), order.getGainIntegral()); - user.setIntegral(newIntegral); - user.setId(order.getUid()); - memberUserService.updateById(user); - - //增加流水 - billService.income(user.getId(), "购买商品赠送积分", BillDetailEnum.CATEGORY_2.getValue(), - BillDetailEnum.TYPE_9.getValue(), - order.getGainIntegral().doubleValue(), - newIntegral.doubleValue(), - "购买商品赠送" + order.getGainIntegral() + "积分", order.getId().toString()); - } - } - - - /** - * 计算奖励的积分 - * - * @param cartInfo cartInfo - * @return double - */ - private BigDecimal getGainIntegral(List cartInfo) { - BigDecimal gainIntegral = BigDecimal.ZERO; - for (AppStoreCartQueryVo cart : cartInfo) { - if (cart.getCombinationId() > 0 || cart.getSeckillId() > 0 || cart.getBargainId() > 0) { - continue; - } - BigDecimal cartInfoGainIntegral = BigDecimal.ZERO; - Double gain = cart.getProductInfo().getGiveIntegral().doubleValue(); - if (gain > 0) { - cartInfoGainIntegral = NumberUtil.round(NumberUtil.mul(cart.getCartNum(), gain), 2); - } - gainIntegral = NumberUtil.add(gainIntegral, cartInfoGainIntegral); - } - return gainIntegral; - } - - /** * 订单检测 * @@ -1328,24 +1723,38 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartInfo, UserAddressDO userAddress, Long couponId) { + private PriceGroupDto getOrderPriceGroup(MemberUserDO user, List cartInfo, UserAddressDO userAddress, Long couponId, Integer shippingType, Boolean useIntegral) { + PriceGroupDto priceGroupDTO = new PriceGroupDto(); + + //获取订单成本价 + BigDecimal costPrice = this.getOrderSumPrice(cartInfo, "truePrice"); BigDecimal storePostage = BigDecimal.ZERO; BigDecimal storeFreePostage = BigDecimal.ZERO; - BigDecimal costPrice = this.getOrderSumPrice(cartInfo, "truePrice");//获取订单成本价 - BigDecimal payIntegral = BigDecimal.ZERO; BigDecimal couponPrice = BigDecimal.ZERO; + //总价格 + BigDecimal totalPrice = costPrice; + //计算会员价格 + BigDecimal vipDeductionAmount = culVipDeductionAmount(user.getId(), costPrice, priceGroupDTO); + totalPrice = NumberUtil.sub(totalPrice, vipDeductionAmount); + //会员折扣 + BigDecimal vipDiscount = NumberUtil.mul(priceGroupDTO.getVipDiscount(), new BigDecimal("0.1")); + //计算优惠券 if (couponId == null || couponId != -1L) { List cartCouponDtoList = new ArrayList<>(); for (AppStoreCartQueryVo vo : cartInfo) { - cartCouponDtoList.add(new CartCouponDto(vo.getProductId(), vo.getProductAttrUnique(), NumberUtil.mul(vo.getTruePrice(), vo.getCartNum()))); + cartCouponDtoList.add(new CartCouponDto(vo.getProductId(), vo.getProductAttrUnique(), NumberUtil.mul(vo.getTruePrice(), vo.getCartNum(), vipDiscount))); } List cartCouponVOList = appCouponRelationService.searchCartCoupon(cartCouponDtoList, couponId); - if (CollectionUtils.isNotEmpty(cartCouponVOList)) { CartCouponVO cartCouponVO = cartCouponVOList.get(0); couponPrice = cartCouponVO.getDiscountAmount(); @@ -1362,27 +1771,144 @@ public class AppStoreOrderServiceImpl extends ServiceImpl { + // 优惠券优惠金额 + BigDecimal itemCouponPrice = NumberUtil.div(Objects.isNull(res.getCouponPrice()) ? BigDecimal.ZERO : res.getCouponPrice(), res.getCartNum()); + res.setCouponPrice(itemCouponPrice); + //真实价格 = 真实价格 - 会员优惠价格 - 优惠券优惠金额 - 积分抵扣金额 + BigDecimal payPrice = res.getTruePrice(); + payPrice = NumberUtil.sub(NumberUtil.mul(payPrice,vipDiscount),itemCouponPrice); + if(finalTotalPrice.compareTo(BigDecimal.ZERO) > 0){ + // 占比 + BigDecimal div = NumberUtil.div(payPrice, finalTotalPrice); + //每项的积分抵扣金额 + BigDecimal itemIntegralDeductionAmount = NumberUtil.mul(deductionAmount,div); + //每项使用积分 + BigDecimal itemUseIntegral = NumberUtil.mul(priceGroupDTO.getPayIntegral(),div); + payPrice = NumberUtil.sub(payPrice,itemIntegralDeductionAmount); + res.setIntegralDeductionAmount(itemIntegralDeductionAmount); + res.setUseIntegral(itemUseIntegral); + } + res.setPayPrice(payPrice); + }); // 计算运费 - for (AppStoreCartQueryVo vo : cartInfo) { - BigDecimal postagePrice = this.handlePostage(Arrays.asList(vo), userAddress); - vo.setPostagePrice(postagePrice); - storePostage = storePostage.add(postagePrice); + if (!OrderInfoEnum.SHIPPING_TYPE_STORE_PICKUP.getValue().equals(shippingType)) { + for (AppStoreCartQueryVo vo : cartInfo) { + BigDecimal postagePrice = this.handlePostage(Arrays.asList(vo), userAddress); + vo.setPostagePrice(postagePrice); + storePostage = storePostage.add(postagePrice); + } + } + //会员是否包邮 + if (priceGroupDTO.getVipFreeShipping()) { + storeFreePostage = storePostage; + storePostage = BigDecimal.ZERO; } - BigDecimal totalPrice = costPrice.add(storePostage).subtract(couponPrice);//获取订单总金额 + totalPrice = totalPrice.add(storePostage).subtract(deductionAmount);//获取订单总金额 - PriceGroupDto priceGroupDTO = new PriceGroupDto(); priceGroupDTO.setStorePostage(storePostage); priceGroupDTO.setStoreFreePostage(storeFreePostage); priceGroupDTO.setTotalPrice(totalPrice); priceGroupDTO.setCostPrice(costPrice); - priceGroupDTO.setPayIntegral(payIntegral); priceGroupDTO.setCouponPrice(couponPrice); priceGroupDTO.setCouponId(couponId); + priceGroupDTO.setTotalCouponPrice(NumberUtil.add(priceGroupDTO.getCouponPrice(),priceGroupDTO.getVipDeductionAmount(),priceGroupDTO.getDeductionPrice())); return priceGroupDTO; } + /** + * 获取活动订单价格 + * + * @param cartInfo 购物车列表 + * @return PriceGroupDto + */ + private PriceGroupDto getOrderPriceGroupForCampaign(List cartInfo, UserAddressDO userAddress, Integer shippingType) { + PriceGroupDto priceGroupDTO = new PriceGroupDto(); + + //获取订单成本价 + BigDecimal costPrice = this.getOrderSumPrice(cartInfo, "truePrice"); + BigDecimal totalPrice = costPrice; + BigDecimal storePostage = BigDecimal.ZERO; + BigDecimal storeFreePostage = BigDecimal.ZERO; + // 计算运费 + if (!OrderInfoEnum.SHIPPING_TYPE_STORE_PICKUP.getValue().equals(shippingType)) { + for (AppStoreCartQueryVo vo : cartInfo) { + BigDecimal postagePrice = this.handlePostage(Arrays.asList(vo), userAddress); + vo.setPostagePrice(postagePrice); + storePostage = storePostage.add(postagePrice); + } + } + totalPrice = totalPrice.add(storePostage);//获取订单总金额 + + priceGroupDTO.setStorePostage(storePostage); + priceGroupDTO.setStoreFreePostage(storeFreePostage); + priceGroupDTO.setTotalPrice(totalPrice); + priceGroupDTO.setCostPrice(costPrice); + + cartInfo.forEach(item -> item.setPayPrice(item.getTruePrice())); + return priceGroupDTO; + } + + /** + * 计算积分相关 + * + * @param user / + * @param totalPrice / + * @param priceGroupDTO / + * @return / + */ + private BigDecimal culIntegral(MemberUserDO user, BigDecimal totalPrice, PriceGroupDto priceGroupDTO, Boolean useIntegral) { + Boolean enableIntegral = "1".equals(DictFrameworkUtils.parseDictDataValue(INTEGRAL_CONFIG, INTEGRAL_ENABLE)); + BigDecimal integralRule = new BigDecimal(DictFrameworkUtils.parseDictDataValue(INTEGRAL_CONFIG, INTEGRAL_DEDUCTION_RULE)); + BigDecimal integral = user.getIntegral(); + + priceGroupDTO.setEnableIntegral(enableIntegral); + priceGroupDTO.setIntegral(integral); + //积分抵扣关闭 或者 用户积分小于积分规则 不可抵扣 + if (!useIntegral || !enableIntegral || integral.compareTo(integralRule) < 0) { + priceGroupDTO.setPayIntegral(BigDecimal.ZERO); + priceGroupDTO.setDeductionPrice(BigDecimal.ZERO); + return BigDecimal.ZERO; + } + BigDecimal fullDeductionAmount = NumberUtil.div(integral, integralRule); + BigDecimal integralDeductionAmount = totalPrice.compareTo(fullDeductionAmount) <= 0 ? totalPrice : fullDeductionAmount; + BigDecimal payIntegral = NumberUtil.mul(integralDeductionAmount, integralRule); + + priceGroupDTO.setIntegralRule(integralRule); + priceGroupDTO.setPayIntegral(payIntegral); + priceGroupDTO.setDeductionPrice(integralDeductionAmount); + return integralDeductionAmount; + } + + /** + * 计算vip优惠金额 + * + * @param uid / + * @param costPrice / + * @param priceGroupDTO / + * @return / + */ + private BigDecimal culVipDeductionAmount(Long uid, BigDecimal costPrice, PriceGroupDto priceGroupDTO) { + SettleLevelInfoVO settleLevelInfo = userLevelConfigService.settleLevelInfo(uid); + priceGroupDTO.setIsVip(settleLevelInfo.getIsVip()); + priceGroupDTO.setVipFreeShipping(settleLevelInfo.getFreeShipping()); + priceGroupDTO.setVipDiscount(settleLevelInfo.getDiscount()); + if (!settleLevelInfo.getIsVip()) { + return BigDecimal.ZERO; + } + BigDecimal vipDeductionAmount = NumberUtil.mul(costPrice, NumberUtil.sub(BigDecimal.ONE, NumberUtil.mul(new BigDecimal("0.1"), settleLevelInfo.getDiscount()))); + priceGroupDTO.setVipDeductionAmount(vipDeductionAmount); + return vipDeductionAmount; + } + /** * 获取某字段价格 * @@ -1581,5 +2107,31 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartInfo) { + log.info("========活动商品减库存增加销量start========="); + //对库存加锁 + RLock lock = redissonClient.getLock(STOCK_LOCK_KEY); + if (lock.tryLock()) { + try { + for (AppStoreCartQueryVo storeCartVO : cartInfo) { + // 减少活动库存 + appCampaignInfoService.deStock(storeCartVO.getProductAttrUnique(), storeCartVO.getCartNum()); + appStoreProductService.incSales(storeCartVO.getCartNum(), storeCartVO.getProductId()); + } + } catch (Exception ex) { + log.error("[campaignStock][执行异常]", ex); + throw exception(new ErrorCode(999999, ex.getMessage())); + } finally { + lock.unlock(); + } + } + } + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderService.java index 3174cde..42da160 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderService.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderService.java @@ -1,10 +1,14 @@ package co.yixiang.yshop.module.order.service.storeorder; -import java.util.*; -import javax.validation.*; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.*; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; /** * 订单 Service 接口 @@ -26,7 +30,7 @@ public interface StoreOrderService { * * @param updateReqVO 更新信息 */ - void updateStoreOrder(@Valid StoreOrderUpdateReqVO updateReqVO); + void updateStoreOrder(@Valid StoreOrderUpdateReqVO updateReqVO) throws IOException; /** * 删除订单 @@ -89,4 +93,11 @@ public interface StoreOrderService { */ String printOrder(Long id,Long electId); + /** + * 关闭售后订单 + * @param orderId 订单id + */ + void closeAfterSaleOrder(Long orderId); + + List getTrendChart(); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java index 4f722b1..61b0d8a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java @@ -1,11 +1,17 @@ package co.yixiang.yshop.module.order.service.storeorder; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.http.HttpUtils; +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import co.yixiang.yshop.framework.redis.util.RedissonUtil; +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; +import co.yixiang.yshop.module.distributor.enums.DistributorSettlementTypeEnum; import co.yixiang.yshop.module.express.dal.dataobject.electronicsorder.ElectronicsOrderDO; import co.yixiang.yshop.module.express.dal.dataobject.express.ExpressDO; import co.yixiang.yshop.module.express.dal.redis.express.ExpressRedisDAO; @@ -17,14 +23,22 @@ import co.yixiang.yshop.module.express.kdniao.util.KdniaoUtil; import co.yixiang.yshop.module.express.service.electronicsorder.ElectronicsOrderService; import co.yixiang.yshop.module.express.service.express.ExpressService; import co.yixiang.yshop.module.member.controller.admin.user.vo.UserRespVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillModifyDTO; import co.yixiang.yshop.module.member.convert.user.UserConvert; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.enums.BillEnum; +import co.yixiang.yshop.module.member.enums.LevelGrowthValueEnum; +import co.yixiang.yshop.module.member.service.integralrule.strategy.IntegralRuleContext; import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.member.service.user.UserService; import co.yixiang.yshop.module.message.enums.WechatTempateEnum; import co.yixiang.yshop.module.message.mq.producer.WeixinNoticeProducer; import co.yixiang.yshop.module.order.controller.admin.storeorder.vo.*; import co.yixiang.yshop.module.order.controller.admin.storeorderelectronics.vo.StoreOrderElectronicsCreateReqVO; +import co.yixiang.yshop.module.order.controller.app.order.vo.PayInfo; import co.yixiang.yshop.module.order.convert.storeorder.StoreOrderConvert; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; @@ -33,24 +47,27 @@ import co.yixiang.yshop.module.order.dal.mysql.storeordercartinfo.StoreOrderCart import co.yixiang.yshop.module.order.enums.AppFromEnum; import co.yixiang.yshop.module.order.enums.OrderLogEnum; import co.yixiang.yshop.module.order.enums.UpdateOrderEnum; +import co.yixiang.yshop.module.order.service.storeorder.dto.applet.*; import co.yixiang.yshop.module.order.service.storeorderelectronics.StoreOrderElectronicsService; import co.yixiang.yshop.module.order.service.storeorderstatus.StoreOrderStatusService; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; -import org.redisson.api.RBlockingDeque; -import org.redisson.api.RDelayedQueue; -import org.redisson.api.RedissonClient; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.io.IOException; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -85,11 +102,38 @@ public class StoreOrderServiceImpl implements StoreOrderService { @Resource private StoreOrderElectronicsService storeOrderElectronicsService; @Resource - private MemberUserService userService; + private MemberUserService memberUserService; + + @Resource + private UserService userService; @Resource private WeixinNoticeProducer weixinNoticeProducer; @Resource - private RedissonClient redissonClient; + private RedissonUtil redissonUtil; + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private IntegralRuleContext integralRuleContext; + + @Resource + @Lazy + private AppDistributorOrderFacade appDistributorOrderFacade; + + /** + * 小程序appid + */ + @Value("${wx.miniapp.appid}") + private String appid; + + /** + * 小程序秘钥 + */ + @Value("${wx.miniapp.secret}") + private String secret; + + private static String YSHOP_APPLET_NOTICE_TOKEN = "yshop_applet_notice_token"; @Override public Long createStoreOrder(StoreOrderCreateReqVO createReqVO) { @@ -101,46 +145,40 @@ public class StoreOrderServiceImpl implements StoreOrderService { } @Override - public void updateStoreOrder(StoreOrderUpdateReqVO updateReqVO) { + @Transactional(rollbackFor = Exception.class) + public void updateStoreOrder(StoreOrderUpdateReqVO updateReqVO) throws IOException { // 校验存在 validateStoreOrderExists(updateReqVO.getId()); // 更新 StoreOrderDO updateObj = StoreOrderConvert.INSTANCE.convert(updateReqVO); //发货 - if(UpdateOrderEnum.ORDER_SEND.getValue().equals(updateReqVO.getUpdateType())){ + if (UpdateOrderEnum.ORDER_SEND.getValue().equals(updateReqVO.getUpdateType())) { updateObj.setStatus(OrderInfoEnum.STATUS_WAIT_RECEIVED.getValue()); } storeOrderMapper.updateById(updateObj); - if(UpdateOrderEnum.ORDER_SEND.getValue().equals(updateReqVO.getUpdateType())){ + if (UpdateOrderEnum.ORDER_SEND.getValue().equals(updateReqVO.getUpdateType())) { //增加状态 - storeOrderStatusService.create(updateObj.getUid(),updateObj.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(), + storeOrderStatusService.create(updateObj.getUid(), updateObj.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(), "已发货 快递公司:" + updateObj.getDeliveryName() + "快递单号:" + updateObj.getDeliveryId()); - MemberUserDO userInfo = userService.getUser(updateObj.getUid()); + MemberUserDO userInfo = memberUserService.getUser(updateObj.getUid()); //发送消息队列进行推送消息 - if(userInfo.getLoginType().equals(AppFromEnum.ROUNTINE.getValue())){ + if (userInfo.getLoginType().equals(AppFromEnum.ROUNTINE.getValue())) { weixinNoticeProducer.sendNoticeMessage(updateObj.getUid(), WechatTempateEnum.DELIVERY_SUCCESS.getValue(), - WechatTempateEnum.SUBSCRIBE.getValue(),updateObj.getOrderId(), - updateObj.getPayPrice().toString(),"",updateObj.getDeliveryName(), + WechatTempateEnum.SUBSCRIBE.getValue(), updateObj.getOrderId(), + updateObj.getPayPrice().toString(), "", updateObj.getDeliveryName(), updateObj.getDeliveryId()); - }else if(userInfo.getLoginType().equals(AppFromEnum.WECHAT.getValue())){ - weixinNoticeProducer.sendNoticeMessage(updateObj.getUid(),WechatTempateEnum.PAY_SUCCESS.getValue(), - WechatTempateEnum.TEMPLATES.getValue(),updateObj.getOrderId(), - updateObj.getPayPrice().toString(),"",updateObj.getDeliveryName(), + } else if (userInfo.getLoginType().equals(AppFromEnum.WECHAT.getValue())) { + weixinNoticeProducer.sendNoticeMessage(updateObj.getUid(), WechatTempateEnum.PAY_SUCCESS.getValue(), + WechatTempateEnum.TEMPLATES.getValue(), updateObj.getOrderId(), + updateObj.getPayPrice().toString(), "", updateObj.getDeliveryName(), updateObj.getDeliveryId()); } - + //小程序发货需要发送通知 + sendAppletOrderDeliveryNotice(updateObj, userInfo); //延时队列 七天自动收货 - try { - RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(ShopConstants.REDIS_ORDER_OUTTIME_UNCONFIRM); - RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); - delayedQueue.offer(updateReqVO.getOrderId(), ShopConstants.ORDER_OUTTIME_UNCONFIRM, TimeUnit.DAYS); - String s = ShopConstants.ORDER_OUTTIME_UNCONFIRM + "天"; - log.info("添加延时队列成功 ,延迟时间:" + s); - } catch (Exception e) { - log.error(e.getMessage()); - } + redissonUtil.delayedOffer(ShopConstants.REDIS_ORDER_OUTTIME_UNCONFIRM,updateReqVO.getOrderId(), ShopConstants.ORDER_OUTTIME_UNCONFIRM, TimeUnit.DAYS); } @@ -168,14 +206,14 @@ public class StoreOrderServiceImpl implements StoreOrderService { storeOrderMapper.updateById(storeOrderDO); //增加状态 - storeOrderStatusService.create(storeOrderDO.getUid(),storeOrderDO.getId(), OrderLogEnum.OFFLINE_PAY.getValue(), + storeOrderStatusService.create(storeOrderDO.getUid(), storeOrderDO.getId(), OrderLogEnum.OFFLINE_PAY.getValue(), OrderLogEnum.OFFLINE_PAY.getDesc()); } @Override public void takeStoreOrder(Long id) { StoreOrderDO storeOrderDO = storeOrderMapper.selectById(id); - appStoreOrderService.takeOrder(storeOrderDO.getOrderId(),storeOrderDO.getUid()); + appStoreOrderService.takeOrder(storeOrderDO.getOrderId(), storeOrderDO.getUid()); } @@ -190,10 +228,10 @@ public class StoreOrderServiceImpl implements StoreOrderService { StoreOrderDO storeOrderDO = storeOrderMapper.selectById(id); StoreOrderRespVO storeOrderRespVO = StoreOrderConvert.INSTANCE.convert(storeOrderDO); MemberUserDO memberUserDO = memberUserMapper.selectById(storeOrderRespVO.getUid()); - UserRespVO userRespVO = UserConvert.INSTANCE.convert4(memberUserDO); + UserRespVO userRespVO = UserConvert.INSTANCE.convert4(memberUserDO); storeOrderRespVO.setUserRespVO(userRespVO); storeOrderRespVO.setStatusStr(this.handleOrderStatus(storeOrderRespVO.getPaid() - ,storeOrderRespVO.getStatus(),storeOrderRespVO.getRefundStatus(),storeOrderRespVO.getIsSystemDel())); + , storeOrderRespVO.getStatus(), storeOrderRespVO.getRefundStatus(), storeOrderRespVO.getIsSystemDel())); return storeOrderRespVO; } @@ -204,23 +242,24 @@ public class StoreOrderServiceImpl implements StoreOrderService { /** * 订单查询 + * * @param pageReqVO 分页查询 * @return 订单vo */ @Override public PageResult getStoreOrderPage(StoreOrderPageReqVO pageReqVO) { - PageResult pageResult = storeOrderMapper.selectPage(pageReqVO); - PageResult storeOrderRespVO = StoreOrderConvert.INSTANCE.convertPage(pageResult); + PageResult pageResult = storeOrderMapper.selectPage(pageReqVO); + PageResult storeOrderRespVO = StoreOrderConvert.INSTANCE.convertPage(pageResult); for (StoreOrderRespVO storeOrderRespVO1 : storeOrderRespVO.getList()) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreOrderCartInfoDO::getOid,storeOrderRespVO1.getId()); + wrapper.eq(StoreOrderCartInfoDO::getOid, storeOrderRespVO1.getId()); List storeOrderCartInfoDOList = storeOrderCartInfoMapper.selectList(wrapper); MemberUserDO memberUserDO = memberUserMapper.selectById(storeOrderRespVO1.getUid()); - UserRespVO userRespVO = UserConvert.INSTANCE.convert4(memberUserDO); + UserRespVO userRespVO = UserConvert.INSTANCE.convert4(memberUserDO); storeOrderRespVO1.setStoreOrderCartInfoDOList(storeOrderCartInfoDOList); storeOrderRespVO1.setUserRespVO(userRespVO); storeOrderRespVO1.setStatusStr(this.handleOrderStatus(storeOrderRespVO1.getPaid() - ,storeOrderRespVO1.getStatus(),storeOrderRespVO1.getRefundStatus(),storeOrderRespVO1.getIsSystemDel())); + , storeOrderRespVO1.getStatus(), storeOrderRespVO1.getRefundStatus(), storeOrderRespVO1.getIsSystemDel())); } return storeOrderRespVO; } @@ -237,7 +276,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { StoreOrderDO storeOrderDO = storeOrderMapper.selectById(id); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreOrderCartInfoDO::getOid,storeOrderDO.getId()); + wrapper.eq(StoreOrderCartInfoDO::getOid, storeOrderDO.getId()); List storeOrderCartInfoDOList = storeOrderCartInfoMapper.selectList(wrapper); //组合请求参数 ElectronicsOrderDO electronicsOrderDO = electronicsOrderService.getElectronicsOrder(electId); @@ -267,8 +306,8 @@ public class StoreOrderServiceImpl implements StoreOrderService { queryDTO.setReceiverCompany("yshop"); queryDTO.setReceiverName(storeOrderDO.getRealName()); queryDTO.setReceiverTel(storeOrderDO.getUserPhone()); - List stringList = StrUtil.split(storeOrderDO.getUserAddress()," "); - if(stringList.size() >= 4) { + List stringList = StrUtil.split(storeOrderDO.getUserAddress(), " "); + if (stringList.size() >= 4) { queryDTO.setReceiverProvinceName(stringList.get(0)); queryDTO.setReceiverCityName(stringList.get(1)); queryDTO.setReceiverExpAreaName(stringList.get(2)); @@ -297,7 +336,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { kdniaoElectronicsOrderGoodsDTOList.add(electronicsOrderGoodsDTO); quantity = quantity + cartQueryVo.getCartNum(); - weight = NumberUtil.add(weight, cartQueryVo.getProductInfo().getAttrInfo().getWeight()); + weight = NumberUtil.add(weight, cartQueryVo.getProductInfo().getAttrInfo().getWeight()); } queryDTO.setQuantity(quantity); queryDTO.setWeight(weight.doubleValue()); @@ -307,7 +346,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { queryDTO.setApiKey(kdniaoApiBaseDTO.getApiKey()); //订单打印 - KdniaoOrderVO kdniaoOrderVO = KdniaoUtil.getOrderInfo(queryDTO,kdniaoElectronicsOrderGoodsDTOList); + KdniaoOrderVO kdniaoOrderVO = KdniaoUtil.getOrderInfo(queryDTO, kdniaoElectronicsOrderGoodsDTOList); //订单单号回填 storeOrderDO.setDeliveryId(kdniaoOrderVO.getOrder().getLogisticCode()); @@ -317,11 +356,11 @@ public class StoreOrderServiceImpl implements StoreOrderService { storeOrderMapper.updateById(storeOrderDO); //增加状态 - storeOrderStatusService.create(storeOrderDO.getUid(),storeOrderDO.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(), + storeOrderStatusService.create(storeOrderDO.getUid(), storeOrderDO.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(), "已发货 快递公司:" + storeOrderDO.getDeliveryName() + "快递单号:" + storeOrderDO.getDeliveryId()); //插入记录电子面单订单记录 - StoreOrderElectronicsCreateReqVO createReqVO = new StoreOrderElectronicsCreateReqVO(); + StoreOrderElectronicsCreateReqVO createReqVO = new StoreOrderElectronicsCreateReqVO(); createReqVO.setOrderSn(storeOrderDO.getOrderId()); createReqVO.setCustomerName(electronicsOrderDO.getCustomerName()); createReqVO.setCustomerPwd(electronicsOrderDO.getCustomerPwd()); @@ -334,27 +373,58 @@ public class StoreOrderServiceImpl implements StoreOrderService { return kdniaoOrderVO.getPrintTemplate(); } + @Override + @Transactional(rollbackFor = Exception.class) + public void closeAfterSaleOrder(Long orderId) { + storeOrderMapper.closeAfterSaleOrder(orderId,OrderInfoEnum.UNABLE_AFTER_SALES.getValue()); + StoreOrderDO storeOrderDO = storeOrderMapper.selectById(orderId); + BigDecimal payPrice = storeOrderDO.getPayPrice(); + //积分 + integralRuleContext.execute(BillDetailEnum.CONSUME,storeOrderDO.getUid(),payPrice); + //成长值 + userService.addGrowthValue(storeOrderDO.getUid(), LevelGrowthValueEnum.CONSUME.getType(),payPrice); + //商品积分 + MemberUserDO user = memberUserService.getUser(storeOrderDO.getUid()); + memberUserService.addIntegral(UserBillModifyDTO.builder() + .uid(storeOrderDO.getUid()) + .amount(storeOrderDO.getGainIntegral()) + .afterAmount(NumberUtil.add(user.getIntegral(),storeOrderDO.getGainIntegral())) + .typeEnum(BillDetailEnum.TYPE_9) + .categoryEnum(BillDetailEnum.CATEGORY_2) + .pmType(BillEnum.PM_1) + .linkId(orderId) + .build()); + + appDistributorOrderFacade.updateDistributorOrder(new DistributorOrderDTO().setOid(storeOrderDO.getId()).setDistributorSettlementType(DistributorSettlementTypeEnum.COMPLETE.getType())); + } + + @Override + public List getTrendChart() { + return storeOrderMapper.getTrendChart(); + } + /** * 处理订单状态 - * @param payStatus 支付状态 - * @param status 订单状态 + * + * @param payStatus 支付状态 + * @param status 订单状态 * @param refundStatus 退款状态 - * @param del 删除标准 + * @param del 删除标准 * @return 订单状态 */ - private String handleOrderStatus(Integer payStatus,Integer status,Integer refundStatus,Integer del) { + private String handleOrderStatus(Integer payStatus, Integer status, Integer refundStatus, Integer del) { String statusName = ""; - if (del == 1){ + if (del == 1) { statusName = "已删除"; - }else if (payStatus == 0 && status == 0) { + } else if (payStatus == 0 && status == 0) { statusName = "未支付"; } else if (payStatus == 0 && status == 4) { statusName = "已取消"; } else if (payStatus == 1 && status == 0 && refundStatus == 0) { statusName = "未发货"; - } else if (payStatus == 1 && status == 1 && refundStatus == 0) { + } else if (payStatus == 1 && status == 1 && refundStatus == 0) { statusName = "待收货"; - } else if (payStatus == 1 && status == 2 && refundStatus == 0) { + } else if (payStatus == 1 && status == 2 && refundStatus == 0) { statusName = "待评价"; } else if (payStatus == 1 && status == 3 && refundStatus == 0) { statusName = "已完成"; @@ -366,4 +436,49 @@ public class StoreOrderServiceImpl implements StoreOrderService { return statusName; } + + private void sendAppletOrderDeliveryNotice(StoreOrderDO orderDO, MemberUserDO memberUserDO) throws IOException { + //获取token + StoreOrderDO storeOrderDO = storeOrderMapper.selectById(orderDO.getId()); + PayInfo payInfo = JsonUtils.parseObject(storeOrderDO.getPayInfo(), PayInfo.class); + assert payInfo != null; + if (Objects.nonNull(payInfo.getOut_trade_no()) && !payInfo.getOut_trade_no().contains("APPLET")) return; + String token = stringRedisTemplate.opsForValue().get(YSHOP_APPLET_NOTICE_TOKEN); + if (StringUtils.isEmpty(token)) { + token = HttpUtils.getAppletNoticeToken(appid, secret); + stringRedisTemplate.opsForValue().set(YSHOP_APPLET_NOTICE_TOKEN, token, 7200, TimeUnit.SECONDS); + } + TokenResult result = JsonUtils.parseObject(token, TokenResult.class); + AppletNoticeDto appletNoticeDto = new AppletNoticeDto(); + OrderKey orderKey = new OrderKey(2, payInfo.getTransaction_id()); + List list = new ArrayList<>(); + ShippingList shippingList = new ShippingList(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StoreOrderCartInfoDO::getOid, storeOrderDO.getId()); + List storeOrderCartInfoDOList = storeOrderCartInfoMapper.selectList(wrapper); + JSONObject jsonObject = JSON.parseObject(storeOrderCartInfoDOList.get(0).getCartInfo()); + JSONObject productInfo = jsonObject.getJSONObject("productInfo"); + String desc = ""; + String sku = productInfo.getJSONObject("attrInfo").getString("sku"); + String name = productInfo.getString("storeName"); + if (storeOrderCartInfoDOList.size() <= 1) { + desc = name + "|" + sku; + } else { + desc = name + "|" + sku + "等"; + } + shippingList.setContact(new Contact("", "")) + .setItem_desc(desc) + .setExpress_company(storeOrderDO.getDeliverySn()) + .setTracking_no(storeOrderDO.getDeliveryId()); + list.add(shippingList); + appletNoticeDto.setOrder_key(orderKey).setDelivery_mode(1).setLogistics_type(1) + .setUpload_time(DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ssXXX")).setPayer(new Payer(memberUserDO.getRoutineOpenId())) + .setShipping_list(list); + assert result != null; + String res = HttpUtils.sendAppletNotice(result.getAccess_token(), JsonUtils.toJsonString(appletNoticeDto)); + log.info("小程序发货通知结果:{}", res); + } + + + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java index 9bfdf7f..c1ff0e3 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java @@ -1,7 +1,5 @@ package co.yixiang.yshop.module.order.service.storeorder.dto; -import co.yixiang.yshop.framework.common.serializer.BigDecimalSerializer; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -18,6 +16,7 @@ public class PriceGroupDto { @Schema(description = "商品总价", required = true) private BigDecimal costPrice; + @Schema(description = "优惠运费", required = true) private BigDecimal storeFreePostage; @Schema(description = "运费", required = true) @@ -26,15 +25,48 @@ public class PriceGroupDto { @Schema(description = "总计", required = true) private BigDecimal totalPrice; - @Schema(description = "VIP价", required = true) - private BigDecimal vipPrice; - - @Schema(description = "积分", required = true) - private BigDecimal payIntegral; - - @Schema(description = "优惠金额", required = true) + @Schema(description = "优惠券优惠金额", required = true) private BigDecimal couponPrice; @Schema(description = "优惠券id", required = true) private Long couponId; + + // 积分抵扣是否可用 + @Schema(description = "积分抵扣是否可用") + private Boolean enableIntegral; + + // 我的积分 + @Schema(description = "我的积分") + private BigDecimal integral; + + //积分抵扣规则 + @Schema(description = "积分抵扣规则") + private BigDecimal integralRule; + + //使用积分 + @Schema(description = "使用积分") + private BigDecimal payIntegral; + + //积分抵扣金额 + @Schema(description = "积分抵扣金额") + private BigDecimal deductionPrice; + + //是否为vip + @Schema(description = "是否为vip") + private Boolean isVip; + + // 是否会员全场包邮 + @Schema(description = "是否会员全场包邮") + private Boolean vipFreeShipping; + + //会员折扣 + @Schema(description = "会员折扣") + private BigDecimal vipDiscount; + + //会员优惠金额 + @Schema(description = "会员优惠金额") + private BigDecimal vipDeductionAmount; + + @Schema(description = "总优惠金额 会员,优惠券,积分抵扣") + private BigDecimal totalCouponPrice; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java index 66c1f36..a45196e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java @@ -17,4 +17,5 @@ public class StatusDto implements Serializable { private String _title; private String _type; private String _payRemainTime; + private long _groupRemainTime; } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/AppletNoticeDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/AppletNoticeDto.java new file mode 100644 index 0000000..20005a9 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/AppletNoticeDto.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.order.service.storeorder.dto.applet; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @ClassName 获取发送通知信息token + * @Author shixiaokang + * @Date 2023/6/19 + **/ +@Data +public class AppletNoticeDto implements Serializable { + + private OrderKey order_key ; + + /*** + * 发货模式,发货模式枚举值:默认 1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY + */ + private Integer delivery_mode =1; + + /*** + * 物流模式,发货方式枚举值:默认 1、实体物流配送采用快递公司进行实体物流配送形式 + * 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 + */ + private Integer logistics_type = 1; + + private List shipping_list; + + private String upload_time; + + private Payer payer; +} + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Contact.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Contact.java new file mode 100644 index 0000000..fa50d61 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Contact.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.order.service.storeorder.dto.applet; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Contact { + + /*** + * 联系方式,当发货的物流公司为顺丰时,联系方式为必填,收件人或寄件人联系方式二选一 + * 寄件人联系方式,寄件人联系方式,采用掩码传输,最后4位数字不能打掩码 + * 示例值: `189****1234, 021-****1234, ****1234, + * 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 + */ + private String consignor_contact; + + /*** + * 收件人联系方式,收件人联系方式为,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, + * ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 + */ + private String receiver_contact; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/OrderKey.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/OrderKey.java new file mode 100644 index 0000000..08a740a --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/OrderKey.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.order.service.storeorder.dto.applet; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class OrderKey { + /*** + *订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。 + */ + private Integer order_number_type; + /*** + * 微信订单id + */ + private String transaction_id; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Payer.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Payer.java new file mode 100644 index 0000000..61e7af4 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/Payer.java @@ -0,0 +1,13 @@ +package co.yixiang.yshop.module.order.service.storeorder.dto.applet; + + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Payer { + + private String openid; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/ShippingList.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/ShippingList.java new file mode 100644 index 0000000..1b6e6ef --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/ShippingList.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.order.service.storeorder.dto.applet; + +import lombok.Data; + +@Data +public class ShippingList { + /*** + *订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。 + */ + private String tracking_no; + /*** + * 微信订单id + */ + private String express_company; + + private String item_desc; + + private Contact contact; +} + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/TokenResult.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/TokenResult.java new file mode 100644 index 0000000..5e197ed --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/applet/TokenResult.java @@ -0,0 +1,16 @@ +package co.yixiang.yshop.module.order.service.storeorder.dto.applet; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TokenResult { + + private String access_token; + + private String expires_in; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java index b649817..04f61e8 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java @@ -43,11 +43,15 @@ public class StoreOrderCartInfoServiceImpl extends ServiceImpl getStoreOrderDetailList(Collection ids); + + /** + * 获得订单明细分页 + * + * @param pageReqVO 分页查询 + * @return 订单明细分页 + */ + PageResult getStoreOrderDetailPage(StoreOrderDetailPageReqVO pageReqVO); + + /** + * 获得订单明细列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 订单明细列表 + */ + List getStoreOrderDetailList(StoreOrderDetailExportReqVO exportReqVO); + + /** + * 批量保存 + * + * @param oid 订单id + * @param orderId 订单编号 + * @param cartInfo 购物车信息 + * @param storeOrder 订单信息 + */ + void batchInsert(Long oid, String orderId, List cartInfo, StoreOrderDO storeOrder); + + + /** + * 修改明细状态,并获取订单下一步状态 + * + * @param afterSalesId + * @param oid + * @return + */ + Integer updateState(Long afterSalesId, Long oid); + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderdetail/StoreOrderDetailServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderdetail/StoreOrderDetailServiceImpl.java new file mode 100644 index 0000000..6af2aaf --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderdetail/StoreOrderDetailServiceImpl.java @@ -0,0 +1,124 @@ +package co.yixiang.yshop.module.order.service.storeorderdetail; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailCreateReqVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailExportReqVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailPageReqVO; +import co.yixiang.yshop.module.order.controller.admin.storeorderdetail.vo.StoreOrderDetailUpdateReqVO; +import co.yixiang.yshop.module.order.convert.storeorderdetail.StoreOrderDetailConvert; +import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderdetail.StoreOrderDetailDO; +import co.yixiang.yshop.module.order.dal.mysql.storeorderdetail.StoreOrderDetailMapper; +import co.yixiang.yshop.module.order.enums.OrderDetailStateEnum; +import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 订单明细 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +@Slf4j +public class StoreOrderDetailServiceImpl implements StoreOrderDetailService { + + @Resource + private StoreOrderDetailMapper storeOrderDetailMapper; + + @Override + public Long createStoreOrderDetail(StoreOrderDetailCreateReqVO createReqVO) { + // 插入 + StoreOrderDetailDO storeOrderDetail = StoreOrderDetailConvert.INSTANCE.convert(createReqVO); + storeOrderDetailMapper.insert(storeOrderDetail); + // 返回 + return storeOrderDetail.getId(); + } + + @Override + public void updateStoreOrderDetail(StoreOrderDetailUpdateReqVO updateReqVO) { + // 更新 + StoreOrderDetailDO updateObj = StoreOrderDetailConvert.INSTANCE.convert(updateReqVO); + storeOrderDetailMapper.updateById(updateObj); + } + + @Override + public void deleteStoreOrderDetail(Long id) { + // 删除 + storeOrderDetailMapper.deleteById(id); + } + + @Override + public StoreOrderDetailDO getStoreOrderDetail(Long id) { + return storeOrderDetailMapper.selectById(id); + } + + @Override + public List getStoreOrderDetailList(Collection ids) { + return storeOrderDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getStoreOrderDetailPage(StoreOrderDetailPageReqVO pageReqVO) { + return storeOrderDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getStoreOrderDetailList(StoreOrderDetailExportReqVO exportReqVO) { + return storeOrderDetailMapper.selectList(exportReqVO); + } + + // @Async + @Override + public void batchInsert(Long oid, String orderId, List cartInfo, StoreOrderDO storeOrder) { + log.info("==========添加订单详情信息start==========="); + List list = new ArrayList<>(); + for (AppStoreCartQueryVo cart : cartInfo) { + for (int i = 0; i < cart.getCartNum(); i++) { + StoreOrderDetailDO detailDO = new StoreOrderDetailDO(); + detailDO.setOid(oid); + detailDO.setOrderId(orderId); + detailDO.setProductId(cart.getProductId()); + detailDO.setSkuId(cart.getProductInfo().getSkuId()); + detailDO.setProductAttrUnique(cart.getProductAttrUnique()); + detailDO.setOriginalPrice(cart.getTruePrice()); + detailDO.setPrice(cart.getPayPrice()); + detailDO.setUseIntegral(cart.getUseIntegral()); + detailDO.setIntegralDeductionAmount(cart.getIntegralDeductionAmount()); + list.add(detailDO); + } + } + storeOrderDetailMapper.batchInsert(list); + } + + @Override + public Integer updateState(Long afterSalesId, Long oid) { + Integer state = OrderInfoEnum.REFUND_STATUS_HAVE_REFUNDED.getValue(); + if (ObjectUtil.isNotNull(afterSalesId)) { + // 判断是否全部退款,全部退款修改订单状态为已退款 + Long total = storeOrderDetailMapper.selectCount(new LambdaQueryWrapper() + .ne(StoreOrderDetailDO::getState, OrderDetailStateEnum.AFTER_SALES_COMPLETE.getValue()) + .eq(StoreOrderDetailDO::getOid, oid)); + Long updateNumber = storeOrderDetailMapper.selectCount(new LambdaQueryWrapper() + .eq(StoreOrderDetailDO::getAfterSalesId, afterSalesId)); + state = total.equals(updateNumber) ? state : null; + // 修改明细状态为售后完成 + storeOrderDetailMapper.update(null, new LambdaUpdateWrapper() + .set(StoreOrderDetailDO::getState, OrderDetailStateEnum.AFTER_SALES_COMPLETE.getValue()) + .eq(StoreOrderDetailDO::getAfterSalesId, afterSalesId)); + } + return state; + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeconfig/RechargeConfigMapper.xml b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeconfig/RechargeConfigMapper.xml new file mode 100644 index 0000000..f8d298a --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeconfig/RechargeConfigMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeorder/RechargeOrderMapper.xml b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeorder/RechargeOrderMapper.xml new file mode 100644 index 0000000..ffca5e0 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargeorder/RechargeOrderMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargepackage/RechargePackageMapper.xml b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargepackage/RechargePackageMapper.xml new file mode 100644 index 0000000..d5b6a43 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/rechargepackage/RechargePackageMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml index a4ea9d1..c4095f3 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml +++ b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml @@ -9,4 +9,17 @@ 文档可见:https://www.yixiang.co/MyBatis/x-plugins/ --> + + + + + + + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorderdetail/StoreOrderDetailMapper.xml b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorderdetail/StoreOrderDetailMapper.xml new file mode 100644 index 0000000..25127ff --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/resources/mapper/storeorderdetail/StoreOrderDetailMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + INSERT INTO yshop_store_order_detail ( + oid, product_id, sku_id, product_attr_unique, original_price, price, creator, create_time, updater, update_time, order_id,integral_deduction_amount,use_integral + ) VALUES + + ( + #{detail.oid}, #{detail.productId}, #{detail.skuId}, #{detail.productAttrUnique}, #{detail.originalPrice}, #{detail.price}, + #{detail.creator}, now(), #{detail.updater}, now(),#{detail.orderId},#{detail.integralDeductionAmount},#{detail.useIntegral} + ) + + + + diff --git a/yshop-module-mall/yshop-module-order-biz/src/test/java/DistrTest.java b/yshop-module-mall/yshop-module-order-biz/src/test/java/DistrTest.java new file mode 100644 index 0000000..2263af0 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/test/java/DistrTest.java @@ -0,0 +1,21 @@ +import co.yixiang.yshop.module.distributor.api.dto.DistributorOrderDTO; +import co.yixiang.yshop.module.distributor.controller.admin.distributordynamics.vo.DistributorDynamicsCreateReqVO; +import co.yixiang.yshop.module.order.service.storeorder.AppDistributorOrderFacadeImpl; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.randomPojo; + +@Import(AppDistributorOrderFacadeImpl.class) +public class DistrTest { + + @Resource + private AppDistributorOrderFacadeImpl appDistributorOrderFacade; + @Test + public void testCreateOrder() { + + appDistributorOrderFacade.createDistributorOrder(new DistributorOrderDTO().setOid(91L).setDistributorId(1L).setUserId(17L)); + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImplTest.java b/yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImplTest.java new file mode 100644 index 0000000..43047f7 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargeconfig/RechargeConfigServiceImplTest.java @@ -0,0 +1,175 @@ +package co.yixiang.yshop.module.order.service.rechargeconfig; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.order.controller.admin.rechargeconfig.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargeconfig.RechargeConfigDO; +import co.yixiang.yshop.module.order.dal.mysql.rechargeconfig.RechargeConfigMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link RechargeConfigServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(RechargeConfigServiceImpl.class) +public class RechargeConfigServiceImplTest extends BaseDbUnitTest { + + @Resource + private RechargeConfigServiceImpl rechargeConfigService; + + @Resource + private RechargeConfigMapper rechargeConfigMapper; + + @Test + public void testCreateRechargeConfig_success() { + // 准备参数 + RechargeConfigCreateReqVO reqVO = randomPojo(RechargeConfigCreateReqVO.class); + + // 调用 + Long rechargeConfigId = rechargeConfigService.createRechargeConfig(reqVO); + // 断言 + assertNotNull(rechargeConfigId); + // 校验记录的属性是否正确 + RechargeConfigDO rechargeConfig = rechargeConfigMapper.selectById(rechargeConfigId); + assertPojoEquals(reqVO, rechargeConfig); + } + + @Test + public void testUpdateRechargeConfig_success() { + // mock 数据 + RechargeConfigDO dbRechargeConfig = randomPojo(RechargeConfigDO.class); + rechargeConfigMapper.insert(dbRechargeConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + RechargeConfigUpdateReqVO reqVO = randomPojo(RechargeConfigUpdateReqVO.class, o -> { + o.setId(dbRechargeConfig.getId()); // 设置更新的 ID + }); + + // 调用 + rechargeConfigService.updateRechargeConfig(reqVO); + // 校验是否更新正确 + RechargeConfigDO rechargeConfig = rechargeConfigMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, rechargeConfig); + } + + @Test + public void testUpdateRechargeConfig_notExists() { + // 准备参数 + RechargeConfigUpdateReqVO reqVO = randomPojo(RechargeConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> rechargeConfigService.updateRechargeConfig(reqVO), RECHARGE_CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteRechargeConfig_success() { + // mock 数据 + RechargeConfigDO dbRechargeConfig = randomPojo(RechargeConfigDO.class); + rechargeConfigMapper.insert(dbRechargeConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbRechargeConfig.getId(); + + // 调用 + rechargeConfigService.deleteRechargeConfig(id); + // 校验数据不存在了 + assertNull(rechargeConfigMapper.selectById(id)); + } + + @Test + public void testDeleteRechargeConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> rechargeConfigService.deleteRechargeConfig(id), RECHARGE_CONFIG_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetRechargeConfigPage() { + // mock 数据 + RechargeConfigDO dbRechargeConfig = randomPojo(RechargeConfigDO.class, o -> { // 等会查询到 + o.setCustomSwitch(null); + o.setCustomMin(null); + o.setContent(null); + o.setCreateTime(null); + }); + rechargeConfigMapper.insert(dbRechargeConfig); + // 测试 customSwitch 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setCustomSwitch(null))); + // 测试 customMin 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setCustomMin(null))); + // 测试 content 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setContent(null))); + // 测试 createTime 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setCreateTime(null))); + // 准备参数 + RechargeConfigPageReqVO reqVO = new RechargeConfigPageReqVO(); + reqVO.setCustomSwitch(null); + reqVO.setCustomMin(null); + reqVO.setContent(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = rechargeConfigService.getRechargeConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbRechargeConfig, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetRechargeConfigList() { + // mock 数据 + RechargeConfigDO dbRechargeConfig = randomPojo(RechargeConfigDO.class, o -> { // 等会查询到 + o.setCustomSwitch(null); + o.setCustomMin(null); + o.setContent(null); + o.setCreateTime(null); + }); + rechargeConfigMapper.insert(dbRechargeConfig); + // 测试 customSwitch 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setCustomSwitch(null))); + // 测试 customMin 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setCustomMin(null))); + // 测试 content 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setContent(null))); + // 测试 createTime 不匹配 + rechargeConfigMapper.insert(cloneIgnoreId(dbRechargeConfig, o -> o.setCreateTime(null))); + // 准备参数 + RechargeConfigExportReqVO reqVO = new RechargeConfigExportReqVO(); + reqVO.setCustomSwitch(null); + reqVO.setCustomMin(null); + reqVO.setContent(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = rechargeConfigService.getRechargeConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbRechargeConfig, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImplTest.java b/yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImplTest.java new file mode 100644 index 0000000..585bdd3 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/test/java/co/yixiang/yshop/module/order/service/rechargepackage/RechargePackageServiceImplTest.java @@ -0,0 +1,175 @@ +package co.yixiang.yshop.module.order.service.rechargepackage; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.order.controller.admin.rechargepackage.vo.*; +import co.yixiang.yshop.module.order.dal.dataobject.rechargepackage.RechargePackageDO; +import co.yixiang.yshop.module.order.dal.mysql.rechargepackage.RechargePackageMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link RechargePackageServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(RechargePackageServiceImpl.class) +public class RechargePackageServiceImplTest extends BaseDbUnitTest { + + @Resource + private RechargePackageServiceImpl rechargePackageService; + + @Resource + private RechargePackageMapper rechargePackageMapper; + + @Test + public void testCreateRechargePackage_success() { + // 准备参数 + RechargePackageCreateReqVO reqVO = randomPojo(RechargePackageCreateReqVO.class); + + // 调用 + Long rechargePackageId = rechargePackageService.createRechargePackage(reqVO); + // 断言 + assertNotNull(rechargePackageId); + // 校验记录的属性是否正确 + RechargePackageDO rechargePackage = rechargePackageMapper.selectById(rechargePackageId); + assertPojoEquals(reqVO, rechargePackage); + } + + @Test + public void testUpdateRechargePackage_success() { + // mock 数据 + RechargePackageDO dbRechargePackage = randomPojo(RechargePackageDO.class); + rechargePackageMapper.insert(dbRechargePackage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + RechargePackageUpdateReqVO reqVO = randomPojo(RechargePackageUpdateReqVO.class, o -> { + o.setId(dbRechargePackage.getId()); // 设置更新的 ID + }); + + // 调用 + rechargePackageService.updateRechargePackage(reqVO); + // 校验是否更新正确 + RechargePackageDO rechargePackage = rechargePackageMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, rechargePackage); + } + + @Test + public void testUpdateRechargePackage_notExists() { + // 准备参数 + RechargePackageUpdateReqVO reqVO = randomPojo(RechargePackageUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> rechargePackageService.updateRechargePackage(reqVO), RECHARGE_PACKAGE_NOT_EXISTS); + } + + @Test + public void testDeleteRechargePackage_success() { + // mock 数据 + RechargePackageDO dbRechargePackage = randomPojo(RechargePackageDO.class); + rechargePackageMapper.insert(dbRechargePackage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbRechargePackage.getId(); + + // 调用 + rechargePackageService.deleteRechargePackage(id); + // 校验数据不存在了 + assertNull(rechargePackageMapper.selectById(id)); + } + + @Test + public void testDeleteRechargePackage_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> rechargePackageService.deleteRechargePackage(id), RECHARGE_PACKAGE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetRechargePackagePage() { + // mock 数据 + RechargePackageDO dbRechargePackage = randomPojo(RechargePackageDO.class, o -> { // 等会查询到 + o.setRechargeAmount(null); + o.setGiftAmount(null); + o.setStatus(null); + o.setCreateTime(null); + }); + rechargePackageMapper.insert(dbRechargePackage); + // 测试 rechargeAmount 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setRechargeAmount(null))); + // 测试 giftAmount 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setGiftAmount(null))); + // 测试 status 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setStatus(null))); + // 测试 createTime 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setCreateTime(null))); + // 准备参数 + RechargePackagePageReqVO reqVO = new RechargePackagePageReqVO(); + reqVO.setRechargeAmount(null); + reqVO.setGiftAmount(null); + reqVO.setStatus(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = rechargePackageService.getRechargePackagePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbRechargePackage, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetRechargePackageList() { + // mock 数据 + RechargePackageDO dbRechargePackage = randomPojo(RechargePackageDO.class, o -> { // 等会查询到 + o.setRechargeAmount(null); + o.setGiftAmount(null); + o.setStatus(null); + o.setCreateTime(null); + }); + rechargePackageMapper.insert(dbRechargePackage); + // 测试 rechargeAmount 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setRechargeAmount(null))); + // 测试 giftAmount 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setGiftAmount(null))); + // 测试 status 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setStatus(null))); + // 测试 createTime 不匹配 + rechargePackageMapper.insert(cloneIgnoreId(dbRechargePackage, o -> o.setCreateTime(null))); + // 准备参数 + RechargePackageExportReqVO reqVO = new RechargePackageExportReqVO(); + reqVO.setRechargeAmount(null); + reqVO.setGiftAmount(null); + reqVO.setStatus(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = rechargePackageService.getRechargePackageList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbRechargePackage, list.get(0)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApi.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApi.java new file mode 100644 index 0000000..94ec617 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApi.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.product.api.coupon; + +/** + * @author pepis + * @apiNote + **/ +public interface CouponApi { + /** + * 发放优惠券 + * @param couponId / + */ + void receiveCoupon(Long couponId,Long uid); + + /** + * 获取优惠券数量 + * @param userId 用户id + */ + Integer getCouponNumber(Long userId); +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApi.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApi.java index a4073ca..32f98f8 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApi.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApi.java @@ -1,5 +1,9 @@ package co.yixiang.yshop.module.product.api.product; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.api.product.dto.ProductDTO; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; + import java.util.List; public interface ProductApi { @@ -11,4 +15,7 @@ public interface ProductApi { // * @param productAttrUnique 商品属性Unique // */ // void checkProductStock(Long uid, Long productId, Integer cartNum, String productAttrUnique); + + PageResult getProductPage(ProductPageReqVO pageReqVO); + } diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductDTO.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductDTO.java new file mode 100644 index 0000000..7467007 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductDTO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.product.api.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "商品 DTO VO") +@Data +@ToString(callSuper = true) +public class ProductDTO { + + private Long id; + + private String image; + + private String storeName; + + private BigDecimal price; + +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductPageReqVO.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductPageReqVO.java new file mode 100644 index 0000000..fb8abed --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/api/product/dto/ProductPageReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.product.api.product.dto; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "商品分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ProductPageReqVO extends PageParam { + + /** + * 是否分销:0-否,1-是 + */ + private Integer isDistribution; + +} + diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/ErrorCodeConstants.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/ErrorCodeConstants.java index b6a82ff..cfc7dd1 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/ErrorCodeConstants.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/ErrorCodeConstants.java @@ -59,5 +59,19 @@ public interface ErrorCodeConstants { ErrorCode NOT_PRODUCT_COUPON_ERROR = new ErrorCode(1008006002, "无可领优惠券!"); + // ========== 营销活动 ========== + ErrorCode CAMPAIGN_REPEAT_ERROR = new ErrorCode(1008007000, "该项商品在此期间已有活动!"); + ErrorCode CAMPAIGN_NOT_PRODUCT_ERROR = new ErrorCode(1008007001, "活动未选择商品!"); + ErrorCode CAMPAIGN_OUT_OF_STOCK_ERROR = new ErrorCode(1008007002, "选择规格[{}]的商品库存不足!"); + ErrorCode CAMPAIGN_NOT_EXISTS = new ErrorCode(1008007003, " 活动不存在!"); + ErrorCode CAMPAIGN_CREATE_ERROR = new ErrorCode(1008007004, " 活动创建失败!"); + ErrorCode TEAMWORK_INFO_NOT_EXISTS = new ErrorCode(1008007005, " 拼团信息不存在!"); + ErrorCode CAMPAIGN_ADD_QUEUE_ERROR = new ErrorCode(1008007006, " 营销活动加入活动队列失败,失败信息:{}!"); + ErrorCode CAMPAIGN_REMOVE_QUEUE_ERROR = new ErrorCode(1008007007, " 营销活动移除活动队列失败,失败信息:{}!"); + ErrorCode CAMPAIGN_IN_PROGRESS_ERROR = new ErrorCode(1008007008, " 活动进行中!"); + ErrorCode CAMPAIGN_PASS_ORIGINAL_PRICE_ERROR = new ErrorCode(1008007009, "选择规格[{}]的商品超出原价!"); + ErrorCode TEAMWORK_REPEAT_JOIN_ERROR = new ErrorCode(1008007010, " 不能重复参加同一拼团!"); + + ErrorCode CAMPAIGN_NUMBER_ERROR = new ErrorCode(1008007011, " 超出活动购买数量!"); } diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignCommonEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignCommonEnum.java new file mode 100644 index 0000000..0c1fa16 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignCommonEnum.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.enums.campaign; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 营销活动常用枚举 + */ +@Getter +@AllArgsConstructor +public enum CampaignCommonEnum { + DEACTIVATE(1,"停用"), + ENABLE(2,"启用"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignStateEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignStateEnum.java new file mode 100644 index 0000000..91ab7eb --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignStateEnum.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.product.enums.campaign; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 营销活动状态枚举 + */ +@Getter +@AllArgsConstructor +public enum CampaignStateEnum { + NOT_STARTED(0,"未开始"), + IN_PROGRESS(1,"进行中"), + ENDED(2,"已结束"), + PREHEAT(3,"预热"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignTypeEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignTypeEnum.java new file mode 100644 index 0000000..796bd71 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/CampaignTypeEnum.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.product.enums.campaign; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 营销活动类型枚举 + */ +@Getter +@AllArgsConstructor +public enum CampaignTypeEnum { + TEAMWORK(1,"拼团"), + SECKILL(2,"秒杀"), + DISCOUNT(3,"限时折扣"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/TeamworkStateEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/TeamworkStateEnum.java new file mode 100644 index 0000000..3e0b81a --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/campaign/TeamworkStateEnum.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.product.enums.campaign; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 成团状态状态枚举 + */ +@Getter +@AllArgsConstructor +public enum TeamworkStateEnum { + JOINING(0,"拼团中"), + SUCCESS(1,"拼团成功"), + FAIL(2,"拼团失败"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/common/PageTypeEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/common/PageTypeEnum.java new file mode 100644 index 0000000..26fb84d --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/common/PageTypeEnum.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.enums.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 通用分页类型枚举 + */ +@Getter +@AllArgsConstructor +public enum PageTypeEnum { + PAGE(1,"分页"), + NOT_PAGE(2,"不分页"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/StockBackTypeEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/StockBackTypeEnum.java new file mode 100644 index 0000000..8888c40 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/StockBackTypeEnum.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.product.enums.product; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 商品库存回退类型枚举 + */ + +@Getter +@AllArgsConstructor +public enum StockBackTypeEnum { + + DEFAULT(0,"默认"), + NORMAL(1,"普通"), + CAMPAIGN(2,"活动"), + CANCEL(3,"取消"); + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkStateEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkStateEnum.java new file mode 100644 index 0000000..3e8490b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkStateEnum.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.product.enums.teamworkinfo; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 拼团状态枚举 + */ +@Getter +@AllArgsConstructor +public enum TeamworkStateEnum { + IN_PROGRESS(0,"进行中"), + SUCCESS(1,"成功"), + FAIL(2,"失败"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkTypeEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkTypeEnum.java new file mode 100644 index 0000000..ac93791 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/TeamworkTypeEnum.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.enums.teamworkinfo; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 拼团类型枚举 + */ +@Getter +@AllArgsConstructor +public enum TeamworkTypeEnum { + INITIATE(1,"发起拼团"), + JOIN(2,"失败"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/VirtuallyEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/VirtuallyEnum.java new file mode 100644 index 0000000..61d6502 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/teamworkinfo/VirtuallyEnum.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.enums.teamworkinfo; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 虚拟拼团枚举 + */ +@Getter +@AllArgsConstructor +public enum VirtuallyEnum { + NO(0,"否"), + YES(1,"是"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-biz/pom.xml b/yshop-module-mall/yshop-module-product-biz/pom.xml index a31f383..991e2c0 100644 --- a/yshop-module-mall/yshop-module-product-biz/pom.xml +++ b/yshop-module-mall/yshop-module-product-biz/pom.xml @@ -61,6 +61,16 @@ co.yixiang.boot yshop-spring-boot-starter-redis + + co.yixiang.boot + yshop-spring-boot-starter-mq + + + co.yixiang.boot + yshop-module-pay-api + 1.0.0 + compile + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApiImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApiImpl.java new file mode 100644 index 0000000..e52b49f --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/coupon/CouponApiImpl.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.product.api.coupon; + +import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author pepis + * @apiNote + **/ +@Service +public class CouponApiImpl implements CouponApi{ + @Resource + private AppCouponRelationService appCouponRecordService; + + @Override + public void receiveCoupon(Long couponId,Long uid) { + appCouponRecordService.receiveCoupon(couponId, uid); + } + + @Override + public Integer getCouponNumber(Long userId) { + return appCouponRecordService.getCouponNumber(userId); + } +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApiImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApiImpl.java index 8303083..97ab760 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApiImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/api/product/ProductApiImpl.java @@ -1,47 +1,38 @@ package co.yixiang.yshop.module.product.api.product; -import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; -import co.yixiang.yshop.framework.common.exception.ErrorCode; +import cn.hutool.core.bean.BeanUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import co.yixiang.yshop.module.product.api.product.dto.ProductDTO; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; -import co.yixiang.yshop.module.product.enums.product.ProductTypeEnum; -import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; +import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.Date; - -import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_NOT_EXISTS; +import java.util.ArrayList; +import java.util.List; @Service public class ProductApiImpl implements ProductApi { -// -// @Resource -// private AppStoreProductService appStoreProductService; -// /** -// * 检测商品库存 -// * -// * @param uid 用户ID -// * @param productId 产品ID -// * @param cartNum 购买数量 -// * @param productAttrUnique 商品属性Unique -// * @param combinationId 拼团产品ID -// */ -// @Override -// public void checkProductStock(Long uid, Long productId, Integer cartNum, String productAttrUnique) { -// StoreProductDO product = appStoreProductService -// .lambdaQuery().eq(StoreProductDO::getId, productId) -// .eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW_1.getValue()) -// .one(); -// if (product == null) { -// throw exception(STORE_PRODUCT_NOT_EXISTS); -// } -// -// int stock = appStoreProductService.getProductStock(productId, productAttrUnique, ProductTypeEnum.PINK.getValue()); -// if (stock < cartNum) { -// throw exception(new ErrorCode(1008003010, product.getStoreName() + "库存不足" + cartNum)); -// } -// -// } + + @Resource + private StoreProductService storeProductService; + + @Override + public PageResult getProductPage(ProductPageReqVO pageReqVO) { + PageResult result = new PageResult<>(); + List resultList = new ArrayList<>(); + PageResult productPage = storeProductService.getProductPage(pageReqVO); + List list = productPage.getList(); + for (StoreProductDO s:list) { + ProductDTO productDTO = BeanUtil.copyProperties(s, ProductDTO.class); + resultList.add(productDTO); + } + result.setList(resultList); + result.setTotal(productPage.getTotal()); + return result; + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailBaseVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailBaseVO.java new file mode 100644 index 0000000..f6fd3d3 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailBaseVO.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 营销活动明细 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CampaignDetailBaseVO { + + @Schema(description = "营销活动id", required = true, example = "4899") + @NotNull(message = "营销活动id不能为空") + private Long campaignId; + + @Schema(description = "商品id", required = true, example = "1690") + @NotNull(message = "商品id不能为空") + private Long productId; + + @Schema(description = "规格id", required = true, example = "9358") + @NotNull(message = "规格id不能为空") + private Long skuId; + + @Schema(description = "活动价格", required = true, example = "25390") + @NotNull(message = "活动价格不能为空") + private BigDecimal price; + + @Schema(description = "折扣比例", required = true, example = "6397") + @NotNull(message = "折扣比例不能为空") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + @NotNull(message = "活动库存剩余数量不能为空") + private Integer stock; + + @Schema(description = "活动库存总数量", required = true) + @NotNull(message = "活动库存总数量不能为空") + private Integer total; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailCreateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailCreateReqVO.java new file mode 100644 index 0000000..c632ce5 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailCreateReqVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 营销活动明细创建 Request VO") +@Data +@ToString(callSuper = true) +public class CampaignDetailCreateReqVO{ + + @Schema(description = "商品id", required = true, example = "1690") + @NotNull(message = "商品id不能为空") + private Long productId; + + @Schema(description = "规格id", required = true, example = "9358") + @NotNull(message = "规格id不能为空") + private Long skuId; + + @Schema(description = "活动价格", required = true, example = "25390") + private BigDecimal price; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + @NotNull(message = "活动库存数量不能为空") + private Integer stock; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExcelVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExcelVO.java new file mode 100644 index 0000000..424c099 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExcelVO.java @@ -0,0 +1,49 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 营销活动明细 Excel VO + * + * @author moxiangrong + */ +@Data +public class CampaignDetailExcelVO { + + @ExcelProperty("营销活动明细id") + private Long id; + + @ExcelProperty("营销活动id") + private Long campaignId; + + @ExcelProperty("商品id") + private Long productId; + + @ExcelProperty("规格id") + private Long skuId; + + @ExcelProperty("活动价格") + private BigDecimal price; + + @ExcelProperty("折扣比例") + private BigDecimal discount; + + @ExcelProperty("活动库存剩余数量") + private Integer stock; + + @ExcelProperty("活动库存总数量") + private Integer total; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExportReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExportReqVO.java new file mode 100644 index 0000000..f6b9a73 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailExportReqVO.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 营销活动明细 Excel 导出 Request VO,参数和 CampaignDetailPageReqVO 是一致的") +@Data +public class CampaignDetailExportReqVO { + + @Schema(description = "营销活动id", example = "4899") + private Long campaignId; + + @Schema(description = "商品id", example = "1690") + private Long productId; + + @Schema(description = "规格id", example = "9358") + private Long skuId; + + @Schema(description = "活动价格", example = "25390") + private BigDecimal price; + + @Schema(description = "折扣比例", example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量") + private Integer stock; + + @Schema(description = "活动库存总数量") + private Integer total; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailPageReqVO.java new file mode 100644 index 0000000..b970e15 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailPageReqVO.java @@ -0,0 +1,45 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 营销活动明细分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CampaignDetailPageReqVO extends PageParam { + + @Schema(description = "营销活动id", example = "4899") + private Long campaignId; + + @Schema(description = "商品id", example = "1690") + private Long productId; + + @Schema(description = "规格id", example = "9358") + private Long skuId; + + @Schema(description = "活动价格", example = "25390") + private BigDecimal price; + + @Schema(description = "折扣比例", example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量") + private Integer stock; + + @Schema(description = "活动库存总数量") + private Integer total; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailRespVO.java new file mode 100644 index 0000000..adb3334 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailRespVO.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 营销活动明细 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignDetailRespVO { + + @Schema(description = "商品id", required = true, example = "1690") + private Long id; + + @Schema(description = "商品名称", required = true, example = "1690") + private String storeName; + + @Schema(description = "规格类型 0单 1多", required = true) + private Integer specType; + + @Schema(description = "图片", required = true, example = "9358") + private String image; + + @Schema(description = "活动价格", required = true, example = "25390") + private BigDecimal price; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + private Integer stock; + + @Schema(description = "活动总库存数量", required = true) + private Integer total; + + @Schema(description = "商品原价", required = true) + private BigDecimal originalPrice; + + @Schema(description = "商品原库存", required = true) + private Integer originalStock; + + @Schema(description = "规格明细") + private List skus; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailUpdateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailUpdateReqVO.java new file mode 100644 index 0000000..f47975c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignDetailUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 营销活动明细更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CampaignDetailUpdateReqVO extends CampaignDetailBaseVO { + + @Schema(description = "营销活动明细id", required = true, example = "1740") + @NotNull(message = "营销活动明细id不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignSkuDetailRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignSkuDetailRespVO.java new file mode 100644 index 0000000..197a9bd --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigndetail/vo/CampaignSkuDetailRespVO.java @@ -0,0 +1,55 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 营销活动规格明细 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignSkuDetailRespVO { + + @Schema(description = "商品id", required = true, example = "1690") + private Long productId; + + @Schema(description = "商品名称", required = true, example = "1690") + private String productName; + + @Schema(description = "规格id", required = true, example = "9358") + private Long skuId; + + @Schema(description = "规格类型 0单 1多", required = true) + private Integer specType; + + @Schema(description = "规格名称", required = true, example = "9358") + private String sku; + + @Schema(description = "图片", required = true, example = "9358") + private String image; + + @Schema(description = "商品图片", required = true, example = "9358") + private String productImage; + + @Schema(description = "活动价格", required = true, example = "25390") + private BigDecimal price; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + private Integer stock; + + @Schema(description = "活动总库存数量", required = true) + private Integer total; + + @Schema(description = "原价", required = true, example = "25390") + private BigDecimal originalPrice; + + @Schema(description = "商品价格", required = true, example = "25390") + private BigDecimal productPrice; + + @Schema(description = "规格原库存", required = true, example = "25390") + private Integer originalStock; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/CampaignInfoController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/CampaignInfoController.java new file mode 100644 index 0000000..2833462 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/CampaignInfoController.java @@ -0,0 +1,142 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo; + +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductReqVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductRespVO; +import co.yixiang.yshop.module.product.service.campaigninfo.AppCampaignInfoService; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; +import co.yixiang.yshop.module.product.convert.campaigninfo.CampaignInfoConvert; +import co.yixiang.yshop.module.product.service.campaigninfo.CampaignInfoService; + +@Tag(name = "管理后台 - 活动信息") +@RestController +@RequestMapping("/product/campaign-info") +@Validated +public class CampaignInfoController { + + @Resource + private CampaignInfoService campaignInfoService; + + @Resource + private AppCampaignInfoService appCampaignInfoService; + + @PostMapping("/create") + @Operation(summary = "创建活动信息") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:create')") + public CommonResult createCampaignInfo(@Valid @RequestBody CampaignInfoCreateReqVO createReqVO){ + return success(campaignInfoService.createCampaignInfo(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新活动信息") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:update')") + public CommonResult updateCampaignInfo(@Valid @RequestBody CampaignInfoUpdateReqVO updateReqVO) { + campaignInfoService.updateCampaignInfo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除活动信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:delete')") + public CommonResult deleteCampaignInfo(@RequestParam("id") Long id) { + campaignInfoService.deleteCampaignInfo(id); + return success(true); + } + + @GetMapping("/close") + @Operation(summary = "结束活动信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:close')") + public CommonResult closeCampaignInfo(@RequestParam("id") Long id) { + campaignInfoService.closeCampaignInfo(id); + return success(true); + } + + @GetMapping("/start") + @Operation(summary = "开始活动信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:start')") + public CommonResult startCampaignInfo(@RequestParam("id") Long id) { + campaignInfoService.startCampaignInfo(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得活动信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:query')") + public CommonResult getCampaignInfo(@RequestParam("id") Long id) { + return success(campaignInfoService.getCampaignInfo(id)); + } + + @GetMapping("/page") + @Operation(summary = "获得活动信息分页") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:query')") + public CommonResult> getCampaignInfoPage(@Valid CampaignInfoPageReqVO pageVO) { + return success(campaignInfoService.getCampaignInfoPage(pageVO)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出活动信息 Excel") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:export')") + @OperateLog(type = EXPORT) + public void exportCampaignInfoExcel(@Valid CampaignInfoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = campaignInfoService.getCampaignInfoList(exportReqVO); + // 导出 Excel + List datas = CampaignInfoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "活动信息.xls", "数据", CampaignInfoExcelVO.class, datas); + } + + @GetMapping("/data") + @Operation(summary = "获得活动数据") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:data')") + public CommonResult getCampaignData(@RequestParam("id") Long id) { + return success(campaignInfoService.getCampaignData(id)); + } + + @GetMapping("/data-detail") + @Operation(summary = "获得活动信息分页") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:data-detail')") + public CommonResult> getCampaignDataDetail(@Valid CampaignDataDetailPageReqVO pageVO) { + return success(campaignInfoService.getCampaignDataDetail(pageVO)); + } + + @GetMapping("/canvas/page") + @Operation(summary = "获得画布活动分页") + @PreAuthorize("@ss.hasPermission('yshop:campaign-info:canvas:page')") + public CommonResult> getCanvasCampaignPage(@Valid CanvasCampaignPageReqVO pageVO) { + return success(campaignInfoService.getCanvasCampaignPage(pageVO)); + } + + @PostMapping("/canvas/product-page") + @Operation(summary = "获得营销活动商品列表") + public CommonResult> getCampaignProductPage(@RequestBody CampaignProductReqVO reqVO) { + return success(appCampaignInfoService.getCampaignProductPage(reqVO)); + } + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/param/CampaignJudgmentParam.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/param/CampaignJudgmentParam.java new file mode 100644 index 0000000..eb9f0b8 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/param/CampaignJudgmentParam.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 校验营销活动重复参数 + */ +@Data +public class CampaignJudgmentParam { + + @Schema(description = "活动商品集合", required = true) + private List productIds; + + @Schema(description = "活动id", required = true) + private Long campaignId; + + @Schema(description = "活动开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "活动结束", required = true) + private LocalDateTime endTime; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailPageReqVO.java new file mode 100644 index 0000000..ebdb28d --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailPageReqVO.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 活动数据详情分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CampaignDataDetailPageReqVO extends PageParam { + + @Schema(description = "活动id", example = "赵六") + private Long id; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailRespVO.java new file mode 100644 index 0000000..a6f27a1 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataDetailRespVO.java @@ -0,0 +1,44 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 活动数据明细 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignDataDetailRespVO { + + + @Schema(description = "规格id", required = true, example = "赵六") + private Long skuId; + + @Schema(description = "规格id", required = true, example = "赵六") + private String unique; + + @Schema(description = "商品名称", required = true, example = "赵六") + private String productName; + + @Schema(description = "规格名称", required = true, example = "赵六") + private String sku; + + @Schema(description = "图片", required = true, example = "赵六") + private String image; + + @Schema(description = "成交金额", required = true) + private BigDecimal dealAmount = BigDecimal.ZERO; + + @Schema(description = "成交单量", required = true, example = "赵六") + private Integer dealQuantity = 0; + + @Schema(description = "成交人数", required = true) + private Integer peopleNumber = 0; + + @Schema(description = "成交商品数", required = true) + private Integer productQuantity = 0; + + @Schema(description = "客单价", required = true) + private BigDecimal averagePrice = BigDecimal.ZERO; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataRespVO.java new file mode 100644 index 0000000..9e80280 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignDataRespVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 活动数据 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignDataRespVO { + + @Schema(description = "营销活动id", required = true, example = "8152") + private Long id; + + @Schema(description = "活动名称", required = true, example = "赵六") + private String name; + + @Schema(description = "成交金额", required = true) + private BigDecimal dealAmount = BigDecimal.ZERO; + + @Schema(description = "成交单量", required = true, example = "赵六") + private Integer dealQuantity = 0; + + @Schema(description = "成交人数", required = true) + private Integer peopleNumber = 0; + + @Schema(description = "成交商品数", required = true) + private Integer productQuantity = 0; + + @Schema(description = "客单价", required = true) + private BigDecimal averagePrice = BigDecimal.ZERO; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoBaseVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoBaseVO.java new file mode 100644 index 0000000..d6bfd85 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoBaseVO.java @@ -0,0 +1,61 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; +import java.time.LocalDateTime; + +/** +* 活动信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CampaignInfoBaseVO { + + @Schema(description = "活动名称", required = true, example = "赵六") + @NotNull(message = "活动名称不能为空") + private String name; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", required = true, example = "2") + @NotNull(message = "活动类型:1、拼团,2、秒杀,3、限时折扣不能为空") + private Integer type; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "活动开始时间", required = true) + @NotNull(message = "活动开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "活动结束时间", required = true) + @NotNull(message = "活动结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "商品限购 1-不限购 2-限购", required = true) + @NotNull(message = "商品限购 1-不限购 2-限购不能为空") + private Integer ifLimit; + + @Schema(description = "限购几件/人") + private Integer limitNumber; + + @Schema(description = "活动预热 1-停用 2-启用", required = true) + @NotNull(message = "活动预热 1-停用 2-启用不能为空") + private Integer ifEnable; + + @Schema(description = "预热几分钟前") + private Integer enableTime; + + + @Schema(description = "活动状态 0-未开始 1-进行中 2-已结束") + private Integer state; + + @Schema(description = "成团人数") + private Integer person; + + @Schema(description = "成团有效时间几(分钟)") + private Integer effectiveTime; + + @Schema(description = "是否虚拟成团:0-否,1-是", required = true) + private Integer isVirtually; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoCreateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoCreateReqVO.java new file mode 100644 index 0000000..895368f --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoCreateReqVO.java @@ -0,0 +1,63 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignDetailCreateReqVO; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; + +import io.swagger.v3.oas.annotations.media.Schema; + +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 活动信息创建 Request VO") +@Data +@ToString(callSuper = true) +public class CampaignInfoCreateReqVO { + + @Schema(description = "活动名称", required = true, example = "赵六") + @NotNull(message = "活动名称不能为空") + private String name; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", required = true, example = "2") + @NotNull(message = "活动类型不能为空") + private Integer type; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "活动开始时间", required = true) + @NotNull(message = "活动开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "活动结束时间", required = true) + @NotNull(message = "活动结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "商品限购 1-不限购 2-限购", required = true) + @NotNull(message = "商品限购不能为空") + private Integer ifLimit; + + @Schema(description = "限购几件/人") + private Integer limitNumber; + + @Schema(description = "活动预热 1-停用 2-启用", required = true) + @NotNull(message = "活动预热不能为空") + private Integer ifEnable; + + @Schema(description = "预热几分钟前") + private Integer enableTime; + + + @Schema(description = "成团人数") + private Integer person; + + @Schema(description = "成团有效时间几(分钟)") + private Integer effectiveTime; + + @Schema(description = "是否虚拟成团:0-否,1-是", required = true) + private Integer isVirtually; + + @Schema(description = "活动商品数据") + List details; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExcelVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExcelVO.java new file mode 100644 index 0000000..250136c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExcelVO.java @@ -0,0 +1,59 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import lombok.*; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 活动信息 Excel VO + * + * @author moxiangrong + */ +@Data +public class CampaignInfoExcelVO { + + @ExcelProperty("营销活动id") + private Long id; + + @ExcelProperty("活动名称") + private String name; + + @ExcelProperty("活动类型:1、拼团,2、秒杀,3、限时折扣") + private Integer type; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("活动开始时间") + private LocalDateTime startTime; + + @ExcelProperty("活动结束时间") + private LocalDateTime endTime; + + @ExcelProperty("商品限购 1-不限购 2-限购") + private Integer ifLimit; + + @ExcelProperty("限购几件/人") + private Integer limitNumber; + + @ExcelProperty("活动预热 1-停用 2-启用") + private Integer ifEnable; + + @ExcelProperty("预热几分钟前") + private Integer enableTime; + + + @ExcelProperty("活动状态 0-未开始 1-进行中 2-已结束") + private Integer state; + + @ExcelProperty("成团人数") + private Integer person; + + @ExcelProperty("成团有效时间几(分钟)") + private Integer effectiveTime; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExportReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExportReqVO.java new file mode 100644 index 0000000..5178180 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoExportReqVO.java @@ -0,0 +1,59 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 活动信息 Excel 导出 Request VO,参数和 CampaignInfoPageReqVO 是一致的") +@Data +public class CampaignInfoExportReqVO { + + @Schema(description = "活动名称", example = "赵六") + private String name; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", example = "2") + private Integer type; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "活动开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] startTime; + + @Schema(description = "活动结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] endTime; + + @Schema(description = "商品限购 1-不限购 2-限购") + private Integer ifLimit; + + @Schema(description = "限购几件/人") + private Integer limitNumber; + + @Schema(description = "活动预热 1-停用 2-启用") + private Integer ifEnable; + + @Schema(description = "预热几分钟前") + private Integer enableTime; + + @Schema(description = "活动状态 0-未开始 1-进行中 2-已结束") + private Integer state; + + @Schema(description = "成团人数") + private Integer person; + + @Schema(description = "成团有效时间几(分钟)") + private Integer effectiveTime; + + @Schema(description = "是否虚拟成团:0-否,1-是", required = true) + private Integer isVirtually; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageReqVO.java new file mode 100644 index 0000000..6bd3aed --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageReqVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 活动信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CampaignInfoPageReqVO extends PageParam { + + @Schema(description = "活动名称", example = "赵六") + private String name; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", example = "2") + private Integer type; + + @Schema(description = "活动状态", example = "2") + private Integer state; + + @Schema(description = "活动开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageRespVO.java new file mode 100644 index 0000000..40de814 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoPageRespVO.java @@ -0,0 +1,42 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 活动分页信息 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignInfoPageRespVO { + + @Schema(description = "营销活动id", required = true, example = "8152") + private Long id; + + @Schema(description = "活动名称", required = true, example = "赵六") + private String name; + + @Schema(description = "活动开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "活动结束时间", required = true) + private LocalDateTime endTime; + + @Schema(description = "订单数量", required = true, example = "赵六") + private Integer orderQuantity = 0; + + @Schema(description = "销售额", required = true) + private BigDecimal salesAmount = BigDecimal.ZERO; + + @Schema(description = "销量", required = true) + private Integer salesQuantity = 0; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "活动状态 0-未开始 1-进行中 2-已结束") + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoRespVO.java new file mode 100644 index 0000000..6f91b14 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoRespVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; + +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignDetailRespVO; + +@Schema(description = "管理后台 - 活动信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CampaignInfoRespVO extends CampaignInfoBaseVO { + + @Schema(description = "营销活动id", required = true, example = "8152") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "当前时间", required = true) + private LocalDateTime now; + + @Schema(description = "商品数据", required = true) + List details; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoUpdateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoUpdateReqVO.java new file mode 100644 index 0000000..d3b075b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignInfoUpdateReqVO.java @@ -0,0 +1,64 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignDetailCreateReqVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 活动信息更新 Request VO") +@Data +@ToString(callSuper = true) +public class CampaignInfoUpdateReqVO { + + @Schema(description = "营销活动id", required = true, example = "8152") + @NotNull(message = "营销活动id不能为空") + private Long id; + + @Schema(description = "活动名称", required = true, example = "赵六") + @NotNull(message = "活动名称不能为空") + private String name; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", required = true, example = "2") + @NotNull(message = "活动类型不能为空") + private Integer type; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "活动开始时间", required = true) + @NotNull(message = "活动开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "活动结束时间", required = true) + @NotNull(message = "活动结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "商品限购 1-不限购 2-限购", required = true) + @NotNull(message = "商品限购不能为空") + private Integer ifLimit; + + @Schema(description = "限购几件/人") + private Integer limitNumber; + + @Schema(description = "活动预热 1-停用 2-启用", required = true) + @NotNull(message = "活动预热不能为空") + private Integer ifEnable; + + @Schema(description = "预热几分钟前") + private Integer enableTime; + + @Schema(description = "成团人数") + private Integer person; + + @Schema(description = "成团有效时间几(分钟)") + private Integer effectiveTime; + + @Schema(description = "是否虚拟成团:0-否,1-是", required = true) + private Integer isVirtually; + + @Schema(description = "活动商品数据") + List details; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignOrderVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignOrderVo.java new file mode 100644 index 0000000..0357326 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CampaignOrderVo.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 营销活动订单信息 + */ +@Data +public class CampaignOrderVo { + + @Schema(description = "活动id", required = true) + private Long campaignId; + + @Schema(description = "订单id", required = true) + private Long oid; + + @Schema(description = "用户id", required = true) + private Long uid; + + @Schema(description = "规格唯一值", required = true) + private String unique; + + @Schema(description = "订单商品数量", required = true, example = "赵六") + private Integer number; + + @Schema(description = "订单金额", required = true) + private BigDecimal price; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageReqVO.java new file mode 100644 index 0000000..2144abb --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageReqVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.List; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 画布活动分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CanvasCampaignPageReqVO extends PageParam { + + @Schema(description = "活动id集合", example = "1") + private List ids; + + @Schema(description = "活动名称", example = "赵六") + private String name; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", example = "2") + private Integer type; + + @Schema(description = "是否: 1、分页,2、不分页", example = "2") + private Integer isPage; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageRespVO.java new file mode 100644 index 0000000..bdf71a0 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/campaigninfo/vo/CanvasCampaignPageRespVO.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 画布活动分页信息 Response VO") +@Data +@ToString(callSuper = true) +public class CanvasCampaignPageRespVO { + + @Schema(description = "营销活动id", required = true, example = "8152") + private Long id; + + @Schema(description = "活动名称", required = true, example = "赵六") + private String name; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "活动开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "活动结束时间", required = true) + private LocalDateTime endTime; + + @Schema(description = "活动状态 0-未开始 1-进行中 2-已结束") + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/ProductCategoryController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/ProductCategoryController.java index 1559964..2f58076 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/ProductCategoryController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/ProductCategoryController.java @@ -1,10 +1,7 @@ package co.yixiang.yshop.module.product.controller.admin.category; import co.yixiang.yshop.framework.common.pojo.CommonResult; -import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; -import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryRespVO; -import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; +import co.yixiang.yshop.module.product.controller.admin.category.vo.*; import co.yixiang.yshop.module.product.convert.category.ProductCategoryConvert; import co.yixiang.yshop.module.product.dal.dataobject.category.ProductCategoryDO; import co.yixiang.yshop.module.product.service.category.ProductCategoryService; @@ -73,4 +70,11 @@ public class ProductCategoryController { return success(ProductCategoryConvert.INSTANCE.convertList(list)); } + @GetMapping("/tree") + @Operation(summary = "获得商品分类树") + @PreAuthorize("@ss.hasPermission('product:category:tree')") + public CommonResult> getCategoryTree() { + return success(categoryService.getCategoryTree()); + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/vo/ProductCategoryTreeRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/vo/ProductCategoryTreeRespVO.java new file mode 100644 index 0000000..1cdea07 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/category/vo/ProductCategoryTreeRespVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.product.controller.admin.category.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 商品分类树 Response VO") +@Data +@ToString(callSuper = true) +public class ProductCategoryTreeRespVO { + + @Schema(description = "分类编号", required = true, example = "2") + private Long id; + + @Schema(description = "父分类编号", required = true, example = "2") + private Long parentId; + + @Schema(description = "分类名称", required = true) + private String name; + + @Schema(description = "子分类", required = true) + private List children; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java index 4f967a3..d9a2d5f 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java @@ -2,10 +2,7 @@ package co.yixiang.yshop.module.product.controller.admin.productcoupon; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.*; import co.yixiang.yshop.module.product.service.productcoupon.ProductCouponService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -58,4 +55,10 @@ public class ProductCouponController { return success(couponService.deleteCoupon(id)); } + @GetMapping("/canvas/page") + @Operation(summary = "画布优惠券分页") + public CommonResult> getCanvasProductPage(@Valid CanvasProductCouponPageReqVO pageVO) { + return success(couponService.getCanvasProductPage(pageVO)); + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponPageReqVO.java new file mode 100644 index 0000000..e72c0ff --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "管理后台 - 画布商品优惠券分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CanvasProductCouponPageReqVO extends PageParam { + @Schema(description = "优惠券id集合", example = "1") + private List ids; + + @Schema(description = "优惠券名称", example = "1") + private String couponName; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "是否: 1、分页,2、不分页", example = "2") + private Integer isPage; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponRespVO.java new file mode 100644 index 0000000..f0b9bdf --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/CanvasProductCouponRespVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +@Schema(description = "管理后台 - 画布商品优惠券") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CanvasProductCouponRespVO extends ProductCouponBaseVO { + + @Schema(description = "优惠券状态:1、进行中,2、已结束,3、未开始", required = true, example = "进行中") + private String status; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java index 0f93f57..b4e1e98 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java @@ -8,7 +8,7 @@ import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.*; import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; -import co.yixiang.yshop.module.product.service.storeproduct.dto.StoreProductDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.StoreProductDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -40,7 +40,7 @@ public class StoreProductController { @PostMapping("/create") @Operation(summary = "创建商品") @PreAuthorize("@ss.hasPermission('shop:store-product:create')") - public CommonResult createStoreProduct(@Valid @RequestBody StoreProductDto storeProductDto) { + public CommonResult createStoreProduct(@Valid @RequestBody StoreProductDTO storeProductDto) { storeProductService.insertAndEditYxStoreProduct(storeProductDto); return success(true); } @@ -127,4 +127,17 @@ public class StoreProductController { return success(true); } + @GetMapping("/campaign-product/page") + @Operation(summary = "获得营销活动商品列表") + public CommonResult> getCampaignProductPage(@Valid CampaignProductPageReqVO pageVO) { + return success(storeProductService.getCampaignProductPage(pageVO)); + } + + @GetMapping("/canvas/page") + @Operation(summary = "获得画布商品分页") + @PreAuthorize("@ss.hasPermission('shop:store-product:canvas:query')") + public CommonResult> getCanvasProductPage(@Valid CanvasProductPageReqVO pageVO) { + return success(storeProductService.getCanvasProductPage(pageVO)); + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductPageReqVO.java new file mode 100644 index 0000000..037c3e5 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductPageReqVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.product.controller.admin.storeproduct.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "管理后台 - 营销活动商品分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CampaignProductPageReqVO extends PageParam { + + @Schema(description = "商品名称", example = "张三") + private String storeName; + + @Schema(description = "规格 0单 1多", example = "1") + private Integer specType; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductRespVO.java new file mode 100644 index 0000000..542d974 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignProductRespVO.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.product.controller.admin.storeproduct.vo; + +import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 营销活动商品 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignProductRespVO{ + + @Schema(description = "商品id", required = true, example = "1175") + private Long id; + + @Schema(description = "商品图片", required = true) + private String image; + + @Schema(description = "商品名称", required = true, example = "张三") + private String storeName; + + @Schema(description = "商品价格", required = true, example = "18735") + private BigDecimal price; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "规格 0单 1多", example = "1") + private Integer specType; + + @Schema(description = "规格信息", example = "1") + List skus; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignSkuRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignSkuRespVO.java new file mode 100644 index 0000000..2c66ef0 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CampaignSkuRespVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.product.controller.admin.storeproduct.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 营销活动商品sku Response VO") +@Data +@ToString(callSuper = true) +public class CampaignSkuRespVO { + + @Schema(description = "规格id", required = true, example = "1175") + private Long skuId; + + @Schema(description = "商品id", required = true, example = "1175") + private Long productId; + + @Schema(description = "规格名称", required = true, example = "1175") + private String sku; + + @Schema(description = "规格图片", required = true) + private String image; + + @Schema(description = "规格价格", required = true, example = "18735") + private BigDecimal price; + + @Schema(description = "规格库存") + private Integer stock; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CanvasProductPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CanvasProductPageReqVO.java new file mode 100644 index 0000000..216e976 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/CanvasProductPageReqVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.product.controller.admin.storeproduct.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "管理后台 - 画布商品分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CanvasProductPageReqVO extends PageParam { + + @Schema(description = "商品名称", example = "张三") + private String storeName; + + @Schema(description = "商品分类id", example = "0") + private Long cateId; + + @Schema(description = "商品分类id合集", example = "0") + private List cateIds; + + @Schema(description = "商品id集合") + private List ids; + + @Schema(description = "是否: 1、分页,2、不分页", example = "2") + private Integer isPage; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductBaseVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductBaseVO.java index 2913f03..c8cab0c 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductBaseVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductBaseVO.java @@ -40,4 +40,30 @@ public class StoreProductBaseVO { @Schema(description = "是否包邮") private Integer isPostage; + /* 分销商相关 */ + /** + * 是否分销:0-否,1-是 + */ + @Schema(description = "是否分销:0-否,1-是") + private Integer isDistribution; + + // 分销规则 0-默认 1-自定义 + @Schema(description = "分销规则 0-默认 1-自定义") + private Integer distributionRule; + + @Schema(description = "分销等级 1-一级 2-二级") + private Integer distributionLevel; + + // 分销自购 0-关闭 1-开启 + @Schema(description = "分销自购 0-关闭 1-开启") + private Integer distributionPurchase; + + // 商品结算方式 0-实际支付价格 1-商品价格 + @Schema(description = "商品结算方式 0-实际支付价格 1-商品价格") + private Integer distributionProductSettlement; + + // 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + @Schema(description = "佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算") + private Integer distributionWagesSettlement; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java index fc68851..5c9181d 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java @@ -26,9 +26,12 @@ public class StoreProductPageReqVO extends PageParam { @Schema(description = "库存售罄", example = "0") private String stock; - @Schema(description = "库存售罄", example = "0") + private Long cateId; private List catIds; + @Schema(description = "是否分销 0-否 1-是", example = "0") + private Integer isDistribution; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductRespVO.java index 27c11aa..7b37be3 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductRespVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductRespVO.java @@ -2,6 +2,8 @@ package co.yixiang.yshop.module.product.controller.admin.storeproduct.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + +import java.math.BigDecimal; import java.time.LocalDateTime; @Schema(description = "管理后台 - 商品 Response VO") @@ -16,4 +18,40 @@ public class StoreProductRespVO extends StoreProductBaseVO { @Schema(description = "添加时间") private LocalDateTime createTime; + @Schema(description = "规格id",required = true) + private Long skuId; + + @Schema(description = "规格唯一值") + private String productAttrUnique; + + @Schema(description = "活动类型", required = true) + private Integer campaignType; + + @Schema(description = "活动状态:0-未开始 1-进行中 2-已结束 3-预热", required = true) + private Integer campaignState; + + @Schema(description = "活动价格", required = true) + private BigDecimal campaignOriginalPrice; + + @Schema(description = "活动价格", required = true) + private BigDecimal campaignPrice; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + private Integer campaignStock; + + @Schema(description = "活动总库存数量", required = true) + private Integer campaignTotal; + + @Schema(description = "成团人数", required = true) + private Integer person; + + /** + * 是否分销:0-否,1-是 + */ + @Schema(description = "是否分销:0-否,1-是") + private Integer isDistribution; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java index b03164e..2e79d23 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java @@ -110,4 +110,9 @@ public class StoreProductUpdateReqVO extends StoreProductBaseVO { @Schema(description = "需要多少积分兑换 只在开启积分兑换时生效") private Integer integral; + /** + * 是否分销:0-否,1-是 + */ + private Integer isDistribution; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/TeamworkInfoController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/TeamworkInfoController.java new file mode 100644 index 0000000..4e2cbb9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/TeamworkInfoController.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.teamworkinfo.TeamworkInfoDO; +import co.yixiang.yshop.module.product.convert.teamworkinfo.TeamworkInfoConvert; +import co.yixiang.yshop.module.product.service.teamworkinfo.TeamworkInfoService; + +@Tag(name = "管理后台 - 拼团信息") +@RestController +@RequestMapping("/product/teamwork-info") +@Validated +public class TeamworkInfoController { + + @Resource + private TeamworkInfoService teamworkInfoService; + + @GetMapping("/page") + @Operation(summary = "获得拼团信息分页") + @PreAuthorize("@ss.hasPermission('product:teamwork-info:query')") + public CommonResult> getTeamworkInfoPage(@Valid TeamworkInfoPageReqVO pageVO) { + return success(teamworkInfoService.getTeamworkInfoPage(pageVO)); + } + + @GetMapping("/order-page") + @Operation(summary = "获得拼团订单信息分页") + @PreAuthorize("@ss.hasPermission('product:teamwork-info:order-pag')") + public CommonResult> getTeamworkInfoPage(@Valid TeamworkOrderInfoPageReqVO pageVO) { + return success(teamworkInfoService.getTeamworkOrderInfoPage(pageVO)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/param/TeamworkRefundParam.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/param/TeamworkRefundParam.java new file mode 100644 index 0000000..c8b7c16 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/param/TeamworkRefundParam.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 拼团退款后处理 Param") +@Data +@ToString(callSuper = true) +public class TeamworkRefundParam { + + @Schema(description = "拼团id") + private Long id; + + @Schema(description = "用户id") + private Long uid; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoBaseVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoBaseVO.java new file mode 100644 index 0000000..c899dc3 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoBaseVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 拼团信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class TeamworkInfoBaseVO { + + @Schema(description = "拼团活动id", required = true, example = "23010") + @NotNull(message = "拼团活动id不能为空") + private Long campaignId; + + @Schema(description = "参团人数", required = true) + @NotNull(message = "参团人数不能为空") + private Integer people; + + @Schema(description = "成团状态 0-拼团中 1-拼团成功 2-拼团失败", required = true) + @NotNull(message = "成团状态 0-拼团中 1-拼团成功 2-拼团失败不能为空") + private Integer state; + + @Schema(description = "团长id", required = true) + private Long regimentalCommanderId; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateReqVO.java new file mode 100644 index 0000000..fe7213b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 拼团信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TeamworkInfoCreateReqVO extends TeamworkInfoBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateVO.java new file mode 100644 index 0000000..c1a0bda --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoCreateVO.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 拼团信息创建 VO") +@Data +@ToString(callSuper = true) +public class TeamworkInfoCreateVO { + + @Schema(description = "拼团活动明细id", required = true, example = "23010") + private Long campaignDetailId; + + @Schema(description = "拼团类型:1、发起拼团,2、加入拼团", required = true) + private Integer teamworkType; + + @Schema(description = "拼团id", required = true) + private Long teamworkId; + + @Schema(description = "用户id", required = true) + private Long uid; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoPageReqVO.java new file mode 100644 index 0000000..506370c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoPageReqVO.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 拼团信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TeamworkInfoPageReqVO extends PageParam { + + @Schema(description = "活动名称", example = "23010") + private String campaignName; + + @Schema(description = "成团状态 0-拼团中 1-拼团成功 2-拼团失败") + private Boolean state; + + @Schema(description = "开始时间") + private String startTime; + + @Schema(description = "结束时间") + private String endTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoRespVO.java new file mode 100644 index 0000000..51ad5f0 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoRespVO.java @@ -0,0 +1,53 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 拼团信息 Response VO") +@Data +@ToString(callSuper = true) +public class TeamworkInfoRespVO{ + + @Schema(description = "拼团id", required = true, example = "7641") + private Long id; + + @Schema(description = "拼团活动id", required = true, example = "23010") + private Long campaignId; + + @Schema(description = "拼团活动明细id", required = true, example = "23010") + private Long campaignDetailId; + + @Schema(description = "活动名称", required = true, example = "23010") + private String name; + + @Schema(description = "商品名称", required = true, example = "23010") + private String productName; + + @Schema(description = "规格名称", required = true, example = "23010") + private String sku; + + @Schema(description = "图片", required = true, example = "23010") + private String image; + + @Schema(description = "参团人数", required = true) + private Integer joinNumber; + + @Schema(description = "成团人数", required = true) + private Integer person; + + @Schema(description = "成团状态 0-拼团中 1-拼团成功 2-拼团失败", required = true) + private Integer state; + + @Schema(description = "团长", required = true) + private String regimentalCommander; + + @Schema(description = "团长id", required = true) + private Long regimentalCommanderId; + + @Schema(description = "开团时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoUpdateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoUpdateReqVO.java new file mode 100644 index 0000000..9cc3d83 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkInfoUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 拼团信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TeamworkInfoUpdateReqVO extends TeamworkInfoBaseVO { + + @Schema(description = "拼团id", required = true, example = "7641") + @NotNull(message = "拼团id不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoPageReqVO.java new file mode 100644 index 0000000..1e73195 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoPageReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 拼团订单信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TeamworkOrderInfoPageReqVO extends PageParam { + + @Schema(description = "拼团id", required = true, example = "7641") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoRespVO.java new file mode 100644 index 0000000..b24aafe --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/teamworkinfo/vo/TeamworkOrderInfoRespVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 拼团订单信息 Response VO") +@Data +@ToString(callSuper = true) +public class TeamworkOrderInfoRespVO { + + @Schema(description = "用户昵称", required = true, example = "7641") + private String nickname; + + @Schema(description = "用户头像", required = true, example = "7641") + private String avatar; + + @Schema(description = "订单编号", required = true, example = "7641") + private String orderId; + + @Schema(description = "金额", required = true, example = "7641") + private BigDecimal price; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/AppCampaignController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/AppCampaignController.java new file mode 100644 index 0000000..9786d13 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/AppCampaignController.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.product.controller.app.campaigninfo; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.CampaignInfoRespVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductReqVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductRespVO; +import co.yixiang.yshop.module.product.service.campaigninfo.AppCampaignInfoService; +import co.yixiang.yshop.module.product.service.campaigninfo.CampaignInfoService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 APP - 营销活动") +@RestController +@RequestMapping("/product/campaign") +@Validated +public class AppCampaignController { + + @Resource + private AppCampaignInfoService appCampaignInfoService; + + @Resource + private CampaignInfoService campaignInfoService; + + + @PostMapping("/product-page") + @Operation(summary = "获得营销活动商品列表") + public CommonResult> getCampaignProductPage(@RequestBody CampaignProductReqVO reqVO) { + return success(appCampaignInfoService.getCampaignProductPage(reqVO)); + } + + @GetMapping("/get") + @Operation(summary = "获得活动信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getCampaignInfo(@RequestParam("id") Long id) { + return success(campaignInfoService.getCampaignInfo(id)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/AppCampaignSkuRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/AppCampaignSkuRespVO.java new file mode 100644 index 0000000..5c6a6fa --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/AppCampaignSkuRespVO.java @@ -0,0 +1,65 @@ +package co.yixiang.yshop.module.product.controller.app.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "用户 APP - 营销活动规格明细 Response VO") +@Data +@ToString(callSuper = true) +public class AppCampaignSkuRespVO { + + @Schema(description = "活动id", required = true, example = "1690") + private Long id; + + @Schema(description = "活动明细", required = true, example = "9358") + private Long detailId; + + @Schema(description = "商品id", required = true, example = "1690") + private Long productId; + + @Schema(description = "规格id", required = true, example = "9358") + private Long skuId; + + @Schema(description = "sku", required = true, example = "9358") + private String sku; + + @Schema(description = "规格唯一值") + private String productAttrUnique; + + @Schema(description = "活动状态", required = true, example = "9358") + private Integer state; + + @Schema(description = "开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + private LocalDateTime endTime; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", required = true) + private Integer type; + + @Schema(description = "图片", required = true, example = "9358") + private String image; + + @Schema(description = "活动原价", required = true, example = "25390") + private BigDecimal campaignOriginalPrice; + + @Schema(description = "活动价格", required = true, example = "25390") + private BigDecimal price; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + private Integer stock; + + @Schema(description = "活动总库存数量", required = true) + private Integer total; + + @Schema(description = "成团人数", required = true) + private Integer person; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignNumberJudgeVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignNumberJudgeVO.java new file mode 100644 index 0000000..4cc0ac4 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignNumberJudgeVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.product.controller.app.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "用户 APP -营销活动数量校验 VO") +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString(callSuper = true) +public class CampaignNumberJudgeVO { + + @Schema(description = "规格唯一值") + private String productAttrUnique; + + @Schema(description = "用户id") + private Long uid; + + @Schema(description = "购买数量") + private Integer number; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductReqVO.java new file mode 100644 index 0000000..27df80c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductReqVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.product.controller.app.campaigninfo.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "用户 APP -营销活动商品列表 Request VO") +@Data +@ToString(callSuper = true) +public class CampaignProductReqVO extends PageParam { + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣") + @NotNull(message = "活动类型不能为空") + private Integer type; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "营销活动id") + private List ids; + + @Schema(description = "场次开始时间") + private LocalDateTime startTime; + + @Schema(description = "场次结束时间") + private LocalDateTime endTime; + + @Schema(description = "是否分页:1、分页,2、不分页") + private Integer isPage; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductRespVO.java new file mode 100644 index 0000000..111ff76 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignProductRespVO.java @@ -0,0 +1,44 @@ +package co.yixiang.yshop.module.product.controller.app.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.List; + +@Schema(description = "用户 APP -营销活动商品列表 Response VO") +@Data +@ToString(callSuper = true) +public class CampaignProductRespVO { + + @Schema(description = "规格id") + private Long skuId; + + @Schema(description = "商品id") + private Long id; + + @Schema(description = "规格名") + private String sku; + + @Schema(description = "商品名称") + private String storeName; + + @Schema(description = "原价") + private BigDecimal originalPrice; + + @Schema(description = "当前价") + private BigDecimal price; + + @Schema(description = "剩余活动库存") + private Integer stock; + + @Schema(description = "活动总库存") + private Integer total; + + @Schema(description = "图片") + private String image; + + @Schema(description = "成团人数") + private Integer person; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignSkuVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignSkuVO.java new file mode 100644 index 0000000..cfab58c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/campaigninfo/vo/CampaignSkuVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.product.controller.app.campaigninfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "用户 APP -营销活动规格价格列表 VO") +@Data +@ToString(callSuper = true) +public class CampaignSkuVO { + + @Schema(description = "规格唯一值") + private String productAttrUnique; + + @Schema(description = "当前价") + private BigDecimal price; + + @Schema(description = "活动剩余库存") + private Integer stock; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/cart/vo/AppStoreCartQueryVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/cart/vo/AppStoreCartQueryVo.java index 22bcbab..980c49f 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/cart/vo/AppStoreCartQueryVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/cart/vo/AppStoreCartQueryVo.java @@ -75,4 +75,16 @@ public class AppStoreCartQueryVo implements Serializable { @Schema(description = "运费金额", required = true) private BigDecimal postagePrice; + @Schema(description = "订单详情售后状态:1、正常,2、售后中,3、售后完成", required = true) + private Integer orderDetailState; + + @Schema(description = "积分抵扣金额") + private BigDecimal integralDeductionAmount; + + @Schema(description = "使用积分") + private BigDecimal useIntegral; + + @Schema(description = "实际支付金额") + private BigDecimal payPrice; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java index 05c1449..a3ee669 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java @@ -1,8 +1,13 @@ package co.yixiang.yshop.module.product.controller.app.coupon; import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.CanvasProductCouponPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.CanvasProductCouponRespVO; import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; import co.yixiang.yshop.module.product.service.productcoupon.AppCouponService; +import co.yixiang.yshop.module.product.service.productcoupon.ProductCouponService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -10,6 +15,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.List; @@ -24,12 +30,22 @@ public class AppCouponController { @Resource private AppCouponService appCouponService; + @Resource + private ProductCouponService couponService; + @GetMapping("/receive-list/{productId}") @Operation(summary = "查询商品可领优惠券") @Parameter(name = "productId", description = "商品id", required = true, example = "1") public CommonResult> receiveList(@PathVariable Long productId) { - return success(appCouponService.receiveList(productId)); + return success(appCouponService.receiveList(productId, SecurityFrameworkUtils.getLoginUserId())); } - + + @GetMapping("/canvas-list") + @Operation(summary = "查询画布商品优惠券") + public CommonResult> getCanvasProductPage( + @Valid CanvasProductCouponPageReqVO pageReqVO) { + return success(couponService.getCanvasProductPage(pageReqVO)); + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java index 4952b43..47f42f5 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.product.controller.app.couponrelation; import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; import io.swagger.v3.oas.annotations.Operation; @@ -14,6 +15,7 @@ import javax.annotation.Resource; import java.util.List; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "用户 APP - 商品优惠券关联") @RestController @@ -28,14 +30,16 @@ public class AppCouponRelationController { @GetMapping("/receive/{id}") @Operation(summary = "领取优惠券") @Parameter(name = "id", description = "优惠券id", required = true, example = "1") + @PreAuthenticated public CommonResult receiveCoupon(@PathVariable Long id) { - appCouponRecordService.receiveCoupon(id); + appCouponRecordService.receiveCoupon(id,getLoginUserId()); return success(true); } @GetMapping("/searchUserCoupon/{type}") @Operation(summary = "查询优惠券") @Parameter(name = "type", description = "查询类型:1、可使用,2、已使用,3、已失效", required = true, example = "1") + @PreAuthenticated public CommonResult> searchUserCoupon(@PathVariable Integer type) { return success(appCouponRecordService.searchUserCoupon(type, null)); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java index 41a3cdc..20da0ac 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java @@ -11,10 +11,16 @@ package co.yixiang.yshop.module.product.controller.app.product; import cn.hutool.core.util.ObjectUtil; import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.CanvasProductPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.StoreProductRespVO; import co.yixiang.yshop.module.product.controller.app.product.param.AppStoreProductQueryParam; import co.yixiang.yshop.module.product.controller.app.product.vo.*; +import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; +import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.enums.product.ProductEnum; import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; +import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; import co.yixiang.yshop.module.product.service.storeproductreply.AppStoreProductReplyService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; @@ -24,8 +30,10 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; import java.util.Set; @@ -49,6 +57,7 @@ public class AppStoreProductController { private final AppStoreProductService storeProductService; private final AppStoreProductReplyService appStoreProductReplyService; + private final StoreProductService adminProductService; /** @@ -89,16 +98,16 @@ public class AppStoreProductController { /** * 普通商品详情 */ - @GetMapping("/detail/{id}") + @GetMapping("/detail") @Operation(summary = "普通商品详情") @Parameter(name = "id", description = "商品ID", required = true, example = "1024") - public CommonResult detail(@PathVariable long id) { + public CommonResult detail(@Valid AppStoreProductDetailReqVo vo) { long uid = 0; System.out.println("uid:" + getLoginUserId()); if (ObjectUtil.isNotNull(getLoginUserId())) { uid = getLoginUserId(); } - AppProductVo productVo = storeProductService.goodsDetail(id, uid); + AppProductVo productVo = storeProductService.goodsDetail(vo, uid); return success(productVo); } @@ -172,5 +181,12 @@ public class AppStoreProductController { return success(storeProductService.searchPopular(start, end)); } + @GetMapping("/canvas/page") + @Operation(summary = "获得画布商品分页") + public CommonResult> getCanvasProductPage(@Valid CanvasProductPageReqVO pageVO) { + return success(adminProductService.getCanvasProductPage(pageVO)); + } + + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/param/AppStoreProductQueryParam.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/param/AppStoreProductQueryParam.java index 6966efc..c47f67a 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/param/AppStoreProductQueryParam.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/param/AppStoreProductQueryParam.java @@ -39,4 +39,7 @@ public class AppStoreProductQueryParam extends QueryParam { @Schema(description = "优惠券id", required = true) private Long couponId; + + @Schema(description = "是否分销:0-否,1-是", required = true) + private Integer isDistribution; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java index d7f7077..df21201 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java @@ -31,7 +31,7 @@ public class AppProductVo { private List productAttr = new ArrayList<>(); @Schema(description = "属性集合", requiredMode = Schema.RequiredMode.REQUIRED) - private Map productValue = new LinkedHashMap<>(); + private Map productValue = new LinkedHashMap<>(); @Schema(description = "评论信息", requiredMode = Schema.RequiredMode.REQUIRED) private AppStoreProductReplyQueryVo reply; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrQueryVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrQueryVo.java index b07e677..bd48fd8 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrQueryVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrQueryVo.java @@ -1,6 +1,6 @@ package co.yixiang.yshop.module.product.controller.app.product.vo; -import co.yixiang.yshop.module.product.service.storeproduct.dto.AttrValueDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.AttrValueDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -33,7 +33,7 @@ public class AppStoreProductAttrQueryVo implements Serializable { private String attrValues; @Schema(description = "属性值集合", required = true) - private List attrValue; + private List attrValue; @Schema(description = "属性列表", required = true) private List attrValueArr; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrValueVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrValueVo.java new file mode 100644 index 0000000..7e8d0d3 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductAttrValueVo.java @@ -0,0 +1,153 @@ +package co.yixiang.yshop.module.product.controller.app.product.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + *

+ * 商品属性表 查询结果值对象 + *

+ * + * @author moxiangrong + * @date 2024-01-23 + */ +@Data +@Schema(description = "用户 APP - 商品属性值表vo") +public class AppStoreProductAttrValueVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId + private Long id; + /** + * 商品ID + */ + private Long productId; + /** + * 商品属性索引值 (attr_value|attr_value[|....]) + */ + private String sku; + /** + * 属性对应的库存 + */ + private Integer stock; + /** + * 销量 + */ + private Integer sales; + /** + * 属性金额 + */ + private BigDecimal price; + /** + * 图片 + */ + private String image; + /** + * 唯一值 + */ + @TableField(value = "`unique`") + private String unique; + /** + * 成本价 + */ + private BigDecimal cost; + /** + * 商品条码 + */ + private String barCode; + /** + * 原价 + */ + private BigDecimal otPrice; + /** + * 重量 + */ + private BigDecimal weight; + /** + * 体积 + */ + private BigDecimal volume; + /** + * 一级返佣 + */ + private BigDecimal brokerage; + /** + * 二级返佣 + */ + private BigDecimal brokerageTwo; + /** + * 拼团价 + */ + private BigDecimal pinkPrice; + /** + * 拼团库存 + */ + private Integer pinkStock; + /** + * 秒杀价 + */ + private BigDecimal seckillPrice; + /** + * 秒杀库存 + */ + private Integer seckillStock; + /** + * 需要多少积分兑换 + */ + private Integer integral; + + + /* 分销商相关 */ + /** + * 一级佣金比例 + */ + private Integer firstWages; + /** + * 二级佣金比例 + */ + private Integer secondWages; + + @Schema(description = "活动id", required = true) + private Long campaignId; + + @Schema(description = "活动明细id", required = true) + private Long campaignDetailId; + + @Schema(description = "活动类型:1、拼团,2、秒杀,3、限时折扣", required = true) + private Integer campaignType; + + @Schema(description = "活动状态:0-未开始 1-进行中 2-已结束 3-预热", required = true) + private Integer campaignState; + + @Schema(description = "开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + private LocalDateTime endTime; + + + @Schema(description = "活动价格", required = true, example = "25390") + private BigDecimal campaignPrice; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + private Integer campaignStock; + + @Schema(description = "活动总库存数量", required = true) + private Integer campaignTotal; + + @Schema(description = "成团人数", required = true) + private Integer person; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductDetailReqVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductDetailReqVo.java new file mode 100644 index 0000000..1f6f42f --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductDetailReqVo.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.product.controller.app.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +/** + *

+ * 商品详情查询 + *

+ * + * @author moxiangrong + * @date 2024-01-23 + */ +@Data +@Schema(description = "用户 APP - 商品详情查询vo") +public class AppStoreProductDetailReqVo { + + @Schema(description = "商品ID", required = true) + private Long productId; + + @Schema(description = "规格id", required = true) + private Long skuId; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java index 9daac24..50996ea 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java @@ -88,5 +88,33 @@ public class AppStoreProductRespVo implements Serializable { @Schema(description = "新品(0:默认,1:新品)",required = true) private Integer isNew; + @Schema(description = "规格id",required = true) + private Long skuId; + @Schema(description = "规格唯一值") + private String productAttrUnique; + + @Schema(description = "活动类型", required = true) + private Integer campaignType; + + @Schema(description = "活动状态:0-未开始 1-进行中 2-已结束 3-预热", required = true) + private Integer campaignState; + + @Schema(description = "活动价格", required = true) + private BigDecimal campaignOriginalPrice; + + @Schema(description = "活动价格", required = true) + private BigDecimal campaignPrice; + + @Schema(description = "折扣比例", required = true, example = "6397") + private BigDecimal discount; + + @Schema(description = "活动库存剩余数量", required = true) + private Integer campaignStock; + + @Schema(description = "活动总库存数量", required = true) + private Integer campaignTotal; + + @Schema(description = "成团人数", required = true) + private Integer person; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/AppTeamworkController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/AppTeamworkController.java new file mode 100644 index 0000000..e58bae9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/AppTeamworkController.java @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + * 注意: + * 本软件为www.yixiang.co开发研制,未经购买不得使用 + * 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台) + * 一经发现盗用、分享等行为,将追究法律责任,后果自负 + */ +package co.yixiang.yshop.module.product.controller.app.teamworkinfo; + + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.TeamworkOrderInfoPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.TeamworkOrderInfoRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppTeamworkProductDetailRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkReqVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkUserRespVO; +import co.yixiang.yshop.module.product.service.teamworkinfo.TeamworkInfoService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +/** + *

+ * 拼团 + *

+ * + * @author hupeng + * @since 2024-01-26 + */ +@Slf4j +@RestController +@Tag(name = "用户 APP - 拼团") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/teamwork") +public class AppTeamworkController { + + + @Resource + private TeamworkInfoService teamworkInfoService; + + @GetMapping("/wait-list") + @Operation(summary = "获得可成团拼团列表") + public CommonResult> getWaitTeamworkList(@Valid AppWaitTeamworkReqVO pageVO) { + return success(teamworkInfoService.getWaitTeamworkList(pageVO)); + } + + @GetMapping("/user-list") + @Operation(summary = "获得拼团用户列表") + public CommonResult> getUserTeamworkList(@RequestParam Long id) { + return success(teamworkInfoService.getUserTeamworkList(id)); + } + + @GetMapping("/product-detail") + @Operation(summary = "获得拼团商品详情") + public CommonResult getProductDetail(@RequestParam Long id) { + return success(teamworkInfoService.getProductDetail(id)); + } + +} + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppTeamworkProductDetailRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppTeamworkProductDetailRespVO.java new file mode 100644 index 0000000..6209df9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppTeamworkProductDetailRespVO.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "用户 APP - 拼团商品详情 Response VO") +@Data +@ToString(callSuper = true) +public class AppTeamworkProductDetailRespVO { + + @Schema(description = "商品id", required = true) + private Long id; + + @Schema(description = "规格id", required = true) + private Long skuId; + + @Schema(description = "规格唯一值", required = true) + private String skuUnique; + + @Schema(description = "商品名称", required = true) + private String storeName; + + @Schema(description = "图片", required = true) + private String image; + + @Schema(description = "价格", required = true) + private BigDecimal price; + + @Schema(description = "规格", required = true) + private String sku; + + @Schema(description = "成团人数", required = true) + private Integer person; + + @Schema(description = "状态", required = true) + private Integer state; + + @Schema(description = "结束时间", required = true) + private LocalDateTime closeTime; + + @Schema(description = "拼团用户信息", required = true) + private List users; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkReqVO.java new file mode 100644 index 0000000..589e8e6 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkReqVO.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "用户 APP - 待成团列表 Request VO") +@Data +@ToString(callSuper = true) +public class AppWaitTeamworkReqVO{ + + @Schema(description = "规格id", required = true) + private Long skuId; + + @Schema(description = "拼团明细id", required = true) + private Long campaignDetailId; + + @Schema(description = "拼团id", required = true) + private Long campaignId; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkRespVO.java new file mode 100644 index 0000000..c2b7819 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkRespVO.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; +import java.time.LocalDateTime; + +@Schema(description = "用户 APP - 待成团列表 Response VO") +@Data +@ToString(callSuper = true) +public class AppWaitTeamworkRespVO { + + @Schema(description = "待成团id", required = true, example = "7641") + private Long id; + + @Schema(description = "规格id", required = true, example = "7641") + private Long skuId; + + @Schema(description = "成团人数", required = true, example = "7641") + private Integer total; + + @Schema(description = "当前人数", required = true, example = "7641") + private Integer current; + + @Schema(description = "创建时间", required = true, example = "7641") + private LocalDateTime createTime; + + @Schema(description = "成团有效期", required = true, example = "7641") + private Integer effectiveTime; + + @Schema(description = "成团结束时间", required = true, example = "7641") + private LocalDateTime closeTime; + + @Schema(description = "团长信息", required = true, example = "7641") + private AppWaitTeamworkUserRespVO user; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkUserRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkUserRespVO.java new file mode 100644 index 0000000..abd25c9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/teamworkinfo/vo/AppWaitTeamworkUserRespVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Schema(description = "用户 APP - 待成团用户列表 Response VO") +@Data +@ToString(callSuper = true) +public class AppWaitTeamworkUserRespVO { + + @Schema(description = "拼团id", required = true, example = "7641") + private Long id; + + @Schema(description = "用户id", required = true, example = "7641") + private Long uid; + + @Schema(description = "用户昵称", required = true, example = "7641") + private String nickname; + + @Schema(description = "用户头像", required = true, example = "7641") + private String avatar; + + @Schema(description = "是否是团长", required = true, example = "7641") + private String isHead; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigndetail/CampaignDetailConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigndetail/CampaignDetailConvert.java new file mode 100644 index 0000000..cbf6994 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigndetail/CampaignDetailConvert.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.product.convert.campaigndetail; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.campaigndetail.CampaignDetailDO; + +/** + * 营销活动明细 Convert + * + * @author moxiangrong + */ +@Mapper +public interface CampaignDetailConvert { + + CampaignDetailConvert INSTANCE = Mappers.getMapper(CampaignDetailConvert.class); + + CampaignDetailDO convert(CampaignDetailCreateReqVO bean); + + List convertDetails(List list); + + CampaignDetailDO convert(CampaignDetailUpdateReqVO bean); + + CampaignDetailRespVO convert(CampaignDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigninfo/CampaignInfoConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigninfo/CampaignInfoConvert.java new file mode 100644 index 0000000..2b29441 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/campaigninfo/CampaignInfoConvert.java @@ -0,0 +1,45 @@ +package co.yixiang.yshop.module.product.convert.campaigninfo; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignSkuDetailRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; + +/** + * 活动信息 Convert + * + * @author moxiangrong + */ +@Mapper +public interface CampaignInfoConvert { + + CampaignInfoConvert INSTANCE = Mappers.getMapper(CampaignInfoConvert.class); + + CampaignInfoDO convert(CampaignInfoCreateReqVO bean); + + CampaignInfoDO convert(CampaignInfoUpdateReqVO bean); + + CampaignInfoRespVO convert(CampaignInfoDO bean); + + @Mapping(target = "image", source = "productImage") + @Mapping(target = "id", source = "productId") + @Mapping(target = "storeName", source = "productName") + @Mapping(target = "originalPrice", source = "productPrice") + CampaignDetailRespVO convert(CampaignSkuDetailRespVO vo); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + PageResult convertCanvasPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/category/ProductCategoryConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/category/ProductCategoryConvert.java index d3f5f47..04f0db9 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/category/ProductCategoryConvert.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/category/ProductCategoryConvert.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.product.convert.category; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryRespVO; +import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryTreeRespVO; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; import co.yixiang.yshop.module.product.controller.app.category.vo.AppCategoryRespVO; import co.yixiang.yshop.module.product.dal.dataobject.category.ProductCategoryDO; @@ -28,5 +29,7 @@ public interface ProductCategoryConvert { List convertList(List list); + List convertTreeList(List list); + List convertList03(List list); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproduct/StoreProductConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproduct/StoreProductConvert.java index e67d58b..3c57962 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproduct/StoreProductConvert.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproduct/StoreProductConvert.java @@ -32,6 +32,8 @@ public interface StoreProductConvert { PageResult convertPage(PageResult page); + PageResult campaignConvertPage(PageResult page); + List convertList02(List list); List convertList03(List list); diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductattrvalue/StoreProductAttrValueConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductattrvalue/StoreProductAttrValueConvert.java index dca4d51..31735d9 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductattrvalue/StoreProductAttrValueConvert.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductattrvalue/StoreProductAttrValueConvert.java @@ -1,8 +1,13 @@ package co.yixiang.yshop.module.product.convert.storeproductattrvalue; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.CampaignSkuRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; +import java.util.List; + /** * 商品属性值 Convert * @@ -12,6 +17,10 @@ import org.mapstruct.factory.Mappers; public interface StoreProductAttrValueConvert { StoreProductAttrValueConvert INSTANCE = Mappers.getMapper(StoreProductAttrValueConvert.class); - + @Mapping(target = "skuId", source = "id") + List convertList(List list); + + @Mapping(source = "id", target = "skuId") + CampaignSkuRespVO convert(StoreProductAttrValueDO valueDO); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java index 6e4efbb..e6a664c 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.product.convert.storeproductcoupon; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.CanvasProductCouponRespVO; import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; @@ -31,6 +32,8 @@ public interface StoreProductCouponConvert { PageResult convertPage(PageResult page); + PageResult convertCanvasPage(PageResult page); + List convertList(List page); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/teamworkinfo/TeamworkInfoConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/teamworkinfo/TeamworkInfoConvert.java new file mode 100644 index 0000000..b01907d --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/teamworkinfo/TeamworkInfoConvert.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.product.convert.teamworkinfo; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.teamworkinfo.TeamworkInfoDO; + +/** + * 拼团信息 Convert + * + * @author moxiangrong + */ +@Mapper +public interface TeamworkInfoConvert { + + TeamworkInfoConvert INSTANCE = Mappers.getMapper(TeamworkInfoConvert.class); + + TeamworkInfoDO convert(TeamworkInfoCreateReqVO bean); + + TeamworkInfoDO convert(TeamworkInfoUpdateReqVO bean); + + TeamworkInfoRespVO convert(TeamworkInfoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigndetail/CampaignDetailDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigndetail/CampaignDetailDO.java new file mode 100644 index 0000000..7ac910b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigndetail/CampaignDetailDO.java @@ -0,0 +1,57 @@ +package co.yixiang.yshop.module.product.dal.dataobject.campaigndetail; + +import lombok.*; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 营销活动明细 DO + * + * @author moxiangrong + */ +@TableName("yshop_campaign_detail") +@KeySequence("yshop_campaign_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CampaignDetailDO extends BaseDO { + + /** + * 营销活动明细id + */ + @TableId + private Long id; + /** + * 营销活动id + */ + private Long campaignId; + /** + * 商品id + */ + private Long productId; + /** + * 规格id + */ + private Long skuId; + /** + * 活动价格 + */ + private BigDecimal price; + /** + * 折扣比例 + */ + private BigDecimal discount; + /** + * 活动库存剩余数量 + */ + private Integer stock; + /** + * 活动库存总数量 + */ + private Integer total; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigninfo/CampaignInfoDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigninfo/CampaignInfoDO.java new file mode 100644 index 0000000..62e5f19 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/campaigninfo/CampaignInfoDO.java @@ -0,0 +1,84 @@ +package co.yixiang.yshop.module.product.dal.dataobject.campaigninfo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 活动信息 DO + * + * @author moxiangrong + */ +@TableName("yshop_campaign_info") +@KeySequence("yshop_campaign_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CampaignInfoDO extends BaseDO { + + /** + * 营销活动id + */ + @TableId + private Long id; + /** + * 活动名称 + */ + private String name; + /** + * 活动类型:1、拼团,2、秒杀,3、限时折扣 + */ + private Integer type; + /** + * 备注 + */ + private String remark; + /** + * 活动开始时间 + */ + private LocalDateTime startTime; + /** + * 活动结束时间 + */ + private LocalDateTime endTime; + /** + * 商品限购 1-不限购 2-限购 + */ + private Integer ifLimit; + /** + * 限购几件/人 + */ + private Integer limitNumber; + /** + * 活动预热 1-停用 2-启用 + */ + private Integer ifEnable; + /** + * 预热几分钟前 + */ + private Integer enableTime; + /** + * 活动状态 0-未开始 1-进行中 2-已结束 + */ + private Integer state; + /** + * 成团人数 + */ + private Integer person; + /** + * 成团有效时间几(分钟) + */ + private Integer effectiveTime; + /** + * 是否虚拟成团:0-否,1-是 + */ + private Integer isVirtually; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java index 541bb6f..2ebfa91 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java @@ -181,4 +181,25 @@ public class StoreProductDO extends BaseDO { */ private Integer integral; + /* 分销商相关 */ + /** + * 是否分销:0-否,1-是 + */ + private Integer isDistribution; + + // 分销规则 0-默认 1-自定义 + private Integer distributionRule; + + // 分销规则 1-一级 2-二级 + private Integer distributionLevel; + + // 分销自购 0-关闭 1-开启 + private Integer distributionPurchase; + + // 商品结算方式 0-实际支付价格 1-商品价格 + private Integer distributionProductSettlement; + + // 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + private Integer distributionWagesSettlement; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproductattrvalue/StoreProductAttrValueDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproductattrvalue/StoreProductAttrValueDO.java index de78b57..5c26f28 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproductattrvalue/StoreProductAttrValueDO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproductattrvalue/StoreProductAttrValueDO.java @@ -1,18 +1,10 @@ package co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue; import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; + +import java.io.Serializable; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.*; -import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; /** * 商品属性值 DO @@ -26,7 +18,7 @@ import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; @Builder @NoArgsConstructor @AllArgsConstructor -public class StoreProductAttrValueDO { +public class StoreProductAttrValueDO implements Serializable { /** * id @@ -111,4 +103,14 @@ public class StoreProductAttrValueDO { */ private Integer integral; + + /* 分销商相关 */ + /** + * 一级佣金比例 + */ + private Integer firstWages; + /** + * 二级佣金比例 + */ + private Integer secondWages; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/teamworkinfo/TeamworkInfoDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/teamworkinfo/TeamworkInfoDO.java new file mode 100644 index 0000000..5cac9d9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/teamworkinfo/TeamworkInfoDO.java @@ -0,0 +1,53 @@ +package co.yixiang.yshop.module.product.dal.dataobject.teamworkinfo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 拼团信息 DO + * + * @author moxiangrong + */ +@TableName("yshop_teamwork_info") +@KeySequence("yshop_teamwork_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TeamworkInfoDO extends BaseDO { + + /** + * 拼团id + */ + @TableId + private Long id; + /** + * 拼团活动id + */ + private Long campaignId; + /** + * 拼团活动明细id + */ + private Long campaignDetailId; + /** + * 参团人数 + */ + private Integer people; + /** + * 成团状态 0-拼团中 1-拼团成功 2-拼团失败 + */ + private Integer state; + + /** + * 团长id + */ + private Long regimentalCommanderId; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigndetail/CampaignDetailMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigndetail/CampaignDetailMapper.java new file mode 100644 index 0000000..c2db70e --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigndetail/CampaignDetailMapper.java @@ -0,0 +1,60 @@ +package co.yixiang.yshop.module.product.dal.mysql.campaigndetail; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.CampaignDataDetailPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.CampaignDataDetailRespVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.AppCampaignSkuRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.campaigndetail.CampaignDetailDO; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 营销活动明细 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface CampaignDetailMapper extends BaseMapperX { + + default PageResult selectPage(CampaignDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CampaignDetailDO::getCampaignId, reqVO.getCampaignId()) + .eqIfPresent(CampaignDetailDO::getProductId, reqVO.getProductId()) + .eqIfPresent(CampaignDetailDO::getSkuId, reqVO.getSkuId()) + .eqIfPresent(CampaignDetailDO::getPrice, reqVO.getPrice()) + .eqIfPresent(CampaignDetailDO::getDiscount, reqVO.getDiscount()) + .eqIfPresent(CampaignDetailDO::getStock, reqVO.getStock()) + .eqIfPresent(CampaignDetailDO::getTotal, reqVO.getTotal()) + .betweenIfPresent(CampaignDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CampaignDetailDO::getId)); + } + + List getCampaignDataDetail(Page page, + @Param("pageReqVO") CampaignDataDetailPageReqVO pageReqVO); + + default List selectList(CampaignDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CampaignDetailDO::getCampaignId, reqVO.getCampaignId()) + .eqIfPresent(CampaignDetailDO::getProductId, reqVO.getProductId()) + .eqIfPresent(CampaignDetailDO::getSkuId, reqVO.getSkuId()) + .eqIfPresent(CampaignDetailDO::getPrice, reqVO.getPrice()) + .eqIfPresent(CampaignDetailDO::getDiscount, reqVO.getDiscount()) + .eqIfPresent(CampaignDetailDO::getStock, reqVO.getStock()) + .eqIfPresent(CampaignDetailDO::getTotal, reqVO.getTotal()) + .betweenIfPresent(CampaignDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CampaignDetailDO::getId)); + } + + List getCampaignDetails(@Param("campaignId") Long campaignId); + + void deleteCampaignDetails(@Param("campaignId") Long campaignId); + + List getCampaignSkus(@Param("productIds") List productIds); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigninfo/CampaignInfoMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigninfo/CampaignInfoMapper.java new file mode 100644 index 0000000..34f0136 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/campaigninfo/CampaignInfoMapper.java @@ -0,0 +1,81 @@ +package co.yixiang.yshop.module.product.dal.mysql.campaigninfo; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.param.CampaignJudgmentParam; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignNumberJudgeVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductReqVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductRespVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignSkuVO; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; +import co.yixiang.yshop.module.product.enums.campaign.CampaignStateEnum; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 活动信息 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface CampaignInfoMapper extends BaseMapperX { + + List checkRepeat(CampaignJudgmentParam param); + + default PageResult selectPage(CampaignInfoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(CampaignInfoDO::getName, reqVO.getName()) + .eqIfPresent(CampaignInfoDO::getType, reqVO.getType()) + .eqIfPresent(CampaignInfoDO::getState, reqVO.getState()) + .betweenIfPresent(CampaignInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CampaignInfoDO::getId)); + } + + default PageResult getCanvasCampaignPage(CanvasCampaignPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(CampaignInfoDO::getName, reqVO.getName()) + .eqIfPresent(CampaignInfoDO::getType, reqVO.getType()) + .in(CollectionUtils.isNotEmpty(reqVO.getIds()), CampaignInfoDO::getId, reqVO.getIds()) + .in(CampaignInfoDO::getState, Arrays.asList(CampaignStateEnum.PREHEAT.getValue(), + CampaignStateEnum.IN_PROGRESS.getValue())) + .orderByDesc(CampaignInfoDO::getId)); + } + + default List selectList(CampaignInfoExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(CampaignInfoDO::getName, reqVO.getName()) + .eqIfPresent(CampaignInfoDO::getType, reqVO.getType()) + .eqIfPresent(CampaignInfoDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(CampaignInfoDO::getStartTime, reqVO.getStartTime()) + .betweenIfPresent(CampaignInfoDO::getEndTime, reqVO.getEndTime()) + .eqIfPresent(CampaignInfoDO::getIfLimit, reqVO.getIfLimit()) + .eqIfPresent(CampaignInfoDO::getLimitNumber, reqVO.getLimitNumber()) + .eqIfPresent(CampaignInfoDO::getIfEnable, reqVO.getIfEnable()) + .eqIfPresent(CampaignInfoDO::getEnableTime, reqVO.getEnableTime()) + .eqIfPresent(CampaignInfoDO::getState, reqVO.getState()) + .eqIfPresent(CampaignInfoDO::getPerson, reqVO.getPerson()) + .eqIfPresent(CampaignInfoDO::getEffectiveTime, reqVO.getEffectiveTime()) + .betweenIfPresent(CampaignInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CampaignInfoDO::getId)); + } + + List getCampaignInfoList(@Param("campaignIds") List campaignIds); + + List getCampaignProductPage(Page page, @Param("reqVO") CampaignProductReqVO reqVO); + + List getCampaignsByProductAttrUniques(@Param("productAttrUniques") List productAttrUniques); + + Integer numberJudge(@Param("vo") CampaignNumberJudgeVO vo); + + Integer stockJudge(@Param("vo") CampaignNumberJudgeVO vo); + + void deStock(@Param("productAttrUnique") String productAttrUnique, @Param("number") Integer number); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java index 68c839f..5ad6deb 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java @@ -3,10 +3,16 @@ package co.yixiang.yshop.module.product.dal.mysql.productcoupon; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.CanvasProductCouponPageReqVO; import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import co.yixiang.yshop.module.product.enums.coupon.CouponExpirationEnum; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.Date; import java.util.List; /** @@ -32,6 +38,22 @@ public interface ProductCouponMapper extends BaseMapperX { } + default PageResult getCanvasProductPage(CanvasProductCouponPageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + LocalDateTime now = LocalDateTime.now(); + wrapper.likeIfPresent(ProductCouponDO::getCouponName, reqVO.getCouponName()) + .eqIfPresent(ProductCouponDO::getCouponType, reqVO.getCouponType()) + .and(i -> i.eq(ProductCouponDO::getExpirationType, CouponExpirationEnum.BY_DAY.getValue()) + .or(e -> e.lt(ProductCouponDO::getTakingEffectTime, now) + .gt(ProductCouponDO::getExpirationTime, now)) + ) + .in(CollectionUtils.isNotEmpty(reqVO.getIds()), ProductCouponDO::getId, reqVO.getIds()) + .gt(ProductCouponDO::getNumber, 0) + .orderByDesc(ProductCouponDO::getId); + return selectPage(reqVO, wrapper); + + } + List receiveList(@Param("productId") Long productId); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java index 7622d77..d7101d2 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java @@ -18,4 +18,6 @@ public interface ProductCouponRelationMapper extends BaseMapperX searchUserCoupon(@Param("type") Integer type, @Param("uid") Long uid, @Param("id") Long id); + Integer getCouponNumber(@Param("userId") Long userId); + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproduct/StoreProductMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproduct/StoreProductMapper.java index c50ce5d..e489817 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproduct/StoreProductMapper.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproduct/StoreProductMapper.java @@ -8,8 +8,11 @@ import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.product.api.product.dto.ProductDTO; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.enums.product.DefaultEnum; +import co.yixiang.yshop.module.product.enums.spu.ProductSpuStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.*; @@ -31,15 +34,47 @@ public interface StoreProductMapper extends BaseMapperX { .eqIfPresent(StoreProductDO::getIsPostage, reqVO.getIsPostage()) .orderByDesc(StoreProductDO::getId); - wrapper.eq(StoreProductDO::getIsShow,Convert.toInt(reqVO.getIsShow())); - if(DefaultEnum.DEFAULT_0.getValue().equals(Convert.toInt(reqVO.getStock()))){ - wrapper.eq(StoreProductDO::getStock,DefaultEnum.DEFAULT_0.getValue()); + wrapper.eq(StoreProductDO::getIsShow, Convert.toInt(reqVO.getIsShow())); + if (DefaultEnum.DEFAULT_0.getValue().equals(Convert.toInt(reqVO.getStock()))) { + wrapper.eq(StoreProductDO::getStock, DefaultEnum.DEFAULT_0.getValue()); } - if(CollUtil.isNotEmpty(reqVO.getCatIds())){ - wrapper.in(StoreProductDO::getCateId,reqVO.getCatIds()); + if (CollUtil.isNotEmpty(reqVO.getCatIds())) { + wrapper.in(StoreProductDO::getCateId, reqVO.getCatIds()); } + wrapper.eqIfPresent(StoreProductDO::getIsDistribution, reqVO.getIsDistribution()); + + return selectPage(reqVO, wrapper); + + } + + default PageResult getCanvasProductPage(CanvasProductPageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + + wrapper.likeIfPresent(StoreProductDO::getStoreName, reqVO.getStoreName()) + .orderByDesc(StoreProductDO::getId); + wrapper.eq(StoreProductDO::getIsShow, DefaultEnum.DEFAULT_1.getValue()); + + if (CollUtil.isNotEmpty(reqVO.getIds())) { + wrapper.in(StoreProductDO::getId, reqVO.getIds()); + } + if (CollUtil.isNotEmpty(reqVO.getCateIds())) { + wrapper.in(StoreProductDO::getCateId, reqVO.getCateIds()); + } + return selectPage(reqVO, wrapper); + + } + + default PageResult getCampaignProductPage(CampaignProductPageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + // 查询上架商品 + wrapper.eq(StoreProductDO::getIsShow, ProductSpuStatusEnum.ENABLE.getStatus()); + // 库存大于0 + wrapper.gt(StoreProductDO::getStock, DefaultEnum.DEFAULT_0.getValue()); + wrapper.likeIfPresent(StoreProductDO::getStoreName, reqVO.getStoreName()) + .eqIfPresent(StoreProductDO::getSpecType, reqVO.getSpecType()) + .orderByDesc(StoreProductDO::getId); return selectPage(reqVO, wrapper); } @@ -51,28 +86,49 @@ public interface StoreProductMapper extends BaseMapperX { .orderByDesc(StoreProductDO::getId)); } + default PageResult getProductPage(ProductPageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .eqIfPresent(StoreProductDO::getIsDistribution, pageReqVO.getIsDistribution()) + .orderByDesc(StoreProductDO::getCreateTime) + ); + } + @Update("update yshop_store_product set is_show = #{status} where id = #{id}") void updateOnsale(@Param("status") Integer status, @Param("id") Long id); /** * 正常商品库存 加库存 减销量 + * * @param num * @param productId * @return */ @Update("update yshop_store_product set stock=stock+#{num}, sales=sales-#{num}" + " where id=#{productId}") - int incStockDecSales(@Param("num") Integer num,@Param("productId") Long productId); + int incStockDecSales(@Param("num") Integer num, @Param("productId") Long productId); /** * 正常商品库存 减库存 加销量 + * * @param num * @param productId * @return */ @Update("update yshop_store_product set stock=stock-#{num}, sales=sales+#{num}" + " where id=#{productId} and stock >= #{num}") - int decStockIncSales(@Param("num") Integer num,@Param("productId") Long productId); + int decStockIncSales(@Param("num") Integer num, @Param("productId") Long productId); + + + /** + * 活动商品 加销量 + * + * @param num + * @param productId + * @return + */ + @Update("update yshop_store_product set sales=sales+#{num}" + + " where id=#{productId}") + int incSales(@Param("num") Integer num, @Param("productId") Long productId); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/teamworkinfo/TeamworkInfoMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/teamworkinfo/TeamworkInfoMapper.java new file mode 100644 index 0000000..05e0937 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/teamworkinfo/TeamworkInfoMapper.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.product.dal.mysql.teamworkinfo; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppTeamworkProductDetailRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkReqVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkUserRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.teamworkinfo.TeamworkInfoDO; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 拼团信息 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface TeamworkInfoMapper extends BaseMapperX { + + default PageResult selectPage(TeamworkInfoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(TeamworkInfoDO::getState, reqVO.getState()) + .orderByDesc(TeamworkInfoDO::getId)); + } + + List getTeamworkInfoPage(Page page, @Param("pageReqVO") TeamworkInfoPageReqVO pageReqVO); + + List getTeamworkOrderInfoPage(Page page, @Param("pageReqVO") TeamworkOrderInfoPageReqVO pageReqVO); + + List getNotTeamwork(@Param("campaignId") Long campaignId); + + void teamworkFail(@Param("campaignId") Long campaignId); + + List getWaitTeamworkList(@Param("vo") AppWaitTeamworkReqVO vo); + + List getWaitTeamworkHeadList(@Param("ids") List ids); + + List getWaitTeamworkUserList(@Param("id") Long id); + + AppTeamworkProductDetailRespVO getProductDetail(@Param("id") Long id); + + List joinJudge(@Param("uid") Long uid, @Param("teamworkId") Long teamworkId); + + List randomAvatar(@Param("userIds") List userIds, @Param("number") Integer number); + + Long getMember(@Param("userId") Long userId, @Param("id") Long id); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/mq/producer/PayRefundProducer.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/mq/producer/PayRefundProducer.java new file mode 100644 index 0000000..a5f9357 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/mq/producer/PayRefundProducer.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.product.mq.producer; + +import co.yixiang.yshop.framework.mq.core.RedisMQTemplate; +import co.yixiang.yshop.module.pay.mq.message.PayRefundMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Slf4j +@Component +public class PayRefundProducer { + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送退款消息 + * @param ids 退款订单id集合 + */ + public void sendPayRefundMessage(List ids) { + PayRefundMessage payRefundMessage = new PayRefundMessage().setIds(ids); + redisMQTemplate.send(payRefundMessage); + } +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailService.java new file mode 100644 index 0000000..6aaf36a --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailService.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.product.service.campaigndetail; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.campaigndetail.CampaignDetailDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 营销活动明细 Service 接口 + * + * @author moxiangrong + */ +public interface CampaignDetailService { + + /** + * 通过商品id集合获得营销活动明细列表 + * + * @param ids 商品id + * @return 营销活动明细列表 + */ + List getCampaignDetailListByProductIds(List ids); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailServiceImpl.java new file mode 100644 index 0000000..1f6076c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigndetail/CampaignDetailServiceImpl.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.product.service.campaigndetail; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import java.util.*; +import co.yixiang.yshop.module.product.dal.dataobject.campaigndetail.CampaignDetailDO; +import co.yixiang.yshop.module.product.dal.mysql.campaigndetail.CampaignDetailMapper; + + +/** + * 营销活动明细 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +public class CampaignDetailServiceImpl implements CampaignDetailService { + + @Resource + private CampaignDetailMapper campaignDetailMapper; + + @Override + public List getCampaignDetailListByProductIds(List ids) { + return campaignDetailMapper.selectList(new LambdaQueryWrapper() + .in(CampaignDetailDO::getProductId, ids)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoService.java new file mode 100644 index 0000000..365131b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoService.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.product.service.campaigninfo; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignNumberJudgeVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductReqVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductRespVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignSkuVO; + +import java.util.List; + +/** + * 活动信息 APP Service 接口 + * + * @author moxiangrong + */ +public interface AppCampaignInfoService { + + PageResult getCampaignProductPage(CampaignProductReqVO reqVO); + + List getCampaignsByProductAttrUniques(List productAttrUniques); + + /** + * 活动商品购买数量限制 + * @param vo + */ + void numberJudge(CampaignNumberJudgeVO vo); + + /** + * 减少活动库存 + * @param productAttrUnique + * @param number + */ + void deStock(String productAttrUnique, Integer number); + + /** + * 回退活动库存 + * @param productAttrUnique + * @param number + */ + void backStock(String productAttrUnique, Integer number); +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoServiceImpl.java new file mode 100644 index 0000000..1756900 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/AppCampaignInfoServiceImpl.java @@ -0,0 +1,70 @@ +package co.yixiang.yshop.module.product.service.campaigninfo; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignNumberJudgeVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductReqVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignProductRespVO; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.CampaignSkuVO; +import co.yixiang.yshop.module.product.dal.mysql.campaigninfo.CampaignInfoMapper; +import co.yixiang.yshop.module.product.enums.common.PageTypeEnum; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; +import java.util.List; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.CAMPAIGN_NUMBER_ERROR; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.CAMPAIGN_OUT_OF_STOCK_ERROR; + + +/** + * 活动信息 APP Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +@Slf4j +public class AppCampaignInfoServiceImpl implements AppCampaignInfoService { + + @Resource + private CampaignInfoMapper campaignInfoMapper; + + + @Override + public PageResult getCampaignProductPage(CampaignProductReqVO reqVO) { + // 判断是否分页 + if (PageTypeEnum.NOT_PAGE.getValue().equals(reqVO.getIsPage())) reqVO.setPageSize(Integer.MAX_VALUE); + Page page = new Page<>(reqVO.getPageNo(),reqVO.getPageSize()); + List list = campaignInfoMapper.getCampaignProductPage(page, reqVO); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List getCampaignsByProductAttrUniques(List productAttrUniques) { + return campaignInfoMapper.getCampaignsByProductAttrUniques(productAttrUniques); + } + + @Override + public void numberJudge(CampaignNumberJudgeVO vo) { + if(campaignInfoMapper.stockJudge(vo) < 0) throw exception(CAMPAIGN_OUT_OF_STOCK_ERROR); + Integer number = campaignInfoMapper.numberJudge(vo); + if(ObjectUtil.isNotNull(number) && number - vo.getNumber() < 0){ + throw exception(CAMPAIGN_NUMBER_ERROR); + } + } + + @Override + public void deStock(String productAttrUnique, Integer number) { + campaignInfoMapper.deStock(productAttrUnique, number); + } + + @Override + public void backStock(String productAttrUnique, Integer number) { + campaignInfoMapper.deStock(productAttrUnique, -number); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoService.java new file mode 100644 index 0000000..67859ad --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoService.java @@ -0,0 +1,107 @@ +package co.yixiang.yshop.module.product.service.campaigninfo; + +import java.util.*; +import javax.validation.*; + +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 活动信息 Service 接口 + * + * @author moxiangrong + */ +public interface CampaignInfoService { + + /** + * 创建活动信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCampaignInfo(@Valid CampaignInfoCreateReqVO createReqVO); + + /** + * 更新活动信息 + * + * @param updateReqVO 更新信息 + */ + void updateCampaignInfo(@Valid CampaignInfoUpdateReqVO updateReqVO); + + /** + * 删除活动信息 + * + * @param id 编号 + */ + void deleteCampaignInfo(Long id); + + /** + * 结束活动信息 + * + * @param id 编号 + */ + void closeCampaignInfo(Long id); + + /** + * 开始活动信息 + * + * @param id 编号 + */ + void startCampaignInfo(Long id); + + /** + * 获得活动信息 + * + * @param id 编号 + * @return 活动信息 + */ + CampaignInfoRespVO getCampaignInfo(Long id); + + + /** + * 获得活动信息分页 + * + * @param pageReqVO 分页查询 + * @return 活动信息分页 + */ + PageResult getCampaignInfoPage(CampaignInfoPageReqVO pageReqVO); + + /** + * 获得活动信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 活动信息列表 + */ + List getCampaignInfoList(CampaignInfoExportReqVO exportReqVO); + + /** + * 活动状态处理 + * @param id + */ + void campaignStateHandle(Long id); + + /** + * 获得活动数据 + * + * @param id 编号 + * @return 活动数据 + */ + CampaignDataRespVO getCampaignData(Long id); + + /** + * 获得活动数据明细 + * + * @param reqVO + * @return + */ + PageResult getCampaignDataDetail(CampaignDataDetailPageReqVO reqVO); + + /** + * 获得画布活动分页 + * + * @param pageReqVO 分页查询 + * @return 活动信息分页 + */ + PageResult getCanvasCampaignPage(CanvasCampaignPageReqVO pageReqVO); +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoServiceImpl.java new file mode 100644 index 0000000..f676eb9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/campaigninfo/CampaignInfoServiceImpl.java @@ -0,0 +1,594 @@ +package co.yixiang.yshop.module.product.service.campaigninfo; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.constant.ShopConstants; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.date.DateUtils; +import co.yixiang.yshop.framework.redis.util.RedissonUtil; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignDetailCreateReqVO; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.campaigndetail.vo.CampaignSkuDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.param.CampaignJudgmentParam; +import co.yixiang.yshop.module.product.controller.admin.campaigninfo.vo.*; +import co.yixiang.yshop.module.product.convert.campaigndetail.CampaignDetailConvert; +import co.yixiang.yshop.module.product.convert.campaigninfo.CampaignInfoConvert; +import co.yixiang.yshop.module.product.dal.dataobject.campaigndetail.CampaignDetailDO; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; +import co.yixiang.yshop.module.product.dal.mysql.campaigndetail.CampaignDetailMapper; +import co.yixiang.yshop.module.product.dal.mysql.campaigninfo.CampaignInfoMapper; +import co.yixiang.yshop.module.product.enums.common.PageTypeEnum; +import co.yixiang.yshop.module.product.enums.spu.ProductSpuStatusEnum; +import co.yixiang.yshop.module.product.mq.producer.PayRefundProducer; +import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; +import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; +import co.yixiang.yshop.module.product.service.teamworkinfo.TeamworkInfoService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.product.enums.campaign.CampaignCommonEnum.DEACTIVATE; +import static co.yixiang.yshop.module.product.enums.campaign.CampaignCommonEnum.ENABLE; +import static co.yixiang.yshop.module.product.enums.campaign.CampaignStateEnum.*; +import static co.yixiang.yshop.module.product.enums.campaign.CampaignTypeEnum.TEAMWORK; + +/** + * 活动信息 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +@Slf4j +public class CampaignInfoServiceImpl implements CampaignInfoService { + + @Resource + private CampaignInfoMapper campaignInfoMapper; + @Resource + private StoreProductAttrValueService productAttrValueService; + @Resource + private CampaignDetailMapper campaignDetailMapper; + @Resource + private StoreProductService productService; + + @Resource + private RedissonClient redissonClient; + + @Resource + private PayRefundProducer payRefundProducer; + + @Resource + private TeamworkInfoService teamworkInfoService; + + @Resource + private RedissonUtil redissonUtil; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createCampaignInfo(CampaignInfoCreateReqVO createReqVO) { + List details = createReqVO.getDetails(); + // 判断是否选择商品 + if (CollectionUtils.isEmpty(details)) { + throw exception(CAMPAIGN_NOT_PRODUCT_ERROR); + } + // 判断活动是否重复 + List productIds = + details.stream().map(CampaignDetailCreateReqVO::getProductId).distinct().collect(Collectors.toList()); + CampaignJudgmentParam param = new CampaignJudgmentParam(); + param.setProductIds(productIds); + param.setStartTime(createReqVO.getStartTime()); + param.setEndTime(createReqVO.getEndTime()); + if (CollectionUtils.isNotEmpty(campaignInfoMapper.checkRepeat(param))) { + throw exception(CAMPAIGN_REPEAT_ERROR); + } + // 查询商品数据 + List products = productService.getStoreProductList(productIds); + Map productMap = + products.stream().collect(Collectors.toMap(StoreProductDO::getId, Function.identity())); + List skuIds = details.stream().map(CampaignDetailCreateReqVO::getSkuId).collect(Collectors.toList()); + List productAttrValueDOS = + productAttrValueService.getStoreProductAttrValueList(skuIds); + Map productAttrValueDOMap = + productAttrValueDOS.stream().collect(Collectors + .toMap(StoreProductAttrValueDO::getId, Function.identity())); + // 准备扣除库存数据 + List updateProductAttrValues = new ArrayList<>(); + Map updateProductMap = new HashMap<>(); + for (CampaignDetailCreateReqVO detail : details) { + StoreProductAttrValueDO productAttrValueDO = productAttrValueDOMap.get(detail.getSkuId()); + if (ObjectUtil.isNull(productAttrValueDO)) throw exception(STORE_PRODUCT_ATTR_VALUE_NOT_EXISTS); + // 检测价格 + if (productAttrValueDO.getPrice().compareTo(detail.getPrice()) < 0) + throw exception(CAMPAIGN_PASS_ORIGINAL_PRICE_ERROR, productAttrValueDO.getSku()); + // 检测库存 + if (productAttrValueDO.getStock() < detail.getStock()) + throw exception(CAMPAIGN_OUT_OF_STOCK_ERROR, productAttrValueDO.getSku()); + productAttrValueDO.setStock(productAttrValueDO.getStock() - detail.getStock()); + updateProductAttrValues.add(productAttrValueDO); + Long productId = productAttrValueDO.getProductId(); + StoreProductDO updateProduct = updateProductMap.get(productId); + if (ObjectUtil.isNotNull(updateProduct)) { + updateProduct.setStock(updateProduct.getStock() - detail.getStock()); + } else { + StoreProductDO product = productMap.get(productId); + if (ObjectUtil.isNull(product)) throw exception(STORE_PRODUCT_NOT_EXISTS); + product.setStock(product.getStock() - detail.getStock()); + updateProductMap.put(productId, product); + } + } + // 转换 + CampaignInfoDO campaignInfo = CampaignInfoConvert.INSTANCE.convert(createReqVO); + LocalDateTime time = null; + // 设置活动状态 + if (ObjectUtil.isNotNull(campaignInfo.getStartTime()) && ObjectUtil.isNotNull(campaignInfo.getEndTime())) { + if (DateUtils.isBelong(campaignInfo.getStartTime(), campaignInfo.getEndTime())) { + // 如果当前时间在这个范围内,状态为进行中 + campaignInfo.setState(IN_PROGRESS.getValue()); + time = campaignInfo.getEndTime(); + } else if (DateUtils.isBefore(campaignInfo.getStartTime())) { + // 如果活动开始时间大于当前时间,状态为未开始 + campaignInfo.setState(NOT_STARTED.getValue()); + time = campaignInfo.getStartTime(); + } else { + // 如果不在,状态为已结束 + campaignInfo.setState(ENDED.getValue()); + } + } + // 预热开始时间 + LocalDateTime preheatStartTime = null; + if (ENABLE.getValue().equals(campaignInfo.getIfEnable()) && + NOT_STARTED.getValue().equals(campaignInfo.getState())) { + preheatStartTime = DateUtils.getMoreMinuteAfter(campaignInfo.getStartTime(), + -1 * campaignInfo.getEnableTime()); + // 当前时间在预热期间,直接开始预热 + if (DateUtils.isBelong(preheatStartTime, campaignInfo.getStartTime())) { + campaignInfo.setState(PREHEAT.getValue()); + } else { + time = preheatStartTime; + } + } + List campaignDetailDOS = CampaignDetailConvert.INSTANCE.convertDetails(details); + // 插入营销活动数据 + campaignInfoMapper.insert(campaignInfo); + campaignDetailDOS.forEach(res -> { + res.setCampaignId(campaignInfo.getId()); + res.setTotal(res.getStock()); + }); + campaignDetailMapper.insertBatch(campaignDetailDOS); + if (!ENDED.getValue().equals(campaignInfo.getState())) { + // 扣除库存 + productAttrValueService.updateBatchById(updateProductAttrValues); + productService.updateBatchById(updateProductMap.values()); + //加入延时队列 + this.addQueue(campaignInfo.getId(), DateUtils.getMoreMillisecondAfter(time)); + } + // 返回 + return campaignInfo.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCampaignInfo(CampaignInfoUpdateReqVO updateReqVO) { + List details = updateReqVO.getDetails(); + // 校验存在 + this.validateCampaignInfoExists(updateReqVO.getId()); + // 判断是否选择商品 + if (CollectionUtils.isEmpty(details)) { + throw exception(CAMPAIGN_NOT_PRODUCT_ERROR); + } + // 回退库存 + this.stackBack(updateReqVO.getId()); + // 删除活动明细 + campaignDetailMapper.deleteCampaignDetails(updateReqVO.getId()); + // 判断活动是否重复 + List productIds = + details.stream().map(CampaignDetailCreateReqVO::getProductId).distinct().collect(Collectors.toList()); + CampaignJudgmentParam param = new CampaignJudgmentParam(); + param.setProductIds(productIds); + param.setCampaignId(updateReqVO.getId()); + param.setStartTime(updateReqVO.getStartTime()); + param.setEndTime(updateReqVO.getEndTime()); + if (CollectionUtils.isNotEmpty(campaignInfoMapper.checkRepeat(param))) { + throw exception(CAMPAIGN_REPEAT_ERROR); + } + // 查询商品数据 + List products = productService.getStoreProductList(productIds); + Map productMap = + products.stream().collect(Collectors.toMap(StoreProductDO::getId, Function.identity())); + List skuIds = details.stream().map(CampaignDetailCreateReqVO::getSkuId).collect(Collectors.toList()); + List productAttrValueDOS = + productAttrValueService.getStoreProductAttrValueList(skuIds); + Map productAttrValueDOMap = + productAttrValueDOS.stream().collect(Collectors + .toMap(StoreProductAttrValueDO::getId, Function.identity())); + // 准备扣除库存数据 + List updateProductAttrValues = new ArrayList<>(); + Map updateProductMap = new HashMap<>(); + for (CampaignDetailCreateReqVO detail : details) { + StoreProductAttrValueDO productAttrValueDO = productAttrValueDOMap.get(detail.getSkuId()); + if (ObjectUtil.isNull(productAttrValueDO)) throw exception(STORE_PRODUCT_ATTR_VALUE_NOT_EXISTS); + // 检测价格 + if (productAttrValueDO.getPrice().compareTo(detail.getPrice()) < 0) + throw exception(CAMPAIGN_PASS_ORIGINAL_PRICE_ERROR, productAttrValueDO.getSku()); + // 检测库存 + if (productAttrValueDO.getStock() < detail.getStock()) + throw exception(CAMPAIGN_OUT_OF_STOCK_ERROR, productAttrValueDO.getSku()); + productAttrValueDO.setStock(productAttrValueDO.getStock() - detail.getStock()); + updateProductAttrValues.add(productAttrValueDO); + Long productId = productAttrValueDO.getProductId(); + StoreProductDO updateProduct = updateProductMap.get(productId); + if (ObjectUtil.isNotNull(updateProduct)) { + updateProduct.setStock(updateProduct.getStock() - detail.getStock()); + } else { + StoreProductDO product = productMap.get(productId); + if (ObjectUtil.isNull(product)) throw exception(STORE_PRODUCT_NOT_EXISTS); + product.setStock(product.getStock() - detail.getStock()); + updateProductMap.put(productId, product); + } + } + // 转换 + CampaignInfoDO campaignInfo = CampaignInfoConvert.INSTANCE.convert(updateReqVO); + LocalDateTime time = null; + // 设置活动状态 + if (ObjectUtil.isNotNull(campaignInfo.getStartTime()) && ObjectUtil.isNotNull(campaignInfo.getEndTime())) { + if (DateUtils.isBelong(campaignInfo.getStartTime(), campaignInfo.getEndTime())) { + // 如果当前时间在这个范围内,状态为进行中 + campaignInfo.setState(IN_PROGRESS.getValue()); + time = campaignInfo.getEndTime(); + } else if (DateUtils.isBefore(campaignInfo.getStartTime())) { + // 如果活动开始时间大于当前时间,状态为未开始 + campaignInfo.setState(NOT_STARTED.getValue()); + time = campaignInfo.getStartTime(); + } else { + // 如果不在,状态为已结束 + campaignInfo.setState(ENDED.getValue()); + } + } + // 预热开始时间 + LocalDateTime preheatStartTime = null; + if (ENABLE.getValue().equals(campaignInfo.getIfEnable()) && + NOT_STARTED.getValue().equals(campaignInfo.getState())) { + preheatStartTime = DateUtils.getMoreMinuteAfter(campaignInfo.getStartTime(), + -1 * campaignInfo.getEnableTime()); + // 当前时间在预热期间,直接开始预热 + if (DateUtils.isBelong(preheatStartTime, campaignInfo.getStartTime())) { + campaignInfo.setState(PREHEAT.getValue()); + } else { + time = preheatStartTime; + } + } + campaignInfoMapper.updateById(campaignInfo); + List campaignDetailDOS = CampaignDetailConvert.INSTANCE.convertDetails(details); + campaignDetailDOS.forEach(res -> { + res.setCampaignId(campaignInfo.getId()); + res.setTotal(res.getStock()); + }); + campaignDetailMapper.insertBatch(campaignDetailDOS); + // 扣除库存 + productAttrValueService.updateBatchById(updateProductAttrValues); + productService.updateBatchById(updateProductMap.values()); + if (!ENDED.getValue().equals(campaignInfo.getState())) { + this.removeQueue(campaignInfo.getId()); + //加入延时队列 + this.addQueue(campaignInfo.getId(), DateUtils.getMoreMillisecondAfter(time)); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCampaignInfo(Long id) { + // 校验存在 + CampaignInfoDO campaignInfo = this.validateCampaignInfoExists(id); + // 进行中无法删除活动 + if (IN_PROGRESS.getValue().equals(campaignInfo.getState())) { + throw exception(CAMPAIGN_IN_PROGRESS_ERROR); + } + // 删除 + campaignInfoMapper.deleteById(id); + // 删除活动明细 + campaignDetailMapper.deleteCampaignDetails(id); + // 删除等待队列数据 + if (NOT_STARTED.getValue().equals(campaignInfo.getState())) { + this.removeQueue(id); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void closeCampaignInfo(Long id) { + // 校验存在 + CampaignInfoDO campaignInfoDO = this.validateCampaignInfoExists(id); + // 自动取消未成团订单 + if (TEAMWORK.getValue().equals(campaignInfoDO.getType())) { + // 查询未成团订单 + List ids = teamworkInfoService.getNotTeamwork(id); + if (CollectionUtils.isNotEmpty(ids)) { + // 取消订单并退款 + payRefundProducer.sendPayRefundMessage(ids); + // 修改拼团失败状态 + teamworkInfoService.updateTeamworkFail(id); + } + } + // 变更活动状态 + CampaignInfoDO update = new CampaignInfoDO(); + update.setId(id); + update.setState(ENDED.getValue()); + campaignInfoMapper.updateById(update); + // 回退库存 + this.stackBack(id); + // 删除自动关闭队列数据 + this.removeQueue(id); + } + + @Override + public void startCampaignInfo(Long id) { + // 校验存在 + CampaignInfoDO campaignInfo = this.validateCampaignInfoExists(id); + // 变更活动状态 + CampaignInfoDO update = new CampaignInfoDO(); + update.setId(id); + update.setState(IN_PROGRESS.getValue()); + campaignInfoMapper.updateById(update); + // 删除自动开始队列数据 + this.removeQueue(id); + long time = DateUtils.getMoreMillisecondAfter(campaignInfo.getEndTime()); + // 加入延时队列,到时间自动结束 + this.addQueue(id, time); + } + + private CampaignInfoDO validateCampaignInfoExists(Long id) { + CampaignInfoDO campaignInfoDO = campaignInfoMapper.selectById(id); + if (ObjectUtil.isNull(campaignInfoDO)) throw exception(CAMPAIGN_NOT_EXISTS); + return campaignInfoDO; + } + + @Override + public CampaignInfoRespVO getCampaignInfo(Long id) { + // 校验存在 + CampaignInfoDO campaignInfo = this.validateCampaignInfoExists(id); + CampaignInfoRespVO vo = CampaignInfoConvert.INSTANCE.convert(campaignInfo); + List details = new ArrayList<>(); + // 获取商品规格数据 + List skus = campaignDetailMapper.getCampaignDetails(id); + if (CollectionUtils.isEmpty(skus)) return vo; + Map> skuMap = + skus.stream().collect(Collectors.groupingBy(CampaignSkuDetailRespVO::getProductId)); + for (List list : skuMap.values()) { + CampaignDetailRespVO detailRespVO = CampaignInfoConvert.INSTANCE.convert(list.get(0)); + detailRespVO.setOriginalStock(list.stream().mapToInt(CampaignSkuDetailRespVO::getOriginalStock).sum()); + detailRespVO.setSkus(list); + details.add(detailRespVO); + } + vo.setNow(LocalDateTime.now()); + vo.setDetails(details); + return vo; + } + + @Override + public PageResult getCampaignInfoPage(CampaignInfoPageReqVO pageReqVO) { + PageResult result = + CampaignInfoConvert.INSTANCE.convertPage(campaignInfoMapper.selectPage(pageReqVO)); + List list = result.getList(); + if (CollectionUtils.isEmpty(list)) { + return result; + } + // 获取拼团订单数据 + List campaignIds = list.stream().map(CampaignInfoPageRespVO::getId).collect(Collectors.toList()); + List campaignOrderVos = campaignInfoMapper.getCampaignInfoList(campaignIds); + if (CollectionUtils.isEmpty(list)) { + return result; + } + Map> orderMap = + campaignOrderVos.stream().collect(Collectors.groupingBy(CampaignOrderVo::getCampaignId)); + for (CampaignInfoPageRespVO campaignInfoPageRespVO : list) { + List campaignOrders = orderMap.get(campaignInfoPageRespVO.getId()); + if (CollectionUtils.isEmpty(campaignOrders)) continue; + // 计算订单数 + campaignInfoPageRespVO.setOrderQuantity(campaignOrders.stream() + .map(CampaignOrderVo::getOid).distinct().collect(Collectors.toList()).size()); + // 计算销售额 + campaignInfoPageRespVO.setSalesAmount(campaignOrders.stream() + .map(CampaignOrderVo::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + // 计算销售量 + campaignInfoPageRespVO.setSalesQuantity(campaignOrders.size()); + } + return result; + } + + @Override + public List getCampaignInfoList(CampaignInfoExportReqVO exportReqVO) { + return campaignInfoMapper.selectList(exportReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void campaignStateHandle(Long id) { + // 校验存在 + CampaignInfoDO campaignInfo = this.validateCampaignInfoExists(id); + Integer state = null; + // 判断下个状态 + if (IN_PROGRESS.getValue().equals(campaignInfo.getState())) { + state = ENDED.getValue(); + // 回退库存 + this.stackBack(id); + // 自动取消未成团订单 + if (TEAMWORK.getValue().equals(campaignInfo.getType())) { + // 查询未成团订单 + List ids = teamworkInfoService.getNotTeamwork(id); + if (CollectionUtils.isNotEmpty(ids)) { + // 取消订单并退款 + payRefundProducer.sendPayRefundMessage(ids); + // 修改拼团失败状态 + teamworkInfoService.updateTeamworkFail(id); + } + } + } else { + if (NOT_STARTED.getValue().equals(campaignInfo.getState()) + && ENABLE.getValue().equals(campaignInfo.getIfEnable())) { + state = PREHEAT.getValue(); + } else if (NOT_STARTED.getValue().equals(campaignInfo.getState()) + && DEACTIVATE.getValue().equals(campaignInfo.getIfEnable())) { + state = IN_PROGRESS.getValue(); + } else if (PREHEAT.getValue().equals(campaignInfo.getState())) { + state = IN_PROGRESS.getValue(); + } + long time = DateUtils.getMoreMillisecondAfter(IN_PROGRESS.getValue().equals(state) ? + campaignInfo.getEndTime() : campaignInfo.getStartTime()); + //加入延时队列 + this.addQueue(id, time); + } + // 修改活动状态 + CampaignInfoDO update = new CampaignInfoDO(); + update.setId(id); + update.setState(state); + campaignInfoMapper.updateById(update); + } + + @Override + public CampaignDataRespVO getCampaignData(Long id) { + // 校验存在 + CampaignInfoDO campaignInfo = this.validateCampaignInfoExists(id); + CampaignDataRespVO campaignDataRespVO = new CampaignDataRespVO(); + campaignDataRespVO.setId(id); + campaignDataRespVO.setName(campaignInfo.getName()); + List campaignOrderVos = campaignInfoMapper.getCampaignInfoList(Arrays.asList(id)); + if (CollectionUtils.isEmpty(campaignOrderVos)) return campaignDataRespVO; + // 成交金额 + campaignDataRespVO.setDealAmount(campaignOrderVos.stream() + .map(CampaignOrderVo::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + // 成交单量 + campaignDataRespVO.setDealQuantity(campaignOrderVos.stream() + .map(CampaignOrderVo::getOid).distinct().collect(Collectors.toList()).size()); + // 成交人数 + campaignDataRespVO.setPeopleNumber(campaignOrderVos.stream() + .map(CampaignOrderVo::getUid).distinct().collect(Collectors.toList()).size()); + // 成交商品数 + campaignDataRespVO.setProductQuantity(campaignOrderVos.size()); + // 客单价 + campaignDataRespVO.setAveragePrice(campaignDataRespVO.getDealAmount() + .divide(new BigDecimal(campaignDataRespVO.getDealQuantity()))); + return campaignDataRespVO; + } + + @Override + public PageResult getCampaignDataDetail(CampaignDataDetailPageReqVO reqVO) { + Page page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize()); + List list = campaignDetailMapper.getCampaignDataDetail(page, reqVO); + if (CollectionUtils.isEmpty(list)) return new PageResult<>(); + // 获取订单数据 + List campaignOrderVos = + campaignInfoMapper.getCampaignInfoList(Arrays.asList(reqVO.getId())); + if (CollectionUtils.isEmpty(campaignOrderVos)) return new PageResult<>(list, page.getTotal()); + Map> skuOrderMap = + campaignOrderVos.stream().collect(Collectors.groupingBy(CampaignOrderVo::getUnique)); + for (CampaignDataDetailRespVO respVO : list) { + List skuOrders = skuOrderMap.get(respVO.getUnique()); + if (CollectionUtils.isEmpty(skuOrders)) continue; + // 成交金额 + respVO.setDealAmount(skuOrders.stream() + .map(CampaignOrderVo::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + // 成交单量 + respVO.setDealQuantity(skuOrders.stream() + .map(CampaignOrderVo::getOid).distinct().collect(Collectors.toList()).size()); + // 成交人数 + respVO.setPeopleNumber(skuOrders.stream() + .map(CampaignOrderVo::getUid).distinct().collect(Collectors.toList()).size()); + // 成交商品数 + respVO.setProductQuantity(skuOrders.size()); + // 客单价 + respVO.setAveragePrice(respVO.getDealAmount().divide(new BigDecimal(respVO.getDealQuantity()))); + } + return new PageResult<>(list, page.getTotal()); + } + + @Override + public PageResult getCanvasCampaignPage(CanvasCampaignPageReqVO pageReqVO) { + if (PageTypeEnum.NOT_PAGE.getValue().equals(pageReqVO.getIsPage())) pageReqVO.setPageSize(Integer.MAX_VALUE); + return CampaignInfoConvert.INSTANCE.convertCanvasPage(campaignInfoMapper.getCanvasCampaignPage(pageReqVO)); + } + + /** + * 回退库存 + * + * @param campaignId 营销活动id + */ + private void stackBack(Long campaignId) { + // 查询活动的商品明细数据 + List details = + campaignDetailMapper.selectList(new LambdaQueryWrapper() + .eq(CampaignDetailDO::getCampaignId, campaignId)); + if (CollectionUtils.isEmpty(details)) return; + List productIds = + details.stream().map(CampaignDetailDO::getProductId).distinct().collect(Collectors.toList()); + // 查询商品数据 + List products = productService.getStoreProductList(productIds); + if (CollectionUtils.isEmpty(products)) return; + // 过滤未上架商品 + products = products.stream().filter(res -> ProductSpuStatusEnum.ENABLE.getStatus().equals(res.getIsShow())) + .collect(Collectors.toList()); + if(CollectionUtils.isEmpty(products)) return; + Map productMap = + products.stream().collect(Collectors.toMap(StoreProductDO::getId, Function.identity())); + List skuIds = details.stream().map(CampaignDetailDO::getSkuId).collect(Collectors.toList()); + List skus = productAttrValueService.getStoreProductAttrValueList(skuIds); + Map skuMap = + skus.stream().collect(Collectors.toMap(StoreProductAttrValueDO::getId, Function.identity())); + // 返还库存 + List updateSkus = new ArrayList<>(); + Map updateProductMap = new HashMap<>(); + for (CampaignDetailDO detail : details) { + StoreProductAttrValueDO sku = skuMap.get(detail.getSkuId()); + if(ObjectUtil.isNull(sku)) continue; + sku.setStock(sku.getStock() + detail.getStock()); + updateSkus.add(sku); + StoreProductDO updateProduct = updateProductMap.get(detail.getProductId()); + if (ObjectUtil.isNull(updateProduct)) { + StoreProductDO product = productMap.get(detail.getProductId()); + product.setStock(product.getStock() + detail.getStock()); + updateProductMap.put(detail.getProductId(), product); + } else { + updateProduct.setStock(updateProduct.getStock() + detail.getStock()); + } + } + // 回退库存 + productAttrValueService.updateBatchById(updateSkus); + productService.updateBatchById(updateProductMap.values()); + } + + /** + * 加入延时队列 + * + * @param id + * @param time + */ + private void addQueue(Long id, long time) { + log.info("添加延时队列 ,营销活动id:{}, 延时时间:{}", id, time); + redissonUtil.delayedOfferThrow(ShopConstants.CAMPAIGN_CHANGE, id, time, TimeUnit.MILLISECONDS, CAMPAIGN_ADD_QUEUE_ERROR); + } + + /** + * 从延时队列中移除 + * + * @param id + */ + private void removeQueue(Long id) { + redissonUtil.delayedRemoveThrow(ShopConstants.CAMPAIGN_CHANGE, id, CAMPAIGN_REMOVE_QUEUE_ERROR); + log.info("移除延时队列成功 ,营销活动id:{}", id); + } +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryService.java index 0ef509b..f1151fb 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryService.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.product.service.category; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryListReqVO; +import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryTreeRespVO; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; import co.yixiang.yshop.module.product.dal.dataobject.category.ProductCategoryDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; @@ -77,4 +78,11 @@ public interface ProductCategoryService extends IService { */ List getEnableCategoryList(); + /** + * 获得商品分类树 + * + * @return 商品分类列表 + */ + List getCategoryTree(); + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryServiceImpl.java index 7862ca2..0569c39 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/category/ProductCategoryServiceImpl.java @@ -3,20 +3,25 @@ package co.yixiang.yshop.module.product.service.category; import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryListReqVO; +import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryTreeRespVO; import co.yixiang.yshop.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; import co.yixiang.yshop.module.product.convert.category.ProductCategoryConvert; import co.yixiang.yshop.module.product.dal.dataobject.category.ProductCategoryDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.mysql.category.ProductCategoryMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; @@ -142,4 +147,34 @@ public class ProductCategoryServiceImpl extends ServiceImpl getCategoryTree() { + List productCategoryDOS = + productCategoryMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = ProductCategoryConvert.INSTANCE.convertTreeList(productCategoryDOS); + if(CollectionUtils.isEmpty(list)){ + return new ArrayList<>(); + } + Map> categoryMap = + list.stream().collect(Collectors.groupingBy(ProductCategoryTreeRespVO::getParentId)); + // 获取最上级分类 + List roots = categoryMap.get(0l); + if(CollectionUtils.isEmpty(roots)){ + return new ArrayList<>(); + } + getTree(roots, categoryMap); + return roots; + } + + private void getTree(List roots, Map> categoryMap){ + for (ProductCategoryTreeRespVO root : roots) { + List categoryList = categoryMap.get(root.getId()); + if(CollectionUtils.isEmpty(categoryList)){ + continue; + } + getTree(categoryList, categoryMap); + root.setChildren(categoryList); + } + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java index 05b4ea6..937c7f0 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java @@ -19,9 +19,10 @@ public interface AppCouponService extends IService { * 获取商品可领优惠券列表 * * @param productId 商品id + * @param uid 用户id * @return */ - List receiveList(Long productId); + List receiveList(Long productId,Long uid); /** * 获取优惠券可用商品列表 diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java index fb78997..87648dc 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java @@ -4,10 +4,13 @@ import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailR import co.yixiang.yshop.module.product.convert.storeproductcoupon.StoreProductCouponConvert; import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; import co.yixiang.yshop.module.product.dal.mysql.productcoupon.ProductCouponMapper; +import co.yixiang.yshop.module.product.enums.coupon.CouponReceiveTypeEnum; import co.yixiang.yshop.module.product.enums.coupon.CouponScopeEnum; +import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -15,6 +18,8 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -28,14 +33,20 @@ public class AppCouponServiceImpl extends ServiceImpl receiveList(Long productId) { + public List receiveList(Long productId,Long uid) { List couponDOS = this.baseMapper.receiveList(productId); if (CollectionUtils.isEmpty(couponDOS)) return null; List couponDetailList = StoreProductCouponConvert.INSTANCE.convertList(couponDOS); + // 用户登录时 过滤已领取优惠券 + Predicate predicate = getPredicate(uid); + couponDetailList = couponDetailList.stream() + .filter(predicate) .sorted(Comparator.comparing(AppCouponDetailRespVO::getCouponType, Comparator.reverseOrder()) /*.thenComparing(AppCouponDetailRespVO::getDiscount, Comparator.naturalOrder()) .thenComparing(AppCouponDetailRespVO::getCouponValue, Comparator.reverseOrder())*/ @@ -43,6 +54,22 @@ public class AppCouponServiceImpl extends ServiceImpl getPredicate(Long uid) { + Predicate predicate = item -> true; + if(Objects.nonNull(uid)){ + predicate = item -> { + //过滤用户已经领取的优惠券 + if(CouponReceiveTypeEnum.LIMITATION.getValue().equals(item.getReceiveType())){ + long receivedCount = appCouponRelationService.getReceivedCount(item.getId(), uid); + return receivedCount < item.getLimitNumber(); + } + return true; + }; + } + return predicate; + } + @Override public List getCouponProductList(Long id) { List productIdList = new ArrayList<>(); diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java index 584a48d..1c5c4ff 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java @@ -2,10 +2,7 @@ package co.yixiang.yshop.module.product.service.productcoupon; import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.*; import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; import com.baomidou.mybatisplus.extension.service.IService; @@ -57,4 +54,12 @@ public interface ProductCouponService extends IService { */ Boolean deleteCoupon(Long id); + /** + * 获得画布优惠券分页 + * + * @param pageReqVO 分页查询 + * @return 优惠券分页 + */ + PageResult getCanvasProductPage(CanvasProductCouponPageReqVO pageReqVO); + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java index 2c4be8e..291b1bf 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java @@ -1,13 +1,11 @@ package co.yixiang.yshop.module.product.service.productcoupon; import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; -import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.*; import co.yixiang.yshop.module.product.convert.storeproductcoupon.StoreProductCouponConvert; import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; import co.yixiang.yshop.module.product.dal.mysql.productcoupon.ProductCouponMapper; +import co.yixiang.yshop.module.product.enums.common.PageTypeEnum; import co.yixiang.yshop.module.product.enums.coupon.CouponExpirationEnum; import co.yixiang.yshop.module.product.enums.coupon.CouponStatusEnum; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,10 +60,10 @@ public class ProductCouponServiceImpl extends ServiceImpl pageResult = StoreProductCouponConvert.INSTANCE.convertPage(this.baseMapper.selectPage(pageReqVO)); pageResult.getList().forEach(res -> { - if(CouponExpirationEnum.BY_DAY.getValue().equals(res.getExpirationType())){ + if (CouponExpirationEnum.BY_DAY.getValue().equals(res.getExpirationType())) { res.setStatus(CouponStatusEnum.IN_PROGRESS.getDesc()); - }else { - LocalDateTime now =LocalDateTime.now(); + } else { + LocalDateTime now = LocalDateTime.now(); if (now.isBefore(res.getTakingEffectTime())) { res.setStatus(CouponStatusEnum.NOT_STARTED.getDesc()); } else if (now.isAfter(res.getTakingEffectTime()) && now.isBefore(res.getExpirationTime())) { @@ -83,6 +81,12 @@ public class ProductCouponServiceImpl extends ServiceImpl getCanvasProductPage(CanvasProductCouponPageReqVO pageReqVO) { + if (PageTypeEnum.NOT_PAGE.getValue().equals(pageReqVO.getIsPage())) pageReqVO.setPageSize(Integer.MAX_VALUE); + return StoreProductCouponConvert.INSTANCE.convertCanvasPage(this.baseMapper.getCanvasProductPage(pageReqVO)); + } + private String convertString(String[] arr) { return String.join(",", arr); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java index 1dcfc52..3dd6890 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java @@ -20,10 +20,11 @@ public interface AppCouponRelationService extends IService getProductIdList(Long id); + /** + * 获取优惠券数量 + * @param userId 用户id + */ + Integer getCouponNumber(Long userId); + + /** + * 获取已领取优惠券数量 + * @param id 优惠券id + * @param uid 用户id + * @return / + */ + long getReceivedCount(Long id, Long uid); + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java index 80b96d2..9c0bf7f 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java @@ -32,9 +32,7 @@ import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.NOT_PRODUCT_COUPON_ERROR; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.PRODUCT_COUPON_NOT_EXISTS; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.PRODUCT_COUPON_RECEIVE_ERROR; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; /** * App优惠券记录 Service 接口 @@ -49,17 +47,16 @@ public class AppCouponRelationServiceImpl extends ServiceImpl() - .eq(ProductCouponRelationDO::getCouponId, id).eq(ProductCouponRelationDO::getUid, uid)); - if (couponDO.getNumber() < 1) throw exception(NOT_PRODUCT_COUPON_ERROR); + + long count = getReceivedCount(id, uid); + if (CouponReceiveTypeEnum.UNLIMITED.getValue().equals(couponDO.getReceiveType()) || count < couponDO.getLimitNumber()) { ProductCouponRelationDO relationDO = ProductCouponRelationDO.builder().couponId(id).uid(uid).build(); @@ -71,6 +68,12 @@ public class AppCouponRelationServiceImpl extends ServiceImpl() + .eq(ProductCouponRelationDO::getCouponId, id).eq(ProductCouponRelationDO::getUid, uid)); + } + @Override public void verificationCoupon(Long id) { ProductCouponRelationDO productCouponDO = getById(id); @@ -140,6 +143,11 @@ public class AppCouponRelationServiceImpl extends ServiceImpl { /** * 商品详情 - * @param id 商品id + * @param vo * @param uid 用户id * @return ProductVo */ - AppProductVo goodsDetail(Long id, Long uid); + AppProductVo goodsDetail(AppStoreProductDetailReqVo vo, Long uid); /** * 返回普通商品库存 @@ -55,6 +56,13 @@ public interface AppStoreProductService extends IService { */ AppStoreProductRespVo getStoreProductById(Long id); + /** + * 获取商品列表 + * @param ids 商品id集合 + * @return + */ + List getStoreProductByIds(List ids); + /** * 减少库存与增加销量 * @param num 数量 @@ -64,12 +72,21 @@ public interface AppStoreProductService extends IService { void decProductStock(int num, Long productId, String unique,Long activityId,String type); /** - * 增加库存 减少销量 + * 增加销量 * @param num 数量 * @param productId 商品id - * @param unique sku唯一值 */ - void incProductStock(Integer num, Long productId, String unique,Long activityId, String type); + void incSales(Integer num, Long productId); + + /** + * 增加库存 减少销量 + * + * @param num 数量 + * @param productId 商品id + * @param unique sku唯一值 + * @param type 回退类型 + */ + void incProductStock(Integer num, Long productId, String unique,Integer type); /*** diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java index 60b5e13..0ca1b97 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java @@ -5,27 +5,24 @@ import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.AppCampaignSkuRespVO; import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; import co.yixiang.yshop.module.product.controller.app.product.param.AppStoreProductQueryParam; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppProductVo; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductAttrQueryVo; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductReplyQueryVo; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; +import co.yixiang.yshop.module.product.controller.app.product.vo.*; import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplates.ShippingTemplatesDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; +import co.yixiang.yshop.module.product.dal.mysql.campaigndetail.CampaignDetailMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproductattrvalue.StoreProductAttrValueMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproductrelation.StoreProductRelationMapper; import co.yixiang.yshop.module.product.dal.redis.RedisKeyConstants; import co.yixiang.yshop.module.product.enums.ProductConstants; import co.yixiang.yshop.module.product.enums.coupon.CouponTypeEnum; -import co.yixiang.yshop.module.product.enums.product.ProductEnum; -import co.yixiang.yshop.module.product.enums.product.ProductTypeEnum; -import co.yixiang.yshop.module.product.enums.product.RelationCateEnum; -import co.yixiang.yshop.module.product.enums.product.RelationEnum; +import co.yixiang.yshop.module.product.enums.product.*; +import co.yixiang.yshop.module.product.service.campaigninfo.AppCampaignInfoService; import co.yixiang.yshop.module.product.service.productcoupon.AppCouponService; import co.yixiang.yshop.module.product.service.shippingtemplates.ShippingTemplatesService; import co.yixiang.yshop.module.product.service.storeproductattr.AppStoreProductAttrService; @@ -39,6 +36,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.type.TypeReference; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Service; @@ -63,6 +61,7 @@ import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRO * * @author yshop */ +@Slf4j @Service @Validated public class AppStoreProductServiceImpl extends ServiceImpl implements AppStoreProductService { @@ -89,6 +88,12 @@ public class AppStoreProductServiceImpl extends ServiceImpl pageModel = new Page<>(productQueryParam.getPage(), productQueryParam.getLimit()); IPage pageList = this.baseMapper.selectPage(pageModel, wrapper); + List list = StoreProductConvert.INSTANCE.convertList03(pageList.getRecords()); + if (CollectionUtils.isNotEmpty(list)) { + // 返回活动信息 + List productIds = list.stream().map(AppStoreProductRespVo::getId).collect(Collectors.toList()); + List campaignDetailDOS = + campaignDetailMapper.getCampaignSkus(productIds); + if (CollectionUtils.isNotEmpty(campaignDetailDOS)) { + Map> campaignDetailMap = + campaignDetailDOS.stream().collect(Collectors.groupingBy(AppCampaignSkuRespVO::getProductId)); + for (AppStoreProductRespVo respVo : list) { + List detailDOS = campaignDetailMap.get(respVo.getId()); + if(CollectionUtils.isEmpty(detailDOS)) continue; + // 默认显示第一个 + AppCampaignSkuRespVO skuRespVO = detailDOS.get(0); + respVo.setCampaignType(skuRespVO.getType()); + respVo.setSkuId(skuRespVO.getSkuId()); + respVo.setProductAttrUnique(skuRespVO.getProductAttrUnique()); + respVo.setCampaignPrice(skuRespVO.getPrice()); + respVo.setCampaignStock(skuRespVO.getStock()); + respVo.setCampaignTotal(skuRespVO.getTotal()); + respVo.setPerson(skuRespVO.getPerson()); + respVo.setDiscount(skuRespVO.getDiscount()); + respVo.setCampaignState(skuRespVO.getState()); + } + } + } - return StoreProductConvert.INSTANCE.convertList03(pageList.getRecords()); + return list; } /** * 商品详情 * - * @param id 商品id + * @param vo * @param uid 用户id * @return ProductVo */ @Override - public AppProductVo goodsDetail(Long id, Long uid) { + public AppProductVo goodsDetail(AppStoreProductDetailReqVo vo, Long uid) { + Long id = vo.getProductId(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StoreProductDO::getId, id); StoreProductDO storeProduct = this.baseMapper.selectOne(wrapper); @@ -270,9 +304,36 @@ public class AppStoreProductServiceImpl extends ServiceImpl>() { }); productVo.setProductAttr(attrList); - Map attrValueMap = JsonUtils.parseObject(JsonUtils.toJsonString(returnMap.get("productValue")), - new TypeReference>() { + Map attrValueMap = JsonUtils.parseObject(JsonUtils.toJsonString(returnMap.get("productValue")), + new TypeReference>() { }); + if(SpecTypeEnum.SINGLE_SPECS.getValue().equals(storeProduct.getSpecType())) { + attrValueMap.values().forEach(res -> res.setImage(storeProduct.getImage())); + } + // 设置营销活动信息 + if(CollectionUtils.isNotEmpty(attrValueMap.values())){ + // 查询该商品的营销活动 + List campaignSkuRespVOS = + campaignDetailMapper.getCampaignSkus(Arrays.asList(vo.getProductId())); + if(CollectionUtils.isNotEmpty(campaignSkuRespVOS)){ + for (AppCampaignSkuRespVO campaignSkuRespVO : campaignSkuRespVOS) { + AppStoreProductAttrValueVo valueVo = attrValueMap.get(campaignSkuRespVO.getSku()); + if(ObjectUtil.isNull(valueVo)) continue; + valueVo.setCampaignId(campaignSkuRespVO.getId()); + valueVo.setCampaignDetailId(campaignSkuRespVO.getDetailId()); + valueVo.setCampaignStock(campaignSkuRespVO.getStock()); + valueVo.setCampaignPrice(campaignSkuRespVO.getPrice()); + valueVo.setCampaignStock(campaignSkuRespVO.getStock()); + valueVo.setCampaignTotal(campaignSkuRespVO.getTotal()); + valueVo.setCampaignType(campaignSkuRespVO.getType()); + valueVo.setDiscount(campaignSkuRespVO.getDiscount()); + valueVo.setPerson(campaignSkuRespVO.getPerson()); + valueVo.setStartTime(campaignSkuRespVO.getStartTime()); + valueVo.setEndTime(campaignSkuRespVO.getEndTime()); + valueVo.setCampaignState(campaignSkuRespVO.getState()); + } + } + } productVo.setProductValue(attrValueMap); //添加足迹,先删除之前的,更新时间 @@ -290,7 +351,7 @@ public class AppStoreProductServiceImpl extends ServiceImpl couponDetailList = appCouponService.receiveList(id); + List couponDetailList = appCouponService.receiveList(id,uid); if (CollectionUtils.isNotEmpty(couponDetailList)) { AppCouponDetailRespVO couponDetail = couponDetailList.get(0); if (CouponTypeEnum.FULL_REDUCTION.getValue().equals(couponDetail.getCouponType())) { @@ -341,6 +402,11 @@ public class AppStoreProductServiceImpl extends ServiceImpl getStoreProductByIds(List ids) { + return StoreProductConvert.INSTANCE.convertList03(this.baseMapper.selectBatchIds(ids)); + } + /** * 减少库存与增加销量 @@ -368,6 +434,11 @@ public class AppStoreProductServiceImpl extends ServiceImpl { */ PageResult getStoreProductPage(StoreProductPageReqVO pageReqVO); + /** + * 获得营销活动商品列表 + * + * @param pageReqVO 分页查询 + * @return 商品分页 + */ + PageResult getCampaignProductPage(CampaignProductPageReqVO pageReqVO); + /** * 获得商品列表, 用于 Excel 导出 * @@ -90,7 +100,7 @@ public interface StoreProductService extends IService { * 新增/保存商品 * @param storeProductDto 商品 */ - void insertAndEditYxStoreProduct(StoreProductDto storeProductDto); + void insertAndEditYxStoreProduct(StoreProductDTO storeProductDto); Map getProductInfo(Long id); @@ -101,4 +111,14 @@ public interface StoreProductService extends IService { */ void onSale(Long id,Integer status); + /** + * 获得画布商品分页 + * + * @param pageReqVO 分页查询 + * @return + */ + PageResult getCanvasProductPage(CanvasProductPageReqVO pageReqVO); + + + PageResult getProductPage(ProductPageReqVO pageReqVO); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java index 575822b..a7a467e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java @@ -5,19 +5,26 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.api.product.dto.ProductPageReqVO; import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.*; +import co.yixiang.yshop.module.product.controller.app.campaigninfo.vo.AppCampaignSkuRespVO; +import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; +import co.yixiang.yshop.module.product.convert.storeproductattrvalue.StoreProductAttrValueConvert; import co.yixiang.yshop.module.product.convert.storeproductrule.StoreProductRuleConvert; import co.yixiang.yshop.module.product.dal.dataobject.category.ProductCategoryDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrresult.StoreProductAttrResultDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductrule.StoreProductRuleDO; +import co.yixiang.yshop.module.product.dal.mysql.campaigndetail.CampaignDetailMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; +import co.yixiang.yshop.module.product.enums.common.PageTypeEnum; import co.yixiang.yshop.module.product.enums.coupon.CouponScopeEnum; import co.yixiang.yshop.module.product.enums.product.SpecTypeEnum; import co.yixiang.yshop.module.product.service.category.ProductCategoryService; @@ -30,6 +37,7 @@ import co.yixiang.yshop.module.product.service.storeproductrule.StoreProductRule import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; @@ -69,6 +77,9 @@ public class StoreProductServiceImpl extends ServiceImpl getCampaignProductPage(CampaignProductPageReqVO pageReqVO) { + PageResult result = + StoreProductConvert.INSTANCE.campaignConvertPage(storeProductMapper.getCampaignProductPage(pageReqVO)); + List products = result.getList(); + if (CollectionUtils.isEmpty(products)) return result; + // 查询规格信息 + List productId = products.stream().map(CampaignProductRespVO::getId).collect(Collectors.toList()); + List skus = + StoreProductAttrValueConvert.INSTANCE.convertList(storeProductAttrValueService + .getStoreProductAttrValueByProductIds(productId)); + if (CollectionUtils.isEmpty(skus)) return result; + Map> skuMap = + skus.stream().collect(Collectors.groupingBy(CampaignSkuRespVO::getProductId)); + for (CampaignProductRespVO product : products) { + product.setSkus(skuMap.get(product.getId())); + } + return result; + } + @Override public List getStoreProductList(StoreProductExportReqVO exportReqVO) { return storeProductMapper.selectList(exportReqVO); @@ -163,10 +194,10 @@ public class StoreProductServiceImpl extends ServiceImpl formatDetailDTOList = JSON.parseArray(jsonObject.get("attrs").toString(), - FormatDetailDto.class); + List formatDetailDTOList = JSON.parseArray(jsonObject.get("attrs").toString(), + FormatDetailDTO.class); //formatDetailDTOList - DetailDto detailDto = this.attrFormat(formatDetailDTOList); + DetailDTO detailDto = this.attrFormat(formatDetailDTOList); List> headerMapList = null; List> valueMapList = new ArrayList<>(); @@ -248,6 +279,8 @@ public class StoreProductServiceImpl extends ServiceImpl formatDetailDTOList) { + private DetailDTO attrFormat(List formatDetailDTOList) { List data = new ArrayList<>(); List>> res = new ArrayList<>(); formatDetailDTOList.stream() - .map(FormatDetailDto::getDetail) + .map(FormatDetailDTO::getDetail) .forEach(i -> { if (i == null || i.isEmpty()) { throw exception(STORE_PRODUCT_RULE_NEED); @@ -418,7 +451,7 @@ public class StoreProductServiceImpl extends ServiceImpl dataArr = new ArrayList<>(); - for (FormatDetailDto formatDetailDTO : formatDetailDTOList) { + for (FormatDetailDTO formatDetailDTO : formatDetailDTOList) { for (String str : formatDetailDTO.getDetail()) { Map> detailMap = new LinkedHashMap<>(); dataArr.add(formatDetailDTO.getValue() + "_" + str); @@ -432,7 +465,7 @@ public class StoreProductServiceImpl extends ServiceImpl attrs = storeProductDto.getAttrs(); - ProductFormatDto productFormatDto = attrs.get(0); + List attrs = storeProductDTO.getAttrs(); + ProductFormatDTO productFormatDto = attrs.get(0); productFormatDto.setValue1("规格"); Map map = new HashMap<>(); map.put("规格", "默认"); @@ -513,15 +546,15 @@ public class StoreProductServiceImpl extends ServiceImpl attrValues = storeProductAttrValueService.list(new LambdaQueryWrapper().eq(StoreProductAttrValueDO::getProductId, id)); - List productFormatDtoList = attrValues.stream().map(i -> { - ProductFormatDto productFormatDto = new ProductFormatDto(); + List productFormatDTOList = attrValues.stream().map(i -> { + ProductFormatDTO productFormatDto = new ProductFormatDTO(); BeanUtils.copyProperties(i, productFormatDto); productFormatDto.setPic(i.getImage()); return productFormatDto; }).collect(Collectors.toList()); if (SpecTypeEnum.MULTIPLE_SPECS.getValue().equals(storeProduct.getSpecType())) { - productDto.setAttr(new ProductFormatDto()); - productDto.setAttrs(productFormatDtoList); + productDto.setAttr(new ProductFormatDTO()); + productDto.setAttrs(productFormatDTOList); productDto.setItems(result.getObject("attr", ArrayList.class)); } else { this.productFormat(productDto, result); @@ -590,6 +623,58 @@ public class StoreProductServiceImpl extends ServiceImpl getCanvasProductPage(CanvasProductPageReqVO pageReqVO) { + if (pageReqVO.getCateId() != null) { + ProductCategoryDO productCategoryDO = productCategoryService.getCategory(pageReqVO.getCateId()); + if (productCategoryDO != null) { + List CateIds = new ArrayList<>(); + if (Objects.equals(productCategoryDO.getParentId(), ProductCategoryDO.PARENT_ID_NULL)) { + CateIds = productCategoryService.list((Wrappers.lambdaQuery() + .eq(ProductCategoryDO::getParentId, productCategoryDO.getId()))) + .stream().map(ProductCategoryDO::getId).collect(Collectors.toList()); + } else { + CateIds.add(Convert.toLong(pageReqVO.getCateId())); + } + pageReqVO.setCateIds(CateIds); + } + } + if (PageTypeEnum.NOT_PAGE.getValue().equals(pageReqVO.getIsPage())) pageReqVO.setPageSize(Integer.MAX_VALUE); + PageResult pageResult = + StoreProductConvert.INSTANCE.convertPage(storeProductMapper.getCanvasProductPage(pageReqVO)); + List list = pageResult.getList(); + if(CollectionUtils.isEmpty(list)) return pageResult; + // 查询活动信息 + List productIds = + pageResult.getList().stream().map(StoreProductRespVO::getId).collect(Collectors.toList()); + List campaignDetailDOS = campaignDetailMapper.getCampaignSkus(productIds); + if (CollectionUtils.isNotEmpty(campaignDetailDOS)) { + Map> campaignDetailMap = + campaignDetailDOS.stream().collect(Collectors.groupingBy(AppCampaignSkuRespVO::getProductId)); + for (StoreProductRespVO respVo : list) { + List detailDOS = campaignDetailMap.get(respVo.getId()); + if(CollectionUtils.isEmpty(detailDOS)) continue; + // 默认显示第一个 + AppCampaignSkuRespVO skuRespVO = detailDOS.get(0); + respVo.setSkuId(skuRespVO.getSkuId()); + respVo.setProductAttrUnique(skuRespVO.getProductAttrUnique()); + respVo.setCampaignType(skuRespVO.getType()); + respVo.setCampaignState(skuRespVO.getState()); + respVo.setCampaignOriginalPrice(skuRespVO.getCampaignOriginalPrice()); + respVo.setCampaignPrice(skuRespVO.getPrice()); + respVo.setCampaignStock(skuRespVO.getStock()); + respVo.setCampaignTotal(skuRespVO.getTotal()); + respVo.setPerson(skuRespVO.getPerson()); + } + } + return pageResult; + } + + @Override + public PageResult getProductPage(ProductPageReqVO pageReqVO) { + return storeProductMapper.getProductPage(pageReqVO); + } + /** * 获取商品属性 @@ -597,9 +682,9 @@ public class StoreProductServiceImpl extends ServiceImpl mapAttr = (Map) result.getObject("value", ArrayList.class).get(0); - ProductFormatDto productFormatDto = ProductFormatDto.builder() + ProductFormatDTO productFormatDto = ProductFormatDTO.builder() .pic(mapAttr.get("pic").toString()) .price(Double.valueOf(mapAttr.get("price").toString())) .cost(Double.valueOf(mapAttr.get("cost").toString())) @@ -616,6 +701,8 @@ public class StoreProductServiceImpl extends ServiceImpl attrs) { + private ProductResultDTO computedProduct(List attrs) { //取最小价格 Double minPrice = attrs .stream() - .map(ProductFormatDto::getPrice) + .map(ProductFormatDTO::getPrice) .min(Comparator.naturalOrder()) .orElse(0d); //取最小积分 Integer minIntegral = attrs .stream() - .map(ProductFormatDto::getIntegral) + .map(ProductFormatDTO::getIntegral) .min(Comparator.naturalOrder()) .orElse(0); Double minOtPrice = attrs .stream() - .map(ProductFormatDto::getOtPrice) + .map(ProductFormatDTO::getOtPrice) .min(Comparator.naturalOrder()) .orElse(0d); Double minCost = attrs .stream() - .map(ProductFormatDto::getCost) + .map(ProductFormatDTO::getCost) .min(Comparator.naturalOrder()) .orElse(0d); //计算库存 Integer stock = attrs .stream() - .map(ProductFormatDto::getStock) + .map(ProductFormatDTO::getStock) .reduce(Integer::sum) .orElse(0); @@ -664,7 +751,7 @@ public class StoreProductServiceImpl extends ServiceImpl data; //private List>>> res; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java index 25763db..6b66198 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java @@ -20,7 +20,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Builder -public class FormatDetailDto { +public class FormatDetailDTO { private String attrHidden; private String detailValue; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java index 50ef345..6262df0 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java @@ -19,7 +19,7 @@ import java.util.List; @AllArgsConstructor @Getter @Setter -public class ProductDto +public class ProductDTO { /** 商品id */ @@ -137,13 +137,31 @@ public class ProductDto @JsonProperty("spec_type") private Integer specType; - private ProductFormatDto attr; + private ProductFormatDTO attr; - private List items; + private List items; - private List attrs; + private List attrs; + /** + * 是否分销:0-否,1-是 + */ + private Integer isDistribution; + // 分销规则 0-默认 1-自定义 + private Integer distributionRule; + + // 分销规则 1-一级 2-二级 + private Integer distributionLevel; + + // 分销自购 0-关闭 1-开启 + private Integer distributionPurchase; + + // 商品结算方式 0-实际支付价格 1-商品价格 + private Integer distributionProductSettlement; + + // 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + private Integer distributionWagesSettlement; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductFormatDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductFormatDto.java index 7fa9a63..eca463c 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductFormatDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductFormatDto.java @@ -21,7 +21,7 @@ import java.util.Map; @NoArgsConstructor @Getter @Setter -public class ProductFormatDto { +public class ProductFormatDTO { private String sku = ""; @@ -64,4 +64,14 @@ public class ProductFormatDto { private Map detail; + /* 分销商相关 */ + /** + * 一级佣金比例 + */ + private Integer firstWages; + /** + * 二级佣金比例 + */ + private Integer secondWages; + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java index 1147efe..ea65ecb 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java @@ -12,7 +12,7 @@ import lombok.Setter; @Getter @Setter @Builder -public class ProductResultDto { +public class ProductResultDTO { private Double minPrice; private Double minOtPrice; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java index 8c08b9e..ee0766a 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.product.service.storeproduct.dto; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -20,7 +21,7 @@ import java.util.List; @Getter @Setter @ToString -public class StoreProductDto { +public class StoreProductDTO { /** * 商品id @@ -201,10 +202,36 @@ public class StoreProductDto { private Integer specType; //属性项目 - private List items; + private List items; //sku结果集 - private List attrs; + private List attrs; + + + /** + * 是否分销:0-否,1-是 + */ + private Integer isDistribution; + + + // 分销规则 0-默认 1-自定义 + @Schema(description = "分销规则 0-默认 1-自定义") + private Integer distributionRule; + + @Schema(description = "分销等级 1-一级 2-二级") + private Integer distributionLevel; + + // 分销自购 0-关闭 1-开启 + @Schema(description = "分销自购 0-关闭 1-开启") + private Integer distributionPurchase; + + // 商品结算方式 0-实际支付价格 1-商品价格 + @Schema(description = "商品结算方式 0-实际支付价格 1-商品价格") + private Integer distributionProductSettlement; + + // 佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算 + @Schema(description = "佣金结算方式 0-支付后结算 1-确认收获后结算 2-订单完成结算") + private Integer distributionWagesSettlement; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java index c9e5eaa..b04e9a1 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java @@ -15,7 +15,7 @@ import java.math.BigDecimal; * @date 2020-05-12 */ @Data -public class YxStoreProductDto implements Serializable { +public class YxStoreProductDTO implements Serializable { /** 商品id */ private Integer id; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java index b7a2862..d8e3bf9 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java @@ -1,4 +1,4 @@ -package co.yixiang.yshop.module.product.service.storeproduct.dto;///** +///** // * Copyright (C) 2018-2022 // * All rights reserved, Designed By www.yixiang.co // * 注意: diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java index 9220e98..eb1f6e0 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java @@ -1,4 +1,4 @@ -package co.yixiang.yshop.module.product.service.storeproduct.dto;///** +///** // * Copyright (C) 2018-2022 // * All rights reserved, Designed By www.yixiang.co // diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRuleDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRuleDto.java index aa9b398..8163d68 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRuleDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRuleDto.java @@ -19,7 +19,7 @@ import java.sql.Timestamp; * @date 2020-06-28 */ @Data -public class YxStoreProductRuleDto implements Serializable { +public class YxStoreProductRuleDTO implements Serializable { private Integer id; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductSmallDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductSmallDto.java index 957a9d3..35f32d6 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductSmallDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductSmallDto.java @@ -15,7 +15,7 @@ import java.io.Serializable; * @date 2019-10-04 */ @Data -public class YxStoreProductSmallDto implements Serializable { +public class YxStoreProductSmallDTO implements Serializable { // 商品id private Integer id; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrServiceImpl.java index 5baf17d..a27a8d5 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrServiceImpl.java @@ -5,7 +5,7 @@ import co.yixiang.yshop.module.product.convert.storeproductattr.StoreProductAttr import co.yixiang.yshop.module.product.dal.dataobject.storeproductattr.StoreProductAttrDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.mysql.storeproductattr.StoreProductAttrMapper; -import co.yixiang.yshop.module.product.service.storeproduct.dto.AttrValueDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.AttrValueDTO; import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -51,9 +51,9 @@ public class AppStoreProductAttrServiceImpl extends ServiceImpl stringList = Arrays.asList(attr.getAttrValues().split(",")); - List attrValueDTOS = new ArrayList<>(); + List attrValueDTOS = new ArrayList<>(); for (String str : stringList) { - AttrValueDto attrValueDTO = new AttrValueDto(); + AttrValueDTO attrValueDTO = new AttrValueDTO(); attrValueDTO.setAttr(str); attrValueDTOS.add(attrValueDTO); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java index f28f2c4..6b6552e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java @@ -1,8 +1,8 @@ package co.yixiang.yshop.module.product.service.storeproductattr; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattr.StoreProductAttrDO; -import co.yixiang.yshop.module.product.service.storeproduct.dto.FormatDetailDto; -import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.FormatDetailDTO; +import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDTO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Collection; @@ -45,7 +45,7 @@ public interface StoreProductAttrService extends IService { * @param attrs value * @param productId 商品id */ - void insertYxStoreProductAttr(List items, List attrs, + void insertYxStoreProductAttr(List items, List attrs, Long productId); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java index 58930d9..a4bb6b4 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java @@ -7,8 +7,8 @@ import co.yixiang.yshop.module.product.dal.dataobject.storeproductattr.StoreProd import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.mysql.storeproductattr.StoreProductAttrMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproductattrvalue.StoreProductAttrValueMapper; -import co.yixiang.yshop.module.product.service.storeproduct.dto.FormatDetailDto; -import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.FormatDetailDTO; +import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDTO; import co.yixiang.yshop.module.product.service.storeproductattrresult.StoreProductAttrResultService; import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -77,11 +77,11 @@ public class StoreProductAttrServiceImpl extends ServiceImpl items, List attrs, + public void insertYxStoreProductAttr(List items, List attrs, Long productId) { List attrGroup = new ArrayList<>(); - for (FormatDetailDto formatDetailDto : items) { + for (FormatDetailDTO formatDetailDto : items) { StoreProductAttrDO storeProductAttr = StoreProductAttrDO.builder() .productId(productId) .attrName(formatDetailDto.getValue()) @@ -97,7 +97,7 @@ public class StoreProductAttrServiceImpl extends ServiceImpl valueGroup = new ArrayList<>(); - for (ProductFormatDto productFormatDto : attrs) { + for (ProductFormatDTO productFormatDto : attrs) { // if(productFormatDto.getPinkStock()>productFormatDto.getStock() || productFormatDto.getSeckillStock()>productFormatDto.getStock()){ // throw new BadRequestException("活动商品库存不能大于原有商品库存"); @@ -133,6 +133,8 @@ public class StoreProductAttrServiceImpl extends ServiceImpl getStoreProductAttrValueList(Collection ids); + List getStoreProductAttrValueListByUniques(Collection productAttrUniques); + + /** + * 通过商品id集合获得商品属性值列表 + * + * @param productIds 商品id集合 + * @return 商品属性值列表 + */ + List getStoreProductAttrValueByProductIds(List productIds); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattrvalue/StoreProductAttrValueServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattrvalue/StoreProductAttrValueServiceImpl.java index 8615353..9927829 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattrvalue/StoreProductAttrValueServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattrvalue/StoreProductAttrValueServiceImpl.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.product.service.storeproductattrvalue; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.mysql.storeproductattrvalue.StoreProductAttrValueMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -50,5 +51,17 @@ public class StoreProductAttrValueServiceImpl extends ServiceImpl getStoreProductAttrValueListByUniques(Collection productAttrUniques) { + return storeProductAttrValueMapper.selectList(new LambdaQueryWrapper() + .in(StoreProductAttrValueDO::getUnique, productAttrUniques)); + } + + @Override + public List getStoreProductAttrValueByProductIds(List productIds) { + return storeProductAttrValueMapper.selectList(new LambdaQueryWrapper() + .in(StoreProductAttrValueDO::getProductId, productIds)); + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoService.java new file mode 100644 index 0000000..66b426a --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoService.java @@ -0,0 +1,132 @@ +package co.yixiang.yshop.module.product.service.teamworkinfo; + +import java.util.*; +import javax.validation.*; + +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.param.TeamworkRefundParam; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.*; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppTeamworkProductDetailRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkReqVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkUserRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; +import co.yixiang.yshop.module.product.dal.dataobject.teamworkinfo.TeamworkInfoDO; + +/** + * 拼团信息 Service 接口 + * + * @author moxiangrong + */ +public interface TeamworkInfoService { + + /** + * 去成团 + * + * @param createReqVO 创建信息 + * @return + */ + Long toTeamwork(TeamworkInfoCreateVO createReqVO); + + + /** + * 获得拼团信息分页 + * + * @param pageReqVO 分页查询 + * @return 拼团信息分页 + */ + PageResult getTeamworkInfoPage(TeamworkInfoPageReqVO pageReqVO); + + + /** + * 获得拼团订单信息分页 + * + * @param pageReqVO 分页查询 + * @return 拼团信息分页 + */ + PageResult getTeamworkOrderInfoPage(TeamworkOrderInfoPageReqVO pageReqVO); + + /** + * 获取未成团的订单id + * @param campaignId + * @return + */ + List getNotTeamwork(Long campaignId); + + /** + * 修改拼团为失败 + * @param campaignId + * @return + */ + void updateTeamworkFail(Long campaignId); + + /** + * 拼团失败 + * @param teamworkId + * @param number + * @return + */ + void teamworkFail(Long teamworkId, Integer number); + + /** + * 拼团成功 + * @param teamworkId + * @return + */ + void teamworkSuccess(Long teamworkId); + + /** + * 拼团结束时间 + * @param teamworkId + * @return + */ + Long teamworkEndTime(Long teamworkId); + + /** + * 获取拼团状态 + * @param teamworkId + * @return + */ + Integer getTeamworkState(Long teamworkId); + + /** + * 获取待成团列表 + * @param reqVO + * @return + */ + List getWaitTeamworkList(AppWaitTeamworkReqVO reqVO); + + List getUserTeamworkList(Long id); + + AppTeamworkProductDetailRespVO getProductDetail(Long id); + + /** + * 参团判断 + * @param uid + * @param teamworkId + * @return + */ + void joinJudge(Long uid, Long teamworkId); + + /** + * 拼团查询 + * @param id + * @return + */ + TeamworkInfoDO get(Long id); + + /** + * 活动信息查询 + * @param id + * @return + */ + CampaignInfoDO getCampaignInfoById(Long id); + + /** + * 拼团售后处理 + * @param param + * @return + */ + void refundHandle(TeamworkRefundParam param); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoServiceImpl.java new file mode 100644 index 0000000..68af339 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/teamworkinfo/TeamworkInfoServiceImpl.java @@ -0,0 +1,279 @@ +package co.yixiang.yshop.module.product.service.teamworkinfo; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.constant.ShopConstants; +import co.yixiang.yshop.framework.common.util.date.DateUtils; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.param.TeamworkRefundParam; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppTeamworkProductDetailRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkReqVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkRespVO; +import co.yixiang.yshop.module.product.controller.app.teamworkinfo.vo.AppWaitTeamworkUserRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.campaigndetail.CampaignDetailDO; +import co.yixiang.yshop.module.product.dal.dataobject.campaigninfo.CampaignInfoDO; +import co.yixiang.yshop.module.product.dal.mysql.campaigndetail.CampaignDetailMapper; +import co.yixiang.yshop.module.product.dal.mysql.campaigninfo.CampaignInfoMapper; +import co.yixiang.yshop.module.product.enums.teamworkinfo.TeamworkStateEnum; +import co.yixiang.yshop.module.product.enums.teamworkinfo.TeamworkTypeEnum; +import co.yixiang.yshop.module.product.enums.teamworkinfo.VirtuallyEnum; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RBlockingDeque; +import org.redisson.api.RDelayedQueue; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; + +import co.yixiang.yshop.module.product.controller.admin.teamworkinfo.vo.*; +import co.yixiang.yshop.module.product.dal.dataobject.teamworkinfo.TeamworkInfoDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.product.convert.teamworkinfo.TeamworkInfoConvert; +import co.yixiang.yshop.module.product.dal.mysql.teamworkinfo.TeamworkInfoMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; + +/** + * 拼团信息 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +@Slf4j +public class TeamworkInfoServiceImpl implements TeamworkInfoService { + + @Resource + private TeamworkInfoMapper teamworkInfoMapper; + @Resource + private CampaignInfoMapper campaignInfoMapper; + @Resource + private CampaignDetailMapper campaignDetailMapper; + + @Resource + private RedissonClient redissonClient; + + + @Override + public Long toTeamwork(TeamworkInfoCreateVO createReqVO) { + CampaignDetailDO campaignDetailDO = campaignDetailMapper.selectById(createReqVO.getCampaignDetailId()); + CampaignInfoDO campaignInfoDO = campaignInfoMapper.selectById(campaignDetailDO.getCampaignId()); + TeamworkInfoDO teamworkInfoDO = null; + // 判断拼团类型 + if (ObjectUtil.isNull(createReqVO.getTeamworkId()) || + TeamworkTypeEnum.INITIATE.equals(createReqVO.getTeamworkType())) { + teamworkInfoDO = new TeamworkInfoDO(); + teamworkInfoDO.setCampaignDetailId(campaignDetailDO.getId()); + teamworkInfoDO.setCampaignId(campaignInfoDO.getId()); + teamworkInfoDO.setRegimentalCommanderId(createReqVO.getUid()); + teamworkInfoDO.setPeople(1); + teamworkInfoDO.setState(TeamworkStateEnum.IN_PROGRESS.getValue()); + teamworkInfoMapper.insert(teamworkInfoDO); + addQueue(teamworkInfoDO.getId(), campaignInfoDO.getEffectiveTime() * 60 * 1000); + } else { + teamworkInfoDO = validateTeamworkInfoExists(createReqVO.getTeamworkId()); + // 拼团成功 + if (teamworkInfoDO.getPeople() + 1 >= campaignInfoDO.getPerson()) { + removeQueue(teamworkInfoDO.getId()); + teamworkInfoDO.setState(TeamworkStateEnum.SUCCESS.getValue()); + } + teamworkInfoDO.setPeople(teamworkInfoDO.getPeople() + 1); + teamworkInfoMapper.updateById(teamworkInfoDO); + } + return teamworkInfoDO.getId(); + } + + + private TeamworkInfoDO validateTeamworkInfoExists(Long id) { + TeamworkInfoDO teamworkInfoDO = teamworkInfoMapper.selectById(id); + if (ObjectUtil.isNull(teamworkInfoDO)) { + throw exception(TEAMWORK_INFO_NOT_EXISTS); + } + return teamworkInfoDO; + } + + + @Override + public PageResult getTeamworkInfoPage(TeamworkInfoPageReqVO pageReqVO) { + Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + List list = teamworkInfoMapper.getTeamworkInfoPage(page, pageReqVO); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public PageResult getTeamworkOrderInfoPage(TeamworkOrderInfoPageReqVO pageReqVO) { + Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + List list = teamworkInfoMapper.getTeamworkOrderInfoPage(page, pageReqVO); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List getNotTeamwork(Long campaignId) { + return teamworkInfoMapper.getNotTeamwork(campaignId); + } + + @Override + public void updateTeamworkFail(Long campaignId) { + teamworkInfoMapper.teamworkFail(campaignId); + } + + @Override + public void teamworkFail(Long teamworkId, Integer number) { + TeamworkInfoDO teamworkInfoDO = validateTeamworkInfoExists(teamworkId); + // 退回活动库存 + CampaignDetailDO campaignDetailDO = campaignDetailMapper.selectById(teamworkInfoDO.getCampaignDetailId()); + campaignDetailMapper.updateById(new CampaignDetailDO().setId(campaignDetailDO.getId()) + .setStock(campaignDetailDO.getStock() + number)); + // 修改状态为拼团失败 + teamworkInfoMapper.updateById(new TeamworkInfoDO().setId(teamworkId).setState(TeamworkStateEnum.FAIL.getValue())); + } + + @Override + public void teamworkSuccess(Long teamworkId) { + teamworkInfoMapper.updateById(new TeamworkInfoDO() + .setState(TeamworkStateEnum.SUCCESS.getValue()).setId(teamworkId)); + } + + @Override + public Long teamworkEndTime(Long teamworkId) { + TeamworkInfoDO teamworkInfoDO = this.validateTeamworkInfoExists(teamworkId); + if (!TeamworkStateEnum.IN_PROGRESS.getValue().equals(teamworkInfoDO.getState())) { + return null; + } + CampaignInfoDO campaignInfoDO = campaignInfoMapper.selectById(teamworkInfoDO.getCampaignId()); + // 计算取消时间 + LocalDateTime cancelTime = + DateUtils.getMoreMinuteAfter(teamworkInfoDO.getCreateTime(), campaignInfoDO.getEffectiveTime()); + return DateUtils.toTimeStamp(cancelTime); + } + + @Override + public Integer getTeamworkState(Long teamworkId) { + return this.validateTeamworkInfoExists(teamworkId).getState(); + } + + @Override + public List getWaitTeamworkList(AppWaitTeamworkReqVO reqVO) { + List waitTeamworkRespVOS = teamworkInfoMapper.getWaitTeamworkList(reqVO); + if (CollectionUtils.isEmpty(waitTeamworkRespVOS)) return new ArrayList<>(); + List ids = waitTeamworkRespVOS.stream().map(AppWaitTeamworkRespVO::getId).collect(Collectors.toList()); + List waitTeamworkUserRespVOS = teamworkInfoMapper.getWaitTeamworkHeadList(ids); + Map map = + waitTeamworkUserRespVOS.stream().collect(Collectors + .toMap(AppWaitTeamworkUserRespVO::getId, Function.identity())); + for (AppWaitTeamworkRespVO respVO : waitTeamworkRespVOS) { + respVO.setUser(map.get(respVO.getId())); + respVO.setCloseTime(DateUtils.getMoreMinuteAfter(respVO.getCreateTime(), respVO.getEffectiveTime())); + } + return waitTeamworkRespVOS; + } + + @Override + public List getUserTeamworkList(Long id) { + return teamworkInfoMapper.getWaitTeamworkUserList(id); + } + + @Override + public AppTeamworkProductDetailRespVO getProductDetail(Long id) { + AppTeamworkProductDetailRespVO detailRespVO = teamworkInfoMapper.getProductDetail(id); + if (ObjectUtil.isNull(detailRespVO)) { + return new AppTeamworkProductDetailRespVO(); + } + TeamworkInfoDO teamworkInfoDO = validateTeamworkInfoExists(id); + CampaignInfoDO campaignInfoDO = campaignInfoMapper.selectById(teamworkInfoDO.getCampaignId()); + List users = teamworkInfoMapper.getWaitTeamworkUserList(id); + // 判断是否虚拟成团 + if (VirtuallyEnum.YES.getValue().equals(campaignInfoDO.getIsVirtually()) && + TeamworkStateEnum.SUCCESS.getValue().equals(teamworkInfoDO.getState())) { + // 虚拟人数 + Integer virtualNumber = campaignInfoDO.getPerson() - teamworkInfoDO.getPeople(); + // 随机查询头像 + List userIds = users.stream().map(AppWaitTeamworkUserRespVO::getUid).collect(Collectors.toList()); + List avatars = teamworkInfoMapper.randomAvatar(userIds, virtualNumber); + for (String avatar : avatars) users.add(new AppWaitTeamworkUserRespVO().setNickname(avatar)); + } + detailRespVO.setUsers(users); + return detailRespVO; + } + + @Override + public void joinJudge(Long uid, Long teamworkId) { + if (CollectionUtils.isNotEmpty(teamworkInfoMapper.joinJudge(uid, teamworkId))) + throw exception(TEAMWORK_REPEAT_JOIN_ERROR); + } + + @Override + public TeamworkInfoDO get(Long id) { + return validateTeamworkInfoExists(id); + } + + @Override + public CampaignInfoDO getCampaignInfoById(Long id) { + TeamworkInfoDO teamworkInfoDO = validateTeamworkInfoExists(id); + return campaignInfoMapper.selectById(teamworkInfoDO.getCampaignId()); + } + + @Override + public void refundHandle(TeamworkRefundParam param) { + TeamworkInfoDO teamworkInfoDO = validateTeamworkInfoExists(param.getId()); + TeamworkInfoDO updateDO = new TeamworkInfoDO(); + updateDO.setId(teamworkInfoDO.getId()); + // 如果当前拼团只有一人,直接结束拼团 + if (teamworkInfoDO.getPeople() == 1) { + updateDO.setState(TeamworkStateEnum.FAIL.getValue()); + } else { + updateDO.setPeople(teamworkInfoDO.getPeople() - 1); + // 下一个人成为团长 + updateDO.setRegimentalCommanderId(teamworkInfoMapper.getMember(param.getUid(), param.getId())); + } + teamworkInfoMapper.updateById(updateDO); + } + + + /** + * 加入延时队列 + * + * @param id + * @param time + */ + private void addQueue(Long id, long time) { + try { + log.info("添加延时队列 ,拼团id:{}, 延时时间:{}", id, time); + RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(ShopConstants.TEAMWORK_CHANGE); + RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); + delayedQueue.offer(id, time, TimeUnit.MILLISECONDS); + } catch (Exception e) { + e.printStackTrace(); + throw exception(CAMPAIGN_ADD_QUEUE_ERROR, e.getMessage()); + } + } + + /** + * 从延时队列中移除 + * + * @param id + */ + private void removeQueue(Long id) { + try { + RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(ShopConstants.TEAMWORK_CHANGE); + RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); + delayedQueue.remove(id); + log.info("移除延时队列成功 ,拼团id:{}", id); + } catch (Exception e) { + e.printStackTrace(); + throw exception(CAMPAIGN_REMOVE_QUEUE_ERROR, e.getMessage()); + } + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/backuprecord/BackupRecordMapper.xml b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/backuprecord/BackupRecordMapper.xml index e74978b..397daa5 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/backuprecord/BackupRecordMapper.xml +++ b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/backuprecord/BackupRecordMapper.xml @@ -19,7 +19,7 @@ TRUNCATE TABLE yshop_store_product_bak; @@ -30,6 +30,8 @@ TRUNCATE TABLE yshop_store_product_coupon_bak; TRUNCATE TABLE yshop_store_product_coupon_relation_bak; TRUNCATE TABLE yshop_store_product_rule_bak; + TRUNCATE TABLE yshop_material_bak; + TRUNCATE TABLE yshop_material_group_bak; insert into yshop_store_product_bak select * from yshop_store_product; insert into yshop_store_product_attr_bak select * from yshop_store_product_attr; insert into yshop_store_product_attr_value_bak select * from yshop_store_product_attr_value; @@ -38,6 +40,8 @@ insert into yshop_store_product_coupon_bak select * from yshop_store_product_coupon; insert into yshop_store_product_coupon_relation_bak select * from yshop_store_product_coupon_relation; insert into yshop_store_product_rule_bak select * from yshop_store_product_rule; + insert into yshop_material_bak select * from yshop_material; + insert into yshop_material_group_bak select * from yshop_material_group; + + + + + update yshop_campaign_detail set deleted = 1 + where campaign_id = #{campaignId} + + + + + + + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/campaigninfo/CampaignInfoMapper.xml b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/campaigninfo/CampaignInfoMapper.xml new file mode 100644 index 0000000..fa3252a --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/campaigninfo/CampaignInfoMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + update yshop_campaign_detail as ycd + join yshop_store_product_attr_value as yspav + on ycd.sku_id = yspav.id + join yshop_campaign_info as yci on yci.id = ycd.campaign_id + set ycd.stock = ycd.stock - #{number} + where yspav.`unique` = #{productAttrUnique} and yci.state = 1 + + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml index a9df893..538214a 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml +++ b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml @@ -35,4 +35,17 @@ + + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/teamworkinfo/TeamworkInfoMapper.xml b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/teamworkinfo/TeamworkInfoMapper.xml new file mode 100644 index 0000000..1ed5949 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/teamworkinfo/TeamworkInfoMapper.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + update yshop_teamwork_info set state = 2 + where state = 0 and campaign_id = #{campaignId} + + + + + + + + + + + + + + + + + + diff --git a/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/ErrorCodeConstants.java b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/ErrorCodeConstants.java index b017b32..6ea8907 100644 --- a/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/ErrorCodeConstants.java +++ b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/ErrorCodeConstants.java @@ -14,6 +14,26 @@ public interface ErrorCodeConstants { ErrorCode MATERIAL_GROUP_NOT_EXISTS = new ErrorCode(1009001001, "素材分组不存在"); // ========== 商品规则值(规格) ========== + // ========== 门店 ========== + ErrorCode SHOP_NOT_EXISTS = new ErrorCode(1009001002, "门店不存在"); + // ========== 门店店员 ========== + ErrorCode SHOP_ASSISTANT_NOT_EXISTS = new ErrorCode(1009001003, "门店店员不存在"); + ErrorCode SHOP_ASSISTANT_NOT_WRITE_OFF = new ErrorCode(1009001004, "当前用户无核销权限"); + ErrorCode SHOP_ASSISTANT_EXIST = new ErrorCode(1009001005, "当前用户已经是店员"); + // ========== 画布信息 ========== + ErrorCode CANVAS_NOT_EXISTS = new ErrorCode(1009002000, "装修信息不存在!"); + + ErrorCode CANVAS_USED = new ErrorCode(1009002001, "装修已被使用,请先关闭!"); + + ErrorCode CANVAS_DETAIL_NOT_EXISTS = new ErrorCode(1009002002, "装修详情信息不存在!"); + + // ========== 广告弹窗 ========== + ErrorCode POPUP_NOT_EXISTS = new ErrorCode(1009003000, "广告信息不存在!"); + + ErrorCode POPUP_NOT_REPEAT = new ErrorCode(1009003001, "广告时间存在交叉!"); + + ErrorCode POPUP_ADD_QUEUE_ERROR = new ErrorCode(1009003002, " 广告弹窗加入活动队列失败,失败信息:{}!"); + ErrorCode POPUP_REMOVE_QUEUE_ERROR = new ErrorCode(1009003003, " 广告弹窗移除活动队列失败,失败信息:{}!"); } diff --git a/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/canvas/CanvasTerminalEnum.java b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/canvas/CanvasTerminalEnum.java new file mode 100644 index 0000000..32571dd --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/canvas/CanvasTerminalEnum.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.shop.enums.canvas; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 画布终端类型枚举 + */ +@Getter +@AllArgsConstructor +public enum CanvasTerminalEnum { + MINI(1,"小程序"), + H5(2,"h5"), + APP(3,"APP"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/common/StateEnum.java b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/common/StateEnum.java new file mode 100644 index 0000000..5809b0a --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/common/StateEnum.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.shop.enums.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 状态通用类型枚举 + */ +@Getter +@AllArgsConstructor +public enum StateEnum { + CLOSE(0,"关闭"), + OPEN(1,"开启"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/popup/PopupJumpTypeEnum.java b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/popup/PopupJumpTypeEnum.java new file mode 100644 index 0000000..40a49a8 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-api/src/main/java/co/yixiang/yshop/module/shop/enums/popup/PopupJumpTypeEnum.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.shop.enums.popup; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author moxiangrong + * 弹窗跳转类型枚举 + */ +@Getter +@AllArgsConstructor +public enum PopupJumpTypeEnum { + NO_JUMP(0,"不跳转"), + PRODUCT(1,"商品"), + CATEGORY(2,"分类"), + COUPON(3,"优惠券"), + MINI_PROGRAM(4,"小程序"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/pom.xml b/yshop-module-mall/yshop-module-shop-biz/pom.xml index daedb03..7f349eb 100644 --- a/yshop-module-mall/yshop-module-shop-biz/pom.xml +++ b/yshop-module-mall/yshop-module-shop-biz/pom.xml @@ -23,6 +23,12 @@ ${revision} + + co.yixiang.boot + yshop-module-member-biz + ${revision} + + co.yixiang.boot diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/CanvasController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/CanvasController.java new file mode 100644 index 0000000..19c577d --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/CanvasController.java @@ -0,0 +1,123 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas; + +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.canvas.CanvasDO; +import co.yixiang.yshop.module.shop.convert.canvas.CanvasConvert; +import co.yixiang.yshop.module.shop.service.canvas.CanvasService; + +@Tag(name = "管理后台 - 画布信息") +@RestController +@RequestMapping("/shop/canvas") +@Validated +public class CanvasController { + + @Resource + private CanvasService canvasService; + + @PostMapping("/create") + @Operation(summary = "创建画布信息") + @PreAuthorize("@ss.hasPermission('shop:canvas:create')") + public CommonResult createCanvas(@Valid @RequestBody CanvasCreateReqVO createReqVO) { + return success(canvasService.createCanvas(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新画布信息") + @PreAuthorize("@ss.hasPermission('shop:canvas:update')") + public CommonResult updateCanvas(@Valid @RequestBody CanvasUpdateReqVO updateReqVO) { + canvasService.updateCanvas(updateReqVO); + return success(true); + } + + @PutMapping("/update-json") + @Operation(summary = "更新画布json") + @PreAuthorize("@ss.hasPermission('shop:canvas:update-json')") + public CommonResult updateCanvasJson(@Valid @RequestBody CanvasJsonUpdateReqVO jsonUpdateReqVO) { + canvasService.updateCanvasJson(jsonUpdateReqVO); + return success(true); + } + + @GetMapping("/use") + @Operation(summary = "应用画布") + @PreAuthorize("@ss.hasPermission('shop:canvas:use')") + public CommonResult useCanvas(@RequestParam("id") Long id) { + canvasService.useCanvas(id); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除画布信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('shop:canvas:delete')") + public CommonResult deleteCanvas(@RequestParam("id") Long id) { + canvasService.deleteCanvas(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得画布信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('shop:canvas:query')") + public CommonResult getCanvas(@RequestParam("id") Long id) { + return success(canvasService.getCanvas(id)); + } + + @GetMapping("/getDetail") + @Operation(summary = "获得画布明细信息") + @PreAuthorize("@ss.hasPermission('shop:canvas:query-detail')") + public CommonResult getCanvasDetail(@Valid CanvasDetailReqVO reqVO) { + return success(canvasService.getCanvasDetail(reqVO)); + } + + @GetMapping("/list") + @Operation(summary = "获得画布信息列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('shop:canvas:query')") + public CommonResult> getCanvasList(@RequestParam("ids") Collection ids) { + List list = canvasService.getCanvasList(ids); + return success(CanvasConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得画布信息分页") + @PreAuthorize("@ss.hasPermission('shop:canvas:query')") + public CommonResult> getCanvasPage(@Valid CanvasPageReqVO pageVO) { + PageResult pageResult = canvasService.getCanvasPage(pageVO); + return success(CanvasConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出画布信息 Excel") + @PreAuthorize("@ss.hasPermission('shop:canvas:export')") + @OperateLog(type = EXPORT) + public void exportCanvasExcel(@Valid CanvasExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = canvasService.getCanvasList(exportReqVO); + // 导出 Excel + List datas = CanvasConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "画布信息.xls", "数据", CanvasExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasBaseVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasBaseVO.java new file mode 100644 index 0000000..f740679 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasBaseVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 画布信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CanvasBaseVO { + + @Schema(description = "名称", required = true, example = "yshop") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "画布类型 1-首页 2-我的", required = true) + @NotNull(message = "画布类型不能为空") + private Integer type; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasCreateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasCreateReqVO.java new file mode 100644 index 0000000..d1475a9 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasCreateReqVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 画布信息创建 Request VO") +@Data +@ToString(callSuper = true) +public class CanvasCreateReqVO{ + @Schema(description = "名称", required = true, example = "yshop") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "画布类型 1-首页 2-我的", required = true) + @NotNull(message = "画布类型不能为空") + private Integer type; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasDetailReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasDetailReqVO.java new file mode 100644 index 0000000..8bd44c1 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasDetailReqVO.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 画布信息分页 Request VO") +@Data +@ToString(callSuper = true) +public class CanvasDetailReqVO{ + + @Schema(description = "画布id", required = true, example = "18674") + private Long id; + + @Schema(description = "终端类型", required = true, example = "18674") + private Long terminal; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExcelVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExcelVO.java new file mode 100644 index 0000000..a3cab30 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExcelVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 画布信息 Excel VO + * + * @author moxiangrong + */ +@Data +public class CanvasExcelVO { + + @ExcelProperty("画布id") + private Long id; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("状态 0-关闭 1-开启") + private Integer state; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExportReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExportReqVO.java new file mode 100644 index 0000000..669d143 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasExportReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 画布信息 Excel 导出 Request VO,参数和 CanvasPageReqVO 是一致的") +@Data +public class CanvasExportReqVO { + + @Schema(description = "名称", example = "yshop") + private String name; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasJsonUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasJsonUpdateReqVO.java new file mode 100644 index 0000000..845a39d --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasJsonUpdateReqVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 画布json更新 Request VO") +@Data +@ToString(callSuper = true) +public class CanvasJsonUpdateReqVO { + + @Schema(description = "画布id", required = true) + @NotNull(message = "画布id不能为空") + private Long id; + + @Schema(description = "终端 1-小程序 2-H5 3-APP", required = true) + @NotNull(message = "终端 1-小程序 2-H5 3-APP不能为空") + private Integer terminal; + + @Schema(description = "画布json数据") + private String json; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageReqVO.java new file mode 100644 index 0000000..d3efcc1 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageReqVO.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 画布信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CanvasPageReqVO extends PageParam { + + @Schema(description = "名称", example = "yshop") + private String name; + + @Schema(description = "画布类型 1-首页 2-我的", required = true) + private Integer type; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageRespVO.java new file mode 100644 index 0000000..cd8ee1b --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasPageRespVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 画布分页信息 Response VO") +@Data +@ToString(callSuper = true) +public class CanvasPageRespVO { + + @Schema(description = "画布id", required = true, example = "18674") + private Long id; + + @Schema(description = "名称", required = true, example = "yshop") + private String name; + + @Schema(description = "画布类型 1-首页 2-我的", required = true) + private Integer type; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasRespVO.java new file mode 100644 index 0000000..6dddcb8 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasRespVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 画布信息 Response VO") +@Data +@ToString(callSuper = true) +public class CanvasRespVO { + + @Schema(description = "画布id", required = true, example = "18674") + private Long id; + + @Schema(description = "名称", required = true, example = "yshop") + private String name; + + @Schema(description = "画布类型 1-首页 2-我的", required = true) + private Integer type; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasUpdateReqVO.java new file mode 100644 index 0000000..4a24260 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvas/vo/CanvasUpdateReqVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 画布信息更新 Request VO") +@Data +@ToString(callSuper = true) +public class CanvasUpdateReqVO { + + @Schema(description = "画布id", required = true, example = "18674") + @NotNull(message = "画布id不能为空") + private Long id; + + @Schema(description = "名称", required = true, example = "yshop") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "画布类型 1-首页 2-我的", required = true) + @NotNull(message = "画布类型不能为空") + private Integer type; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailBaseVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailBaseVO.java new file mode 100644 index 0000000..342aee9 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailBaseVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 画布明细 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CanvasDetailBaseVO { + + @Schema(description = "画布id", required = true, example = "8875") + @NotNull(message = "画布id不能为空") + private Long canvasId; + + @Schema(description = "终端 1-小程序 2-H5 3-APP", required = true) + @NotNull(message = "终端 1-小程序 2-H5 3-APP不能为空") + private Integer terminal; + + @Schema(description = "画布json数据") + private String json; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailRespVO.java new file mode 100644 index 0000000..f95bfe1 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailRespVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 画布明细 Response VO") +@Data +@ToString(callSuper = true) +public class CanvasDetailRespVO { + + @Schema(description = "画布明细id", required = true, example = "15252") + private Long id; + + @Schema(description = "终端 1-小程序 2-H5 3-APP", required = true) + @NotNull(message = "终端 1-小程序 2-H5 3-APP不能为空") + private Integer terminal; + + @Schema(description = "画布json数据") + private String json; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailUpdateReqVO.java new file mode 100644 index 0000000..cc62c74 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/canvasdetail/vo/CanvasDetailUpdateReqVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 画布明细更新请求 VO") +@Data +@ToString(callSuper = true) +public class CanvasDetailUpdateReqVO { + + @Schema(description = "终端 1-小程序 2-H5 3-APP", required = true) + @NotNull(message = "终端 1-小程序 2-H5 3-APP不能为空") + private Integer terminal; + + @Schema(description = "画布json数据") + private String json; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/MaterialController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/MaterialController.java index 30341d2..e12371c 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/MaterialController.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/MaterialController.java @@ -39,14 +39,14 @@ public class MaterialController { @PostMapping("/create") @Operation(summary = "创建素材库") - @PreAuthorize("@ss.hasPermission('shop:material:create')") +// @PreAuthorize("@ss.hasPermission('shop:material:create')") public CommonResult createMaterial(@Valid @RequestBody MaterialCreateReqVO createReqVO) { return success(materialService.createMaterial(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新素材库") - @PreAuthorize("@ss.hasPermission('shop:material:update')") + // @PreAuthorize("@ss.hasPermission('shop:material:update')") public CommonResult updateMaterial(@Valid @RequestBody MaterialUpdateReqVO updateReqVO) { materialService.updateMaterial(updateReqVO); return success(true); @@ -55,7 +55,7 @@ public class MaterialController { @DeleteMapping("/delete") @Operation(summary = "删除素材库") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('shop:material:delete')") +// @PreAuthorize("@ss.hasPermission('shop:material:delete')") public CommonResult deleteMaterial(@RequestParam("id") Long id) { materialService.deleteMaterial(id); return success(true); @@ -64,7 +64,7 @@ public class MaterialController { @GetMapping("/get") @Operation(summary = "获得素材库") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('shop:material:query')") +// @PreAuthorize("@ss.hasPermission('shop:material:query')") public CommonResult getMaterial(@RequestParam("id") Long id) { MaterialDO material = materialService.getMaterial(id); return success(MaterialConvert.INSTANCE.convert(material)); @@ -73,7 +73,7 @@ public class MaterialController { @GetMapping("/list") @Operation(summary = "获得素材库列表") @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('shop:material:query')") +// @PreAuthorize("@ss.hasPermission('shop:material:query')") public CommonResult> getMaterialList(@RequestParam("ids") Collection ids) { List list = materialService.getMaterialList(ids); return success(MaterialConvert.INSTANCE.convertList(list)); @@ -81,7 +81,7 @@ public class MaterialController { @GetMapping("/page") @Operation(summary = "获得素材库分页") - @PreAuthorize("@ss.hasPermission('shop:material:query')") +// @PreAuthorize("@ss.hasPermission('shop:material:query')") public CommonResult> getMaterialPage(@Valid MaterialPageReqVO pageVO) { PageResult pageResult = materialService.getMaterialPage(pageVO); return success(MaterialConvert.INSTANCE.convertPage(pageResult)); @@ -89,7 +89,7 @@ public class MaterialController { @GetMapping("/export-excel") @Operation(summary = "导出素材库 Excel") - @PreAuthorize("@ss.hasPermission('shop:material:export')") + // @PreAuthorize("@ss.hasPermission('shop:material:export')") @OperateLog(type = EXPORT) public void exportMaterialExcel(@Valid MaterialExportReqVO exportReqVO, HttpServletResponse response) throws IOException { @@ -99,4 +99,12 @@ public class MaterialController { ExcelUtils.write(response, "素材库.xls", "数据", MaterialExcelVO.class, datas); } + // 批量修改分组 + @PostMapping("/batch-update-group") + @Operation(summary = "批量修改分组") + public CommonResult batchUpdateGroup(@Valid @RequestBody MaterialBatchUpdateGroupReqVO materialBatchUpdateGroupReqVO) { + materialService.batchUpdateGroup(materialBatchUpdateGroupReqVO); + return success(Boolean.TRUE); + } + } diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBaseVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBaseVO.java index 211ba6d..fc79363 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBaseVO.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBaseVO.java @@ -14,14 +14,14 @@ import javax.validation.constraints.*; @Data public class MaterialBaseVO { - @Schema(description = "类型1、图片;2、视频", required = true, example = "2") + @Schema(description = "类型1、图片;2、视频", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @NotNull(message = "类型1、图片;2、视频不能为空") private String type; @Schema(description = "分组ID", example = "21579") private String groupId; - @Schema(description = "素材名", required = true, example = "yshop") + @Schema(description = "素材名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshop") @NotNull(message = "素材名不能为空") private String name; diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBatchUpdateGroupReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBatchUpdateGroupReqVO.java new file mode 100644 index 0000000..899088e --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialBatchUpdateGroupReqVO.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.shop.controller.admin.material.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 素材库更新 Request VO") +@Data +@ToString(callSuper = true) +public class MaterialBatchUpdateGroupReqVO { + + @Schema(description = "编号ids") + private List ids; + + @Schema(description = "分组ID") + private String grouupId; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialRespVO.java index 02a2580..d3118d3 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialRespVO.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialRespVO.java @@ -10,10 +10,10 @@ import java.time.LocalDateTime; @ToString(callSuper = true) public class MaterialRespVO extends MaterialBaseVO { - @Schema(description = "编号", required = true, example = "9920") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9920") private Long id; - @Schema(description = "创建时间", required = true) + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; } diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialUpdateReqVO.java index 5a5ba69..d41c320 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialUpdateReqVO.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/material/vo/MaterialUpdateReqVO.java @@ -11,7 +11,7 @@ import javax.validation.constraints.*; @ToString(callSuper = true) public class MaterialUpdateReqVO extends MaterialBaseVO { - @Schema(description = "编号", required = true, example = "9920") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9920") @NotNull(message = "编号不能为空") private Long id; diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/materialgroup/MaterialGroupController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/materialgroup/MaterialGroupController.java index 17d712a..a05b333 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/materialgroup/MaterialGroupController.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/materialgroup/MaterialGroupController.java @@ -39,14 +39,14 @@ public class MaterialGroupController { @PostMapping("/create") @Operation(summary = "创建素材分组") - @PreAuthorize("@ss.hasPermission('shop:material-group:create')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:create')") public CommonResult createMaterialGroup(@Valid @RequestBody MaterialGroupCreateReqVO createReqVO) { return success(materialGroupService.createMaterialGroup(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新素材分组") - @PreAuthorize("@ss.hasPermission('shop:material-group:update')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:update')") public CommonResult updateMaterialGroup(@Valid @RequestBody MaterialGroupUpdateReqVO updateReqVO) { materialGroupService.updateMaterialGroup(updateReqVO); return success(true); @@ -55,7 +55,7 @@ public class MaterialGroupController { @DeleteMapping("/delete") @Operation(summary = "删除素材分组") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('shop:material-group:delete')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:delete')") public CommonResult deleteMaterialGroup(@RequestParam("id") Long id) { materialGroupService.deleteMaterialGroup(id); return success(true); @@ -64,7 +64,7 @@ public class MaterialGroupController { @GetMapping("/get") @Operation(summary = "获得素材分组") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('shop:material-group:query')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:query')") public CommonResult getMaterialGroup(@RequestParam("id") Long id) { MaterialGroupDO materialGroup = materialGroupService.getMaterialGroup(id); return success(MaterialGroupConvert.INSTANCE.convert(materialGroup)); @@ -73,7 +73,7 @@ public class MaterialGroupController { @GetMapping("/list") @Operation(summary = "获得素材分组列表") //@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('shop:material-group:query')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:query')") public CommonResult> getMaterialGroupList() { MaterialGroupExportReqVO exportReqVO = new MaterialGroupExportReqVO(); List list = materialGroupService.getMaterialGroupList(exportReqVO); @@ -82,7 +82,7 @@ public class MaterialGroupController { @GetMapping("/page") @Operation(summary = "获得素材分组分页") - @PreAuthorize("@ss.hasPermission('shop:material-group:query')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:query')") public CommonResult> getMaterialGroupPage(@Valid MaterialGroupPageReqVO pageVO) { PageResult pageResult = materialGroupService.getMaterialGroupPage(pageVO); return success(MaterialGroupConvert.INSTANCE.convertPage(pageResult)); @@ -90,7 +90,7 @@ public class MaterialGroupController { @GetMapping("/export-excel") @Operation(summary = "导出素材分组 Excel") - @PreAuthorize("@ss.hasPermission('shop:material-group:export')") +// @PreAuthorize("@ss.hasPermission('shop:material-group:export')") @OperateLog(type = EXPORT) public void exportMaterialGroupExcel(@Valid MaterialGroupExportReqVO exportReqVO, HttpServletResponse response) throws IOException { diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/PopupController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/PopupController.java new file mode 100644 index 0000000..14a3002 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/PopupController.java @@ -0,0 +1,88 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.popup.PopupDO; +import co.yixiang.yshop.module.shop.convert.popup.PopupConvert; +import co.yixiang.yshop.module.shop.service.popup.PopupService; + +@Tag(name = "管理后台 - 弹窗") +@RestController +@RequestMapping("/shop/popup") +@Validated +public class PopupController { + + @Resource + private PopupService popupService; + + @PostMapping("/create") + @Operation(summary = "创建弹窗") + @PreAuthorize("@ss.hasPermission('shop:popup:create')") + public CommonResult createPopup(@Valid @RequestBody PopupCreateReqVO createReqVO) { + return success(popupService.createPopup(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新弹窗") + @PreAuthorize("@ss.hasPermission('shop:popup:update')") + public CommonResult updatePopup(@Valid @RequestBody PopupUpdateReqVO updateReqVO) { + popupService.updatePopup(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除弹窗") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('shop:popup:delete')") + public CommonResult deletePopup(@RequestParam("id") Long id) { + popupService.deletePopup(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得弹窗") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('shop:popup:query')") + public CommonResult getPopup(@RequestParam("id") Long id) { + PopupDO popup = popupService.getPopup(id); + return success(PopupConvert.INSTANCE.convert(popup)); + } + + @GetMapping("/list") + @Operation(summary = "获得弹窗列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('shop:popup:query')") + public CommonResult> getPopupList(@RequestParam("ids") Collection ids) { + List list = popupService.getPopupList(ids); + return success(PopupConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得弹窗分页") + @PreAuthorize("@ss.hasPermission('shop:popup:query')") + public CommonResult> getPopupPage(@Valid PopupPageReqVO pageVO) { + PageResult pageResult = popupService.getPopupPage(pageVO); + return success(PopupConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/param/PopupCheckParam.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/param/PopupCheckParam.java new file mode 100644 index 0000000..ced7c34 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/param/PopupCheckParam.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +@Data +public class PopupCheckParam { + + @Schema(description = "弹窗id", required = true) + private Long popupId; + + @Schema(description = "开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + private LocalDateTime endTime; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupBaseVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupBaseVO.java new file mode 100644 index 0000000..5ba3fe3 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupBaseVO.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 弹窗 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class PopupBaseVO { + + @Schema(description = "名称", required = true, example = "赵六") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + @NotNull(message = "结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "弹窗图", required = true) + @NotNull(message = "弹窗图不能为空") + private String popupImage; + + @Schema(description = "按钮图", required = true) + @NotNull(message = "按钮图不能为空") + private String buttonImage; + + @Schema(description = "跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序", required = true, example = "2") + @NotNull(message = "跳转类型不能为空") + private Integer type; + + @Schema(description = "链接") + private String link; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupCreateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupCreateReqVO.java new file mode 100644 index 0000000..01a6d78 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupCreateReqVO.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup.vo; + +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 弹窗创建 Request VO") +@Data +@ToString(callSuper = true) +public class PopupCreateReqVO{ + + @Schema(description = "名称", required = true, example = "赵六") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + @NotNull(message = "结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "弹窗图", required = true) + @NotNull(message = "弹窗图不能为空") + private String popupImage; + + @Schema(description = "按钮图", required = true) + @NotNull(message = "按钮图不能为空") + private String buttonImage; + + @Schema(description = "跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序", required = true, example = "2") + @NotNull(message = "跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序不能为空") + private Byte type; + + @Schema(description = "链接") + private String link; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupPageReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupPageReqVO.java new file mode 100644 index 0000000..7c876b5 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupPageReqVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 弹窗分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PopupPageReqVO extends PageParam { + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序", example = "2") + private Integer type; + + @Schema(description = "状态 0-关闭 1-开启") + private Integer state; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupRespVO.java new file mode 100644 index 0000000..32214f5 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 弹窗 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PopupRespVO extends PopupBaseVO { + + @Schema(description = "弹窗id", required = true, example = "10459") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupUpdateReqVO.java new file mode 100644 index 0000000..1978250 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/popup/vo/PopupUpdateReqVO.java @@ -0,0 +1,46 @@ +package co.yixiang.yshop.module.shop.controller.admin.popup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 弹窗更新 Request VO") +@Data +@ToString(callSuper = true) +public class PopupUpdateReqVO{ + + @Schema(description = "弹窗id", required = true, example = "10459") + @NotNull(message = "弹窗id不能为空") + private Long id; + + @Schema(description = "名称", required = true, example = "赵六") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + @NotNull(message = "结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "弹窗图", required = true) + @NotNull(message = "弹窗图不能为空") + private String popupImage; + + @Schema(description = "按钮图", required = true) + @NotNull(message = "按钮图不能为空") + private String buttonImage; + + @Schema(description = "跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序", required = true, example = "2") + @NotNull(message = "跳转类型不能为空") + private Integer type; + + @Schema(description = "链接") + private String link; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/ShopController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/ShopController.java new file mode 100644 index 0000000..14043ca --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/ShopController.java @@ -0,0 +1,109 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.*; +import co.yixiang.yshop.module.shop.convert.shop.ShopConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; +import co.yixiang.yshop.module.shop.service.shop.ShopService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 门店") +@RestController +@RequestMapping("/mall/shop") +@Validated +public class ShopController { + + @Resource + private ShopService shopService; + + @PostMapping("/create") + @Operation(summary = "创建门店") + @PreAuthorize("@ss.hasPermission('mall:shop:create')") + public CommonResult createShop(@Valid @RequestBody ShopCreateReqVO createReqVO) { + return success(shopService.createShop(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新门店") + @PreAuthorize("@ss.hasPermission('mall:shop:update')") + public CommonResult updateShop(@Valid @RequestBody ShopUpdateReqVO updateReqVO) { + shopService.updateShop(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除门店") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mall:shop:delete')") + public CommonResult deleteShop(@RequestParam("id") Long id) { + shopService.deleteShop(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得门店") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mall:shop:query')") + public CommonResult getShop(@RequestParam("id") Long id) { + ShopDO shop = shopService.getShop(id); + return success(ShopConvert.INSTANCE.convert(shop)); + } + + @GetMapping("/list") + @Operation(summary = "获得门店列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('mall:shop:query')") + public CommonResult> getShopList(@RequestParam("ids") Collection ids) { + List list = shopService.getShopList(ids); + return success(ShopConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/shopList") + @Operation(summary = "获得门店列表") + @PreAuthorize("@ss.hasPermission('mall:shop:query')") + public CommonResult> getShopList(ShopExportReqVO shopExportReqVO) { + List list = shopService.getShopList(shopExportReqVO); + return success(ShopConvert.INSTANCE.convertList(list)); + } + + + @GetMapping("/page") + @Operation(summary = "获得门店分页") + @PreAuthorize("@ss.hasPermission('mall:shop:query')") + public CommonResult> getShopPage(@Valid ShopPageReqVO pageVO) { + PageResult pageResult = shopService.getShopPage(pageVO); + return success(ShopConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出门店 Excel") + @PreAuthorize("@ss.hasPermission('mall:shop:export')") + @OperateLog(type = EXPORT) + public void exportShopExcel(@Valid ShopExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = shopService.getShopList(exportReqVO); + // 导出 Excel + List datas = ShopConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "门店.xls", "数据", ShopExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopBaseVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopBaseVO.java new file mode 100644 index 0000000..280722b --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopBaseVO.java @@ -0,0 +1,66 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 门店 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ShopBaseVO { + + @Schema(description = "门店名称", required = true, example = "yshop") + @NotNull(message = "门店名称不能为空") + private String storeName; + + @Schema(description = "门店简介", required = true) + @NotNull(message = "门店简介不能为空") + private String storeIntro; + + @Schema(description = "门店手机", required = true) + @NotNull(message = "门店手机不能为空") + private String storePhone; + + @Schema(description = "门店logo", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "门店地址", required = true) + @NotNull(message = "门店地址不能为空") + private String address; + + @Schema(description = "精度", required = true) + @NotNull(message = "精度不能为空") + private Double lon; + + @Schema(description = "纬度", required = true) + @NotNull(message = "纬度不能为空") + private Double lat; + + @Schema(description = "核销开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime writeOffStartTime; + + @Schema(description = "核销结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime writeOffEndTime; + + @Schema(description = "营业开始时间", required = true) + @NotNull(message = "营业开始时间不能为空") + private String businessStartTime; + + @Schema(description = "营业结束时间", required = true) + @NotNull(message = "营业结束时间不能为空") + private String businessEndTime; + + @Schema(description = "状态", required = true, example = "1") + @NotNull(message = "状态不能为空") + private Boolean status; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopCreateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopCreateReqVO.java new file mode 100644 index 0000000..983cebc --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 门店创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopCreateReqVO extends ShopBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExcelVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExcelVO.java new file mode 100644 index 0000000..628844c --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExcelVO.java @@ -0,0 +1,58 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 门店 Excel VO + * + * @author admin + */ +@Data +public class ShopExcelVO { + + @ExcelProperty("参数主键") + private Long id; + + @ExcelProperty("门店名称") + private String storeName; + + @ExcelProperty("门店简介") + private String storeIntro; + + @ExcelProperty("门店手机") + private String storePhone; + + @ExcelProperty("门店logo") + private String iconUrl; + + @ExcelProperty("门店地址") + private String address; + + @ExcelProperty("精度") + private Double lon; + + @ExcelProperty("纬度") + private Double lat; + + @ExcelProperty("核销开始时间") + private LocalDateTime writeOffStartTime; + + @ExcelProperty("核销结束时间") + private LocalDateTime writeOffEndTime; + + @ExcelProperty("营业开始时间") + private String businessStartTime; + + @ExcelProperty("营业结束时间") + private String businessEndTime; + + @ExcelProperty("状态") + private Boolean status; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExportReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExportReqVO.java new file mode 100644 index 0000000..a0dc040 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopExportReqVO.java @@ -0,0 +1,57 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 门店 Excel 导出 Request VO,参数和 ShopPageReqVO 是一致的") +@Data +public class ShopExportReqVO { + + @Schema(description = "门店名称", example = "yshop") + private String storeName; + + @Schema(description = "门店简介") + private String storeIntro; + + @Schema(description = "门店手机") + private String storePhone; + + @Schema(description = "门店logo", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "门店地址") + private String address; + + @Schema(description = "精度") + private Double lon; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "核销开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] writeOffStartTime; + + @Schema(description = "核销结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] writeOffEndTime; + + @Schema(description = "营业开始时间") + private String[] businessStartTime; + + @Schema(description = "营业结束时间") + private String[] businessEndTime; + + @Schema(description = "状态", example = "1") + private Boolean status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopPageReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopPageReqVO.java new file mode 100644 index 0000000..8a1ebe3 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopPageReqVO.java @@ -0,0 +1,62 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 门店分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopPageReqVO extends PageParam { + + @Schema(description = "门店名称", example = "yshop") + private String storeName; + + @Schema(description = "门店简介") + private String storeIntro; + + @Schema(description = "门店手机") + private String storePhone; + + @Schema(description = "门店logo", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "门店地址") + private String address; + + @Schema(description = "精度") + private Double lon; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "核销开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] writeOffStartTime; + + @Schema(description = "核销结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] writeOffEndTime; + + @Schema(description = "营业开始时间") + private String[] businessStartTime; + + @Schema(description = "营业结束时间") + private String[] businessEndTime; + + @Schema(description = "状态", example = "1") + private Boolean status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopRespVO.java new file mode 100644 index 0000000..08715c2 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopRespVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 门店 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopRespVO extends ShopBaseVO { + + @Schema(description = "参数主键", required = true, example = "18600") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "距离 单位:米") + private Integer distance; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopUpdateReqVO.java new file mode 100644 index 0000000..bcaec5a --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shop/vo/ShopUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.shop.controller.admin.shop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 门店更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopUpdateReqVO extends ShopBaseVO { + + @Schema(description = "参数主键", required = true, example = "18600") + @NotNull(message = "参数主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/ShopAssistantController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/ShopAssistantController.java new file mode 100644 index 0000000..54e1236 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/ShopAssistantController.java @@ -0,0 +1,100 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.*; +import co.yixiang.yshop.module.shop.convert.shopassistant.ShopAssistantConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.shopassistant.ShopAssistantDO; +import co.yixiang.yshop.module.shop.service.shopassistant.ShopAssistantService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 门店店员") +@RestController +@RequestMapping("/mall/shop-assistant") +@Validated +public class ShopAssistantController { + + @Resource + private ShopAssistantService shopAssistantService; + + @PostMapping("/create") + @Operation(summary = "创建门店店员") + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:create')") + public CommonResult createShopAssistant(@Valid @RequestBody ShopAssistantCreateReqVO createReqVO) { + return success(shopAssistantService.createShopAssistant(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新门店店员") + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:update')") + public CommonResult updateShopAssistant(@Valid @RequestBody ShopAssistantUpdateReqVO updateReqVO) { + shopAssistantService.updateShopAssistant(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除门店店员") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:delete')") + public CommonResult deleteShopAssistant(@RequestParam("id") Long id) { + shopAssistantService.deleteShopAssistant(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得门店店员") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:query')") + public CommonResult getShopAssistant(@RequestParam("id") Long id) { + ShopAssistantDO shopAssistant = shopAssistantService.getShopAssistant(id); + return success(ShopAssistantConvert.INSTANCE.convert(shopAssistant)); + } + + @GetMapping("/list") + @Operation(summary = "获得门店店员列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:query')") + public CommonResult> getShopAssistantList(@RequestParam("ids") Collection ids) { + List list = shopAssistantService.getShopAssistantList(ids); + return success(ShopAssistantConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得门店店员分页") + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:query')") + public CommonResult> getShopAssistantPage(@Valid ShopAssistantPageReqVO pageVO) { + PageResult pageResult = shopAssistantService.getShopAssistantPage(pageVO); + return success(pageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出门店店员 Excel") + @PreAuthorize("@ss.hasPermission('mall:shop-assistant:export')") + @OperateLog(type = EXPORT) + public void exportShopAssistantExcel(@Valid ShopAssistantExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = shopAssistantService.getShopAssistantList(exportReqVO); + // 导出 Excel + List datas = ShopAssistantConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "门店店员.xls", "数据", ShopAssistantExcelVO.class, datas); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantBaseVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantBaseVO.java new file mode 100644 index 0000000..d8a8eee --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantBaseVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 门店店员 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ShopAssistantBaseVO { + + @Schema(description = "门店ID", required = true, example = "17627") + @NotNull(message = "门店ID不能为空") + private Long storeId; + + @Schema(description = "会员ID", example = "2271") + private Long userId; + + @Schema(description = "姓名", example = "yshop") + private String name; + + @Schema(description = "联系电话") + private String phoneNo; + + @Schema(description = "状态", required = true, example = "2") + @NotNull(message = "状态不能为空") + private Boolean status; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantCreateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantCreateReqVO.java new file mode 100644 index 0000000..9b5cd92 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 门店店员创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopAssistantCreateReqVO extends ShopAssistantBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExcelVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExcelVO.java new file mode 100644 index 0000000..7cb2f66 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExcelVO.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 门店店员 Excel VO + * + * @author admin + */ +@Data +public class ShopAssistantExcelVO { + + @ExcelProperty("参数主键") + private Long id; + + @ExcelProperty("门店ID") + private Long storeId; + + @ExcelProperty("会员ID") + private Long userId; + + @ExcelProperty("姓名") + private String name; + + @ExcelProperty("联系电话") + private String phoneNo; + + @ExcelProperty("状态") + private Boolean status; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExportReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExportReqVO.java new file mode 100644 index 0000000..45e9287 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantExportReqVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 门店店员 Excel 导出 Request VO,参数和 ShopAssistantPageReqVO 是一致的") +@Data +public class ShopAssistantExportReqVO { + + @Schema(description = "门店ID", example = "17627") + private Long storeId; + + @Schema(description = "会员ID", example = "2271") + private Long userId; + + @Schema(description = "姓名", example = "yshop") + private String name; + + @Schema(description = "联系电话") + private String phoneNo; + + @Schema(description = "状态", example = "2") + private Boolean status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantPageReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantPageReqVO.java new file mode 100644 index 0000000..57e65fb --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantPageReqVO.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 门店店员分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopAssistantPageReqVO extends PageParam { + + @Schema(description = "门店ID", example = "17627") + private Long storeId; + + @Schema(description = "会员ID", example = "2271") + private Long userId; + + @Schema(description = "姓名", example = "yshop") + private String name; + + @Schema(description = "联系电话") + private String phoneNo; + + @Schema(description = "状态", example = "2") + private Boolean status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantRespVO.java new file mode 100644 index 0000000..95cff6e --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantRespVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 门店店员 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopAssistantRespVO extends ShopAssistantBaseVO { + + @Schema(description = "参数主键", required = true, example = "107") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "所属门店") + private String storeName; + + @Schema(description = "头像") + private String avatar; + + @Schema(description = "昵称") + private String nickname; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantUpdateReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantUpdateReqVO.java new file mode 100644 index 0000000..b5e347a --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/admin/shopassistant/vo/ShopAssistantUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 门店店员更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ShopAssistantUpdateReqVO extends ShopAssistantBaseVO { + + @Schema(description = "参数主键", required = true, example = "107") + @NotNull(message = "参数主键不能为空") + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/AppShopController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/AppShopController.java new file mode 100644 index 0000000..bf50c03 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/AppShopController.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.shop.controller.app; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopRespVO; +import co.yixiang.yshop.module.shop.controller.app.vo.ShopDTO; +import co.yixiang.yshop.module.shop.service.shop.ShopService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author pepis + * @apiNote + **/ +@Tag(name = "app - 门店") +@RestController +@RequestMapping("/mall/shop") +@Validated +public class AppShopController { + @Resource + private ShopService shopService; + /** + * 门店列表 + */ + @GetMapping("list") + @Operation(summary = "门店列表") + public CommonResult> list(ShopDTO dto){ + List list = shopService.getShopList4App(dto); + return CommonResult.success(list); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/AppCanvasController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/AppCanvasController.java new file mode 100644 index 0000000..fab72a5 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/AppCanvasController.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.shop.controller.app.canvas; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopRespVO; +import co.yixiang.yshop.module.shop.controller.app.canvas.vo.CanvasEnableReqVO; +import co.yixiang.yshop.module.shop.controller.app.vo.ShopDTO; +import co.yixiang.yshop.module.shop.service.canvasdetail.CanvasDetailService; +import co.yixiang.yshop.module.shop.service.shop.ShopService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * @author moxiangrong + * @apiNote + **/ +@Tag(name = "用户 APP - 画布") +@RestController +@RequestMapping("/shop/canvas") +@Validated +public class AppCanvasController { + @Resource + private CanvasDetailService canvasDetailService; + /** + * 获取启用画布信息 + */ + @GetMapping("canvas-json") + @Operation(summary = "获取启用画布信息") + public CommonResult getCanvasJson(@Valid CanvasEnableReqVO reqVO){ + return CommonResult.success(canvasDetailService.getCanvasJson(reqVO)); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/vo/CanvasEnableReqVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/vo/CanvasEnableReqVO.java new file mode 100644 index 0000000..8a77c5e --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/canvas/vo/CanvasEnableReqVO.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.shop.controller.app.canvas.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "APP - 画布信息 Request VO") +@Data +@ToString(callSuper = true) +public class CanvasEnableReqVO { + + @Schema(description = "画布类型", required = true, example = "18674") + private Integer type; + + @Schema(description = "终端类型", required = true, example = "18674") + private Integer terminal; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/AppPopupController.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/AppPopupController.java new file mode 100644 index 0000000..85be28d --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/AppPopupController.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.shop.controller.app.popup; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.shop.controller.app.popup.vo.PopupInfoRespVO; +import co.yixiang.yshop.module.shop.service.popup.PopupService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + +/** + * @author moxiangrong + * @apiNote + **/ +@Tag(name = "用户 APP - 弹窗") +@RestController +@RequestMapping("/shop/popup") +@Validated +public class AppPopupController { + @Resource + private PopupService popupService; + /** + * 获取弹窗信息 + */ + @GetMapping("get") + @Operation(summary = "获取弹窗信息") + public CommonResult getPopupInfo(){ + return CommonResult.success(popupService.getPopupInfo()); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/vo/PopupInfoRespVO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/vo/PopupInfoRespVO.java new file mode 100644 index 0000000..f272148 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/popup/vo/PopupInfoRespVO.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.shop.controller.app.popup.vo; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "APP - 弹窗信息 Response VO") +@Data +@ToString(callSuper = true) +public class PopupInfoRespVO { + + + @Schema(description = "弹窗id", required = true) + private Long id; + + @Schema(description = "名称", required = true) + private String name; + + @Schema(description = "开始时间", required = true) + private LocalDateTime startTime; + + @Schema(description = "结束时间", required = true) + private LocalDateTime endTime; + + @Schema(description = "弹窗图", required = true) + private String popupImage; + + @Schema(description = "按钮图", required = true) + private String buttonImage; + + @Schema(description = "跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序", required = true) + private Integer type; + + @Schema(description = "链接", required = true) + private String link; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/ShopDTO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/ShopDTO.java new file mode 100644 index 0000000..682a55d --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/ShopDTO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.shop.controller.app.vo; + +import lombok.Data; + +/** + * @author pepis + * @apiNote 查询附件门店 + **/ +@Data +public class ShopDTO { + /** + * 经度 + */ + private Double lon; + /** + * 纬度 + */ + private Double lat; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/WriteOffDTO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/WriteOffDTO.java new file mode 100644 index 0000000..a721f5b --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/controller/app/vo/WriteOffDTO.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.shop.controller.app.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author pepis + * @apiNote 核销 + **/ +@Data +public class WriteOffDTO { + @Schema(description = "核销码") + private String writeOffCode; + +// @Schema(description = "核销订单id") +// private Long orderId; +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvas/CanvasConvert.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvas/CanvasConvert.java new file mode 100644 index 0000000..49b4b3d --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvas/CanvasConvert.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.shop.convert.canvas; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.canvas.CanvasDO; + +/** + * 画布信息 Convert + * + * @author moxiangrong + */ +@Mapper +public interface CanvasConvert { + + CanvasConvert INSTANCE = Mappers.getMapper(CanvasConvert.class); + + CanvasDO convert(CanvasCreateReqVO bean); + + CanvasDO convert(CanvasUpdateReqVO bean); + + CanvasDO convert(CanvasJsonUpdateReqVO jsonUpdateReqVO); + + CanvasRespVO convert(CanvasDO bean); + + List convertList(List list); + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvasdetail/CanvasDetailConvert.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvasdetail/CanvasDetailConvert.java new file mode 100644 index 0000000..fcd8a9c --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/canvasdetail/CanvasDetailConvert.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.shop.convert.canvasdetail; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.CanvasJsonUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.canvasdetail.CanvasDetailDO; + +/** + * 画布明细 Convert + * + * @author moxiangrong + */ +@Mapper +public interface CanvasDetailConvert { + + CanvasDetailConvert INSTANCE = Mappers.getMapper(CanvasDetailConvert.class); + + CanvasDetailRespVO convert(CanvasDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/popup/PopupConvert.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/popup/PopupConvert.java new file mode 100644 index 0000000..9aca3b0 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/popup/PopupConvert.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.shop.convert.popup; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.shop.controller.admin.popup.param.PopupCheckParam; +import co.yixiang.yshop.module.shop.controller.app.popup.vo.PopupInfoRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.popup.PopupDO; + +/** + * 弹窗 Convert + * + * @author moxiangrong + */ +@Mapper +public interface PopupConvert { + + PopupConvert INSTANCE = Mappers.getMapper(PopupConvert.class); + + PopupDO convert(PopupCreateReqVO bean); + + PopupInfoRespVO convert1(PopupDO bean); + + PopupDO convert(PopupUpdateReqVO bean); + + @Mapping(target = "popupId", source = "id") + PopupCheckParam convertParam(PopupDO popupDO); + + PopupRespVO convert(PopupDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shop/ShopConvert.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shop/ShopConvert.java new file mode 100644 index 0000000..d046f2e --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shop/ShopConvert.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.shop.convert.shop; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopCreateReqVO; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopExcelVO; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopRespVO; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopUpdateReqVO; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 门店 Convert + * + * @author admin + */ +@Mapper +public interface ShopConvert { + + ShopConvert INSTANCE = Mappers.getMapper(ShopConvert.class); + + ShopDO convert(ShopCreateReqVO bean); + + ShopDO convert(ShopUpdateReqVO bean); + + ShopRespVO convert(ShopDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shopassistant/ShopAssistantConvert.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shopassistant/ShopAssistantConvert.java new file mode 100644 index 0000000..f84749c --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/convert/shopassistant/ShopAssistantConvert.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.shop.convert.shopassistant; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.ShopAssistantCreateReqVO; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.ShopAssistantExcelVO; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.ShopAssistantRespVO; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.ShopAssistantUpdateReqVO; +import co.yixiang.yshop.module.shop.dal.dataobject.shopassistant.ShopAssistantDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 门店店员 Convert + * + * @author admin + */ +@Mapper +public interface ShopAssistantConvert { + + ShopAssistantConvert INSTANCE = Mappers.getMapper(ShopAssistantConvert.class); + + ShopAssistantDO convert(ShopAssistantCreateReqVO bean); + + ShopAssistantDO convert(ShopAssistantUpdateReqVO bean); + + ShopAssistantRespVO convert(ShopAssistantDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvas/CanvasDO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvas/CanvasDO.java new file mode 100644 index 0000000..0cab9a8 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvas/CanvasDO.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.shop.dal.dataobject.canvas; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 画布信息 DO + * + * @author moxiangrong + */ +@TableName("yshop_canvas") +@KeySequence("yshop_canvas_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CanvasDO extends BaseDO { + + /** + * 画布id + */ + @TableId + private Long id; + /** + * 名称 + */ + private String name; + /** + * 画布类型 1-首页 2-我的 + */ + private Integer type; + /** + * 状态 0-关闭 1-开启 + */ + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvasdetail/CanvasDetailDO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvasdetail/CanvasDetailDO.java new file mode 100644 index 0000000..50d07c7 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/canvasdetail/CanvasDetailDO.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.shop.dal.dataobject.canvasdetail; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 画布明细 DO + * + * @author moxiangrong + */ +@TableName("yshop_canvas_detail") +@KeySequence("yshop_canvas_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CanvasDetailDO extends BaseDO { + + /** + * 画布明细id + */ + @TableId + private Long id; + /** + * 画布id + */ + private Long canvasId; + /** + * 终端 1-小程序 2-H5 3-APP + */ + private Integer terminal; + /** + * 画布json数据 + */ + private String json; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/popup/PopupDO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/popup/PopupDO.java new file mode 100644 index 0000000..6a374af --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/popup/PopupDO.java @@ -0,0 +1,62 @@ +package co.yixiang.yshop.module.shop.dal.dataobject.popup; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +import java.time.LocalDateTime; + +/** + * 弹窗 DO + * + * @author moxiangrong + */ +@TableName("yshop_popup") +@KeySequence("yshop_popup_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PopupDO extends BaseDO { + + /** + * 弹窗id + */ + @TableId + private Long id; + /** + * 名称 + */ + private String name; + /** + * 开始时间 + */ + private LocalDateTime startTime; + /** + * 结束时间 + */ + private LocalDateTime endTime; + /** + * 弹窗图 + */ + private String popupImage; + /** + * 按钮图 + */ + private String buttonImage; + /** + * 跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序 + */ + private Integer type; + /** + * 链接 + */ + private String link; + /** + * 状态 0-关闭 1-开启 + */ + private Integer state; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shop/ShopDO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shop/ShopDO.java new file mode 100644 index 0000000..7091e7b --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shop/ShopDO.java @@ -0,0 +1,80 @@ +package co.yixiang.yshop.module.shop.dal.dataobject.shop; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 门店 DO + * + * @author admin + */ +@TableName("yshop_shop") +@KeySequence("yshop_shop_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShopDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 门店名称 + */ + private String storeName; + /** + * 门店简介 + */ + private String storeIntro; + /** + * 门店手机 + */ + private String storePhone; + /** + * 门店logo + */ + private String iconUrl; + /** + * 门店地址 + */ + private String address; + /** + * 精度 + */ + private Double lon; + /** + * 纬度 + */ + private Double lat; + /** + * 核销开始时间 + */ + private LocalDateTime writeOffStartTime; + /** + * 核销结束时间 + */ + private LocalDateTime writeOffEndTime; + /** + * 营业开始时间 + */ + private String businessStartTime; + /** + * 营业结束时间 + */ + private String businessEndTime; + /** + * 状态 + */ + private Boolean status; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shopassistant/ShopAssistantDO.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shopassistant/ShopAssistantDO.java new file mode 100644 index 0000000..c9d4118 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/dataobject/shopassistant/ShopAssistantDO.java @@ -0,0 +1,51 @@ +package co.yixiang.yshop.module.shop.dal.dataobject.shopassistant; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 门店店员 DO + * + * @author admin + */ +@TableName("yshop_shop_assistant") +@KeySequence("yshop_shop_assistant_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShopAssistantDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 门店ID + */ + private Long storeId; + /** + * 会员ID + */ + private Long userId; + /** + * 姓名 + */ + private String name; + /** + * 联系电话 + */ + private String phoneNo; + /** + * 状态 + */ + private Boolean status; + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvas/CanvasMapper.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvas/CanvasMapper.java new file mode 100644 index 0000000..30d8180 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvas/CanvasMapper.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.shop.dal.mysql.canvas; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.shop.dal.dataobject.canvas.CanvasDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.*; + +/** + * 画布信息 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface CanvasMapper extends BaseMapperX { + + default PageResult selectPage(CanvasPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(CanvasDO::getName, reqVO.getName()) + .eqIfPresent(CanvasDO::getState, reqVO.getState()) + .eqIfPresent(CanvasDO::getType, reqVO.getType()) + .betweenIfPresent(CanvasDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CanvasDO::getId)); + } + + default List selectList(CanvasExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(CanvasDO::getName, reqVO.getName()) + .eqIfPresent(CanvasDO::getState, reqVO.getState()) + .betweenIfPresent(CanvasDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CanvasDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvasdetail/CanvasDetailMapper.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvasdetail/CanvasDetailMapper.java new file mode 100644 index 0000000..6f7a95c --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/canvasdetail/CanvasDetailMapper.java @@ -0,0 +1,15 @@ +package co.yixiang.yshop.module.shop.dal.mysql.canvasdetail; + +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.shop.dal.dataobject.canvasdetail.CanvasDetailDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 画布明细 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface CanvasDetailMapper extends BaseMapperX { + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/popup/PopupMapper.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/popup/PopupMapper.java new file mode 100644 index 0000000..28dcbe3 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/popup/PopupMapper.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.shop.dal.mysql.popup; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.shop.controller.admin.popup.param.PopupCheckParam; +import co.yixiang.yshop.module.shop.dal.dataobject.popup.PopupDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 弹窗 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface PopupMapper extends BaseMapperX { + + default PageResult selectPage(PopupPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(PopupDO::getName, reqVO.getName()) + .eqIfPresent(PopupDO::getType, reqVO.getType()) + .eqIfPresent(PopupDO::getState, reqVO.getState()) + .betweenIfPresent(PopupDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(PopupDO::getId)); + } + + List checkPopup(@Param("param") PopupCheckParam param); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shop/ShopMapper.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shop/ShopMapper.java new file mode 100644 index 0000000..b5913ef --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shop/ShopMapper.java @@ -0,0 +1,56 @@ +package co.yixiang.yshop.module.shop.dal.mysql.shop; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopExportReqVO; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.ShopPageReqVO; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * 门店 Mapper + * + * @author admin + */ +@Mapper +public interface ShopMapper extends BaseMapperX { + + default PageResult selectPage(ShopPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ShopDO::getStoreName, reqVO.getStoreName()) + .eqIfPresent(ShopDO::getStoreIntro, reqVO.getStoreIntro()) + .eqIfPresent(ShopDO::getStorePhone, reqVO.getStorePhone()) + .eqIfPresent(ShopDO::getIconUrl, reqVO.getIconUrl()) + .eqIfPresent(ShopDO::getAddress, reqVO.getAddress()) + .eqIfPresent(ShopDO::getLon, reqVO.getLon()) + .eqIfPresent(ShopDO::getLat, reqVO.getLat()) + .betweenIfPresent(ShopDO::getWriteOffStartTime, reqVO.getWriteOffStartTime()) + .betweenIfPresent(ShopDO::getWriteOffEndTime, reqVO.getWriteOffEndTime()) + .eqIfPresent(ShopDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(ShopDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ShopDO::getId)); + } + + default List selectList(ShopExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(ShopDO::getStoreName, reqVO.getStoreName()) + .eqIfPresent(ShopDO::getStoreIntro, reqVO.getStoreIntro()) + .eqIfPresent(ShopDO::getStorePhone, reqVO.getStorePhone()) + .eqIfPresent(ShopDO::getIconUrl, reqVO.getIconUrl()) + .eqIfPresent(ShopDO::getAddress, reqVO.getAddress()) + .eqIfPresent(ShopDO::getLon, reqVO.getLon()) + .eqIfPresent(ShopDO::getLat, reqVO.getLat()) + .betweenIfPresent(ShopDO::getWriteOffStartTime, reqVO.getWriteOffStartTime()) + .betweenIfPresent(ShopDO::getWriteOffEndTime, reqVO.getWriteOffEndTime()) + .eqIfPresent(ShopDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(ShopDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ShopDO::getId)); + } + + @Update("update yshop_shop set status = 0 where write_off_end_time < now() and status = 1") + void handlerExpireShop(); +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shopassistant/ShopAssistantMapper.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shopassistant/ShopAssistantMapper.java new file mode 100644 index 0000000..2d0d0c4 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/dal/mysql/shopassistant/ShopAssistantMapper.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.shop.dal.mysql.shopassistant; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.ShopAssistantExportReqVO; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.ShopAssistantPageReqVO; +import co.yixiang.yshop.module.shop.dal.dataobject.shopassistant.ShopAssistantDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 门店店员 Mapper + * + * @author admin + */ +@Mapper +public interface ShopAssistantMapper extends BaseMapperX { + + default PageResult selectPage(ShopAssistantPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ShopAssistantDO::getStoreId, reqVO.getStoreId()) + .eqIfPresent(ShopAssistantDO::getUserId, reqVO.getUserId()) + .likeIfPresent(ShopAssistantDO::getName, reqVO.getName()) + .eqIfPresent(ShopAssistantDO::getPhoneNo, reqVO.getPhoneNo()) + .eqIfPresent(ShopAssistantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(ShopAssistantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ShopAssistantDO::getId)); + } + + default List selectList(ShopAssistantExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ShopAssistantDO::getStoreId, reqVO.getStoreId()) + .eqIfPresent(ShopAssistantDO::getUserId, reqVO.getUserId()) + .likeIfPresent(ShopAssistantDO::getName, reqVO.getName()) + .eqIfPresent(ShopAssistantDO::getPhoneNo, reqVO.getPhoneNo()) + .eqIfPresent(ShopAssistantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(ShopAssistantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ShopAssistantDO::getId)); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasService.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasService.java new file mode 100644 index 0000000..f925b28 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasService.java @@ -0,0 +1,93 @@ +package co.yixiang.yshop.module.shop.service.canvas; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.*; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import co.yixiang.yshop.module.shop.dal.dataobject.canvas.CanvasDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 画布信息 Service 接口 + * + * @author moxiangrong + */ +public interface CanvasService { + + /** + * 创建画布信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCanvas(@Valid CanvasCreateReqVO createReqVO); + + /** + * 更新画布信息 + * + * @param updateReqVO 更新信息 + */ + void updateCanvas(@Valid CanvasUpdateReqVO updateReqVO); + + /** + * 更新画布json信息 + * + * @param jsonUpdateReqVO 更新信息 + */ + void updateCanvasJson(@Valid CanvasJsonUpdateReqVO jsonUpdateReqVO); + + /** + * 应用画布 + * + * @param id 画布id + */ + void useCanvas(Long id); + + /** + * 删除画布信息 + * + * @param id 编号 + */ + void deleteCanvas(Long id); + + /** + * 获得画布信息 + * + * @param id 编号 + * @return 画布信息 + */ + CanvasRespVO getCanvas(Long id); + + /** + * 获得画布明细信息 + * + * @param reqVO + * @return 画布信息 + */ + CanvasDetailRespVO getCanvasDetail(CanvasDetailReqVO reqVO); + + /** + * 获得画布信息列表 + * + * @param ids 编号 + * @return 画布信息列表 + */ + List getCanvasList(Collection ids); + + /** + * 获得画布信息分页 + * + * @param pageReqVO 分页查询 + * @return 画布信息分页 + */ + PageResult getCanvasPage(CanvasPageReqVO pageReqVO); + + /** + * 获得画布信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 画布信息列表 + */ + List getCanvasList(CanvasExportReqVO exportReqVO); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasServiceImpl.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasServiceImpl.java new file mode 100644 index 0000000..3764d0f --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvas/CanvasServiceImpl.java @@ -0,0 +1,140 @@ +package co.yixiang.yshop.module.shop.service.canvas; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import co.yixiang.yshop.module.shop.convert.canvasdetail.CanvasDetailConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.canvasdetail.CanvasDetailDO; +import co.yixiang.yshop.module.shop.enums.common.StateEnum; +import co.yixiang.yshop.module.shop.service.canvasdetail.CanvasDetailService; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.canvas.CanvasDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.shop.convert.canvas.CanvasConvert; +import co.yixiang.yshop.module.shop.dal.mysql.canvas.CanvasMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.CANVAS_NOT_EXISTS; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.CANVAS_USED; + +/** + * 画布信息 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +public class CanvasServiceImpl implements CanvasService { + + @Resource + private CanvasMapper canvasMapper; + + @Resource + private CanvasDetailService canvasDetailService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createCanvas(CanvasCreateReqVO createReqVO) { + // 插入 + CanvasDO canvas = CanvasConvert.INSTANCE.convert(createReqVO); + // 默认关闭 + canvas.setState(StateEnum.CLOSE.getValue()); + canvasMapper.insert(canvas); + canvasDetailService.batchInsert(canvas.getId()); + // 返回 + return canvas.getId(); + } + + @Override + public void updateCanvas(CanvasUpdateReqVO updateReqVO) { + // 校验存在 + validateCanvasExists(updateReqVO.getId()); + // 更新 + CanvasDO updateObj = CanvasConvert.INSTANCE.convert(updateReqVO); + canvasMapper.updateById(updateObj); + } + + @Override + public void updateCanvasJson(CanvasJsonUpdateReqVO jsonUpdateReqVO) { + // 校验存在 + validateCanvasExists(jsonUpdateReqVO.getId()); + // 更新 + canvasDetailService.updateJson(jsonUpdateReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void useCanvas(Long id) { + // 校验存在 + CanvasDO canvasDO = validateCanvasExists(id); + // 修改其他同终端同类型的为关闭状态 + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.set(CanvasDO::getState, StateEnum.CLOSE.getValue()); + uw.eq(CanvasDO::getType, canvasDO.getType()); + canvasMapper.update(null, uw); + // 修改状态为开启 + CanvasDO updateDO = new CanvasDO(); + updateDO.setId(id); + updateDO.setState(StateEnum.OPEN.getValue()); + canvasMapper.updateById(updateDO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCanvas(Long id) { + // 校验存在 + CanvasDO canvasDO = validateCanvasExists(id); + if (StateEnum.OPEN.getValue().equals(canvasDO.getState())) { + throw exception(CANVAS_USED); + } + // 删除 + canvasMapper.deleteById(id); + canvasDetailService.batchDelete(id); + } + + private CanvasDO validateCanvasExists(Long id) { + CanvasDO canvasDO = canvasMapper.selectById(id); + if (ObjectUtil.isNull(canvasDO)) { + throw exception(CANVAS_NOT_EXISTS); + } + return canvasDO; + } + + @Override + public CanvasRespVO getCanvas(Long id) { + // 校验存在 + CanvasDO canvasDO = validateCanvasExists(id); + return CanvasConvert.INSTANCE.convert(canvasDO); + } + + @Override + public CanvasDetailRespVO getCanvasDetail(CanvasDetailReqVO reqVO) { + return canvasDetailService.getCanvasDetail(reqVO); + } + + @Override + public List getCanvasList(Collection ids) { + return canvasMapper.selectBatchIds(ids); + } + + @Override + public PageResult getCanvasPage(CanvasPageReqVO pageReqVO) { + return canvasMapper.selectPage(pageReqVO); + } + + @Override + public List getCanvasList(CanvasExportReqVO exportReqVO) { + return canvasMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailService.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailService.java new file mode 100644 index 0000000..a3216a0 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailService.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.shop.service.canvasdetail; + +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.CanvasDetailReqVO; +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.CanvasJsonUpdateReqVO; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import co.yixiang.yshop.module.shop.controller.app.canvas.vo.CanvasEnableReqVO; +import co.yixiang.yshop.module.shop.dal.dataobject.canvasdetail.CanvasDetailDO; + +import java.util.List; + +/** + * 画布明细 Service 接口 + * + * @author moxiangrong + */ +public interface CanvasDetailService { + + List getListByCanvasId(Long canvasId); + + CanvasDetailRespVO getCanvasDetail(CanvasDetailReqVO reqVO); + + void batchInsert(Long canvasId); + + void updateJson(CanvasJsonUpdateReqVO vo); + + void batchDelete(Long canvasId); + + CanvasDetailRespVO getCanvasJson(CanvasEnableReqVO reqVO); + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailServiceImpl.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailServiceImpl.java new file mode 100644 index 0000000..d886058 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/canvasdetail/CanvasDetailServiceImpl.java @@ -0,0 +1,114 @@ +package co.yixiang.yshop.module.shop.service.canvasdetail; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.CanvasDetailReqVO; +import co.yixiang.yshop.module.shop.controller.admin.canvas.vo.CanvasJsonUpdateReqVO; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailRespVO; +import co.yixiang.yshop.module.shop.controller.admin.canvasdetail.vo.CanvasDetailUpdateReqVO; +import co.yixiang.yshop.module.shop.controller.app.canvas.vo.CanvasEnableReqVO; +import co.yixiang.yshop.module.shop.convert.canvasdetail.CanvasDetailConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.canvas.CanvasDO; +import co.yixiang.yshop.module.shop.dal.dataobject.canvasdetail.CanvasDetailDO; +import co.yixiang.yshop.module.shop.dal.mysql.canvas.CanvasMapper; +import co.yixiang.yshop.module.shop.enums.canvas.CanvasTerminalEnum; +import co.yixiang.yshop.module.shop.enums.common.StateEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import org.springframework.validation.annotation.Validated; +import co.yixiang.yshop.module.shop.dal.mysql.canvasdetail.CanvasDetailMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.CANVAS_DETAIL_NOT_EXISTS; + +/** + * 画布明细 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +public class CanvasDetailServiceImpl implements CanvasDetailService { + + @Resource + private CanvasDetailMapper canvasDetailMapper; + + @Resource + private CanvasMapper canvasMapper; + + @Override + public List getListByCanvasId(Long canvasId) { + return CanvasDetailConvert.INSTANCE.convertList(canvasDetailMapper + .selectList(new LambdaQueryWrapper().eq(CanvasDetailDO::getCanvasId, canvasId))); + } + + @Override + public CanvasDetailRespVO getCanvasDetail(CanvasDetailReqVO reqVO) { + return CanvasDetailConvert.INSTANCE.convert(canvasDetailMapper + .selectOne(new LambdaQueryWrapper() + .eq(CanvasDetailDO::getCanvasId, reqVO.getId()) + .eq(CanvasDetailDO::getTerminal, reqVO.getTerminal()) + .last("limit 1"))); + } + + @Override + public void batchInsert(Long canvasId) { + List insertDOS = new ArrayList<>(); + CanvasDetailDO mini = new CanvasDetailDO(); + mini.setCanvasId(canvasId); + mini.setJson(""); + mini.setTerminal(CanvasTerminalEnum.MINI.getValue()); + insertDOS.add(mini); + CanvasDetailDO h5 = new CanvasDetailDO(); + h5.setCanvasId(canvasId); + h5.setJson(""); + h5.setTerminal(CanvasTerminalEnum.H5.getValue()); + insertDOS.add(h5); + CanvasDetailDO app = new CanvasDetailDO(); + app.setCanvasId(canvasId); + app.setJson(""); + app.setTerminal(CanvasTerminalEnum.APP.getValue()); + insertDOS.add(app); + canvasDetailMapper.insertBatch(insertDOS); + } + + @Override + public void updateJson(CanvasJsonUpdateReqVO vo) { + canvasDetailMapper.update(null, new LambdaUpdateWrapper() + .eq(CanvasDetailDO::getCanvasId, vo.getId()) + .eq(CanvasDetailDO::getTerminal, vo.getTerminal()) + .set(CanvasDetailDO::getJson, vo.getJson()) + ); + } + + @Override + public void batchDelete(Long canvasId) { + canvasDetailMapper.delete(new LambdaQueryWrapper().eq(CanvasDetailDO::getCanvasId, canvasId)); + } + + @Override + public CanvasDetailRespVO getCanvasJson(CanvasEnableReqVO reqVO) { + CanvasDO canvasDO = canvasMapper.selectOne(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotNull(reqVO.getType()), CanvasDO::getType, reqVO.getType()) + .eq(CanvasDO::getState, StateEnum.OPEN.getValue()).last("limit 1") + ); + if(ObjectUtil.isNull(canvasDO)){ + return null; + } + CanvasDetailDO canvasDetailDO = canvasDetailMapper.selectOne(new LambdaQueryWrapper() + .eq(CanvasDetailDO::getCanvasId, canvasDO.getId()) + .eq(CanvasDetailDO::getTerminal, reqVO.getTerminal()).last("limit 1") + ); + return CanvasDetailConvert.INSTANCE.convert(canvasDetailDO); + } +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialService.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialService.java index d1d3988..25f85a4 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialService.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialService.java @@ -5,6 +5,7 @@ import javax.validation.*; import co.yixiang.yshop.module.shop.controller.admin.material.vo.*; import co.yixiang.yshop.module.shop.dal.dataobject.material.MaterialDO; import co.yixiang.yshop.framework.common.pojo.PageResult; +import org.springframework.web.bind.annotation.RequestBody; /** * 素材库 Service 接口 @@ -67,4 +68,5 @@ public interface MaterialService { */ List getMaterialList(MaterialExportReqVO exportReqVO); + void batchUpdateGroup(MaterialBatchUpdateGroupReqVO materialBatchUpdateGroupReqVO); } diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialServiceImpl.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialServiceImpl.java index d581bc4..5b11e45 100644 --- a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialServiceImpl.java +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/material/MaterialServiceImpl.java @@ -79,4 +79,15 @@ public class MaterialServiceImpl implements MaterialService { return materialMapper.selectList(exportReqVO); } + @Override + public void batchUpdateGroup(MaterialBatchUpdateGroupReqVO materialBatchUpdateGroupReqVO) { + List ids = materialBatchUpdateGroupReqVO.getIds(); + for (Long id:ids) { + MaterialDO materialDO = new MaterialDO(); + materialDO.setId(id); + materialDO.setGroupId(materialBatchUpdateGroupReqVO.getGrouupId()); + materialMapper.updateById(materialDO); + } + } + } diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupService.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupService.java new file mode 100644 index 0000000..9050c19 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupService.java @@ -0,0 +1,78 @@ +package co.yixiang.yshop.module.shop.service.popup; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.*; +import co.yixiang.yshop.module.shop.controller.app.popup.vo.PopupInfoRespVO; +import co.yixiang.yshop.module.shop.dal.dataobject.popup.PopupDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 弹窗 Service 接口 + * + * @author moxiangrong + */ +public interface PopupService { + + /** + * 创建弹窗 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPopup(@Valid PopupCreateReqVO createReqVO); + + /** + * 更新弹窗 + * + * @param updateReqVO 更新信息 + */ + void updatePopup(@Valid PopupUpdateReqVO updateReqVO); + + /** + * 删除弹窗 + * + * @param id 编号 + */ + void deletePopup(Long id); + + /** + * 获得弹窗 + * + * @param id 编号 + * @return 弹窗 + */ + PopupDO getPopup(Long id); + + /** + * 获得弹窗列表 + * + * @param ids 编号 + * @return 弹窗列表 + */ + List getPopupList(Collection ids); + + /** + * 获得弹窗分页 + * + * @param pageReqVO 分页查询 + * @return 弹窗分页 + */ + PageResult getPopupPage(PopupPageReqVO pageReqVO); + + /** + * 状态变更 + * + * @param id 编号 + * @return 弹窗 + */ + void stateChange(Long id); + + + /** + * 获得当前弹窗信息 + * + * @return 弹窗 + */ + PopupInfoRespVO getPopupInfo(); +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupServiceImpl.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupServiceImpl.java new file mode 100644 index 0000000..e065f68 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/popup/PopupServiceImpl.java @@ -0,0 +1,186 @@ +package co.yixiang.yshop.module.shop.service.popup; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.constant.ShopConstants; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.date.DateUtils; +import co.yixiang.yshop.framework.redis.util.RedissonUtil; +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.PopupCreateReqVO; +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.PopupPageReqVO; +import co.yixiang.yshop.module.shop.controller.admin.popup.vo.PopupUpdateReqVO; +import co.yixiang.yshop.module.shop.controller.app.popup.vo.PopupInfoRespVO; +import co.yixiang.yshop.module.shop.convert.popup.PopupConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.popup.PopupDO; +import co.yixiang.yshop.module.shop.dal.mysql.popup.PopupMapper; +import co.yixiang.yshop.module.shop.enums.common.StateEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.*; + +/** + * 弹窗 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +@Slf4j +public class PopupServiceImpl implements PopupService { + + @Resource + private PopupMapper popupMapper; + + @Resource + private RedissonUtil redissonUtil; + + @Override + public Long createPopup(PopupCreateReqVO createReqVO) { + PopupDO popup = PopupConvert.INSTANCE.convert(createReqVO); + // 校验弹窗时间是否交叉 + if (this.checkPopup(popup)) throw exception(POPUP_NOT_REPEAT); + // 判断状态 + Long time = this.judgeState(popup); + // 插入 + popupMapper.insert(popup); + if (ObjectUtil.isNotNull(time)) { + this.addQueue(popup.getId(), time); + } + // 返回 + return popup.getId(); + } + + @Override + public void updatePopup(PopupUpdateReqVO updateReqVO) { + // 校验存在 + this.validatePopupExists(updateReqVO.getId()); + PopupDO updateObj = PopupConvert.INSTANCE.convert(updateReqVO); + // 校验弹窗时间是否交叉 + if (this.checkPopup(updateObj)) throw exception(POPUP_NOT_REPEAT); + // 判断状态 + Long time = this.judgeState(updateObj); + // 更新 + popupMapper.updateById(updateObj); + if (ObjectUtil.isNotNull(time)) { + this.removeQueue(updateObj.getId()); + this.addQueue(updateObj.getId(), time); + } + } + + /** + * 校验弹窗时间是否交叉 + * + * @param popup + * @return + */ + private Boolean checkPopup(PopupDO popup) { + return CollectionUtils.isNotEmpty(popupMapper.checkPopup(PopupConvert.INSTANCE.convertParam(popup))); + } + + /** + * 判断状态并返回延迟时间 + * + * @param popup + * @return + */ + private Long judgeState(PopupDO popup) { + Long time = null; + if (DateUtils.isBelong(popup.getStartTime(), popup.getEndTime())) { + popup.setState(StateEnum.OPEN.getValue()); + time = DateUtils.getMoreMillisecondAfter(popup.getEndTime()); + } else if (DateUtils.isBefore(popup.getStartTime())) { + popup.setState(StateEnum.CLOSE.getValue()); + time = DateUtils.getMoreMillisecondAfter(popup.getStartTime()); + } else { + popup.setState(StateEnum.CLOSE.getValue()); + } + return time; + } + + @Override + public void deletePopup(Long id) { + // 校验存在 + this.validatePopupExists(id); + // 删除 + popupMapper.deleteById(id); + this.removeQueue(id); + } + + private PopupDO validatePopupExists(Long id) { + PopupDO popupDO = popupMapper.selectById(id); + if (ObjectUtil.isNull(popupDO)) { + throw exception(POPUP_NOT_EXISTS); + } + return popupDO; + } + + @Override + public PopupDO getPopup(Long id) { + return popupMapper.selectById(id); + } + + @Override + public List getPopupList(Collection ids) { + return popupMapper.selectBatchIds(ids); + } + + @Override + public PageResult getPopupPage(PopupPageReqVO pageReqVO) { + return popupMapper.selectPage(pageReqVO); + } + + @Override + public void stateChange(Long id) { + // 校验存在 + PopupDO popupDO = this.validatePopupExists(id); + PopupDO updateDO = new PopupDO(); + updateDO.setId(id); + updateDO.setStartTime(popupDO.getStartTime()); + updateDO.setEndTime(popupDO.getEndTime()); + Long time = this.judgeState(updateDO); + updateDO.setState(StateEnum.CLOSE.getValue().equals(popupDO.getState()) + ? StateEnum.OPEN.getValue() : StateEnum.CLOSE.getValue()); + popupMapper.updateById(updateDO); + if (ObjectUtil.isNotNull(time)) { + this.addQueue(id, time); + } + } + + @Override + public PopupInfoRespVO getPopupInfo() { + PopupDO popupDO = popupMapper.selectOne(new LambdaQueryWrapper() + .eq(PopupDO::getState, StateEnum.OPEN.getValue())); + return PopupConvert.INSTANCE.convert1(popupDO); + } + + /** + * 加入延时队列 + * + * @param id + * @param time + */ + private void addQueue(Long id, long time) { + log.info("添加延时队列 ,弹窗广告id:{}, 延时时间:{}", id, time); + redissonUtil.delayedOfferThrow(ShopConstants.POPUP_CHANGE, id, time, TimeUnit.MILLISECONDS, POPUP_ADD_QUEUE_ERROR); + } + + /** + * 从延时队列中移除 + * + * @param id + */ + private void removeQueue(Long id) { + redissonUtil.delayedRemoveThrow(ShopConstants.POPUP_CHANGE, id, POPUP_REMOVE_QUEUE_ERROR); + log.info("移除延时队列成功 ,弹窗广告id:{}", id); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopService.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopService.java new file mode 100644 index 0000000..03e72bf --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopService.java @@ -0,0 +1,79 @@ +package co.yixiang.yshop.module.shop.service.shop; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.*; +import co.yixiang.yshop.module.shop.controller.app.vo.ShopDTO; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 门店 Service 接口 + * + * @author admin + */ +public interface ShopService { + + /** + * 创建门店 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createShop(@Valid ShopCreateReqVO createReqVO); + + /** + * 更新门店 + * + * @param updateReqVO 更新信息 + */ + void updateShop(@Valid ShopUpdateReqVO updateReqVO); + + /** + * 删除门店 + * + * @param id 编号 + */ + void deleteShop(Long id); + + /** + * 获得门店 + * + * @param id 编号 + * @return 门店 + */ + ShopDO getShop(Long id); + + /** + * 获得门店列表 + * + * @param ids 编号 + * @return 门店列表 + */ + List getShopList(Collection ids); + + /** + * 获得门店分页 + * + * @param pageReqVO 分页查询 + * @return 门店分页 + */ + PageResult getShopPage(ShopPageReqVO pageReqVO); + + /** + * 获得门店列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 门店列表 + */ + List getShopList(ShopExportReqVO exportReqVO); + + /** + * 客户端根据经纬度查询列表 + * @param dto / + * @return / + */ + List getShopList4App(ShopDTO dto); +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopServiceImpl.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopServiceImpl.java new file mode 100644 index 0000000..203e83b --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shop/ShopServiceImpl.java @@ -0,0 +1,116 @@ +package co.yixiang.yshop.module.shop.service.shop; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.distancecalculator.DistanceCalculatorUtil; +import co.yixiang.yshop.module.shop.controller.admin.shop.vo.*; +import co.yixiang.yshop.module.shop.controller.app.vo.ShopDTO; +import co.yixiang.yshop.module.shop.convert.shop.ShopConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; +import co.yixiang.yshop.module.shop.dal.mysql.shop.ShopMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.SHOP_NOT_EXISTS; + + +/** + * 门店 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class ShopServiceImpl implements ShopService { + + @Resource + private ShopMapper shopMapper; + + @Override + public Long createShop(ShopCreateReqVO createReqVO) { + // 插入 + ShopDO shop = ShopConvert.INSTANCE.convert(createReqVO); + shopMapper.insert(shop); + // 返回 + return shop.getId(); + } + + @Override + public void updateShop(ShopUpdateReqVO updateReqVO) { + // 校验存在 + validateShopExists(updateReqVO.getId()); + // 更新 + ShopDO updateObj = ShopConvert.INSTANCE.convert(updateReqVO); + shopMapper.updateById(updateObj); + } + + @Override + public void deleteShop(Long id) { + // 校验存在 + validateShopExists(id); + // 删除 + shopMapper.deleteById(id); + } + + private void validateShopExists(Long id) { + if (shopMapper.selectById(id) == null) { + throw exception(SHOP_NOT_EXISTS); + } + } + + @Override + public ShopDO getShop(Long id) { + return shopMapper.selectById(id); + } + + @Override + public List getShopList(Collection ids) { + return shopMapper.selectBatchIds(ids); + } + + @Override + public PageResult getShopPage(ShopPageReqVO pageReqVO) { + return shopMapper.selectPage(pageReqVO); + } + + @Override + public List getShopList(ShopExportReqVO exportReqVO) { + return shopMapper.selectList(exportReqVO); + } + + @Override + public List getShopList4App(ShopDTO dto) { + //处理核销时间到期的门店 + handlerExpireShop(); + + Double lat = dto.getLat(); + Double lon = dto.getLon(); + //查询启用的门店 + ShopExportReqVO reqVO = new ShopExportReqVO(); + reqVO.setStatus(Boolean.TRUE); + List shopList = this.getShopList(reqVO); + List shopRespVOS = ShopConvert.INSTANCE.convertList(shopList); + return shopRespVOS.stream() + .peek(item -> { + double distance = DistanceCalculatorUtil.calculateDistance(lat, lon, item.getLat(), item.getLon()); + item.setDistance((int) distance); + }) + .sorted(Comparator.comparing(ShopRespVO::getDistance)) + .collect(Collectors.toList()); + + } + + /** + * 更改核销时间到期门店的状态 + */ + private void handlerExpireShop() { + shopMapper.handlerExpireShop(); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantService.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantService.java new file mode 100644 index 0000000..082fe9e --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantService.java @@ -0,0 +1,74 @@ +package co.yixiang.yshop.module.shop.service.shopassistant; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.*; +import co.yixiang.yshop.module.shop.dal.dataobject.shopassistant.ShopAssistantDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 门店店员 Service 接口 + * + * @author admin + */ +public interface ShopAssistantService { + + /** + * 创建门店店员 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createShopAssistant(@Valid ShopAssistantCreateReqVO createReqVO); + + /** + * 更新门店店员 + * + * @param updateReqVO 更新信息 + */ + void updateShopAssistant(@Valid ShopAssistantUpdateReqVO updateReqVO); + + /** + * 删除门店店员 + * + * @param id 编号 + */ + void deleteShopAssistant(Long id); + + /** + * 获得门店店员 + * + * @param id 编号 + * @return 门店店员 + */ + ShopAssistantDO getShopAssistant(Long id); + + /** + * 获得门店店员列表 + * + * @param ids 编号 + * @return 门店店员列表 + */ + List getShopAssistantList(Collection ids); + + /** + * 获得门店店员分页 + * + * @param pageReqVO 分页查询 + * @return 门店店员分页 + */ + PageResult getShopAssistantPage(ShopAssistantPageReqVO pageReqVO); + + /** + * 获得门店店员列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 门店店员列表 + */ + List getShopAssistantList(ShopAssistantExportReqVO exportReqVO); + + + ShopAssistantDO selectByUserId(Long userId); +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantServiceImpl.java b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantServiceImpl.java new file mode 100644 index 0000000..07cdc7a --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/java/co/yixiang/yshop/module/shop/service/shopassistant/ShopAssistantServiceImpl.java @@ -0,0 +1,166 @@ +package co.yixiang.yshop.module.shop.service.shopassistant; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.service.user.UserService; +import co.yixiang.yshop.module.shop.controller.admin.shopassistant.vo.*; +import co.yixiang.yshop.module.shop.convert.shopassistant.ShopAssistantConvert; +import co.yixiang.yshop.module.shop.dal.dataobject.shop.ShopDO; +import co.yixiang.yshop.module.shop.dal.dataobject.shopassistant.ShopAssistantDO; +import co.yixiang.yshop.module.shop.dal.mysql.shopassistant.ShopAssistantMapper; +import co.yixiang.yshop.module.shop.service.shop.ShopService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_NOT_EXISTS; +import static co.yixiang.yshop.module.shop.enums.ErrorCodeConstants.*; + + +/** + * 门店店员 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class ShopAssistantServiceImpl implements ShopAssistantService { + + @Resource + private ShopAssistantMapper shopAssistantMapper; + @Resource + private ShopService shopService; + @Resource + private UserService userService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createShopAssistant(ShopAssistantCreateReqVO createReqVO) { + //校验参数是否合法 + verifyParam(createReqVO.getStoreId(),createReqVO.getUserId(),null); + + if(createReqVO.getStatus()){ + userService.updateWriteOffAuthority(createReqVO.getUserId(),createReqVO.getStatus()); + } + // 插入 + ShopAssistantDO shopAssistant = ShopAssistantConvert.INSTANCE.convert(createReqVO); + shopAssistantMapper.insert(shopAssistant); + // 返回 + return shopAssistant.getId(); + } + + /** + * 校验参数 + * @param storeId / + * @param userId / + * @param shopAssistantId 店员id 用于区分新增/更新时校验 + */ + private void verifyParam(Long storeId,Long userId,Long shopAssistantId) { + //校验门店是否存在 + ShopDO shop = shopService.getShop(storeId); + if(Objects.isNull(shop)){ + throw exception(SHOP_NOT_EXISTS); + } + //查询用户 + MemberUserDO user = userService.getUser(userId); + if(Objects.isNull(user)){ + throw exception(USER_NOT_EXISTS); + } + //校验当前用户是否是店员 + ShopAssistantDO shopAssistantDO = this.selectByUserId(userId); + if(Objects.nonNull(shopAssistantDO)) { + //更新时校验 + if(Objects.nonNull(shopAssistantId) ){ + if(!shopAssistantDO.getId().equals(shopAssistantId)){ + throw exception(SHOP_ASSISTANT_EXIST); + } + }else { + throw exception(SHOP_ASSISTANT_EXIST); + } + + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateShopAssistant(ShopAssistantUpdateReqVO updateReqVO) { + // 校验存在 + validateShopAssistantExists(updateReqVO.getId()); + //校验参数是否合法 + verifyParam(updateReqVO.getStoreId(),updateReqVO.getUserId(),updateReqVO.getId()); + // 更新 + ShopAssistantDO updateObj = ShopAssistantConvert.INSTANCE.convert(updateReqVO); + shopAssistantMapper.updateById(updateObj); + //更新用户核销状态 + userService.updateWriteOffAuthority(updateReqVO.getUserId(),updateReqVO.getStatus()); + } + + @Override + public void deleteShopAssistant(Long id) { + // 校验存在 + validateShopAssistantExists(id); + // 删除 + shopAssistantMapper.deleteById(id); + } + + private void validateShopAssistantExists(Long id) { + if (shopAssistantMapper.selectById(id) == null) { + throw exception(SHOP_ASSISTANT_NOT_EXISTS); + } + } + + @Override + public ShopAssistantDO getShopAssistant(Long id) { + return shopAssistantMapper.selectById(id); + } + + @Override + public List getShopAssistantList(Collection ids) { + return shopAssistantMapper.selectBatchIds(ids); + } + + @Override + public PageResult getShopAssistantPage(ShopAssistantPageReqVO pageReqVO) { + PageResult page = shopAssistantMapper.selectPage(pageReqVO); + PageResult resPage = ShopAssistantConvert.INSTANCE.convertPage(page); + //填充数据 + fillData(resPage); + return resPage; + } + + private void fillData(PageResult resPage) { + List userIds = resPage.getList().stream().map(ShopAssistantRespVO::getUserId).distinct().collect(Collectors.toList()); + List storeIds = resPage.getList().stream().map(ShopAssistantRespVO::getStoreId).distinct().collect(Collectors.toList()); + Map userMap = userService.getUserList(userIds).stream().collect(Collectors.toMap(MemberUserDO::getId, Function.identity())); + Map storeMap = shopService.getShopList(storeIds).stream().collect(Collectors.toMap(ShopDO::getId, Function.identity())); + + resPage.getList().forEach(item -> { + MemberUserDO user = userMap.getOrDefault(item.getUserId(), new MemberUserDO()); + ShopDO shop = storeMap.getOrDefault(item.getStoreId(), new ShopDO()); + item.setAvatar(user.getAvatar()); + item.setNickname(user.getNickname()); + item.setStoreName(shop.getStoreName()); + }); + } + + @Override + public List getShopAssistantList(ShopAssistantExportReqVO exportReqVO) { + return shopAssistantMapper.selectList(exportReqVO); + } + + + @Override + public ShopAssistantDO selectByUserId(Long userId) { + return shopAssistantMapper.selectOne(ShopAssistantDO::getUserId,userId); + } + +} diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvas/CanvasMapper.xml b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvas/CanvasMapper.xml new file mode 100644 index 0000000..0976a61 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvas/CanvasMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvasdetail/CanvasDetailMapper.xml b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvasdetail/CanvasDetailMapper.xml new file mode 100644 index 0000000..c75e2d6 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/canvasdetail/CanvasDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/popup/PopupMapper.xml b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/popup/PopupMapper.xml new file mode 100644 index 0000000..795e19a --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/popup/PopupMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shop/ShopMapper.xml b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shop/ShopMapper.xml new file mode 100644 index 0000000..b264a90 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shop/ShopMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shopassistant/ShopAssistantMapper.xml b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shopassistant/ShopAssistantMapper.xml new file mode 100644 index 0000000..8259f34 --- /dev/null +++ b/yshop-module-mall/yshop-module-shop-biz/src/main/resources/mapper/shopassistant/ShopAssistantMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/integralRule/IntegralRuleDTO.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/integralRule/IntegralRuleDTO.java new file mode 100644 index 0000000..22fe492 --- /dev/null +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/integralRule/IntegralRuleDTO.java @@ -0,0 +1,46 @@ +package co.yixiang.yshop.module.member.api.integralRule; + +import lombok.Data; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class IntegralRuleDTO { + /** + * 类型 + */ + @NotNull + private String type; + /** + * 获取积分 + */ + @NotNull + private Integer integral; + + /** + * 拓展字段 + */ + private String attribute1; + + /** + * 消费金额 + */ + private BigDecimal consumeAmount; + + /** + * 操作用户 + */ + private Long userId; + + /** + * 是否开启 + */ + private Boolean enable; + public IntegralRuleDTO() { + } +} diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApi.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApi.java index ac7b4a9..df3e8c8 100644 --- a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApi.java +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApi.java @@ -1,7 +1,7 @@ package co.yixiang.yshop.module.member.api.user; import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import java.util.Collection; import java.util.List; @@ -16,7 +16,7 @@ import static co.yixiang.yshop.framework.common.util.collection.CollectionUtils. */ public interface MemberUserApi { - void saveWechatMember(WechatUserDto wechatUserDto); + void saveWechatMember(WechatUserDTO wechatUserDto); /** * 获得会员用户信息 diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApi.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApi.java new file mode 100644 index 0000000..006fdd7 --- /dev/null +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApi.java @@ -0,0 +1,9 @@ +package co.yixiang.yshop.module.member.api.user; + +import co.yixiang.yshop.module.member.api.user.dto.IncreaseNowMoneyDTO; + +public interface MemberUserNowMoneyApi { + + void increaseNowMoney(IncreaseNowMoneyDTO increaseNowMoneyDTO); + +} diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/IncreaseNowMoneyDTO.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/IncreaseNowMoneyDTO.java new file mode 100644 index 0000000..a61784e --- /dev/null +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/IncreaseNowMoneyDTO.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.member.api.user.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class IncreaseNowMoneyDTO { + + /** + * 用户ID + */ + private Long id; + + /** + * 关联ID + */ + private String link; + + /** + * 金额 + */ + private BigDecimal amount; + + /** + * 备注 + */ + private String mark; + +} diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/MemberUserRespDTO.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/MemberUserRespDTO.java index 2772fc1..7751092 100644 --- a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/MemberUserRespDTO.java +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/MemberUserRespDTO.java @@ -31,4 +31,17 @@ public class MemberUserRespDTO { */ private String mobile; + /** + * 用户头像 + */ + private String avatar; + + /** + * 微信openId + */ + private String openId; + + //小程序openid + private String routineOpenId; + } diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java index 1ad97b9..cb47f04 100644 --- a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java @@ -12,13 +12,13 @@ import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor -public class WechatUserDto { +public class WechatUserDTO { - private String openid; + private String openId; private String unionId; - private String routineOpenid; + private String routineOpenId; private String nickname; diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/BillDetailEnum.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/BillDetailEnum.java index ba702ba..d4063bd 100644 --- a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/BillDetailEnum.java +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/BillDetailEnum.java @@ -24,12 +24,23 @@ public enum BillDetailEnum { TYPE_6("system_add","系统添加"), TYPE_7("system_sub","系统减少"), TYPE_8("deduction","减去"), - TYPE_9("gain","奖励"), + + TYPE_9("gain","购买商品奖励"), TYPE_10("sign","签到"), + TYPE_11("upgrade","升级"), + TYPE_12("deduction","消费抵扣"), + TYPE_13("canal_order","取消订单"), + SIGN("sign", "签到"), + REGISTER("register", "注册"), + LOGIN("login", "登录"), + CONSUME("consume", "消费奖励"), + COMMENT("comment", "评论"), + SHARE_PRODUCTS("share_products", "分享商品"), CATEGORY_1("now_money","金额"), - CATEGORY_2("integral","积分"); + CATEGORY_2("integral","积分"), + CATEGORY_3("pay","支付"),; diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/ErrorCodeConstants.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/ErrorCodeConstants.java index a6a6272..535c0ac 100644 --- a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/ErrorCodeConstants.java +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/ErrorCodeConstants.java @@ -26,4 +26,32 @@ public interface ErrorCodeConstants { ErrorCode USER_ADDRESS_PARAM_NOT_EXISTS = new ErrorCode(1004004001, "用户收件地址参数错误"); ErrorCode USER_BILL_NOT_EXISTS = new ErrorCode(1004004001, "用户账单不存在"); + // ========== 会员标签分组========== + ErrorCode USER_TAG_GROUP_NOT_EXISTS = new ErrorCode(1004005000, "会员标签分组不存在"); + // ========== 会员标签========== + ErrorCode USER_TAG_NOT_EXISTS = new ErrorCode(1004006000, "会员标签不存在"); + // ========== 用户标签中间 ========== + ErrorCode USER_TAG_REF_NOT_EXISTS = new ErrorCode(1004007000, "用户标签中间不存在"); + // ========== 会员积分规则========== + ErrorCode INTEGRAL_RULE_NOT_EXISTS = new ErrorCode(1004008000, "会员积分规则不存在"); + // ========== 签到记录 ========== + ErrorCode SIGN_IN_RECORD_NOT_EXISTS = new ErrorCode(1004009000, "签到记录不存在"); + ErrorCode TODAY_SIGN_IN_RECORD_EXISTS = new ErrorCode(100409001, "今日已签到"); + // ========== 会员等级配置 ========== + ErrorCode USER_LEVEL_CONFIG_NOT_EXISTS = new ErrorCode(1004011000, "会员等级配置不存在"); + // ========== 会员等级权益配置========== + ErrorCode USER_LEVEL_EQUITY_NOT_EXISTS = new ErrorCode(1004012000, "会员等级权益配置不存在"); + // ========== 会员成长任务配置 ========== + ErrorCode USER_LEVEL_GROWTH_VALUE_CONFIG_NOT_EXISTS = new ErrorCode(1004013000, "会员成长任务配置不存在"); + // ========== 会员等级权益中间 ========== + ErrorCode USER_LEVEL_EQUITY_REF_NOT_EXISTS = new ErrorCode(1004014000, "会员等级权益中间不存在"); + + ErrorCode STORE_NOT_EXISTS = new ErrorCode(1004005000, "请选择门店"); + + // ========== 邀请日志 ========== + ErrorCode USER_INVITE_LOG_NOT_EXISTS = new ErrorCode(1004006000, "邀请日志不存在"); + + ErrorCode BURY_POINT_NOT_EXISTS = new ErrorCode(1004007000, "埋点不存在"); + ErrorCode NOT_ENOUGH_INTEGRAL = new ErrorCode(1004008000, "积分余额不足"); + } diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelEquityEnum.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelEquityEnum.java new file mode 100644 index 0000000..f707f04 --- /dev/null +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelEquityEnum.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.member.enums; + +import lombok.Getter; + +/** + * @author pepis + * @apiNote 等级权益枚举 + **/ +@Getter +public enum LevelEquityEnum { + FREE_SHIPPING("free_shipping","全场包邮"), + DISCOUNT("discount","会员折扣"), + INTEGRAL("integral","会员积分"), + COUPON("coupon","会员专享券"), + ; + private final String type; + private final String name; + + LevelEquityEnum(String type, String name) { + this.type = type; + this.name = name; + } +} diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelGrowthValueEnum.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelGrowthValueEnum.java new file mode 100644 index 0000000..07663e2 --- /dev/null +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/enums/LevelGrowthValueEnum.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.member.enums; + +import lombok.Getter; + +/** + * @author pepis + * @apiNote 等级成长值枚举 + **/ +@Getter +public enum LevelGrowthValueEnum { + CONSUME("consume", "消费"), + INVITE("invite", "邀请"), + ; + private final String type; + private final String name; + + LevelGrowthValueEnum(String type, String name) { + this.type = type; + this.name = name; + } +} diff --git a/yshop-module-member/yshop-module-member-biz/pom.xml b/yshop-module-member/yshop-module-member-biz/pom.xml index db15284..ca202ea 100644 --- a/yshop-module-member/yshop-module-member-biz/pom.xml +++ b/yshop-module-member/yshop-module-member-biz/pom.xml @@ -97,6 +97,11 @@ 1.0.0 compile + + co.yixiang.boot + yshop-module-product-api + ${revision} + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApiImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApiImpl.java index 70f82b2..32a803a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApiImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserApiImpl.java @@ -1,10 +1,8 @@ package co.yixiang.yshop.module.member.api.user; import cn.hutool.core.util.IdUtil; -import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; -import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import co.yixiang.yshop.module.member.convert.user.UserConvert; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.service.user.MemberUserService; @@ -31,14 +29,14 @@ public class MemberUserApiImpl implements MemberUserApi { private PasswordEncoder passwordEncoder; @Override - public void saveWechatMember(WechatUserDto wechatUserDto) { + public void saveWechatMember(WechatUserDTO wechatUserDto) { MemberUserDO user = new MemberUserDO(); user.setNickname(wechatUserDto.getNickname()); user.setAvatar(wechatUserDto.getHeadimgurl()); // 生成密码 String password = IdUtil.fastSimpleUUID(); user.setPassword(encodePassword(password)); - user.setUsername(wechatUserDto.getOpenid()); + user.setUsername(wechatUserDto.getOpenId()); user.setLoginType("wechat"); user.setWxProfile(wechatUserDto); diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApiImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApiImpl.java new file mode 100644 index 0000000..55fa417 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/api/user/MemberUserNowMoneyApiImpl.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.member.api.user; + +import co.yixiang.yshop.module.member.api.user.dto.IncreaseNowMoneyDTO; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +@Service +@Validated +public class MemberUserNowMoneyApiImpl implements MemberUserNowMoneyApi { + + @Resource + private MemberUserService memberUserService; + + @Resource + private UserBillService userBillService; + + @Override + public void increaseNowMoney(IncreaseNowMoneyDTO increaseNowMoneyDTO) { + // 增加余额 + memberUserService.incMoney(increaseNowMoneyDTO.getId(), increaseNowMoneyDTO.getAmount()); + // 保存记录 + userBillService.income(increaseNowMoneyDTO.getId(), + "充值", BillDetailEnum.CATEGORY_1.getValue(), + BillDetailEnum.TYPE_1.getValue(), + increaseNowMoneyDTO.getAmount(), + increaseNowMoneyDTO.getAmount(), + increaseNowMoneyDTO.getMark(), + increaseNowMoneyDTO.getLink()); + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/BuryPointController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/BuryPointController.java new file mode 100644 index 0000000..a7f0feb --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/BuryPointController.java @@ -0,0 +1,108 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint; + +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.BuryPointDO; +import co.yixiang.yshop.module.member.convert.burypoint.BuryPointConvert; +import co.yixiang.yshop.module.member.service.burypoint.BuryPointService; + +@Tag(name = "管理后台 - 埋点") +@RestController +@RequestMapping("/member/bury-point") +@Validated +public class BuryPointController { + + @Resource + private BuryPointService buryPointService; + + @PostMapping("/create") + @Operation(summary = "创建埋点") + @PreAuthorize("@ss.hasPermission('member:bury-point:create')") + public CommonResult createBuryPoint(@Valid @RequestBody BuryPointCreateReqVO createReqVO) { + return success(buryPointService.createBuryPoint(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新埋点") + @PreAuthorize("@ss.hasPermission('member:bury-point:update')") + public CommonResult updateBuryPoint(@Valid @RequestBody BuryPointUpdateReqVO updateReqVO) { + buryPointService.updateBuryPoint(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除埋点") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:bury-point:delete')") + public CommonResult deleteBuryPoint(@RequestParam("id") Long id) { + buryPointService.deleteBuryPoint(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得埋点") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:bury-point:query')") + public CommonResult getBuryPoint(@RequestParam("id") Long id) { + BuryPointDO buryPoint = buryPointService.getBuryPoint(id); + return success(BuryPointConvert.INSTANCE.convert(buryPoint)); + } + + @GetMapping("/list") + @Operation(summary = "获得埋点列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:bury-point:query')") + public CommonResult> getBuryPointList(@RequestParam("ids") Collection ids) { + List list = buryPointService.getBuryPointList(ids); + return success(BuryPointConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得埋点分页") + @PreAuthorize("@ss.hasPermission('member:bury-point:query')") + public CommonResult> getBuryPointPage(@Valid BuryPointPageReqVO pageVO) { + PageResult pageResult = buryPointService.getBuryPointPage(pageVO); + return success(BuryPointConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出埋点 Excel") + @PreAuthorize("@ss.hasPermission('member:bury-point:export')") + @OperateLog(type = EXPORT) + public void exportBuryPointExcel(@Valid BuryPointExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = buryPointService.getBuryPointList(exportReqVO); + // 导出 Excel + List datas = BuryPointConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "埋点.xls", "数据", BuryPointExcelVO.class, datas); + } + + @GetMapping("/get-trend-chart") + @Operation(summary = "获取趋势图") + public CommonResult> getTrendChart() { + return success(buryPointService.getTrendChart()); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointBaseVO.java new file mode 100644 index 0000000..7737320 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointBaseVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 埋点 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class BuryPointBaseVO { + + @Schema(description = "用户ID", example = "8201") + private Long userId; + + @Schema(description = "事件") + private String event; + + @Schema(description = "事件参数") + private String eventParameter; + + @Schema(description = "IP") + private String ip; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointCreateReqVO.java new file mode 100644 index 0000000..204ed77 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 埋点创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuryPointCreateReqVO extends BuryPointBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExcelVO.java new file mode 100644 index 0000000..e1468f3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExcelVO.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 埋点 Excel VO + * + * @author admin + */ +@Data +public class BuryPointExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("事件") + private String event; + + @ExcelProperty("事件参数") + private String eventParameter; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("IP") + private String ip; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExportReqVO.java new file mode 100644 index 0000000..a91829a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointExportReqVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 埋点 Excel 导出 Request VO,参数和 BuryPointPageReqVO 是一致的") +@Data +public class BuryPointExportReqVO { + + @Schema(description = "用户ID", example = "8201") + private Long userId; + + @Schema(description = "事件") + private String event; + + @Schema(description = "事件参数") + private String eventParameter; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "IP") + private String ip; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointPageReqVO.java new file mode 100644 index 0000000..f79abc4 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointPageReqVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 埋点分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuryPointPageReqVO extends PageParam { + + @Schema(description = "用户ID", example = "8201") + private Long userId; + + @Schema(description = "事件") + private String event; + + @Schema(description = "事件参数") + private String eventParameter; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "IP") + private String ip; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointRespVO.java new file mode 100644 index 0000000..6054d49 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 埋点 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuryPointRespVO extends BuryPointBaseVO { + + @Schema(description = "主键", required = true, example = "28996") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointUpdateReqVO.java new file mode 100644 index 0000000..4121cfb --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/burypoint/vo/BuryPointUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.burypoint.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 埋点更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuryPointUpdateReqVO extends BuryPointBaseVO { + + @Schema(description = "主键", required = true, example = "28996") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/IntegralRuleController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/IntegralRuleController.java new file mode 100644 index 0000000..4f7b114 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/IntegralRuleController.java @@ -0,0 +1,114 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.*; +import co.yixiang.yshop.module.member.convert.integralrule.IntegralRuleConvert; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import co.yixiang.yshop.module.member.service.integralrule.IntegralRuleService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 会员积分规则") +@RestController +@RequestMapping("/member/integral-rule") +@Validated +public class IntegralRuleController { + + @Resource + private IntegralRuleService integralRuleService; + + @PostMapping("/create") + @Operation(summary = "创建会员积分规则") + @PreAuthorize("@ss.hasPermission('member:integral-rule:create')") + public CommonResult createIntegralRule(@Valid @RequestBody IntegralRuleCreateReqVO createReqVO) { + return success(integralRuleService.createIntegralRule(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员积分规则") + @PreAuthorize("@ss.hasPermission('member:integral-rule:update')") + public CommonResult updateIntegralRule(@Valid @RequestBody IntegralRuleUpdateReqVO updateReqVO) { + integralRuleService.updateIntegralRule(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员积分规则") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:integral-rule:delete')") + public CommonResult deleteIntegralRule(@RequestParam("id") Long id) { + integralRuleService.deleteIntegralRule(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员积分规则") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:integral-rule:query')") + public CommonResult getIntegralRule(@RequestParam("id") Long id) { + IntegralRuleDO integralRule = integralRuleService.getIntegralRule(id); + return success(IntegralRuleConvert.INSTANCE.convert(integralRule)); + } + + @GetMapping("/list") + @Operation(summary = "获得会员积分规则列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:integral-rule:query')") + public CommonResult> getIntegralRuleList(@RequestParam("ids") Collection ids) { + List list = integralRuleService.getIntegralRuleList(ids); + return success(IntegralRuleConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员积分规则分页") + @PreAuthorize("@ss.hasPermission('member:integral-rule:query')") + public CommonResult> getIntegralRulePage(@Valid IntegralRulePageReqVO pageVO) { + PageResult pageResult = integralRuleService.getIntegralRulePage(pageVO); + return success(IntegralRuleConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员积分规则 Excel") + @PreAuthorize("@ss.hasPermission('member:integral-rule:export')") + @OperateLog(type = EXPORT) + public void exportIntegralRuleExcel(@Valid IntegralRuleExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = integralRuleService.getIntegralRuleList(exportReqVO); + // 导出 Excel + List datas = IntegralRuleConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员积分规则.xls", "数据", IntegralRuleExcelVO.class, datas); + } + + @GetMapping("getRule") + @Operation(summary = "查询会员积分规则") + @PreAuthorize("@ss.hasPermission('member:integral-rule:query')") + public CommonResult getRule(){ + IntegralRuleVO vo = integralRuleService.getRule(); + return CommonResult.success(vo); + } + + @PostMapping("saveRule") + @Operation(summary = "保存会员积分规则") + @PreAuthorize("@ss.hasPermission('member:integral-rule:update')") + public CommonResult saveRule(@RequestBody IntegralRuleVO vo){ + integralRuleService.saveRule(vo); + return CommonResult.success(true); + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleBaseVO.java new file mode 100644 index 0000000..47eb497 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleBaseVO.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 会员积分规则 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class IntegralRuleBaseVO { + + @Schema(description = "类型", required = true, example = "1") + @NotNull(message = "类型不能为空") + private String type; + + @Schema(description = "类型名称", example = "yshop") + private String typeName; + + @Schema(description = "获取积分") + private Integer integral; + + @Schema(description = "拓展字段") + private String attribute1; + + @Schema(description = "图标") + private String iconUrl; + + @Schema(description = "是否开启") + private Boolean enable; + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleCreateReqVO.java new file mode 100644 index 0000000..b46c787 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员积分规则创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class IntegralRuleCreateReqVO extends IntegralRuleBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExcelVO.java new file mode 100644 index 0000000..a8a3501 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExcelVO.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 会员积分规则 Excel VO + * + * @author admin + */ +@Data +public class IntegralRuleExcelVO { + + @ExcelProperty("评论ID") + private Long id; + + @ExcelProperty("类型") + private String type; + + @ExcelProperty("类型名称") + private String typeName; + + @ExcelProperty("获取积分") + private Integer integral; + + @ExcelProperty("拓展字段") + private String attribute1; + + @ExcelProperty("添加时间") + private LocalDateTime createTime; + + @ExcelProperty("图标") + private String iconUrl; + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExportReqVO.java new file mode 100644 index 0000000..6a4792b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleExportReqVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员积分规则 Excel 导出 Request VO,参数和 IntegralRulePageReqVO 是一致的") +@Data +public class IntegralRuleExportReqVO { + + @Schema(description = "类型", example = "1") + private String type; + + @Schema(description = "类型名称", example = "yshop") + private String typeName; + + @Schema(description = "获取积分") + private Integer integral; + + @Schema(description = "拓展字段") + private String attribute1; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRulePageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRulePageReqVO.java new file mode 100644 index 0000000..255be54 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRulePageReqVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员积分规则分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class IntegralRulePageReqVO extends PageParam { + + @Schema(description = "类型", example = "1") + private String type; + + @Schema(description = "类型名称", example = "yshop") + private String typeName; + + @Schema(description = "获取积分") + private Integer integral; + + @Schema(description = "拓展字段") + private String attribute1; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleRespVO.java new file mode 100644 index 0000000..082d71a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会员积分规则 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class IntegralRuleRespVO extends IntegralRuleBaseVO { + + @Schema(description = "评论ID", required = true, example = "5350") + private Long id; + + @Schema(description = "添加时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleUpdateReqVO.java new file mode 100644 index 0000000..61db7a0 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员积分规则更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class IntegralRuleUpdateReqVO extends IntegralRuleBaseVO { + + @Schema(description = "评论ID", required = true, example = "5350") + @NotNull(message = "评论ID不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleVO.java new file mode 100644 index 0000000..80c1060 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/integralrule/vo/IntegralRuleVO.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.member.controller.admin.integralrule.vo; + +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class IntegralRuleVO { + @Schema(description = "积分奖励列表") + private List ruleList; + + @Schema(description = "积分抵扣规则") + private String integralDeductionRule; //积分抵扣规则 + @Schema(description = "积分抵扣是否开启") + private String integralEnable; //积分抵扣是否开启 + @Schema(description = "积分名称") + private String integralName; //积分名称 +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/SignInRecordController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/SignInRecordController.java new file mode 100644 index 0000000..9c28dbc --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/SignInRecordController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.signinrecord.SignInRecordDO; +import co.yixiang.yshop.module.member.convert.signinrecord.SignInRecordConvert; +import co.yixiang.yshop.module.member.service.signinrecord.SignInRecordService; + +@Tag(name = "管理后台 - 签到记录") +@RestController +@RequestMapping("/member/sign-in-record") +@Validated +public class SignInRecordController { + + @Resource + private SignInRecordService signInRecordService; + + @PostMapping("/create") + @Operation(summary = "创建签到记录") + @PreAuthorize("@ss.hasPermission('member:sign-in-record:create')") + public CommonResult createSignInRecord(@Valid @RequestBody SignInRecordCreateReqVO createReqVO) { + return success(signInRecordService.createSignInRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新签到记录") + @PreAuthorize("@ss.hasPermission('member:sign-in-record:update')") + public CommonResult updateSignInRecord(@Valid @RequestBody SignInRecordUpdateReqVO updateReqVO) { + signInRecordService.updateSignInRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除签到记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:sign-in-record:delete')") + public CommonResult deleteSignInRecord(@RequestParam("id") Long id) { + signInRecordService.deleteSignInRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得签到记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:sign-in-record:query')") + public CommonResult getSignInRecord(@RequestParam("id") Long id) { + SignInRecordDO signInRecord = signInRecordService.getSignInRecord(id); + return success(SignInRecordConvert.INSTANCE.convert(signInRecord)); + } + + @GetMapping("/list") + @Operation(summary = "获得签到记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:sign-in-record:query')") + public CommonResult> getSignInRecordList(@RequestParam("ids") Collection ids) { + List list = signInRecordService.getSignInRecordList(ids); + return success(SignInRecordConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得签到记录分页") + @PreAuthorize("@ss.hasPermission('member:sign-in-record:query')") + public CommonResult> getSignInRecordPage(@Valid SignInRecordPageReqVO pageVO) { + PageResult pageResult = signInRecordService.getSignInRecordPage(pageVO); + return success(SignInRecordConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出签到记录 Excel") + @PreAuthorize("@ss.hasPermission('member:sign-in-record:export')") + @OperateLog(type = EXPORT) + public void exportSignInRecordExcel(@Valid SignInRecordExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = signInRecordService.getSignInRecordList(exportReqVO); + // 导出 Excel + List datas = SignInRecordConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "签到记录.xls", "数据", SignInRecordExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordBaseVO.java new file mode 100644 index 0000000..46e4225 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordBaseVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 签到记录 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SignInRecordBaseVO { + + @Schema(description = "会员ID", example = "10758") + private Long userId; + + @Schema(description = "积分") + private BigDecimal integral; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordCreateReqVO.java new file mode 100644 index 0000000..c30995f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 签到记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SignInRecordCreateReqVO extends SignInRecordBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExcelVO.java new file mode 100644 index 0000000..180059c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExcelVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 签到记录 Excel VO + * + * @author admin + */ +@Data +public class SignInRecordExcelVO { + + @ExcelProperty("参数主键") + private Long id; + + @ExcelProperty("会员ID") + private Long userId; + + @ExcelProperty("积分") + private Integer integral; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExportReqVO.java new file mode 100644 index 0000000..f35914c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordExportReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 签到记录 Excel 导出 Request VO,参数和 SignInRecordPageReqVO 是一致的") +@Data +public class SignInRecordExportReqVO { + + @Schema(description = "会员ID", example = "10758") + private Long userId; + + @Schema(description = "积分") + private Integer integral; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordPageReqVO.java new file mode 100644 index 0000000..72be04b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 签到记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SignInRecordPageReqVO extends PageParam { + + @Schema(description = "会员ID", example = "10758") + private Long userId; + + @Schema(description = "积分") + private Integer integral; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordRespVO.java new file mode 100644 index 0000000..1e9956e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordRespVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 签到记录 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SignInRecordRespVO extends SignInRecordBaseVO { + + @Schema(description = "参数主键", required = true, example = "25392") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "当天是否签到") + private Boolean isSign = true; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordUpdateReqVO.java new file mode 100644 index 0000000..2fc34ee --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/signinrecord/vo/SignInRecordUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.signinrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 签到记录更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SignInRecordUpdateReqVO extends SignInRecordBaseVO { + + @Schema(description = "参数主键", required = true, example = "25392") + @NotNull(message = "参数主键不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/MemberUserController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/MemberUserController.java index 8dca636..6a5e7ea 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/MemberUserController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/MemberUserController.java @@ -2,9 +2,12 @@ package co.yixiang.yshop.module.member.controller.admin.user; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; import co.yixiang.yshop.module.member.controller.admin.user.vo.*; import co.yixiang.yshop.module.member.convert.user.UserConvert; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.service.signinrecord.SignInRecordService; import co.yixiang.yshop.module.member.service.user.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -14,11 +17,14 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.IOException; import java.util.Collection; import java.util.List; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 用户") @RestController @@ -28,6 +34,8 @@ public class MemberUserController { @Resource private UserService userService; + @Resource + private SignInRecordService signInRecordService; @PostMapping("/create") @Operation(summary = "创建用户") @@ -44,11 +52,11 @@ public class MemberUserController { return success(true); } - @PutMapping("/updateMony") + @PutMapping("/updateMoney") @Operation(summary = "更新用户余额与积分") @PreAuthorize("@ss.hasPermission('member:user:update')") - public CommonResult updateMony(@Valid @RequestBody UserUpdateMoneyReqVO updateReqVO) { - userService.updateMony(updateReqVO); + public CommonResult updateMoney(@Valid @RequestBody UserUpdateMoneyReqVO updateReqVO) { + userService.updateMoney(updateReqVO); return success(true); } @@ -67,7 +75,9 @@ public class MemberUserController { @PreAuthorize("@ss.hasPermission('member:user:query')") public CommonResult getUser(@RequestParam("id") Long id) { MemberUserDO user = userService.getUser(id); - return success(UserConvert.INSTANCE.convert(user,true)); + UserRespVO convert = UserConvert.INSTANCE.convert(user, true); + convert.setSignNum(signInRecordService.countByUserIdThisWeek(id)); + return success(convert); } @GetMapping("/list") @@ -79,14 +89,50 @@ public class MemberUserController { return success(UserConvert.INSTANCE.convertList(list)); } + @GetMapping("/userList") + @Operation(summary = "获得用户列表") + @PreAuthorize("@ss.hasPermission('member:user:query')") + public CommonResult> getUserList(UserExportReqVO exportReqVO) { + List list = userService.getUserList(exportReqVO); + return success(UserConvert.INSTANCE.convertList(list)); + } + @GetMapping("/page") @Operation(summary = "获得用户分页") @PreAuthorize("@ss.hasPermission('member:user:query')") public CommonResult> getUserPage(@Valid UserPageReqVO pageVO) { - PageResult pageResult = userService.getUserPage(pageVO); - return success(UserConvert.INSTANCE.convertPage(pageResult)); + PageResult pageResult = userService.getUserPage(pageVO); + return success(pageResult); } + @GetMapping("/export-excel") + @Operation(summary = "导出会员用户 Excel") + @OperateLog(type = EXPORT) + @PreAuthorize("@ss.hasPermission('member:user:export')") + public void exportMaterialExcel(@Valid UserExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userService.getUserList(exportReqVO); + // 导出 Excel + List voList = UserConvert.INSTANCE.convertListExcel(list); + ExcelUtils.write(response, "会员用户.xls", "数据", MemberUserExcelVO.class, voList); + } + + @PostMapping("updateTag") + @Operation(summary = "更新用户标签") + @PreAuthorize("@ss.hasPermission('member:user:update')") + public CommonResult updateTag(@RequestBody UserUpdateTagDTO dto){ + userService.updateTag(dto); + return CommonResult.success(true); + } + +// @GetMapping("addGrowthValue") +// @Operation(summary = "增加成长值") +// @PreAuthorize("@ss.hasPermission('member:user:update')") +// public CommonResult addGrowthValue(Long userId, String type, BigDecimal consumeAmount){ +// userService.addGrowthValue(userId,type,consumeAmount); +// return CommonResult.success(true); +// } + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/MemberUserExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/MemberUserExcelVO.java new file mode 100644 index 0000000..65d9d58 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/MemberUserExcelVO.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.member.controller.admin.user.vo; + +import co.yixiang.yshop.framework.desensitize.core.slider.annotation.MobileDesensitize; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 素材库 Excel VO + * + * @author yshop + */ +@Data +public class MemberUserExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("用户昵称") + private String nickname; + + @MobileDesensitize + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("用户余额") + private BigDecimal nowMoney; + + @ExcelProperty("登录类型") + private String loginType; + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserBaseVO.java index c296efb..30231b6 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserBaseVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserBaseVO.java @@ -1,17 +1,13 @@ package co.yixiang.yshop.module.member.controller.admin.user.vo; import co.yixiang.yshop.framework.desensitize.core.slider.annotation.MobileDesensitize; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.math.BigDecimal; -import java.math.BigDecimal; +import lombok.Data; + +import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.time.LocalDateTime; -import javax.validation.constraints.*; /** * 用户 Base VO,提供给添加、修改、详细的子 VO 使用 @@ -77,7 +73,7 @@ public class UserBaseVO { private String loginType; @Schema(description = "微信用户json信息") - private WechatUserDto wxProfile; + private WechatUserDTO wxProfile; @Schema(description = "生日") private String birthday; @@ -107,6 +103,31 @@ public class UserBaseVO { */ private String cardId; + /** + * 会员成长值 + */ + private Integer growthValue; + + /** + * 核销权限 + */ + private Boolean writeOffAuthority; + + /** + * 邀请码 + */ + private String invitationCode; + + /** + * 最后登录时间 + */ + private LocalDateTime loginDate; + + /** + * 连续签到天数 + */ + private Integer signNum; + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserCreateReqVO.java index 5472adf..2d3bce3 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserCreateReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserCreateReqVO.java @@ -36,7 +36,6 @@ public class UserCreateReqVO extends UserBaseVO { private String lastIp; @Schema(description = "连续签到天数", required = true) - @NotNull(message = "连续签到天数不能为空") private Integer signNum; @Schema(description = "等级", required = true) diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserExportReqVO.java index 3cd5608..4224b81 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserExportReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserExportReqVO.java @@ -1,12 +1,11 @@ package co.yixiang.yshop.module.member.controller.admin.user.vo; -import lombok.*; -import java.util.*; import io.swagger.v3.oas.annotations.media.Schema; -import co.yixiang.yshop.framework.common.pojo.PageParam; -import java.time.LocalDateTime; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - 用户 Excel 导出 Request VO,参数和 UserPageReqVO 是一致的") @@ -23,10 +22,12 @@ public class UserExportReqVO { private String nickname; @Schema(description = "手机号码") - private String phone; + private String mobile; @Schema(description = "添加时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "名称 模糊搜索") + private String name; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserPageReqVO.java index 8f71339..f7807f8 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserPageReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserPageReqVO.java @@ -34,4 +34,9 @@ public class UserPageReqVO extends PageParam { @Schema(description = "登录类型") private String loginType; + @Schema(description = "标签") + private String tagName; + + private List userIds; + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserRespVO.java index 79af9ff..2e96d30 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserRespVO.java @@ -1,8 +1,11 @@ package co.yixiang.yshop.module.member.controller.admin.user.vo; +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.UserTagRefRespVO; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "管理后台 - 用户 Response VO") @Data @@ -16,4 +19,8 @@ public class UserRespVO extends UserBaseVO { @Schema(description = "添加时间") private LocalDateTime createTime; + @Schema(description = "标签列表") + private List tagList; + + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateMoneyReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateMoneyReqVO.java index e31961e..ab6e38c 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateMoneyReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateMoneyReqVO.java @@ -16,7 +16,7 @@ import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class UserUpdateMoneyReqVO { - @Schema(description = "用户id", required = true, example = "16370") + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "16370") @NotNull(message = "用户id不能为空") private Long id; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateTagDTO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateTagDTO.java new file mode 100644 index 0000000..de600e3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/user/vo/UserUpdateTagDTO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class UserUpdateTagDTO { + @Schema(description = "用户ID") + private Long id; + + @Schema(description = "标签列表") + private List tagIdList; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressBaseVO.java index 76815dd..6b7542c 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressBaseVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressBaseVO.java @@ -3,9 +3,6 @@ package co.yixiang.yshop.module.member.controller.admin.useraddress.vo; import co.yixiang.yshop.framework.desensitize.core.slider.annotation.MobileDesensitize; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; import javax.validation.constraints.*; /** @@ -15,51 +12,51 @@ import javax.validation.constraints.*; @Data public class UserAddressBaseVO { - @Schema(description = "用户id", required = true, example = "25124") + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25124") @NotNull(message = "用户id不能为空") private Long uid; - @Schema(description = "收货人姓名", required = true, example = "李四") + @Schema(description = "收货人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") @NotNull(message = "收货人姓名不能为空") private String realName; @MobileDesensitize - @Schema(description = "收货人电话", required = true) + @Schema(description = "收货人电话", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "收货人电话不能为空") private String phone; - @Schema(description = "收货人所在省", required = true) + @Schema(description = "收货人所在省", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "收货人所在省不能为空") private String province; - @Schema(description = "收货人所在市", required = true) + @Schema(description = "收货人所在市", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "收货人所在市不能为空") private String city; @Schema(description = "城市id", example = "15595") private Integer cityId; - @Schema(description = "收货人所在区", required = true) + @Schema(description = "收货人所在区", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "收货人所在区不能为空") private String district; - @Schema(description = "收货人详细地址", required = true) + @Schema(description = "收货人详细地址", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "收货人详细地址不能为空") private String detail; - @Schema(description = "邮编", required = true) + @Schema(description = "邮编", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "邮编不能为空") private String postCode; - @Schema(description = "经度", required = true) + @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "经度不能为空") private String longitude; - @Schema(description = "纬度", required = true) + @Schema(description = "纬度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "纬度不能为空") private String latitude; - @Schema(description = "是否默认", required = true) + @Schema(description = "是否默认", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "是否默认不能为空") private Byte isDefault; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressRespVO.java index 42512cf..8de0076 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressRespVO.java @@ -10,10 +10,10 @@ import java.time.LocalDateTime; @ToString(callSuper = true) public class UserAddressRespVO extends UserAddressBaseVO { - @Schema(description = "用户地址id", required = true, example = "24169") + @Schema(description = "用户地址id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private Long id; - @Schema(description = "添加时间", required = true) + @Schema(description = "添加时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressUpdateReqVO.java index 768d344..e614d70 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressUpdateReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/useraddress/vo/UserAddressUpdateReqVO.java @@ -11,7 +11,7 @@ import javax.validation.constraints.*; @ToString(callSuper = true) public class UserAddressUpdateReqVO extends UserAddressBaseVO { - @Schema(description = "用户地址id", required = true, example = "24169") + @Schema(description = "用户地址id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") @NotNull(message = "用户地址id不能为空") private Long id; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/UserBillController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/UserBillController.java index 783c8fe..cfbb884 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/UserBillController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/UserBillController.java @@ -1,30 +1,21 @@ package co.yixiang.yshop.module.member.controller.admin.userbill; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import javax.validation.constraints.*; -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; -import java.io.IOException; - -import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.common.pojo.CommonResult; -import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; - -import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; -import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; - -import co.yixiang.yshop.module.member.controller.admin.userbill.vo.*; -import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; -import co.yixiang.yshop.module.member.convert.userbill.UserBillConvert; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillRespVO; import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 用户账单") @RestController @@ -38,10 +29,10 @@ public class UserBillController { @GetMapping("/page") @Operation(summary = "获得用户账单分页") - @PreAuthorize("@ss.hasPermission('member:user-bill:query')") + //@PreAuthorize("@ss.hasPermission('member:user-bill:query')") public CommonResult> getUserBillPage(@Valid UserBillPageReqVO pageVO) { - PageResult pageResult = userBillService.getUserBillPage(pageVO); - return success(UserBillConvert.INSTANCE.convertPage(pageResult)); + PageResult pageResult = userBillService.getUserBillPageAdmin(pageVO); + return success(pageResult); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillModifyDTO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillModifyDTO.java new file mode 100644 index 0000000..dc6df7e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillModifyDTO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.userbill.vo; + +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.enums.BillEnum; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author pepis + * @apiNote + **/ +@Data +@Builder +public class UserBillModifyDTO { + // 用户id + private Long uid; + // 变动金额 包含负数 + private BigDecimal amount; + // 变动后金额 + private BigDecimal afterAmount ; + // 关联id + private Long linkId; + // 变动类型 + private BillDetailEnum typeEnum; + // 分类 + private BillDetailEnum categoryEnum; + // 收入/支出 + private BillEnum pmType; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillPageReqVO.java index 6a8f32f..de5e2f7 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillPageReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillPageReqVO.java @@ -1,12 +1,13 @@ package co.yixiang.yshop.module.member.controller.admin.userbill.vo; -import lombok.*; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import co.yixiang.yshop.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -51,4 +52,7 @@ public class UserBillPageReqVO extends PageParam { @Schema(description = "0 = 带确定 1 = 有效 -1 = 无效", example = "1") private Boolean status; + @Schema(description = "昵称") + private String nickname; + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillRespVO.java index 8e38c5d..d5687e2 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userbill/vo/UserBillRespVO.java @@ -2,8 +2,10 @@ package co.yixiang.yshop.module.member.controller.admin.userbill.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + import java.time.LocalDateTime; + @Schema(description = "管理后台 - 用户账单 Response VO") @Data @EqualsAndHashCode(callSuper = true) @@ -16,4 +18,10 @@ public class UserBillRespVO extends UserBillBaseVO { @Schema(description = "添加时间", required = true) private LocalDateTime createTime; + @Schema(description = "昵称") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/UserInviteLogController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/UserInviteLogController.java new file mode 100644 index 0000000..7cdb158 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/UserInviteLogController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userinvitelog.UserInviteLogDO; +import co.yixiang.yshop.module.member.convert.userinvitelog.UserInviteLogConvert; +import co.yixiang.yshop.module.member.service.userinvitelog.UserInviteLogService; + +@Tag(name = "管理后台 - 邀请日志") +@RestController +@RequestMapping("/member/user-invite-log") +@Validated +public class UserInviteLogController { + + @Resource + private UserInviteLogService userInviteLogService; + + @PostMapping("/create") + @Operation(summary = "创建邀请日志") + @PreAuthorize("@ss.hasPermission('member:user-invite-log:create')") + public CommonResult createUserInviteLog(@Valid @RequestBody UserInviteLogCreateReqVO createReqVO) { + return success(userInviteLogService.createUserInviteLog(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新邀请日志") + @PreAuthorize("@ss.hasPermission('member:user-invite-log:update')") + public CommonResult updateUserInviteLog(@Valid @RequestBody UserInviteLogUpdateReqVO updateReqVO) { + userInviteLogService.updateUserInviteLog(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除邀请日志") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-invite-log:delete')") + public CommonResult deleteUserInviteLog(@RequestParam("id") Long id) { + userInviteLogService.deleteUserInviteLog(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得邀请日志") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-invite-log:query')") + public CommonResult getUserInviteLog(@RequestParam("id") Long id) { + UserInviteLogDO userInviteLog = userInviteLogService.getUserInviteLog(id); + return success(UserInviteLogConvert.INSTANCE.convert(userInviteLog)); + } + + @GetMapping("/list") + @Operation(summary = "获得邀请日志列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:user-invite-log:query')") + public CommonResult> getUserInviteLogList(@RequestParam("ids") Collection ids) { + List list = userInviteLogService.getUserInviteLogList(ids); + return success(UserInviteLogConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得邀请日志分页") + @PreAuthorize("@ss.hasPermission('member:user-invite-log:query')") + public CommonResult> getUserInviteLogPage(@Valid UserInviteLogPageReqVO pageVO) { + PageResult pageResult = userInviteLogService.getUserInviteLogPage(pageVO); + return success(UserInviteLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出邀请日志 Excel") + @PreAuthorize("@ss.hasPermission('member:user-invite-log:export')") + @OperateLog(type = EXPORT) + public void exportUserInviteLogExcel(@Valid UserInviteLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userInviteLogService.getUserInviteLogList(exportReqVO); + // 导出 Excel + List datas = UserInviteLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "邀请日志.xls", "数据", UserInviteLogExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogBaseVO.java new file mode 100644 index 0000000..7e4ef94 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogBaseVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 邀请日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserInviteLogBaseVO { + + @Schema(description = "邀请用户id", required = true, example = "19165") + @NotNull(message = "邀请用户id不能为空") + private Long userId; + + @Schema(description = "被邀请用户id", required = true, example = "8214") + @NotNull(message = "被邀请用户id不能为空") + private Long beInviteUserId; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogCreateReqVO.java new file mode 100644 index 0000000..380591e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 邀请日志创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserInviteLogCreateReqVO extends UserInviteLogBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExcelVO.java new file mode 100644 index 0000000..e4fb3c0 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExcelVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 邀请日志 Excel VO + * + * @author admin + */ +@Data +public class UserInviteLogExcelVO { + + @ExcelProperty("评论ID") + private Long id; + + @ExcelProperty("邀请用户id") + private Long userId; + + @ExcelProperty("被邀请用户id") + private Long beInviteUserId; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExportReqVO.java new file mode 100644 index 0000000..a03824b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogExportReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邀请日志 Excel 导出 Request VO,参数和 UserInviteLogPageReqVO 是一致的") +@Data +public class UserInviteLogExportReqVO { + + @Schema(description = "邀请用户id", example = "19165") + private Long userId; + + @Schema(description = "被邀请用户id", example = "8214") + private Long beInviteUserId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogPageReqVO.java new file mode 100644 index 0000000..da986b1 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邀请日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserInviteLogPageReqVO extends PageParam { + + @Schema(description = "邀请用户id", example = "19165") + private Long userId; + + @Schema(description = "被邀请用户id", example = "8214") + private Long beInviteUserId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogRespVO.java new file mode 100644 index 0000000..7307c69 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 邀请日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserInviteLogRespVO extends UserInviteLogBaseVO { + + @Schema(description = "评论ID", required = true, example = "12248") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogUpdateReqVO.java new file mode 100644 index 0000000..8d8fcb3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userinvitelog/vo/UserInviteLogUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 邀请日志更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserInviteLogUpdateReqVO extends UserInviteLogBaseVO { + + @Schema(description = "评论ID", required = true, example = "12248") + @NotNull(message = "评论ID不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/UserLevelConfigController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/UserLevelConfigController.java new file mode 100644 index 0000000..c7010fe --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/UserLevelConfigController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import co.yixiang.yshop.module.member.convert.userlevelconfig.UserLevelConfigConvert; +import co.yixiang.yshop.module.member.service.userlevelconfig.UserLevelConfigService; + +@Tag(name = "管理后台 - 会员等级配置") +@RestController +@RequestMapping("/member/user-level-config") +@Validated +public class UserLevelConfigController { + + @Resource + private UserLevelConfigService userLevelConfigService; + + @PostMapping("/create") + @Operation(summary = "创建会员等级配置") + @PreAuthorize("@ss.hasPermission('member:user-level-config:create')") + public CommonResult createUserLevelConfig(@Valid @RequestBody UserLevelConfigCreateReqVO createReqVO) { + return success(userLevelConfigService.createUserLevelConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员等级配置") + @PreAuthorize("@ss.hasPermission('member:user-level-config:update')") + public CommonResult updateUserLevelConfig(@Valid @RequestBody UserLevelConfigUpdateReqVO updateReqVO) { + userLevelConfigService.updateUserLevelConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员等级配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-level-config:delete')") + public CommonResult deleteUserLevelConfig(@RequestParam("id") Long id) { + userLevelConfigService.deleteUserLevelConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员等级配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-level-config:query')") + public CommonResult getUserLevelConfig(@RequestParam("id") Long id) { + UserLevelConfigRespVO vo = userLevelConfigService.getUserLevelConfigVO(id); + return success(vo); + } + + @GetMapping("/list") + @Operation(summary = "获得会员等级配置列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:user-level-config:query')") + public CommonResult> getUserLevelConfigList(@RequestParam("ids") Collection ids) { + List list = userLevelConfigService.getUserLevelConfigList(ids); + return success(UserLevelConfigConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员等级配置分页") + @PreAuthorize("@ss.hasPermission('member:user-level-config:query')") + public CommonResult> getUserLevelConfigPage(@Valid UserLevelConfigPageReqVO pageVO) { + PageResult pageResult = userLevelConfigService.getUserLevelConfigPage(pageVO); + return success(UserLevelConfigConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员等级配置 Excel") + @PreAuthorize("@ss.hasPermission('member:user-level-config:export')") + @OperateLog(type = EXPORT) + public void exportUserLevelConfigExcel(@Valid UserLevelConfigExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userLevelConfigService.getUserLevelConfigList(exportReqVO); + // 导出 Excel + List datas = UserLevelConfigConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员等级配置.xls", "数据", UserLevelConfigExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigBaseVO.java new file mode 100644 index 0000000..29b2ae5 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigBaseVO.java @@ -0,0 +1,42 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 会员等级配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserLevelConfigBaseVO { + + @Schema(description = "等级名称", required = true, example = "yshop") + @NotNull(message = "等级名称不能为空") + private String levelName; + + @Schema(description = "等级", required = true) + @NotNull(message = "等级不能为空") + private Integer level; + + @Schema(description = "成长值", required = true) + @NotNull(message = "成长值不能为空") + private Integer growthValue; + + @Schema(description = "图标", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "背景", example = "https://www.yixiang.co") + private String backgroundUrl; + + @Schema(description = "状态", example = "1") + private Boolean status; + + @Schema(description = "说明") + private String remarks; + + @Schema(description = "色号") + private String colorNum; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigCreateReqVO.java new file mode 100644 index 0000000..aee4e21 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigCreateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.UserLevelEquityRefCreateReqVO; +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员等级配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelConfigCreateReqVO extends UserLevelConfigBaseVO { + + @Schema(description = "权益值列表") + private List levelEquityList; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExcelVO.java new file mode 100644 index 0000000..25c49ef --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExcelVO.java @@ -0,0 +1,46 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 会员等级配置 Excel VO + * + * @author admin + */ +@Data +public class UserLevelConfigExcelVO { + + @ExcelProperty("参数主键") + private Long id; + + @ExcelProperty("等级名称") + private String levelName; + + @ExcelProperty("等级") + private Integer level; + + @ExcelProperty("成长值") + private Integer growthValue; + + @ExcelProperty("图标") + private String iconUrl; + + @ExcelProperty("背景") + private String backgroundUrl; + + @ExcelProperty("状态") + private Boolean status; + + @ExcelProperty("说明") + private String remarks; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExportReqVO.java new file mode 100644 index 0000000..5d48729 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigExportReqVO.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员等级配置 Excel 导出 Request VO,参数和 UserLevelConfigPageReqVO 是一致的") +@Data +public class UserLevelConfigExportReqVO { + + @Schema(description = "等级名称", example = "yshop") + private String levelName; + + @Schema(description = "等级") + private Integer level; + + @Schema(description = "成长值") + private Integer growthValue; + + @Schema(description = "图标", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "背景", example = "https://www.yixiang.co") + private String backgroundUrl; + + @Schema(description = "状态", example = "1") + private Boolean status; + + @Schema(description = "说明") + private String remarks; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigPageReqVO.java new file mode 100644 index 0000000..ff4a07f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigPageReqVO.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员等级配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelConfigPageReqVO extends PageParam { + + @Schema(description = "等级名称", example = "yshop") + private String levelName; + + @Schema(description = "等级") + private Integer level; + + @Schema(description = "成长值") + private Integer growthValue; + + @Schema(description = "图标", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "背景", example = "https://www.yixiang.co") + private String backgroundUrl; + + @Schema(description = "状态", example = "1") + private Boolean status; + + @Schema(description = "说明") + private String remarks; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigRespVO.java new file mode 100644 index 0000000..081f746 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigRespVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.UserLevelEquityRefCreateReqVO; +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.UserLevelEquityRefRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 会员等级配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelConfigRespVO extends UserLevelConfigBaseVO { + + @Schema(description = "参数主键", required = true, example = "18027") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + @Schema(description = "权益值列表") + private List levelEquityList; + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigUpdateReqVO.java new file mode 100644 index 0000000..a9b3ff3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelconfig/vo/UserLevelConfigUpdateReqVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.UserLevelEquityRefCreateReqVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员等级配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelConfigUpdateReqVO extends UserLevelConfigBaseVO { + + @Schema(description = "参数主键", required = true, example = "18027") + @NotNull(message = "参数主键不能为空") + private Long id; + + @Schema(description = "权益值列表") + private List levelEquityList; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/UserLevelEquityController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/UserLevelEquityController.java new file mode 100644 index 0000000..256dcc5 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/UserLevelEquityController.java @@ -0,0 +1,101 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.module.member.convert.userlevelequity.UserLevelEquityConvert; +import co.yixiang.yshop.module.member.service.userlevelequity.UserLevelEquityService; + +@Tag(name = "管理后台 - 会员等级权益配置") +@RestController +@RequestMapping("/member/user-level-equity") +@Validated +public class UserLevelEquityController { + + @Resource + private UserLevelEquityService userLevelEquityService; + + @PostMapping("/create") + @Operation(summary = "创建会员等级权益配置") + @PreAuthorize("@ss.hasPermission('member:user-level-equity:create')") + public CommonResult createUserLevelEquity(@Valid @RequestBody UserLevelEquityCreateReqVO createReqVO) { + return success(userLevelEquityService.createUserLevelEquity(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员等级权益配置") + @PreAuthorize("@ss.hasPermission('member:user-level-equity:update')") + public CommonResult updateUserLevelEquity(@Valid @RequestBody UserLevelEquityUpdateReqVO updateReqVO) { + userLevelEquityService.updateUserLevelEquity(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员等级权益配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-level-equity:delete')") + public CommonResult deleteUserLevelEquity(@RequestParam("id") Long id) { + userLevelEquityService.deleteUserLevelEquity(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员等级权益配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-level-equity:query')") + public CommonResult getUserLevelEquity(@RequestParam("id") Long id) { + UserLevelEquityDO userLevelEquity = userLevelEquityService.getUserLevelEquity(id); + return success(UserLevelEquityConvert.INSTANCE.convert(userLevelEquity)); + } + + @GetMapping("/list") + @Operation(summary = "获得会员等级权益配置列表") + @PreAuthorize("@ss.hasPermission('member:user-level-equity:query')") + public CommonResult> getUserLevelEquityList() { + List list = userLevelEquityService.getUserLevelEquityList(); + return success(UserLevelEquityConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员等级权益配置分页") + @PreAuthorize("@ss.hasPermission('member:user-level-equity:query')") + public CommonResult> getUserLevelEquityPage(@Valid UserLevelEquityPageReqVO pageVO) { + PageResult pageResult = userLevelEquityService.getUserLevelEquityPage(pageVO); + return success(UserLevelEquityConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员等级权益配置 Excel") + @PreAuthorize("@ss.hasPermission('member:user-level-equity:export')") + @OperateLog(type = EXPORT) + public void exportUserLevelEquityExcel(@Valid UserLevelEquityExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userLevelEquityService.getUserLevelEquityList(exportReqVO); + // 导出 Excel + List datas = UserLevelEquityConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员等级权益配置.xls", "数据", UserLevelEquityExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityBaseVO.java new file mode 100644 index 0000000..dc0c7c4 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityBaseVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** +* 会员等级权益配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserLevelEquityBaseVO { + + @Schema(description = "权益类型", example = "1") + private String type; + + @Schema(description = "类型名称", example = "张三") + private String typeName; + + + @Schema(description = "图标", example = "https://www.yixiang.co") + private String iconUrl; + + @Schema(description = "权益值") + private Long equityValue; + + @Schema(description = "说明") + private String remarks; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityCreateReqVO.java new file mode 100644 index 0000000..b889087 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员等级权益配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityCreateReqVO extends UserLevelEquityBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExcelVO.java new file mode 100644 index 0000000..8aa975a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExcelVO.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 会员等级权益配置 Excel VO + * + * @author admin + */ +@Data +public class UserLevelEquityExcelVO { + + @ExcelProperty("参数主键") + private Long id; + + @ExcelProperty("权益类型") + private String type; + + @ExcelProperty("类型名称") + private String typeName; + + + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("图标") + private String iconUrl; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExportReqVO.java new file mode 100644 index 0000000..4d72cc1 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityExportReqVO.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员等级权益配置 Excel 导出 Request VO,参数和 UserLevelEquityPageReqVO 是一致的") +@Data +public class UserLevelEquityExportReqVO { + + @Schema(description = "权益类型", example = "1") + private String type; + + @Schema(description = "类型名称", example = "张三") + private String typeName; + + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "图标", example = "https://www.yixiang.co") + private String iconUrl; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityPageReqVO.java new file mode 100644 index 0000000..f20cdbe --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityPageReqVO.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员等级权益配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityPageReqVO extends PageParam { + + @Schema(description = "权益类型", example = "1") + private String type; + + @Schema(description = "类型名称", example = "张三") + private String typeName; + + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "图标", example = "https://www.yixiang.co") + private String iconUrl; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityRespVO.java new file mode 100644 index 0000000..9fee4e8 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会员等级权益配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityRespVO extends UserLevelEquityBaseVO { + + @Schema(description = "参数主键", required = true, example = "19360") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityUpdateReqVO.java new file mode 100644 index 0000000..e264310 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequity/vo/UserLevelEquityUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员等级权益配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityUpdateReqVO extends UserLevelEquityBaseVO { + + @Schema(description = "参数主键", required = true, example = "19360") + @NotNull(message = "参数主键不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/UserLevelEquityRefController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/UserLevelEquityRefController.java new file mode 100644 index 0000000..33e32aa --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/UserLevelEquityRefController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; +import co.yixiang.yshop.module.member.convert.userlevelequityref.UserLevelEquityRefConvert; +import co.yixiang.yshop.module.member.service.userlevelequityref.UserLevelEquityRefService; + +@Tag(name = "管理后台 - 会员等级权益中间") +@RestController +@RequestMapping("/member/user-level-equity-ref") +@Validated +public class UserLevelEquityRefController { + + @Resource + private UserLevelEquityRefService userLevelEquityRefService; + + @PostMapping("/create") + @Operation(summary = "创建会员等级权益中间") + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:create')") + public CommonResult createUserLevelEquityRef(@Valid @RequestBody UserLevelEquityRefCreateReqVO createReqVO) { + return success(userLevelEquityRefService.createUserLevelEquityRef(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员等级权益中间") + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:update')") + public CommonResult updateUserLevelEquityRef(@Valid @RequestBody UserLevelEquityRefUpdateReqVO updateReqVO) { + userLevelEquityRefService.updateUserLevelEquityRef(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员等级权益中间") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:delete')") + public CommonResult deleteUserLevelEquityRef(@RequestParam("id") Long id) { + userLevelEquityRefService.deleteUserLevelEquityRef(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员等级权益中间") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:query')") + public CommonResult getUserLevelEquityRef(@RequestParam("id") Long id) { + UserLevelEquityRefDO userLevelEquityRef = userLevelEquityRefService.getUserLevelEquityRef(id); + return success(UserLevelEquityRefConvert.INSTANCE.convert(userLevelEquityRef)); + } + + @GetMapping("/list") + @Operation(summary = "获得会员等级权益中间列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:query')") + public CommonResult> getUserLevelEquityRefList(@RequestParam("ids") Collection ids) { + List list = userLevelEquityRefService.getUserLevelEquityRefList(ids); + return success(UserLevelEquityRefConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员等级权益中间分页") + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:query')") + public CommonResult> getUserLevelEquityRefPage(@Valid UserLevelEquityRefPageReqVO pageVO) { + PageResult pageResult = userLevelEquityRefService.getUserLevelEquityRefPage(pageVO); + return success(UserLevelEquityRefConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员等级权益中间 Excel") + @PreAuthorize("@ss.hasPermission('member:user-level-equity-ref:export')") + @OperateLog(type = EXPORT) + public void exportUserLevelEquityRefExcel(@Valid UserLevelEquityRefExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userLevelEquityRefService.getUserLevelEquityRefList(exportReqVO); + // 导出 Excel + List datas = UserLevelEquityRefConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员等级权益中间.xls", "数据", UserLevelEquityRefExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefBaseVO.java new file mode 100644 index 0000000..df014ac --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefBaseVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 会员等级权益中间 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserLevelEquityRefBaseVO { + + @Schema(description = "等级ID", required = true, example = "31064") + @NotNull(message = "等级ID不能为空") + private Long levelId; + + @Schema(description = "权益ID", required = true, example = "6319") + @NotNull(message = "权益ID不能为空") + private Long equityId; + + @Schema(description = "权益值") + private Long equityValue; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefCreateReqVO.java new file mode 100644 index 0000000..fd47502 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员等级权益中间创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityRefCreateReqVO extends UserLevelEquityRefBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExcelVO.java new file mode 100644 index 0000000..39e7736 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExcelVO.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 会员等级权益中间 Excel VO + * + * @author admin + */ +@Data +public class UserLevelEquityRefExcelVO { + + @ExcelProperty("参数主键") + private Long id; + + @ExcelProperty("等级ID") + private Long levelId; + + @ExcelProperty("权益ID") + private Long equityId; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("权益值") + private Long equityValue; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExportReqVO.java new file mode 100644 index 0000000..9c4e475 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefExportReqVO.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员等级权益中间 Excel 导出 Request VO,参数和 UserLevelEquityRefPageReqVO 是一致的") +@Data +public class UserLevelEquityRefExportReqVO { + + @Schema(description = "等级ID", example = "31064") + private Long levelId; + + @Schema(description = "权益ID", example = "6319") + private Long equityId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + + @Schema(description = "权益值") + private Long equityValue; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefPageReqVO.java new file mode 100644 index 0000000..a6786a8 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员等级权益中间分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityRefPageReqVO extends PageParam { + + @Schema(description = "等级ID", example = "31064") + private Long levelId; + + @Schema(description = "权益ID", example = "6319") + private Long equityId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefRespVO.java new file mode 100644 index 0000000..a7467fa --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefRespVO.java @@ -0,0 +1,20 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会员等级权益中间 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityRefRespVO extends UserLevelEquityRefBaseVO { + + @Schema(description = "参数主键", required = true, example = "11096") + private Long id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefUpdateReqVO.java new file mode 100644 index 0000000..930e5ba --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelequityref/vo/UserLevelEquityRefUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员等级权益中间更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelEquityRefUpdateReqVO extends UserLevelEquityRefBaseVO { + + @Schema(description = "参数主键", required = true, example = "11096") + @NotNull(message = "参数主键不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigController.java new file mode 100644 index 0000000..5975ba1 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigController.java @@ -0,0 +1,102 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import co.yixiang.yshop.module.member.convert.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigConvert; +import co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigService; + +@Tag(name = "管理后台 - 会员成长任务配置") +@RestController +@RequestMapping("/member/user-level-growth-value-config") +@Validated +public class UserLevelGrowthValueConfigController { + + @Resource + private UserLevelGrowthValueConfigService userLevelGrowthValueConfigService; + + @PostMapping("/create") + @Operation(summary = "创建会员成长任务配置") + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:create')") + public CommonResult createUserLevelGrowthValueConfig(@Valid @RequestBody UserLevelGrowthValueConfigCreateReqVO createReqVO) { + return success(userLevelGrowthValueConfigService.createUserLevelGrowthValueConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员成长任务配置") + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:update')") + public CommonResult updateUserLevelGrowthValueConfig(@Valid @RequestBody UserLevelGrowthValueConfigUpdateReqVO updateReqVO) { + userLevelGrowthValueConfigService.updateUserLevelGrowthValueConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员成长任务配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:delete')") + public CommonResult deleteUserLevelGrowthValueConfig(@RequestParam("id") Integer id) { + userLevelGrowthValueConfigService.deleteUserLevelGrowthValueConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员成长任务配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:query')") + public CommonResult getUserLevelGrowthValueConfig(@RequestParam("id") Integer id) { + UserLevelGrowthValueConfigDO userLevelGrowthValueConfig = userLevelGrowthValueConfigService.getUserLevelGrowthValueConfig(id); + return success(UserLevelGrowthValueConfigConvert.INSTANCE.convert(userLevelGrowthValueConfig)); + } + + @GetMapping("/list") + @Operation(summary = "获得会员成长任务配置列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:query')") + public CommonResult> getUserLevelGrowthValueConfigList(@RequestParam("ids") Collection ids) { + List list = userLevelGrowthValueConfigService.getUserLevelGrowthValueConfigList(ids); + return success(UserLevelGrowthValueConfigConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员成长任务配置分页") + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:query')") + public CommonResult> getUserLevelGrowthValueConfigPage(@Valid UserLevelGrowthValueConfigPageReqVO pageVO) { + PageResult pageResult = userLevelGrowthValueConfigService.getUserLevelGrowthValueConfigPage(pageVO); + return success(UserLevelGrowthValueConfigConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员成长任务配置 Excel") + @PreAuthorize("@ss.hasPermission('member:user-level-growth-value-config:export')") + @OperateLog(type = EXPORT) + public void exportUserLevelGrowthValueConfigExcel(@Valid UserLevelGrowthValueConfigExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userLevelGrowthValueConfigService.getUserLevelGrowthValueConfigList(exportReqVO); + // 导出 Excel + List datas = UserLevelGrowthValueConfigConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员成长任务配置.xls", "数据", UserLevelGrowthValueConfigExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigBaseVO.java new file mode 100644 index 0000000..d34c0e8 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigBaseVO.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** +* 会员成长任务配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserLevelGrowthValueConfigBaseVO { + + @Schema(description = "成长任务类型", example = "2") + private String type; + + @Schema(description = "类型名称", example = "王五") + private String typeName; + + @Schema(description = "成长值") + private Integer growthValue; + + @Schema(description = "图标") + private String iconUrl; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigCreateReqVO.java new file mode 100644 index 0000000..bce5b4c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员成长任务配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelGrowthValueConfigCreateReqVO extends UserLevelGrowthValueConfigBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExcelVO.java new file mode 100644 index 0000000..e3f3a7a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExcelVO.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 会员成长任务配置 Excel VO + * + * @author admin + */ +@Data +public class UserLevelGrowthValueConfigExcelVO { + + @ExcelProperty("参数主键") + private Integer id; + + @ExcelProperty("成长任务类型") + private String type; + + @ExcelProperty("类型名称") + private String typeName; + + @ExcelProperty("成长值") + private Long growthValue; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExportReqVO.java new file mode 100644 index 0000000..66225d7 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigExportReqVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员成长任务配置 Excel 导出 Request VO,参数和 UserLevelGrowthValueConfigPageReqVO 是一致的") +@Data +public class UserLevelGrowthValueConfigExportReqVO { + + @Schema(description = "成长任务类型", example = "2") + private String type; + + @Schema(description = "类型名称", example = "王五") + private String typeName; + + @Schema(description = "成长值") + private Long growthValue; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigPageReqVO.java new file mode 100644 index 0000000..b8e694c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigPageReqVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员成长任务配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelGrowthValueConfigPageReqVO extends PageParam { + + @Schema(description = "成长任务类型", example = "2") + private String type; + + @Schema(description = "类型名称", example = "王五") + private String typeName; + + @Schema(description = "成长值") + private Long growthValue; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigRespVO.java new file mode 100644 index 0000000..24752b9 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会员成长任务配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelGrowthValueConfigRespVO extends UserLevelGrowthValueConfigBaseVO { + + @Schema(description = "参数主键", required = true, example = "871") + private Integer id; + + @Schema(description = "创建时间", required = true) + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigUpdateReqVO.java new file mode 100644 index 0000000..894ae22 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/userlevelgrowthvalueconfig/vo/UserLevelGrowthValueConfigUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员成长任务配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserLevelGrowthValueConfigUpdateReqVO extends UserLevelGrowthValueConfigBaseVO { + + @Schema(description = "参数主键", required = true, example = "871") + @NotNull(message = "参数主键不能为空") + private Integer id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/UserTagController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/UserTagController.java new file mode 100644 index 0000000..0c106cf --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/UserTagController.java @@ -0,0 +1,101 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.usertag.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertag.UserTagDO; +import co.yixiang.yshop.module.member.convert.usertag.UserTagConvert; +import co.yixiang.yshop.module.member.service.usertag.UserTagService; + +@Tag(name = "管理后台 - 会员标签") +@RestController +@RequestMapping("/member/user-tag") +@Validated +public class UserTagController { + + @Resource + private UserTagService userTagService; + + @PostMapping("/create") + @Operation(summary = "创建会员标签") + @PreAuthorize("@ss.hasPermission('member:user-tag:create')") + public CommonResult createUserTag(@Valid @RequestBody UserTagCreateReqVO createReqVO) { + return success(userTagService.createUserTag(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员标签") + @PreAuthorize("@ss.hasPermission('member:user-tag:update')") + public CommonResult updateUserTag(@Valid @RequestBody UserTagUpdateReqVO updateReqVO) { + userTagService.updateUserTag(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员标签") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-tag:delete')") + public CommonResult deleteUserTag(@RequestParam("id") Long id) { + userTagService.deleteUserTag(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员标签") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-tag:query')") + public CommonResult getUserTag(@RequestParam("id") Long id) { + UserTagDO userTag = userTagService.getUserTag(id); + return success(UserTagConvert.INSTANCE.convert(userTag)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员标签分页") + @PreAuthorize("@ss.hasPermission('member:user-tag:query')") + public CommonResult> getUserTagPage(@Valid UserTagPageReqVO pageVO) { + PageResult pageResult = userTagService.getUserTagPage(pageVO); + return success(UserTagConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list") + @Operation(summary = "获得会员标签列表") + @PreAuthorize("@ss.hasPermission('member:user-tag:query')") + public CommonResult> getUserTagList(@Valid UserTagPageReqVO pageVO) { + List list = userTagService.getUserTagList(pageVO); + return success(UserTagConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员标签 Excel") + @PreAuthorize("@ss.hasPermission('member:user-tag:export')") + @OperateLog(type = EXPORT) + public void exportUserTagExcel(@Valid UserTagExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userTagService.getUserTagList(exportReqVO); + // 导出 Excel + List datas = UserTagConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员标签.xls", "数据", UserTagExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagBaseVO.java new file mode 100644 index 0000000..e3d2ba7 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagBaseVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 会员标签 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserTagBaseVO { + + @Schema(description = "标签名称", example = "yshop") + private String tagName; + + @Schema(description = "分组ID", example = "14361") + private Long groupId; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagCreateReqVO.java new file mode 100644 index 0000000..5c89b1f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员标签创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagCreateReqVO extends UserTagBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExcelVO.java new file mode 100644 index 0000000..2e6ccb6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExcelVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 会员标签 Excel VO + * + * @author admin + */ +@Data +public class UserTagExcelVO { + + @ExcelProperty("用户id") + private Long id; + + @ExcelProperty("标签名称") + private String tagName; + + @ExcelProperty("分组ID") + private Long groupId; + + @ExcelProperty("添加时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExportReqVO.java new file mode 100644 index 0000000..a8a2480 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagExportReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员标签 Excel 导出 Request VO,参数和 UserTagPageReqVO 是一致的") +@Data +public class UserTagExportReqVO { + + @Schema(description = "标签名称", example = "yshop") + private String tagName; + + @Schema(description = "分组ID", example = "14361") + private Long groupId; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagPageReqVO.java new file mode 100644 index 0000000..f7ca91a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员标签分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagPageReqVO extends PageParam { + + @Schema(description = "标签名称", example = "yshop") + private String tagName; + + @Schema(description = "分组ID", example = "14361") + private Long groupId; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagRespVO.java new file mode 100644 index 0000000..71d8dc6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagRespVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会员标签 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagRespVO extends UserTagBaseVO { + + @Schema(description = "用户id", required = true, example = "8835") + private Long id; + + @Schema(description = "添加时间") + private LocalDateTime createTime; + + @Schema(description = "分组名称") + private String groupName; + + @Schema(description = "会员数") + private Long userCount; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagUpdateReqVO.java new file mode 100644 index 0000000..f89f3f3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertag/vo/UserTagUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.usertag.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员标签更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagUpdateReqVO extends UserTagBaseVO { + + @Schema(description = "用户id", required = true, example = "8835") + @NotNull(message = "用户id不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/UserTagGroupController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/UserTagGroupController.java new file mode 100644 index 0000000..4b60f62 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/UserTagGroupController.java @@ -0,0 +1,101 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; + +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; + +import co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertaggroup.UserTagGroupDO; +import co.yixiang.yshop.module.member.convert.usertaggroup.UserTagGroupConvert; +import co.yixiang.yshop.module.member.service.usertaggroup.UserTagGroupService; + +@Tag(name = "管理后台 - 会员标签分组") +@RestController +@RequestMapping("/member/user-tag-group") +@Validated +public class UserTagGroupController { + + @Resource + private UserTagGroupService userTagGroupService; + + @PostMapping("/create") + @Operation(summary = "创建会员标签分组") + @PreAuthorize("@ss.hasPermission('member:user-tag-group:create')") + public CommonResult createUserTagGroup(@Valid @RequestBody UserTagGroupCreateReqVO createReqVO) { + return success(userTagGroupService.createUserTagGroup(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会员标签分组") + @PreAuthorize("@ss.hasPermission('member:user-tag-group:update')") + public CommonResult updateUserTagGroup(@Valid @RequestBody UserTagGroupUpdateReqVO updateReqVO) { + userTagGroupService.updateUserTagGroup(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会员标签分组") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:user-tag-group:delete')") + public CommonResult deleteUserTagGroup(@RequestParam("id") Long id) { + userTagGroupService.deleteUserTagGroup(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会员标签分组") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:user-tag-group:query')") + public CommonResult getUserTagGroup(@RequestParam("id") Long id) { + UserTagGroupDO userTagGroup = userTagGroupService.getUserTagGroup(id); + return success(UserTagGroupConvert.INSTANCE.convert(userTagGroup)); + } + + @GetMapping("/list") + @Operation(summary = "获得会员标签分组列表") + @PreAuthorize("@ss.hasPermission('member:user-tag-group:query')") + public CommonResult> getUserTagGroupList() { + List list = userTagGroupService.getUserTagGroupList(); + return success(UserTagGroupConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得会员标签分组分页") + @PreAuthorize("@ss.hasPermission('member:user-tag-group:query')") + public CommonResult> getUserTagGroupPage(@Valid UserTagGroupPageReqVO pageVO) { + PageResult pageResult = userTagGroupService.getUserTagGroupPage(pageVO); + return success(UserTagGroupConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会员标签分组 Excel") + @PreAuthorize("@ss.hasPermission('member:user-tag-group:export')") + @OperateLog(type = EXPORT) + public void exportUserTagGroupExcel(@Valid UserTagGroupExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userTagGroupService.getUserTagGroupList(exportReqVO); + // 导出 Excel + List datas = UserTagGroupConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "会员标签分组.xls", "数据", UserTagGroupExcelVO.class, datas); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupBaseVO.java new file mode 100644 index 0000000..772ba8f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupBaseVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 会员标签分组 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserTagGroupBaseVO { + + @Schema(description = "分组名称", example = "赵六") + private String groupName; + + @Schema(description = "排序") + private Integer sorted; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupCreateReqVO.java new file mode 100644 index 0000000..c0f3cbd --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupCreateReqVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员标签分组创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagGroupCreateReqVO extends UserTagGroupBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExcelVO.java new file mode 100644 index 0000000..1d770fc --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExcelVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 会员标签分组 Excel VO + * + * @author admin + */ +@Data +public class UserTagGroupExcelVO { + + @ExcelProperty("用户id") + private Long id; + + @ExcelProperty("分组名称") + private String groupName; + + @ExcelProperty("排序") + private Integer sorted; + + @ExcelProperty("添加时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExportReqVO.java new file mode 100644 index 0000000..b840a8e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupExportReqVO.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员标签分组 Excel 导出 Request VO,参数和 UserTagGroupPageReqVO 是一致的") +@Data +public class UserTagGroupExportReqVO { + + @Schema(description = "分组名称", example = "赵六") + private String groupName; + + @Schema(description = "排序") + private Integer sorted; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupPageReqVO.java new file mode 100644 index 0000000..3d70cfc --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 会员标签分组分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagGroupPageReqVO extends PageParam { + + @Schema(description = "分组名称", example = "赵六") + private String groupName; + + @Schema(description = "排序") + private Integer sorted; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupRespVO.java new file mode 100644 index 0000000..6a90ab1 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会员标签分组 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagGroupRespVO extends UserTagGroupBaseVO { + + @Schema(description = "用户id", required = true, example = "23630") + private Long id; + + @Schema(description = "添加时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupUpdateReqVO.java new file mode 100644 index 0000000..4745bf4 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertaggroup/vo/UserTagGroupUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 会员标签分组更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagGroupUpdateReqVO extends UserTagGroupBaseVO { + + @Schema(description = "用户id", required = true, example = "23630") + @NotNull(message = "用户id不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefBaseVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefBaseVO.java new file mode 100644 index 0000000..c02a267 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefBaseVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** +* 用户标签中间 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UserTagRefBaseVO { + + @Schema(description = "用户ID", example = "21474") + private Long userId; + + @Schema(description = "标签ID", example = "20574") + private Long tagId; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefCreateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefCreateReqVO.java new file mode 100644 index 0000000..e0172a6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefCreateReqVO.java @@ -0,0 +1,15 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 用户标签中间创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +public class UserTagRefCreateReqVO extends UserTagRefBaseVO { + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExcelVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExcelVO.java new file mode 100644 index 0000000..344b3cf --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExcelVO.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 用户标签中间 Excel VO + * + * @author admin + */ +@Data +public class UserTagRefExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("用户ID") + private Long userId; + + @ExcelProperty("标签ID") + private Long tagId; + + @ExcelProperty("添加时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExportReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExportReqVO.java new file mode 100644 index 0000000..00eb87c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefExportReqVO.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户标签中间 Excel 导出 Request VO,参数和 UserTagRefPageReqVO 是一致的") +@Data +@Builder +public class UserTagRefExportReqVO { + + @Schema(description = "用户ID", example = "21474") + private Long userId; + + @Schema(description = "标签ID", example = "20574") + private Long tagId; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "标签名称") + private String tagName; + + @Schema(description = "用户ID") + private List userIds; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefPageReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefPageReqVO.java new file mode 100644 index 0000000..6fe5c68 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefPageReqVO.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户标签中间分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagRefPageReqVO extends PageParam { + + @Schema(description = "用户ID", example = "21474") + private Long userId; + + @Schema(description = "标签ID", example = "20574") + private Long tagId; + + @Schema(description = "添加时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefRespVO.java new file mode 100644 index 0000000..72d55a3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefRespVO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 用户标签中间 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagRefRespVO extends UserTagRefBaseVO { + + @Schema(description = "ID", required = true, example = "1019") + private Long id; + + @Schema(description = "添加时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefUpdateReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefUpdateReqVO.java new file mode 100644 index 0000000..84071d6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/admin/usertagref/vo/UserTagRefUpdateReqVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.controller.admin.usertagref.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 用户标签中间更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UserTagRefUpdateReqVO extends UserTagRefBaseVO { + + @Schema(description = "ID", required = true, example = "1019") + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java index 134b133..e58ca23 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java @@ -9,8 +9,6 @@ package co.yixiang.yshop.module.member.controller.app.address; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.ip.core.Area; import co.yixiang.yshop.framework.ip.core.utils.AreaUtils; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java index 2634c88..7a6c7b0 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java @@ -18,43 +18,43 @@ import java.io.Serializable; public class AppUserAddressQueryVo implements Serializable { private static final long serialVersionUID = 1L; - @Schema(description = "用户地址id", required = true, example = "24169") + @Schema(description = "用户地址id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private Long id; - @Schema(description = "用户id", required = true, example = "24169") + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private Long uid; - @Schema(description = "收货人姓名", required = true, example = "24169") + @Schema(description = "收货人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String realName; - @Schema(description = "收货人电话", required = true, example = "24169") + @Schema(description = "收货人电话", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String phone; - @Schema(description = "收货人所在省", required = true, example = "24169") + @Schema(description = "收货人所在省", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String province; - @Schema(description = "收货人所在市", required = true, example = "24169") + @Schema(description = "收货人所在市", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String city; - @Schema(description = "收货人所在区", required = true, example = "24169") + @Schema(description = "收货人所在区", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String district; - @Schema(description = "收货人详细地址", required = true, example = "24169") + @Schema(description = "收货人详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String detail; - @Schema(description = "邮编", required = true, example = "24169") + @Schema(description = "邮编", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String postCode; - @Schema(description = "经度", required = true, example = "24169") + @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String longitude; - @Schema(description = "纬度", required = true, example = "24169") + @Schema(description = "纬度", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private String latitude; - @Schema(description = "是否默认", required = true, example = "24169") + @Schema(description = "是否默认", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private Integer isDefault; - @Schema(description = "城市id", required = true, example = "24169") + @Schema(description = "城市id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24169") private Integer cityId; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AreaNodeRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AreaNodeRespVO.java index 14f5448..d07f85f 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AreaNodeRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AreaNodeRespVO.java @@ -9,10 +9,10 @@ import java.util.List; @Data public class AreaNodeRespVO { - @Schema(description = "编号", required = true, example = "110000") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") private Integer id; - @Schema(description = "名字", required = true, example = "北京") + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京") private String name; /** diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java index 9ed9f20..411dae4 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java @@ -27,7 +27,7 @@ public class AppAuthCheckCodeReqVO { @Mobile private String mobile; - @Schema(description = "手机验证码", required = true, example = "1024") + @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotBlank(message = "手机验证码不能为空") @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位") @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java index 3b33524..ffb7f05 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java @@ -21,26 +21,26 @@ import javax.validation.constraints.NotEmpty; @Builder public class AppAuthLoginReqVO { - @Schema(description = "手机号", required = true, example = "15601691300") + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") @NotEmpty(message = "手机号不能为空") @Mobile private String mobile; - @Schema(description = "密码", required = true, example = "buzhidao") + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") @NotEmpty(message = "密码不能为空") @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; // ========== 绑定社交登录时,需要传递如下参数 ========== - @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", required = true, example = "10") + @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @InEnum(SocialTypeEnum.class) private Integer socialType; - @Schema(description = "授权码", required = true, example = "1024") + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private String socialCode; - @Schema(description = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") private String socialState; @AssertTrue(message = "授权码不能为空") diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java index 12de392..24a171d 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java @@ -15,16 +15,16 @@ import java.time.LocalDateTime; @Builder public class AppAuthLoginRespVO { - @Schema(description = "用户编号", required = true, example = "1024") + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long userId; - @Schema(description = "访问令牌", required = true, example = "happy") + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "happy") private String accessToken; - @Schema(description = "刷新令牌", required = true, example = "nice") + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") private String refreshToken; - @Schema(description = "过期时间", required = true) + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime expiresTime; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java index 4246897..d7d345f 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthResetPasswordReqVO.java @@ -20,18 +20,18 @@ import javax.validation.constraints.Pattern; @Builder public class AppAuthResetPasswordReqVO { - @Schema(description = "新密码", required = true, example = "buzhidao") + @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") @NotEmpty(message = "新密码不能为空") @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; - @Schema(description = "手机验证码", required = true, example = "1024") + @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotEmpty(message = "手机验证码不能为空") @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位") @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") private String code; - @Schema(description = "手机号",required = true,example = "15878962356") + @Schema(description = "手机号",requiredMode = Schema.RequiredMode.REQUIRED,example = "15878962356") @NotBlank(message = "手机号不能为空") @Mobile private String mobile; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java index 085de82..3e14f9a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java @@ -22,30 +22,33 @@ import javax.validation.constraints.Pattern; @Builder public class AppAuthSmsLoginReqVO { - @Schema(description = "手机号", required = true, example = "15601691300") + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") @NotEmpty(message = "手机号不能为空") @Mobile private String mobile; - @Schema(description = "手机验证码", required = true, example = "1024") + @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotEmpty(message = "手机验证码不能为空") @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位") @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") private String code; - @Schema(description = "设备来源", required = true, example = "h5") + @Schema(description = "设备来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "h5") private String from; + @Schema(description = "邀请码") + private String invitationCode; + // ========== 绑定社交登录时,需要传递如下参数 ========== - @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", required = true, example = "10") + @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @InEnum(SocialTypeEnum.class) private Integer socialType; - @Schema(description = "授权码", required = true, example = "1024") + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private String socialCode; - @Schema(description = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") private String socialState; @AssertTrue(message = "授权码不能为空") diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java index d1377cc..05baf43 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java @@ -18,16 +18,16 @@ import javax.validation.constraints.NotNull; @Builder public class AppAuthSocialLoginReqVO { - @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", required = true, example = "10") + @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; - @Schema(description = "授权码", required = true, example = "1024") + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotEmpty(message = "授权码不能为空") private String code; - @Schema(description = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") @NotEmpty(message = "state 不能为空") private String state; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java index e01e15a..00c169b 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java @@ -18,12 +18,12 @@ import javax.validation.constraints.NotEmpty; @Builder public class AppAuthUpdatePasswordReqVO { - @Schema(description = "用户旧密码", required = true, example = "123456") + @Schema(description = "用户旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @NotBlank(message = "旧密码不能为空") @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String oldPassword; - @Schema(description = "新密码", required = true, example = "buzhidao") + @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") @NotEmpty(message = "新密码不能为空") @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java index 1810a4c..f0472a5 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java @@ -23,4 +23,7 @@ public class AppAuthWeixinMiniAppLoginReqVO { @NotEmpty(message = "登录 code 不能为空") private String loginCode; + @Schema(description = "邀请码") + private String invitationCode; + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/burypoint/AppBuryPointController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/burypoint/AppBuryPointController.java new file mode 100644 index 0000000..8681ff4 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/burypoint/AppBuryPointController.java @@ -0,0 +1,45 @@ +package co.yixiang.yshop.module.member.controller.app.burypoint; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.util.servlet.ServletUtils; +import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.BuryPointCreateReqVO; +import co.yixiang.yshop.module.member.service.burypoint.BuryPointService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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 javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Slf4j +@RestController +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Tag(name = "APP - 埋点") +@RequestMapping("/bury-point") +public class AppBuryPointController { + + @Resource + private BuryPointService buryPointService; + + @PostMapping("/create") + @Operation(summary = "创建埋点") + @OperateLog(enable = false) + public CommonResult createBuryPoint(@RequestBody BuryPointCreateReqVO createReqVO) { + Long uid = getLoginUserId(); + createReqVO.setUserId(uid); + createReqVO.setIp(ServletUtils.getClientIP()); + return success(buryPointService.createBuryPoint(createReqVO)); + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/AppSignInRecordController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/AppSignInRecordController.java new file mode 100644 index 0000000..d6bf41a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/AppSignInRecordController.java @@ -0,0 +1,64 @@ +package co.yixiang.yshop.module.member.controller.app.signinrecord; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.IntegralRuleExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.IntegralRuleRespVO; +import co.yixiang.yshop.module.member.controller.app.signinrecord.vo.SignInInfoVO; +import co.yixiang.yshop.module.member.convert.integralrule.IntegralRuleConvert; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import co.yixiang.yshop.module.member.service.integralrule.IntegralRuleService; +import co.yixiang.yshop.module.member.service.signinrecord.SignInRecordService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author pepis + * @apiNote app签到 + **/ +@RestController +@RequestMapping("/member/sign-in-record") +@Tag(name = "app-签到") + +public class AppSignInRecordController { + @Resource + private SignInRecordService signInRecordService; + @Resource + private IntegralRuleService integralRuleService; + + @GetMapping("signInInfo") + @Operation(summary = "签到信息") + @PreAuthenticated + public CommonResult signInInfo() { + LocalDateTime startTime = LocalDateTimeUtils.weekStartTime(); + LocalDateTime endTime = LocalDateTimeUtils.weekEndTime(); + SignInInfoVO vo = signInRecordService.signInInfo(SecurityFrameworkUtils.getLoginUserId(),startTime,endTime); + return CommonResult.success(vo); + } + + @GetMapping("signIn") + @Operation(summary = "签到") + @PreAuthenticated + public CommonResult signIn() { + BigDecimal integral = signInRecordService.signIn(SecurityFrameworkUtils.getLoginUserId()); + return CommonResult.success(integral); + } + + @GetMapping("integralRule") + @Operation(summary = "每日任务") + @PreAuthenticated + public CommonResult> integralRule() { + List list = integralRuleService.getIntegralRuleList(new IntegralRuleExportReqVO()); + return CommonResult.success(IntegralRuleConvert.INSTANCE.convertList(list)); + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/vo/SignInInfoVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/vo/SignInInfoVO.java new file mode 100644 index 0000000..1fc6ca6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/signinrecord/vo/SignInInfoVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.member.controller.app.signinrecord.vo; + +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.SignInRecordRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author pepis + * @apiNote 签到信息 + **/ +@Data +public class SignInInfoVO { + @Schema(description = "总积分") + private BigDecimal integral; + + @Schema(description = "连续签到天数") + private Integer signInDays; + + @Schema(description = "今天是否签到") + private Boolean todaySignIn; + + @Schema(description = "签到日志") + private List signInRecordList; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java index c52a545..d64717c 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java @@ -18,16 +18,16 @@ import javax.validation.constraints.NotNull; @Builder public class AppSocialUserBindReqVO { - @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", required = true, example = "10") + @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; - @Schema(description = "授权码", required = true, example = "1024") + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotEmpty(message = "授权码不能为空") private String code; - @Schema(description = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") @NotEmpty(message = "state 不能为空") private String state; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java index 9f58659..f1a38d0 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java @@ -18,12 +18,12 @@ import javax.validation.constraints.NotNull; @Builder public class AppSocialUserUnbindReqVO { - @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", required = true, example = "10") + @Schema(description = "社交平台的类型,参见 SysUserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @InEnum(SocialTypeEnum.class) @NotNull(message = "社交平台的类型不能为空") private Integer type; - @Schema(description = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") + @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") @NotEmpty(message = "社交用户的 openid 不能为空") private String openid; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java index a20cff9..343d8bf 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java @@ -7,6 +7,7 @@ import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserUpdateMobile import co.yixiang.yshop.module.member.convert.user.UserConvert; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.product.api.coupon.CouponApi; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; @@ -34,6 +35,9 @@ public class AppUserController { @Resource private MemberUserService userService; + @Resource + private CouponApi couponApi; + @PutMapping("/update-nickname") @Operation(summary = "修改用户昵称或者生日") @Parameters({ @@ -67,8 +71,10 @@ public class AppUserController { @Operation(summary = "获得基本信息") @PreAuthenticated public CommonResult getUserInfo() { - MemberUserDO user = userService.getUser(getLoginUserId()); - return success(UserConvert.INSTANCE.convert(user)); + Long uid = getLoginUserId(); + AppUserInfoRespVO userInfo = UserConvert.INSTANCE.convert(userService.getUser(uid)); + userInfo.setCouponNumber(couponApi.getCouponNumber(uid)); + return success(userInfo); } @PostMapping("/update-mobile") diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java index ddc76b2..cf8c93a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java @@ -5,27 +5,47 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + @Schema(description = "用户 APP - 用户个人信息 Response VO") @Data @NoArgsConstructor @AllArgsConstructor public class AppUserInfoRespVO { - @Schema(description = "用户id", required = true, example = "yshop") + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshop") private Long id; - @Schema(description = "用户昵称", required = true, example = "yshop") + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshop") private String nickname; - @Schema(description = "用户头像", required = true, example = "/infra/file/get/35a12e57-4297-4faa-bf7d-7ed2f211c952") + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "/infra/file/get/35a12e57-4297-4faa-bf7d-7ed2f211c952") private String avatar; - @Schema(description = "用户手机号", required = true, example = "15601691300") + @Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") private String mobile; - @Schema(description = "生日", required = true, example = "2023-10-11") + @Schema(description = "生日", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-10-11") private String birthday; - @Schema(description = "性别", required = true, example = "1") + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer sex; + + @Schema(description = "用户余额") + private BigDecimal nowMoney; + + @Schema(description = "佣金金额") + private BigDecimal brokeragePrice; + + @Schema(description = "用户剩余积分") + private BigDecimal integral; + + @Schema(description = "核销权限") + private Boolean writeOffAuthority; + + @Schema(description = "邀请码") + private String invitationCode; + + @Schema(description = "优惠券数量") + private Integer couponNumber; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java index 6e21898..b3a8f45 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java @@ -19,34 +19,34 @@ import java.io.Serializable; public class AppUserOrderCountVo implements Serializable { /**订单支付没有退款 数量*/ - @Schema(description = "订单支付没有退款数量", required = true) + @Schema(description = "订单支付没有退款数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long orderCount; /**订单支付没有退款 支付总金额*/ - @Schema(description = "订单支付没有退款支付总金额", required = true) + @Schema(description = "订单支付没有退款支付总金额", requiredMode = Schema.RequiredMode.REQUIRED) private Double sumPrice; /**订单待支付 数量*/ - @Schema(description = "订单待支付数量", required = true) + @Schema(description = "订单待支付数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long unpaidCount; /**订单待发货数量*/ - @Schema(description = "订单待发货数量", required = true) + @Schema(description = "订单待发货数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long unshippedCount; /**订单待收货数量*/ - @Schema(description = "订单待收货数量", required = true) + @Schema(description = "订单待收货数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long receivedCount; /**订单待评价数量*/ - @Schema(description = "订单待评价数量", required = true) + @Schema(description = "订单待评价数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long evaluatedCount; /**订单已完成数量*/ - @Schema(description = "订单已完成数量", required = true) + @Schema(description = "订单已完成数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long completeCount; /**订单退款数量*/ - @Schema(description = "订单退款数量", required = true) + @Schema(description = "订单退款数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long refundCount; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserQueryVo.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserQueryVo.java index 905f276..108b0c4 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserQueryVo.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserQueryVo.java @@ -20,77 +20,77 @@ import java.math.BigDecimal; public class AppUserQueryVo implements Serializable { private static final long serialVersionUID = 1L; - @Schema(description = "用户id", required = true) + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED) private Long uid; - @Schema(description = "用户账户(跟accout一样)\"", required = true) + @Schema(description = "用户账户(跟accout一样)\"", requiredMode = Schema.RequiredMode.REQUIRED) private String username; - @Schema(description = "用户账号", required = true) + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED) private String account; - @Schema(description = "优惠券数量", required = true) + @Schema(description = "优惠券数量", requiredMode = Schema.RequiredMode.REQUIRED) private Long couponCount = 0L; - @Schema(description = "订单详情数据", required = true) + @Schema(description = "订单详情数据", requiredMode = Schema.RequiredMode.REQUIRED) private AppUserOrderCountVo orderStatusNum; private Integer statu; - @Schema(description = "总的签到天数", required = true) + @Schema(description = "总的签到天数", requiredMode = Schema.RequiredMode.REQUIRED) private Long sumSignDay; - @Schema(description = "当天是否签到", required = true) + @Schema(description = "当天是否签到", requiredMode = Schema.RequiredMode.REQUIRED) private Integer isDaySign; - @Schema(description = "昨天是否签到", required = true) + @Schema(description = "昨天是否签到", requiredMode = Schema.RequiredMode.REQUIRED) private Integer isYesterDaySign; - @Schema(description = "核销权限", required = true) + @Schema(description = "核销权限", requiredMode = Schema.RequiredMode.REQUIRED) private Integer checkStatus; - @Schema(description = "用户昵称", required = true) + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED) private String nickname; - @Schema(description = "用户头像", required = true) + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED) private String avatar; - @Schema(description = "手机号码", required = true) + @Schema(description = "手机号码", requiredMode = Schema.RequiredMode.REQUIRED) private String phone; - @Schema(description = "用户余额", required = true) + @Schema(description = "用户余额", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal nowMoney; - @Schema(description = "佣金金额", required = true) + @Schema(description = "佣金金额", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal brokeragePrice; - @Schema(description = "用户剩余积分", required = true) + @Schema(description = "用户剩余积分", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal integral; - @Schema(description = "连续签到天数", required = true) + @Schema(description = "连续签到天数", requiredMode = Schema.RequiredMode.REQUIRED) private Integer signNum; - @Schema(description = "推广元id", required = true) + @Schema(description = "推广元id", requiredMode = Schema.RequiredMode.REQUIRED) private Long spreadUid; - @Schema(description = "用户类型", required = true) + @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED) private String userType; - @Schema(description = "是否为推广员", required = true) + @Schema(description = "是否为推广员", requiredMode = Schema.RequiredMode.REQUIRED) private Integer isPromoter; - @Schema(description = "用户购买次数", required = true) + @Schema(description = "用户购买次数", requiredMode = Schema.RequiredMode.REQUIRED) private Integer payCount; - @Schema(description = "下级人数", required = true) + @Schema(description = "下级人数", requiredMode = Schema.RequiredMode.REQUIRED) private Integer spreadCount; - @Schema(description = "详细地址", required = true) + @Schema(description = "详细地址", requiredMode = Schema.RequiredMode.REQUIRED) private String addres; - @Schema(description = "用户登陆类型,h5,wechat,routine", required = true) + @Schema(description = "用户登陆类型,h5,wechat,routine", requiredMode = Schema.RequiredMode.REQUIRED) private String loginType; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java index 434f9e2..5bd7e3a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java @@ -19,19 +19,19 @@ import javax.validation.constraints.Pattern; @Builder public class AppUserUpdateMobileReqVO { - @Schema(description = "手机验证码", required = true, example = "1024") + @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotEmpty(message = "手机验证码不能为空") @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位") @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") private String code; - @Schema(description = "手机号",required = true,example = "15823654487") + @Schema(description = "手机号",requiredMode = Schema.RequiredMode.REQUIRED,example = "15823654487") @NotBlank(message = "手机号不能为空") @Length(min = 8, max = 11, message = "手机号码长度为 8-11 位") @Mobile private String mobile; - @Schema(description = "原手机验证码", required = true, example = "1024") + @Schema(description = "原手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotEmpty(message = "原手机验证码不能为空") @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位") @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") @@ -39,7 +39,7 @@ public class AppUserUpdateMobileReqVO { // TODO @yshop:oldMobile 应该不用传递 - @Schema(description = "原手机号",required = true,example = "15823654487") + @Schema(description = "原手机号",requiredMode = Schema.RequiredMode.REQUIRED,example = "15823654487") @NotBlank(message = "手机号不能为空") @Length(min = 8, max = 11, message = "手机号码长度为 8-11 位") @Mobile diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userbill/AppUserBillController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userbill/AppUserBillController.java new file mode 100644 index 0000000..31f440d --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userbill/AppUserBillController.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.member.controller.app.userbill; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillRespVO; +import co.yixiang.yshop.module.member.convert.userbill.UserBillConvert; +import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.module.member.enums.BillDetailEnum.CATEGORY_2; + +/** + * @author pepis + * @apiNote 积分明细 + **/ +@RestController +@RequestMapping("/member/user-bill") +@Tag(name = "app-积分明细") +public class AppUserBillController { + @Resource + private UserBillService userBillService; + + @GetMapping("/page") + @Operation(summary = "获得用户账单分页") + public CommonResult> getUserBillPage(@Valid UserBillPageReqVO pageVO) { + pageVO.setUid(SecurityFrameworkUtils.getLoginUserId()); + PageResult pageResult = userBillService.getUserBillPage(pageVO); + return success(UserBillConvert.INSTANCE.convertPage(pageResult)); + } + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/AppUserLevelController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/AppUserLevelController.java new file mode 100644 index 0000000..fd9dfc6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/AppUserLevelController.java @@ -0,0 +1,89 @@ +package co.yixiang.yshop.module.member.controller.app.userlevel; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.UserLevelConfigExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.UserLevelConfigRespVO; +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.UserLevelEquityRespVO; +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.UserLevelGrowthValueConfigExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.UserLevelGrowthValueConfigRespVO; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.SettleLevelInfoVO; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.UserLevelInfoVO; +import co.yixiang.yshop.module.member.convert.userlevelconfig.UserLevelConfigConvert; +import co.yixiang.yshop.module.member.convert.userlevelequity.UserLevelEquityConvert; +import co.yixiang.yshop.module.member.convert.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigConvert; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import co.yixiang.yshop.module.member.service.userlevelconfig.UserLevelConfigService; +import co.yixiang.yshop.module.member.service.userlevelequityref.UserLevelEquityRefService; +import co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author pepis + * @apiNote + **/ +@RestController +@RequestMapping("/member/user-level") +@Tag(name = "app-用户等级") +public class AppUserLevelController { + @Resource + private UserLevelGrowthValueConfigService growthValueConfigService; + @Resource + private UserLevelConfigService userLevelConfigService; + @Resource + private UserLevelEquityRefService userLevelEquityRefService; + + @GetMapping("growthValueConfig") + @Operation(summary = "成长任务") + @PreAuthenticated + public CommonResult> growthValueConfig(){ + List list = growthValueConfigService.getUserLevelGrowthValueConfigList(new UserLevelGrowthValueConfigExportReqVO()); + return CommonResult.success(UserLevelGrowthValueConfigConvert.INSTANCE.convertList(list)); + } + + @GetMapping("levelConfig") + @Operation(summary = "等级列表") + @PreAuthenticated + public CommonResult> levelConfig(){ + UserLevelConfigExportReqVO reqVO = new UserLevelConfigExportReqVO(); + reqVO.setStatus(Boolean.TRUE); + List list = userLevelConfigService.getUserLevelConfigList(reqVO); + return CommonResult.success(UserLevelConfigConvert.INSTANCE.convertList(list)); + } + + @GetMapping("levelInfo") + @Operation(summary = "等级信息") + @PreAuthenticated + public CommonResult levelInfo(){ + UserLevelInfoVO vo = userLevelConfigService.levelInfo(SecurityFrameworkUtils.getLoginUserId()); + return CommonResult.success(vo); + } + + @GetMapping("equity") + @Operation(summary = "会员等级对应权益") + @PreAuthenticated + public CommonResult> equity(Long levelId){ + List list = userLevelEquityRefService.getUserLevelEquityList(levelId); + return CommonResult.success(UserLevelEquityConvert.INSTANCE.convertList(list)); + } + + @GetMapping("settleLevelInfo") + @Operation(summary = "结算时等级信息") + @PreAuthenticated + public CommonResult settleLevelInfo(){ + SettleLevelInfoVO vo = userLevelConfigService.settleLevelInfo(SecurityFrameworkUtils.getLoginUserId()); + return CommonResult.success(vo); + } + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/SettleLevelInfoVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/SettleLevelInfoVO.java new file mode 100644 index 0000000..8d6381b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/SettleLevelInfoVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.member.controller.app.userlevel.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author pepis + * @apiNote 结算时等级信息 + **/ +@Data +public class SettleLevelInfoVO { + @Schema(description = "是否包邮") + private Boolean freeShipping; + + @Schema(description = "会员折扣") + private BigDecimal discount; + + @Schema(description = "是否vip") + private Boolean isVip; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/UserLevelInfoVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/UserLevelInfoVO.java new file mode 100644 index 0000000..77c0672 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/userlevel/vo/UserLevelInfoVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.member.controller.app.userlevel.vo; + +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.UserLevelConfigRespVO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author pepis + * @apiNote 用户等级信息 + **/ +@Data +public class UserLevelInfoVO { + @Schema(description = "当前等级") + private UserLevelConfigDO currentLevel; + @Schema(description = "下一等级") + private UserLevelConfigDO nextLevel; + + @Schema(description = "当前成长值") + private Integer currentGrowthValue; + @Schema(description = "升级所需成长值") + private Integer needGrowthValue; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/burypoint/BuryPointConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/burypoint/BuryPointConvert.java new file mode 100644 index 0000000..e2ecd18 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/burypoint/BuryPointConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.burypoint; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.BuryPointDO; + +/** + * 埋点 Convert + * + * @author admin + */ +@Mapper +public interface BuryPointConvert { + + BuryPointConvert INSTANCE = Mappers.getMapper(BuryPointConvert.class); + + BuryPointDO convert(BuryPointCreateReqVO bean); + + BuryPointDO convert(BuryPointUpdateReqVO bean); + + BuryPointRespVO convert(BuryPointDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/integralrule/IntegralRuleConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/integralrule/IntegralRuleConvert.java new file mode 100644 index 0000000..70fbbda --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/integralrule/IntegralRuleConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.integralrule; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; + +/** + * 会员积分规则 Convert + * + * @author admin + */ +@Mapper +public interface IntegralRuleConvert { + + IntegralRuleConvert INSTANCE = Mappers.getMapper(IntegralRuleConvert.class); + + IntegralRuleDO convert(IntegralRuleCreateReqVO bean); + + IntegralRuleDO convert(IntegralRuleUpdateReqVO bean); + + IntegralRuleRespVO convert(IntegralRuleDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/signinrecord/SignInRecordConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/signinrecord/SignInRecordConvert.java new file mode 100644 index 0000000..c3f893e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/signinrecord/SignInRecordConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.signinrecord; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.signinrecord.SignInRecordDO; + +/** + * 签到记录 Convert + * + * @author admin + */ +@Mapper +public interface SignInRecordConvert { + + SignInRecordConvert INSTANCE = Mappers.getMapper(SignInRecordConvert.class); + + SignInRecordDO convert(SignInRecordCreateReqVO bean); + + SignInRecordDO convert(SignInRecordUpdateReqVO bean); + + SignInRecordRespVO convert(SignInRecordDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/user/UserConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/user/UserConvert.java index ae5db3b..fee28c6 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/user/UserConvert.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/user/UserConvert.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.member.convert.user; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; +import co.yixiang.yshop.module.member.controller.admin.user.vo.MemberUserExcelVO; import co.yixiang.yshop.module.member.controller.admin.user.vo.UserCreateReqVO; import co.yixiang.yshop.module.member.controller.admin.user.vo.UserRespVO; import co.yixiang.yshop.module.member.controller.admin.user.vo.UserUpdateReqVO; @@ -38,4 +39,6 @@ public interface UserConvert { PageResult convertPage(PageResult page); + List convertListExcel(List list); + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userinvitelog/UserInviteLogConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userinvitelog/UserInviteLogConvert.java new file mode 100644 index 0000000..22e2434 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userinvitelog/UserInviteLogConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.userinvitelog; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userinvitelog.UserInviteLogDO; + +/** + * 邀请日志 Convert + * + * @author admin + */ +@Mapper +public interface UserInviteLogConvert { + + UserInviteLogConvert INSTANCE = Mappers.getMapper(UserInviteLogConvert.class); + + UserInviteLogDO convert(UserInviteLogCreateReqVO bean); + + UserInviteLogDO convert(UserInviteLogUpdateReqVO bean); + + UserInviteLogRespVO convert(UserInviteLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelconfig/UserLevelConfigConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelconfig/UserLevelConfigConvert.java new file mode 100644 index 0000000..cf609f4 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelconfig/UserLevelConfigConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.userlevelconfig; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; + +/** + * 会员等级配置 Convert + * + * @author admin + */ +@Mapper +public interface UserLevelConfigConvert { + + UserLevelConfigConvert INSTANCE = Mappers.getMapper(UserLevelConfigConvert.class); + + UserLevelConfigDO convert(UserLevelConfigCreateReqVO bean); + + UserLevelConfigDO convert(UserLevelConfigUpdateReqVO bean); + + UserLevelConfigRespVO convert(UserLevelConfigDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequity/UserLevelEquityConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequity/UserLevelEquityConvert.java new file mode 100644 index 0000000..7747316 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequity/UserLevelEquityConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.userlevelequity; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; + +/** + * 会员等级权益配置 Convert + * + * @author admin + */ +@Mapper +public interface UserLevelEquityConvert { + + UserLevelEquityConvert INSTANCE = Mappers.getMapper(UserLevelEquityConvert.class); + + UserLevelEquityDO convert(UserLevelEquityCreateReqVO bean); + + UserLevelEquityDO convert(UserLevelEquityUpdateReqVO bean); + + UserLevelEquityRespVO convert(UserLevelEquityDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequityref/UserLevelEquityRefConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequityref/UserLevelEquityRefConvert.java new file mode 100644 index 0000000..3b53f22 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelequityref/UserLevelEquityRefConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.userlevelequityref; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; + +/** + * 会员等级权益中间 Convert + * + * @author admin + */ +@Mapper +public interface UserLevelEquityRefConvert { + + UserLevelEquityRefConvert INSTANCE = Mappers.getMapper(UserLevelEquityRefConvert.class); + + UserLevelEquityRefDO convert(UserLevelEquityRefCreateReqVO bean); + + UserLevelEquityRefDO convert(UserLevelEquityRefUpdateReqVO bean); + + UserLevelEquityRefRespVO convert(UserLevelEquityRefDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigConvert.java new file mode 100644 index 0000000..2349d83 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.userlevelgrowthvalueconfig; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; + +/** + * 会员成长任务配置 Convert + * + * @author admin + */ +@Mapper +public interface UserLevelGrowthValueConfigConvert { + + UserLevelGrowthValueConfigConvert INSTANCE = Mappers.getMapper(UserLevelGrowthValueConfigConvert.class); + + UserLevelGrowthValueConfigDO convert(UserLevelGrowthValueConfigCreateReqVO bean); + + UserLevelGrowthValueConfigDO convert(UserLevelGrowthValueConfigUpdateReqVO bean); + + UserLevelGrowthValueConfigRespVO convert(UserLevelGrowthValueConfigDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertag/UserTagConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertag/UserTagConvert.java new file mode 100644 index 0000000..6e239a7 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertag/UserTagConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.usertag; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.usertag.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertag.UserTagDO; + +/** + * 会员标签 Convert + * + * @author admin + */ +@Mapper +public interface UserTagConvert { + + UserTagConvert INSTANCE = Mappers.getMapper(UserTagConvert.class); + + UserTagDO convert(UserTagCreateReqVO bean); + + UserTagDO convert(UserTagUpdateReqVO bean); + + UserTagRespVO convert(UserTagDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertaggroup/UserTagGroupConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertaggroup/UserTagGroupConvert.java new file mode 100644 index 0000000..b9fbaa2 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertaggroup/UserTagGroupConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.usertaggroup; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertaggroup.UserTagGroupDO; + +/** + * 会员标签分组 Convert + * + * @author admin + */ +@Mapper +public interface UserTagGroupConvert { + + UserTagGroupConvert INSTANCE = Mappers.getMapper(UserTagGroupConvert.class); + + UserTagGroupDO convert(UserTagGroupCreateReqVO bean); + + UserTagGroupDO convert(UserTagGroupUpdateReqVO bean); + + UserTagGroupRespVO convert(UserTagGroupDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertagref/UserTagRefConvert.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertagref/UserTagRefConvert.java new file mode 100644 index 0000000..a3ef830 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/convert/usertagref/UserTagRefConvert.java @@ -0,0 +1,34 @@ +package co.yixiang.yshop.module.member.convert.usertagref; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; + +/** + * 用户标签中间 Convert + * + * @author admin + */ +@Mapper +public interface UserTagRefConvert { + + UserTagRefConvert INSTANCE = Mappers.getMapper(UserTagRefConvert.class); + + UserTagRefDO convert(UserTagRefCreateReqVO bean); + + UserTagRefDO convert(UserTagRefUpdateReqVO bean); + + UserTagRefRespVO convert(UserTagRefDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/BuryPointDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/BuryPointDO.java new file mode 100644 index 0000000..f2b9097 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/BuryPointDO.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.member.dal.dataobject.burypoint; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 埋点 DO + * + * @author admin + */ +@TableName("yshop_bury_point") +@KeySequence("yshop_bury_point_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BuryPointDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 事件 + */ + private String event; + /** + * 事件参数 + */ + private String eventParameter; + /** + * IP + */ + private String ip; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/TrendChartRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/TrendChartRespVO.java new file mode 100644 index 0000000..99a0b52 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/burypoint/TrendChartRespVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.member.dal.dataobject.burypoint; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "趋势图返回") +@Data +@ToString(callSuper = true) +public class TrendChartRespVO { + + @Schema(description = "key") + private String key; + + @Schema(description = "value") + private String value; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/integralrule/IntegralRuleDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/integralrule/IntegralRuleDO.java new file mode 100644 index 0000000..b814033 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/integralrule/IntegralRuleDO.java @@ -0,0 +1,56 @@ +package co.yixiang.yshop.module.member.dal.dataobject.integralrule; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 会员积分规则 DO + * + * @author admin + */ +@TableName("yshop_integral_rule") +@KeySequence("yshop_integral_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IntegralRuleDO extends BaseDO { + + /** + * 评论ID + */ + @TableId + private Long id; + /** + * 类型 + */ + private String type; + /** + * 类型名称 + */ + private String typeName; + /** + * 获取积分 + */ + private Integer integral; + /** + * 拓展字段 + */ + private String attribute1; + + /** + * 图标 + */ + private String iconUrl; + + /** + * 是否开启 + */ + private Boolean enable; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/signinrecord/SignInRecordDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/signinrecord/SignInRecordDO.java new file mode 100644 index 0000000..91597e9 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/signinrecord/SignInRecordDO.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.member.dal.dataobject.signinrecord; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 签到记录 DO + * + * @author admin + */ +@TableName("yshop_sign_in_record") +@KeySequence("yshop_sign_in_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SignInRecordDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 会员ID + */ + private Long userId; + /** + * 积分 + */ + private BigDecimal integral; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java index 2914cad..bdbd93e 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java @@ -3,7 +3,7 @@ package co.yixiang.yshop.module.member.dal.dataobject.user; import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.framework.tenant.core.db.TenantBaseDO; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -17,7 +17,6 @@ import java.time.LocalDateTime; /** * 会员用户 DO - * * uk_mobile 索引:基于 {@link #mobile} 字段 * * @author yshop @@ -46,7 +45,6 @@ public class MemberUserDO extends TenantBaseDO { private String avatar; /** * 帐号状态 - * * 枚举 {@link CommonStatusEnum} */ private Integer status; @@ -57,7 +55,6 @@ public class MemberUserDO extends TenantBaseDO { private String mobile; /** * 加密后的密码 - * * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 */ private String password; @@ -75,7 +72,7 @@ public class MemberUserDO extends TenantBaseDO { private LocalDateTime loginDate; /** - * 用户账户(跟accout一样) + * 用户账户(跟account一样) */ private String username; @@ -138,7 +135,7 @@ public class MemberUserDO extends TenantBaseDO { /** * 等级 */ - private Integer level; + private Long level; /** * 推广元id */ @@ -177,15 +174,30 @@ public class MemberUserDO extends TenantBaseDO { private String loginType; //公众号openid - private String openid; + private String openId; //小程序openid - private String routineOpenid; + private String routineOpenId; /** 微信用户json信息 */ @TableField(typeHandler = FastjsonTypeHandler.class) // @Deprecated - private WechatUserDto wxProfile; + private WechatUserDTO wxProfile; + + /** + * 会员成长值 + */ + private Integer growthValue; + + /** + * 核销权限 + */ + private Boolean writeOffAuthority; + + /** + * 邀请码 + */ + private String invitationCode; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userinvitelog/UserInviteLogDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userinvitelog/UserInviteLogDO.java new file mode 100644 index 0000000..c704bab --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userinvitelog/UserInviteLogDO.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.member.dal.dataobject.userinvitelog; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 邀请日志 DO + * + * @author admin + */ +@TableName("yshop_user_invite_log") +@KeySequence("yshop_user_invite_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserInviteLogDO extends BaseDO { + + /** + * 评论ID + */ + @TableId + private Long id; + /** + * 邀请用户id + */ + private Long userId; + /** + * 被邀请用户id + */ + private Long beInviteUserId; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelconfig/UserLevelConfigDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelconfig/UserLevelConfigDO.java new file mode 100644 index 0000000..1ebcf94 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelconfig/UserLevelConfigDO.java @@ -0,0 +1,63 @@ +package co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 会员等级配置 DO + * + * @author admin + */ +@TableName("yshop_user_level_config") +@KeySequence("yshop_user_level_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserLevelConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 等级名称 + */ + private String levelName; + /** + * 等级 + */ + private Integer level; + /** + * 成长值 + */ + private Integer growthValue; + /** + * 图标 + */ + private String iconUrl; + /** + * 背景 + */ + private String backgroundUrl; + /** + * 状态 + */ + private Boolean status; + /** + * 说明 + */ + private String remarks; + + /** + * 色号 + */ + private String colorNum; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequity/UserLevelEquityDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequity/UserLevelEquityDO.java new file mode 100644 index 0000000..5fbcb13 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequity/UserLevelEquityDO.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.member.dal.dataobject.userlevelequity; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 会员等级权益配置 DO + * + * @author admin + */ +@TableName("yshop_user_level_equity") +@KeySequence("yshop_user_level_equity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserLevelEquityDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 权益类型 + */ + private String type; + /** + * 类型名称 + */ + private String typeName; + /** + * 图标 + */ + private String iconUrl; + + private String remarks; + + @TableField(exist = false) + private Long equityValue; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequityref/UserLevelEquityRefDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequityref/UserLevelEquityRefDO.java new file mode 100644 index 0000000..081a7be --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelequityref/UserLevelEquityRefDO.java @@ -0,0 +1,44 @@ +package co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 会员等级权益中间 DO + * + * @author admin + */ +@TableName("yshop_user_level_equity_ref") +@KeySequence("yshop_user_level_equity_ref_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserLevelEquityRefDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 等级ID + */ + private Long levelId; + /** + * 权益ID + */ + private Long equityId; + + /** + * 权益值 + */ + private Long equityValue; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigDO.java new file mode 100644 index 0000000..bf68b6a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigDO.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 会员成长任务配置 DO + * + * @author admin + */ +@TableName("yshop_user_level_growth_value_config") +@KeySequence("yshop_user_level_growth_value_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserLevelGrowthValueConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Integer id; + /** + * 成长任务类型 + */ + private String type; + /** + * 类型名称 + */ + private String typeName; + /** + * 成长值 + */ + private Integer growthValue; + + /** + * 图标 + */ + private String iconUrl; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertag/UserTagDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertag/UserTagDO.java new file mode 100644 index 0000000..407bce3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertag/UserTagDO.java @@ -0,0 +1,52 @@ +package co.yixiang.yshop.module.member.dal.dataobject.usertag; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 会员标签 DO + * + * @author admin + */ +@TableName("yshop_user_tag") +@KeySequence("yshop_user_tag_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserTagDO extends BaseDO { + + /** + * 用户id + */ + @TableId + private Long id; + /** + * 标签名称 + */ + private String tagName; + /** + * 分组ID + */ + private Long groupId; + + /** + * 分组名称 + */ + @TableField(exist = false) + private String groupName; + + /** + * 会员数 + */ + @TableField(exist = false) + private Long userCount; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertaggroup/UserTagGroupDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertaggroup/UserTagGroupDO.java new file mode 100644 index 0000000..93ff438 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertaggroup/UserTagGroupDO.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.member.dal.dataobject.usertaggroup; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 会员标签分组 DO + * + * @author admin + */ +@TableName("yshop_user_tag_group") +@KeySequence("yshop_user_tag_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserTagGroupDO extends BaseDO { + + /** + * 用户id + */ + @TableId + private Long id; + /** + * 分组名称 + */ + private String groupName; + /** + * 排序 + */ + private Integer sorted; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertagref/UserTagRefDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertagref/UserTagRefDO.java new file mode 100644 index 0000000..74dfe45 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/usertagref/UserTagRefDO.java @@ -0,0 +1,45 @@ +package co.yixiang.yshop.module.member.dal.dataobject.usertagref; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户标签中间 DO + * + * @author admin + */ +@TableName("yshop_user_tag_ref") +@KeySequence("yshop_user_tag_ref_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserTagRefDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 标签ID + */ + private Long tagId; + + /** + * 标签名称 + */ + @TableField(exist = false) + private String tagName; + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/burypoint/BuryPointMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/burypoint/BuryPointMapper.java new file mode 100644 index 0000000..9dddcd6 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/burypoint/BuryPointMapper.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.member.dal.mysql.burypoint; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.BuryPointDO; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.*; + +/** + * 埋点 Mapper + * + * @author admin + */ +@Mapper +public interface BuryPointMapper extends BaseMapperX { + + default PageResult selectPage(BuryPointPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BuryPointDO::getUserId, reqVO.getUserId()) + .eqIfPresent(BuryPointDO::getEvent, reqVO.getEvent()) + .eqIfPresent(BuryPointDO::getEventParameter, reqVO.getEventParameter()) + .betweenIfPresent(BuryPointDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(BuryPointDO::getIp, reqVO.getIp()) + .orderByDesc(BuryPointDO::getId)); + } + + default List selectList(BuryPointExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(BuryPointDO::getUserId, reqVO.getUserId()) + .eqIfPresent(BuryPointDO::getEvent, reqVO.getEvent()) + .eqIfPresent(BuryPointDO::getEventParameter, reqVO.getEventParameter()) + .betweenIfPresent(BuryPointDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(BuryPointDO::getIp, reqVO.getIp()) + .orderByDesc(BuryPointDO::getId)); + } + + List getTrendChart(); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/integralrule/IntegralRuleMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/integralrule/IntegralRuleMapper.java new file mode 100644 index 0000000..9cdce9b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/integralrule/IntegralRuleMapper.java @@ -0,0 +1,44 @@ +package co.yixiang.yshop.module.member.dal.mysql.integralrule; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.IntegralRuleExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.IntegralRulePageReqVO; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 会员积分规则 Mapper + * + * @author admin + */ +@Mapper +public interface IntegralRuleMapper extends BaseMapperX { + + default PageResult selectPage(IntegralRulePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(IntegralRuleDO::getType, reqVO.getType()) + .likeIfPresent(IntegralRuleDO::getTypeName, reqVO.getTypeName()) + .eqIfPresent(IntegralRuleDO::getIntegral, reqVO.getIntegral()) + .eqIfPresent(IntegralRuleDO::getAttribute1, reqVO.getAttribute1()) + .betweenIfPresent(IntegralRuleDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(IntegralRuleDO::getId)); + } + + default List selectList(IntegralRuleExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(IntegralRuleDO::getType, reqVO.getType()) + .likeIfPresent(IntegralRuleDO::getTypeName, reqVO.getTypeName()) + .eqIfPresent(IntegralRuleDO::getIntegral, reqVO.getIntegral()) + .eqIfPresent(IntegralRuleDO::getAttribute1, reqVO.getAttribute1()) + .betweenIfPresent(IntegralRuleDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(IntegralRuleDO::getId)); + } + + @Delete("delete from yshop_integral_rule") + void delete(); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/signinrecord/SignInRecordMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/signinrecord/SignInRecordMapper.java new file mode 100644 index 0000000..521caab --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/signinrecord/SignInRecordMapper.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.member.dal.mysql.signinrecord; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.signinrecord.SignInRecordDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.*; + +/** + * 签到记录 Mapper + * + * @author admin + */ +@Mapper +public interface SignInRecordMapper extends BaseMapperX { + + default PageResult selectPage(SignInRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SignInRecordDO::getUserId, reqVO.getUserId()) + .eqIfPresent(SignInRecordDO::getIntegral, reqVO.getIntegral()) + .betweenIfPresent(SignInRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SignInRecordDO::getId)); + } + + default List selectList(SignInRecordExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SignInRecordDO::getUserId, reqVO.getUserId()) + .eqIfPresent(SignInRecordDO::getIntegral, reqVO.getIntegral()) + .betweenIfPresent(SignInRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SignInRecordDO::getId)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/user/MemberUserMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/user/MemberUserMapper.java index 98cda51..55fae6a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/user/MemberUserMapper.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/user/MemberUserMapper.java @@ -9,6 +9,7 @@ import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; +import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.util.List; @@ -36,8 +37,9 @@ public interface MemberUserMapper extends BaseMapperX { .likeIfPresent(MemberUserDO::getUsername, reqVO.getUsername()) .likeIfPresent(MemberUserDO::getRealName, reqVO.getRealName()) .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname()) - .eqIfPresent(MemberUserDO::getMobile, reqVO.getMobile()) + .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile()) .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(MemberUserDO::getId, reqVO.getUserIds()) .orderByDesc(MemberUserDO::getId)); } @@ -46,8 +48,14 @@ public interface MemberUserMapper extends BaseMapperX { .likeIfPresent(MemberUserDO::getUsername, reqVO.getUsername()) .likeIfPresent(MemberUserDO::getRealName, reqVO.getRealName()) .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname()) - .eqIfPresent(MemberUserDO::getMobile, reqVO.getPhone()) + .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile()) .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime()) + .and(StringUtils.hasText(reqVO.getName()),w -> + w.like(MemberUserDO::getUsername,reqVO.getName()) + .or().like(MemberUserDO::getRealName,reqVO.getName()) + .or().like(MemberUserDO::getNickname,reqVO.getName()) + .or().like(MemberUserDO::getMobile,reqVO.getName()) + ) .orderByDesc(MemberUserDO::getId)); } @@ -61,6 +69,21 @@ public interface MemberUserMapper extends BaseMapperX { @Update("update yshop_user set now_money=now_money+#{price}" + " where id=#{uid}") - int incMoney(@Param("uid") Long uid,BigDecimal price); + int incMoney(@Param("uid") Long uid,@Param("price") BigDecimal price); + @Update("update yshop_user set growth_value=growth_value+#{growthValue}" + + " where id=#{userId}") + void addGrowthValue(@Param("userId") Long userId, @Param("growthValue") Integer growthValue); + + @Update("update yshop_user set integral=integral+#{integral}" + + " where id=#{userId}") + void addIntegral(@Param("userId") Long userId, @Param("integral") BigDecimal integral); + + @Update("update yshop_user set write_off_authority = #{writeOffAuthority}" + + " where id=#{userId}") + void updateWriteOffAuthority(@Param("userId") Long userId,@Param("writeOffAuthority") boolean writeOffAuthority); + + default MemberUserDO getByInvitationCode(String invitationCode){ + return selectOne(MemberUserDO::getInvitationCode,invitationCode); + } } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userbill/UserBillMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userbill/UserBillMapper.java index e35e616..9f55952 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userbill/UserBillMapper.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userbill/UserBillMapper.java @@ -1,13 +1,18 @@ package co.yixiang.yshop.module.member.dal.mysql.userbill; -import java.util.*; - import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillRespVO; import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; -import co.yixiang.yshop.module.member.controller.admin.userbill.vo.*; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 用户账单 Mapper @@ -49,4 +54,27 @@ public interface UserBillMapper extends BaseMapperX { .orderByDesc(UserBillDO::getId)); } + default Long selectCount(UserBillPageReqVO reqVO){ + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(UserBillDO::getUid, reqVO.getUid()) + .eqIfPresent(UserBillDO::getLinkId, reqVO.getLinkId()) + .eqIfPresent(UserBillDO::getPm, reqVO.getPm()) + .eqIfPresent(UserBillDO::getTitle, reqVO.getTitle()) + .eqIfPresent(UserBillDO::getCategory, reqVO.getCategory()) + .eqIfPresent(UserBillDO::getType, reqVO.getType()) + .eqIfPresent(UserBillDO::getNumber, reqVO.getNumber()) + .eqIfPresent(UserBillDO::getBalance, reqVO.getBalance()) + .eqIfPresent(UserBillDO::getMark, reqVO.getMark()) + .betweenIfPresent(UserBillDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(UserBillDO::getStatus, reqVO.getStatus()) + .orderByDesc(UserBillDO::getId)); + } + + /** + * 管理后台查询 + * @param mpPage 分页 + * @param pageReqVO 条件 + * @return / + */ + Page selectPageAdmin(IPage mpPage, @Param("param") UserBillPageReqVO pageReqVO); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userinvitelog/UserInviteLogMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userinvitelog/UserInviteLogMapper.java new file mode 100644 index 0000000..eb56e5c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userinvitelog/UserInviteLogMapper.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.member.dal.mysql.userinvitelog; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.userinvitelog.UserInviteLogDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.*; + +/** + * 邀请日志 Mapper + * + * @author admin + */ +@Mapper +public interface UserInviteLogMapper extends BaseMapperX { + + default PageResult selectPage(UserInviteLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UserInviteLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(UserInviteLogDO::getBeInviteUserId, reqVO.getBeInviteUserId()) + .betweenIfPresent(UserInviteLogDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserInviteLogDO::getId)); + } + + default List selectList(UserInviteLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UserInviteLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(UserInviteLogDO::getBeInviteUserId, reqVO.getBeInviteUserId()) + .betweenIfPresent(UserInviteLogDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserInviteLogDO::getId)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelconfig/UserLevelConfigMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelconfig/UserLevelConfigMapper.java new file mode 100644 index 0000000..9a9744a --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelconfig/UserLevelConfigMapper.java @@ -0,0 +1,46 @@ +package co.yixiang.yshop.module.member.dal.mysql.userlevelconfig; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.*; + +/** + * 会员等级配置 Mapper + * + * @author admin + */ +@Mapper +public interface UserLevelConfigMapper extends BaseMapperX { + + default PageResult selectPage(UserLevelConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(UserLevelConfigDO::getLevelName, reqVO.getLevelName()) + .eqIfPresent(UserLevelConfigDO::getLevel, reqVO.getLevel()) + .eqIfPresent(UserLevelConfigDO::getGrowthValue, reqVO.getGrowthValue()) + .eqIfPresent(UserLevelConfigDO::getIconUrl, reqVO.getIconUrl()) + .eqIfPresent(UserLevelConfigDO::getBackgroundUrl, reqVO.getBackgroundUrl()) + .eqIfPresent(UserLevelConfigDO::getStatus, reqVO.getStatus()) + .eqIfPresent(UserLevelConfigDO::getRemarks, reqVO.getRemarks()) + .betweenIfPresent(UserLevelConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(UserLevelConfigDO::getLevel)); + } + + default List selectList(UserLevelConfigExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(UserLevelConfigDO::getLevelName, reqVO.getLevelName()) + .eqIfPresent(UserLevelConfigDO::getLevel, reqVO.getLevel()) + .eqIfPresent(UserLevelConfigDO::getGrowthValue, reqVO.getGrowthValue()) + .eqIfPresent(UserLevelConfigDO::getIconUrl, reqVO.getIconUrl()) + .eqIfPresent(UserLevelConfigDO::getBackgroundUrl, reqVO.getBackgroundUrl()) + .eqIfPresent(UserLevelConfigDO::getStatus, reqVO.getStatus()) + .eqIfPresent(UserLevelConfigDO::getRemarks, reqVO.getRemarks()) + .betweenIfPresent(UserLevelConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(UserLevelConfigDO::getLevel)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequity/UserLevelEquityMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequity/UserLevelEquityMapper.java new file mode 100644 index 0000000..3bc0192 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequity/UserLevelEquityMapper.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.member.dal.mysql.userlevelequity; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.*; + +/** + * 会员等级权益配置 Mapper + * + * @author admin + */ +@Mapper +public interface UserLevelEquityMapper extends BaseMapperX { + + default PageResult selectPage(UserLevelEquityPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UserLevelEquityDO::getType, reqVO.getType()) + .likeIfPresent(UserLevelEquityDO::getTypeName, reqVO.getTypeName()) + .betweenIfPresent(UserLevelEquityDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(UserLevelEquityDO::getIconUrl, reqVO.getIconUrl()) + .orderByDesc(UserLevelEquityDO::getId)); + } + + default List selectList(UserLevelEquityExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UserLevelEquityDO::getType, reqVO.getType()) + .likeIfPresent(UserLevelEquityDO::getTypeName, reqVO.getTypeName()) + .betweenIfPresent(UserLevelEquityDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(UserLevelEquityDO::getIconUrl, reqVO.getIconUrl()) + .orderByDesc(UserLevelEquityDO::getId)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequityref/UserLevelEquityRefMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequityref/UserLevelEquityRefMapper.java new file mode 100644 index 0000000..7377926 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelequityref/UserLevelEquityRefMapper.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.member.dal.mysql.userlevelequityref; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 会员等级权益中间 Mapper + * + * @author admin + */ +@Mapper +public interface UserLevelEquityRefMapper extends BaseMapperX { + + default PageResult selectPage(UserLevelEquityRefPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UserLevelEquityRefDO::getLevelId, reqVO.getLevelId()) + .eqIfPresent(UserLevelEquityRefDO::getEquityId, reqVO.getEquityId()) + .betweenIfPresent(UserLevelEquityRefDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserLevelEquityRefDO::getId)); + } + + default List selectList(UserLevelEquityRefExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UserLevelEquityRefDO::getLevelId, reqVO.getLevelId()) + .eqIfPresent(UserLevelEquityRefDO::getEquityId, reqVO.getEquityId()) + .betweenIfPresent(UserLevelEquityRefDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserLevelEquityRefDO::getId)); + } + + List getUserLevelEquityList(@Param("levelId") Long levelId); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.java new file mode 100644 index 0000000..f9f2da3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.member.dal.mysql.userlevelgrowthvalueconfig; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.*; + +/** + * 会员成长任务配置 Mapper + * + * @author admin + */ +@Mapper +public interface UserLevelGrowthValueConfigMapper extends BaseMapperX { + + default PageResult selectPage(UserLevelGrowthValueConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UserLevelGrowthValueConfigDO::getType, reqVO.getType()) + .likeIfPresent(UserLevelGrowthValueConfigDO::getTypeName, reqVO.getTypeName()) + .eqIfPresent(UserLevelGrowthValueConfigDO::getGrowthValue, reqVO.getGrowthValue()) + .betweenIfPresent(UserLevelGrowthValueConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserLevelGrowthValueConfigDO::getId)); + } + + default List selectList(UserLevelGrowthValueConfigExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UserLevelGrowthValueConfigDO::getType, reqVO.getType()) + .likeIfPresent(UserLevelGrowthValueConfigDO::getTypeName, reqVO.getTypeName()) + .eqIfPresent(UserLevelGrowthValueConfigDO::getGrowthValue, reqVO.getGrowthValue()) + .betweenIfPresent(UserLevelGrowthValueConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserLevelGrowthValueConfigDO::getId)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertag/UserTagMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertag/UserTagMapper.java new file mode 100644 index 0000000..7dfbc43 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertag/UserTagMapper.java @@ -0,0 +1,38 @@ +package co.yixiang.yshop.module.member.dal.mysql.usertag; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.usertag.UserTagDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.usertag.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 会员标签 Mapper + * + * @author admin + */ +@Mapper +public interface UserTagMapper extends BaseMapperX { + + default PageResult selectPage(UserTagPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(UserTagDO::getTagName, reqVO.getTagName()) + .eqIfPresent(UserTagDO::getGroupId, reqVO.getGroupId()) + .betweenIfPresent(UserTagDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserTagDO::getId)); + } + + default List selectList(UserTagExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(UserTagDO::getTagName, reqVO.getTagName()) + .eqIfPresent(UserTagDO::getGroupId, reqVO.getGroupId()) + .betweenIfPresent(UserTagDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserTagDO::getId)); + } + + List selectList2(@Param("param") UserTagPageReqVO pageVO); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertaggroup/UserTagGroupMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertaggroup/UserTagGroupMapper.java new file mode 100644 index 0000000..12073de --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertaggroup/UserTagGroupMapper.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.member.dal.mysql.usertaggroup; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.usertaggroup.UserTagGroupDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo.*; + +/** + * 会员标签分组 Mapper + * + * @author admin + */ +@Mapper +public interface UserTagGroupMapper extends BaseMapperX { + + default PageResult selectPage(UserTagGroupPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(UserTagGroupDO::getGroupName, reqVO.getGroupName()) + .eqIfPresent(UserTagGroupDO::getSorted, reqVO.getSorted()) + .betweenIfPresent(UserTagGroupDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserTagGroupDO::getId)); + } + + default List selectList(UserTagGroupExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(UserTagGroupDO::getGroupName, reqVO.getGroupName()) + .eqIfPresent(UserTagGroupDO::getSorted, reqVO.getSorted()) + .betweenIfPresent(UserTagGroupDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserTagGroupDO::getId)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertagref/UserTagRefMapper.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertagref/UserTagRefMapper.java new file mode 100644 index 0000000..80545b3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/mysql/usertagref/UserTagRefMapper.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.member.dal.mysql.usertagref; + +import java.util.*; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; +import org.apache.ibatis.annotations.Mapper; +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 用户标签中间 Mapper + * + * @author admin + */ +@Mapper +public interface UserTagRefMapper extends BaseMapperX { + + default PageResult selectPage(UserTagRefPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UserTagRefDO::getUserId, reqVO.getUserId()) + .eqIfPresent(UserTagRefDO::getTagId, reqVO.getTagId()) + .betweenIfPresent(UserTagRefDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserTagRefDO::getId)); + } + + List selectList(@Param("param") UserTagRefExportReqVO reqVO); + +// default List selectList(UserTagRefExportReqVO reqVO) { +// return selectList(new LambdaQueryWrapperX() +// .eqIfPresent(UserTagRefDO::getUserId, reqVO.getUserId()) +// .eqIfPresent(UserTagRefDO::getTagId, reqVO.getTagId()) +// .betweenIfPresent(UserTagRefDO::getCreateTime, reqVO.getCreateTime()) +// .orderByDesc(UserTagRefDO::getId)); +// } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java index 5a4d4cb..5e0f2a1 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java @@ -5,7 +5,6 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.framework.common.enums.UserTypeEnum; import co.yixiang.yshop.framework.common.util.monitor.TracerUtils; @@ -14,8 +13,11 @@ import co.yixiang.yshop.module.member.controller.app.auth.vo.*; import co.yixiang.yshop.module.member.convert.auth.AuthConvert; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; import co.yixiang.yshop.module.member.enums.LoginTypeEnum; +import co.yixiang.yshop.module.member.service.integralrule.strategy.IntegralRuleContext; import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.member.service.userlevelconfig.UserLevelConfigService; import co.yixiang.yshop.module.system.api.logger.LoginLogApi; import co.yixiang.yshop.module.system.api.logger.dto.LoginLogCreateReqDTO; import co.yixiang.yshop.module.system.api.oauth2.OAuth2TokenApi; @@ -28,7 +30,6 @@ import co.yixiang.yshop.module.system.enums.logger.LoginLogTypeEnum; import co.yixiang.yshop.module.system.enums.logger.LoginResultEnum; import co.yixiang.yshop.module.system.enums.oauth2.OAuth2ClientConstants; import co.yixiang.yshop.module.system.enums.sms.SmsSceneEnum; -import co.yixiang.yshop.module.system.enums.social.SocialTypeEnum; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; @@ -42,7 +43,6 @@ import java.util.Objects; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.common.util.servlet.ServletUtils.getClientIP; import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; -import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.MINI_AUTH_LOGIN_BAD; /** * 会员的认证 Service 接口 @@ -71,8 +71,14 @@ public class MemberAuthServiceImpl implements MemberAuthService { private PasswordEncoder passwordEncoder; @Resource private MemberUserMapper userMapper; + @Resource + private IntegralRuleContext integralRuleContext; + + @Resource + private UserLevelConfigService levelConfigService; @Override + @Transactional(rollbackFor = Exception.class) public AppAuthLoginRespVO login(AppAuthLoginReqVO reqVO) { // 使用手机 + 密码,进行登录。 MemberUserDO user = login0(reqVO.getMobile(), reqVO.getPassword()); @@ -83,12 +89,15 @@ public class MemberAuthServiceImpl implements MemberAuthService { reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); } + //登录增加积分 + integralRuleContext.execute(BillDetailEnum.LOGIN,user.getId()); + levelConfigService.upgradeLevel(user.getId()); // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(user, reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE); } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public AppAuthLoginRespVO smsLogin(AppAuthSmsLoginReqVO reqVO) { // 校验验证码 String userIp = "9999"; @@ -97,7 +106,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { } // 获得获得注册用户 - MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, reqVO.getFrom()); + MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, reqVO.getFrom(),reqVO.getInvitationCode()); Assert.notNull(user, "获取用户失败,结果为空"); // 如果 socialType 非空,说明需要绑定社交用户 @@ -105,7 +114,10 @@ public class MemberAuthServiceImpl implements MemberAuthService { socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); } - + //登录增加积分 + integralRuleContext.execute(BillDetailEnum.LOGIN,user.getId()); + //升级 + levelConfigService.upgradeLevel(user.getId()); // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(user, reqVO.getMobile(), LoginLogTypeEnum.LOGIN_SMS); } @@ -125,6 +137,9 @@ public class MemberAuthServiceImpl implements MemberAuthService { throw exception(USER_NOT_EXISTS); } + //登录增加积分 + integralRuleContext.execute(BillDetailEnum.LOGIN,user.getId()); + levelConfigService.upgradeLevel(user.getId()); // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL); } @@ -139,7 +154,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { log.error(exception.getMessage()); throw exception(AUTH_WEIXIN_MINI_APP_PHONE_CODE_ERROR); } - WxMaJscode2SessionResult session = null; + WxMaJscode2SessionResult session; try { session = wxMaService.getUserService().getSessionInfo(reqVO.getLoginCode()); } catch (WxErrorException e) { @@ -151,11 +166,14 @@ public class MemberAuthServiceImpl implements MemberAuthService { if (memberUserDO == null ) { // 获得获得注册用户 memberUserDO = userService.createUserIfAbsent(phoneNumberInfo.getPhoneNumber(), getClientIP(), - LoginTypeEnum.WXAPP.getValue()); + LoginTypeEnum.WXAPP.getValue(),reqVO.getInvitationCode()); memberUserDO.setNickname("用户_" + memberUserDO.getId()); } - memberUserDO.setRoutineOpenid(session.getOpenid()); + memberUserDO.setRoutineOpenId(session.getOpenid()); userMapper.updateById(memberUserDO); + //登录增加积分 + integralRuleContext.execute(BillDetailEnum.LOGIN,memberUserDO.getId()); + levelConfigService.upgradeLevel(memberUserDO.getId()); // 创建 Token 令牌,记录登录日志 return createTokenAfterLoginSuccess(memberUserDO, memberUserDO.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointService.java new file mode 100644 index 0000000..cdd691b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointService.java @@ -0,0 +1,73 @@ +package co.yixiang.yshop.module.member.service.burypoint; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.BuryPointDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; + +/** + * 埋点 Service 接口 + * + * @author admin + */ +public interface BuryPointService { + + /** + * 创建埋点 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBuryPoint(@Valid BuryPointCreateReqVO createReqVO); + + /** + * 更新埋点 + * + * @param updateReqVO 更新信息 + */ + void updateBuryPoint(@Valid BuryPointUpdateReqVO updateReqVO); + + /** + * 删除埋点 + * + * @param id 编号 + */ + void deleteBuryPoint(Long id); + + /** + * 获得埋点 + * + * @param id 编号 + * @return 埋点 + */ + BuryPointDO getBuryPoint(Long id); + + /** + * 获得埋点列表 + * + * @param ids 编号 + * @return 埋点列表 + */ + List getBuryPointList(Collection ids); + + /** + * 获得埋点分页 + * + * @param pageReqVO 分页查询 + * @return 埋点分页 + */ + PageResult getBuryPointPage(BuryPointPageReqVO pageReqVO); + + /** + * 获得埋点列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 埋点列表 + */ + List getBuryPointList(BuryPointExportReqVO exportReqVO); + + List getTrendChart(); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImpl.java new file mode 100644 index 0000000..1d94292 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImpl.java @@ -0,0 +1,88 @@ +package co.yixiang.yshop.module.member.service.burypoint; + +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.TrendChartRespVO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.BuryPointDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.burypoint.BuryPointConvert; +import co.yixiang.yshop.module.member.dal.mysql.burypoint.BuryPointMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 埋点 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class BuryPointServiceImpl implements BuryPointService { + + @Resource + private BuryPointMapper buryPointMapper; + + @Override + public Long createBuryPoint(BuryPointCreateReqVO createReqVO) { + // 插入 + BuryPointDO buryPoint = BuryPointConvert.INSTANCE.convert(createReqVO); + buryPointMapper.insert(buryPoint); + // 返回 + return buryPoint.getId(); + } + + @Override + public void updateBuryPoint(BuryPointUpdateReqVO updateReqVO) { + // 校验存在 + validateBuryPointExists(updateReqVO.getId()); + // 更新 + BuryPointDO updateObj = BuryPointConvert.INSTANCE.convert(updateReqVO); + buryPointMapper.updateById(updateObj); + } + + @Override + public void deleteBuryPoint(Long id) { + // 校验存在 + validateBuryPointExists(id); + // 删除 + buryPointMapper.deleteById(id); + } + + private void validateBuryPointExists(Long id) { + if (buryPointMapper.selectById(id) == null) { + throw exception(BURY_POINT_NOT_EXISTS); + } + } + + @Override + public BuryPointDO getBuryPoint(Long id) { + return buryPointMapper.selectById(id); + } + + @Override + public List getBuryPointList(Collection ids) { + return buryPointMapper.selectBatchIds(ids); + } + + @Override + public PageResult getBuryPointPage(BuryPointPageReqVO pageReqVO) { + return buryPointMapper.selectPage(pageReqVO); + } + + @Override + public List getBuryPointList(BuryPointExportReqVO exportReqVO) { + return buryPointMapper.selectList(exportReqVO); + } + + @Override + public List getTrendChart() { + return buryPointMapper.getTrendChart(); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleService.java new file mode 100644 index 0000000..7eaaeaf --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleService.java @@ -0,0 +1,90 @@ +package co.yixiang.yshop.module.member.service.integralrule; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 会员积分规则 Service 接口 + * + * @author admin + */ +public interface IntegralRuleService { + + /** + * 创建会员积分规则 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createIntegralRule(@Valid IntegralRuleCreateReqVO createReqVO); + + /** + * 更新会员积分规则 + * + * @param updateReqVO 更新信息 + */ + void updateIntegralRule(@Valid IntegralRuleUpdateReqVO updateReqVO); + + /** + * 删除会员积分规则 + * + * @param id 编号 + */ + void deleteIntegralRule(Long id); + + /** + * 获得会员积分规则 + * + * @param id 编号 + * @return 会员积分规则 + */ + IntegralRuleDO getIntegralRule(Long id); + + /** + * 获得会员积分规则列表 + * + * @param ids 编号 + * @return 会员积分规则列表 + */ + List getIntegralRuleList(Collection ids); + + /** + * 获得会员积分规则分页 + * + * @param pageReqVO 分页查询 + * @return 会员积分规则分页 + */ + PageResult getIntegralRulePage(IntegralRulePageReqVO pageReqVO); + + /** + * 获得会员积分规则列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员积分规则列表 + */ + List getIntegralRuleList(IntegralRuleExportReqVO exportReqVO); + + /** + * 根据类型列表查询 + * @param typeList / + * @return / + */ + List getIntegralRuleByTypes(List typeList); + + /** + * 查询会员积分规则 + * @return / + */ + IntegralRuleVO getRule(); + + /** + * 保存会员积分规则 + * @param vo / + */ + void saveRule(IntegralRuleVO vo); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImpl.java new file mode 100644 index 0000000..eca8978 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImpl.java @@ -0,0 +1,120 @@ +package co.yixiang.yshop.module.member.service.integralrule; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.dict.core.util.DictFrameworkUtils; +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.*; +import co.yixiang.yshop.module.member.convert.integralrule.IntegralRuleConvert; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import co.yixiang.yshop.module.member.dal.mysql.integralrule.IntegralRuleMapper; +import co.yixiang.yshop.module.system.service.dict.DictDataService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.INTEGRAL_RULE_NOT_EXISTS; +import static co.yixiang.yshop.module.system.enums.DictTypeConstants.*; + +/** + * 会员积分规则 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class IntegralRuleServiceImpl implements IntegralRuleService { + + @Resource + private IntegralRuleMapper integralRuleMapper; + @Resource + private DictDataService dictDataService; + + @Override + public Long createIntegralRule(IntegralRuleCreateReqVO createReqVO) { + // 插入 + IntegralRuleDO integralRule = IntegralRuleConvert.INSTANCE.convert(createReqVO); + integralRuleMapper.insert(integralRule); + // 返回 + return integralRule.getId(); + } + + @Override + public void updateIntegralRule(IntegralRuleUpdateReqVO updateReqVO) { + // 校验存在 + validateIntegralRuleExists(updateReqVO.getId()); + // 更新 + IntegralRuleDO updateObj = IntegralRuleConvert.INSTANCE.convert(updateReqVO); + integralRuleMapper.updateById(updateObj); + } + + @Override + public void deleteIntegralRule(Long id) { + // 校验存在 + validateIntegralRuleExists(id); + // 删除 + integralRuleMapper.deleteById(id); + } + + private void validateIntegralRuleExists(Long id) { + if (integralRuleMapper.selectById(id) == null) { + throw exception(INTEGRAL_RULE_NOT_EXISTS); + } + } + + @Override + public IntegralRuleDO getIntegralRule(Long id) { + return integralRuleMapper.selectById(id); + } + + @Override + public List getIntegralRuleList(Collection ids) { + return integralRuleMapper.selectBatchIds(ids); + } + + @Override + public PageResult getIntegralRulePage(IntegralRulePageReqVO pageReqVO) { + return integralRuleMapper.selectPage(pageReqVO); + } + + @Override + public List getIntegralRuleList(IntegralRuleExportReqVO exportReqVO) { + return integralRuleMapper.selectList(exportReqVO); + } + + @Override + public List getIntegralRuleByTypes(List typeList) { + return integralRuleMapper.selectList(Wrappers.lambdaQuery().in(IntegralRuleDO::getType, typeList)); + } + + @Override + public IntegralRuleVO getRule() { + List list = this.getIntegralRuleList(new IntegralRuleExportReqVO()); + + IntegralRuleVO vo = new IntegralRuleVO(); + vo.setRuleList(list); + + vo.setIntegralDeductionRule(DictFrameworkUtils.parseDictDataValue(INTEGRAL_CONFIG, INTEGRAL_DEDUCTION_RULE)); + vo.setIntegralName(DictFrameworkUtils.parseDictDataValue(INTEGRAL_CONFIG, INTEGRAL_NAME)); + vo.setIntegralEnable(DictFrameworkUtils.parseDictDataValue(INTEGRAL_CONFIG, INTEGRAL_ENABLE)); + return vo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveRule(IntegralRuleVO vo) { + List ruleList = vo.getRuleList(); + + integralRuleMapper.delete(); + integralRuleMapper.insertBatch(ruleList, ruleList.size()); + + dictDataService.updateDictByLabel(INTEGRAL_DEDUCTION_RULE, vo.getIntegralDeductionRule()); + dictDataService.updateDictByLabel(INTEGRAL_NAME, vo.getIntegralName()); + dictDataService.updateDictByLabel(INTEGRAL_ENABLE, vo.getIntegralEnable()); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/AbstractIntegralRuleStrategy.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/AbstractIntegralRuleStrategy.java new file mode 100644 index 0000000..8e7dabd --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/AbstractIntegralRuleStrategy.java @@ -0,0 +1,74 @@ +package co.yixiang.yshop.module.member.service.integralrule.strategy; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import co.yixiang.yshop.module.member.api.integralRule.IntegralRuleDTO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillPageReqVO; +import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author pepis + * @apiNote 积分奖励规则策略抽象 + **/ +public abstract class AbstractIntegralRuleStrategy implements IntegralRuleStrategy { + private final MemberUserService userService; + + private final UserBillService userBillService; + + + public AbstractIntegralRuleStrategy(MemberUserService userService, UserBillService userBillService) { + this.userService = userService; + this.userBillService = userBillService; + } + + @Override + public Boolean beforeExecute(BillDetailEnum type, IntegralRuleDTO rule) { + //判断是否开启 + if(!rule.getEnable()){ + return false; + } + UserBillPageReqVO pageReqVO = new UserBillPageReqVO(); + pageReqVO.setUid(rule.getUserId()); + pageReqVO.setType(type.getValue()); + LocalDateTime[] createTime = new LocalDateTime[2]; + createTime[0] = DateUtil.beginOfDay(DateUtil.date()).toLocalDateTime(); + createTime[1] = LocalDateTime.now(); + pageReqVO.setCreateTime(createTime); + Long count = userBillService.getUserBillCount(pageReqVO); + return count < 1; + } + + @Override + public BigDecimal execute(BillDetailEnum type, IntegralRuleDTO rule) { + //前置 + if(!beforeExecute(type, rule)){ + return null; + } + //计算获取的积分 + BigDecimal integral = calculate(rule); + if (integral.compareTo(BigDecimal.ZERO) <= 0) { + return null; + } + //更新积分到用户 + MemberUserDO user = userService.getUser(rule.getUserId()); + + BigDecimal newIntegral = NumberUtil.add(user.getIntegral(), integral); + user.setIntegral(newIntegral); + user.setId(rule.getUserId()); + userService.updateById(user); + + //增加流水 + userBillService.income(user.getId(), type.getDesc(), BillDetailEnum.CATEGORY_2.getValue(), + type.getValue(), + integral, + newIntegral, + type.getDesc(), null); + return integral; + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleContext.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleContext.java new file mode 100644 index 0000000..a5fd0c8 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleContext.java @@ -0,0 +1,55 @@ +package co.yixiang.yshop.module.member.service.integralrule.strategy; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.extra.spring.SpringUtil; +import co.yixiang.yshop.module.member.api.integralRule.IntegralRuleDTO; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.service.integralrule.IntegralRuleService; +import co.yixiang.yshop.module.member.service.integralrule.strategy.impl.DefaultIntegralRuleStrategy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * @author pepis + * @apiNote 积分奖励规则上下文 + **/ +@Component +public class IntegralRuleContext { + private final Map map = SpringUtil.getBeansOfType(IntegralRuleStrategy.class); + @Resource + private DefaultIntegralRuleStrategy defaultIntegralRuleStrategy; + @Resource + private IntegralRuleService integralRuleService; + + public BigDecimal execute(BillDetailEnum type, IntegralRuleDTO rule) { + IntegralRuleStrategy integralRuleStrategy = map.getOrDefault(type.getValue(), defaultIntegralRuleStrategy); + return integralRuleStrategy.execute(type, rule); + } + + public BigDecimal execute(BillDetailEnum type, Long userId) { + return this.execute(type, userId, null); + } + + public BigDecimal execute(BillDetailEnum type, Long userId, BigDecimal consumeAmount) { + List integralRuleByTypes = integralRuleService.getIntegralRuleByTypes(Collections.singletonList(type.getValue())); + if (CollectionUtil.isEmpty(integralRuleByTypes)) { + return null; + } else { + IntegralRuleDO integralRuleDO = integralRuleByTypes.get(0); + IntegralRuleDTO rule = new IntegralRuleDTO(); + rule.setUserId(userId); + rule.setIntegral(integralRuleDO.getIntegral()); + rule.setType(integralRuleDO.getType()); + rule.setAttribute1(integralRuleDO.getAttribute1()); + rule.setEnable(integralRuleDO.getEnable()); + rule.setConsumeAmount(consumeAmount); + return this.execute(type, rule); + } + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleStrategy.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleStrategy.java new file mode 100644 index 0000000..2233146 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/IntegralRuleStrategy.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.member.service.integralrule.strategy; + +import co.yixiang.yshop.module.member.api.integralRule.IntegralRuleDTO; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; + +import java.math.BigDecimal; + +/** + * @author pepis + * @apiNote 积分奖励规则策略 + **/ +public interface IntegralRuleStrategy { + /** + * 执行 + * + * @return 积分 + */ + BigDecimal execute(BillDetailEnum type, IntegralRuleDTO rule); + + /** + * 计算获得积分 + * @param rule / + * @return / + */ + BigDecimal calculate(IntegralRuleDTO rule); + + /** + * 获取积分前置条件 比如今日是否已经获取过 + * @param type / + * @param rule / + */ + Boolean beforeExecute(BillDetailEnum type,IntegralRuleDTO rule); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/ConsumeIntegralRuleStrategy.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/ConsumeIntegralRuleStrategy.java new file mode 100644 index 0000000..17baae1 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/ConsumeIntegralRuleStrategy.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.member.service.integralrule.strategy.impl; + +import cn.hutool.core.util.NumberUtil; +import co.yixiang.yshop.module.member.api.integralRule.IntegralRuleDTO; +import co.yixiang.yshop.module.member.service.integralrule.strategy.AbstractIntegralRuleStrategy; +import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * @author pepis + * @apiNote + **/ +@Component("consume") +public class ConsumeIntegralRuleStrategy extends AbstractIntegralRuleStrategy { + public ConsumeIntegralRuleStrategy(MemberUserService userService, UserBillService userBillService) { + super(userService, userBillService); + } + + @Override + public BigDecimal calculate(IntegralRuleDTO rule) { + //消费xx元获得一积分 + Integer integral = rule.getIntegral(); + //消费金额 + BigDecimal consumeAmount = rule.getConsumeAmount(); + return NumberUtil.div(consumeAmount,integral).setScale(0, RoundingMode.DOWN); + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/DefaultIntegralRuleStrategy.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/DefaultIntegralRuleStrategy.java new file mode 100644 index 0000000..e71a76f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/integralrule/strategy/impl/DefaultIntegralRuleStrategy.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.member.service.integralrule.strategy.impl; + +import co.yixiang.yshop.module.member.api.integralRule.IntegralRuleDTO; +import co.yixiang.yshop.module.member.service.integralrule.strategy.AbstractIntegralRuleStrategy; +import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.member.service.user.UserService; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; + +/** + * @author pepis + * @apiNote + **/ +@Component +public class DefaultIntegralRuleStrategy extends AbstractIntegralRuleStrategy { + public DefaultIntegralRuleStrategy(MemberUserService userService, UserBillService userBillService) { + super(userService, userBillService); + } + + @Override + public BigDecimal calculate(IntegralRuleDTO rule) { + return BigDecimal.valueOf(rule.getIntegral()); + } +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordService.java new file mode 100644 index 0000000..024e07b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordService.java @@ -0,0 +1,103 @@ +package co.yixiang.yshop.module.member.service.signinrecord; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.SignInRecordCreateReqVO; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.SignInRecordExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.SignInRecordPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.SignInRecordUpdateReqVO; +import co.yixiang.yshop.module.member.controller.app.signinrecord.vo.SignInInfoVO; +import co.yixiang.yshop.module.member.dal.dataobject.signinrecord.SignInRecordDO; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +/** + * 签到记录 Service 接口 + * + * @author admin + */ +public interface SignInRecordService { + + /** + * 创建签到记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSignInRecord(@Valid SignInRecordCreateReqVO createReqVO); + + /** + * 更新签到记录 + * + * @param updateReqVO 更新信息 + */ + void updateSignInRecord(@Valid SignInRecordUpdateReqVO updateReqVO); + + /** + * 删除签到记录 + * + * @param id 编号 + */ + void deleteSignInRecord(Long id); + + /** + * 获得签到记录 + * + * @param id 编号 + * @return 签到记录 + */ + SignInRecordDO getSignInRecord(Long id); + + /** + * 获得签到记录列表 + * + * @param ids 编号 + * @return 签到记录列表 + */ + List getSignInRecordList(Collection ids); + + /** + * 获得签到记录分页 + * + * @param pageReqVO 分页查询 + * @return 签到记录分页 + */ + PageResult getSignInRecordPage(SignInRecordPageReqVO pageReqVO); + + /** + * 获得签到记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 签到记录列表 + */ + List getSignInRecordList(SignInRecordExportReqVO exportReqVO); + + /** + *获取用户连续签到次数 + * @param userId / + * @return / + */ + Integer countByUserIdThisWeek(Long userId); + + /** + * 签到信息 + * + * @param loginUserId / + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return / + */ + SignInInfoVO signInInfo(Long loginUserId, LocalDateTime startTime,LocalDateTime endTime); + + /** + * 签到 + * @param loginUserId / + * @return / + */ + BigDecimal signIn(Long loginUserId); + + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImpl.java new file mode 100644 index 0000000..acb0928 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImpl.java @@ -0,0 +1,284 @@ +package co.yixiang.yshop.module.member.service.signinrecord; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.common.util.date.DateUtils; +import co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils; +import co.yixiang.yshop.module.member.api.integralRule.IntegralRuleDTO; +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.*; +import co.yixiang.yshop.module.member.controller.app.signinrecord.vo.SignInInfoVO; +import co.yixiang.yshop.module.member.convert.signinrecord.SignInRecordConvert; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import co.yixiang.yshop.module.member.dal.dataobject.signinrecord.SignInRecordDO; +import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.dal.mysql.signinrecord.SignInRecordMapper; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.service.integralrule.IntegralRuleService; +import co.yixiang.yshop.module.member.service.integralrule.strategy.IntegralRuleContext; +import co.yixiang.yshop.module.member.service.user.UserService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.constant.ShopConstants.DAY_FORMAT_STR; +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.SIGN_IN_RECORD_NOT_EXISTS; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.TODAY_SIGN_IN_RECORD_EXISTS; + +/** + * 签到记录 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class SignInRecordServiceImpl implements SignInRecordService { + + @Resource + private SignInRecordMapper signInRecordMapper; + @Resource + private IntegralRuleContext integralRuleContext; + @Resource + private IntegralRuleService integralRuleService; + @Resource + private UserService userService; + + @Override + public Long createSignInRecord(SignInRecordCreateReqVO createReqVO) { + // 插入 + SignInRecordDO signInRecord = SignInRecordConvert.INSTANCE.convert(createReqVO); + signInRecordMapper.insert(signInRecord); + // 返回 + return signInRecord.getId(); + } + + @Override + public void updateSignInRecord(SignInRecordUpdateReqVO updateReqVO) { + // 校验存在 + validateSignInRecordExists(updateReqVO.getId()); + // 更新 + SignInRecordDO updateObj = SignInRecordConvert.INSTANCE.convert(updateReqVO); + signInRecordMapper.updateById(updateObj); + } + + @Override + public void deleteSignInRecord(Long id) { + // 校验存在 + validateSignInRecordExists(id); + // 删除 + signInRecordMapper.deleteById(id); + } + + private void validateSignInRecordExists(Long id) { + if (signInRecordMapper.selectById(id) == null) { + throw exception(SIGN_IN_RECORD_NOT_EXISTS); + } + } + + @Override + public SignInRecordDO getSignInRecord(Long id) { + return signInRecordMapper.selectById(id); + } + + @Override + public List getSignInRecordList(Collection ids) { + return signInRecordMapper.selectBatchIds(ids); + } + + @Override + public PageResult getSignInRecordPage(SignInRecordPageReqVO pageReqVO) { + return signInRecordMapper.selectPage(pageReqVO); + } + + @Override + public List getSignInRecordList(SignInRecordExportReqVO exportReqVO) { + return signInRecordMapper.selectList(exportReqVO); + } + + @Override + public Integer countByUserIdThisWeek(Long userId) { + List signInRecordList = getSignInRecord(userId,LocalDateTimeUtils.weekStartTime(),LocalDateTimeUtils.weekEndTime()); + if (CollectionUtil.isEmpty(signInRecordList)) { + return 0; + } + Map recordMap = signInRecordList.stream().collect(Collectors.toMap(item -> item.getCreateTime().format(DateTimeFormatter.ofPattern(DAY_FORMAT_STR)), item -> item)); + AtomicInteger count = new AtomicInteger(0); + DateTime now = DateUtil.date(); + List dateTimes = CollectionUtil.reverse(DateUtil.rangeToList(DateUtil.beginOfWeek(now), DateUtil.endOfDay(now), DateField.DAY_OF_WEEK)) + .stream() + .filter(item -> !DateUtils.isSameDay(item, now)) + .map(item -> DateUtil.format(item, DAY_FORMAT_STR)) + .collect(Collectors.toList()); + for (String dateTime : dateTimes) { + if (recordMap.containsKey(dateTime)) { + count.incrementAndGet(); + } else { + break; + } + } + //判断今天是否签到 + String nowStr = DateUtil.format(now, DAY_FORMAT_STR); + if (recordMap.containsKey(nowStr)) { + count.incrementAndGet(); + } + return count.get(); + } + + @Override + public SignInInfoVO signInInfo(Long userId, LocalDateTime startTime, LocalDateTime endTime) { + SignInInfoVO signInInfoVO = new SignInInfoVO(); + + MemberUserDO user = userService.getUser(userId); + signInInfoVO.setIntegral(user.getIntegral()); + + //今日是否签到 + Boolean exists = this.existSignInToday(userId); + signInInfoVO.setTodaySignIn(exists); + + //累计签到天数 + Integer count = countByUserIdThisWeek(userId); + signInInfoVO.setSignInDays(count); + + //签到记录 + List list = getSignInRecord(userId,startTime,endTime); + List signList = SignInRecordConvert.INSTANCE.convertList(list); + Map signMap = signList.stream().collect(Collectors.toMap(item -> item.getCreateTime().toLocalDate(), Function.identity())); + + //本周日期列表 + LocalDate nowDate = LocalDate.now(); + //查询签到相关积分规则 + List integralRuleList = integralRuleService.getIntegralRuleByTypes(ListUtil.of(BillDetailEnum.SIGN.getValue())); + //每日签到规则 + IntegralRuleDO everydayIntegralRuleDO = integralRuleList.stream().filter(item -> item.getAttribute1().equals("1")).findFirst().get(); + AtomicInteger predictCount = new AtomicInteger(count); + + List dateTimes = DateUtil.rangeToList(DateUtils.of(startTime), DateUtils.of(endTime), DateField.DAY_OF_WEEK); + signList = dateTimes.stream().map(item -> { + LocalDate localDate = DateUtils.of(item).toLocalDate(); + SignInRecordRespVO signInRecordRespVO = signMap.get(localDate); + // 当天已经签到 + if (Objects.nonNull(signInRecordRespVO)) { + signInRecordRespVO.setIsSign(Boolean.TRUE); + } else { //未签到 + signInRecordRespVO = new SignInRecordRespVO(); + signInRecordRespVO.setIsSign(Boolean.FALSE); + signInRecordRespVO.setCreateTime(DateUtils.of(item)); + signInRecordRespVO.setIntegral(BigDecimal.ZERO); + //可签到记录 + if (localDate.isEqual(nowDate) || localDate.isAfter(nowDate)) { + //当前连续签到天数 + int curCount = predictCount.incrementAndGet(); + IntegralRuleDO thisDayRule = integralRuleList.stream().filter(rule -> Integer.valueOf(rule.getAttribute1()).equals(curCount)).findFirst().orElse(everydayIntegralRuleDO); + signInRecordRespVO.setIntegral(BigDecimal.valueOf(thisDayRule.getIntegral())); + } + } + return signInRecordRespVO; + }).collect(Collectors.toList()); + + signInInfoVO.setSignInRecordList(signList); + return signInInfoVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public BigDecimal signIn(Long userId) { + //校验今日是否签到 + verifyExistSignInToday(userId); + //获取当前签到规则 + IntegralRuleDO currentIntegralRule = getIntegralRule(userId); + //领取积分 + IntegralRuleDTO rule = new IntegralRuleDTO(); + rule.setUserId(userId); + rule.setType(BillDetailEnum.SIGN.getValue()); + rule.setAttribute1(currentIntegralRule.getAttribute1()); + rule.setIntegral(currentIntegralRule.getIntegral()); + rule.setEnable(currentIntegralRule.getEnable()); + BigDecimal integral = integralRuleContext.execute(BillDetailEnum.SIGN, rule); + //签到记录 + SignInRecordDO signInRecordDO = new SignInRecordDO(); + signInRecordDO.setUserId(userId); + signInRecordDO.setIntegral(integral); + signInRecordMapper.insert(signInRecordDO); + return integral; + } + + /** + * 获取本次签到对应签到规则 + * + * @param userId / + * @return / + */ + @NotNull + private IntegralRuleDO getIntegralRule(Long userId) { + //查询签到相关积分规则 + List integralRuleList = integralRuleService.getIntegralRuleByTypes(ListUtil.of(BillDetailEnum.SIGN.getValue())); + //每日签到规则 + IntegralRuleDO everydayIntegralRuleDO = integralRuleList.stream().filter(item -> item.getAttribute1().equals("1")).findFirst().get(); + //当前签到天数 + Integer count = countByUserIdThisWeek(userId) + 1; + //获取当前签到规则 + return integralRuleList.stream().filter(item -> Integer.valueOf(item.getAttribute1()).equals(count)).findFirst().orElse(everydayIntegralRuleDO); + } + + + /** + * 查询用户签到记录 + * + * @param userId / + * @return / + */ + private List getSignInRecord(Long userId,LocalDateTime startTime, LocalDateTime endTime) { + SignInRecordExportReqVO exportReqVO = new SignInRecordExportReqVO(); + exportReqVO.setUserId(userId); + LocalDateTime[] createTime = new LocalDateTime[2]; + createTime[0] = startTime; + createTime[1] = endTime; + exportReqVO.setCreateTime(createTime); + return this.getSignInRecordList(exportReqVO); + } + + /** + * 校验今日是否签到 + * + * @param userId / + */ + private void verifyExistSignInToday(Long userId) { + Boolean exists = this.existSignInToday(userId); + if (exists) { + throw exception(TODAY_SIGN_IN_RECORD_EXISTS); + } + } + + /** + * 今日是否存在签到 + * + * @param userId / + * @return / + */ + private Boolean existSignInToday(Long userId) { + return signInRecordMapper.exists(Wrappers.lambdaQuery() + .eq(SignInRecordDO::getUserId, userId) + .between(SignInRecordDO::getCreateTime, DateUtil.beginOfDay(DateUtil.date()), DateUtil.date()) + ); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java index 25bba3c..69ea415 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.member.service.user; import co.yixiang.yshop.framework.common.validation.Mobile; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillModifyDTO; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; @@ -41,9 +42,10 @@ public interface MemberUserService extends IService { * * @param mobile 手机号 * @param registerIp 注册 IP + * @param invitationCode 邀请码 * @return 用户对象 */ - MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp,String from); + MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp,String from, String invitationCode); /** * 更新用户的最后登陆信息 @@ -131,4 +133,17 @@ public interface MemberUserService extends IService { */ void incMoney(Long uid,BigDecimal price); + /** + * 用户积分变动 + * @param dto / + */ + void addIntegral(UserBillModifyDTO dto); + + /** + * 增加用户积分 + * @param userId / + * @param integral / + */ + void addIntegral(Long userId, BigDecimal integral); + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java index db8921a..7bfa282 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java @@ -2,14 +2,25 @@ package co.yixiang.yshop.module.member.service.user; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.module.infra.api.file.FileApi; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillModifyDTO; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; import co.yixiang.yshop.module.member.convert.user.UserConvert; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.enums.LevelGrowthValueEnum; +import co.yixiang.yshop.module.member.service.integralrule.strategy.IntegralRuleContext; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import co.yixiang.yshop.module.member.service.userinvitelog.UserInviteLogService; +import co.yixiang.yshop.module.member.service.userlevelconfig.UserLevelConfigService; +import co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigService; import co.yixiang.yshop.module.system.api.sms.SmsCodeApi; import co.yixiang.yshop.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataRespVO; @@ -27,13 +38,15 @@ import javax.annotation.Resource; import javax.validation.Valid; import java.io.InputStream; import java.math.BigDecimal; -import java.util.Collection; -import java.util.Date; -import java.util.List; +import java.math.RoundingMode; import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; +import java.util.Objects; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.common.util.servlet.ServletUtils.getClientIP; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.NOT_ENOUGH_INTEGRAL; import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_NOT_EXISTS; /** @@ -59,6 +72,16 @@ public class MemberUserServiceImpl extends ServiceImpl 0){ + memberUserMapper.addGrowthValue(userId,growthValue); + //升级 + levelConfigService.upgradeLevel(userId); + } + return null; + } + + /** + * 生成邀请码 + * @return 唯一邀请码 + */ + private String generateInvitationCode() { + String code; + while (true){ + code = RandomUtil.randomStringUpper(6); + MemberUserDO user = memberUserMapper.getByInvitationCode(code); + if(Objects.isNull(user)){ + break; + } + } + return code; + } + /** * 对密码进行加密 * diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserService.java index b8732a4..bcb7f9c 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserService.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserService.java @@ -1,10 +1,13 @@ package co.yixiang.yshop.module.member.service.user; -import java.util.*; -import javax.validation.*; +import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.member.controller.admin.user.vo.*; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; /** * 用户 Service 接口 @@ -33,7 +36,7 @@ public interface UserService { * * @param updateReqVO 更新信息 */ - void updateMony(@Valid UserUpdateMoneyReqVO updateReqVO); + void updateMoney(@Valid UserUpdateMoneyReqVO updateReqVO); /** * 删除用户 @@ -64,7 +67,7 @@ public interface UserService { * @param pageReqVO 分页查询 * @return 用户分页 */ - PageResult getUserPage(UserPageReqVO pageReqVO); + PageResult getUserPage(UserPageReqVO pageReqVO); /** * 获得用户列表, 用于 Excel 导出 @@ -74,4 +77,38 @@ public interface UserService { */ List getUserList(UserExportReqVO exportReqVO); + /** + * 更新标签 + * @param dto / + */ + void updateTag(UserUpdateTagDTO dto); + + /** + * 增加用户成长值 + * @param userId 当前用户 + * @param type 类型 + * @param consumeAmount 消费金额(类型为消费) + * @return 成长值 + */ + Integer addGrowthValue(Long userId, String type, BigDecimal consumeAmount); + + /** + * 更新用户 + * @param newUser / + */ + void updateById(MemberUserDO newUser); + + /** + * 增加积分 + * @param userId / + * @param integral 积分 + */ + void addIntegral(Long userId, BigDecimal integral); + + /** + * 更新用户核销权限 + * @param userId / + * @param writeOffAuthority / + */ + void updateWriteOffAuthority(Long userId, boolean writeOffAuthority); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserServiceImpl.java index 4f4de14..12d1abd 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/UserServiceImpl.java @@ -1,26 +1,36 @@ package co.yixiang.yshop.module.member.service.user; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.NumberUtil; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.user.vo.*; +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.UserTagRefExportReqVO; +import co.yixiang.yshop.module.member.convert.user.UserConvert; +import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; +import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.enums.LevelGrowthValueEnum; import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import co.yixiang.yshop.module.member.service.userlevelconfig.UserLevelConfigService; +import co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigService; +import co.yixiang.yshop.module.member.service.usertagref.UserTagRefService; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import javax.validation.Valid; - import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.*; -import co.yixiang.yshop.module.member.controller.admin.user.vo.*; -import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; - -import co.yixiang.yshop.module.member.convert.user.UserConvert; -import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; +import java.math.RoundingMode; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_NOT_EXISTS; /** * 用户 Service 实现类 @@ -35,6 +45,12 @@ public class UserServiceImpl implements UserService { private MemberUserMapper userMapper; @Resource private UserBillService userBillService; + @Resource + private UserTagRefService userTagRefService; + @Resource + private UserLevelGrowthValueConfigService growthValueConfigService; + @Resource + private UserLevelConfigService levelConfigService; @Override public Long createUser(UserCreateReqVO createReqVO) { @@ -60,42 +76,42 @@ public class UserServiceImpl implements UserService { * @param updateReqVO 更新信息 */ @Override - public void updateMony(UserUpdateMoneyReqVO updateReqVO){ + public void updateMoney(UserUpdateMoneyReqVO updateReqVO) { MemberUserDO memberUserDO = userMapper.selectById(updateReqVO.getId()); - double newMoney = 0d; - String mark = ""; - if(ShopCommonEnum.ADD_1.getValue().equals(updateReqVO.getPtype())){ - mark = "系统增加了"+updateReqVO.getMoney()+"余额"; - newMoney = NumberUtil.add(memberUserDO.getNowMoney(),new BigDecimal(updateReqVO.getMoney())).doubleValue(); - userBillService.income(memberUserDO.getId(),"系统增加余额", BillDetailEnum.CATEGORY_1.getValue(), - BillDetailEnum.TYPE_6.getValue(),Double.valueOf(updateReqVO.getMoney()),newMoney, mark,""); - }else{ - mark = "系统扣除了"+updateReqVO.getMoney()+"余额"; - newMoney = NumberUtil.sub(memberUserDO.getNowMoney(),new BigDecimal(updateReqVO.getMoney())).doubleValue(); - if(newMoney < 0) { + double newMoney; + String mark; + if (ShopCommonEnum.ADD_1.getValue().equals(updateReqVO.getPtype())) { + mark = "系统增加了" + updateReqVO.getMoney() + "余额"; + newMoney = NumberUtil.add(memberUserDO.getNowMoney(), new BigDecimal(updateReqVO.getMoney())).doubleValue(); + userBillService.income(memberUserDO.getId(), "系统增加余额", BillDetailEnum.CATEGORY_1.getValue(), + BillDetailEnum.TYPE_6.getValue(), BigDecimal.valueOf(Double.parseDouble(updateReqVO.getMoney())), BigDecimal.valueOf(newMoney), mark, ""); + } else { + mark = "系统扣除了" + updateReqVO.getMoney() + "余额"; + newMoney = NumberUtil.sub(memberUserDO.getNowMoney(), new BigDecimal(updateReqVO.getMoney())).doubleValue(); + if (newMoney < 0) { newMoney = 0d; } userBillService.expend(memberUserDO.getId(), "系统减少余额", BillDetailEnum.CATEGORY_1.getValue(), BillDetailEnum.TYPE_7.getValue(), - Double.valueOf(updateReqVO.getMoney()), newMoney, mark); + Double.parseDouble(updateReqVO.getMoney()), newMoney, mark); } - double newIntegral = 0d; - if(ShopCommonEnum.ADD_1.getValue().equals(updateReqVO.getItype())){ - mark = "系统增加了"+updateReqVO.getIntegral()+"积分"; - newIntegral = NumberUtil.add(memberUserDO.getIntegral(),new BigDecimal(updateReqVO.getIntegral())).doubleValue(); - userBillService.income(memberUserDO.getId(),"系统增加积分", BillDetailEnum.CATEGORY_1.getValue(), - BillDetailEnum.TYPE_6.getValue(),Double.valueOf(updateReqVO.getIntegral()),newIntegral, mark,""); - }else{ - mark = "系统扣除了"+updateReqVO.getIntegral()+"积分"; - newIntegral = NumberUtil.sub(memberUserDO.getIntegral(),new BigDecimal(updateReqVO.getIntegral())).doubleValue(); - if(newIntegral < 0) { + double newIntegral; + if (ShopCommonEnum.ADD_1.getValue().equals(updateReqVO.getItype())) { + mark = "系统增加了" + updateReqVO.getIntegral() + "积分"; + newIntegral = NumberUtil.add(memberUserDO.getIntegral(), new BigDecimal(updateReqVO.getIntegral())).doubleValue(); + userBillService.income(memberUserDO.getId(), "系统增加积分", BillDetailEnum.CATEGORY_1.getValue(), + BillDetailEnum.TYPE_6.getValue(), BigDecimal.valueOf(Double.parseDouble(updateReqVO.getIntegral())), BigDecimal.valueOf(newIntegral), mark, ""); + } else { + mark = "系统扣除了" + updateReqVO.getIntegral() + "积分"; + newIntegral = NumberUtil.sub(memberUserDO.getIntegral(), new BigDecimal(updateReqVO.getIntegral())).doubleValue(); + if (newIntegral < 0) { newIntegral = 0d; } userBillService.expend(memberUserDO.getId(), "系统减少积分", BillDetailEnum.CATEGORY_1.getValue(), BillDetailEnum.TYPE_7.getValue(), - Double.valueOf(updateReqVO.getIntegral()), newIntegral, mark); + Double.parseDouble(updateReqVO.getIntegral()), newIntegral, mark); } memberUserDO.setIntegral(BigDecimal.valueOf(newIntegral)); memberUserDO.setNowMoney(BigDecimal.valueOf(newMoney)); @@ -129,13 +145,83 @@ public class UserServiceImpl implements UserService { } @Override - public PageResult getUserPage(UserPageReqVO pageReqVO) { - return userMapper.selectPage(pageReqVO); + public PageResult getUserPage(UserPageReqVO pageReqVO) { + List userIds = userTagRefService.getUserIdByTagName(pageReqVO); + pageReqVO.setUserIds(userIds); + PageResult pageResult = userMapper.selectPage(pageReqVO); + PageResult result = UserConvert.INSTANCE.convertPage(pageResult); + // 填充标签等数据 + fillData(result); + return result; + } + /** + * 填充标签等数据 + * + * @param result 用户列表 + */ + private void fillData(PageResult result) { + List resUserIds = result.getList().stream().map(UserRespVO::getId).distinct().collect(Collectors.toList()); + //查询关联标签 + List userTagRefList = userTagRefService.getUserTagRefList(UserTagRefExportReqVO.builder().userIds(resUserIds).build()); + Map> tagMap = userTagRefList.stream().collect(Collectors.groupingBy(UserTagRefDO::getUserId)); + + result.getList().forEach(item -> item.setTagList(tagMap.getOrDefault(item.getId(), ListUtil.empty()))); + } + + @Override public List getUserList(UserExportReqVO exportReqVO) { return userMapper.selectList(exportReqVO); } + @Override + public void updateTag(UserUpdateTagDTO dto) { + userTagRefService.deleteByUserId(dto.getId()); + if (CollectionUtil.isNotEmpty(dto.getTagIdList())) { + List collect = dto.getTagIdList().stream().map(item -> { + UserTagRefDO userTagRefDO = new UserTagRefDO(); + userTagRefDO.setUserId(dto.getId()); + userTagRefDO.setTagId(item); + return userTagRefDO; + }).collect(Collectors.toList()); + userTagRefService.insertBatch(collect); + } + + } + + @Override + public Integer addGrowthValue(Long userId, String type, BigDecimal consumeAmount) { + //查询对应成长配置 + UserLevelGrowthValueConfigDO growthValueConfig = growthValueConfigService.getByType(type); + Integer growthValue = 0; + if(type.equals(LevelGrowthValueEnum.INVITE.getType())){ + growthValue = growthValueConfig.getGrowthValue(); + }else if(type.equals(LevelGrowthValueEnum.CONSUME.getType())){ + growthValue = NumberUtil.mul(growthValueConfig.getGrowthValue(),consumeAmount).setScale(0, RoundingMode.DOWN).intValue(); + } + if(growthValue > 0){ + userMapper.addGrowthValue(userId,growthValue); + //升级 + levelConfigService.upgradeLevel(userId); + } + return null; + } + + @Override + public void updateById(MemberUserDO newUser) { + userMapper.updateById(newUser); + } + + @Override + public void addIntegral(Long userId, BigDecimal integral) { + userMapper.addIntegral(userId,integral); + } + + @Override + public void updateWriteOffAuthority(Long userId, boolean writeOffAuthority) { + userMapper.updateWriteOffAuthority(userId,writeOffAuthority); + } + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java index cecbbbf..7e85b60 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java @@ -1,4 +1,4 @@ -package co.yixiang.yshop.module.member.service.user.dto;//package co.yixiang.yshop.module.member.service.user.dto; +//package co.yixiang.yshop.module.member.service.user.dto; // //import lombok.*; // diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/UserAddressServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/UserAddressServiceImpl.java index 170074b..a61f126 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/UserAddressServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/UserAddressServiceImpl.java @@ -1,5 +1,7 @@ package co.yixiang.yshop.module.member.service.useraddress; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.ObjectUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -42,6 +44,10 @@ public class UserAddressServiceImpl implements UserAddressService { validateUserAddressExists(updateReqVO.getId()); // 更新 UserAddressDO updateObj = UserAddressConvert.INSTANCE.convert(updateReqVO); + // 加密后的不修改 + if (!Validator.isMobile(updateObj.getPhone())) { + updateObj.setPhone(null); + } userAddressMapper.updateById(updateObj); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillService.java index c09f611..2abdaf0 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillService.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillService.java @@ -1,10 +1,11 @@ package co.yixiang.yshop.module.member.service.userbill; -import java.util.*; -import javax.validation.*; -import co.yixiang.yshop.module.member.controller.admin.userbill.vo.*; -import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillRespVO; +import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; + +import java.math.BigDecimal; /** * 用户账单 Service 接口 @@ -22,15 +23,24 @@ public interface UserBillService { */ PageResult getUserBillPage(UserBillPageReqVO pageReqVO); + /** + * 获得用户账单分页 + * + * @param pageReqVO 分页查询 + * @return 用户账单分页 + */ + PageResult getUserBillPageAdmin(UserBillPageReqVO pageReqVO); + /** * 增加支出流水 - * @param uid uid - * @param title 账单标题 + * + * @param uid uid + * @param title 账单标题 * @param category 明细种类 - * @param type 明细类型 - * @param number 明细数字 - * @param balance 剩余 - * @param mark 备注 + * @param type 明细类型 + * @param number 明细数字 + * @param balance 剩余 + * @param mark 备注 */ void expend(Long uid,String title,String category,String type,double number,double balance,String mark); @@ -43,8 +53,30 @@ public interface UserBillService { * @param number 明细数字 * @param balance 剩余 * @param mark 备注 - * @param linkid 关联id + * @param linkId 关联id */ - void income(Long uid,String title,String category,String type,double number, - double balance,String mark,String linkid); + void income(Long uid, String title, String category, String type, BigDecimal number, + BigDecimal balance, String mark, String linkId); + + /** + * 增加流水 + * @param uid uid + * @param title 账单标题 + * @param category 明细种类 + * @param type 明细类型 + * @param number 明细数字 + * @param balance 剩余 + * @param mark 备注 + * @param linkId 关联id + * @param pm 收入/支出 + */ + + void addBillLog(Long uid,String title,String category,String type,BigDecimal number,BigDecimal balance,String mark, String linkId,Integer pm); + + /** + * 统计数量 + * @param pageReqVO / + * @return / + */ + Long getUserBillCount(UserBillPageReqVO pageReqVO); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillServiceImpl.java index 3f6056c..e3ac5d6 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userbill/UserBillServiceImpl.java @@ -1,21 +1,18 @@ package co.yixiang.yshop.module.member.service.userbill; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.util.MyBatisUtils; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userbill.vo.UserBillRespVO; +import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; +import co.yixiang.yshop.module.member.dal.mysql.userbill.UserBillMapper; import co.yixiang.yshop.module.member.enums.BillEnum; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.*; -import co.yixiang.yshop.module.member.controller.admin.userbill.vo.*; -import co.yixiang.yshop.module.member.dal.dataobject.userbill.UserBillDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; - -import co.yixiang.yshop.module.member.convert.userbill.UserBillConvert; -import co.yixiang.yshop.module.member.dal.mysql.userbill.UserBillMapper; - -import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; /** * 用户账单 Service 实现类 @@ -31,19 +28,28 @@ public class UserBillServiceImpl implements UserBillService { @Override public PageResult getUserBillPage(UserBillPageReqVO pageReqVO) { - return userBillMapper.selectPage(pageReqVO); + return userBillMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getUserBillPageAdmin(UserBillPageReqVO pageReqVO) { + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageReqVO); + userBillMapper.selectPageAdmin(mpPage,pageReqVO); + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); } /** * 增加支出流水 - * @param uid uid - * @param title 账单标题 + * + * @param uid uid + * @param title 账单标题 * @param category 明细种类 - * @param type 明细类型 - * @param number 明细数字 - * @param balance 剩余 - * @param mark 备注 + * @param type 明细类型 + * @param number 明细数字 + * @param balance 剩余 + * @param mark 备注 */ @Override public void expend(Long uid,String title,String category,String type,double number,double balance,String mark){ @@ -70,25 +76,47 @@ public class UserBillServiceImpl implements UserBillService { * @param number 明细数字 * @param balance 剩余 * @param mark 备注 - * @param linkid 关联id + * @param linkId 关联id */ @Override - public void income(Long uid,String title,String category,String type,double number, - double balance,String mark,String linkid){ + public void income(Long uid,String title,String category,String type,BigDecimal number, + BigDecimal balance,String mark,String linkId){ UserBillDO userBill = UserBillDO.builder() .uid(uid) .title(title) .category(category) .type(type) - .number(BigDecimal.valueOf(number)) - .balance(BigDecimal.valueOf(balance)) + .number(number) + .balance(balance) .mark(mark) .pm(BillEnum.PM_1.getValue()) - .linkId(linkid) + .linkId(linkId) .build(); userBillMapper.insert(userBill); } + @Override + public void addBillLog(Long uid,String title,String category,String type,BigDecimal number,BigDecimal balance,String mark, String linkId,Integer pm){ + UserBillDO userBill = UserBillDO.builder() + .uid(uid) + .title(title) + .category(category) + .type(type) + .number(number) + .balance(balance) + .mark(mark) + .pm(pm) + .build(); + + userBillMapper.insert(userBill); + } + + @Override + public Long getUserBillCount(UserBillPageReqVO pageReqVO) { + return userBillMapper.selectCount(pageReqVO); + } + + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogService.java new file mode 100644 index 0000000..92d866f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogService.java @@ -0,0 +1,81 @@ +package co.yixiang.yshop.module.member.service.userinvitelog; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogCreateReqVO; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogUpdateReqVO; +import co.yixiang.yshop.module.member.dal.dataobject.userinvitelog.UserInviteLogDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 邀请日志 Service 接口 + * + * @author admin + */ +public interface UserInviteLogService { + + /** + * 创建邀请日志 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserInviteLog(@Valid UserInviteLogCreateReqVO createReqVO); + + /** + * 更新邀请日志 + * + * @param updateReqVO 更新信息 + */ + void updateUserInviteLog(@Valid UserInviteLogUpdateReqVO updateReqVO); + + /** + * 删除邀请日志 + * + * @param id 编号 + */ + void deleteUserInviteLog(Long id); + + /** + * 获得邀请日志 + * + * @param id 编号 + * @return 邀请日志 + */ + UserInviteLogDO getUserInviteLog(Long id); + + /** + * 获得邀请日志列表 + * + * @param ids 编号 + * @return 邀请日志列表 + */ + List getUserInviteLogList(Collection ids); + + /** + * 获得邀请日志分页 + * + * @param pageReqVO 分页查询 + * @return 邀请日志分页 + */ + PageResult getUserInviteLogPage(UserInviteLogPageReqVO pageReqVO); + + /** + * 获得邀请日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 邀请日志列表 + */ + List getUserInviteLogList(UserInviteLogExportReqVO exportReqVO); + + /** + * 邀请日志 + * @param userId 邀请用户id + * @param beInviteUserId 被邀请用户id + */ + void createUserInviteLog(Long userId, Long beInviteUserId); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImpl.java new file mode 100644 index 0000000..5852604 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImpl.java @@ -0,0 +1,93 @@ +package co.yixiang.yshop.module.member.service.userinvitelog; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogCreateReqVO; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogExportReqVO; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.UserInviteLogUpdateReqVO; +import co.yixiang.yshop.module.member.convert.userinvitelog.UserInviteLogConvert; +import co.yixiang.yshop.module.member.dal.dataobject.userinvitelog.UserInviteLogDO; +import co.yixiang.yshop.module.member.dal.mysql.userinvitelog.UserInviteLogMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_INVITE_LOG_NOT_EXISTS; + +/** + * 邀请日志 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserInviteLogServiceImpl implements UserInviteLogService { + + @Resource + private UserInviteLogMapper userInviteLogMapper; + + @Override + public Long createUserInviteLog(UserInviteLogCreateReqVO createReqVO) { + // 插入 + UserInviteLogDO userInviteLog = UserInviteLogConvert.INSTANCE.convert(createReqVO); + userInviteLogMapper.insert(userInviteLog); + // 返回 + return userInviteLog.getId(); + } + + @Override + public void updateUserInviteLog(UserInviteLogUpdateReqVO updateReqVO) { + // 校验存在 + validateUserInviteLogExists(updateReqVO.getId()); + // 更新 + UserInviteLogDO updateObj = UserInviteLogConvert.INSTANCE.convert(updateReqVO); + userInviteLogMapper.updateById(updateObj); + } + + @Override + public void deleteUserInviteLog(Long id) { + // 校验存在 + validateUserInviteLogExists(id); + // 删除 + userInviteLogMapper.deleteById(id); + } + + private void validateUserInviteLogExists(Long id) { + if (userInviteLogMapper.selectById(id) == null) { + throw exception(USER_INVITE_LOG_NOT_EXISTS); + } + } + + @Override + public UserInviteLogDO getUserInviteLog(Long id) { + return userInviteLogMapper.selectById(id); + } + + @Override + public List getUserInviteLogList(Collection ids) { + return userInviteLogMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserInviteLogPage(UserInviteLogPageReqVO pageReqVO) { + return userInviteLogMapper.selectPage(pageReqVO); + } + + @Override + public List getUserInviteLogList(UserInviteLogExportReqVO exportReqVO) { + return userInviteLogMapper.selectList(exportReqVO); + } + + @Override + public void createUserInviteLog(Long userId, Long beInviteUserId) { + UserInviteLogDO log = new UserInviteLogDO(); + log.setUserId(userId); + log.setBeInviteUserId(beInviteUserId); + userInviteLogMapper.insert(log); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigService.java new file mode 100644 index 0000000..c390964 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigService.java @@ -0,0 +1,107 @@ +package co.yixiang.yshop.module.member.service.userlevelconfig; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.*; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.SettleLevelInfoVO; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.UserLevelInfoVO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; + +/** + * 会员等级配置 Service 接口 + * + * @author admin + */ +public interface UserLevelConfigService { + + /** + * 创建会员等级配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserLevelConfig(@Valid UserLevelConfigCreateReqVO createReqVO); + + /** + * 更新会员等级配置 + * + * @param updateReqVO 更新信息 + */ + void updateUserLevelConfig(@Valid UserLevelConfigUpdateReqVO updateReqVO); + + /** + * 删除会员等级配置 + * + * @param id 编号 + */ + void deleteUserLevelConfig(Long id); + + /** + * 获得会员等级配置 + * + * @param id 编号 + * @return 会员等级配置 + */ + UserLevelConfigDO getUserLevelConfig(Long id); + + /** + * 获得会员等级配置列表 + * + * @param ids 编号 + * @return 会员等级配置列表 + */ + List getUserLevelConfigList(Collection ids); + + /** + * 获得会员等级配置分页 + * + * @param pageReqVO 分页查询 + * @return 会员等级配置分页 + */ + PageResult getUserLevelConfigPage(UserLevelConfigPageReqVO pageReqVO); + + /** + * 获得会员等级配置列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员等级配置列表 + */ + List getUserLevelConfigList(UserLevelConfigExportReqVO exportReqVO); + + /** + * 用户等级信息 + * @param loginUserId / + * @return / + */ + UserLevelInfoVO levelInfo(Long loginUserId); + + /** + * 升级 + * @param userId / + */ + void upgradeLevel(Long userId); + + /** + * 查询等级详情 + * @param id / + * @return / + */ + UserLevelConfigRespVO getUserLevelConfigVO(Long id); + + /** + * 当前等级权益 + * @param loginUserId / + * @return / + */ + List getUserLevelEquityListByUserId(Long loginUserId); + + + /** + * 结算时等级信息 + * @param loginUserId / + * @return / + */ + SettleLevelInfoVO settleLevelInfo(Long loginUserId); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImpl.java new file mode 100644 index 0000000..2c83cdd --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImpl.java @@ -0,0 +1,251 @@ +package co.yixiang.yshop.module.member.service.userlevelconfig; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.UserLevelEquityRefExportReqVO; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.SettleLevelInfoVO; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.UserLevelInfoVO; +import co.yixiang.yshop.module.member.convert.userlevelconfig.UserLevelConfigConvert; +import co.yixiang.yshop.module.member.convert.userlevelequityref.UserLevelEquityRefConvert; +import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; +import co.yixiang.yshop.module.member.dal.mysql.userlevelconfig.UserLevelConfigMapper; +import co.yixiang.yshop.module.member.enums.BillDetailEnum; +import co.yixiang.yshop.module.member.enums.LevelEquityEnum; +import co.yixiang.yshop.module.member.service.user.UserService; +import co.yixiang.yshop.module.member.service.userbill.UserBillService; +import co.yixiang.yshop.module.member.service.userlevelequityref.UserLevelEquityRefService; +import co.yixiang.yshop.module.product.api.coupon.CouponApi; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.BillDetailEnum.TYPE_11; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_LEVEL_CONFIG_NOT_EXISTS; + +/** + * 会员等级配置 Service 实现类 + * + * @author admin + */ +@Service +@Validated +@Slf4j +public class UserLevelConfigServiceImpl implements UserLevelConfigService { + + @Resource + private UserLevelConfigMapper userLevelConfigMapper; + @Resource + @Lazy + private UserService userService; + @Resource + private UserLevelEquityRefService userLevelEquityRefService; + @Resource + private CouponApi couponApi; + @Resource + private UserBillService userBillService; + @Override + @Transactional(rollbackFor = Exception.class) + public Long createUserLevelConfig(UserLevelConfigCreateReqVO createReqVO) { + // 插入 + UserLevelConfigDO userLevelConfig = UserLevelConfigConvert.INSTANCE.convert(createReqVO); + userLevelConfigMapper.insert(userLevelConfig); + //新增等级权益绑定关系 + userLevelEquityRefService.saveData(userLevelConfig.getId(), createReqVO.getLevelEquityList(), true); + // 返回 + return userLevelConfig.getId(); + } + + @Override + public void updateUserLevelConfig(UserLevelConfigUpdateReqVO updateReqVO) { + // 校验存在 + validateUserLevelConfigExists(updateReqVO.getId()); + // 更新 + UserLevelConfigDO updateObj = UserLevelConfigConvert.INSTANCE.convert(updateReqVO); + //新增等级权益绑定关系 + userLevelEquityRefService.saveData(updateReqVO.getId(), updateReqVO.getLevelEquityList(), false); + userLevelConfigMapper.updateById(updateObj); + } + + @Override + public void deleteUserLevelConfig(Long id) { + // 校验存在 + validateUserLevelConfigExists(id); + // 删除 + userLevelConfigMapper.deleteById(id); + } + + private void validateUserLevelConfigExists(Long id) { + if (userLevelConfigMapper.selectById(id) == null) { + throw exception(USER_LEVEL_CONFIG_NOT_EXISTS); + } + } + + @Override + public UserLevelConfigDO getUserLevelConfig(Long id) { + return userLevelConfigMapper.selectById(id); + } + + @Override + public List getUserLevelConfigList(Collection ids) { + return userLevelConfigMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserLevelConfigPage(UserLevelConfigPageReqVO pageReqVO) { + return userLevelConfigMapper.selectPage(pageReqVO); + } + + @Override + public List getUserLevelConfigList(UserLevelConfigExportReqVO exportReqVO) { + return userLevelConfigMapper.selectList(exportReqVO); + } + + @Override + public UserLevelInfoVO levelInfo(Long loginUserId) { + MemberUserDO user = userService.getUser(loginUserId); + UserLevelConfigDO currentLevel = userLevelConfigMapper.selectById(user.getLevel()); + UserLevelInfoVO userLevelInfoVO = new UserLevelInfoVO(); + userLevelInfoVO.setCurrentLevel(currentLevel); + //等级列表 + Integer level = Objects.isNull(currentLevel) ? 0 : currentLevel.getLevel(); + UserLevelConfigExportReqVO reqVO = new UserLevelConfigExportReqVO(); + reqVO.setStatus(Boolean.TRUE); + List list = this.getUserLevelConfigList(reqVO); + Optional nextLevelOpt = list.stream().filter(item -> item.getLevel() > level).findFirst(); + nextLevelOpt.ifPresent(nextLevel -> { + userLevelInfoVO.setNextLevel(nextLevel); + //升级所需成长值 + Integer needGrowthValue = nextLevel.getGrowthValue() - user.getGrowthValue(); + userLevelInfoVO.setNeedGrowthValue(needGrowthValue); + }); + userLevelInfoVO.setCurrentGrowthValue(user.getGrowthValue()); + return userLevelInfoVO; + } + + @Override + public void upgradeLevel(Long userId) { + MemberUserDO user = userService.getUser(userId); + if (null == user) { + return; + } + log.warn("用户:{}触发了升级", user.getId()); + + Integer growthValue = user.getGrowthValue(); + //等级列表 + UserLevelConfigExportReqVO reqVO = new UserLevelConfigExportReqVO(); + reqVO.setStatus(Boolean.TRUE); + List userLevelConfigList = this.getUserLevelConfigList(reqVO); + //当前等级 + Integer currentLevel = userLevelConfigList.stream() + .filter(item -> item.getId().equals(user.getLevel())) + .findFirst() + .map(UserLevelConfigDO::getLevel) + .orElse(0); + UserLevelConfigDO upgradeLevel = null; + for (UserLevelConfigDO item : userLevelConfigList) { + if (growthValue >= item.getGrowthValue() + && item.getLevel() > currentLevel) { + upgradeLevel = item; + } + } + if (ObjectUtil.isNotNull(upgradeLevel)) { + MemberUserDO newUser = new MemberUserDO(); + newUser.setId(userId); + newUser.setLevel(upgradeLevel.getId()); + userService.updateById(newUser); + log.warn("用户:{}进行了升级,等级id:{}", userId, upgradeLevel.getId()); + // 增加等级权益 优惠券,积分 + grantLevelEquity(user, upgradeLevel.getId()); + } + } + + /** + * 发放会员权益 + * + * @param userId / + * @param levelId / + */ + private void grantLevelEquity(MemberUserDO user, Long levelId) { + Long userId = user.getId(); + List equityList = this.getUserLevelEquityListByUserId(userId); + //积分 + Optional integralEquityOpt = equityList.stream().filter(item -> LevelEquityEnum.INTEGRAL.getType().equals(item.getType())).findFirst(); + integralEquityOpt.ifPresent(equity -> { + Long integral = equity.getEquityValue(); + if (Objects.nonNull(integral) && integral > 0L) { + userService.addIntegral(userId, new BigDecimal(integral)); + //增加流水 + String type = "升级赠送积分"; + BigDecimal newIntegral = NumberUtil.add(user.getIntegral(),integral); + userBillService.income(userId, type, BillDetailEnum.CATEGORY_2.getValue(), + TYPE_11.getValue(), + BigDecimal.valueOf(integral.doubleValue()), + BigDecimal.valueOf(newIntegral.doubleValue()), + type, null); + log.warn("会员:{},升级:{},增加了积分:{}", userId, levelId, integral); + } + }); + //优惠券 + Optional couponEquityOpt = equityList.stream().filter(item -> LevelEquityEnum.COUPON.getType().equals(item.getType())).findFirst(); + couponEquityOpt.ifPresent(equity -> { + Long couponId = equity.getEquityValue(); + if (Objects.nonNull(couponId)) { + couponApi.receiveCoupon(couponId,userId); + log.warn("会员:{},升级:{},发放优惠券:{}", userId, levelId, equity.getEquityValue()); + } + }); + } + + @Override + public UserLevelConfigRespVO getUserLevelConfigVO(Long id) { + UserLevelConfigDO userLevelConfigDO = userLevelConfigMapper.selectById(id); + UserLevelEquityRefExportReqVO reqVO = new UserLevelEquityRefExportReqVO(); + reqVO.setLevelId(id); + List userLevelEquityRefList = userLevelEquityRefService.getUserLevelEquityRefList(reqVO); + + UserLevelConfigRespVO convert = UserLevelConfigConvert.INSTANCE.convert(userLevelConfigDO); + convert.setLevelEquityList(UserLevelEquityRefConvert.INSTANCE.convertList(userLevelEquityRefList)); + return convert; + } + + @Override + public List getUserLevelEquityListByUserId(Long loginUserId) { + MemberUserDO user = userService.getUser(loginUserId); + Long levelId = user.getLevel(); + if (levelId == 0) { + return ListUtil.empty(); + } + return userLevelEquityRefService.getUserLevelEquityList(levelId); + } + + @Override + public SettleLevelInfoVO settleLevelInfo(Long loginUserId) { + MemberUserDO user = userService.getUser(loginUserId); + List list = this.getUserLevelEquityListByUserId(loginUserId); + + SettleLevelInfoVO vo = new SettleLevelInfoVO(); + Boolean freeShipping = list.stream().anyMatch(item -> LevelEquityEnum.FREE_SHIPPING.getType().equals(item.getType())); + BigDecimal discount = list.stream().filter(item -> LevelEquityEnum.DISCOUNT.getType().equals(item.getType())).map(item -> new BigDecimal(item.getEquityValue())).findFirst().orElse(new BigDecimal("10")); + vo.setFreeShipping(freeShipping); + vo.setDiscount(discount); + vo.setIsVip(Objects.nonNull(user.getLevel()) && user.getLevel() > 0); + return vo; + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityService.java new file mode 100644 index 0000000..b676b67 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityService.java @@ -0,0 +1,69 @@ +package co.yixiang.yshop.module.member.service.userlevelequity; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 会员等级权益配置 Service 接口 + * + * @author admin + */ +public interface UserLevelEquityService { + + /** + * 创建会员等级权益配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserLevelEquity(@Valid UserLevelEquityCreateReqVO createReqVO); + + /** + * 更新会员等级权益配置 + * + * @param updateReqVO 更新信息 + */ + void updateUserLevelEquity(@Valid UserLevelEquityUpdateReqVO updateReqVO); + + /** + * 删除会员等级权益配置 + * + * @param id 编号 + */ + void deleteUserLevelEquity(Long id); + + /** + * 获得会员等级权益配置 + * + * @param id 编号 + * @return 会员等级权益配置 + */ + UserLevelEquityDO getUserLevelEquity(Long id); + + /** + * 获得会员等级权益配置列表 + * + * @return 会员等级权益配置列表 + */ + List getUserLevelEquityList(); + + /** + * 获得会员等级权益配置分页 + * + * @param pageReqVO 分页查询 + * @return 会员等级权益配置分页 + */ + PageResult getUserLevelEquityPage(UserLevelEquityPageReqVO pageReqVO); + + /** + * 获得会员等级权益配置列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员等级权益配置列表 + */ + List getUserLevelEquityList(UserLevelEquityExportReqVO exportReqVO); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImpl.java new file mode 100644 index 0000000..e692f31 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImpl.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.member.service.userlevelequity; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.userlevelequity.UserLevelEquityConvert; +import co.yixiang.yshop.module.member.dal.mysql.userlevelequity.UserLevelEquityMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 会员等级权益配置 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserLevelEquityServiceImpl implements UserLevelEquityService { + + @Resource + private UserLevelEquityMapper userLevelEquityMapper; + + @Override + public Long createUserLevelEquity(UserLevelEquityCreateReqVO createReqVO) { + // 插入 + UserLevelEquityDO userLevelEquity = UserLevelEquityConvert.INSTANCE.convert(createReqVO); + userLevelEquityMapper.insert(userLevelEquity); + // 返回 + return userLevelEquity.getId(); + } + + @Override + public void updateUserLevelEquity(UserLevelEquityUpdateReqVO updateReqVO) { + // 校验存在 + validateUserLevelEquityExists(updateReqVO.getId()); + // 更新 + UserLevelEquityDO updateObj = UserLevelEquityConvert.INSTANCE.convert(updateReqVO); + userLevelEquityMapper.updateById(updateObj); + } + + @Override + public void deleteUserLevelEquity(Long id) { + // 校验存在 + validateUserLevelEquityExists(id); + // 删除 + userLevelEquityMapper.deleteById(id); + } + + private void validateUserLevelEquityExists(Long id) { + if (userLevelEquityMapper.selectById(id) == null) { + throw exception(USER_LEVEL_EQUITY_NOT_EXISTS); + } + } + + @Override + public UserLevelEquityDO getUserLevelEquity(Long id) { + return userLevelEquityMapper.selectById(id); + } + + @Override + public List getUserLevelEquityList() { + return userLevelEquityMapper.selectList(); + } + + @Override + public PageResult getUserLevelEquityPage(UserLevelEquityPageReqVO pageReqVO) { + return userLevelEquityMapper.selectPage(pageReqVO); + } + + @Override + public List getUserLevelEquityList(UserLevelEquityExportReqVO exportReqVO) { + return userLevelEquityMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefService.java new file mode 100644 index 0000000..9bc9562 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefService.java @@ -0,0 +1,87 @@ +package co.yixiang.yshop.module.member.service.userlevelequityref; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.*; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.SettleLevelInfoVO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 会员等级权益中间 Service 接口 + * + * @author admin + */ +public interface UserLevelEquityRefService { + + /** + * 创建会员等级权益中间 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserLevelEquityRef(@Valid UserLevelEquityRefCreateReqVO createReqVO); + + /** + * 更新会员等级权益中间 + * + * @param updateReqVO 更新信息 + */ + void updateUserLevelEquityRef(@Valid UserLevelEquityRefUpdateReqVO updateReqVO); + + /** + * 删除会员等级权益中间 + * + * @param id 编号 + */ + void deleteUserLevelEquityRef(Long id); + + /** + * 获得会员等级权益中间 + * + * @param id 编号 + * @return 会员等级权益中间 + */ + UserLevelEquityRefDO getUserLevelEquityRef(Long id); + + /** + * 获得会员等级权益中间列表 + * + * @param ids 编号 + * @return 会员等级权益中间列表 + */ + List getUserLevelEquityRefList(Collection ids); + + /** + * 获得会员等级权益中间分页 + * + * @param pageReqVO 分页查询 + * @return 会员等级权益中间分页 + */ + PageResult getUserLevelEquityRefPage(UserLevelEquityRefPageReqVO pageReqVO); + + /** + * 获得会员等级权益中间列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员等级权益中间列表 + */ + List getUserLevelEquityRefList(UserLevelEquityRefExportReqVO exportReqVO); + + + /** + * 保存等级权益关联数据 + * @param id 等级id + * @param levelEquityList 权益列表 + * @param flag 是否新增 ,编辑则删除以前绑定数据 + */ + void saveData(Long id, List levelEquityList, boolean flag); + + /** + * 查询权益 列表 + * @param levelId / + * @return / + */ + List getUserLevelEquityList(Long levelId); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImpl.java new file mode 100644 index 0000000..c3c830d --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImpl.java @@ -0,0 +1,120 @@ +package co.yixiang.yshop.module.member.service.userlevelequityref; + +import cn.hutool.core.collection.CollectionUtil; +import co.yixiang.yshop.module.member.controller.app.userlevel.vo.SettleLevelInfoVO; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import java.util.stream.Collectors; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.userlevelequityref.UserLevelEquityRefConvert; +import co.yixiang.yshop.module.member.dal.mysql.userlevelequityref.UserLevelEquityRefMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 会员等级权益中间 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserLevelEquityRefServiceImpl implements UserLevelEquityRefService { + + @Resource + private UserLevelEquityRefMapper userLevelEquityRefMapper; + + @Override + public Long createUserLevelEquityRef(UserLevelEquityRefCreateReqVO createReqVO) { + // 插入 + UserLevelEquityRefDO userLevelEquityRef = UserLevelEquityRefConvert.INSTANCE.convert(createReqVO); + userLevelEquityRefMapper.insert(userLevelEquityRef); + // 返回 + return userLevelEquityRef.getId(); + } + + @Override + public void updateUserLevelEquityRef(UserLevelEquityRefUpdateReqVO updateReqVO) { + // 校验存在 + validateUserLevelEquityRefExists(updateReqVO.getId()); + // 更新 + UserLevelEquityRefDO updateObj = UserLevelEquityRefConvert.INSTANCE.convert(updateReqVO); + userLevelEquityRefMapper.updateById(updateObj); + } + + @Override + public void deleteUserLevelEquityRef(Long id) { + // 校验存在 + validateUserLevelEquityRefExists(id); + // 删除 + userLevelEquityRefMapper.deleteById(id); + } + + private void validateUserLevelEquityRefExists(Long id) { + if (userLevelEquityRefMapper.selectById(id) == null) { + throw exception(USER_LEVEL_EQUITY_REF_NOT_EXISTS); + } + } + + @Override + public UserLevelEquityRefDO getUserLevelEquityRef(Long id) { + return userLevelEquityRefMapper.selectById(id); + } + + @Override + public List getUserLevelEquityRefList(Collection ids) { + return userLevelEquityRefMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserLevelEquityRefPage(UserLevelEquityRefPageReqVO pageReqVO) { + return userLevelEquityRefMapper.selectPage(pageReqVO); + } + + @Override + public List getUserLevelEquityRefList(UserLevelEquityRefExportReqVO exportReqVO) { + return userLevelEquityRefMapper.selectList(exportReqVO); + } + + @Override + public void saveData(Long id, List levelEquityList, boolean flag) { + if (!flag) { + this.deleteByLevelId(id); + } + if (CollectionUtil.isNotEmpty(levelEquityList)) { + List list = levelEquityList.stream().map(item -> { + UserLevelEquityRefDO userLevelEquityRefDO = new UserLevelEquityRefDO(); + userLevelEquityRefDO.setEquityId(item.getEquityId()); + userLevelEquityRefDO.setEquityValue(item.getEquityValue()); + userLevelEquityRefDO.setLevelId(id); + return userLevelEquityRefDO; + }).collect(Collectors.toList()); + userLevelEquityRefMapper.insertBatch(list); + } + } + + @Override + public List getUserLevelEquityList(Long levelId) { + return userLevelEquityRefMapper.getUserLevelEquityList(levelId); + } + + /** + * 根据等级id删除权益 + * @param levelId / + */ + private void deleteByLevelId(Long levelId) { + userLevelEquityRefMapper.delete(Wrappers.lambdaQuery().eq(UserLevelEquityRefDO::getLevelId, levelId)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigService.java new file mode 100644 index 0000000..13ba8c0 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigService.java @@ -0,0 +1,76 @@ +package co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 会员成长任务配置 Service 接口 + * + * @author admin + */ +public interface UserLevelGrowthValueConfigService { + + /** + * 创建会员成长任务配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createUserLevelGrowthValueConfig(@Valid UserLevelGrowthValueConfigCreateReqVO createReqVO); + + /** + * 更新会员成长任务配置 + * + * @param updateReqVO 更新信息 + */ + void updateUserLevelGrowthValueConfig(@Valid UserLevelGrowthValueConfigUpdateReqVO updateReqVO); + + /** + * 删除会员成长任务配置 + * + * @param id 编号 + */ + void deleteUserLevelGrowthValueConfig(Integer id); + + /** + * 获得会员成长任务配置 + * + * @param id 编号 + * @return 会员成长任务配置 + */ + UserLevelGrowthValueConfigDO getUserLevelGrowthValueConfig(Integer id); + + /** + * 获得会员成长任务配置列表 + * + * @param ids 编号 + * @return 会员成长任务配置列表 + */ + List getUserLevelGrowthValueConfigList(Collection ids); + + /** + * 获得会员成长任务配置分页 + * + * @param pageReqVO 分页查询 + * @return 会员成长任务配置分页 + */ + PageResult getUserLevelGrowthValueConfigPage(UserLevelGrowthValueConfigPageReqVO pageReqVO); + + /** + * 获得会员成长任务配置列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员成长任务配置列表 + */ + List getUserLevelGrowthValueConfigList(UserLevelGrowthValueConfigExportReqVO exportReqVO); + + /** + * 根据类型查询 + * @param type / + * @return / + */ + UserLevelGrowthValueConfigDO getByType(String type); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImpl.java new file mode 100644 index 0000000..6ddb56c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImpl.java @@ -0,0 +1,87 @@ +package co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigConvert; +import co.yixiang.yshop.module.member.dal.mysql.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 会员成长任务配置 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserLevelGrowthValueConfigServiceImpl implements UserLevelGrowthValueConfigService { + + @Resource + private UserLevelGrowthValueConfigMapper userLevelGrowthValueConfigMapper; + + @Override + public Integer createUserLevelGrowthValueConfig(UserLevelGrowthValueConfigCreateReqVO createReqVO) { + // 插入 + UserLevelGrowthValueConfigDO userLevelGrowthValueConfig = UserLevelGrowthValueConfigConvert.INSTANCE.convert(createReqVO); + userLevelGrowthValueConfigMapper.insert(userLevelGrowthValueConfig); + // 返回 + return userLevelGrowthValueConfig.getId(); + } + + @Override + public void updateUserLevelGrowthValueConfig(UserLevelGrowthValueConfigUpdateReqVO updateReqVO) { + // 校验存在 + validateUserLevelGrowthValueConfigExists(updateReqVO.getId()); + // 更新 + UserLevelGrowthValueConfigDO updateObj = UserLevelGrowthValueConfigConvert.INSTANCE.convert(updateReqVO); + userLevelGrowthValueConfigMapper.updateById(updateObj); + } + + @Override + public void deleteUserLevelGrowthValueConfig(Integer id) { + // 校验存在 + validateUserLevelGrowthValueConfigExists(id); + // 删除 + userLevelGrowthValueConfigMapper.deleteById(id); + } + + private void validateUserLevelGrowthValueConfigExists(Integer id) { + if (userLevelGrowthValueConfigMapper.selectById(id) == null) { + throw exception(USER_LEVEL_GROWTH_VALUE_CONFIG_NOT_EXISTS); + } + } + + @Override + public UserLevelGrowthValueConfigDO getUserLevelGrowthValueConfig(Integer id) { + return userLevelGrowthValueConfigMapper.selectById(id); + } + + @Override + public List getUserLevelGrowthValueConfigList(Collection ids) { + return userLevelGrowthValueConfigMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserLevelGrowthValueConfigPage(UserLevelGrowthValueConfigPageReqVO pageReqVO) { + return userLevelGrowthValueConfigMapper.selectPage(pageReqVO); + } + + @Override + public List getUserLevelGrowthValueConfigList(UserLevelGrowthValueConfigExportReqVO exportReqVO) { + return userLevelGrowthValueConfigMapper.selectList(exportReqVO); + } + + @Override + public UserLevelGrowthValueConfigDO getByType(String type) { + return userLevelGrowthValueConfigMapper.selectOne(UserLevelGrowthValueConfigDO::getType,type); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagService.java new file mode 100644 index 0000000..020e700 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagService.java @@ -0,0 +1,76 @@ +package co.yixiang.yshop.module.member.service.usertag; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.usertag.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertag.UserTagDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 会员标签 Service 接口 + * + * @author admin + */ +public interface UserTagService { + + /** + * 创建会员标签 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserTag(@Valid UserTagCreateReqVO createReqVO); + + /** + * 更新会员标签 + * + * @param updateReqVO 更新信息 + */ + void updateUserTag(@Valid UserTagUpdateReqVO updateReqVO); + + /** + * 删除会员标签 + * + * @param id 编号 + */ + void deleteUserTag(Long id); + + /** + * 获得会员标签 + * + * @param id 编号 + * @return 会员标签 + */ + UserTagDO getUserTag(Long id); + + /** + * 获得会员标签列表 + * + * @param ids 编号 + * @return 会员标签列表 + */ + List getUserTagList(Collection ids); + + /** + * 获得会员标签分页 + * + * @param pageReqVO 分页查询 + * @return 会员标签分页 + */ + PageResult getUserTagPage(UserTagPageReqVO pageReqVO); + + /** + * 获得会员标签列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员标签列表 + */ + List getUserTagList(UserTagExportReqVO exportReqVO); + + /** + * 列表查询 + * @param pageVO / + * @return / + */ + List getUserTagList(UserTagPageReqVO pageVO); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImpl.java new file mode 100644 index 0000000..6b303e3 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImpl.java @@ -0,0 +1,98 @@ +package co.yixiang.yshop.module.member.service.usertag; + +import co.yixiang.yshop.module.member.service.usertagref.UserTagRefService; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.member.controller.admin.usertag.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertag.UserTagDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.usertag.UserTagConvert; +import co.yixiang.yshop.module.member.dal.mysql.usertag.UserTagMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 会员标签 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserTagServiceImpl implements UserTagService { + + @Resource + private UserTagMapper userTagMapper; + @Resource + @Lazy + private UserTagRefService userTagRefService; + + @Override + public Long createUserTag(UserTagCreateReqVO createReqVO) { + // 插入 + UserTagDO userTag = UserTagConvert.INSTANCE.convert(createReqVO); + userTagMapper.insert(userTag); + // 返回 + return userTag.getId(); + } + + @Override + public void updateUserTag(UserTagUpdateReqVO updateReqVO) { + // 校验存在 + validateUserTagExists(updateReqVO.getId()); + // 更新 + UserTagDO updateObj = UserTagConvert.INSTANCE.convert(updateReqVO); + userTagMapper.updateById(updateObj); + } + + @Override + public void deleteUserTag(Long id) { + // 校验存在 + validateUserTagExists(id); + // 删除 + userTagMapper.deleteById(id); + } + + private void validateUserTagExists(Long id) { + if (userTagMapper.selectById(id) == null) { + throw exception(USER_TAG_NOT_EXISTS); + } + } + + @Override + public UserTagDO getUserTag(Long id) { + return userTagMapper.selectById(id); + } + + @Override + public List getUserTagList(Collection ids) { + return userTagMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserTagPage(UserTagPageReqVO pageReqVO) { + PageResult result = userTagMapper.selectPage(pageReqVO); + List list = result.getList(); + list.forEach(item -> { + Long userCount = userTagRefService.selectCountByTagId(item.getId()); + item.setUserCount(userCount); + }); + return result; + } + + @Override + public List getUserTagList(UserTagExportReqVO exportReqVO) { + return userTagMapper.selectList(exportReqVO); + } + + @Override + public List getUserTagList(UserTagPageReqVO pageVO) { + return userTagMapper.selectList2(pageVO); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupService.java new file mode 100644 index 0000000..0e53898 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupService.java @@ -0,0 +1,69 @@ +package co.yixiang.yshop.module.member.service.usertaggroup; + +import java.util.*; +import javax.validation.*; +import co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertaggroup.UserTagGroupDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 会员标签分组 Service 接口 + * + * @author admin + */ +public interface UserTagGroupService { + + /** + * 创建会员标签分组 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserTagGroup(@Valid UserTagGroupCreateReqVO createReqVO); + + /** + * 更新会员标签分组 + * + * @param updateReqVO 更新信息 + */ + void updateUserTagGroup(@Valid UserTagGroupUpdateReqVO updateReqVO); + + /** + * 删除会员标签分组 + * + * @param id 编号 + */ + void deleteUserTagGroup(Long id); + + /** + * 获得会员标签分组 + * + * @param id 编号 + * @return 会员标签分组 + */ + UserTagGroupDO getUserTagGroup(Long id); + + /** + * 获得会员标签分组列表 + * + * @return 会员标签分组列表 + */ + List getUserTagGroupList(); + + /** + * 获得会员标签分组分页 + * + * @param pageReqVO 分页查询 + * @return 会员标签分组分页 + */ + PageResult getUserTagGroupPage(UserTagGroupPageReqVO pageReqVO); + + /** + * 获得会员标签分组列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 会员标签分组列表 + */ + List getUserTagGroupList(UserTagGroupExportReqVO exportReqVO); + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImpl.java new file mode 100644 index 0000000..8cf139e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImpl.java @@ -0,0 +1,83 @@ +package co.yixiang.yshop.module.member.service.usertaggroup; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertaggroup.UserTagGroupDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.usertaggroup.UserTagGroupConvert; +import co.yixiang.yshop.module.member.dal.mysql.usertaggroup.UserTagGroupMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 会员标签分组 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserTagGroupServiceImpl implements UserTagGroupService { + + @Resource + private UserTagGroupMapper userTagGroupMapper; + + @Override + public Long createUserTagGroup(UserTagGroupCreateReqVO createReqVO) { + // 插入 + UserTagGroupDO userTagGroup = UserTagGroupConvert.INSTANCE.convert(createReqVO); + userTagGroupMapper.insert(userTagGroup); + // 返回 + return userTagGroup.getId(); + } + + @Override + public void updateUserTagGroup(UserTagGroupUpdateReqVO updateReqVO) { + // 校验存在 + validateUserTagGroupExists(updateReqVO.getId()); + // 更新 + UserTagGroupDO updateObj = UserTagGroupConvert.INSTANCE.convert(updateReqVO); + userTagGroupMapper.updateById(updateObj); + } + + @Override + public void deleteUserTagGroup(Long id) { + // 校验存在 + validateUserTagGroupExists(id); + // 删除 + userTagGroupMapper.deleteById(id); + } + + private void validateUserTagGroupExists(Long id) { + if (userTagGroupMapper.selectById(id) == null) { + throw exception(USER_TAG_GROUP_NOT_EXISTS); + } + } + + @Override + public UserTagGroupDO getUserTagGroup(Long id) { + return userTagGroupMapper.selectById(id); + } + + @Override + public List getUserTagGroupList() { + return userTagGroupMapper.selectList(Wrappers.lambdaQuery().orderByAsc(UserTagGroupDO::getSorted)); + } + + @Override + public PageResult getUserTagGroupPage(UserTagGroupPageReqVO pageReqVO) { + return userTagGroupMapper.selectPage(pageReqVO); + } + + @Override + public List getUserTagGroupList(UserTagGroupExportReqVO exportReqVO) { + return userTagGroupMapper.selectList(exportReqVO); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefService.java new file mode 100644 index 0000000..fe886cb --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefService.java @@ -0,0 +1,84 @@ +package co.yixiang.yshop.module.member.service.usertagref; + +import java.util.*; +import javax.validation.*; + +import co.yixiang.yshop.module.member.controller.admin.user.vo.UserPageReqVO; +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +/** + * 用户标签中间 Service 接口 + * + * @author admin + */ +public interface UserTagRefService { + + /** + * 创建用户标签中间 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserTagRef(@Valid UserTagRefCreateReqVO createReqVO); + + /** + * 更新用户标签中间 + * + * @param updateReqVO 更新信息 + */ + void updateUserTagRef(@Valid UserTagRefUpdateReqVO updateReqVO); + + /** + * 删除用户标签中间 + * + * @param id 编号 + */ + void deleteUserTagRef(Long id); + + /** + * 获得用户标签中间 + * + * @param id 编号 + * @return 用户标签中间 + */ + UserTagRefDO getUserTagRef(Long id); + + /** + * 获得用户标签中间列表 + * + * @param ids 编号 + * @return 用户标签中间列表 + */ + List getUserTagRefList(Collection ids); + + /** + * 获得用户标签中间分页 + * + * @param pageReqVO 分页查询 + * @return 用户标签中间分页 + */ + PageResult getUserTagRefPage(UserTagRefPageReqVO pageReqVO); + + /** + * 获得用户标签中间列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 用户标签中间列表 + */ + List getUserTagRefList(UserTagRefExportReqVO exportReqVO); + + /** + * 根据标签名称查询用户id + * @param pageReqVO / + * @return / + */ + List getUserIdByTagName(UserPageReqVO pageReqVO); + + void insertBatch(List doList); + + void deleteByUserId(Long id); + + Long selectCountByTagId(Long id); +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImpl.java new file mode 100644 index 0000000..958fa15 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImpl.java @@ -0,0 +1,114 @@ +package co.yixiang.yshop.module.member.service.usertagref; + +import cn.hutool.core.util.StrUtil; +import co.yixiang.yshop.module.member.controller.admin.user.vo.UserPageReqVO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import java.util.stream.Collectors; + +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import co.yixiang.yshop.module.member.convert.usertagref.UserTagRefConvert; +import co.yixiang.yshop.module.member.dal.mysql.usertagref.UserTagRefMapper; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; + +/** + * 用户标签中间 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserTagRefServiceImpl implements UserTagRefService { + + @Resource + private UserTagRefMapper userTagRefMapper; + + @Override + public Long createUserTagRef(UserTagRefCreateReqVO createReqVO) { + // 插入 + UserTagRefDO userTagRef = UserTagRefConvert.INSTANCE.convert(createReqVO); + userTagRefMapper.insert(userTagRef); + // 返回 + return userTagRef.getId(); + } + + @Override + public void updateUserTagRef(UserTagRefUpdateReqVO updateReqVO) { + // 校验存在 + validateUserTagRefExists(updateReqVO.getId()); + // 更新 + UserTagRefDO updateObj = UserTagRefConvert.INSTANCE.convert(updateReqVO); + userTagRefMapper.updateById(updateObj); + } + + @Override + public void deleteUserTagRef(Long id) { + // 校验存在 + validateUserTagRefExists(id); + // 删除 + userTagRefMapper.deleteById(id); + } + + private void validateUserTagRefExists(Long id) { + if (userTagRefMapper.selectById(id) == null) { + throw exception(USER_TAG_REF_NOT_EXISTS); + } + } + + @Override + public UserTagRefDO getUserTagRef(Long id) { + return userTagRefMapper.selectById(id); + } + + @Override + public List getUserTagRefList(Collection ids) { + return userTagRefMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserTagRefPage(UserTagRefPageReqVO pageReqVO) { + return userTagRefMapper.selectPage(pageReqVO); + } + + @Override + public List getUserTagRefList(UserTagRefExportReqVO exportReqVO) { + return userTagRefMapper.selectList(exportReqVO); + } + + @Override + public List getUserIdByTagName(UserPageReqVO pageReqVO) { + List userIds = null; + if (StrUtil.isNotBlank(pageReqVO.getTagName())) { + List userTagRefDOList = this.getUserTagRefList(UserTagRefExportReqVO.builder().tagName(pageReqVO.getTagName()).build()); + userIds = userTagRefDOList.stream().map(UserTagRefDO::getUserId).distinct().collect(Collectors.toList()); + } + return userIds; + } + + @Override + public void insertBatch(List doList) { + userTagRefMapper.insertBatch(doList); + } + + @Override + public void deleteByUserId(Long id) { + userTagRefMapper.delete(Wrappers.lambdaUpdate().eq(UserTagRefDO::getUserId,id)); + } + + @Override + public Long selectCountByTagId(Long id) { + return userTagRefMapper.selectCount(UserTagRefDO::getTagId,id); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/burypoint/BuryPointMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/burypoint/BuryPointMapper.xml new file mode 100644 index 0000000..e973293 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/burypoint/BuryPointMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/integralrule/IntegralRuleMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/integralrule/IntegralRuleMapper.xml new file mode 100644 index 0000000..6d3005c --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/integralrule/IntegralRuleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/signinrecord/SignInRecordMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/signinrecord/SignInRecordMapper.xml new file mode 100644 index 0000000..acadf48 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/signinrecord/SignInRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userbill/UserBillMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userbill/UserBillMapper.xml new file mode 100644 index 0000000..20b592b --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userbill/UserBillMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userinvitelog/UserInviteLogMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userinvitelog/UserInviteLogMapper.xml new file mode 100644 index 0000000..232d7fa --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userinvitelog/UserInviteLogMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelconfig/UserLevelConfigMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelconfig/UserLevelConfigMapper.xml new file mode 100644 index 0000000..30788de --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelconfig/UserLevelConfigMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequity/UserLevelEquityMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequity/UserLevelEquityMapper.xml new file mode 100644 index 0000000..fc20f92 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequity/UserLevelEquityMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequityref/UserLevelEquityRefMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequityref/UserLevelEquityRefMapper.xml new file mode 100644 index 0000000..e524861 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelequityref/UserLevelEquityRefMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.xml new file mode 100644 index 0000000..223d5ed --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertag/UserTagMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertag/UserTagMapper.xml new file mode 100644 index 0000000..37dd709 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertag/UserTagMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertaggroup/UserTagGroupMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertaggroup/UserTagGroupMapper.xml new file mode 100644 index 0000000..ac7a962 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertaggroup/UserTagGroupMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertagref/UserTagRefMapper.xml b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertagref/UserTagRefMapper.xml new file mode 100644 index 0000000..949f2d7 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/main/resources/mapper/usertagref/UserTagRefMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImplTest.java new file mode 100644 index 0000000..276d224 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/burypoint/BuryPointServiceImplTest.java @@ -0,0 +1,183 @@ +package co.yixiang.yshop.module.member.service.burypoint; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.burypoint.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.burypoint.BuryPointDO; +import co.yixiang.yshop.module.member.dal.mysql.burypoint.BuryPointMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link BuryPointServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(BuryPointServiceImpl.class) +public class BuryPointServiceImplTest extends BaseDbUnitTest { + + @Resource + private BuryPointServiceImpl buryPointService; + + @Resource + private BuryPointMapper buryPointMapper; + + @Test + public void testCreateBuryPoint_success() { + // 准备参数 + BuryPointCreateReqVO reqVO = randomPojo(BuryPointCreateReqVO.class); + + // 调用 + Long buryPointId = buryPointService.createBuryPoint(reqVO); + // 断言 + assertNotNull(buryPointId); + // 校验记录的属性是否正确 + BuryPointDO buryPoint = buryPointMapper.selectById(buryPointId); + assertPojoEquals(reqVO, buryPoint); + } + + @Test + public void testUpdateBuryPoint_success() { + // mock 数据 + BuryPointDO dbBuryPoint = randomPojo(BuryPointDO.class); + buryPointMapper.insert(dbBuryPoint);// @Sql: 先插入出一条存在的数据 + // 准备参数 + BuryPointUpdateReqVO reqVO = randomPojo(BuryPointUpdateReqVO.class, o -> { + o.setId(dbBuryPoint.getId()); // 设置更新的 ID + }); + + // 调用 + buryPointService.updateBuryPoint(reqVO); + // 校验是否更新正确 + BuryPointDO buryPoint = buryPointMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, buryPoint); + } + + @Test + public void testUpdateBuryPoint_notExists() { + // 准备参数 + BuryPointUpdateReqVO reqVO = randomPojo(BuryPointUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> buryPointService.updateBuryPoint(reqVO), BURY_POINT_NOT_EXISTS); + } + + @Test + public void testDeleteBuryPoint_success() { + // mock 数据 + BuryPointDO dbBuryPoint = randomPojo(BuryPointDO.class); + buryPointMapper.insert(dbBuryPoint);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbBuryPoint.getId(); + + // 调用 + buryPointService.deleteBuryPoint(id); + // 校验数据不存在了 + assertNull(buryPointMapper.selectById(id)); + } + + @Test + public void testDeleteBuryPoint_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> buryPointService.deleteBuryPoint(id), BURY_POINT_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetBuryPointPage() { + // mock 数据 + BuryPointDO dbBuryPoint = randomPojo(BuryPointDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setEvent(null); + o.setEventParameter(null); + o.setCreateTime(null); + o.setIp(null); + }); + buryPointMapper.insert(dbBuryPoint); + // 测试 userId 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setUserId(null))); + // 测试 event 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setEvent(null))); + // 测试 eventParameter 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setEventParameter(null))); + // 测试 createTime 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setCreateTime(null))); + // 测试 ip 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setIp(null))); + // 准备参数 + BuryPointPageReqVO reqVO = new BuryPointPageReqVO(); + reqVO.setUserId(null); + reqVO.setEvent(null); + reqVO.setEventParameter(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setIp(null); + + // 调用 + PageResult pageResult = buryPointService.getBuryPointPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbBuryPoint, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetBuryPointList() { + // mock 数据 + BuryPointDO dbBuryPoint = randomPojo(BuryPointDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setEvent(null); + o.setEventParameter(null); + o.setCreateTime(null); + o.setIp(null); + }); + buryPointMapper.insert(dbBuryPoint); + // 测试 userId 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setUserId(null))); + // 测试 event 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setEvent(null))); + // 测试 eventParameter 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setEventParameter(null))); + // 测试 createTime 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setCreateTime(null))); + // 测试 ip 不匹配 + buryPointMapper.insert(cloneIgnoreId(dbBuryPoint, o -> o.setIp(null))); + // 准备参数 + BuryPointExportReqVO reqVO = new BuryPointExportReqVO(); + reqVO.setUserId(null); + reqVO.setEvent(null); + reqVO.setEventParameter(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setIp(null); + + // 调用 + List list = buryPointService.getBuryPointList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbBuryPoint, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImplTest.java new file mode 100644 index 0000000..d37637e --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/integralrule/IntegralRuleServiceImplTest.java @@ -0,0 +1,183 @@ +package co.yixiang.yshop.module.member.service.integralrule; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.integralrule.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.integralrule.IntegralRuleDO; +import co.yixiang.yshop.module.member.dal.mysql.integralrule.IntegralRuleMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link IntegralRuleServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(IntegralRuleServiceImpl.class) +public class IntegralRuleServiceImplTest extends BaseDbUnitTest { + + @Resource + private IntegralRuleServiceImpl integralRuleService; + + @Resource + private IntegralRuleMapper integralRuleMapper; + + @Test + public void testCreateIntegralRule_success() { + // 准备参数 + IntegralRuleCreateReqVO reqVO = randomPojo(IntegralRuleCreateReqVO.class); + + // 调用 + Long integralRuleId = integralRuleService.createIntegralRule(reqVO); + // 断言 + assertNotNull(integralRuleId); + // 校验记录的属性是否正确 + IntegralRuleDO integralRule = integralRuleMapper.selectById(integralRuleId); + assertPojoEquals(reqVO, integralRule); + } + + @Test + public void testUpdateIntegralRule_success() { + // mock 数据 + IntegralRuleDO dbIntegralRule = randomPojo(IntegralRuleDO.class); + integralRuleMapper.insert(dbIntegralRule);// @Sql: 先插入出一条存在的数据 + // 准备参数 + IntegralRuleUpdateReqVO reqVO = randomPojo(IntegralRuleUpdateReqVO.class, o -> { + o.setId(dbIntegralRule.getId()); // 设置更新的 ID + }); + + // 调用 + integralRuleService.updateIntegralRule(reqVO); + // 校验是否更新正确 + IntegralRuleDO integralRule = integralRuleMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, integralRule); + } + + @Test + public void testUpdateIntegralRule_notExists() { + // 准备参数 + IntegralRuleUpdateReqVO reqVO = randomPojo(IntegralRuleUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> integralRuleService.updateIntegralRule(reqVO), INTEGRAL_RULE_NOT_EXISTS); + } + + @Test + public void testDeleteIntegralRule_success() { + // mock 数据 + IntegralRuleDO dbIntegralRule = randomPojo(IntegralRuleDO.class); + integralRuleMapper.insert(dbIntegralRule);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbIntegralRule.getId(); + + // 调用 + integralRuleService.deleteIntegralRule(id); + // 校验数据不存在了 + assertNull(integralRuleMapper.selectById(id)); + } + + @Test + public void testDeleteIntegralRule_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> integralRuleService.deleteIntegralRule(id), INTEGRAL_RULE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetIntegralRulePage() { + // mock 数据 + IntegralRuleDO dbIntegralRule = randomPojo(IntegralRuleDO.class, o -> { // 等会查询到 + o.setType(null); + o.setTypeName(null); + o.setIntegral(null); + o.setAttribute1(null); + o.setCreateTime(null); + }); + integralRuleMapper.insert(dbIntegralRule); + // 测试 type 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setType(null))); + // 测试 typeName 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setTypeName(null))); + // 测试 integral 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setIntegral(null))); + // 测试 attribute1 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setAttribute1(null))); + // 测试 createTime 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setCreateTime(null))); + // 准备参数 + IntegralRulePageReqVO reqVO = new IntegralRulePageReqVO(); + reqVO.setType(null); + reqVO.setTypeName(null); + reqVO.setIntegral(null); + reqVO.setAttribute1(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = integralRuleService.getIntegralRulePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbIntegralRule, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetIntegralRuleList() { + // mock 数据 + IntegralRuleDO dbIntegralRule = randomPojo(IntegralRuleDO.class, o -> { // 等会查询到 + o.setType(null); + o.setTypeName(null); + o.setIntegral(null); + o.setAttribute1(null); + o.setCreateTime(null); + }); + integralRuleMapper.insert(dbIntegralRule); + // 测试 type 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setType(null))); + // 测试 typeName 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setTypeName(null))); + // 测试 integral 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setIntegral(null))); + // 测试 attribute1 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setAttribute1(null))); + // 测试 createTime 不匹配 + integralRuleMapper.insert(cloneIgnoreId(dbIntegralRule, o -> o.setCreateTime(null))); + // 准备参数 + IntegralRuleExportReqVO reqVO = new IntegralRuleExportReqVO(); + reqVO.setType(null); + reqVO.setTypeName(null); + reqVO.setIntegral(null); + reqVO.setAttribute1(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = integralRuleService.getIntegralRuleList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbIntegralRule, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImplTest.java new file mode 100644 index 0000000..767929f --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/signinrecord/SignInRecordServiceImplTest.java @@ -0,0 +1,167 @@ +package co.yixiang.yshop.module.member.service.signinrecord; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.signinrecord.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.signinrecord.SignInRecordDO; +import co.yixiang.yshop.module.member.dal.mysql.signinrecord.SignInRecordMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link SignInRecordServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(SignInRecordServiceImpl.class) +public class SignInRecordServiceImplTest extends BaseDbUnitTest { + + @Resource + private SignInRecordServiceImpl signInRecordService; + + @Resource + private SignInRecordMapper signInRecordMapper; + + @Test + public void testCreateSignInRecord_success() { + // 准备参数 + SignInRecordCreateReqVO reqVO = randomPojo(SignInRecordCreateReqVO.class); + + // 调用 + Long signInRecordId = signInRecordService.createSignInRecord(reqVO); + // 断言 + assertNotNull(signInRecordId); + // 校验记录的属性是否正确 + SignInRecordDO signInRecord = signInRecordMapper.selectById(signInRecordId); + assertPojoEquals(reqVO, signInRecord); + } + + @Test + public void testUpdateSignInRecord_success() { + // mock 数据 + SignInRecordDO dbSignInRecord = randomPojo(SignInRecordDO.class); + signInRecordMapper.insert(dbSignInRecord);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SignInRecordUpdateReqVO reqVO = randomPojo(SignInRecordUpdateReqVO.class, o -> { + o.setId(dbSignInRecord.getId()); // 设置更新的 ID + }); + + // 调用 + signInRecordService.updateSignInRecord(reqVO); + // 校验是否更新正确 + SignInRecordDO signInRecord = signInRecordMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, signInRecord); + } + + @Test + public void testUpdateSignInRecord_notExists() { + // 准备参数 + SignInRecordUpdateReqVO reqVO = randomPojo(SignInRecordUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> signInRecordService.updateSignInRecord(reqVO), SIGN_IN_RECORD_NOT_EXISTS); + } + + @Test + public void testDeleteSignInRecord_success() { + // mock 数据 + SignInRecordDO dbSignInRecord = randomPojo(SignInRecordDO.class); + signInRecordMapper.insert(dbSignInRecord);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSignInRecord.getId(); + + // 调用 + signInRecordService.deleteSignInRecord(id); + // 校验数据不存在了 + assertNull(signInRecordMapper.selectById(id)); + } + + @Test + public void testDeleteSignInRecord_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> signInRecordService.deleteSignInRecord(id), SIGN_IN_RECORD_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetSignInRecordPage() { + // mock 数据 + SignInRecordDO dbSignInRecord = randomPojo(SignInRecordDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setIntegral(null); + o.setCreateTime(null); + }); + signInRecordMapper.insert(dbSignInRecord); + // 测试 userId 不匹配 + signInRecordMapper.insert(cloneIgnoreId(dbSignInRecord, o -> o.setUserId(null))); + // 测试 integral 不匹配 + signInRecordMapper.insert(cloneIgnoreId(dbSignInRecord, o -> o.setIntegral(null))); + // 测试 createTime 不匹配 + signInRecordMapper.insert(cloneIgnoreId(dbSignInRecord, o -> o.setCreateTime(null))); + // 准备参数 + SignInRecordPageReqVO reqVO = new SignInRecordPageReqVO(); + reqVO.setUserId(null); + reqVO.setIntegral(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = signInRecordService.getSignInRecordPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSignInRecord, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetSignInRecordList() { + // mock 数据 + SignInRecordDO dbSignInRecord = randomPojo(SignInRecordDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setIntegral(null); + o.setCreateTime(null); + }); + signInRecordMapper.insert(dbSignInRecord); + // 测试 userId 不匹配 + signInRecordMapper.insert(cloneIgnoreId(dbSignInRecord, o -> o.setUserId(null))); + // 测试 integral 不匹配 + signInRecordMapper.insert(cloneIgnoreId(dbSignInRecord, o -> o.setIntegral(null))); + // 测试 createTime 不匹配 + signInRecordMapper.insert(cloneIgnoreId(dbSignInRecord, o -> o.setCreateTime(null))); + // 准备参数 + SignInRecordExportReqVO reqVO = new SignInRecordExportReqVO(); + reqVO.setUserId(null); + reqVO.setIntegral(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = signInRecordService.getSignInRecordList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSignInRecord, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImplTest.java new file mode 100644 index 0000000..ec7bf42 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userinvitelog/UserInviteLogServiceImplTest.java @@ -0,0 +1,167 @@ +package co.yixiang.yshop.module.member.service.userinvitelog; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.userinvitelog.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userinvitelog.UserInviteLogDO; +import co.yixiang.yshop.module.member.dal.mysql.userinvitelog.UserInviteLogMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserInviteLogServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserInviteLogServiceImpl.class) +public class UserInviteLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserInviteLogServiceImpl userInviteLogService; + + @Resource + private UserInviteLogMapper userInviteLogMapper; + + @Test + public void testCreateUserInviteLog_success() { + // 准备参数 + UserInviteLogCreateReqVO reqVO = randomPojo(UserInviteLogCreateReqVO.class); + + // 调用 + Long userInviteLogId = userInviteLogService.createUserInviteLog(reqVO); + // 断言 + assertNotNull(userInviteLogId); + // 校验记录的属性是否正确 + UserInviteLogDO userInviteLog = userInviteLogMapper.selectById(userInviteLogId); + assertPojoEquals(reqVO, userInviteLog); + } + + @Test + public void testUpdateUserInviteLog_success() { + // mock 数据 + UserInviteLogDO dbUserInviteLog = randomPojo(UserInviteLogDO.class); + userInviteLogMapper.insert(dbUserInviteLog);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserInviteLogUpdateReqVO reqVO = randomPojo(UserInviteLogUpdateReqVO.class, o -> { + o.setId(dbUserInviteLog.getId()); // 设置更新的 ID + }); + + // 调用 + userInviteLogService.updateUserInviteLog(reqVO); + // 校验是否更新正确 + UserInviteLogDO userInviteLog = userInviteLogMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userInviteLog); + } + + @Test + public void testUpdateUserInviteLog_notExists() { + // 准备参数 + UserInviteLogUpdateReqVO reqVO = randomPojo(UserInviteLogUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userInviteLogService.updateUserInviteLog(reqVO), USER_INVITE_LOG_NOT_EXISTS); + } + + @Test + public void testDeleteUserInviteLog_success() { + // mock 数据 + UserInviteLogDO dbUserInviteLog = randomPojo(UserInviteLogDO.class); + userInviteLogMapper.insert(dbUserInviteLog);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserInviteLog.getId(); + + // 调用 + userInviteLogService.deleteUserInviteLog(id); + // 校验数据不存在了 + assertNull(userInviteLogMapper.selectById(id)); + } + + @Test + public void testDeleteUserInviteLog_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userInviteLogService.deleteUserInviteLog(id), USER_INVITE_LOG_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserInviteLogPage() { + // mock 数据 + UserInviteLogDO dbUserInviteLog = randomPojo(UserInviteLogDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setBeInviteUserId(null); + o.setCreateTime(null); + }); + userInviteLogMapper.insert(dbUserInviteLog); + // 测试 userId 不匹配 + userInviteLogMapper.insert(cloneIgnoreId(dbUserInviteLog, o -> o.setUserId(null))); + // 测试 beInviteUserId 不匹配 + userInviteLogMapper.insert(cloneIgnoreId(dbUserInviteLog, o -> o.setBeInviteUserId(null))); + // 测试 createTime 不匹配 + userInviteLogMapper.insert(cloneIgnoreId(dbUserInviteLog, o -> o.setCreateTime(null))); + // 准备参数 + UserInviteLogPageReqVO reqVO = new UserInviteLogPageReqVO(); + reqVO.setUserId(null); + reqVO.setBeInviteUserId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userInviteLogService.getUserInviteLogPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserInviteLog, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserInviteLogList() { + // mock 数据 + UserInviteLogDO dbUserInviteLog = randomPojo(UserInviteLogDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setBeInviteUserId(null); + o.setCreateTime(null); + }); + userInviteLogMapper.insert(dbUserInviteLog); + // 测试 userId 不匹配 + userInviteLogMapper.insert(cloneIgnoreId(dbUserInviteLog, o -> o.setUserId(null))); + // 测试 beInviteUserId 不匹配 + userInviteLogMapper.insert(cloneIgnoreId(dbUserInviteLog, o -> o.setBeInviteUserId(null))); + // 测试 createTime 不匹配 + userInviteLogMapper.insert(cloneIgnoreId(dbUserInviteLog, o -> o.setCreateTime(null))); + // 准备参数 + UserInviteLogExportReqVO reqVO = new UserInviteLogExportReqVO(); + reqVO.setUserId(null); + reqVO.setBeInviteUserId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userInviteLogService.getUserInviteLogList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserInviteLog, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImplTest.java new file mode 100644 index 0000000..343b4af --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelconfig/UserLevelConfigServiceImplTest.java @@ -0,0 +1,207 @@ +package co.yixiang.yshop.module.member.service.userlevelconfig; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.userlevelconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelconfig.UserLevelConfigDO; +import co.yixiang.yshop.module.member.dal.mysql.userlevelconfig.UserLevelConfigMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserLevelConfigServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserLevelConfigServiceImpl.class) +public class UserLevelConfigServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserLevelConfigServiceImpl userLevelConfigService; + + @Resource + private UserLevelConfigMapper userLevelConfigMapper; + + @Test + public void testCreateUserLevelConfig_success() { + // 准备参数 + UserLevelConfigCreateReqVO reqVO = randomPojo(UserLevelConfigCreateReqVO.class); + + // 调用 + Long userLevelConfigId = userLevelConfigService.createUserLevelConfig(reqVO); + // 断言 + assertNotNull(userLevelConfigId); + // 校验记录的属性是否正确 + UserLevelConfigDO userLevelConfig = userLevelConfigMapper.selectById(userLevelConfigId); + assertPojoEquals(reqVO, userLevelConfig); + } + + @Test + public void testUpdateUserLevelConfig_success() { + // mock 数据 + UserLevelConfigDO dbUserLevelConfig = randomPojo(UserLevelConfigDO.class); + userLevelConfigMapper.insert(dbUserLevelConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserLevelConfigUpdateReqVO reqVO = randomPojo(UserLevelConfigUpdateReqVO.class, o -> { + o.setId(dbUserLevelConfig.getId()); // 设置更新的 ID + }); + + // 调用 + userLevelConfigService.updateUserLevelConfig(reqVO); + // 校验是否更新正确 + UserLevelConfigDO userLevelConfig = userLevelConfigMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userLevelConfig); + } + + @Test + public void testUpdateUserLevelConfig_notExists() { + // 准备参数 + UserLevelConfigUpdateReqVO reqVO = randomPojo(UserLevelConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelConfigService.updateUserLevelConfig(reqVO), USER_LEVEL_CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteUserLevelConfig_success() { + // mock 数据 + UserLevelConfigDO dbUserLevelConfig = randomPojo(UserLevelConfigDO.class); + userLevelConfigMapper.insert(dbUserLevelConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserLevelConfig.getId(); + + // 调用 + userLevelConfigService.deleteUserLevelConfig(id); + // 校验数据不存在了 + assertNull(userLevelConfigMapper.selectById(id)); + } + + @Test + public void testDeleteUserLevelConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelConfigService.deleteUserLevelConfig(id), USER_LEVEL_CONFIG_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelConfigPage() { + // mock 数据 + UserLevelConfigDO dbUserLevelConfig = randomPojo(UserLevelConfigDO.class, o -> { // 等会查询到 + o.setLevelName(null); + o.setLevel(null); + o.setGrowthValue(null); + o.setIconUrl(null); + o.setBackgroundUrl(null); + o.setStatus(null); + o.setRemarks(null); + o.setCreateTime(null); + }); + userLevelConfigMapper.insert(dbUserLevelConfig); + // 测试 levelName 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setLevelName(null))); + // 测试 level 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setLevel(null))); + // 测试 growthValue 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setGrowthValue(null))); + // 测试 iconUrl 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setIconUrl(null))); + // 测试 backgroundUrl 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setBackgroundUrl(null))); + // 测试 status 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setStatus(null))); + // 测试 remarks 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setRemarks(null))); + // 测试 createTime 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setCreateTime(null))); + // 准备参数 + UserLevelConfigPageReqVO reqVO = new UserLevelConfigPageReqVO(); + reqVO.setLevelName(null); + reqVO.setLevel(null); + reqVO.setGrowthValue(null); + reqVO.setIconUrl(null); + reqVO.setBackgroundUrl(null); + reqVO.setStatus(null); + reqVO.setRemarks(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userLevelConfigService.getUserLevelConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserLevelConfig, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelConfigList() { + // mock 数据 + UserLevelConfigDO dbUserLevelConfig = randomPojo(UserLevelConfigDO.class, o -> { // 等会查询到 + o.setLevelName(null); + o.setLevel(null); + o.setGrowthValue(null); + o.setIconUrl(null); + o.setBackgroundUrl(null); + o.setStatus(null); + o.setRemarks(null); + o.setCreateTime(null); + }); + userLevelConfigMapper.insert(dbUserLevelConfig); + // 测试 levelName 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setLevelName(null))); + // 测试 level 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setLevel(null))); + // 测试 growthValue 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setGrowthValue(null))); + // 测试 iconUrl 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setIconUrl(null))); + // 测试 backgroundUrl 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setBackgroundUrl(null))); + // 测试 status 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setStatus(null))); + // 测试 remarks 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setRemarks(null))); + // 测试 createTime 不匹配 + userLevelConfigMapper.insert(cloneIgnoreId(dbUserLevelConfig, o -> o.setCreateTime(null))); + // 准备参数 + UserLevelConfigExportReqVO reqVO = new UserLevelConfigExportReqVO(); + reqVO.setLevelName(null); + reqVO.setLevel(null); + reqVO.setGrowthValue(null); + reqVO.setIconUrl(null); + reqVO.setBackgroundUrl(null); + reqVO.setStatus(null); + reqVO.setRemarks(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userLevelConfigService.getUserLevelConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserLevelConfig, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImplTest.java new file mode 100644 index 0000000..3e6f306 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequity/UserLevelEquityServiceImplTest.java @@ -0,0 +1,176 @@ +package co.yixiang.yshop.module.member.service.userlevelequity; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequity.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequity.UserLevelEquityDO; +import co.yixiang.yshop.module.member.dal.mysql.userlevelequity.UserLevelEquityMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserLevelEquityServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserLevelEquityServiceImpl.class) +public class UserLevelEquityServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserLevelEquityServiceImpl userLevelEquityService; + + @Resource + private UserLevelEquityMapper userLevelEquityMapper; + + @Test + public void testCreateUserLevelEquity_success() { + // 准备参数 + UserLevelEquityCreateReqVO reqVO = randomPojo(UserLevelEquityCreateReqVO.class); + + // 调用 + Long userLevelEquityId = userLevelEquityService.createUserLevelEquity(reqVO); + // 断言 + assertNotNull(userLevelEquityId); + // 校验记录的属性是否正确 + UserLevelEquityDO userLevelEquity = userLevelEquityMapper.selectById(userLevelEquityId); + assertPojoEquals(reqVO, userLevelEquity); + } + + @Test + public void testUpdateUserLevelEquity_success() { + // mock 数据 + UserLevelEquityDO dbUserLevelEquity = randomPojo(UserLevelEquityDO.class); + userLevelEquityMapper.insert(dbUserLevelEquity);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserLevelEquityUpdateReqVO reqVO = randomPojo(UserLevelEquityUpdateReqVO.class, o -> { + o.setId(dbUserLevelEquity.getId()); // 设置更新的 ID + }); + + // 调用 + userLevelEquityService.updateUserLevelEquity(reqVO); + // 校验是否更新正确 + UserLevelEquityDO userLevelEquity = userLevelEquityMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userLevelEquity); + } + + @Test + public void testUpdateUserLevelEquity_notExists() { + // 准备参数 + UserLevelEquityUpdateReqVO reqVO = randomPojo(UserLevelEquityUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelEquityService.updateUserLevelEquity(reqVO), USER_LEVEL_EQUITY_NOT_EXISTS); + } + + @Test + public void testDeleteUserLevelEquity_success() { + // mock 数据 + UserLevelEquityDO dbUserLevelEquity = randomPojo(UserLevelEquityDO.class); + userLevelEquityMapper.insert(dbUserLevelEquity);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserLevelEquity.getId(); + + // 调用 + userLevelEquityService.deleteUserLevelEquity(id); + // 校验数据不存在了 + assertNull(userLevelEquityMapper.selectById(id)); + } + + @Test + public void testDeleteUserLevelEquity_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelEquityService.deleteUserLevelEquity(id), USER_LEVEL_EQUITY_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelEquityPage() { + // mock 数据 + UserLevelEquityDO dbUserLevelEquity = randomPojo(UserLevelEquityDO.class, o -> { // 等会查询到 + o.setType(null); + o.setTypeName(null); + o.setCreateTime(null); + o.setIconUrl(null); + }); + userLevelEquityMapper.insert(dbUserLevelEquity); + // 测试 type 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setType(null))); + // 测试 typeName 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setTypeName(null))); + // 测试 equityValue 不匹配 + // 测试 createTime 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setCreateTime(null))); + // 测试 iconUrl 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setIconUrl(null))); + // 准备参数 + UserLevelEquityPageReqVO reqVO = new UserLevelEquityPageReqVO(); + reqVO.setType(null); + reqVO.setTypeName(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setIconUrl(null); + + // 调用 + PageResult pageResult = userLevelEquityService.getUserLevelEquityPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserLevelEquity, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelEquityList() { + // mock 数据 + UserLevelEquityDO dbUserLevelEquity = randomPojo(UserLevelEquityDO.class, o -> { // 等会查询到 + o.setType(null); + o.setTypeName(null); + o.setCreateTime(null); + o.setIconUrl(null); + }); + userLevelEquityMapper.insert(dbUserLevelEquity); + // 测试 type 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setType(null))); + // 测试 typeName 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setTypeName(null))); + // 测试 createTime 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setCreateTime(null))); + // 测试 iconUrl 不匹配 + userLevelEquityMapper.insert(cloneIgnoreId(dbUserLevelEquity, o -> o.setIconUrl(null))); + // 准备参数 + UserLevelEquityExportReqVO reqVO = new UserLevelEquityExportReqVO(); + reqVO.setType(null); + reqVO.setTypeName(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setIconUrl(null); + + // 调用 + List list = userLevelEquityService.getUserLevelEquityList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserLevelEquity, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImplTest.java new file mode 100644 index 0000000..461fbc5 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelequityref/UserLevelEquityRefServiceImplTest.java @@ -0,0 +1,167 @@ +package co.yixiang.yshop.module.member.service.userlevelequityref; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.userlevelequityref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelequityref.UserLevelEquityRefDO; +import co.yixiang.yshop.module.member.dal.mysql.userlevelequityref.UserLevelEquityRefMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserLevelEquityRefServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserLevelEquityRefServiceImpl.class) +public class UserLevelEquityRefServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserLevelEquityRefServiceImpl userLevelEquityRefService; + + @Resource + private UserLevelEquityRefMapper userLevelEquityRefMapper; + + @Test + public void testCreateUserLevelEquityRef_success() { + // 准备参数 + UserLevelEquityRefCreateReqVO reqVO = randomPojo(UserLevelEquityRefCreateReqVO.class); + + // 调用 + Long userLevelEquityRefId = userLevelEquityRefService.createUserLevelEquityRef(reqVO); + // 断言 + assertNotNull(userLevelEquityRefId); + // 校验记录的属性是否正确 + UserLevelEquityRefDO userLevelEquityRef = userLevelEquityRefMapper.selectById(userLevelEquityRefId); + assertPojoEquals(reqVO, userLevelEquityRef); + } + + @Test + public void testUpdateUserLevelEquityRef_success() { + // mock 数据 + UserLevelEquityRefDO dbUserLevelEquityRef = randomPojo(UserLevelEquityRefDO.class); + userLevelEquityRefMapper.insert(dbUserLevelEquityRef);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserLevelEquityRefUpdateReqVO reqVO = randomPojo(UserLevelEquityRefUpdateReqVO.class, o -> { + o.setId(dbUserLevelEquityRef.getId()); // 设置更新的 ID + }); + + // 调用 + userLevelEquityRefService.updateUserLevelEquityRef(reqVO); + // 校验是否更新正确 + UserLevelEquityRefDO userLevelEquityRef = userLevelEquityRefMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userLevelEquityRef); + } + + @Test + public void testUpdateUserLevelEquityRef_notExists() { + // 准备参数 + UserLevelEquityRefUpdateReqVO reqVO = randomPojo(UserLevelEquityRefUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelEquityRefService.updateUserLevelEquityRef(reqVO), USER_LEVEL_EQUITY_REF_NOT_EXISTS); + } + + @Test + public void testDeleteUserLevelEquityRef_success() { + // mock 数据 + UserLevelEquityRefDO dbUserLevelEquityRef = randomPojo(UserLevelEquityRefDO.class); + userLevelEquityRefMapper.insert(dbUserLevelEquityRef);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserLevelEquityRef.getId(); + + // 调用 + userLevelEquityRefService.deleteUserLevelEquityRef(id); + // 校验数据不存在了 + assertNull(userLevelEquityRefMapper.selectById(id)); + } + + @Test + public void testDeleteUserLevelEquityRef_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelEquityRefService.deleteUserLevelEquityRef(id), USER_LEVEL_EQUITY_REF_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelEquityRefPage() { + // mock 数据 + UserLevelEquityRefDO dbUserLevelEquityRef = randomPojo(UserLevelEquityRefDO.class, o -> { // 等会查询到 + o.setLevelId(null); + o.setEquityId(null); + o.setCreateTime(null); + }); + userLevelEquityRefMapper.insert(dbUserLevelEquityRef); + // 测试 levelId 不匹配 + userLevelEquityRefMapper.insert(cloneIgnoreId(dbUserLevelEquityRef, o -> o.setLevelId(null))); + // 测试 equityId 不匹配 + userLevelEquityRefMapper.insert(cloneIgnoreId(dbUserLevelEquityRef, o -> o.setEquityId(null))); + // 测试 createTime 不匹配 + userLevelEquityRefMapper.insert(cloneIgnoreId(dbUserLevelEquityRef, o -> o.setCreateTime(null))); + // 准备参数 + UserLevelEquityRefPageReqVO reqVO = new UserLevelEquityRefPageReqVO(); + reqVO.setLevelId(null); + reqVO.setEquityId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userLevelEquityRefService.getUserLevelEquityRefPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserLevelEquityRef, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelEquityRefList() { + // mock 数据 + UserLevelEquityRefDO dbUserLevelEquityRef = randomPojo(UserLevelEquityRefDO.class, o -> { // 等会查询到 + o.setLevelId(null); + o.setEquityId(null); + o.setCreateTime(null); + }); + userLevelEquityRefMapper.insert(dbUserLevelEquityRef); + // 测试 levelId 不匹配 + userLevelEquityRefMapper.insert(cloneIgnoreId(dbUserLevelEquityRef, o -> o.setLevelId(null))); + // 测试 equityId 不匹配 + userLevelEquityRefMapper.insert(cloneIgnoreId(dbUserLevelEquityRef, o -> o.setEquityId(null))); + // 测试 createTime 不匹配 + userLevelEquityRefMapper.insert(cloneIgnoreId(dbUserLevelEquityRef, o -> o.setCreateTime(null))); + // 准备参数 + UserLevelEquityRefExportReqVO reqVO = new UserLevelEquityRefExportReqVO(); + reqVO.setLevelId(null); + reqVO.setEquityId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userLevelEquityRefService.getUserLevelEquityRefList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserLevelEquityRef, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImplTest.java new file mode 100644 index 0000000..756ad48 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/userlevelgrowthvalueconfig/UserLevelGrowthValueConfigServiceImplTest.java @@ -0,0 +1,179 @@ +package co.yixiang.yshop.module.member.service.userlevelgrowthvalueconfig; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.userlevelgrowthvalueconfig.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigDO; +import co.yixiang.yshop.module.member.dal.mysql.userlevelgrowthvalueconfig.UserLevelGrowthValueConfigMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserLevelGrowthValueConfigServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserLevelGrowthValueConfigServiceImpl.class) +public class UserLevelGrowthValueConfigServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserLevelGrowthValueConfigServiceImpl userLevelGrowthValueConfigService; + + @Resource + private UserLevelGrowthValueConfigMapper userLevelGrowthValueConfigMapper; + + @Test + public void testCreateUserLevelGrowthValueConfig_success() { + // 准备参数 + UserLevelGrowthValueConfigCreateReqVO reqVO = randomPojo(UserLevelGrowthValueConfigCreateReqVO.class); + + // 调用 + Integer userLevelGrowthValueConfigId = userLevelGrowthValueConfigService.createUserLevelGrowthValueConfig(reqVO); + // 断言 + assertNotNull(userLevelGrowthValueConfigId); + // 校验记录的属性是否正确 + UserLevelGrowthValueConfigDO userLevelGrowthValueConfig = userLevelGrowthValueConfigMapper.selectById(userLevelGrowthValueConfigId); + assertPojoEquals(reqVO, userLevelGrowthValueConfig); + } + + @Test + public void testUpdateUserLevelGrowthValueConfig_success() { + // mock 数据 + UserLevelGrowthValueConfigDO dbUserLevelGrowthValueConfig = randomPojo(UserLevelGrowthValueConfigDO.class); + userLevelGrowthValueConfigMapper.insert(dbUserLevelGrowthValueConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserLevelGrowthValueConfigUpdateReqVO reqVO = randomPojo(UserLevelGrowthValueConfigUpdateReqVO.class, o -> { + o.setId(dbUserLevelGrowthValueConfig.getId()); // 设置更新的 ID + }); + + // 调用 + userLevelGrowthValueConfigService.updateUserLevelGrowthValueConfig(reqVO); + // 校验是否更新正确 + UserLevelGrowthValueConfigDO userLevelGrowthValueConfig = userLevelGrowthValueConfigMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userLevelGrowthValueConfig); + } + + @Test + public void testUpdateUserLevelGrowthValueConfig_notExists() { + // 准备参数 + UserLevelGrowthValueConfigUpdateReqVO reqVO = randomPojo(UserLevelGrowthValueConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelGrowthValueConfigService.updateUserLevelGrowthValueConfig(reqVO), USER_LEVEL_GROWTH_VALUE_CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteUserLevelGrowthValueConfig_success() { + // mock 数据 + UserLevelGrowthValueConfigDO dbUserLevelGrowthValueConfig = randomPojo(UserLevelGrowthValueConfigDO.class); + userLevelGrowthValueConfigMapper.insert(dbUserLevelGrowthValueConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Integer id = dbUserLevelGrowthValueConfig.getId(); + + // 调用 + userLevelGrowthValueConfigService.deleteUserLevelGrowthValueConfig(id); + // 校验数据不存在了 + assertNull(userLevelGrowthValueConfigMapper.selectById(id)); + } + + @Test + public void testDeleteUserLevelGrowthValueConfig_notExists() { + // 准备参数 + Integer id = randomIntegerId(); + + // 调用, 并断言异常 + assertServiceException(() -> userLevelGrowthValueConfigService.deleteUserLevelGrowthValueConfig(id), USER_LEVEL_GROWTH_VALUE_CONFIG_NOT_EXISTS); + } + + private Integer randomIntegerId() { + return 1; + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelGrowthValueConfigPage() { + // mock 数据 + UserLevelGrowthValueConfigDO dbUserLevelGrowthValueConfig = randomPojo(UserLevelGrowthValueConfigDO.class, o -> { // 等会查询到 + o.setType(null); + o.setTypeName(null); + o.setGrowthValue(null); + o.setCreateTime(null); + }); + userLevelGrowthValueConfigMapper.insert(dbUserLevelGrowthValueConfig); + // 测试 type 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setType(null))); + // 测试 typeName 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setTypeName(null))); + // 测试 growthValue 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setGrowthValue(null))); + // 测试 createTime 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setCreateTime(null))); + // 准备参数 + UserLevelGrowthValueConfigPageReqVO reqVO = new UserLevelGrowthValueConfigPageReqVO(); + reqVO.setType(null); + reqVO.setTypeName(null); + reqVO.setGrowthValue(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userLevelGrowthValueConfigService.getUserLevelGrowthValueConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserLevelGrowthValueConfig, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserLevelGrowthValueConfigList() { + // mock 数据 + UserLevelGrowthValueConfigDO dbUserLevelGrowthValueConfig = randomPojo(UserLevelGrowthValueConfigDO.class, o -> { // 等会查询到 + o.setType(null); + o.setTypeName(null); + o.setGrowthValue(null); + o.setCreateTime(null); + }); + userLevelGrowthValueConfigMapper.insert(dbUserLevelGrowthValueConfig); + // 测试 type 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setType(null))); + // 测试 typeName 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setTypeName(null))); + // 测试 growthValue 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setGrowthValue(null))); + // 测试 createTime 不匹配 + userLevelGrowthValueConfigMapper.insert(cloneIgnoreId(dbUserLevelGrowthValueConfig, o -> o.setCreateTime(null))); + // 准备参数 + UserLevelGrowthValueConfigExportReqVO reqVO = new UserLevelGrowthValueConfigExportReqVO(); + reqVO.setType(null); + reqVO.setTypeName(null); + reqVO.setGrowthValue(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userLevelGrowthValueConfigService.getUserLevelGrowthValueConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserLevelGrowthValueConfig, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImplTest.java new file mode 100644 index 0000000..265ef30 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertag/UserTagServiceImplTest.java @@ -0,0 +1,167 @@ +package co.yixiang.yshop.module.member.service.usertag; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.usertag.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertag.UserTagDO; +import co.yixiang.yshop.module.member.dal.mysql.usertag.UserTagMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserTagServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserTagServiceImpl.class) +public class UserTagServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserTagServiceImpl userTagService; + + @Resource + private UserTagMapper userTagMapper; + + @Test + public void testCreateUserTag_success() { + // 准备参数 + UserTagCreateReqVO reqVO = randomPojo(UserTagCreateReqVO.class); + + // 调用 + Long userTagId = userTagService.createUserTag(reqVO); + // 断言 + assertNotNull(userTagId); + // 校验记录的属性是否正确 + UserTagDO userTag = userTagMapper.selectById(userTagId); + assertPojoEquals(reqVO, userTag); + } + + @Test + public void testUpdateUserTag_success() { + // mock 数据 + UserTagDO dbUserTag = randomPojo(UserTagDO.class); + userTagMapper.insert(dbUserTag);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserTagUpdateReqVO reqVO = randomPojo(UserTagUpdateReqVO.class, o -> { + o.setId(dbUserTag.getId()); // 设置更新的 ID + }); + + // 调用 + userTagService.updateUserTag(reqVO); + // 校验是否更新正确 + UserTagDO userTag = userTagMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userTag); + } + + @Test + public void testUpdateUserTag_notExists() { + // 准备参数 + UserTagUpdateReqVO reqVO = randomPojo(UserTagUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userTagService.updateUserTag(reqVO), USER_TAG_NOT_EXISTS); + } + + @Test + public void testDeleteUserTag_success() { + // mock 数据 + UserTagDO dbUserTag = randomPojo(UserTagDO.class); + userTagMapper.insert(dbUserTag);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserTag.getId(); + + // 调用 + userTagService.deleteUserTag(id); + // 校验数据不存在了 + assertNull(userTagMapper.selectById(id)); + } + + @Test + public void testDeleteUserTag_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userTagService.deleteUserTag(id), USER_TAG_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserTagPage() { + // mock 数据 + UserTagDO dbUserTag = randomPojo(UserTagDO.class, o -> { // 等会查询到 + o.setTagName(null); + o.setGroupId(null); + o.setCreateTime(null); + }); + userTagMapper.insert(dbUserTag); + // 测试 tagName 不匹配 + userTagMapper.insert(cloneIgnoreId(dbUserTag, o -> o.setTagName(null))); + // 测试 groupId 不匹配 + userTagMapper.insert(cloneIgnoreId(dbUserTag, o -> o.setGroupId(null))); + // 测试 createTime 不匹配 + userTagMapper.insert(cloneIgnoreId(dbUserTag, o -> o.setCreateTime(null))); + // 准备参数 + UserTagPageReqVO reqVO = new UserTagPageReqVO(); + reqVO.setTagName(null); + reqVO.setGroupId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userTagService.getUserTagPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserTag, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserTagList() { + // mock 数据 + UserTagDO dbUserTag = randomPojo(UserTagDO.class, o -> { // 等会查询到 + o.setTagName(null); + o.setGroupId(null); + o.setCreateTime(null); + }); + userTagMapper.insert(dbUserTag); + // 测试 tagName 不匹配 + userTagMapper.insert(cloneIgnoreId(dbUserTag, o -> o.setTagName(null))); + // 测试 groupId 不匹配 + userTagMapper.insert(cloneIgnoreId(dbUserTag, o -> o.setGroupId(null))); + // 测试 createTime 不匹配 + userTagMapper.insert(cloneIgnoreId(dbUserTag, o -> o.setCreateTime(null))); + // 准备参数 + UserTagExportReqVO reqVO = new UserTagExportReqVO(); + reqVO.setTagName(null); + reqVO.setGroupId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userTagService.getUserTagList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserTag, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImplTest.java new file mode 100644 index 0000000..efc601d --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertaggroup/UserTagGroupServiceImplTest.java @@ -0,0 +1,167 @@ +package co.yixiang.yshop.module.member.service.usertaggroup; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.usertaggroup.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertaggroup.UserTagGroupDO; +import co.yixiang.yshop.module.member.dal.mysql.usertaggroup.UserTagGroupMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserTagGroupServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserTagGroupServiceImpl.class) +public class UserTagGroupServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserTagGroupServiceImpl userTagGroupService; + + @Resource + private UserTagGroupMapper userTagGroupMapper; + + @Test + public void testCreateUserTagGroup_success() { + // 准备参数 + UserTagGroupCreateReqVO reqVO = randomPojo(UserTagGroupCreateReqVO.class); + + // 调用 + Long userTagGroupId = userTagGroupService.createUserTagGroup(reqVO); + // 断言 + assertNotNull(userTagGroupId); + // 校验记录的属性是否正确 + UserTagGroupDO userTagGroup = userTagGroupMapper.selectById(userTagGroupId); + assertPojoEquals(reqVO, userTagGroup); + } + + @Test + public void testUpdateUserTagGroup_success() { + // mock 数据 + UserTagGroupDO dbUserTagGroup = randomPojo(UserTagGroupDO.class); + userTagGroupMapper.insert(dbUserTagGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserTagGroupUpdateReqVO reqVO = randomPojo(UserTagGroupUpdateReqVO.class, o -> { + o.setId(dbUserTagGroup.getId()); // 设置更新的 ID + }); + + // 调用 + userTagGroupService.updateUserTagGroup(reqVO); + // 校验是否更新正确 + UserTagGroupDO userTagGroup = userTagGroupMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userTagGroup); + } + + @Test + public void testUpdateUserTagGroup_notExists() { + // 准备参数 + UserTagGroupUpdateReqVO reqVO = randomPojo(UserTagGroupUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userTagGroupService.updateUserTagGroup(reqVO), USER_TAG_GROUP_NOT_EXISTS); + } + + @Test + public void testDeleteUserTagGroup_success() { + // mock 数据 + UserTagGroupDO dbUserTagGroup = randomPojo(UserTagGroupDO.class); + userTagGroupMapper.insert(dbUserTagGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserTagGroup.getId(); + + // 调用 + userTagGroupService.deleteUserTagGroup(id); + // 校验数据不存在了 + assertNull(userTagGroupMapper.selectById(id)); + } + + @Test + public void testDeleteUserTagGroup_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userTagGroupService.deleteUserTagGroup(id), USER_TAG_GROUP_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserTagGroupPage() { + // mock 数据 + UserTagGroupDO dbUserTagGroup = randomPojo(UserTagGroupDO.class, o -> { // 等会查询到 + o.setGroupName(null); + o.setSorted(null); + o.setCreateTime(null); + }); + userTagGroupMapper.insert(dbUserTagGroup); + // 测试 groupName 不匹配 + userTagGroupMapper.insert(cloneIgnoreId(dbUserTagGroup, o -> o.setGroupName(null))); + // 测试 sorted 不匹配 + userTagGroupMapper.insert(cloneIgnoreId(dbUserTagGroup, o -> o.setSorted(null))); + // 测试 createTime 不匹配 + userTagGroupMapper.insert(cloneIgnoreId(dbUserTagGroup, o -> o.setCreateTime(null))); + // 准备参数 + UserTagGroupPageReqVO reqVO = new UserTagGroupPageReqVO(); + reqVO.setGroupName(null); + reqVO.setSorted(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userTagGroupService.getUserTagGroupPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserTagGroup, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserTagGroupList() { + // mock 数据 + UserTagGroupDO dbUserTagGroup = randomPojo(UserTagGroupDO.class, o -> { // 等会查询到 + o.setGroupName(null); + o.setSorted(null); + o.setCreateTime(null); + }); + userTagGroupMapper.insert(dbUserTagGroup); + // 测试 groupName 不匹配 + userTagGroupMapper.insert(cloneIgnoreId(dbUserTagGroup, o -> o.setGroupName(null))); + // 测试 sorted 不匹配 + userTagGroupMapper.insert(cloneIgnoreId(dbUserTagGroup, o -> o.setSorted(null))); + // 测试 createTime 不匹配 + userTagGroupMapper.insert(cloneIgnoreId(dbUserTagGroup, o -> o.setCreateTime(null))); + // 准备参数 + UserTagGroupExportReqVO reqVO = new UserTagGroupExportReqVO(); + reqVO.setGroupName(null); + reqVO.setSorted(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userTagGroupService.getUserTagGroupList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserTagGroup, list.get(0)); + } + +} diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImplTest.java new file mode 100644 index 0000000..9e4cbb7 --- /dev/null +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/usertagref/UserTagRefServiceImplTest.java @@ -0,0 +1,165 @@ +package co.yixiang.yshop.module.member.service.usertagref; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import co.yixiang.yshop.framework.test.core.ut.BaseDbUnitTest; + +import co.yixiang.yshop.module.member.controller.admin.usertagref.vo.*; +import co.yixiang.yshop.module.member.dal.dataobject.usertagref.UserTagRefDO; +import co.yixiang.yshop.module.member.dal.mysql.usertagref.UserTagRefMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.framework.test.core.util.AssertUtils.*; +import static co.yixiang.yshop.framework.test.core.util.RandomUtils.*; +import static co.yixiang.yshop.framework.common.util.date.LocalDateTimeUtils.*; +import static co.yixiang.yshop.framework.common.util.object.ObjectUtils.*; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link UserTagRefServiceImpl} 的单元测试类 +* +* @author admin +*/ +@Import(UserTagRefServiceImpl.class) +public class UserTagRefServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserTagRefServiceImpl userTagRefService; + + @Resource + private UserTagRefMapper userTagRefMapper; + + @Test + public void testCreateUserTagRef_success() { + // 准备参数 + UserTagRefCreateReqVO reqVO = randomPojo(UserTagRefCreateReqVO.class); + + // 调用 + Long userTagRefId = userTagRefService.createUserTagRef(reqVO); + // 断言 + assertNotNull(userTagRefId); + // 校验记录的属性是否正确 + UserTagRefDO userTagRef = userTagRefMapper.selectById(userTagRefId); + assertPojoEquals(reqVO, userTagRef); + } + + @Test + public void testUpdateUserTagRef_success() { + // mock 数据 + UserTagRefDO dbUserTagRef = randomPojo(UserTagRefDO.class); + userTagRefMapper.insert(dbUserTagRef);// @Sql: 先插入出一条存在的数据 + // 准备参数 + UserTagRefUpdateReqVO reqVO = randomPojo(UserTagRefUpdateReqVO.class, o -> { + o.setId(dbUserTagRef.getId()); // 设置更新的 ID + }); + + // 调用 + userTagRefService.updateUserTagRef(reqVO); + // 校验是否更新正确 + UserTagRefDO userTagRef = userTagRefMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userTagRef); + } + + @Test + public void testUpdateUserTagRef_notExists() { + // 准备参数 + UserTagRefUpdateReqVO reqVO = randomPojo(UserTagRefUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userTagRefService.updateUserTagRef(reqVO), USER_TAG_REF_NOT_EXISTS); + } + + @Test + public void testDeleteUserTagRef_success() { + // mock 数据 + UserTagRefDO dbUserTagRef = randomPojo(UserTagRefDO.class); + userTagRefMapper.insert(dbUserTagRef);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserTagRef.getId(); + + // 调用 + userTagRefService.deleteUserTagRef(id); + // 校验数据不存在了 + assertNull(userTagRefMapper.selectById(id)); + } + + @Test + public void testDeleteUserTagRef_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userTagRefService.deleteUserTagRef(id), USER_TAG_REF_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserTagRefPage() { + // mock 数据 + UserTagRefDO dbUserTagRef = randomPojo(UserTagRefDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setTagId(null); + o.setCreateTime(null); + }); + userTagRefMapper.insert(dbUserTagRef); + // 测试 userId 不匹配 + userTagRefMapper.insert(cloneIgnoreId(dbUserTagRef, o -> o.setUserId(null))); + // 测试 tagId 不匹配 + userTagRefMapper.insert(cloneIgnoreId(dbUserTagRef, o -> o.setTagId(null))); + // 测试 createTime 不匹配 + userTagRefMapper.insert(cloneIgnoreId(dbUserTagRef, o -> o.setCreateTime(null))); + // 准备参数 + UserTagRefPageReqVO reqVO = new UserTagRefPageReqVO(); + reqVO.setUserId(null); + reqVO.setTagId(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = userTagRefService.getUserTagRefPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserTagRef, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserTagRefList() { + // mock 数据 + UserTagRefDO dbUserTagRef = randomPojo(UserTagRefDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setTagId(null); + o.setCreateTime(null); + }); + userTagRefMapper.insert(dbUserTagRef); + // 测试 userId 不匹配 + userTagRefMapper.insert(cloneIgnoreId(dbUserTagRef, o -> o.setUserId(null))); + // 测试 tagId 不匹配 + userTagRefMapper.insert(cloneIgnoreId(dbUserTagRef, o -> o.setTagId(null))); + // 测试 createTime 不匹配 + userTagRefMapper.insert(cloneIgnoreId(dbUserTagRef, o -> o.setCreateTime(null))); + // 准备参数 + UserTagRefExportReqVO reqVO = UserTagRefExportReqVO.builder().createTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)).build(); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = userTagRefService.getUserTagRefList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserTagRef, list.get(0)); + } + +} diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateBaseVO.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateBaseVO.java index 4d48311..e937c4e 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateBaseVO.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateBaseVO.java @@ -14,21 +14,21 @@ import javax.validation.constraints.*; @Data public class WechatTemplateBaseVO { - @Schema(description = "模板编号", required = true) + @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "模板编号不能为空") private String tempkey; - @Schema(description = "模板名", required = true, example = "张三") + @Schema(description = "模板名", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") @NotNull(message = "模板名不能为空") private String name; - @Schema(description = "回复内容", required = true) + @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.REQUIRED) private String content; @Schema(description = "模板ID", example = "15656") private String tempid; - @Schema(description = "状态", required = true, example = "1") + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "状态不能为空") private Byte status; diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateRespVO.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateRespVO.java index 26db808..8032b47 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateRespVO.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateRespVO.java @@ -10,10 +10,10 @@ import java.time.LocalDateTime; @ToString(callSuper = true) public class WechatTemplateRespVO extends WechatTemplateBaseVO { - @Schema(description = "模板id", required = true, example = "8445") + @Schema(description = "模板id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8445") private Integer id; - @Schema(description = "添加时间", required = true) + @Schema(description = "添加时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; } diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateUpdateReqVO.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateUpdateReqVO.java index 3472954..25378aa 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateUpdateReqVO.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/controller/admin/wechattemplate/vo/WechatTemplateUpdateReqVO.java @@ -11,7 +11,7 @@ import javax.validation.constraints.*; @ToString(callSuper = true) public class WechatTemplateUpdateReqVO extends WechatTemplateBaseVO { - @Schema(description = "模板id", required = true, example = "8445") + @Schema(description = "模板id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8445") @NotNull(message = "模板id不能为空") private Integer id; diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateService.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateService.java index 2df1437..708c0fc 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateService.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateService.java @@ -1,14 +1,17 @@ package co.yixiang.yshop.module.message.service.wechattemplate; -import java.util.*; -import javax.validation.*; - -import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.*; -import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplateCreateReqVO; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplateExportReqVO; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplatePageReqVO; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplateUpdateReqVO; +import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; import com.baomidou.mybatisplus.extension.service.IService; +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + /** * 微信模板 Service 接口 * diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateServiceImpl.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateServiceImpl.java index 95cec60..e11d896 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateServiceImpl.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/service/wechattemplate/WechatTemplateServiceImpl.java @@ -1,22 +1,23 @@ package co.yixiang.yshop.module.message.service.wechattemplate; -import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplateCreateReqVO; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplateExportReqVO; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplatePageReqVO; +import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.WechatTemplateUpdateReqVO; +import co.yixiang.yshop.module.message.convert.wechattemplate.WechatTemplateConvert; +import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; +import co.yixiang.yshop.module.message.dal.mysql.wechattemplate.WechatTemplateMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import java.util.*; -import co.yixiang.yshop.module.message.controller.admin.wechattemplate.vo.*; -import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; - -import co.yixiang.yshop.module.message.convert.wechattemplate.WechatTemplateConvert; -import co.yixiang.yshop.module.message.dal.mysql.wechattemplate.WechatTemplateMapper; +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.message.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.message.enums.ErrorCodeConstants.WECHAT_TEMPLATE_NOT_EXISTS; /** * 微信模板 Service 实现类 diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java index 5f786de..5e9a79d 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java @@ -5,7 +5,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.exception.ErrorCode; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.service.user.MemberUserService; import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; @@ -150,7 +150,6 @@ public class WeiXinSubscribeService { * @param templateId 模板id * @param page 跳转页面 * @param map map内容 - * @return String */ private void sendSubscribeMsg(String openId, String templateId, String page, Map map){ WxMaSubscribeMessage wxMaSubscribeMessage = WxMaSubscribeMessage.builder() @@ -195,14 +194,14 @@ public class WeiXinSubscribeService { return ""; } - WechatUserDto wechatUserDto = yxUser.getWxProfile(); + WechatUserDTO wechatUserDto = yxUser.getWxProfile(); if(wechatUserDto == null) { return ""; } - if(StrUtil.isBlank(wechatUserDto.getRoutineOpenid())) { + if(StrUtil.isBlank(wechatUserDto.getRoutineOpenId())) { return ""; } - return wechatUserDto.getRoutineOpenid(); + return wechatUserDto.getRoutineOpenId(); } } diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java index fdc9340..16b5bd7 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java @@ -12,7 +12,7 @@ import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.exception.ErrorCode; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.service.user.MemberUserService; import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; @@ -226,14 +226,14 @@ public class WeixinTemplateService { return ""; } - WechatUserDto wechatUserDto = yxUser.getWxProfile(); + WechatUserDTO wechatUserDto = yxUser.getWxProfile(); if(wechatUserDto == null) { return ""; } - if(StrUtil.isBlank(wechatUserDto.getOpenid())) { + if(StrUtil.isBlank(wechatUserDto.getOpenId())) { return ""; } - return wechatUserDto.getOpenid(); + return wechatUserDto.getOpenId(); } diff --git a/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/CpKfServiceStateEnum.java b/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/CpKfServiceStateEnum.java new file mode 100644 index 0000000..e48cade --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/CpKfServiceStateEnum.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.mp.enums; + +import lombok.Getter; + +/** + * @author pepis + * @apiNote + **/ +@Getter +public enum CpKfServiceStateEnum { + UNTREATED(0,"未处理"), + INTELLIGENT(1,"由智能助手接待"), + IN_THE_LINE(2,"待接入池排队中"), + ARTIFICIAL(3,"由人工接待"), + CLOSED(4,"已结束/未开始"), + ; + private final Integer value; + + private final String desc; + + CpKfServiceStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/yshop-module-mp/yshop-module-mp-biz/pom.xml b/yshop-module-mp/yshop-module-mp-biz/pom.xml index d366f7c..226d713 100644 --- a/yshop-module-mp/yshop-module-mp-biz/pom.xml +++ b/yshop-module-mp/yshop-module-mp-biz/pom.xml @@ -94,6 +94,19 @@ yshop-spring-boot-starter-excel + + + com.github.binarywang + weixin-java-miniapp + 4.4.0 + + + + + com.github.binarywang + weixin-java-cp + + diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java new file mode 100644 index 0000000..f54e65a --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java @@ -0,0 +1,147 @@ +package co.yixiang.yshop.module.mp.controller.admin.customerservice; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageParam; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.AddServicerDTO; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.CustomerServiceVO; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.ServicerVO; +import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; +import co.yixiang.yshop.module.mp.service.customerservice.CustomerServiceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpDepartmentService; +import me.chanjar.weixin.cp.api.WxCpKfService; +import me.chanjar.weixin.cp.api.WxCpMediaService; +import me.chanjar.weixin.cp.api.WxCpUserService; +import me.chanjar.weixin.cp.bean.WxCpDepart; +import me.chanjar.weixin.cp.bean.WxCpUser; +import me.chanjar.weixin.cp.bean.kf.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author pepis + * @apiNote + **/ +@Tag(name = "管理后台 - 客服管理") +@RestController +@RequestMapping("/cp/kf") +@Validated +@Slf4j +public class CustomerServiceController { + @Resource + private CustomerServiceService customerServiceService; + + @SneakyThrows + @GetMapping("page") + @Operation(summary = "获取客服列表") + public CommonResult> getAll(PageParam pageParam) { + PageResult pageResult = customerServiceService.page(pageParam); + return CommonResult.success(pageResult); + } + + @SneakyThrows + @PostMapping + @Operation(summary = "新增客服") + public CommonResult save(@RequestBody WxCpKfAccountAdd add){ + WxCpKfAccountAddResp wxCpKfAccountAddResp = customerServiceService.save(add); + return CommonResult.success(wxCpKfAccountAddResp); + } + + @SneakyThrows + @PutMapping + @Operation(summary = "编辑客服") + public CommonResult update(@RequestBody WxCpKfAccountUpd upd){ + customerServiceService.update(upd); + return CommonResult.success(true); + } + + @SneakyThrows + @DeleteMapping + @Operation(summary = "删除客服") + public CommonResult delete(@RequestBody WxCpKfAccountDel del){ + customerServiceService.delete(del); + return CommonResult.success(true); + } + + @SneakyThrows + @GetMapping("listServicer") + @Operation(summary = "客服接待人") + public CommonResult> listServicer(String openKfid){ + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + WxCpUserService userService = WxCpConfiguration.getCpService().getUserService(); + + WxCpKfServicerListResp resp = kfService.listServicer(openKfid); + List list = resp.getServicerList().stream().map(item -> { + ServicerVO servicerVO = new ServicerVO(); + servicerVO.setUserId(item.getUserId()); + servicerVO.setStatus(item.getStatus()); + //获取用户 + try { + WxCpUser user = userService.getById(item.getUserId()); + servicerVO.setName(user.getName()); + } catch (WxErrorException e) { + log.warn("获取接待人信息失败:{}",item.getUserId()); + throw new RuntimeException(e); + } + return servicerVO; + }).collect(Collectors.toList()); + return CommonResult.success(list); + } + @SneakyThrows + @PostMapping("addServicer") + @Operation(summary = "保存接待人") + public CommonResult addServicer(@RequestBody AddServicerDTO dto){ + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + kfService.addServicer(dto.getOpenKfid(),dto.getUserIdList()); + return CommonResult.success(true); + } + + @SneakyThrows + @DeleteMapping("delServicer") + @Operation(summary = "删除接待人") + public CommonResult delServicer(@RequestBody AddServicerDTO dto){ + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + kfService.delServicer(dto.getOpenKfid(),dto.getUserIdList()); + return CommonResult.success(true); + } + + @SneakyThrows + @GetMapping("departmentList") + @Operation(summary = "部门列表") + public CommonResult> departmentList(){ + WxCpDepartmentService departmentService = WxCpConfiguration.getCpService().getDepartmentService(); + List list = departmentService.list(null); + return CommonResult.success(list); + } + + @SneakyThrows + @GetMapping("listUser") + @Operation(summary = "查询部门下用户") + public CommonResult> listUser(Long departId){ + WxCpUserService userService = WxCpConfiguration.getCpService().getUserService(); + List wxCpUsers = userService.listByDepartment(departId, true, 0); + return CommonResult.success(wxCpUsers); + } + + @SneakyThrows + @PostMapping("uploadMaterial") + @Operation(summary = "上传素材") + public CommonResult uploadMaterial(@RequestParam(value = "file") MultipartFile file){ + WxCpMediaService mediaService = WxCpConfiguration.getCpService().getMediaService(); + WxMediaUploadResult upload = mediaService.upload(WxConsts.MediaFileType.IMAGE, file.getOriginalFilename(), file.getInputStream()); + return CommonResult.success(upload); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/AddServicerDTO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/AddServicerDTO.java new file mode 100644 index 0000000..8fea6cf --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/AddServicerDTO.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.mp.controller.admin.customerservice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author pepis + * @apiNote 新增接待人 + **/ +@Data +public class AddServicerDTO { + @Schema(description = "客服ID") + private String openKfid; + + @Schema(description = "接待人id") + private List userIdList; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java new file mode 100644 index 0000000..3d5c8e4 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.mp.controller.admin.customerservice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author pepis + * @apiNote 客服vo + **/ +@Data +public class CustomerServiceVO { + @Schema(description = "客服id") + private String openKfid; + + @Schema(description = "客服名称") + private String name; + + @Schema(description = "客服头像") + private String avatar; + + @Schema(description = "客服地址") + private String accountLink; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/ServicerVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/ServicerVO.java new file mode 100644 index 0000000..39e38d5 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/ServicerVO.java @@ -0,0 +1,14 @@ +package co.yixiang.yshop.module.mp.controller.admin.customerservice.vo; + +import lombok.Data; + +/** + * @author pepis + * @apiNote 接待人员vo + **/ +@Data +public class ServicerVO { + private String userId; + private Integer status; + private String name; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java index 4d9788a..32f2191 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpMaterialPageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java index 4bf2470..42a1d1b 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java @@ -11,11 +11,11 @@ import javax.validation.constraints.NotNull; @Data public class MpMaterialUploadNewsImageReqVO { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; - @Schema(description = "文件附件", required = true) + @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "文件不能为空") @JsonIgnore // 避免被操作日志,进行序列化,导致报错 private MultipartFile file; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java index 8682679..f9ff5e1 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java @@ -15,15 +15,15 @@ import javax.validation.constraints.NotNull; @Data public class MpMaterialUploadPermanentReqVO { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; - @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", required = true, example = "image") + @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "image") @NotEmpty(message = "文件类型不能为空") private String type; - @Schema(description = "文件附件", required = true) + @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "文件不能为空") @JsonIgnore // 避免被操作日志,进行序列化,导致报错 private MultipartFile file; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java index 08e0fb0..cf7c8ca 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java @@ -7,10 +7,10 @@ import lombok.Data; @Data public class MpMaterialUploadRespVO { - @Schema(description = "素材的 media_id", required = true, example = "123") + @Schema(description = "素材的 media_id", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") private String mediaId; - @Schema(description = "素材的 URL", required = true, example = "https://www.yixiang.co/1.png") + @Schema(description = "素材的 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.yixiang.co/1.png") private String url; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java index b6cc3a7..f26b3e1 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java @@ -12,15 +12,15 @@ import javax.validation.constraints.NotNull; @Data public class MpMaterialUploadTemporaryReqVO { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; - @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", required = true, example = "image") + @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "image") @NotEmpty(message = "文件类型不能为空") private String type; - @Schema(description = "文件附件", required = true) + @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "文件不能为空") @JsonIgnore // 避免被操作日志,进行序列化,导致报错 private MultipartFile file; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java index 493034c..cd55eb2 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpAutoReplyCreateReqVO extends MpAutoReplyBaseVO { - @Schema(description = "公众号账号的编号", required = true, example = "1024") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java index 4189123..a67151d 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpAutoReplyUpdateReqVO extends MpAutoReplyBaseVO { - @Schema(description = "主键", required = true, example = "1024") + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "主键不能为空") private Long id; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/WxPortalController.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/WxPortalController.java new file mode 100644 index 0000000..b414106 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/WxPortalController.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.mp.controller.admin.open; + +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; + +/** + * @author Binary Wang + * 企业微信 回调接口 + */ +@RestController +@RequestMapping("/cp/open/{agentId}") +public class WxPortalController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @GetMapping(produces = "text/plain;charset=utf-8") + public String authGet(@PathVariable Integer agentId, + @RequestParam(name = "msg_signature", required = false) String signature, + @RequestParam(name = "timestamp", required = false) String timestamp, + @RequestParam(name = "nonce", required = false) String nonce, + @RequestParam(name = "echostr", required = false) String echostr) { + logger.info("\n接收到来自微信服务器的认证消息:signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]", + signature, timestamp, nonce, echostr); + + if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) { + throw new IllegalArgumentException("请求参数非法,请核实!"); + } + + final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId); + if (wxCpService == null) { + throw new IllegalArgumentException(String.format("未找到对应agentId=[%d]的配置,请核实!", agentId)); + } + + if (wxCpService.checkSignature(signature, timestamp, nonce, echostr)) { + return new WxCpCryptUtil(wxCpService.getWxCpConfigStorage()).decrypt(echostr); + } + + return "非法请求"; + } + + @PostMapping(produces = "application/xml; charset=UTF-8") + public String post(@PathVariable Integer agentId, + @RequestBody String requestBody, + @RequestParam("msg_signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce) { + logger.info("\n接收微信请求:[signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + signature, timestamp, nonce, requestBody); + + final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId); + WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(requestBody, wxCpService.getWxCpConfigStorage(), + timestamp, nonce, signature); + logger.debug("\n消息解密后内容为:\n{} ", JsonUtils.toJsonString(inMessage)); + WxCpXmlOutMessage outMessage = this.route(agentId, inMessage); + if (outMessage == null) { + return ""; + } + + String out = outMessage.toEncryptedXml(wxCpService.getWxCpConfigStorage()); + logger.debug("\n组装回复信息:{}", out); + return out; + } + + private WxCpXmlOutMessage route(Integer agentId, WxCpXmlMessage message) { + try { + return WxCpConfiguration.getRouters().get(agentId).route(message); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + + return null; + } + + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java index 9122c0b..8ab3bf2 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java @@ -13,7 +13,7 @@ import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_ @Data public class MpStatisticsGetReqVO { - @Schema(description = "公众号账号的编号", required = true, example = "1024") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java index 4b2d927..8ccb403 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java @@ -9,19 +9,19 @@ import java.util.Date; @Data public class MpStatisticsInterfaceSummaryRespVO { - @Schema(description = "日期", required = true) + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) private Date refDate; - @Schema(description = "通过服务器配置地址获得消息后,被动回复粉丝消息的次数", required = true, example = "10") + @Schema(description = "通过服务器配置地址获得消息后,被动回复粉丝消息的次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") private Integer callbackCount; - @Schema(description = "上述动作的失败次数", required = true, example = "20") + @Schema(description = "上述动作的失败次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") private Integer failCount; - @Schema(description = "总耗时,除以 callback_count 即为平均耗时", required = true, example = "30") + @Schema(description = "总耗时,除以 callback_count 即为平均耗时", requiredMode = Schema.RequiredMode.REQUIRED, example = "30") private Integer totalTimeCost; - @Schema(description = "最大耗时", required = true, example = "40") + @Schema(description = "最大耗时", requiredMode = Schema.RequiredMode.REQUIRED, example = "40") private Integer maxTimeCost; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java index 16d6d8f..769c9ad 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java @@ -9,13 +9,13 @@ import java.util.Date; @Data public class MpStatisticsUpstreamMessageRespVO { - @Schema(description = "日期", required = true) + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) private Date refDate; - @Schema(description = "上行发送了(向公众号发送了)消息的粉丝数", required = true, example = "10") + @Schema(description = "上行发送了(向公众号发送了)消息的粉丝数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") private Integer messageUser; - @Schema(description = "上行发送了消息的消息总数", required = true, example = "20") + @Schema(description = "上行发送了消息的消息总数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") private Integer messageCount; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java index a1ff9b8..d215fd7 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java @@ -9,10 +9,10 @@ import java.util.Date; @Data public class MpStatisticsUserCumulateRespVO { - @Schema(description = "日期", required = true) + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) private Date refDate; - @Schema(description = "累计粉丝量", required = true, example = "10") + @Schema(description = "累计粉丝量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") private Integer cumulateUser; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java index b09aaab..de77d9f 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java @@ -9,16 +9,16 @@ import java.util.Date; @Data public class MpStatisticsUserSummaryRespVO { - @Schema(description = "日期", required = true) + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) private Date refDate; - @Schema(description = "粉丝来源", required = true, example = "0") + @Schema(description = "粉丝来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") private Integer userSource; - @Schema(description = "新关注的粉丝数量", required = true, example = "10") + @Schema(description = "新关注的粉丝数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") private Integer newUser; - @Schema(description = "取消关注的粉丝数量", required = true, example = "20") + @Schema(description = "取消关注的粉丝数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") private Integer cancelUser; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppCustomerServiceController.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppCustomerServiceController.java new file mode 100644 index 0000000..ea5cde4 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppCustomerServiceController.java @@ -0,0 +1,57 @@ +package co.yixiang.yshop.module.mp.controller.app.mini; + +import cn.hutool.core.util.RandomUtil; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.mp.controller.app.mini.vo.AppCustomerServiceVO; +import co.yixiang.yshop.module.mp.dal.dataobject.customerservice.CustomerServiceDO; +import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; +import co.yixiang.yshop.module.mp.service.customerservice.CustomerServiceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpKfService; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountLink; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountLinkResp; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author pepis + * @apiNote 用户 APP - 客服 + **/ +@Slf4j +@RestController +@Tag(name = "用户 APP - 客服") +@RequestMapping("/cp/kf") +public class AppCustomerServiceController { + @Resource + private CustomerServiceService customerServiceService; + + @SneakyThrows + @GetMapping + @Operation(summary = "获取客服") + public CommonResult getCustomerService() { + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + //客服列表 + List list = customerServiceService.list(); + CustomerServiceDO customerServiceDO = RandomUtil.randomEle(list); + AppCustomerServiceVO appCustomerServiceVO = new AppCustomerServiceVO(); + appCustomerServiceVO.setCorpId(WxCpConfiguration.corpId); + try { + WxCpKfAccountLink link = new WxCpKfAccountLink(); + link.setOpenKfid(customerServiceDO.getOpenKfid()); + WxCpKfAccountLinkResp accountLink = kfService.getAccountLink(link); + appCustomerServiceVO.setAccountLink(accountLink.getUrl()); + } catch (WxErrorException e) { + log.warn("获取客服链接失败:{}", customerServiceDO.getOpenKfid()); + throw new RuntimeException(e); + } + return CommonResult.success(appCustomerServiceVO); + } +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppMiniProgramController.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppMiniProgramController.java new file mode 100644 index 0000000..ecaa571 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/AppMiniProgramController.java @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + * 注意: + * 本软件为www.yixiang.co开发研制,未经购买不得使用 + * 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台) + * 一经发现盗用、分享等行为,将追究法律责任,后果自负 + */ +package co.yixiang.yshop.module.mp.controller.app.mini; + + +import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Base64; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + + +/** + *

+ * 小程序 + *

+ * + * @author moxiangrong + * @since 2024-01-21 + */ +@Slf4j +@RestController +@Tag(name = "用户 APP - 小程序") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/mini") +public class AppMiniProgramController { + + @Autowired + private WxMaService wxMaService; + + /** + * 获取小程序二维码 + */ + @PostMapping("/getQRCode") + @Operation(summary = "获取小程序二维码") + @PreAuthenticated + public CommonResult getQRCode(HttpServletResponse response) { + OutputStream outputStream = null; + try { + WxMaQrcodeService wxMaQrcodeService = wxMaService.getQrcodeService(); + /* 获取二维码字节数组 */ + byte[] bytes = wxMaQrcodeService.createWxaCodeUnlimitBytes + ("hello,test", "", false,"release",430, true, + new WxMaCodeLineColor("0", "0", "0"), true); + /* 设置返回文件类型,不设置前端识别不了 */ + response.setContentType(MediaType.IMAGE_JPEG_VALUE); + outputStream = response.getOutputStream(); + outputStream.write(bytes); + outputStream.flush(); + } catch (Exception ex) { + log.info("生成小程序码失败,message:{}", ex.getMessage()); + } finally { + try { + outputStream.close(); + } catch (Exception ex) { + log.error("关闭IO流失败,msg:{}", ex.getMessage()); + } + } + return success(""); + } +} + diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/vo/AppCustomerServiceVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/vo/AppCustomerServiceVO.java new file mode 100644 index 0000000..045a20d --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/app/mini/vo/AppCustomerServiceVO.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.mp.controller.app.mini.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class AppCustomerServiceVO { + @Schema(description = "企业id") + private String corpId; + + @Schema(description = "客服地址") + private String accountLink; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java new file mode 100644 index 0000000..1f001a1 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java @@ -0,0 +1,48 @@ +package co.yixiang.yshop.module.mp.dal.dataobject.customerservice; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 客服 DO + * + * @author yshop + */ +@TableName("yshop_customer_service") +@KeySequence("yshop_customer_service_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CustomerServiceDO extends BaseDO { + /** + * 编号 + */ + @TableId + private Long id; + + /** + * 商家ID + */ + private String shopId; + + /** + * 微信客服id + */ + private String openKfid; + + /** + * 客服名称 + */ + private String name; + + /** + * 客服头像 + */ + private String avatar; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java index 26bba9c..7dd823c 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java @@ -30,9 +30,9 @@ import java.util.Set; @ToString(callSuper = true) public class MpAutoReplyDO extends BaseDO { - public static Set REQUEST_MESSAGE_TYPE = SetUtils.asSet(XmlMsgType.TEXT, XmlMsgType.IMAGE, - XmlMsgType.VOICE, XmlMsgType.VIDEO, XmlMsgType.SHORTVIDEO, - XmlMsgType.LOCATION, XmlMsgType.LINK); + public static Set REQUEST_MESSAGE_TYPE = SetUtils.asSet(WxConsts.XmlMsgType.TEXT, WxConsts.XmlMsgType.IMAGE, + WxConsts.XmlMsgType.VOICE, WxConsts.XmlMsgType.VIDEO, WxConsts.XmlMsgType.SHORTVIDEO, + WxConsts.XmlMsgType.LOCATION, WxConsts.XmlMsgType.LINK); /** * 主键 @@ -97,14 +97,14 @@ public class MpAutoReplyDO extends BaseDO { /** * 回复的消息内容 * - * 消息类型为 {@link XmlMsgType} 的 TEXT + * 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT */ private String responseContent; /** * 回复的媒体 id * - * 消息类型为 {@link XmlMsgType} 的 IMAGE、VOICE、VIDEO + * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO */ private String responseMediaId; /** @@ -115,33 +115,33 @@ public class MpAutoReplyDO extends BaseDO { /** * 回复的标题 * - * 消息类型为 {@link XmlMsgType} 的 VIDEO + * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO */ private String responseTitle; /** * 回复的描述 * - * 消息类型为 {@link XmlMsgType} 的 VIDEO + * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO */ private String responseDescription; /** * 回复的缩略图的媒体 id,通过素材管理中的接口上传多媒体文件,得到的 id * - * 消息类型为 {@link XmlMsgType} 的 MUSIC、VIDEO + * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO */ private String responseThumbMediaId; /** * 回复的缩略图的媒体 URL * - * 消息类型为 {@link XmlMsgType} 的 MUSIC、VIDEO + * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO */ private String responseThumbMediaUrl; /** * 回复的图文消息 * - * 消息类型为 {@link XmlMsgType} 的 NEWS + * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS */ @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class) private List responseArticles; @@ -149,7 +149,7 @@ public class MpAutoReplyDO extends BaseDO { /** * 回复的音乐链接 * - * 消息类型为 {@link XmlMsgType} 的 MUSIC + * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC */ private String responseMusicUrl; /** @@ -157,7 +157,7 @@ public class MpAutoReplyDO extends BaseDO { * * WIFI 环境优先使用该链接播放音乐 * - * 消息类型为 {@link XmlMsgType} 的 MUSIC + * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC */ private String responseHqMusicUrl; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/mysql/customerservice/CustomerServiceMapper.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/mysql/customerservice/CustomerServiceMapper.java new file mode 100644 index 0000000..967b2f4 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/mysql/customerservice/CustomerServiceMapper.java @@ -0,0 +1,13 @@ +package co.yixiang.yshop.module.mp.dal.mysql.customerservice; + +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.mp.dal.dataobject.customerservice.CustomerServiceDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author pepis + * @apiNote + **/ +@Mapper +public interface CustomerServiceMapper extends BaseMapperX { +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/AbstractBuilder.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/AbstractBuilder.java new file mode 100644 index 0000000..71935c7 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/AbstractBuilder.java @@ -0,0 +1,16 @@ +package co.yixiang.yshop.module.mp.framework.cp.builder; + +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Binary Wang + */ +public abstract class AbstractBuilder { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + public abstract WxCpXmlOutMessage build(String content, WxCpXmlMessage wxMessage, WxCpService service); +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/ImageBuilder.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/ImageBuilder.java new file mode 100644 index 0000000..9531842 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/ImageBuilder.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.mp.framework.cp.builder; + +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutImageMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; + + +/** + * @author Binary Wang + */ +public class ImageBuilder extends AbstractBuilder { + + @Override + public WxCpXmlOutMessage build(String content, WxCpXmlMessage wxMessage, + WxCpService service) { + + WxCpXmlOutImageMessage m = WxCpXmlOutMessage.IMAGE().mediaId(content) + .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) + .build(); + + return m; + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/TextBuilder.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/TextBuilder.java new file mode 100644 index 0000000..6bbbd68 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/builder/TextBuilder.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.mp.framework.cp.builder; + +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTextMessage; + +/** + * @author Binary Wang + */ +public class TextBuilder extends AbstractBuilder { + + @Override + public WxCpXmlOutMessage build(String content, WxCpXmlMessage wxMessage, + WxCpService service) { + WxCpXmlOutTextMessage m = WxCpXmlOutMessage.TEXT().content(content) + .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) + .build(); + return m; + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpConfiguration.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpConfiguration.java new file mode 100644 index 0000000..ad3b74b --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpConfiguration.java @@ -0,0 +1,130 @@ +package co.yixiang.yshop.module.mp.framework.cp.config; + +import co.yixiang.yshop.module.mp.service.handler.cp.EnterSessionHandler; +import co.yixiang.yshop.module.mp.service.handler.cp.LogHandler; +import co.yixiang.yshop.module.mp.service.handler.cp.MsgHandler; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; +import me.chanjar.weixin.cp.message.WxCpMessageRouter; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 单实例配置 + * + * @author Binary Wang + */ +@Configuration +@EnableConfigurationProperties(WxCpProperties.class) +@RequiredArgsConstructor +public class WxCpConfiguration { + private final LogHandler logHandler; + private final MsgHandler msgHandler; + private final EnterSessionHandler enterSessionHandler; + private final WxCpProperties properties; + + + private static Map routers = Maps.newHashMap(); + private static Map cpServices = Maps.newHashMap(); + + private static Integer defaultAgentId; + + public static String corpId; + + public static Map getRouters() { + return routers; + } + + /** + * 根据应用代理id获取WxCpService + * @return / + */ + public static WxCpService getCpService(Integer agentId) { + return cpServices.get(agentId); + } + + /** + * 获取WxCpService 默认第一个 + * @return / + */ + public static WxCpService getCpService() { + return cpServices.get(defaultAgentId); + } + + @PostConstruct + public void initServices() { + defaultAgentId = this.properties.getAppConfigs().get(0).getAgentId(); + corpId = this.properties.getCorpId(); + + cpServices = this.properties.getAppConfigs().stream().map(a -> { + WxCpDefaultConfigImpl configStorage = new WxCpDefaultConfigImpl(); + configStorage.setCorpId(this.properties.getCorpId()); + configStorage.setAgentId(a.getAgentId()); + configStorage.setCorpSecret(a.getSecret()); + configStorage.setToken(a.getToken()); + configStorage.setAesKey(a.getAesKey()); + WxCpServiceImpl service = new WxCpServiceImpl(); + service.setWxCpConfigStorage(configStorage); + routers.put(a.getAgentId(), this.newRouter(service)); + return service; + }).collect(Collectors.toMap(service -> service.getWxCpConfigStorage().getAgentId(), a -> a)); + } + + private WxCpMessageRouter newRouter(WxCpService wxCpService) { + final WxCpMessageRouter newRouter = new WxCpMessageRouter(wxCpService); + + // 记录所有事件的日志 (异步执行) + newRouter.rule().handler(this.logHandler).next(); + + // 自定义菜单事件 +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) +// .event(WxConsts.MenuButtonType.CLICK).handler(this.menuHandler).end(); +// +// // 点击菜单链接事件(这里使用了一个空的处理器,可以根据自己需要进行扩展) +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) +// .event(WxConsts.MenuButtonType.VIEW).handler(this.nullHandler).end(); +// +// // 关注事件 +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) +// .event(WxConsts.EventType.SUBSCRIBE).handler(this.subscribeHandler) +// .end(); +// +// // 取消关注事件 +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) +// .event(WxConsts.EventType.UNSUBSCRIBE) +// .handler(this.unsubscribeHandler).end(); +// +// // 上报地理位置事件 +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) +// .event(WxConsts.EventType.LOCATION).handler(this.locationHandler) +// .end(); +// +// // 接收地理位置消息 +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION) +// .handler(this.locationHandler).end(); +// +// // 扫码事件(这里使用了一个空的处理器,可以根据自己需要进行扩展) +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) +// .event(WxConsts.EventType.SCAN).handler(this.nullHandler).end(); +// +// +// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.) +// .event(WxCpConsts.EventType.ENTER_AGENT).handler(new EnterAgentHandler()).end(); + // 用户进入会话事件 + newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) + .event("kf_msg_or_event").handler(enterSessionHandler).end(); + // 默认 + newRouter.rule().async(false).handler(this.msgHandler).end(); + + return newRouter; + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpProperties.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpProperties.java new file mode 100644 index 0000000..41d75c6 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpProperties.java @@ -0,0 +1,54 @@ +package co.yixiang.yshop.module.mp.framework.cp.config; + +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +/** + * @author Binary Wang + */ +@Data +@ConfigurationProperties(prefix = "wx.cp") +public class WxCpProperties { + /** + * 设置企业微信的corpId + */ + private String corpId; + + private List appConfigs; + + @Getter + @Setter + public static class AppConfig { + /** + * 设置企业微信应用的AgentId + */ + private Integer agentId; + + /** + * 设置企业微信应用的Secret + */ + private String secret; + + /** + * 设置企业微信应用的token + */ + private String token; + + /** + * 设置企业微信应用的EncodingAESKey + */ + private String aesKey; + + } + + @Override + public String toString() { + return JsonUtils.toJsonString(this); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpTest.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpTest.java new file mode 100644 index 0000000..84d7e75 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/cp/config/WxCpTest.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.mp.framework.cp.config; + +import lombok.SneakyThrows; +import me.chanjar.weixin.cp.api.WxCpMessageService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.message.WxCpMessage; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; + +/** + * @author pepis + * @apiNote + **/ +public class WxCpTest { + @SneakyThrows + public static void main(String[] args) { + WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl(); + config.setCorpId("wwf6e740daf74076e3"); // 设置微信企业号的appid + config.setCorpSecret("EjFXqvCeJ9ihLo2PLlOsX0pY4XVbV1qDbQY_5V5vpag"); // 设置微信企业号的app corpSecret + config.setAgentId(1000002); // 设置微信企业号应用ID + config.setToken("ELV"); // 设置微信企业号应用的token + config.setAesKey("G8rwnJtzSqs6me8ssHofuJ7tFgngWeFTnMXAHD4OEoi"); // 设置微信企业号应用的EncodingAESKey + + WxCpServiceImpl wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(config); + + String userId = "TianYong"; + WxCpMessage message = WxCpMessage.TEXT().agentId(1000002).toUser(userId).content("Hello World").build(); + WxCpMessageService messageService = wxCpService.getMessageService(); + messageService.send(message); + } +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/config/MpConfiguration.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/config/MpConfiguration.java index 45ac847..10c948b 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/config/MpConfiguration.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/config/MpConfiguration.java @@ -2,16 +2,16 @@ package co.yixiang.yshop.module.mp.framework.mp.config; import co.yixiang.yshop.module.mp.framework.mp.core.DefaultMpServiceFactory; import co.yixiang.yshop.module.mp.framework.mp.core.MpServiceFactory; -import co.yixiang.yshop.module.mp.service.handler.menu.MenuHandler; -import co.yixiang.yshop.module.mp.service.handler.message.MessageReceiveHandler; -import co.yixiang.yshop.module.mp.service.handler.message.MessageAutoReplyHandler; -import co.yixiang.yshop.module.mp.service.handler.other.KfSessionHandler; -import co.yixiang.yshop.module.mp.service.handler.other.NullHandler; -import co.yixiang.yshop.module.mp.service.handler.other.ScanHandler; -import co.yixiang.yshop.module.mp.service.handler.other.StoreCheckNotifyHandler; -import co.yixiang.yshop.module.mp.service.handler.user.LocationHandler; -import co.yixiang.yshop.module.mp.service.handler.user.SubscribeHandler; -import co.yixiang.yshop.module.mp.service.handler.user.UnsubscribeHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.menu.MenuHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.message.MessageReceiveHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.message.MessageAutoReplyHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.KfSessionHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.NullHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.ScanHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.StoreCheckNotifyHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.user.LocationHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.user.SubscribeHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.user.UnsubscribeHandler; import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; import org.springframework.context.annotation.Bean; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/core/DefaultMpServiceFactory.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/core/DefaultMpServiceFactory.java index eda402e..2de67e0 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/core/DefaultMpServiceFactory.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/framework/mp/core/DefaultMpServiceFactory.java @@ -1,16 +1,16 @@ package co.yixiang.yshop.module.mp.framework.mp.core; import co.yixiang.yshop.module.mp.dal.dataobject.account.MpAccountDO; -import co.yixiang.yshop.module.mp.service.handler.menu.MenuHandler; -import co.yixiang.yshop.module.mp.service.handler.message.MessageReceiveHandler; -import co.yixiang.yshop.module.mp.service.handler.message.MessageAutoReplyHandler; -import co.yixiang.yshop.module.mp.service.handler.other.KfSessionHandler; -import co.yixiang.yshop.module.mp.service.handler.other.NullHandler; -import co.yixiang.yshop.module.mp.service.handler.other.ScanHandler; -import co.yixiang.yshop.module.mp.service.handler.other.StoreCheckNotifyHandler; -import co.yixiang.yshop.module.mp.service.handler.user.LocationHandler; -import co.yixiang.yshop.module.mp.service.handler.user.SubscribeHandler; -import co.yixiang.yshop.module.mp.service.handler.user.UnsubscribeHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.menu.MenuHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.message.MessageAutoReplyHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.message.MessageReceiveHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.KfSessionHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.NullHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.ScanHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.other.StoreCheckNotifyHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.user.LocationHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.user.SubscribeHandler; +import co.yixiang.yshop.module.mp.service.handler.mp.user.UnsubscribeHandler; import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; import com.google.common.collect.Maps; import lombok.RequiredArgsConstructor; @@ -48,6 +48,7 @@ public class DefaultMpServiceFactory implements MpServiceFactory { */ private volatile Map mpMessageRouters; + private final RedisTemplateWxRedisOps redisTemplateWxRedisOps; private final WxMpProperties mpProperties; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java new file mode 100644 index 0000000..335b906 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.mp.service.customerservice; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.CustomerServiceVO; +import co.yixiang.yshop.module.mp.dal.dataobject.customerservice.CustomerServiceDO; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountAdd; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountAddResp; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountDel; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountUpd; + +import java.util.List; + +/** + * @author pepis + * @apiNote + **/ +public interface CustomerServiceService { + PageResult page(PageParam pageParam); + + WxCpKfAccountAddResp save(WxCpKfAccountAdd add); + + void update(WxCpKfAccountUpd upd); + + void delete(WxCpKfAccountDel del); + + List list(); +} + diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java new file mode 100644 index 0000000..060dadf --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java @@ -0,0 +1,98 @@ +package co.yixiang.yshop.module.mp.service.customerservice; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.CustomerServiceVO; +import co.yixiang.yshop.module.mp.dal.dataobject.customerservice.CustomerServiceDO; +import co.yixiang.yshop.module.mp.dal.mysql.customerservice.CustomerServiceMapper; +import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpKfService; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; +import me.chanjar.weixin.cp.bean.kf.*; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author pepis + * @apiNote + **/ +@Service +@Slf4j +public class CustomerServiceServiceImpl implements CustomerServiceService{ + @Resource + private CustomerServiceMapper mapper; + + @Override + public PageResult page(PageParam pageParam) { + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + //客服列表 + PageResult page = mapper.selectPage(pageParam,Wrappers.emptyWrapper()); + List collect = page.getList().stream().map(item -> { + CustomerServiceVO customerServiceVO = new CustomerServiceVO(); + customerServiceVO.setName(item.getName()); + customerServiceVO.setAvatar(item.getAvatar()); + customerServiceVO.setOpenKfid(item.getOpenKfid()); + //客服链接 + WxCpKfAccountLink link = new WxCpKfAccountLink(); + link.setOpenKfid(item.getOpenKfid()); + try { + WxCpKfAccountLinkResp accountLink = kfService.getAccountLink(link); + customerServiceVO.setAccountLink(accountLink.getUrl()); + } catch (WxErrorException e) { + log.warn("获取客服链接失败:{}",item.getOpenKfid()); + throw new RuntimeException(e); + } + return customerServiceVO; + }).collect(Collectors.toList()); + + PageResult pageResult = PageResult.empty(); + pageResult.setList(collect); + pageResult.setTotal(page.getTotal()); + return pageResult; + } + + @Override + @SneakyThrows + public WxCpKfAccountAddResp save(WxCpKfAccountAdd add) { + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + WxCpKfAccountAddResp wxCpKfAccountAddResp = kfService.addAccount(add); + CustomerServiceDO customerServiceDO = new CustomerServiceDO(); + customerServiceDO.setName(add.getName()); + customerServiceDO.setAvatar(add.getMediaId()); + customerServiceDO.setOpenKfid(wxCpKfAccountAddResp.getOpenKfid()); + mapper.insert(customerServiceDO); + return wxCpKfAccountAddResp; + } + + @SneakyThrows + @Override + public void update(WxCpKfAccountUpd upd) { + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + WxCpBaseResp resp = kfService.updAccount(upd); + CustomerServiceDO customerServiceDO = new CustomerServiceDO(); + customerServiceDO.setName(upd.getName()); + customerServiceDO.setAvatar(upd.getMediaId()); + customerServiceDO.setOpenKfid(upd.getOpenKfid()); + mapper.update(customerServiceDO,Wrappers.lambdaUpdate().eq(CustomerServiceDO::getOpenKfid, upd.getOpenKfid())); + } + + @SneakyThrows + @Override + public void delete(WxCpKfAccountDel del) { + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + WxCpBaseResp resp = kfService.delAccount(del); + mapper.delete(Wrappers.lambdaUpdate().eq(CustomerServiceDO::getOpenKfid,del.getOpenKfid())); + } + + @Override + public List list() { + return mapper.selectList(); + } +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/AbstractHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/AbstractHandler.java new file mode 100644 index 0000000..3f37c77 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/AbstractHandler.java @@ -0,0 +1,12 @@ +package co.yixiang.yshop.module.mp.service.handler.cp; + +import me.chanjar.weixin.cp.message.WxCpMessageHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Binary Wang + */ +public abstract class AbstractHandler implements WxCpMessageHandler { + protected Logger logger = LoggerFactory.getLogger(getClass()); +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/EnterSessionHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/EnterSessionHandler.java new file mode 100644 index 0000000..e77854f --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/EnterSessionHandler.java @@ -0,0 +1,82 @@ +package co.yixiang.yshop.module.mp.service.handler.cp; + +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import co.yixiang.yshop.module.mp.framework.cp.builder.TextBuilder; +import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.cp.api.WxCpKfService; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.kf.*; +import me.chanjar.weixin.cp.bean.kf.msg.WxCpKfTextMsg; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +import static co.yixiang.yshop.module.mp.enums.CpKfServiceStateEnum.*; + +/** + * @author pepis + * @apiNote 用户进入会话事件 消息处理器 + **/ +@Component +public class EnterSessionHandler extends AbstractHandler { + @Resource + private RedisTemplate redisTemplate; + + public static final String MSG_CURSOR = "kf_msg_cursor"; + + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, WxSessionManager sessionManager) throws WxErrorException { + Map allFieldsMap = wxMessage.getAllFieldsMap(); + String token = (String) allFieldsMap.get("Token"); + String openKfId = (String) allFieldsMap.get("OpenKfId"); + WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); + logger.info("\nEnterSessionHandler接收到请求消息,内容:{}", JsonUtils.toJsonString(wxMessage)); + String nextCursor = (String) redisTemplate.opsForValue().get(MSG_CURSOR); + boolean hasMore = true; + while (hasMore) { + WxCpKfMsgListResp kfMsgListResp = kfService.syncMsg(nextCursor, token, null, null,openKfId); + logger.info("\nEnterSessionHandler同步消息,内容:{}", JsonUtils.toJsonString(kfMsgListResp)); + + String welcomeCode = wxMessage.getWelcomeCode(); + + for (WxCpKfMsgListResp.WxCpKfMsgItem msgItem : kfMsgListResp.getMsgList()) { + + String externalUserId = msgItem.getExternalUserId(); + try { + WxCpKfServiceStateResp stateResp = kfService.getServiceState(openKfId, externalUserId); + logger.info("stateResp {} {} {} {}", openKfId, externalUserId, welcomeCode, stateResp.getServiceState()); + if (stateResp.getServiceState().equals(UNTREATED.getValue()) || stateResp.getServiceState().equals(INTELLIGENT.getValue())) { + if (StringUtils.isNotBlank(welcomeCode)) { + //发送只能客服欢迎语 + WxCpKfMsgSendRequest sendRequest = new WxCpKfMsgSendRequest(); + sendRequest.setCode(welcomeCode); + sendRequest.setMsgType(WxConsts.XmlMsgType.TEXT); + WxCpKfTextMsg msg = new WxCpKfTextMsg(); + msg.setContent("欢迎咨询,正在为您安排客服人员,请稍候!"); + sendRequest.setText(msg); + WxCpKfMsgSendResp sendResp = kfService.sendMsgOnEvent(sendRequest); + logger.info("sendResp errcode {}, errmsg {}", sendResp.getErrcode(), sendResp.getErrmsg()); + } + WxCpKfServiceStateTransResp transResp = kfService.transServiceState(openKfId, externalUserId, IN_THE_LINE.getValue(), null); + logger.info("transResp {}", transResp); + } + } catch (Exception e) { + logger.error("transServiceState fail {}", e.getMessage(), e); + } + Integer msgHasMore = kfMsgListResp.getHasMore(); + hasMore = msgHasMore != null && msgHasMore == 1; + nextCursor = kfMsgListResp.getNextCursor(); + } + redisTemplate.opsForValue().set(MSG_CURSOR, nextCursor); + } + return new TextBuilder().build(JsonUtils.toJsonString(wxMessage), wxMessage, wxCpService); + } +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/LogHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/LogHandler.java new file mode 100644 index 0000000..871976c --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/LogHandler.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.mp.service.handler.cp; + +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author Binary Wang + */ +@Component +public class LogHandler extends AbstractHandler { + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService, + WxSessionManager sessionManager) { + logger.info("\nLogHandler接收到请求消息,内容:{}", JsonUtils.toJsonString(wxMessage)); + return null; + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/MsgHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/MsgHandler.java new file mode 100644 index 0000000..039e706 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/cp/MsgHandler.java @@ -0,0 +1,40 @@ +package co.yixiang.yshop.module.mp.service.handler.cp; + +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import co.yixiang.yshop.module.mp.framework.cp.builder.TextBuilder; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author Binary Wang + */ +@Component +public class MsgHandler extends AbstractHandler { + + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService, + WxSessionManager sessionManager) { + logger.info("\nMsgHandler接收到请求消息,内容:{}", JsonUtils.toJsonString(wxMessage)); + final String msgType = wxMessage.getMsgType(); + if (msgType == null) { + // 如果msgType没有,就自己根据具体报文内容做处理 + } + + if (!msgType.equals(WxConsts.XmlMsgType.EVENT)) { + //TODO 可以选择将消息保存到本地 + } + + //TODO 组装回复消息 + String content = "收到信息内容:" + JsonUtils.toJsonString(wxMessage); + + return new TextBuilder().build(content, wxMessage, cpService); + + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/menu/MenuHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/menu/MenuHandler.java new file mode 100644 index 0000000..a7dd753 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/menu/MenuHandler.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.menu; + +import co.yixiang.yshop.module.mp.framework.mp.core.context.MpContextHolder; +import co.yixiang.yshop.module.mp.service.menu.MpMenuService; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 自定义菜单的事件处理器 + * 逻辑:粉丝点击菜单时,触发对应的回复 + * + * @author yshop + */ +@Component +public class MenuHandler implements WxMpMessageHandler { + + @Resource + private MpMenuService mpMenuService; + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService weixinService, WxSessionManager sessionManager) { + return mpMenuService.reply(MpContextHolder.getAppId(), wxMessage.getEventKey(), wxMessage.getFromUser()); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageAutoReplyHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageAutoReplyHandler.java new file mode 100644 index 0000000..314ed46 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageAutoReplyHandler.java @@ -0,0 +1,41 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.message; + +import co.yixiang.yshop.module.mp.dal.dataobject.message.MpAutoReplyDO; +import co.yixiang.yshop.module.mp.framework.mp.core.context.MpContextHolder; +import co.yixiang.yshop.module.mp.service.message.MpAutoReplyService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 自动回复消息的事件处理器 + * + * @author yshop + */ +@Component +@Slf4j +public class MessageAutoReplyHandler implements WxMpMessageHandler { + + @Resource + private MpAutoReplyService mpAutoReplyService; + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService weixinService, WxSessionManager sessionManager) { + // 只处理指定类型的消息 + if (!MpAutoReplyDO.REQUEST_MESSAGE_TYPE.contains(wxMessage.getMsgType())) { + return null; + } + + // 自动回复 + return mpAutoReplyService.replyForMessage(MpContextHolder.getAppId(), wxMessage); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageReceiveHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageReceiveHandler.java new file mode 100644 index 0000000..b746ccc --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/message/MessageReceiveHandler.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.message; + +import co.yixiang.yshop.module.mp.framework.mp.core.context.MpContextHolder; +import co.yixiang.yshop.module.mp.service.message.MpMessageService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 保存微信消息的事件处理器 + * + * @author yshop + */ +@Component +@Slf4j +public class MessageReceiveHandler implements WxMpMessageHandler { + + @Resource + private MpMessageService mpMessageService; + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + log.info("[handle][接收到请求消息,内容:{}]", wxMessage); + mpMessageService.receiveMessage(MpContextHolder.getAppId(), wxMessage); + return null; + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/KfSessionHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/KfSessionHandler.java new file mode 100644 index 0000000..1c26660 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/KfSessionHandler.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.other; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 接收客服会话管理的事件处理器 + * + * @author yshop + */ +@Component +public class KfSessionHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + throw new UnsupportedOperationException("未实现该处理,请自行重写"); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/NullHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/NullHandler.java new file mode 100644 index 0000000..f189c8a --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/NullHandler.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.other; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 点击菜单连接的事件处理器 + */ +@Component +public class NullHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + throw new UnsupportedOperationException("未实现该处理,请自行重写"); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/ScanHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/ScanHandler.java new file mode 100644 index 0000000..4a3ec85 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/ScanHandler.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.other; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 扫码的事件处理器 + */ +@Component +public class ScanHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMpXmlMessage, Map context, + WxMpService wxMpService, WxSessionManager wxSessionManager) throws WxErrorException { + throw new UnsupportedOperationException("未实现该处理,请自行重写"); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/StoreCheckNotifyHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/StoreCheckNotifyHandler.java new file mode 100644 index 0000000..dac1981 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/StoreCheckNotifyHandler.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.other; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 门店审核事件的事件处理器 + */ +@Component +public class StoreCheckNotifyHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + throw new UnsupportedOperationException("未实现该处理,请自行重写"); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/package-info.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/package-info.java new file mode 100644 index 0000000..30f6cc3 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/other/package-info.java @@ -0,0 +1,4 @@ +/** + * 本包内的 handler 都是一些不重要的,所以放在 other 其它里 + */ +package co.yixiang.yshop.module.mp.service.handler.mp.other; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/LocationHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/LocationHandler.java new file mode 100644 index 0000000..9af9cea --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/LocationHandler.java @@ -0,0 +1,49 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.user; + +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.yshop.framework.common.util.object.ObjectUtils; +import co.yixiang.yshop.module.mp.framework.mp.core.context.MpContextHolder; +import co.yixiang.yshop.module.mp.service.message.MpAutoReplyService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 上报地理位置的事件处理器 + * + * 触发操作:打开微信公众号 -> 点击 + 号 -> 选择「语音」 + * + * 逻辑:粉丝上传地理位置时,也可以触发自动回复 + * + * @author yshop + */ +@Component +@Slf4j +public class LocationHandler implements WxMpMessageHandler { + + @Resource + private MpAutoReplyService mpAutoReplyService; + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + // 防御性编程:必须是 LOCATION 消息 + if (ObjectUtil.notEqual(wxMessage.getMsgType(), WxConsts.XmlMsgType.LOCATION)) { + return null; + } + log.info("[handle][上报地理位置,纬度({})、经度({})、精度({})", wxMessage.getLatitude(), + wxMessage.getLongitude(), wxMessage.getPrecision()); + + // 自动回复 + return mpAutoReplyService.replyForMessage(MpContextHolder.getAppId(), wxMessage); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/SubscribeHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/SubscribeHandler.java new file mode 100644 index 0000000..94210d5 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/SubscribeHandler.java @@ -0,0 +1,52 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.user; + +import co.yixiang.yshop.module.mp.framework.mp.core.context.MpContextHolder; +import co.yixiang.yshop.module.mp.service.message.MpAutoReplyService; +import co.yixiang.yshop.module.mp.service.user.MpUserService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.result.WxMpUser; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 关注的事件处理器 + * + * @author yshop + */ +@Component +@Slf4j +public class SubscribeHandler implements WxMpMessageHandler { + + @Resource + private MpUserService mpUserService; + @Resource + private MpAutoReplyService mpAutoReplyService; + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService weixinService, WxSessionManager sessionManager) throws WxErrorException { + // 第一步,从公众号平台,获取粉丝信息 + log.info("[handle][粉丝({}) 关注]", wxMessage.getFromUser()); + WxMpUser wxMpUser = null; + try { + wxMpUser = weixinService.getUserService().userInfo(wxMessage.getFromUser()); + } catch (WxErrorException e) { + log.error("[handle][粉丝({})] 获取粉丝信息失败!", wxMessage.getFromUser(), e); + } + + // 第二步,保存粉丝信息 + mpUserService.saveUser(MpContextHolder.getAppId(), wxMpUser); + + // 第三步,回复关注的欢迎语 + return mpAutoReplyService.replyForSubscribe(MpContextHolder.getAppId(), wxMessage); + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/UnsubscribeHandler.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/UnsubscribeHandler.java new file mode 100644 index 0000000..2418c47 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/handler/mp/user/UnsubscribeHandler.java @@ -0,0 +1,39 @@ +package co.yixiang.yshop.module.mp.service.handler.mp.user; + +import co.yixiang.yshop.module.mp.framework.mp.core.context.MpContextHolder; +import co.yixiang.yshop.module.mp.service.user.MpUserService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 取消关注的事件处理器 + * + * @author yshop + */ +@Component +@Slf4j +public class UnsubscribeHandler implements WxMpMessageHandler { + + @Resource + @Lazy // 延迟加载,解决循环依赖的问题 + private MpUserService mpUserService; + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + log.info("[handle][粉丝({}) 取消关注]", wxMessage.getFromUser()); + mpUserService.updateUserUnsubscribe(MpContextHolder.getAppId(), wxMessage.getFromUser()); + return null; + } + +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/material/MpMaterialServiceImpl.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/material/MpMaterialServiceImpl.java index 50ff067..96f06ce 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/material/MpMaterialServiceImpl.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/material/MpMaterialServiceImpl.java @@ -194,7 +194,6 @@ public class MpMaterialServiceImpl implements MpMaterialService { /** * 下载微信媒体文件的内容,并上传到文件服务 - * * 为什么要下载?媒体文件在微信后台保存时间为 3 天,即 3 天后 media_id 失效。 * * @param accountId 公众号账号的编号 diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/message/MpAutoReplyServiceImpl.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/message/MpAutoReplyServiceImpl.java index c10fffc..d429d9c 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/message/MpAutoReplyServiceImpl.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/message/MpAutoReplyServiceImpl.java @@ -96,7 +96,6 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService { /** * 校验自动回复是否冲突 - * * 不同的 type,会有不同的逻辑: * 1. type = SUBSCRIBE 时,不允许有其他的自动回复 * 2. type = MESSAGE 时,校验 requestMessageType 已经存在自动回复 diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/user/MpUserServiceImpl.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/user/MpUserServiceImpl.java index abeda18..9dbb0e7 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/user/MpUserServiceImpl.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/user/MpUserServiceImpl.java @@ -6,7 +6,7 @@ import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; import co.yixiang.yshop.module.member.api.user.MemberUserApi; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDTO; import co.yixiang.yshop.module.mp.controller.admin.user.vo.MpUserPageReqVO; import co.yixiang.yshop.module.mp.controller.admin.user.vo.MpUserUpdateReqVO; import co.yixiang.yshop.module.mp.convert.user.MpUserConvert; @@ -90,8 +90,8 @@ public class MpUserServiceImpl implements MpUserService { MpUserDO dbUser = mpUserMapper.selectByAppIdAndOpenid(appId, wxMpUser.getOpenId()); if (dbUser == null) { mpUserMapper.insert(user); - WechatUserDto wechatUserDto = WechatUserDto.builder() - .openid(wxMpUser.getOpenId()) + WechatUserDTO wechatUserDto = WechatUserDTO.builder() + .openId(wxMpUser.getOpenId()) .nickname(wxMpUser.getLanguage()) .headimgurl(wxMpUser.getLanguage()) .build(); diff --git a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java index 9df613f..54827a4 100644 --- a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java +++ b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java @@ -36,26 +36,26 @@ public class AliPayMessageHandler implements PayMessageHandler context, AliPayService payService) throws PayErrorException { - Map message = payMessage.getPayMessage(); - //交易状态 - String trade_status = (String) message.get("trade_status"); - - //交易完成 - if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)) { - - String orderNo = (String) payMessage.getPayMessage().get("out_trade_no"); - //截取订单编号 - String[] split = orderNo.split("-"); - if (split.length > 0) { - String orderId = split[0]; - log.info("支付宝回调消息处理,发送处理消息orderId={}", split[0]); - //消息队列处理 - payNoticeProducer.sendPayNoticeMessage(orderId, PayTypeEnum.ALI.getValue()); - log.info("支付宝回调消息发送完毕"); - return payService.getPayOutMessage("success", "成功"); - } - } - +// Map message = payMessage.getPayMessage(); +// //交易状态 +// String trade_status = (String) message.get("trade_status"); +// +// //交易完成 +// if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)) { +// +// String orderNo = (String) payMessage.getPayMessage().get("out_trade_no"); +// //截取订单编号 +// String[] split = orderNo.split("-"); +// if (split.length > 0) { +// String orderId = split[0]; +// log.info("支付宝回调消息处理,发送处理消息orderId={}", split[0]); +// //消息队列处理 +// payNoticeProducer.sendPayNoticeMessage(orderId, PayTypeEnum.ALI.getType()); +// log.info("支付宝回调消息发送完毕"); +// return payService.getPayOutMessage("success", "成功"); +// } +// } +// return payService.getPayOutMessage("fail", "失败"); } } diff --git a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/WxPayMessageHandler.java b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/WxPayMessageHandler.java index 65aec6e..5212bfc 100644 --- a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/WxPayMessageHandler.java +++ b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/WxPayMessageHandler.java @@ -36,7 +36,7 @@ public class WxPayMessageHandler implements PayMessageHandler p.value.equals(value)) + .filter(p -> p.type.equals(type)) .findAny() .orElse(null); } - } diff --git a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/mq/message/PayRefundMessage.java b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/mq/message/PayRefundMessage.java new file mode 100644 index 0000000..8f2c84b --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/mq/message/PayRefundMessage.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.pay.mq.message; + +import co.yixiang.yshop.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import java.util.List; + +@Data +public class PayRefundMessage extends AbstractStreamMessage { + + /** + * 退款订单id集合 + */ + private List ids; + + @Override + public String getStreamKey() { + return "order.pay.refund"; + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/pom.xml b/yshop-module-pay/yshop-module-pay-biz/pom.xml index 5b10c84..4267dea 100644 --- a/yshop-module-pay/yshop-module-pay-biz/pom.xml +++ b/yshop-module-pay/yshop-module-pay-biz/pom.xml @@ -71,6 +71,32 @@ 2.11.0 compile + + co.yixiang.boot + yshop-module-express-api + 1.0.0 + compile + + + co.yixiang.boot + yshop-module-member-api + 1.0.0 + compile + + + co.yixiang.boot + yshop-module-order-api + 1.0.0 + compile + + + redis.clients + jedis + + + redis.clients + jedis + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java index 886c62b..e8cbbb9 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java @@ -6,9 +6,6 @@ import co.yixiang.yshop.module.pay.strategy.PayFactory; import lombok.Getter; import java.util.Map; -import java.util.Objects; - -import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; @Getter public class PayContext { diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java index ad2aa44..30ca41d 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java @@ -3,11 +3,15 @@ package co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo; import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; import java.math.BigDecimal; @Data @AllArgsConstructor +@NoArgsConstructor +@ToString(callSuper = true) public class PayParam { /*** * 商户订单号 @@ -22,7 +26,7 @@ public class PayParam { /*** * 用户openid */ - String openid; + String openId; String ip; @@ -34,4 +38,8 @@ public class PayParam { String payDesc; MerchantDetailsDO merchantDetailsDO; + + private Long uid; + + String redirectType; } diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/AppPayController.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/AppPayController.java new file mode 100644 index 0000000..4996aeb --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/AppPayController.java @@ -0,0 +1,134 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + * 注意: + * 本软件为www.yixiang.co开发研制,未经购买不得使用 + * 购买后可获得全部源代码(禁止转卖、分享、上传到码云、github等开源平台) + * 一经发现盗用、分享等行为,将追究法律责任,后果自负 + */ +package co.yixiang.yshop.module.pay.controller.app; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; +import co.yixiang.yshop.module.member.api.user.MemberUserApi; +import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.controller.app.vo.AppPayParam; +import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import co.yixiang.yshop.module.pay.enums.PayOrderConstants; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; +import co.yixiang.yshop.module.pay.processor.PayOrderProcessor; +import co.yixiang.yshop.module.pay.service.merchantdetails.MerchantDetailsService; +import co.yixiang.yshop.module.pay.strategy.PayClient; +import co.yixiang.yshop.module.pay.strategy.PayClientFactory; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.JedisUtils; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +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 javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Map; +import java.util.Objects; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.USER_NOT_BINDING_WX; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.USER_NOT_BINDING_WX_APPLET; +import redis.clients.jedis.Jedis; + +/** + * 统一支付 + */ +@Slf4j +@RestController +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Tag(name = "APP - 支付模块") +@RequestMapping("/pay") +public class AppPayController { + + @Resource + private PayClientFactory payClientFactory; + + @Resource + private PayOrderProcessor payOrderProcessor; + + @Resource + private MerchantDetailsService merchantDetailsService; + + @Resource + private MemberUserApi memberUserApi; + + @PreAuthenticated + @PostMapping(value = "/payment") + @Operation(summary = "统一支付") + public CommonResult> payment(@Valid @RequestBody AppPayParam param) throws Exception { + Long userId = SecurityFrameworkUtils.getLoginUserId(); + log.info("=========进入统一支付,param参数:{}", param.toString()); + MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantByType(param.getPayType()); + // 获取支付客户端 + PayClient client = payClientFactory.getClient(param.getPayType()); + // 处理规则 + PayParam payParam = payOrderProcessor.getPayParam(param.getOrderId(), param.getPayType()); + log.info("=========处理规则后,payParam参数:{}", payParam.toString()); + //如果是小程序或APP 先获取用户openid + MemberUserRespDTO user = memberUserApi.getUser(userId); + + log.info("=========用戶,MemberUserRespDTO参数:{}", user.toString()); + if (PayTypeEnum.WEIXIN_APPLET.getType().equals(param.getPayType())) { + //小程序支付需要openid + if (Objects.isNull(user.getRoutineOpenId())) throw exception(USER_NOT_BINDING_WX_APPLET); + } + if (PayTypeEnum.WEIXIN.getType().equals(param.getPayType())) { + //小程序支付需要openid + if (Objects.isNull(user.getRoutineOpenId())) throw exception(USER_NOT_BINDING_WX); + } + payParam.setType(param.getPayType()); + payParam.setMerchantDetailsDO(merchantDetailsDO); + payParam.setUid(userId); + // 拉起支付 + Map payment = client.payment(payParam); + log.info("=========拉起支付,payment:{}", payParam); + payOrderProcessor.handelWait(param.getOrderId(), payment); + return success(payment); + } + + @RequestMapping("/wxPayNotify") + @Operation(summary = "统一微信支付回调") + @PermitAll + public void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { + // 处理回调 + payOrderProcessor.handleWeChatPayNotify(request); + response.getWriter().write(PayOrderConstants.WEINXIN_RESULT); + } + + @Resource + private RedisTemplate redisTemplate; + + @RequestMapping("/flush") + @Operation(summary = "清空redis") + @PermitAll + public void flush () throws Exception { + redisTemplate.execute((RedisCallback) connection -> { + connection.flushDb(); + return null; + }); + + } + +} + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/vo/AppPayParam.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/vo/AppPayParam.java new file mode 100644 index 0000000..4648b4b --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/app/vo/AppPayParam.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.pay.controller.app.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @ClassName PayDto + * @Author hupeng <610796224@qq.com> + * @Date 2013/6/20 + **/ +@Data +public class AppPayParam implements Serializable { + + @Schema(description = "来源", requiredMode = Schema.RequiredMode.REQUIRED) + private String from; + /** + * 支付类型 + */ + @NotBlank(message = "选择支付类型 PayTypeEnum类型(weixin_h5|weixin_applet|weixin_app)") + @Schema(description = "支付类型", requiredMode = Schema.RequiredMode.REQUIRED) + private String payType; + + @NotBlank(message = "参数错误") + @Schema(description = "支付订单ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String orderId; + + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessor.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessor.java new file mode 100644 index 0000000..e3411ec --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessor.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.pay.processor; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 支付订单处理器 + */ +public interface PayOrderProcessor { + + // 获取支付参数 + PayParam getPayParam(String orderId, String payType); + + // 处理待支付 + void handelWait(String orderId, Map packageParams); + + void handleWeChatPayNotify(HttpServletRequest request) throws Exception; + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessorImpl.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessorImpl.java new file mode 100644 index 0000000..56a7933 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/processor/PayOrderProcessorImpl.java @@ -0,0 +1,142 @@ +package co.yixiang.yshop.module.pay.processor; + +import cn.hutool.core.util.StrUtil; +import co.yixiang.yshop.framework.common.util.servlet.ServletUtils; +import co.yixiang.yshop.module.member.api.user.MemberUserApi; +import co.yixiang.yshop.module.member.api.user.dto.MemberUserRespDTO; +import co.yixiang.yshop.module.order.api.productorder.ProductOrderApi; +import co.yixiang.yshop.module.order.api.productorder.dto.ProductOrderDTO; +import co.yixiang.yshop.module.order.api.rechargeorder.RechargeOrderApi; +import co.yixiang.yshop.module.order.api.rechargeorder.dto.RechargeOrderDTO; +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import co.yixiang.yshop.module.pay.enums.PayOrderConstants; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; +import co.yixiang.yshop.module.pay.service.merchantdetails.MerchantDetailsService; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.HttpKit; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentKit; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.Objects; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.USER_NOT_BINDING_WX_APPLET; + +/** + * 支付订单处理器实现 + */ +@Slf4j +@Service +public class PayOrderProcessorImpl implements PayOrderProcessor { + + @Resource + private MemberUserApi memberUserApi; + + @Resource + private RechargeOrderApi rechargeOrderApi; + + @Resource + private ProductOrderApi productOrderApi; + + @Resource + private MerchantDetailsService merchantDetailsService; + + @Override + public PayParam getPayParam(String orderId, String payType) { + Long userId = getLoginUserId(); + MemberUserRespDTO user = memberUserApi.getUser(userId); + if (PayTypeEnum.WEIXIN_APPLET.getType().equals(payType)) { + //小程序支付需要openid + if (Objects.isNull(user.getRoutineOpenId())) throw exception(USER_NOT_BINDING_WX_APPLET); + } + // 充值参数 + PayParam payParam = new PayParam(); + payParam.setOrderId(orderId); + payParam.setOpenId(user.getRoutineOpenId()); + payParam.setIp(ServletUtils.getClientIP()); + payParam.setPayDesc(PayOrderConstants.PAY_DESC); + + // 判断是否为充值 + if (StrUtil.startWith(orderId, PayOrderConstants.RECHARGE_ORDER_PREFIX)){ + RechargeOrderDTO rechargeOrderDTO = rechargeOrderApi.getPayParam(orderId); + payParam.setMoney(new BigDecimal(rechargeOrderDTO.getRechargeAmount())); + payParam.setRedirectType(PayOrderConstants.RECHARGE_REDIRECT_URL); + }else { + // 不是充值就是购买 + ProductOrderDTO productOrderDTO = productOrderApi.getPayParam(orderId); + payParam.setMoney(productOrderDTO.getAmount()); + payParam.setRedirectType(PayOrderConstants.PAY_REDIRECT_URL); + } + + return payParam; + } + + @Override + public void handelWait(String orderId, Map packageParams) { + // 判断是否为充值 + if (StrUtil.startWith(orderId, PayOrderConstants.RECHARGE_ORDER_PREFIX)) { + // 充值 + + }else { + // 不是充值就是购买 + productOrderApi.handleOrder(orderId, packageParams); + } + } + + @Override + public void handleWeChatPayNotify(HttpServletRequest request) throws Exception { + log.info("进入微信支付回调"); + String xmlMsg = HttpKit.readData(request); + log.info("微信回调通知信息" + xmlMsg); + if (StringUtils.isEmpty(xmlMsg)) { + log.info("回调接口内容为空!"); + return; + } + Map resultMap = PaymentKit.xmlToMap(xmlMsg); + //验签 + MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); + boolean validSignResult = PaymentKit.verifyNotify(resultMap, merchantDetailsDO.getKeyPrivate()); + log.info("验签结果{}", validSignResult); + if (MapUtils.isEmpty(resultMap)) { + log.info("map为null"); + return; + } + + if (!resultMap.get("return_code").equals("SUCCESS")) { + log.info("return_code不是SUCCESS"); + return; + } + String orderNo = resultMap.get("out_trade_no"); + log.info("回调out_trade_no=" + orderNo); + log.info("回调transaction_id=" + resultMap.get("transaction_id")); + //截取订单编号 + String[] split = orderNo.split("-"); + if (split.length == 0) { + log.info("截取id为null"); + } + String orderId = split[0]; + if (StringUtils.isEmpty(orderId)) { + log.info("orderId为null"); + } + // 判断是否为充值 + if (StrUtil.startWith(orderId, PayOrderConstants.RECHARGE_ORDER_PREFIX)) { + // 充值 + rechargeOrderApi.handleWeChatPayNotify(orderId); + }else { + // 不是充值就是购买 + productOrderApi.handleWeChatPayNotify(orderId, resultMap); + } + + + + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsService.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsService.java index bffee20..1c1085a 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsService.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsService.java @@ -43,6 +43,8 @@ public interface MerchantDetailsService { */ MerchantDetailsDO getMerchantDetails(String id); + MerchantDetailsDO getMerchantByType(String type); + /** * 获得支付服务商配置列表 * diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsServiceImpl.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsServiceImpl.java index 7733b3e..bd1d0ea 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsServiceImpl.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/service/merchantdetails/MerchantDetailsServiceImpl.java @@ -64,6 +64,11 @@ public class MerchantDetailsServiceImpl implements MerchantDetailsService { return merchantDetailsMapper.selectById(id); } + @Override + public MerchantDetailsDO getMerchantByType(String type) { + return merchantDetailsMapper.selectOne(MerchantDetailsDO::getPayType, type); + } + @Override public List getMerchantDetailsList(Collection ids) { return merchantDetailsMapper.selectBatchIds(ids); diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java index 536b29d..ed064b1 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java @@ -4,6 +4,6 @@ import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; import java.util.Map; -public interface Pay { +public interface Pay{ Map selectPayWay(String payCode, PayParam param) throws Exception; } diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClient.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClient.java new file mode 100644 index 0000000..5c2b89e --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClient.java @@ -0,0 +1,19 @@ +package co.yixiang.yshop.module.pay.strategy; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; + +import java.util.Map; + +/** + * 支付客户端 + */ +public interface PayClient { + + /** + * 获取支付信息 + * @return 支付信息 + */ + Map payment(PayParam param) throws Exception; + + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactory.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactory.java new file mode 100644 index 0000000..96d97ec --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactory.java @@ -0,0 +1,15 @@ +package co.yixiang.yshop.module.pay.strategy; + +/** + * 获取支付方式工厂 + */ +public interface PayClientFactory { + + /** + * 获取支付客户端 + * @param payType 支付类型 + * @return 支付客户端 + */ + PayClient getClient(String payType); + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactoryImpl.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactoryImpl.java new file mode 100644 index 0000000..20e53d0 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayClientFactoryImpl.java @@ -0,0 +1,47 @@ +package co.yixiang.yshop.module.pay.strategy; + +import co.yixiang.yshop.module.order.api.productorder.ProductOrderApi; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; +import co.yixiang.yshop.module.pay.strategy.type.AliPay; +import co.yixiang.yshop.module.pay.strategy.type.IntegralPay; +import co.yixiang.yshop.module.pay.strategy.type.NowMoneyPay; +import co.yixiang.yshop.module.pay.strategy.type.WeChatPay; +import co.yixiang.yshop.module.pay.strategy.weixin.service.WxPayServiceUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.pay.enums.ErrorCodeConstants.PAY_TYPE_NOT_EXISTS; + +/** + * 支付工厂实现 + */ +@Component +public class PayClientFactoryImpl implements PayClientFactory { + + @Resource + private WxPayServiceUtils wxPayServiceUtils; + @Resource + private ProductOrderApi productOrderApi; + + @Override + public PayClient getClient(String payType) { + // 支付类型 + PayTypeEnum type = PayTypeEnum.toType(payType); + + switch (type) { + // 微信 + case WEIXIN: + case WEIXIN_H5: + case WEIXIN_APPLET: + case WEIXIN_APP: + return new WeChatPay(wxPayServiceUtils); + case YUE: + return new NowMoneyPay(productOrderApi); + case INTEGRAL: + return new IntegralPay(); + } + throw exception(PAY_TYPE_NOT_EXISTS); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java index dfc0008..556748a 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java @@ -2,7 +2,7 @@ package co.yixiang.yshop.module.pay.strategy; import co.yixiang.yshop.module.pay.strategy.type.AliPay; import co.yixiang.yshop.module.pay.strategy.type.WeChatPay; -import co.yixiang.yshop.module.pay.strategy.type.YuePay; +import co.yixiang.yshop.module.pay.strategy.type.NowMoneyPay; import java.util.HashMap; import java.util.Map; @@ -18,7 +18,6 @@ public class PayFactory { static { PayMap.put(PayEnum.ALI.getCode(),new AliPay()); PayMap.put(PayEnum.WEIXIN.getCode(),new WeChatPay()); - PayMap.put(PayEnum.YUE.getCode(),new YuePay()); } public Pay create(String payCode){ diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java index b3ee972..42ad79e 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java @@ -1,20 +1,15 @@ package co.yixiang.yshop.module.pay.strategy.type; import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; -import co.yixiang.yshop.module.pay.enums.PayTypeEnum; -import co.yixiang.yshop.module.pay.strategy.Pay; -import co.yixiang.yshop.module.pay.strategy.weixin.skd.RandomStringUtil; -import com.egzosn.pay.spring.boot.core.bean.MerchantPayOrder; -import org.springframework.stereotype.Component; +import co.yixiang.yshop.module.pay.strategy.PayClient; import java.util.Collections; import java.util.Map; -public class AliPay implements Pay { - +public class AliPay implements PayClient { @Override - public Map selectPayWay(String payCode, PayParam param) throws Exception{ + public Map payment(PayParam param) throws Exception{ return Collections.emptyMap(); diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/IntegralPay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/IntegralPay.java new file mode 100644 index 0000000..4cba78f --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/IntegralPay.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.pay.strategy.type; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.strategy.PayClient; + +import java.util.Collections; +import java.util.Map; + +public class IntegralPay implements PayClient { + + @Override + public Map payment(PayParam param) throws Exception{ + //do something + + return Collections.emptyMap(); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/NowMoneyPay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/NowMoneyPay.java new file mode 100644 index 0000000..650b12f --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/NowMoneyPay.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.pay.strategy.type; + +import co.yixiang.yshop.module.order.api.productorder.ProductOrderApi; +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.strategy.PayClient; + +import java.util.Collections; +import java.util.Map; + +public class NowMoneyPay implements PayClient { + private final ProductOrderApi productOrderApi; + + public NowMoneyPay(ProductOrderApi productOrderApi) { + this.productOrderApi = productOrderApi; + } + + @Override + public Map payment(PayParam param) throws Exception{ + productOrderApi.yuePay(param.getOrderId(),param.getUid()); + //do something + return Collections.emptyMap(); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java index d94dcbd..6b8a4e5 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java @@ -1,26 +1,27 @@ package co.yixiang.yshop.module.pay.strategy.type; import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; -import co.yixiang.yshop.module.pay.enums.PayTypeEnum; -import co.yixiang.yshop.module.pay.strategy.Pay; +import co.yixiang.yshop.module.pay.strategy.PayClient; import co.yixiang.yshop.module.pay.strategy.weixin.service.WxPayServiceUtils; -import org.springframework.stereotype.Component; -import java.util.Collections; +import javax.annotation.Resource; import java.util.Map; -import java.util.Objects; -public class WeChatPay implements Pay { +public class WeChatPay implements PayClient { + + @Resource + private WxPayServiceUtils wxPayServiceUtils; + + public WeChatPay(){ + } + + public WeChatPay(WxPayServiceUtils wxPayServiceUtils){ + this.wxPayServiceUtils = wxPayServiceUtils; + } @Override - public Map selectPayWay(String payCode, PayParam param) throws Exception { - //根据微信type选择不同的支付 H5/APPLET/APP - if (Objects.equals(param.getType(), PayTypeEnum.WEIXIN_H5.getValue()) || - Objects.equals(param.getType(), PayTypeEnum.WEIXIN_APP.getValue()) || - Objects.equals(param.getType(), PayTypeEnum.WEIXIN_APPLET.getValue()) - ) { - return new WxPayServiceUtils().gotoPay(param); - } - return Collections.emptyMap(); + public Map payment(PayParam param) throws Exception { + // 支付 + return wxPayServiceUtils.gotoPay(param); } } diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java index 0ea248c..f8061d8 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java @@ -68,21 +68,28 @@ public class WxPayServiceUtils implements InitializingBean { //获取商户信息 //h5 String outTradeNo = ""; - if(PayTypeEnum.WEIXIN_H5.getValue().equals(param.getType())){ + if(PayTypeEnum.WEIXIN_H5.getType().equals(param.getType())){ outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"H5"; reqParams.put("appid", param.getMerchantDetailsDO().getAppid()); //交易类型 reqParams.put("trade_type", "MWEB"); - }else if(PayTypeEnum.WEIXIN_APP.getValue().equals(param.getType())){ + }else if(PayTypeEnum.WEIXIN_APP.getType().equals(param.getType())){ //微信app分配的APPID //app_appid outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"APP"; reqParams.put("appid", param.getMerchantDetailsDO().getAppid()); //交易类型 reqParams.put("trade_type", "APP"); - }else if(PayTypeEnum.WEIXIN_APPLET.getValue().equals(param.getType())){ + }else if(PayTypeEnum.WEIXIN_APPLET.getType().equals(param.getType())){ //微信app分配的APPID - reqParams.put("openid",param.getOpenid()); + reqParams.put("openid",param.getOpenId()); + outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"APPLET"; + reqParams.put("appid", param.getMerchantDetailsDO().getAppid()); + //交易类型 + reqParams.put("trade_type", "JSAPI"); + }else { + //微信app分配的APPID + reqParams.put("openid",param.getOpenId()); outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"APPLET"; reqParams.put("appid", param.getMerchantDetailsDO().getAppid()); //交易类型 @@ -139,8 +146,8 @@ public class WxPayServiceUtils implements InitializingBean { Map map = PaymentApi.queryByOutTradeNo(param.getMerchantDetailsDO().getAppid(),param.getMerchantDetailsDO().getMchId(),param.getMerchantDetailsDO().getKeyPrivate(),outTradeNo); log.info("查询到微信订单信息:" + map.toString()); // payInfo.setTransaction_id(map.get("transaction_id")) - if (PayTypeEnum.WEIXIN_H5.getValue().equals(param.getType())) { - packageParams.put("mwebUrl", result.get("mweb_url") + "&redirect_url="+ URLEncoder.encode(param.getMerchantDetailsDO().getReturnUrl(), "GBK")); + if (PayTypeEnum.WEIXIN_H5.getType().equals(param.getType())) { + packageParams.put("mwebUrl", result.get("mweb_url") + "&redirect_url="+ URLEncoder.encode(param.getMerchantDetailsDO().getReturnUrl() + param.getRedirectType(), "GBK")); } return packageParams; } diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java index 553ff96..d741ec4 100644 --- a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java @@ -9,12 +9,8 @@ import co.yixiang.yshop.module.pay.strategy.weixin.skd.RandomStringUtil; import co.yixiang.yshop.module.pay.strategy.weixin.skd.WXPayUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; -import org.springframework.util.ClassUtils; -import org.springframework.util.ResourceUtils; -import java.io.InputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.HashMap; @@ -72,19 +68,19 @@ public class WxPayServiceImpl implements WxPayService { //获取商户信息 //h5 String outTradeNo = ""; - if(PayTypeEnum.WEIXIN_H5.getValue().equals(type)){ + if(PayTypeEnum.WEIXIN_H5.getType().equals(type)){ outTradeNo=orderId+"-"+ RandomStringUtil.getRandomCode(3,0)+"H5"; reqParams.put("appid", merchantDetailsDO.getAppid()); //交易类型 reqParams.put("trade_type", "MWEB"); - }else if(PayTypeEnum.WEIXIN_APP.getValue().equals(type)){ + }else if(PayTypeEnum.WEIXIN_APP.getType().equals(type)){ //微信app分配的APPID //app_appid outTradeNo=orderId+"-"+ RandomStringUtil.getRandomCode(3,0)+"APP"; reqParams.put("appid", merchantDetailsDO.getAppid()); //交易类型 reqParams.put("trade_type", "APP"); - }else if(PayTypeEnum.WEIXIN_APPLET.getValue().equals(type)){ + }else if(PayTypeEnum.WEIXIN_APPLET.getType().equals(type)){ //微信app分配的APPID //app_appid outTradeNo=orderId+"-"+ RandomStringUtil.getRandomCode(3,0)+"APPLET"; @@ -143,7 +139,7 @@ public class WxPayServiceImpl implements WxPayService { Map map = PaymentApi.queryByOutTradeNo(merchantDetailsDO.getAppid(),merchantDetailsDO.getMchId(),merchantDetailsDO.getKeyPrivate(),outTradeNo); log.info("查询到微信订单信息:" + map.toString()); // payInfo.setTransaction_id(map.get("transaction_id")) - if (PayTypeEnum.WEIXIN_H5.getValue().equals(type)) { + if (PayTypeEnum.WEIXIN_H5.getType().equals(type)) { packageParams.put("mwebUrl", result.get("mweb_url") + "&redirect_url="+ URLEncoder.encode(merchantDetailsDO.getReturnUrl(), "GBK")); } return packageParams; diff --git a/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java index 95630e0..ecb1183 100644 --- a/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java +++ b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java @@ -31,4 +31,11 @@ public interface DictTypeConstants { String DEFAULT_HEAD = "default_head"; // 用户默认头像 + String CLOSE_AFTER_SALE_DAYS = "close_after_sale_days"; //关闭售后天数 + + String INTEGRAL_CONFIG = "integral_config"; //积分配置 + String INTEGRAL_DEDUCTION_RULE = "integral_deduction_rule"; //积分抵扣规则 + String INTEGRAL_ENABLE = "integral_enable"; //积分抵扣是否开启 + String INTEGRAL_NAME = "integral_name"; //积分名称 + } diff --git a/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DistributorDictEnum.java b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DistributorDictEnum.java new file mode 100644 index 0000000..5f760f7 --- /dev/null +++ b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DistributorDictEnum.java @@ -0,0 +1,33 @@ +package co.yixiang.yshop.module.system.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +/** + * 分销商字典枚举 + */ +@Getter +@AllArgsConstructor +public enum DistributorDictEnum { + + DISTRIBUTOR_USER_EXPIRE("distributor_user_expire","客户保护天数"), + DISTRIBUTOR_APPLY("distributor_apply","自动审核开关"), + DISTRIBUTOR_PURCHASE("distributor_purchase","自购返佣开关"), + DISTRIBUTOR_AGREEMENT("distributor_agreement","分销商协议"), + ; + + private String dictType; + + private String label; + + public static DistributorDictEnum toDictType(Integer dictType) { + return Stream.of(DistributorDictEnum.values()) + .filter(p -> Objects.equals(p.dictType, dictType)) + .findAny() + .orElse(null); + } + +} diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java index 6f9f3d3..584792a 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java @@ -92,4 +92,18 @@ public class DictDataController { ExcelUtils.write(response, "字典数据.xls", "数据列表", DictDataExcelVO.class, data); } + @GetMapping(value = "/get-distributor-config") + @Operation(summary = "/查询分销商配置") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> getDistributorConfig() { + return success(dictDataService.getDistributorConfig()); + } + + @PostMapping("/update-distributor-config") + @Operation(summary = "更新分销商配置") + public CommonResult updateDistributorConfig(@Valid @RequestBody List reqVO) { + dictDataService.updateDistributorConfig(reqVO); + return success(Boolean.TRUE); + } + } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/notice/NoticeController.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/notice/NoticeController.java index 1afef61..58c6a15 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/notice/NoticeController.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/notice/NoticeController.java @@ -56,7 +56,7 @@ public class NoticeController { @GetMapping("/page") @Operation(summary = "获取通知公告列表") - @PreAuthorize("@ss.hasPermission('system:notice:query')") +// @PreAuthorize("@ss.hasPermission('system:notice:query')") public CommonResult> getNoticePage(@Validated NoticePageReqVO reqVO) { return success(NoticeConvert.INSTANCE.convertPage(noticeService.getNoticePage(reqVO))); } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java index f368d00..3e20d3c 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java @@ -1,14 +1,14 @@ package co.yixiang.yshop.module.system.controller.app.dict; +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.dict.core.util.DictFrameworkUtils; import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataRespVO; +import co.yixiang.yshop.module.system.enums.DistributorDictEnum; import co.yixiang.yshop.module.system.service.dict.DictDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.annotation.security.PermitAll; @@ -17,6 +17,8 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + @Tag(name = "用户 APP - 数据字典") @RestController @@ -28,7 +30,7 @@ public class AppDictDataController { private DictDataService dictDataService; @GetMapping("/agreement/{type}") - @Operation(summary = "获得协议", description = "包括用户协议和隐私协议") + @Operation(summary = "获得协议", description = "包括用户协议和隐私协议 弃用") // 无需添加权限认证,因为前端全局都需要 @PermitAll public void getAgreement(@PathVariable Integer type, HttpServletResponse response) throws IOException { @@ -39,4 +41,25 @@ public class AppDictDataController { writer.flush(); // return success(dictDataService.getAgreement(type)); } + + @GetMapping("/get-stream") + @Operation(summary = "获取字典流", description = "包括用户协议和隐私协议") + // 无需添加权限认证,因为前端全局都需要 + @PermitAll + public void getStream(@RequestParam("dictType") String dictType, @RequestParam("label") String label, HttpServletResponse response) throws IOException { + response.setHeader("Content-Type","text/html;charset=UTF-8"); + String value = DictFrameworkUtils.parseDictDataValue(dictType, label); + PrintWriter writer = response.getWriter(); + writer.write(value); + writer.flush(); + } + + @GetMapping("/get-value") + @Operation(summary = "获取字典") + // 无需添加权限认证,因为前端全局都需要 + @PermitAll + public CommonResult getValue(@RequestParam("dictType") String dictType, @RequestParam("label") String label, HttpServletResponse response) throws IOException { + String value = DictFrameworkUtils.parseDictDataValue(dictType, label); + return success(value); + } } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/dal/mysql/dict/DictDataMapper.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/dal/mysql/dict/DictDataMapper.java index ef3e471..f516c50 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/dal/mysql/dict/DictDataMapper.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/dal/mysql/dict/DictDataMapper.java @@ -8,6 +8,8 @@ import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataPage import co.yixiang.yshop.module.system.dal.dataobject.dict.DictDataDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; import java.util.Arrays; import java.util.Collection; @@ -48,4 +50,6 @@ public interface DictDataMapper extends BaseMapperX { .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus())); } + @Update("update system_dict_data set value = #{value} where label = #{label}") + void updateDictByLabel(@Param("label") String label,@Param("value") String value); } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/backuprecord/BackupRecordServiceImpl.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/backuprecord/BackupRecordServiceImpl.java index 19e085b..90cab82 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/backuprecord/BackupRecordServiceImpl.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/backuprecord/BackupRecordServiceImpl.java @@ -10,6 +10,7 @@ import co.yixiang.yshop.module.system.dal.mysql.backuprecord.BackupRecordMapper; import co.yixiang.yshop.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -26,7 +27,6 @@ import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.module.system.enums.ErrorCodeConstants.BACKUP_MANY; -import static co.yixiang.yshop.module.system.enums.ErrorCodeConstants.BACKUP_NO_BACKUP; /** * 品牌 Service 实现类 @@ -34,6 +34,7 @@ import static co.yixiang.yshop.module.system.enums.ErrorCodeConstants.BACKUP_NO_ * @author yshop */ @Service +@Slf4j @Validated public class BackupRecordServiceImpl extends ServiceImpl implements BackupRecordService { @@ -79,7 +80,7 @@ public class BackupRecordServiceImpl extends ServiceImpl().orderByDesc( @@ -90,10 +91,17 @@ public class BackupRecordServiceImpl extends ServiceImpl().orderByDesc( BackupRecordDO::getId ).last("limit 1")); - - Long count = backupRecordMapper.selectCount(); - if (backupRecordDO == null) throw exception(BACKUP_NO_BACKUP); - if (backupRecordDO.getUpdateTime().plusMinutes(5).isAfter(LocalDateTime.now()) && count > 1) { - throw exception(BACKUP_MANY); + if (backupRecordDO != null) { + if (backupRecordDO.getUpdateTime().plusMinutes(5).isAfter(LocalDateTime.now()) && + !backupRecordDO.getCreateTime().isEqual(backupRecordDO.getUpdateTime())) { + throw exception(BACKUP_MANY); + } + } + try { + this.baseMapper.revertBackup(); + } catch (Exception e) { + log.info("第一次还原备份异常,重试中。。。"); } this.baseMapper.revertBackup(); + assert backupRecordDO != null; backupRecordDO.setUpdateTime(LocalDateTime.now()); this.baseMapper.updateById(backupRecordDO); //清除redis信息 @@ -118,5 +132,6 @@ public class BackupRecordServiceImpl extends ServiceImpl getDistributorConfig(); + + void updateDistributorConfig(List reqVO); + + void updateDictByLabel(String label, String value); } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java index f21acb9..b73e0da 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java @@ -5,11 +5,11 @@ import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.*; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.type.DictTypeSimpleRespVO; import co.yixiang.yshop.module.system.convert.dict.DictDataConvert; import co.yixiang.yshop.module.system.dal.dataobject.dict.DictDataDO; import co.yixiang.yshop.module.system.dal.dataobject.dict.DictTypeDO; import co.yixiang.yshop.module.system.dal.mysql.dict.DictDataMapper; +import co.yixiang.yshop.module.system.enums.DistributorDictEnum; import co.yixiang.yshop.module.system.enums.agreement.AgreementTypeEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.annotations.VisibleForTesting; @@ -17,15 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.system.enums.DictTypeConstants.PRIVACY_AGREEMENT; -import static co.yixiang.yshop.module.system.enums.DictTypeConstants.USER_AGREEMENT; -import static co.yixiang.yshop.module.system.enums.DictTypeConstants.DEFAULT_HEAD; +import static co.yixiang.yshop.module.system.enums.DictTypeConstants.*; import static co.yixiang.yshop.module.system.enums.ErrorCodeConstants.*; /** @@ -203,4 +198,40 @@ public class DictDataServiceImpl implements DictDataService { DictDataDO dictDataDO = dictDataMapper.selectOne(qw.eq(DictDataDO::getLabel,DEFAULT_HEAD)); return DictDataConvert.INSTANCE.convert(dictDataDO); } -} \ No newline at end of file + + @Override + public String getDictDataStr(String dictType, String label) { + DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndLabel(dictType, label); + return dictDataDO.getValue(); + } + + @Override + public Integer getDictDataInt(String dictType, String label) { + DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndLabel(dictType, label); + return Integer.valueOf(dictDataDO.getValue()); + } + + @Override + public List getDistributorConfig() { + List dictDataRespVOS = new ArrayList<>(); + DistributorDictEnum[] enums = DistributorDictEnum.values(); + for (DistributorDictEnum dictEnum : enums) { + DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndLabel(dictEnum.getDictType(), dictEnum.getLabel()); + DictDataRespVO dictDataRespVO = DictDataConvert.INSTANCE.convert(dictDataDO); + dictDataRespVOS.add(dictDataRespVO); + } + return dictDataRespVOS; + } + + @Override + public void updateDistributorConfig(List reqVO) { + for (DictDataUpdateReqVO req : reqVO) { + this.updateDictData(req); + } + } + + @Override + public void updateDictByLabel(String label, String value) { + dictDataMapper.updateDictByLabel(label,value); + } +} diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/permission/PermissionServiceImpl.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/permission/PermissionServiceImpl.java index d45c686..9915e5d 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/permission/PermissionServiceImpl.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/permission/PermissionServiceImpl.java @@ -56,7 +56,6 @@ public class PermissionServiceImpl implements PermissionService { * 角色编号与菜单编号的缓存映射 * key:角色编号 * value:菜单编号的数组 - * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ @Getter @@ -66,7 +65,6 @@ public class PermissionServiceImpl implements PermissionService { * 菜单编号与角色编号的缓存映射 * key:菜单编号 * value:角色编号的数组 - * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ @Getter @@ -77,7 +75,6 @@ public class PermissionServiceImpl implements PermissionService { * 用户编号与角色编号的缓存映射 * key:用户编号 * value:角色编号的数组 - * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ @Getter diff --git a/yshop-server/pom.xml b/yshop-server/pom.xml index 355cc83..302f098 100644 --- a/yshop-server/pom.xml +++ b/yshop-server/pom.xml @@ -108,6 +108,11 @@ yshop-spring-boot-starter-protection + + co.yixiang.boot + yshop-module-distributor-biz + + diff --git a/yshop-server/src/main/resources/application-dev.yaml b/yshop-server/src/main/resources/application-dev.yaml index b6e185c..0680658 100644 --- a/yshop-server/src/main/resources/application-dev.yaml +++ b/yshop-server/src/main/resources/application-dev.yaml @@ -47,20 +47,20 @@ spring: name: yshop-pro url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true driver-class-name: com.mysql.jdbc.Driver - username: root - password: 3WLiVUBEwTbvAfsh + username: + password: slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: yshop-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true driver-class-name: com.mysql.jdbc.Driver - username: root - password: 3WLiVUBEwTbvAfsh + username: + password: # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: - host: 400-infra.server.yixiang.co# 地址 - port: 6379 # 端口 - database: 1 # 数据库索引 + host: 127.0.0.1 # 地址 + port: 23719 # 端口 + database: 11 # 数据库索引 # password: 123456 # 密码,建议生产环境开启 --- #################### 定时任务相关配置 #################### diff --git a/yshop-server/src/main/resources/application-local.yaml b/yshop-server/src/main/resources/application-local.yaml index a67e157..58af551 100644 --- a/yshop-server/src/main/resources/application-local.yaml +++ b/yshop-server/src/main/resources/application-local.yaml @@ -45,28 +45,16 @@ spring: datasource: master: name: yshop_pro_dev - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 - # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 - # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 - # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 - username: root - password: a6ID9^3%7kD - # username: sa - # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true + driver-class-name: com.mysql.jdbc.Driver + username: + password: slave: # 模拟从库,可根据自己需要修改 name: yshop_pro_dev_slave - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 - # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 - # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 - # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 - username: root - password: a6ID9^3%7kD - # username: sa - # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true + driver-class-name: com.mysql.jdbc.Driver + username: + password: # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: diff --git a/yshop-server/src/main/resources/application-prod.yaml b/yshop-server/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..382a71a --- /dev/null +++ b/yshop-server/src/main/resources/application-prod.yaml @@ -0,0 +1,254 @@ +server: + port: 48082 + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + # - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + stat-view-servlet: + enabled: true + allow: # 设置白名单,不填则允许所有访问 + url-pattern: /druid/* + login-username: admin + login-password: p@ssw0rd293zj + filter: + stat: + enabled: true + log-slow-sql: true # 慢 SQL 记录 + slow-sql-millis: 100 + merge-sql: true + wall: + config: + multi-statement-allow: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 5 # 初始连接数 + min-idle: 10 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 + min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 + max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 + validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + primary: master + datasource: + master: + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true + driver-class-name: com.mysql.jdbc.Driver + username: + password: + slave: # 模拟从库,可根据自己需要修改 + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true + driver-class-name: com.mysql.jdbc.Driver + username: + password: + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 23719 # 端口 + database: 11 # 数据库索引 +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: false # 本地开发环境,尽量不要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoints: + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + level: + # 配置自己写的 MyBatis Mapper 打印日志 + co.yixiang.yshop.module.bpm.dal.mysql: debug + co.yixiang.yshop.module.infra.dal.mysql: debug + co.yixiang.yshop.module.infra.dal.mysql.job.JobLogMapper: INFO # 配置 JobLogMapper 的日志级别为 info + co.yixiang.yshop.module.pay.dal.mysql: debug + co.yixiang.yshop.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # 配置 JobLogMapper 的日志级别为 info + co.yixiang.yshop.module.system.dal.mysql: debug + co.yixiang.yshop.module.tool.dal.mysql: debug + co.yixiang.yshop.module.member.dal.mysql: debug + co.yixiang.yshop.module.trade.dal.mysql: debug + co.yixiang.yshop.module.promotion.dal.mysql: debug + +debug: false + +--- #################### 微信公众号、小程序相关配置 #################### +wx: + mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 + app-id: wxc061dee8806ff712 + secret: 1dc5b2871d0d5ebd0f1ec7ddb856f805 + # 存储配置,解决 AccessToken 的跨节点的共享 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wx # Redis Key 的前缀 TODO 解决下 Redis key 管理的配置 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 + # appid: wxe4938661906993b5 + # secret: 531311891838ee414ad6e3adfe9602a7 + appid: wxd968b04655cc4ce1 + secret: d472513964ba27f54fb5cb1c063b32a4 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wa # Redis Key 的前缀 TODO yshop:解决下 Redis key 管理的配置 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + cp: # 企业微信配置 + corpId: ww6f05330db97eb85a + appConfigs: + - agentId: 1000010 + secret: SdVjZvDeDJNJXrEs3aoM2Bf8tfXj3B6lVv2zU0a0Hlw + token: wZnpSKA3 + aesKey: W1T6Zh2reXYGXz7fVaWaPT2QX0akofWpCNYMJjpXL7p + +--- #微信支付配置 +weixin: + #appid + appid: wxf0713a10bbae8732 + #APP端的appid + app_appid: wxf0713a10bbae8732 + #小程序支付应用id wxd968b04655cc4ce1 + #小程序秘钥 + secret: 1f4118c195c1926ca2ef6160ca06af15 + #商户号 + mchid: 1558500071 + #证书路径 + certurl: /yshop-server/apiclient_cert.p12 + #订单取消退款回调地址 + order_refund_notifyurl: https://shopapi.zkthink.com/order/refund/rolBack + #APP回调地址 + app_notifyurl: https://b2c-pro-api.zkthink.com/app-api/order/pay/wxPayNotify + #商户秘钥 + key: zk7BHJJWThinkSztbI6zye9ZA70uNFtT + #h5支付之后跳转地址 + redirect_url: https://b2c-pro-ui-h5.zkthink.com/#/pages/payStatus/index?type=1 +--- #################### yshop相关配置 #################### + +# yshop配置项,设置当前项目所有自定义的配置 +yshop: + captcha: + enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试; + security: + mock-enable: true + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + access-log: # 访问日志的配置项 + enable: false + error-code: # 错误码相关配置项 + enable: false + demo: false # 关闭演示模式 + sms-code: + expire-times: 10m + send-frequency: 1m + send-maximum-quantity-per-day: 1000 + begin-code: 1111 # 这里配置 9999 的原因是,测试方便。 + end-code: 9999 # 这里配置 9999 的原因是,测试方便。 + api-key: LTAI5tBBPdRd4f2YZt5UhVjF + api-secret: iVP7EsjX309epI7MqsScziGhcrEHiT + signature: 中科鑫智 + + +justauth: + enabled: true + type: + DINGTALK: # 钉钉 + client-id: dingvrnreaje3yqvzhxg + client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI + ignore-check-redirect-uri: true + WECHAT_ENTERPRISE: # 企业微信 + client-id: wwd411c69a39ad2e54 + client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw + agent-id: 1000004 + ignore-check-redirect-uri: true + WECHAT_MINI_APP: # 微信小程序 + client-id: ${wx.miniapp.appid} + client-secret: ${wx.miniapp.secret} + ignore-check-redirect-uri: true + ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 + WECHAT_OPEN: #微信开发平台 + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_open/callback + + cache: + type: REDIS + prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: + timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 +