From b3d69777dc842c4ee75eecb8acdb6cd14089d15a Mon Sep 17 00:00:00 2001 From: liuchen864 <23082234@qq.com> Date: Sun, 24 Sep 2023 11:39:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AB=AF=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=97=A0=E7=94=A8=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- win-framework/pom.xml | 7 - .../banner/core/BannerApplicationRunner.java | 12 - .../win-spring-boot-starter-biz-pay/pom.xml | 76 -- .../pay/config/WinPayAutoConfiguration.java | 22 - .../framework/pay/core/client/PayClient.java | 79 -- .../pay/core/client/PayClientConfig.java | 30 - .../pay/core/client/PayClientFactory.java | 38 - .../client/dto/order/PayOrderRespDTO.java | 141 --- .../dto/order/PayOrderUnifiedReqDTO.java | 92 -- .../client/dto/refund/PayRefundRespDTO.java | 115 -- .../dto/refund/PayRefundUnifiedReqDTO.java | 70 -- .../core/client/exception/PayException.java | 17 - .../core/client/impl/AbstractPayClient.java | 193 --- .../core/client/impl/NonePayClientConfig.java | 31 - .../client/impl/PayClientFactoryImpl.java | 95 -- .../impl/alipay/AbstractAlipayPayClient.java | 215 ---- .../impl/alipay/AlipayAppPayClient.java | 60 - .../impl/alipay/AlipayBarPayClient.java | 78 -- .../impl/alipay/AlipayPayClientConfig.java | 109 -- .../client/impl/alipay/AlipayPcPayClient.java | 70 -- .../client/impl/alipay/AlipayQrPayClient.java | 57 - .../impl/alipay/AlipayWapPayClient.java | 59 - .../core/client/impl/mock/MockPayClient.java | 67 - .../impl/weixin/AbstractWxPayClient.java | 470 ------- .../client/impl/weixin/WxAppPayClient.java | 63 - .../client/impl/weixin/WxBarPayClient.java | 107 -- .../client/impl/weixin/WxLitePayClient.java | 22 - .../client/impl/weixin/WxNativePayClient.java | 58 - .../client/impl/weixin/WxPayClientConfig.java | 110 -- .../client/impl/weixin/WxPubPayClient.java | 80 -- .../core/enums/channel/PayChannelEnum.java | 66 - .../enums/order/PayOrderDisplayModeEnum.java | 29 - .../enums/order/PayOrderStatusRespEnum.java | 56 - .../enums/refund/PayRefundStatusRespEnum.java | 32 - ...ot.autoconfigure.AutoConfiguration.imports | 1 - .../PayClientFactoryImplIntegrationTest.java | 133 -- .../impl/alipay/AbstractAlipayClientTest.java | 221 ---- .../impl/alipay/AlipayBarPayClientTest.java | 170 --- .../impl/alipay/AlipayPcPayClientTest.java | 131 -- .../impl/alipay/AlipayQrPayClientTest.java | 147 --- .../impl/alipay/AlipayWapPayClientTest.java | 111 -- .../weixin/WxBarPayClientIntegrationTest.java | 123 -- .../WxNativePayClientIntegrationTest.java | 83 -- win-module-mall/pom.xml | 29 - .../win-module-product-api/pom.xml | 34 - .../api/comment/ProductCommentApi.java | 20 - .../dto/ProductCommentCreateReqDTO.java | 59 - .../win/module/product/api/package-info.java | 4 - .../api/property/ProductPropertyValueApi.java | 23 - .../ProductPropertyValueDetailRespDTO.java | 33 - .../module/product/api/sku/ProductSkuApi.java | 48 - .../api/sku/dto/ProductSkuRespDTO.java | 73 -- .../sku/dto/ProductSkuUpdateStockReqDTO.java | 47 - .../module/product/api/spu/ProductSpuApi.java | 31 - .../api/spu/dto/ProductSpuRespDTO.java | 130 -- .../product/enums/DictTypeConstants.java | 13 - .../product/enums/ErrorCodeConstants.java | 55 - .../product/enums/ProductConstants.java | 15 - .../ProductCommentAuditStatusEnum.java | 38 - .../comment/ProductCommentScoresEnum.java | 41 - .../enums/group/ProductGroupStyleEnum.java | 38 - .../enums/spu/ProductSpuStatusEnum.java | 48 - .../win-module-product-biz/pom.xml | 77 -- .../api/comment/ProductCommentApiImpl.java | 27 - .../win/module/product/api/package-info.java | 1 - .../property/ProductPropertyValueApiImpl.java | 31 - .../product/api/sku/ProductSkuApiImpl.java | 59 - .../product/api/spu/ProductSpuApiImpl.java | 44 - .../admin/brand/ProductBrandController.java | 92 -- .../admin/brand/vo/ProductBrandBaseVO.java | 34 - .../brand/vo/ProductBrandCreateReqVO.java | 14 - .../admin/brand/vo/ProductBrandListReqVO.java | 13 - .../admin/brand/vo/ProductBrandPageReqVO.java | 30 - .../admin/brand/vo/ProductBrandRespVO.java | 22 - .../brand/vo/ProductBrandSimpleRespVO.java | 20 - .../brand/vo/ProductBrandUpdateReqVO.java | 20 - .../category/ProductCategoryController.java | 76 -- .../category/vo/ProductCategoryBaseVO.java | 38 - .../vo/ProductCategoryCreateReqVO.java | 19 - .../category/vo/ProductCategoryListReqVO.java | 19 - .../category/vo/ProductCategoryRespVO.java | 22 - .../vo/ProductCategoryUpdateReqVO.java | 24 - .../comment/ProductCommentController.http | 0 .../comment/ProductCommentController.java | 62 - .../comment/vo/ProductCommentBaseVO.java | 47 - .../comment/vo/ProductCommentCreateReqVO.java | 14 - .../comment/vo/ProductCommentPageReqVO.java | 45 - .../comment/vo/ProductCommentReplyReqVO.java | 23 - .../comment/vo/ProductCommentRespVO.java | 63 - .../vo/ProductCommentUpdateVisibleReqVO.java | 22 - .../property/ProductPropertyController.java | 100 -- .../ProductPropertyValueController.java | 75 -- .../ProductPropertyAndValueRespVO.java | 35 - .../vo/property/ProductPropertyBaseVO.java | 22 - .../property/ProductPropertyCreateReqVO.java | 15 - .../vo/property/ProductPropertyListReqVO.java | 17 - .../vo/property/ProductPropertyPageReqVO.java | 30 - .../vo/property/ProductPropertyRespVO.java | 22 - .../property/ProductPropertyUpdateReqVO.java | 20 - .../vo/value/ProductPropertyValueBaseVO.java | 27 - .../ProductPropertyValueCreateReqVO.java | 14 - .../ProductPropertyValueDetailRespVO.java | 22 - .../value/ProductPropertyValuePageReqVO.java | 24 - .../vo/value/ProductPropertyValueRespVO.java | 22 - .../ProductPropertyValueUpdateReqVO.java | 20 - .../admin/sku/ProductSkuController.java | 14 - .../admin/sku/vo/ProductSkuBaseVO.java | 82 -- .../sku/vo/ProductSkuCreateOrUpdateReqVO.java | 16 - .../admin/sku/vo/ProductSkuRespVO.java | 18 - .../admin/spu/ProductSpuController.http | 4 - .../admin/spu/ProductSpuController.java | 134 -- .../admin/spu/vo/ProductSpuBaseVO.java | 114 -- .../admin/spu/vo/ProductSpuCreateReqVO.java | 24 - .../admin/spu/vo/ProductSpuDetailRespVO.java | 34 - .../admin/spu/vo/ProductSpuExcelVO.java | 112 -- .../admin/spu/vo/ProductSpuExportReqVO.java | 32 - .../admin/spu/vo/ProductSpuPageReqVO.java | 58 - .../admin/spu/vo/ProductSpuRespVO.java | 40 - .../admin/spu/vo/ProductSpuSimpleRespVO.java | 41 - .../admin/spu/vo/ProductSpuUpdateReqVO.java | 41 - .../spu/vo/ProductSpuUpdateStatusReqVO.java | 23 - .../app/category/AppCategoryController.java | 38 - .../app/category/vo/AppCategoryRespVO.java | 28 - .../app/comment/AppCommentController.http | 0 .../comment/AppProductCommentController.java | 80 -- .../app/comment/vo/AppCommentPageReqVO.java | 38 - .../vo/AppCommentStatisticsRespVO.java | 24 - .../comment/vo/AppProductCommentRespVO.java | 98 -- .../app/favorite/AppFavoriteController.java | 105 -- .../favorite/vo/AppFavoriteBatchReqVO.java | 19 - .../app/favorite/vo/AppFavoritePageReqVO.java | 10 - .../app/favorite/vo/AppFavoriteReqVO.java | 18 - .../app/favorite/vo/AppFavoriteRespVO.java | 28 - .../controller/app/property/package-info.java | 4 - .../property/vo/property/package-info.java | 4 - .../AppProductPropertyValueDetailRespVO.java | 22 - .../app/spu/AppProductSpuController.http | 18 - .../app/spu/AppProductSpuController.java | 83 -- .../app/spu/vo/AppProductSpuDetailRespVO.java | 109 -- .../app/spu/vo/AppProductSpuPageReqVO.java | 52 - .../app/spu/vo/AppProductSpuPageRespVO.java | 57 - .../convert/brand/ProductBrandConvert.java | 36 - .../category/ProductCategoryConvert.java | 32 - .../comment/ProductCommentConvert.java | 132 -- .../favorite/ProductFavoriteConvert.java | 37 - .../property/ProductPropertyConvert.java | 57 - .../ProductPropertyValueConvert.java | 55 - .../convert/sku/ProductSkuConvert.java | 77 -- .../convert/spu/ProductSpuConvert.java | 122 -- .../dal/dataobject/brand/ProductBrandDO.java | 53 - .../category/ProductCategoryDO.java | 68 - .../dataobject/comment/ProductCommentDO.java | 159 --- .../favorite/ProductFavoriteDO.java | 43 - .../property/ProductPropertyDO.java | 51 - .../property/ProductPropertyValueDO.java | 55 - .../dal/dataobject/sku/ProductSkuDO.java | 156 --- .../dal/dataobject/spu/ProductSpuDO.java | 212 ---- .../dal/mysql/brand/ProductBrandMapper.java | 37 - .../mysql/category/ProductCategoryMapper.java | 35 - .../mysql/comment/ProductCommentMapper.java | 79 -- .../mysql/favorite/ProductFavoriteMapper.java | 28 - .../mysql/property/ProductPropertyMapper.java | 32 - .../property/ProductPropertyValueMapper.java | 43 - .../dal/mysql/sku/ProductSkuMapper.java | 63 - .../dal/mysql/spu/ProductSpuMapper.java | 169 --- .../product/framework/package-info.java | 6 - .../web/config/ProductWebConfiguration.java | 24 - .../product/framework/web/package-info.java | 4 - .../com/win/module/product/package-info.java | 8 - .../service/brand/ProductBrandService.java | 86 -- .../brand/ProductBrandServiceImpl.java | 122 -- .../category/ProductCategoryService.java | 78 -- .../category/ProductCategoryServiceImpl.java | 149 --- .../comment/ProductCommentService.java | 94 -- .../comment/ProductCommentServiceImpl.java | 167 --- .../favorite/ProductFavoriteService.java | 56 - .../favorite/ProductFavoriteServiceImpl.java | 67 - .../property/ProductPropertyService.java | 73 -- .../property/ProductPropertyServiceImpl.java | 119 -- .../property/ProductPropertyValueService.java | 90 -- .../ProductPropertyValueServiceImpl.java | 134 -- .../bo/ProductPropertyValueDetailRespBO.java | 33 - .../service/sku/ProductSkuService.java | 127 -- .../service/sku/ProductSkuServiceImpl.java | 278 ----- .../service/spu/ProductSpuService.java | 139 --- .../service/spu/ProductSpuServiceImpl.java | 253 ---- .../brand/ProductBrandServiceImplTest.java | 133 -- .../ProductCategoryServiceImplTest.java | 161 --- .../ProductCommentServiceImplTest.java | 196 --- .../service/sku/ProductSkuServiceTest.java | 205 --- .../spu/ProductSpuServiceImplTest.java | 503 -------- .../test/resources/application-unit-test.yaml | 50 - .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 7 - .../src/test/resources/sql/create_tables.sql | 157 --- .../win-module-promotion-api/pom.xml | 40 - .../api/bargain/BargainActivityApi.java | 18 - .../api/bargain/BargainRecordApi.java | 32 - .../dto/BargainRecordCreateReqDTO.java | 60 - .../api/combination/CombinationRecordApi.java | 79 -- .../dto/CombinationRecordCreateReqDTO.java | 78 -- .../dto/CombinationRecordRespDTO.java | 41 - .../promotion/api/coupon/CouponApi.java | 38 - .../api/coupon/dto/CouponRespDTO.java | 109 -- .../api/coupon/dto/CouponUseReqDTO.java | 33 - .../api/coupon/dto/CouponValidReqDTO.java | 27 - .../api/discount/DiscountActivityApi.java | 23 - .../discount/dto/DiscountProductRespDTO.java | 48 - .../module/promotion/api/price/PriceApi.java | 21 - .../api/price/dto/CouponMeetRespDTO.java | 35 - .../api/price/dto/PriceCalculateReqDTO.java | 62 - .../api/price/dto/PriceCalculateRespDTO.java | 252 ---- .../api/reward/RewardActivityApi.java | 24 - .../dto/RewardActivityMatchRespDTO.java | 77 -- .../api/seckill/SeckillActivityApi.java | 19 - .../dto/SeckillActivityUpdateStockReqDTO.java | 50 - .../promotion/enums/ErrorCodeConstants.java | 93 -- .../CombinationRecordStatusEnum.java | 43 - .../common/PromotionActivityStatusEnum.java | 39 - .../common/PromotionConditionTypeEnum.java | 37 - .../common/PromotionDiscountTypeEnum.java | 38 - .../common/PromotionProductScopeEnum.java | 39 - .../enums/common/PromotionTypeEnum.java | 45 - .../enums/coupon/CouponStatusEnum.java | 39 - .../enums/coupon/CouponTakeTypeEnum.java | 38 - .../CouponTemplateValidityTypeEnum.java | 38 - .../enums/decorate/DecorateComponentEnum.java | 61 - .../enums/decorate/DecoratePageEnum.java | 39 - .../win-module-promotion-biz/pom.xml | 77 -- .../api/bargain/BargainActivityApiImpl.java | 41 - .../api/bargain/BargainRecordApiImpl.java | 24 - .../combination/CombinationRecordApiImpl.java | 61 - .../promotion/api/coupon/CouponApiImpl.java | 42 - .../api/discount/DiscountActivityApiImpl.java | 28 - .../promotion/api/price/PriceApiImpl.java | 28 - .../api/reward/RewardActivityApiImpl.java | 27 - .../api/seckill/SeckillActivityApiImpl.java | 84 -- .../admin/banner/BannerController.java | 74 -- .../admin/banner/vo/BannerBaseVO.java | 42 - .../admin/banner/vo/BannerCreateReqVO.java | 17 - .../admin/banner/vo/BannerPageReqVO.java | 37 - .../admin/banner/vo/BannerRespVO.java | 15 - .../admin/banner/vo/BannerUpdateReqVO.java | 23 - .../bargain/BargainActivityController.java | 79 -- .../bargain/vo/BargainActivityBaseVO.java | 75 -- .../vo/BargainActivityCreateReqVO.java | 14 - .../bargain/vo/BargainActivityPageReqVO.java | 21 - .../bargain/vo/BargainActivityRespVO.java | 35 - .../vo/BargainActivityUpdateReqVO.java | 20 - .../CombinationActivityController.java | 96 -- .../activity/CombinationActivityBaseVO.java | 55 - .../CombinationActivityCreateReqVO.java | 22 - .../CombinationActivityPageReqVO.java | 22 - .../activity/CombinationActivityRespVO.java | 50 - .../CombinationActivityUpdateReqVO.java | 27 - .../vo/product/CombinationProductBaseVO.java | 27 - .../product/CombinationProductPageReqVO.java | 47 - .../vo/product/CombinationProductRespVO.java | 22 - .../admin/coupon/CouponController.java | 83 -- .../coupon/CouponTemplateController.java | 78 -- .../admin/coupon/vo/coupon/CouponBaseVO.java | 103 -- .../vo/coupon/CouponPageItemRespVO.java | 17 - .../coupon/vo/coupon/CouponPageReqVO.java | 33 - .../admin/coupon/vo/coupon/CouponRespVO.java | 22 - .../coupon/vo/coupon/CouponSendReqVO.java | 24 - .../vo/template/CouponTemplateBaseVO.java | 154 --- .../template/CouponTemplateCreateReqVO.java | 14 - .../vo/template/CouponTemplatePageReqVO.java | 40 - .../vo/template/CouponTemplateRespVO.java | 34 - .../template/CouponTemplateUpdateReqVO.java | 20 - .../CouponTemplateUpdateStatusReqVO.java | 23 - .../decorate/DecorateComponentController.http | 18 - .../decorate/DecorateComponentController.java | 50 - .../decorate/vo/DecorateComponentRespVO.java | 19 - .../vo/DecorateComponentSaveReqVO.java | 31 - .../discount/DiscountActivityController.java | 87 -- .../discount/vo/DiscountActivityBaseVO.java | 81 -- .../vo/DiscountActivityCreateReqVO.java | 25 - .../vo/DiscountActivityDetailRespVO.java | 21 - .../vo/DiscountActivityPageReqVO.java | 30 - .../discount/vo/DiscountActivityRespVO.java | 27 - .../vo/DiscountActivityUpdateReqVO.java | 30 - .../reward/RewardActivityController.java | 83 -- .../admin/reward/vo/RewardActivityBaseVO.java | 98 -- .../reward/vo/RewardActivityCreateReqVO.java | 14 - .../reward/vo/RewardActivityPageReqVO.java | 21 - .../admin/reward/vo/RewardActivityRespVO.java | 25 - .../reward/vo/RewardActivityUpdateReqVO.java | 20 - .../seckill/SeckillActivityController.java | 99 -- .../seckill/SeckillConfigController.java | 97 -- .../vo/activity/SeckillActivityBaseVO.java | 58 - .../activity/SeckillActivityCreateReqVO.java | 21 - .../activity/SeckillActivityDetailRespVO.java | 21 - .../vo/activity/SeckillActivityPageReqVO.java | 36 - .../vo/activity/SeckillActivityRespVO.java | 51 - .../activity/SeckillActivityUpdateReqVO.java | 23 - .../vo/config/SeckillConfigBaseVO.java | 53 - .../vo/config/SeckillConfigCreateReqVO.java | 14 - .../vo/config/SeckillConfigPageReqVO.java | 21 - .../vo/config/SeckillConfigRespVO.java | 25 - .../vo/config/SeckillConfigSimpleRespVO.java | 24 - .../vo/config/SeckillConfigUpdateReqVO.java | 20 - .../SeckillConfigUpdateStatusReqVo.java | 23 - .../vo/product/SeckillProductBaseVO.java | 29 - .../vo/product/SeckillProductRespVO.java | 22 - .../app/activity/AppActivityController.java | 66 - .../app/activity/vo/AppActivityRespVO.java | 28 - .../article/AppArticleCategoryController.java | 39 - .../app/article/AppArticleController.java | 90 -- .../vo/article/AppArticlePageReqVO.java | 14 - .../article/vo/article/AppArticleRespVO.java | 49 - .../vo/category/AppArticleCategoryRespVO.java | 26 - .../app/banner/AppBannerController.java | 42 - .../app/banner/vo/AppBannerRespVO.java | 20 - .../bargain/AppBargainActivityController.java | 110 -- .../app/bargain/AppBargainHelpController.java | 45 - .../bargain/AppBargainRecordController.java | 145 --- .../AppBargainActivityDetailRespVO.java | 54 - .../vo/activity/AppBargainActivityRespVO.java | 42 - .../vo/help/AppBargainHelpCreateReqVO.java | 16 - .../bargain/vo/help/AppBargainHelpRespVO.java | 24 - .../record/AppBargainRecordCreateReqVO.java | 16 - .../record/AppBargainRecordDetailRespVO.java | 33 - .../vo/record/AppBargainRecordRespVO.java | 32 - .../record/AppBargainRecordSummaryRespVO.java | 33 - .../AppCombinationActivityController.java | 129 -- .../AppCombinationRecordController.java | 109 -- .../AppCombinationActivityDetailRespVO.java | 58 - .../AppCombinationActivityRespVO.java | 34 - .../AppCombinationRecordDetailRespVO.java | 22 - .../vo/record/AppCombinationRecordRespVO.java | 45 - .../AppCombinationRecordSummaryRespVO.java | 18 - .../app/coupon/AppCouponController.java | 110 -- .../coupon/AppCouponTemplateController.java | 114 -- .../coupon/vo/coupon/AppCouponMatchReqVO.java | 30 - .../vo/coupon/AppCouponMatchRespVO.java | 16 - .../coupon/vo/coupon/AppCouponPageReqVO.java | 18 - .../app/coupon/vo/coupon/AppCouponRespVO.java | 45 - .../coupon/vo/coupon/AppCouponTakeReqVO.java | 16 - .../template/AppCouponTemplatePageReqVO.java | 19 - .../vo/template/AppCouponTemplateRespVO.java | 69 - .../app/decorate/AppDecorateController.java | 42 - .../vo/AppDecorateComponentRespVO.java | 16 - .../seckill/AppSeckillActivityController.java | 136 -- .../seckill/AppSeckillConfigController.java | 36 - .../AppSeckillActivityDetailRespVO.java | 63 - .../activity/AppSeckillActivityNowRespVO.java | 19 - .../activity/AppSeckillActivityPageReqVO.java | 18 - .../vo/activity/AppSeckillActivityRespVO.java | 37 - .../vo/config/AppSeckillConfigRespVO.java | 23 - .../convert/banner/BannerConvert.java | 28 - .../bargain/BargainActivityConvert.java | 33 - .../CombinationActivityConvert.java | 97 -- .../convert/coupon/CouponConvert.java | 52 - .../convert/coupon/CouponTemplateConvert.java | 29 - .../decorate/DecorateComponentConvert.java | 23 - .../discount/DiscountActivityConvert.java | 90 -- .../promotion/convert/price/PriceConvert.java | 49 - .../convert/reward/RewardActivityConvert.java | 29 - .../SeckillActivityConvert.java | 82 -- .../seckillconfig/SeckillConfigConvert.java | 36 - .../dal/dataobject/banner/BannerDO.java | 53 - .../dataobject/bargain/BargainActivityDO.java | 101 -- .../dataobject/bargain/BargainAssistDO.java | 50 - .../dataobject/bargain/BargainRecordDO.java | 87 -- .../combination/CombinationActivityDO.java | 89 -- .../combination/CombinationProductDO.java | 67 - .../combination/CombinationRecordDO.java | 125 -- .../dal/dataobject/coupon/CouponDO.java | 139 --- .../dataobject/coupon/CouponTemplateDO.java | 162 --- .../decorate/DecorateComponentDO.java | 52 - .../discount/DiscountActivityDO.java | 58 - .../discount/DiscountProductDO.java | 68 - .../dataobject/reward/RewardActivityDO.java | 134 -- .../seckillactivity/SeckillActivityDO.java | 98 -- .../seckillactivity/SeckillProductDO.java | 81 -- .../seckillconfig/SeckillConfigDO.java | 58 - .../dal/mysql/banner/BannerMapper.java | 26 - .../mysql/bargain/BargainActivityMapper.java | 31 - .../mysql/bargain/BargainRecordMapper.java | 15 - .../CombinationActivityMapper.java | 31 - .../combination/CombinationProductMapper.java | 38 - .../combination/CombinationRecordMapper.java | 62 - .../dal/mysql/coupon/CouponMapper.java | 65 - .../mysql/coupon/CouponTemplateMapper.java | 48 - .../decorate/DecorateComponentMapper.java | 28 - .../discount/DiscountActivityMapper.java | 30 - .../mysql/discount/DiscountProductMapper.java | 26 - .../mysql/reward/RewardActivityMapper.java | 38 - .../SeckillActivityMapper.java | 35 - .../seckillactivity/SeckillProductMapper.java | 26 - .../seckillconfig/SeckillConfigMapper.java | 26 - .../promotion/framework/package-info.java | 6 - .../web/config/PromotionWebConfiguration.java | 24 - .../promotion/framework/web/package-info.java | 4 - .../win/module/promotion/package-info.java | 8 - .../service/banner/BannerService.java | 63 - .../service/banner/BannerServiceImpl.java | 78 -- .../bargain/BargainActivityService.java | 57 - .../bargain/BargainActivityServiceImpl.java | 124 -- .../service/bargain/BargainRecordService.java | 13 - .../bargain/BargainRecordServiceImpl.java | 14 - .../CombinationActivityService.java | 75 -- .../CombinationActivityServiceImpl.java | 208 ---- .../combination/CombinationRecordService.java | 70 -- .../CombinationRecordServiceImpl.java | 156 --- .../service/coupon/CouponService.java | 127 -- .../service/coupon/CouponServiceImpl.java | 231 ---- .../service/coupon/CouponTemplateService.java | 72 -- .../coupon/CouponTemplateServiceImpl.java | 95 -- .../decorate/DecorateComponentService.java | 31 - .../DecorateComponentServiceImpl.java | 40 - .../discount/DiscountActivityService.java | 84 -- .../discount/DiscountActivityServiceImpl.java | 178 --- .../promotion/service/price/PriceService.java | 23 - .../service/price/PriceServiceImpl.java | 96 -- .../service/reward/RewardActivityService.java | 74 -- .../reward/RewardActivityServiceImpl.java | 166 --- .../seckill/SeckillActivityService.java | 96 -- .../seckill/SeckillActivityServiceImpl.java | 244 ---- .../service/seckill/SeckillConfigService.java | 88 -- .../seckill/SeckillConfigServiceImpl.java | 149 --- .../module/promotion/util/PromotionUtils.java | 25 - .../mapper/coupon/CouponTemplateMapper.xml | 11 - .../CombinationActivityServiceImplTest.java | 216 ---- .../coupon/CouponTemplateServiceImplTest.java | 147 --- .../DecorateComponentServiceImplTest.java | 36 - .../DiscountActivityServiceImplTest.java | 210 ---- .../service/price/PriceServiceTest.java | 104 -- .../reward/RewardActivityServiceImplTest.java | 218 ---- .../SeckillActivityServiceImplTest.java | 171 --- .../SeckillConfigServiceImplTest.java | 190 --- .../test/resources/application-unit-test.yaml | 49 - .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 8 - .../src/test/resources/sql/create_tables.sql | 183 --- win-module-mall/win-module-trade-api/pom.xml | 26 - .../trade/api/brokerage/BrokerageApi.java | 29 - .../api/brokerage/dto/BrokerageUserDTO.java | 51 - .../module/trade/api/order/TradeOrderApi.java | 19 - .../api/order/dto/TradeOrderRespDTO.java | 87 -- .../win/module/trade/api/package-info.java | 1 - .../trade/enums/ErrorCodeConstants.java | 87 -- .../trade/enums/MessageTemplateConstants.java | 13 - .../aftersale/AfterSaleOperateTypeEnum.java | 28 - .../aftersale/TradeAfterSaleStatusEnum.java | 95 -- .../aftersale/TradeAfterSaleTypeEnum.java | 37 - .../aftersale/TradeAfterSaleWayEnum.java | 37 - .../brokerage/BrokerageBindModeEnum.java | 48 - .../BrokerageEnabledConditionEnum.java | 44 - .../brokerage/BrokerageRecordBizTypeEnum.java | 46 - .../brokerage/BrokerageRecordStatusEnum.java | 39 - .../BrokerageWithdrawStatusEnum.java | 41 - .../brokerage/BrokerageWithdrawTypeEnum.java | 40 - .../DeliveryExpressChargeModeEnum.java | 43 - .../enums/delivery/DeliveryTypeEnum.java | 38 - .../trade/enums/notify/TradeNotifyEnums.java | 5 - .../enums/order/TradeOrderCancelTypeEnum.java | 39 - .../TradeOrderItemAfterSaleStatusEnum.java | 49 - .../order/TradeOrderRefundStatusEnum.java | 38 - .../enums/order/TradeOrderStatusEnum.java | 116 -- .../trade/enums/order/TradeOrderTypeEnum.java | 40 - win-module-mall/win-module-trade-biz/pom.xml | 112 -- .../trade/api/brokerage/BrokerageApiImpl.java | 33 - .../trade/api/order/TradeOrderApiImpl.java | 35 - .../win/module/trade/api/package-info.java | 1 - .../aftersale/TradeAfterSaleController.http | 33 - .../aftersale/TradeAfterSaleController.java | 172 --- .../aftersale/vo/TradeAfterSaleBaseVO.java | 119 -- .../vo/TradeAfterSaleDetailRespVO.java | 51 - .../vo/TradeAfterSaleDisagreeReqVO.java | 21 - .../aftersale/vo/TradeAfterSalePageReqVO.java | 49 - .../vo/TradeAfterSaleRefuseReqVO.java | 20 - .../vo/TradeAfterSaleRespPageItemVO.java | 35 - .../vo/log/TradeAfterSaleLogRespVO.java | 50 - .../admin/base/member/package-info.java | 4 - .../base/member/user/MemberUserRespVO.java | 19 - .../controller/admin/base/package-info.java | 4 - .../ProductPropertyValueDetailRespVO.java | 22 - .../record/BrokerageRecordController.java | 51 - .../record/vo/BrokerageRecordBaseVO.java | 60 - .../record/vo/BrokerageRecordPageReqVO.java | 33 - .../record/vo/BrokerageRecordRespVO.java | 22 - .../user/BrokerageUserController.java | 104 -- .../user/vo/BrokerageUserBaseVO.java | 43 - .../BrokerageUserClearBrokerageUserReqVO.java | 18 - .../user/vo/BrokerageUserPageReqVO.java | 30 - .../user/vo/BrokerageUserRespVO.java | 45 - ...kerageUserUpdateBrokerageEnabledReqVO.java | 22 - ...BrokerageUserUpdateBrokerageUserReqVO.java | 22 - .../admin/config/TradeConfigController.java | 45 - .../admin/config/vo/TradeConfigBaseVO.java | 71 -- .../admin/config/vo/TradeConfigRespVO.java | 17 - .../admin/config/vo/TradeConfigSaveReqVO.java | 14 - .../delivery/DeliveryExpressController.java | 96 -- .../DeliveryExpressTemplateController.java | 90 -- .../DeliveryPickUpStoreController.java | 91 -- .../vo/express/DeliveryExpressBaseVO.java | 34 - .../express/DeliveryExpressCreateReqVO.java | 12 - .../vo/express/DeliveryExpressExcelVO.java | 39 - .../express/DeliveryExpressExportReqVO.java | 28 - .../vo/express/DeliveryExpressPageReqVO.java | 31 - .../vo/express/DeliveryExpressRespVO.java | 22 - .../express/DeliveryExpressSimpleRespVO.java | 24 - .../express/DeliveryExpressUpdateReqVO.java | 20 - .../DeliveryExpressTemplateBaseVO.java | 27 - .../DeliveryExpressTemplateCreateReqVO.java | 26 - .../DeliveryExpressTemplateDetailRespVO.java | 25 - .../DeliveryExpressTemplatePageReqVO.java | 30 - .../DeliveryExpressTemplateRespVO.java | 22 - .../DeliveryExpressTemplateSimpleRespVO.java | 21 - .../DeliveryExpressTemplateUpdateReqVO.java | 56 - .../ExpressTemplateChargeBaseVO.java | 35 - .../ExpressTemplateFreeBaseVO.java | 28 - .../vo/pickup/DeliveryPickUpStoreBaseVO.java | 68 - .../DeliveryPickUpStoreCreateReqVO.java | 14 - .../pickup/DeliveryPickUpStorePageReqVO.java | 40 - .../vo/pickup/DeliveryPickUpStoreRespVO.java | 22 - .../DeliveryPickUpStoreSimpleRespVO.java | 32 - .../DeliveryPickUpStoreUpdateReqVO.java | 20 - .../admin/order/TradeOrderController.http | 9 - .../admin/order/TradeOrderController.java | 124 -- .../admin/order/vo/TradeOrderBaseVO.java | 144 --- .../order/vo/TradeOrderDeliveryReqVO.java | 23 - .../order/vo/TradeOrderDetailRespVO.java | 59 - .../admin/order/vo/TradeOrderItemBaseVO.java | 67 - .../order/vo/TradeOrderPageItemRespVO.java | 39 - .../admin/order/vo/TradeOrderPageReqVO.java | 65 - .../admin/order/vo/TradeOrderRemarkReqVO.java | 21 - .../vo/TradeOrderUpdateAddressReqVO.java | 33 - .../order/vo/TradeOrderUpdatePriceReqVO.java | 20 - .../AppTradeAfterSaleController.java | 96 -- .../vo/AppTradeAfterSaleCreateReqVO.java | 40 - .../vo/AppTradeAfterSaleDeliveryReqVO.java | 24 - .../aftersale/vo/AppTradeAfterSaleRespVO.java | 103 -- .../controller/app/base/package-info.java | 4 - .../AppProductPropertyValueDetailRespVO.java | 22 - .../app/base/sku/AppProductSkuBaseRespVO.java | 34 - .../app/base/spu/AppProductSpuBaseRespVO.java | 25 - .../AppBrokerageRecordController.java | 55 - .../brokerage/AppBrokerageUserController.java | 134 -- .../AppBrokerageWithdrawController.java | 47 - .../AppBrokerageProductPriceRespVO.java | 19 - .../record/AppBrokerageRecordPageReqVO.java | 22 - .../vo/record/AppBrokerageRecordRespVO.java | 27 - .../vo/user/AppBrokerageUserBindReqVO.java | 17 - ...AppBrokerageUserChildSummaryPageReqVO.java | 25 - .../AppBrokerageUserChildSummaryRespVO.java | 33 - .../user/AppBrokerageUserMySummaryRespVO.java | 28 - .../AppBrokerageUserRankByPriceRespVO.java | 22 - ...AppBrokerageUserRankByUserCountRespVO.java | 22 - .../user/AppBrokerageUserRankPageReqVO.java | 22 - .../vo/user/AppBrokerageUserRespVO.java | 19 - .../AppBrokerageWithdrawCreateReqVO.java | 73 -- .../withdraw/AppBrokerageWithdrawRespVO.java | 27 - .../app/cart/AppCartController.http | 42 - .../app/cart/AppCartController.java | 87 -- .../app/cart/vo/AppCartAddReqVO.java | 20 - .../app/cart/vo/AppCartDetailRespVO.java | 117 -- .../app/cart/vo/AppCartListRespVO.java | 48 - .../app/cart/vo/AppCartResetReqVO.java | 26 - .../app/cart/vo/AppCartUpdateCountReqVO.java | 22 - .../cart/vo/AppCartUpdateSelectedReqVO.java | 21 - .../app/config/AppTradeConfigController.java | 37 - .../app/config/vo/AppTradeConfigRespVO.java | 21 - .../delivery/AppDeliverConfigController.java | 26 - .../delivery/AppDeliverExpressController.java | 39 - .../AppDeliverPickUpStoreController.java | 74 -- .../vo/config/AppDeliveryConfigRespVO.java | 17 - .../vo/express/AppDeliveryExpressRespVO.java | 16 - .../pickup/AppDeliveryPickUpStoreRespVO.java | 40 - .../app/order/AppTradeOrderController.http | 42 - .../app/order/AppTradeOrderController.java | 180 --- .../order/vo/AppOrderExpressTrackRespDTO.java | 23 - .../order/vo/AppTradeOrderCreateReqVO.java | 13 - .../order/vo/AppTradeOrderCreateRespVO.java | 16 - .../order/vo/AppTradeOrderDetailRespVO.java | 134 -- .../order/vo/AppTradeOrderPageItemRespVO.java | 53 - .../app/order/vo/AppTradeOrderPageReqVO.java | 20 - .../vo/AppTradeOrderSettlementReqVO.java | 92 -- .../vo/AppTradeOrderSettlementRespVO.java | 117 -- .../AppTradeOrderItemCommentCreateReqVO.java | 38 - .../vo/item/AppTradeOrderItemRespVO.java | 61 - .../module/trade/controller/package-info.java | 6 - .../aftersale/TradeAfterSaleConvert.java | 89 -- .../record/BrokerageRecordConvert.java | 50 - .../brokerage/user/BrokerageUserConvert.java | 56 - .../trade/convert/cart/TradeCartConvert.java | 53 - .../convert/config/TradeConfigConvert.java | 23 - .../delivery/DeliveryExpressConvert.java | 37 - .../DeliveryExpressTemplateConvert.java | 96 -- .../delivery/DeliveryPickUpStoreConvert.java | 41 - .../convert/order/TradeOrderConvert.java | 286 ----- .../aftersale/TradeAfterSaleDO.java | 201 --- .../aftersale/TradeAfterSaleLogDO.java | 64 - .../brokerage/record/BrokerageRecordDO.java | 82 -- .../brokerage/user/BrokerageUserDO.java | 63 - .../trade/dal/dataobject/cart/CartDO.java | 59 - .../dal/dataobject/config/TradeConfigDO.java | 90 -- .../delivery/DeliveryExpressDO.java | 60 - .../DeliveryExpressTemplateChargeDO.java | 67 - .../delivery/DeliveryExpressTemplateDO.java | 43 - .../DeliveryExpressTemplateFreeDO.java | 57 - .../delivery/DeliveryPickUpStoreDO.java | 84 -- .../delivery/DeliveryPickUpStoreStaffDO.java | 49 - .../dal/dataobject/order/TradeOrderDO.java | 262 ---- .../dataobject/order/TradeOrderItemDO.java | 214 ---- .../aftersale/TradeAfterSaleLogMapper.java | 9 - .../mysql/aftersale/TradeAfterSaleMapper.java | 51 - .../record/BrokerageRecordMapper.java | 56 - .../brokerage/user/BrokerageUserMapper.java | 115 -- .../trade/dal/mysql/cart/CartMapper.java | 62 - .../dal/mysql/config/TradeConfigMapper.java | 15 - .../mysql/delivery/DeliveryExpressMapper.java | 48 - .../DeliveryExpressTemplateChargeMapper.java | 33 - .../DeliveryExpressTemplateFreeMapper.java | 31 - .../DeliveryExpressTemplateMapper.java | 26 - .../delivery/DeliveryPickUpStoreMapper.java | 33 - .../DeliveryPickUpStoreStaffMapper.java | 14 - .../dal/mysql/order/TradeOrderItemMapper.java | 41 - .../dal/mysql/order/TradeOrderMapper.java | 62 - .../module/trade/dal/mysql/package-info.java | 4 - .../dal/redis/no/TradeOrderNoRedisDAO.java | 36 - .../config/AfterSaleLogConfiguration.java | 22 - .../core/annotations/AfterSaleLog.java | 36 - .../core/aop/AfterSaleLogAspect.java | 123 -- .../dto/TradeAfterSaleLogCreateReqDTO.java | 54 - .../core/dto/TradeAfterSaleLogRespDTO.java | 59 - .../core/service/AfterSaleLogService.java | 34 - .../core/util/AfterSaleLogUtils.java | 22 - .../delivery/config/ExpressClientConfig.java | 32 - .../config/TradeExpressProperties.java | 80 -- .../delivery/core/client/ExpressClient.java | 23 - .../core/client/ExpressClientFactory.java | 24 - .../client/convert/ExpressQueryConvert.java | 33 - .../client/dto/ExpressTrackQueryReqDTO.java | 31 - .../core/client/dto/ExpressTrackRespDTO.java | 25 - .../dto/kd100/Kd100ExpressQueryReqDTO.java | 33 - .../dto/kd100/Kd100ExpressQueryRespDTO.java | 71 -- .../dto/kdniao/KdNiaoExpressQueryReqDTO.java | 32 - .../dto/kdniao/KdNiaoExpressQueryRespDTO.java | 99 -- .../client/impl/ExpressClientFactoryImpl.java | 54 - .../client/impl/NoProvideExpressClient.java | 24 - .../client/impl/kd100/Kd100ExpressClient.java | 107 -- .../impl/kdniao/KdNiaoExpressClient.java | 125 -- .../core/enums/ExpressClientEnum.java | 28 - .../order/config/TradeOrderConfig.java | 14 - .../order/config/TradeOrderProperties.java | 33 - .../module/trade/framework/package-info.java | 6 - .../web/config/TradeWebConfiguration.java | 24 - .../trade/framework/web/package-info.java | 4 - .../brokerage/BrokerageRecordUnfreezeJob.java | 29 - .../win/module/trade/job/package-info.java | 4 - .../com/win/module/trade/package-info.java | 8 - .../aftersale/TradeAfterSaleService.java | 127 -- .../aftersale/TradeAfterSaleServiceImpl.java | 459 ------- .../brokerage/bo/BrokerageAddReqBO.java | 39 - .../brokerage/bo/UserBrokerageSummaryBO.java | 26 - .../record/BrokerageRecordService.java | 70 -- .../record/BrokerageRecordServiceImpl.java | 236 ---- .../brokerage/user/BrokerageUserService.java | 108 -- .../user/BrokerageUserServiceImpl.java | 222 ---- .../trade/service/cart/CartService.java | 86 -- .../trade/service/cart/CartServiceImpl.java | 196 --- .../service/config/TradeConfigService.java | 29 - .../config/TradeConfigServiceImpl.java | 44 - .../delivery/DeliveryExpressService.java | 82 -- .../delivery/DeliveryExpressServiceImpl.java | 114 -- .../DeliveryExpressTemplateService.java | 95 -- .../DeliveryExpressTemplateServiceImpl.java | 251 ---- .../delivery/DeliveryPickUpStoreService.java | 73 -- .../DeliveryPickUpStoreServiceImpl.java | 84 -- .../bo/DeliveryExpressTemplateRespBO.java | 80 -- .../service/message/TradeMessageService.java | 19 - .../message/TradeMessageServiceImpl.java | 41 - ...adeOrderMessageWhenDeliveryOrderReqBO.java | 32 - .../service/order/TradeOrderQueryService.java | 122 -- .../order/TradeOrderQueryServiceImpl.java | 170 --- .../order/TradeOrderUpdateService.java | 127 -- .../order/TradeOrderUpdateServiceImpl.java | 809 ------------ .../service/price/TradePriceService.java | 23 - .../service/price/TradePriceServiceImpl.java | 100 -- .../price/bo/TradePriceCalculateReqBO.java | 93 -- .../price/bo/TradePriceCalculateRespBO.java | 277 ----- .../TradeCouponPriceCalculator.java | 113 -- .../TradeDeliveryPriceCalculator.java | 224 ---- .../TradeDiscountActivityPriceCalculator.java | 83 -- .../calculator/TradePriceCalculator.java | 25 - .../TradePriceCalculatorHelper.java | 266 ---- .../TradeRewardActivityPriceCalculator.java | 136 -- .../Kd100ExpressClientIntegrationTest.java | 46 - .../KdNiaoExpressClientIntegrationTest.java | 46 - .../aftersale/TradeAfterSaleServiceTest.java | 156 --- .../BrokerageRecordServiceImplTest.java | 117 -- .../user/BrokerageUserServiceImplTest.java | 65 - .../order/TradeOrderUpdateServiceTest.java | 316 ----- .../price/TradePriceServiceImplTest.java | 135 -- .../TradeCouponPriceCalculatorTest.java | 144 --- .../TradeDeliveryPriceCalculatorTest.java | 159 --- ...deDiscountActivityPriceCalculatorTest.java | 118 -- ...radeRewardActivityPriceCalculatorTest.java | 232 ---- .../test/resources/application-unit-test.yaml | 61 - .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 6 - .../src/test/resources/sql/create_tables.sql | 166 --- win-module-member/pom.xml | 24 - .../win-module-member-api/pom.xml | 26 - .../module/member/api/address/AddressApi.java | 29 - .../api/address/dto/AddressRespDTO.java | 42 - .../member/api/level/MemberLevelApi.java | 22 - .../win/module/member/api/package-info.java | 4 - .../member/api/point/MemberPointApi.java | 22 - .../module/member/api/user/MemberUserApi.java | 59 - .../api/user/dto/MemberUserRespDTO.java | 37 - .../member/enums/DictTypeConstants.java | 15 - .../member/enums/ErrorCodeConstants.java | 58 - .../enums/MemberExperienceBizTypeEnum.java | 50 - .../enums/point/MemberPointBizTypeEnum.java | 50 - .../win-module-member-biz/pom.xml | 99 -- .../member/api/address/AddressApiImpl.java | 33 - .../member/api/level/MemberLevelApiImpl.java | 34 - .../win/module/member/api/package-info.java | 1 - .../member/api/point/MemberPointApiImpl.java | 34 - .../member/api/user/MemberUserApiImpl.java | 47 - .../admin/address/AddressController.java | 41 - .../admin/address/package-info.java | 1 - .../admin/address/vo/AddressBaseVO.java | 37 - .../admin/address/vo/AddressRespVO.java | 19 - .../admin/group/MemberGroupController.java | 81 -- .../admin/group/vo/MemberGroupBaseVO.java | 29 - .../group/vo/MemberGroupCreateReqVO.java | 14 - .../admin/group/vo/MemberGroupPageReqVO.java | 30 - .../admin/group/vo/MemberGroupRespVO.java | 22 - .../group/vo/MemberGroupSimpleRespVO.java | 18 - .../group/vo/MemberGroupUpdateReqVO.java | 20 - .../MemberExperienceRecordController.java | 52 - .../admin/level/MemberLevelController.java | 80 -- .../level/MemberLevelRecordController.java | 52 - .../MemberExperienceRecordBaseVO.java | 43 - .../MemberExperienceRecordPageReqVO.java | 36 - .../MemberExperienceRecordRespVO.java | 22 - .../level/vo/level/MemberLevelBaseVO.java | 53 - .../vo/level/MemberLevelCreateReqVO.java | 14 - .../level/vo/level/MemberLevelListReqVO.java | 18 - .../level/vo/level/MemberLevelRespVO.java | 22 - .../vo/level/MemberLevelSimpleRespVO.java | 21 - .../vo/level/MemberLevelUpdateReqVO.java | 20 - .../vo/record/MemberLevelRecordBaseVO.java | 47 - .../vo/record/MemberLevelRecordPageReqVO.java | 30 - .../vo/record/MemberLevelRecordRespVO.java | 22 - .../point/MemberPointConfigController.java | 45 - .../point/MemberPointRecordController.java | 56 - .../vo/config/MemberPointConfigBaseVO.java | 31 - .../vo/config/MemberPointConfigRespVO.java | 17 - .../vo/config/MemberPointConfigSaveReqVO.java | 13 - .../vo/recrod/MemberPointRecordPageReqVO.java | 27 - .../vo/recrod/MemberPointRecordRespVO.java | 42 - .../signin/MemberSignInConfigController.java | 74 -- .../signin/MemberSignInRecordController.java | 55 - .../vo/config/MemberSignInConfigBaseVO.java | 30 - .../config/MemberSignInConfigCreateReqVO.java | 12 - .../vo/config/MemberSignInConfigRespVO.java | 19 - .../config/MemberSignInConfigUpdateReqVO.java | 18 - .../record/MemberSignInRecordPageReqVO.java | 33 - .../vo/record/MemberSignInRecordRespVO.java | 30 - .../admin/tag/MemberTagController.java | 94 -- .../admin/tag/vo/MemberTagBaseVO.java | 19 - .../admin/tag/vo/MemberTagCreateReqVO.java | 14 - .../admin/tag/vo/MemberTagPageReqVO.java | 27 - .../admin/tag/vo/MemberTagRespVO.java | 22 - .../admin/tag/vo/MemberTagUpdateReqVO.java | 20 - .../admin/user/MemberUserController.java | 102 -- .../admin/user/vo/MemberUserBaseVO.java | 65 - .../admin/user/vo/MemberUserPageReqVO.java | 44 - .../admin/user/vo/MemberUserRespVO.java | 52 - .../user/vo/MemberUserUpdateLevelReqVO.java | 31 - .../admin/user/vo/MemberUserUpdateReqVO.java | 20 - .../app/address/AppAddressController.http | 54 - .../app/address/AppAddressController.java | 82 -- .../app/address/vo/AppAddressBaseVO.java | 35 - .../app/address/vo/AppAddressCreateReqVO.java | 11 - .../app/address/vo/AppAddressRespVO.java | 20 - .../app/address/vo/AppAddressUpdateReqVO.java | 16 - .../app/auth/AppAuthController.http | 61 - .../app/auth/AppAuthController.java | 111 -- .../app/auth/vo/AppAuthCheckCodeReqVO.java | 41 - .../app/auth/vo/AppAuthLoginReqVO.java | 56 - .../app/auth/vo/AppAuthLoginRespVO.java | 38 - .../app/auth/vo/AppAuthSmsLoginReqVO.java | 58 - .../app/auth/vo/AppAuthSmsSendReqVO.java | 26 - .../app/auth/vo/AppAuthSmsValidateReqVO.java | 35 - .../app/auth/vo/AppAuthSocialLoginReqVO.java | 34 - .../vo/AppAuthWeixinMiniAppLoginReqVO.java | 26 - .../AppMemberExperienceRecordController.java | 43 - .../app/level/AppMemberLevelController.java | 36 - .../AppMemberExperienceRecordRespVO.java | 24 - .../level/vo/level/AppMemberLevelRespVO.java | 28 - .../point/AppMemberPointRecordController.java | 41 - .../point/vo/AppMemberPointRecordRespVO.java | 27 - .../AppMemberSignInConfigController.java | 37 - .../AppMemberSignInRecordController.java | 73 -- .../config/AppMemberSignInConfigRespVO.java | 16 - .../record/AppMemberSignInRecordRespVO.java | 21 - .../AppMemberSignInRecordSummaryRespVO.java | 19 - .../app/social/AppSocialUserController.java | 44 - .../app/social/vo/AppSocialUserBindReqVO.java | 34 - .../social/vo/AppSocialUserUnbindReqVO.java | 30 - .../app/user/AppMemberUserController.http | 4 - .../app/user/AppMemberUserController.java | 76 -- .../app/user/vo/AppMemberUserInfoRespVO.java | 53 - .../vo/AppMemberUserResetPasswordReqVO.java | 38 - .../vo/AppMemberUserUpdateMobileReqVO.java | 40 - .../vo/AppMemberUserUpdatePasswordReqVO.java | 31 - .../app/user/vo/AppMemberUserUpdateReqVO.java | 18 - .../member/controller/package-info.java | 6 - .../convert/address/AddressConvert.java | 45 - .../member/convert/auth/AuthConvert.java | 32 - .../convert/group/MemberGroupConvert.java | 35 - .../level/MemberExperienceRecordConvert.java | 34 - .../convert/level/MemberLevelConvert.java | 36 - .../level/MemberLevelRecordConvert.java | 37 - .../module/member/convert/package-info.java | 6 - .../point/MemberPointConfigConvert.java | 23 - .../point/MemberPointRecordConvert.java | 39 - .../signin/MemberSignInConfigConvert.java | 33 - .../signin/MemberSignInRecordConvert.java | 39 - .../convert/social/SocialUserConvert.java | 19 - .../member/convert/tag/MemberTagConvert.java | 33 - .../convert/user/MemberUserConvert.java | 63 - ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../dataobject/address/MemberAddressDO.java | 54 - .../dal/dataobject/group/MemberGroupDO.java | 45 - .../level/MemberExperienceRecordDO.java | 64 - .../dal/dataobject/level/MemberLevelDO.java | 64 - .../dataobject/level/MemberLevelRecordDO.java | 71 -- .../dataobject/point/MemberPointConfigDO.java | 48 - .../dataobject/point/MemberPointRecordDO.java | 69 - .../signin/MemberSignInConfigDO.java | 46 - .../signin/MemberSignInRecordDO.java | 42 - .../dal/dataobject/tag/MemberTagDO.java | 34 - .../dal/dataobject/user/MemberUserDO.java | 139 --- .../mysql/address/MemberAddressMapper.java | 22 - .../dal/mysql/group/MemberGroupMapper.java | 31 - .../level/MemberExperienceRecordMapper.java | 35 - .../dal/mysql/level/MemberLevelMapper.java | 33 - .../mysql/level/MemberLevelRecordMapper.java | 26 - .../mysql/point/MemberPointConfigMapper.java | 14 - .../mysql/point/MemberPointRecordMapper.java | 36 - .../signin/MemberSignInConfigMapper.java | 24 - .../signin/MemberSignInRecordMapper.java | 36 - .../member/dal/mysql/tag/MemberTagMapper.java | 28 - .../dal/mysql/user/MemberUserMapper.java | 65 - .../win/module/member/dal/package-info.java | 9 - .../module/member/dal/redis/package-info.java | 4 - .../module/member/framework/package-info.java | 6 - .../web/config/MemberWebConfiguration.java | 24 - .../member/framework/web/package-info.java | 4 - .../com/win/module/member/package-info.java | 8 - .../service/address/AddressService.java | 67 - .../service/address/AddressServiceImpl.java | 97 -- .../service/auth/MemberAuthService.java | 88 -- .../service/auth/MemberAuthServiceImpl.java | 266 ---- .../service/group/MemberGroupService.java | 86 -- .../service/group/MemberGroupServiceImpl.java | 103 -- .../level/MemberExperienceRecordService.java | 53 - .../MemberExperienceRecordServiceImpl.java | 55 - .../level/MemberLevelRecordService.java | 37 - .../level/MemberLevelRecordServiceImpl.java | 39 - .../service/level/MemberLevelService.java | 102 -- .../service/level/MemberLevelServiceImpl.java | 299 ----- .../point/MemberPointConfigService.java | 29 - .../point/MemberPointConfigServiceImpl.java | 44 - .../point/MemberPointRecordService.java | 42 - .../point/MemberPointRecordServiceImpl.java | 95 -- .../signin/MemberSignInConfigService.java | 62 - .../signin/MemberSignInConfigServiceImpl.java | 106 -- .../signin/MemberSignInRecordService.java | 32 - .../signin/MemberSignInRecordServiceImpl.java | 57 - .../member/service/tag/MemberTagService.java | 73 -- .../service/tag/MemberTagServiceImpl.java | 125 -- .../service/user/MemberUserService.java | 169 --- .../service/user/MemberUserServiceImpl.java | 262 ---- .../address/AddressServiceImplTest.java | 98 -- .../service/auth/MemberAuthServiceTest.java | 121 -- .../group/MemberGroupServiceImplTest.java | 160 --- .../level/MemberLevelServiceImplTest.java | 268 ---- .../service/tag/MemberTagServiceImplTest.java | 133 -- .../user/MemberUserServiceImplTest.java | 136 -- .../test/resources/application-unit-test.yaml | 49 - .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 5 - .../src/test/resources/sql/create_tables.sql | 113 -- win-module-mp/pom.xml | 24 - win-module-mp/win-module-mp-api/pom.xml | 26 - .../module/mp/enums/ErrorCodeConstants.java | 64 - .../enums/message/MpAutoReplyMatchEnum.java | 28 - .../mp/enums/message/MpAutoReplyTypeEnum.java | 29 - .../enums/message/MpMessageSendFromEnum.java | 28 - .../java/com/win/module/mp/package-info.java | 8 - win-module-mp/win-module-mp-biz/pom.xml | 94 -- .../admin/account/MpAccountController.java | 98 -- .../admin/account/vo/MpAccountBaseVO.java | 43 - .../account/vo/MpAccountCreateReqVO.java | 14 - .../admin/account/vo/MpAccountPageReqVO.java | 24 - .../admin/account/vo/MpAccountRespVO.java | 25 - .../account/vo/MpAccountSimpleRespVO.java | 16 - .../account/vo/MpAccountUpdateReqVO.java | 20 - .../admin/material/MpMaterialController.http | 5 - .../admin/material/MpMaterialController.java | 74 -- .../material/vo/MpMaterialPageReqVO.java | 27 - .../admin/material/vo/MpMaterialRespVO.java | 47 - .../vo/MpMaterialUploadNewsImageReqVO.java | 23 - .../vo/MpMaterialUploadPermanentReqVO.java | 53 - .../material/vo/MpMaterialUploadRespVO.java | 16 - .../vo/MpMaterialUploadTemporaryReqVO.java | 28 - .../admin/menu/MpMenuController.http | 50 - .../admin/menu/MpMenuController.java | 57 - .../admin/menu/vo/MpMenuBaseVO.java | 115 -- .../admin/menu/vo/MpMenuRespVO.java | 28 - .../admin/menu/vo/MpMenuSaveReqVO.java | 34 - .../admin/message/MpAutoReplyController.http | 5 - .../admin/message/MpAutoReplyController.java | 74 -- .../admin/message/MpMessageController.http | 33 - .../admin/message/MpMessageController.java | 47 - .../vo/autoreply/MpAutoReplyBaseVO.java | 109 -- .../vo/autoreply/MpAutoReplyCreateReqVO.java | 20 - .../vo/autoreply/MpAutoReplyPageReqVO.java | 21 - .../vo/autoreply/MpAutoReplyRespVO.java | 27 - .../vo/autoreply/MpAutoReplyUpdateReqVO.java | 20 - .../vo/message/MpMessagePageReqVO.java | 35 - .../message/vo/message/MpMessageRespVO.java | 102 -- .../vo/message/MpMessageSendReqVO.java | 58 - .../admin/news/MpDraftController.http | 54 - .../admin/news/MpDraftController.java | 136 -- .../admin/news/MpFreePublishController.http | 13 - .../admin/news/MpFreePublishController.java | 119 -- .../admin/news/vo/MpDraftPageReqVO.java | 21 - .../admin/news/vo/MpFreePublishPageReqVO.java | 21 - .../admin/open/MpOpenController.java | 116 -- .../open/vo/MpOpenCheckSignatureReqVO.java | 29 - .../open/vo/MpOpenHandleMessageReqVO.java | 37 - .../statistics/MpStatisticsController.java | 68 - .../statistics/vo/MpStatisticsGetReqVO.java | 25 - .../MpStatisticsInterfaceSummaryRespVO.java | 27 - .../vo/MpStatisticsUpstreamMessageRespVO.java | 21 - .../vo/MpStatisticsUserCumulateRespVO.java | 18 - .../vo/MpStatisticsUserSummaryRespVO.java | 24 - .../controller/admin/tag/MpTagController.http | 39 - .../controller/admin/tag/MpTagController.java | 88 -- .../controller/admin/tag/vo/MpTagBaseVO.java | 21 - .../admin/tag/vo/MpTagCreateReqVO.java | 20 - .../admin/tag/vo/MpTagPageReqVO.java | 24 - .../controller/admin/tag/vo/MpTagRespVO.java | 25 - .../admin/tag/vo/MpTagSimpleRespVO.java | 19 - .../admin/tag/vo/MpTagUpdateReqVO.java | 20 - .../admin/user/MpUserController.http | 18 - .../admin/user/MpUserController.java | 65 - .../admin/user/vo/MpUserPageReqVO.java | 27 - .../admin/user/vo/MpUserRespVO.java | 53 - .../admin/user/vo/MpUserUpdateReqVO.java | 26 - .../module/mp/controller/package-info.java | 6 - .../mp/convert/account/MpAccountConvert.java | 31 - .../convert/material/MpMaterialConvert.java | 47 - .../module/mp/convert/menu/MpMenuConvert.java | 50 - .../convert/message/MpAutoReplyConvert.java | 37 - .../mp/convert/message/MpMessageConvert.java | 172 --- .../statistics/MpStatisticsConvert.java | 40 - .../module/mp/convert/tag/MpTagConvert.java | 44 - .../module/mp/convert/user/MpUserConvert.java | 55 - .../dal/dataobject/account/MpAccountDO.java | 62 - .../dal/dataobject/material/MpMaterialDO.java | 99 -- .../mp/dal/dataobject/menu/MpMenuDO.java | 184 --- .../dal/dataobject/message/MpAutoReplyDO.java | 164 --- .../dal/dataobject/message/MpMessageDO.java | 255 ---- .../module/mp/dal/dataobject/tag/MpTagDO.java | 58 - .../mp/dal/dataobject/user/MpUserDO.java | 110 -- .../mp/dal/mysql/account/MpAccountMapper.java | 31 - .../dal/mysql/material/MpMaterialMapper.java | 33 - .../mp/dal/mysql/menu/MpMenuMapper.java | 25 - .../dal/mysql/message/MpAutoReplyMapper.java | 70 -- .../mp/dal/mysql/message/MpMessageMapper.java | 22 - .../module/mp/dal/mysql/tag/MpTagMapper.java | 26 - .../mp/dal/mysql/user/MpUserMapper.java | 35 - .../framework/mp/config/MpConfiguration.java | 54 - .../mp/core/DefaultMpServiceFactory.java | 177 --- .../framework/mp/core/MpServiceFactory.java | 66 - .../mp/core/context/MpContextHolder.java | 53 - .../mp/framework/mp/core/util/MpUtils.java | 167 --- .../win/module/mp/framework/package-info.java | 6 - .../web/config/MpWebConfiguration.java | 24 - .../module/mp/framework/web/package-info.java | 4 - .../java/com/win/module/mp/package-info.java | 8 - .../mp/service/account/MpAccountService.java | 110 -- .../service/account/MpAccountServiceImpl.java | 229 ---- .../mp/service/handler/menu/MenuHandler.java | 37 - .../message/MessageAutoReplyHandler.java | 41 - .../message/MessageReceiveHandler.java | 36 - .../handler/other/KfSessionHandler.java | 26 - .../mp/service/handler/other/NullHandler.java | 24 - .../mp/service/handler/other/ScanHandler.java | 25 - .../other/StoreCheckNotifyHandler.java | 24 - .../service/handler/other/package-info.java | 4 - .../service/handler/user/LocationHandler.java | 49 - .../handler/user/SubscribeHandler.java | 52 - .../handler/user/UnsubscribeHandler.java | 39 - .../service/material/MpMaterialService.java | 84 -- .../material/MpMaterialServiceImpl.java | 224 ---- .../module/mp/service/menu/MpMenuService.java | 49 - .../mp/service/menu/MpMenuServiceImpl.java | 171 --- .../service/message/MpAutoReplyService.java | 75 -- .../message/MpAutoReplyServiceImpl.java | 202 --- .../mp/service/message/MpMessageService.java | 58 - .../service/message/MpMessageServiceImpl.java | 148 --- .../message/bo/MpMessageSendOutReqBO.java | 110 -- .../statistics/MpStatisticsService.java | 54 - .../statistics/MpStatisticsServiceImpl.java | 77 -- .../module/mp/service/tag/MpTagService.java | 65 - .../mp/service/tag/MpTagServiceImpl.java | 164 --- .../module/mp/service/user/MpUserService.java | 102 -- .../mp/service/user/MpUserServiceImpl.java | 215 ---- win-module-pay/pom.xml | 25 - win-module-pay/win-module-pay-api/pom.xml | 33 - .../api/notify/dto/PayOrderNotifyReqDTO.java | 34 - .../api/notify/dto/PayRefundNotifyReqDTO.java | 35 - .../module/pay/api/notify/package-info.java | 4 - .../win/module/pay/api/order/PayOrderApi.java | 41 - .../api/order/dto/PayOrderCreateReqDTO.java | 65 - .../pay/api/order/dto/PayOrderRespDTO.java | 46 - .../module/pay/api/refund/PayRefundApi.java | 31 - .../api/refund/dto/PayRefundCreateReqDTO.java | 58 - .../pay/api/refund/dto/PayRefundRespDTO.java | 43 - .../module/pay/enums/DictTypeConstants.java | 18 - .../module/pay/enums/ErrorCodeConstants.java | 65 - .../enums/member/PayWalletBizTypeEnum.java | 31 - .../pay/enums/notify/PayNotifyStatusEnum.java | 32 - .../pay/enums/notify/PayNotifyTypeEnum.java | 28 - .../pay/enums/order/PayOrderStatusEnum.java | 64 - .../pay/enums/refund/PayRefundStatusEnum.java | 32 - .../java/com/win/module/pay/package-info.java | 1 - win-module-pay/win-module-pay-biz/pom.xml | 79 -- .../module/pay/api/order/PayOrderApiImpl.java | 39 - .../pay/api/refund/PayRefundApiImpl.java | 34 - .../admin/app/PayAppController.java | 108 -- .../controller/admin/app/vo/PayAppBaseVO.java | 39 - .../admin/app/vo/PayAppCreateReqVO.java | 11 - .../admin/app/vo/PayAppPageItemRespVO.java | 26 - .../admin/app/vo/PayAppPageReqVO.java | 30 - .../controller/admin/app/vo/PayAppRespVO.java | 19 - .../admin/app/vo/PayAppUpdateReqVO.java | 16 - .../admin/app/vo/PayAppUpdateStatusReqVO.java | 20 - .../admin/channel/PayChannelController.java | 82 -- .../admin/channel/vo/PayChannelBaseVO.java | 31 - .../channel/vo/PayChannelCreateReqVO.java | 25 - .../admin/channel/vo/PayChannelRespVO.java | 25 - .../channel/vo/PayChannelUpdateReqVO.java | 20 - .../admin/demo/PayDemoOrderController.java | 78 -- .../demo/vo/PayDemoOrderCreateReqVO.java | 17 - .../admin/demo/vo/PayDemoOrderRespVO.java | 54 - .../admin/notify/PayNotifyController.java | 129 -- .../admin/notify/vo/PayNotifyTaskBaseVO.java | 45 - .../notify/vo/PayNotifyTaskDetailRespVO.java | 54 - .../notify/vo/PayNotifyTaskPageReqVO.java | 39 - .../admin/notify/vo/PayNotifyTaskRespVO.java | 22 - .../admin/order/PayOrderController.java | 127 -- .../admin/order/vo/PayOrderBaseVO.java | 89 -- .../admin/order/vo/PayOrderDetailsRespVO.java | 45 - .../admin/order/vo/PayOrderExcelVO.java | 67 - .../admin/order/vo/PayOrderExportReqVO.java | 37 - .../order/vo/PayOrderPageItemRespVO.java | 25 - .../admin/order/vo/PayOrderPageReqVO.java | 42 - .../admin/order/vo/PayOrderRespVO.java | 22 - .../admin/order/vo/PayOrderSubmitReqVO.java | 33 - .../admin/order/vo/PayOrderSubmitRespVO.java | 18 - .../admin/refund/PayRefundController.java | 96 -- .../admin/refund/vo/PayRefundBaseVO.java | 78 -- .../refund/vo/PayRefundDetailsRespVO.java | 40 - .../admin/refund/vo/PayRefundExcelVO.java | 61 - .../admin/refund/vo/PayRefundExportReqVO.java | 40 - .../refund/vo/PayRefundPageItemRespVO.java | 25 - .../admin/refund/vo/PayRefundPageReqVO.java | 45 - .../app/channel/AppPayChannelController.java | 39 - .../app/order/AppPayOrderController.http | 63 - .../app/order/AppPayOrderController.java | 47 - .../app/order/vo/AppPayOrderSubmitReqVO.java | 15 - .../app/order/vo/AppPayOrderSubmitRespVO.java | 15 - .../controller/app/refund/package-info.java | 4 - .../app/wallet/AppPayWalletController.java | 44 - .../AppPayWalletTransactionController.java | 53 - .../AppPayWalletTransactionPageReqVO.java | 23 - .../AppPayWalletTransactionRespVO.java | 27 - .../wallet/vo/wallet/AppPayWalletRespVO.java | 19 - .../module/pay/controller/package-info.java | 6 - .../module/pay/convert/app/PayAppConvert.java | 49 - .../convert/channel/PayChannelConvert.java | 28 - .../pay/convert/demo/PayDemoOrderConvert.java | 26 - .../convert/notify/PayNotifyTaskConvert.java | 43 - .../pay/convert/order/PayOrderConvert.java | 74 -- .../win/module/pay/convert/package-info.java | 6 - .../pay/convert/refund/PayRefundConvert.java | 56 - .../pay/convert/wallet/PayWalletConvert.java | 14 - .../wallet/PayWalletTransactionConvert.java | 19 - ...g Boot 对象转换 MapStruct 入门》.md | 1 - .../pay/dal/dataobject/app/PayAppDO.java | 57 - .../dal/dataobject/channel/PayChannelDO.java | 69 - .../dal/dataobject/demo/PayDemoOrderDO.java | 87 -- .../dal/dataobject/notify/PayNotifyLogDO.java | 51 - .../dataobject/notify/PayNotifyTaskDO.java | 96 -- .../pay/dal/dataobject/order/PayOrderDO.java | 138 -- .../dataobject/order/PayOrderExtensionDO.java | 96 -- .../dal/dataobject/refund/PayRefundDO.java | 160 --- .../dal/dataobject/wallet/PayWalletDO.java | 54 - .../wallet/PayWalletTransactionDO.java | 66 - .../pay/dal/mysql/app/PayAppMapper.java | 22 - .../dal/mysql/channel/PayChannelMapper.java | 31 - .../dal/mysql/demo/PayDemoOrderMapper.java | 28 - .../dal/mysql/notify/PayNotifyLogMapper.java | 16 - .../dal/mysql/notify/PayNotifyTaskMapper.java | 44 - .../mysql/order/PayOrderExtensionMapper.java | 33 - .../pay/dal/mysql/order/PayOrderMapper.java | 62 - .../pay/dal/mysql/refund/PayRefundMapper.java | 78 -- .../pay/dal/mysql/wallet/PayWalletMapper.java | 49 - .../wallet/PayWalletTransactionMapper.java | 42 - .../pay/dal/redis/RedisKeyConstants.java | 27 - .../pay/dal/redis/no/PayNoRedisDAO.java | 31 - .../redis/notify/PayNotifyLockRedisDAO.java | 39 - .../job/config/PayJobConfiguration.java | 28 - .../pay/framework/job/core/package-info.java | 4 - .../module/pay/framework/package-info.java | 6 - .../pay/config/PayConfiguration.java | 9 - .../framework/pay/config/PayProperties.java | 52 - .../pay/framework/pay/core/package-info.java | 4 - .../framework/pay/wallet/WalletPayClient.java | 177 --- .../web/config/PayWebConfiguration.java | 24 - .../pay/framework/web/package-info.java | 4 - .../module/pay/job/notify/PayNotifyJob.java | 31 - .../pay/job/order/PayOrderExpireJob.java | 31 - .../module/pay/job/order/PayOrderSyncJob.java | 43 - .../pay/job/refund/PayRefundSyncJob.java | 31 - .../java/com/win/module/pay/package-info.java | 10 - .../module/pay/service/app/PayAppService.java | 105 -- .../pay/service/app/PayAppServiceImpl.java | 126 -- .../service/channel/PayChannelService.java | 104 -- .../channel/PayChannelServiceImpl.java | 198 --- .../pay/service/demo/PayDemoOrderService.java | 66 - .../service/demo/PayDemoOrderServiceImpl.java | 265 ---- .../pay/service/notify/PayNotifyService.java | 57 - .../service/notify/PayNotifyServiceImpl.java | 295 ----- .../pay/service/order/PayOrderService.java | 140 --- .../service/order/PayOrderServiceImpl.java | 563 --------- .../pay/service/refund/PayRefundService.java | 82 -- .../service/refund/PayRefundServiceImpl.java | 331 ----- .../pay/service/wallet/PayWalletService.java | 69 - .../service/wallet/PayWalletServiceImpl.java | 165 --- .../wallet/PayWalletTransactionService.java | 52 - .../PayWalletTransactionServiceImpl.java | 63 - .../wallet/bo/CreateWalletTransactionBO.java | 50 - .../com/win/module/pay/util/PaySeqUtils.java | 54 - .../dataobject/merchant/PayChannelDOTest.java | 29 - .../PayChannelMapperIntegrationTest.java | 80 -- .../order/PayOrderServiceIntegrationTest.java | 51 - .../win/module/pay/service/package-info.java | 1 - .../test/BaseDbAndRedisIntegrationTest.java | 38 - .../pay/test/BaseDbIntegrationTest.java | 30 - .../pay/test/BaseRedisIntegrationTest.java | 23 - .../application-integration-test.yaml | 93 -- .../pay/service/app/PayAppServiceTest.java | 258 ---- .../channel/PayChannelServiceTest.java | 343 ----- .../service/notify/PayNotifyServiceTest.java | 351 ------ .../service/order/PayOrderServiceTest.java | 1105 ----------------- .../service/refund/PayRefundServiceTest.java | 703 ----------- .../test/resources/application-unit-test.yaml | 49 - .../src/test/resources/logback.xml | 4 - .../src/test/resources/sql/clean.sql | 7 - .../src/test/resources/sql/create_tables.sql | 146 --- .../server/controller/DefaultController.java | 20 - .../src/main/resources/application-dev.yaml | 7 +- .../src/main/resources/application-prod.yaml | 7 +- .../src/main/resources/application-test.yaml | 7 +- .../src/main/resources/application.yaml | 3 - 1179 files changed, 6 insertions(+), 72126 deletions(-) delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/pom.xml delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/config/WinPayAutoConfiguration.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientConfig.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientFactory.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderRespDTO.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderUnifiedReqDTO.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundRespDTO.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundUnifiedReqDTO.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/exception/PayException.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/AbstractPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java delete mode 100644 win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java delete mode 100644 win-module-mall/pom.xml delete mode 100644 win-module-mall/win-module-product-api/pom.xml delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java delete mode 100644 win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java delete mode 100644 win-module-mall/win-module-product-biz/pom.xml delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.http delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuBaseVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuCreateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExcelVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExportReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuSimpleRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateStatusReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/AppCategoryController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/vo/AppCategoryRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppCommentController.http delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppProductCommentController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentPageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentStatisticsRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppProductCommentRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/AppFavoriteController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteBatchReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoritePageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/package-info.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/property/package-info.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/value/AppProductPropertyValueDetailRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.http delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuDetailRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageReqVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageRespVO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/brand/ProductBrandConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/category/ProductCategoryConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/comment/ProductCommentConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/favorite/ProductFavoriteConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/property/ProductPropertyConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/propertyvalue/ProductPropertyValueConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/sku/ProductSkuConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/spu/ProductSpuConvert.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/brand/ProductBrandDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/category/ProductCategoryDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/comment/ProductCommentDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/favorite/ProductFavoriteDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyValueDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/sku/ProductSkuDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/spu/ProductSpuDO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/brand/ProductBrandMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/category/ProductCategoryMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/comment/ProductCommentMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/favorite/ProductFavoriteMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyValueMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/sku/ProductSkuMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/spu/ProductSpuMapper.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/package-info.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/config/ProductWebConfiguration.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/package-info.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/package-info.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/bo/ProductPropertyValueDetailRespBO.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuService.java delete mode 100644 win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuServiceImpl.java delete mode 100644 win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/brand/ProductBrandServiceImplTest.java delete mode 100644 win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/category/ProductCategoryServiceImplTest.java delete mode 100644 win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/comment/ProductCommentServiceImplTest.java delete mode 100644 win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/sku/ProductSkuServiceTest.java delete mode 100644 win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/spu/ProductSpuServiceImplTest.java delete mode 100644 win-module-mall/win-module-product-biz/src/test/resources/application-unit-test.yaml delete mode 100644 win-module-mall/win-module-product-biz/src/test/resources/logback.xml delete mode 100644 win-module-mall/win-module-product-biz/src/test/resources/sql/clean.sql delete mode 100644 win-module-mall/win-module-product-biz/src/test/resources/sql/create_tables.sql delete mode 100644 win-module-mall/win-module-promotion-api/pom.xml delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/dto/BargainRecordCreateReqDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordRespDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/CouponApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponRespDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponUseReqDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponValidReqDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/dto/DiscountProductRespDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/PriceApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/CouponMeetRespDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateReqDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateRespDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/RewardActivityApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/dto/RewardActivityMatchRespDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApi.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/dto/SeckillActivityUpdateStockReqDTO.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/ErrorCodeConstants.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/combination/CombinationRecordStatusEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionActivityStatusEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionConditionTypeEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionDiscountTypeEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionProductScopeEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionTypeEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponStatusEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTakeTypeEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecorateComponentEnum.java delete mode 100644 win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecoratePageEnum.java delete mode 100644 win-module-mall/win-module-promotion-biz/pom.xml delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/coupon/CouponApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/price/PriceApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/reward/RewardActivityApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApiImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/BannerController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/BargainActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/CombinationActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponTemplateController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageItemRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponSendReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplatePageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateStatusReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.http delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentSaveReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/DiscountActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/RewardActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillConfigController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigSimpleRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateStatusReqVo.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductBaseVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/AppActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/vo/AppActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleCategoryController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticlePageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticleRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/category/AppArticleCategoryRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/AppBannerController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/vo/AppBannerRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainHelpController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainRecordController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordCreateReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordSummaryRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationRecordController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponTemplateController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponTakeReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplatePageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/AppDecorateController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/vo/AppDecorateComponentRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillActivityController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillConfigController.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityDetailRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityNowRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityPageReqVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/config/AppSeckillConfigRespVO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/banner/BannerConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/bargain/BargainActivityConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/combination/CombinationActivityConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponTemplateConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/decorate/DecorateComponentConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/discount/DiscountActivityConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/price/PriceConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/reward/RewardActivityConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillconfig/SeckillConfigConvert.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/banner/BannerDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainActivityDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainAssistDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainRecordDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationActivityDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationProductDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationRecordDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponTemplateDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/decorate/DecorateComponentDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountActivityDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountProductDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/reward/RewardActivityDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillconfig/SeckillConfigDO.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/banner/BannerMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainActivityMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainRecordMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationActivityMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationProductMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationRecordMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/decorate/DecorateComponentMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountActivityMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountProductMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/reward/RewardActivityMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillconfig/SeckillConfigMapper.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/package-info.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/config/PromotionWebConfiguration.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/package-info.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/package-info.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigService.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigServiceImpl.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/util/PromotionUtils.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/main/resources/mapper/coupon/CouponTemplateMapper.xml delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/combination/CombinationActivityServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/discount/DiscountActivityServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/price/PriceServiceTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/reward/RewardActivityServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/resources/application-unit-test.yaml delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/resources/logback.xml delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/resources/sql/clean.sql delete mode 100644 win-module-mall/win-module-promotion-biz/src/test/resources/sql/create_tables.sql delete mode 100644 win-module-mall/win-module-trade-api/pom.xml delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/BrokerageApi.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/dto/BrokerageUserDTO.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/TradeOrderApi.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/dto/TradeOrderRespDTO.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/package-info.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/ErrorCodeConstants.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/MessageTemplateConstants.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleStatusEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleWayEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageBindModeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/notify/TradeNotifyEnums.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderCancelTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderRefundStatusEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderStatusEnum.java delete mode 100644 win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderTypeEnum.java delete mode 100644 win-module-mall/win-module-trade-biz/pom.xml delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/brokerage/BrokerageApiImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/order/TradeOrderApiImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.http delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDisagreeReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSalePageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRefuseReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRespPageItemVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/log/TradeAfterSaleLogRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/user/MemberUserRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/product/property/ProductPropertyValueDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/BrokerageRecordController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/BrokerageUserController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserClearBrokerageUserReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageEnabledReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageUserReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/TradeConfigController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigSaveReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryPickUpStoreController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExportReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressSimpleRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplatePageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateChargeBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateFreeBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreSimpleRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.http delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderRemarkReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdateAddressReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdatePriceReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/AppTradeAfterSaleController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleDeliveryReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/property/AppProductPropertyValueDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/sku/AppProductSkuBaseRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/spu/AppProductSpuBaseRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageRecordController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageUserController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageProductPriceRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserMySummaryRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByPriceRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByUserCountRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.http delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartAddReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartListRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartResetReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateCountReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateSelectedReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/AppTradeConfigController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverConfigController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverExpressController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/config/AppDeliveryConfigRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/express/AppDeliveryExpressRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.http delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppOrderExpressTrackRespDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemCommentCreateReqVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/aftersale/TradeAfterSaleConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/record/BrokerageRecordConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/user/BrokerageUserConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/cart/TradeCartConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/config/TradeConfigConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/order/TradeOrderConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/record/BrokerageRecordDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/user/BrokerageUserDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/cart/CartDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/config/TradeConfigDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateChargeDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateFreeDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreStaffDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderItemDO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleLogMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/record/BrokerageRecordMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/user/BrokerageUserMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/cart/CartMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/config/TradeConfigMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateChargeMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateFreeMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreStaffMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderItemMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderMapper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/redis/no/TradeOrderNoRedisDAO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/annotations/AfterSaleLog.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogRespDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/service/AfterSaleLogService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/util/AfterSaleLogUtils.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/ExpressClientConfig.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/TradeExpressProperties.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClient.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClientFactory.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackQueryReqDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackRespDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kdniao/KdNiaoExpressClient.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/enums/ExpressClientEnum.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderConfig.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderProperties.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/config/TradeWebConfiguration.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/brokerage/BrokerageRecordUnfreezeJob.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/package-info.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/BrokerageAddReqBO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/UserBrokerageSummaryBO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/bo/DeliveryExpressTemplateRespBO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/bo/TradeOrderMessageWhenDeliveryOrderReqBO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceService.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceServiceImpl.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateReqBO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateRespBO.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculator.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculator.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculatorHelper.java delete mode 100644 win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientIntegrationTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientIntegrationTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImplTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImplTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/order/TradeOrderUpdateServiceTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/TradePriceServiceImplTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java delete mode 100644 win-module-mall/win-module-trade-biz/src/test/resources/application-unit-test.yaml delete mode 100644 win-module-mall/win-module-trade-biz/src/test/resources/logback.xml delete mode 100644 win-module-mall/win-module-trade-biz/src/test/resources/sql/clean.sql delete mode 100644 win-module-mall/win-module-trade-biz/src/test/resources/sql/create_tables.sql delete mode 100644 win-module-member/pom.xml delete mode 100644 win-module-member/win-module-member-api/pom.xml delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/AddressApi.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/dto/AddressRespDTO.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/level/MemberLevelApi.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/package-info.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/point/MemberPointApi.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/MemberUserApi.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/dto/MemberUserRespDTO.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/DictTypeConstants.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/ErrorCodeConstants.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/MemberExperienceBizTypeEnum.java delete mode 100644 win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/point/MemberPointBizTypeEnum.java delete mode 100644 win-module-member/win-module-member-biz/pom.xml delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/address/AddressApiImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/level/MemberLevelApiImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/point/MemberPointApiImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/user/MemberUserApiImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/AddressController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/MemberGroupController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberExperienceRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointConfigController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigSaveReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInConfigController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigCreateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/MemberTagController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagCreateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/MemberUserController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserPageReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.http delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressBaseVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressCreateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.http delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsSendReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsValidateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberExperienceRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberLevelController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/experience/AppMemberExperienceRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/level/AppMemberLevelRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/AppMemberPointRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInConfigController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInRecordController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/AppSocialUserController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.http delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserResetPasswordReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateMobileReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdatePasswordReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/address/AddressConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/auth/AuthConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/group/MemberGroupConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberExperienceRecordConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelRecordConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointConfigConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointRecordConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInConfigConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInRecordConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/social/SocialUserConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/tag/MemberTagConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/user/MemberUserConvert.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/address/MemberAddressDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/group/MemberGroupDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberExperienceRecordDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelRecordDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointConfigDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointRecordDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInConfigDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInRecordDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/tag/MemberTagDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/user/MemberUserDO.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/address/MemberAddressMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/group/MemberGroupMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberExperienceRecordMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelRecordMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointConfigMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointRecordMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInConfigMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInRecordMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/tag/MemberTagMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/user/MemberUserMapper.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/redis/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/config/MemberWebConfiguration.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/package-info.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserService.java delete mode 100644 win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserServiceImpl.java delete mode 100644 win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/address/AddressServiceImplTest.java delete mode 100644 win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/auth/MemberAuthServiceTest.java delete mode 100644 win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/group/MemberGroupServiceImplTest.java delete mode 100644 win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/level/MemberLevelServiceImplTest.java delete mode 100644 win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/tag/MemberTagServiceImplTest.java delete mode 100644 win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/user/MemberUserServiceImplTest.java delete mode 100644 win-module-member/win-module-member-biz/src/test/resources/application-unit-test.yaml delete mode 100644 win-module-member/win-module-member-biz/src/test/resources/logback.xml delete mode 100644 win-module-member/win-module-member-biz/src/test/resources/sql/clean.sql delete mode 100644 win-module-member/win-module-member-biz/src/test/resources/sql/create_tables.sql delete mode 100644 win-module-mp/pom.xml delete mode 100644 win-module-mp/win-module-mp-api/pom.xml delete mode 100644 win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/ErrorCodeConstants.java delete mode 100644 win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyMatchEnum.java delete mode 100644 win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyTypeEnum.java delete mode 100644 win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpMessageSendFromEnum.java delete mode 100644 win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/package-info.java delete mode 100644 win-module-mp/win-module-mp-biz/pom.xml delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/MpAccountController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountBaseVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountCreateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuBaseVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyBaseVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/MpOpenController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/MpStatisticsController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagBaseVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.http delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserPageReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserRespVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/package-info.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/account/MpAccountConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/material/MpMaterialConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/menu/MpMenuConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpAutoReplyConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpMessageConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/statistics/MpStatisticsConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/tag/MpTagConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/user/MpUserConvert.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/account/MpAccountDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/material/MpMaterialDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/menu/MpMenuDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpAutoReplyDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpMessageDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/tag/MpTagDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/user/MpUserDO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/account/MpAccountMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/material/MpMaterialMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/menu/MpMenuMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpAutoReplyMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpMessageMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/tag/MpTagMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/user/MpUserMapper.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/config/MpConfiguration.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/DefaultMpServiceFactory.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/MpServiceFactory.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/context/MpContextHolder.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/util/MpUtils.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/package-info.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/config/MpWebConfiguration.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/package-info.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/package-info.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/menu/MenuHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageAutoReplyHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageReceiveHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/KfSessionHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/NullHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/ScanHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/StoreCheckNotifyHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/package-info.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/LocationHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/SubscribeHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/UnsubscribeHandler.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/bo/MpMessageSendOutReqBO.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagServiceImpl.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserService.java delete mode 100644 win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserServiceImpl.java delete mode 100644 win-module-pay/pom.xml delete mode 100644 win-module-pay/win-module-pay-api/pom.xml delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayOrderNotifyReqDTO.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayRefundNotifyReqDTO.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/package-info.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/PayOrderApi.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderCreateReqDTO.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderRespDTO.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/PayRefundApi.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundCreateReqDTO.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundRespDTO.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/DictTypeConstants.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/ErrorCodeConstants.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/member/PayWalletBizTypeEnum.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyStatusEnum.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyTypeEnum.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/order/PayOrderStatusEnum.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/refund/PayRefundStatusEnum.java delete mode 100644 win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/pom.xml delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/order/PayOrderApiImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/refund/PayRefundApiImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/PayAppController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppBaseVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppCreateReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageItemRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateStatusReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/PayChannelController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelCreateReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/PayDemoOrderController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderCreateReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/PayNotifyController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskBaseVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskDetailRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskPageReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/PayOrderController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderBaseVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExcelVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/PayRefundController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/channel/AppPayChannelController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.http delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/refund/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletTransactionController.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionPageReqVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/app/PayAppConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/channel/PayChannelConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/demo/PayDemoOrderConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/notify/PayNotifyTaskConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/order/PayOrderConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/refund/PayRefundConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletTransactionConvert.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/app/PayAppDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/channel/PayChannelDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/demo/PayDemoOrderDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyLogDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderExtensionDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/refund/PayRefundDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletTransactionDO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/app/PayAppMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/channel/PayChannelMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/demo/PayDemoOrderMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyLogMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyTaskMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderExtensionMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/refund/PayRefundMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletTransactionMapper.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/RedisKeyConstants.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/no/PayNoRedisDAO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/config/PayJobConfiguration.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/core/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayConfiguration.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayProperties.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/core/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/wallet/WalletPayClient.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/config/PayWebConfiguration.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/notify/PayNotifyJob.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderExpireJob.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderSyncJob.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/refund/PayRefundSyncJob.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionService.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionServiceImpl.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/bo/CreateWalletTransactionBO.java delete mode 100644 win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/util/PaySeqUtils.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/dataobject/merchant/PayChannelDOTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/order/PayOrderServiceIntegrationTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/package-info.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbAndRedisIntegrationTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbIntegrationTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseRedisIntegrationTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test-integration/resources/application-integration-test.yaml delete mode 100644 win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/app/PayAppServiceTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/channel/PayChannelServiceTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/notify/PayNotifyServiceTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/order/PayOrderServiceTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/refund/PayRefundServiceTest.java delete mode 100644 win-module-pay/win-module-pay-biz/src/test/resources/application-unit-test.yaml delete mode 100644 win-module-pay/win-module-pay-biz/src/test/resources/logback.xml delete mode 100644 win-module-pay/win-module-pay-biz/src/test/resources/sql/clean.sql delete mode 100644 win-module-pay/win-module-pay-biz/src/test/resources/sql/create_tables.sql diff --git a/win-framework/pom.xml b/win-framework/pom.xml index 07d5e269..a5f71d92 100644 --- a/win-framework/pom.xml +++ b/win-framework/pom.xml @@ -16,28 +16,22 @@ win-spring-boot-starter-redis win-spring-boot-starter-web win-spring-boot-starter-security - win-spring-boot-starter-file win-spring-boot-starter-monitor win-spring-boot-starter-protection win-spring-boot-starter-job win-spring-boot-starter-mq - win-spring-boot-starter-excel win-spring-boot-starter-test - win-spring-boot-starter-biz-operatelog win-spring-boot-starter-biz-dict win-spring-boot-starter-biz-sms - - win-spring-boot-starter-biz-pay win-spring-boot-starter-biz-weixin win-spring-boot-starter-biz-social win-spring-boot-starter-biz-tenant win-spring-boot-starter-biz-data-permission win-spring-boot-starter-biz-error-code win-spring-boot-starter-biz-ip - win-spring-boot-starter-flowable win-spring-boot-starter-captcha win-spring-boot-starter-websocket @@ -49,7 +43,6 @@ 该包是技术组件,每个子包,代表一个组件。每个组件包括两部分: 1. core 包:是该组件的核心封装 2. config 包:是该组件基于 Spring 的配置 - 技术组件,也分成两类: 1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展 2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。 diff --git a/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java index 1b049435..7a382c0e 100644 --- a/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java +++ b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java @@ -38,18 +38,6 @@ public class BannerApplicationRunner implements ApplicationRunner { if (isNotPresent("com.win.framework.flowable.config.WinFlowableConfiguration")) { System.out.println("[工作流模块 win-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); } - // 微信公众号 - if (isNotPresent("com.win.module.mp.framework.mp.config.MpConfiguration")) { - System.out.println("[微信公众号 win-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]"); - } - // 商城系统 - if (isNotPresent("com.win.module.trade.framework.web.config.TradeWebConfiguration")) { - System.out.println("[商城系统 win-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); - } - // 支付平台 - if (isNotPresent("com.win.module.pay.framework.pay.config.PayConfiguration")) { - System.out.println("[支付系统 win-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]"); - } }); } diff --git a/win-framework/win-spring-boot-starter-biz-pay/pom.xml b/win-framework/win-spring-boot-starter-biz-pay/pom.xml deleted file mode 100644 index 893153dc..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/pom.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - win-framework - com.win - ${revision} - - 4.0.0 - - win-spring-boot-starter-biz-pay - ${project.artifactId} - 支付拓展,接入国内多个支付渠道 - 1. 支付宝,基于官方 SDK 接入 - 2. 微信支付,基于 weixin-java-pay 接入 - - - - - com.win - win-common - - - - - org.springframework.boot - spring-boot-starter - - - - - org.springframework.boot - spring-boot-starter-validation - - - - org.slf4j - slf4j-api - - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-core - - - - - com.alipay.sdk - alipay-sdk-java - 4.35.79.ALL - - - org.bouncycastle - bcprov-jdk15on - - - - - com.github.binarywang - weixin-java-pay - - - - - com.win - win-spring-boot-starter-test - test - - - - diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/config/WinPayAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/config/WinPayAutoConfiguration.java deleted file mode 100644 index 8b0961da..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/config/WinPayAutoConfiguration.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.framework.pay.config; - -import com.win.framework.pay.core.client.PayClientFactory; -import com.win.framework.pay.core.client.impl.PayClientFactoryImpl; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -/** - * 支付配置类 - * - * @author 芋道源码 - */ -@AutoConfiguration -public class WinPayAutoConfiguration { - - @Bean - public PayClientFactory payClientFactory() { - return new PayClientFactoryImpl(); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClient.java deleted file mode 100644 index 837916fb..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClient.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.win.framework.pay.core.client; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; - -import java.util.Map; - -/** - * 支付客户端,用于对接各支付渠道的 SDK,实现发起支付、退款等功能 - * - * @author 芋道源码 - */ -public interface PayClient { - - /** - * 获得渠道编号 - * - * @return 渠道编号 - */ - Long getId(); - - // ============ 支付相关 ========== - - /** - * 调用支付渠道,统一下单 - * - * @param reqDTO 下单信息 - * @return 支付订单信息 - */ - PayOrderRespDTO unifiedOrder(PayOrderUnifiedReqDTO reqDTO); - - /** - * 解析 order 回调数据 - * - * @param params HTTP 回调接口 content type 为 application/x-www-form-urlencoded 的所有参数 - * @param body HTTP 回调接口的 request body - * @return 支付订单信息 - */ - PayOrderRespDTO parseOrderNotify(Map params, String body); - - /** - * 获得支付订单信息 - * - * @param outTradeNo 外部订单号 - * @return 支付订单信息 - */ - PayOrderRespDTO getOrder(String outTradeNo); - - // ============ 退款相关 ========== - - /** - * 调用支付渠道,进行退款 - * - * @param reqDTO 统一退款请求信息 - * @return 退款信息 - */ - PayRefundRespDTO unifiedRefund(PayRefundUnifiedReqDTO reqDTO); - - /** - * 解析 refund 回调数据 - * - * @param params HTTP 回调接口 content type 为 application/x-www-form-urlencoded 的所有参数 - * @param body HTTP 回调接口的 request body - * @return 支付订单信息 - */ - PayRefundRespDTO parseRefundNotify(Map params, String body); - - /** - * 获得退款订单信息 - * - * @param outTradeNo 外部订单号 - * @param outRefundNo 外部退款号 - * @return 退款订单信息 - */ - PayRefundRespDTO getRefund(String outTradeNo, String outRefundNo); - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientConfig.java deleted file mode 100644 index 02c1b1fb..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.framework.pay.core.client; - -import com.win.framework.common.util.validation.ValidationUtils; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validator; -import java.util.Set; - -/** - * 支付客户端的配置,本质是支付渠道的配置 - * 每个不同的渠道,需要不同的配置,通过子类来定义 - * - * @author 芋道源码 - */ -@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) -// @JsonTypeInfo 注解的作用,Jackson 多态 -// 1. 序列化到时数据库时,增加 @class 属性。 -// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型 -public interface PayClientConfig { - - /** - * 参数校验 - * - * @param validator 校验对象 - */ - void validate(Validator validator); - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientFactory.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientFactory.java deleted file mode 100644 index e31ed0fc..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/PayClientFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.framework.pay.core.client; - -import com.win.framework.pay.core.enums.channel.PayChannelEnum; - -/** - * 支付客户端的工厂接口 - * - * @author 芋道源码 - */ -public interface PayClientFactory { - - /** - * 获得支付客户端 - * - * @param channelId 渠道编号 - * @return 支付客户端 - */ - PayClient getPayClient(Long channelId); - - /** - * 创建支付客户端 - * - * @param channelId 渠道编号 - * @param channelCode 渠道编码 - * @param config 支付配置 - */ - void createOrUpdatePayClient(Long channelId, String channelCode, - Config config); - - /** - * 注册支付客户端 Class,用于模块中实现的 PayClient - * - * @param channel 支付渠道的编码的枚举 - * @param payClientClass 支付客户端 class - */ - void registerPayClientClass(PayChannelEnum channel, Class payClientClass); - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderRespDTO.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderRespDTO.java deleted file mode 100644 index 302be42b..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderRespDTO.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.win.framework.pay.core.client.dto.order; - -import com.win.framework.pay.core.client.exception.PayException; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 渠道支付订单 Response DTO - * - * @author 芋道源码 - */ -@Data -public class PayOrderRespDTO { - - /** - * 支付状态 - * - * 枚举:{@link PayOrderStatusRespEnum} - */ - private Integer status; - - /** - * 外部订单号 - * - * 对应 PayOrderExtensionDO 的 no 字段 - */ - private String outTradeNo; - - /** - * 支付渠道编号 - */ - private String channelOrderNo; - /** - * 支付渠道用户编号 - */ - private String channelUserId; - - /** - * 支付成功时间 - */ - private LocalDateTime successTime; - - /** - * 原始的同步/异步通知结果 - */ - private Object rawData; - - // ========== 主动发起支付时,会返回的字段 ========== - - /** - * 展示模式 - * - * 枚举 {@link PayOrderDisplayModeEnum} 类 - */ - private String displayMode; - /** - * 展示内容 - */ - private String displayContent; - - /** - * 调用渠道的错误码 - * - * 注意:这里返回的是业务异常,而是不系统异常。 - * 如果是系统异常,则会抛出 {@link PayException} - */ - private String channelErrorCode; - /** - * 调用渠道报错时,错误信息 - */ - private String channelErrorMsg; - - public PayOrderRespDTO() { - } - - /** - * 创建【WAITING】状态的订单返回 - */ - public static PayOrderRespDTO waitingOf(String displayMode, String displayContent, - String outTradeNo, Object rawData) { - PayOrderRespDTO respDTO = new PayOrderRespDTO(); - respDTO.status = PayOrderStatusRespEnum.WAITING.getStatus(); - respDTO.displayMode = displayMode; - respDTO.displayContent = displayContent; - // 相对通用的字段 - respDTO.outTradeNo = outTradeNo; - respDTO.rawData = rawData; - return respDTO; - } - - /** - * 创建【SUCCESS】状态的订单返回 - */ - public static PayOrderRespDTO successOf(String channelOrderNo, String channelUserId, LocalDateTime successTime, - String outTradeNo, Object rawData) { - PayOrderRespDTO respDTO = new PayOrderRespDTO(); - respDTO.status = PayOrderStatusRespEnum.SUCCESS.getStatus(); - respDTO.channelOrderNo = channelOrderNo; - respDTO.channelUserId = channelUserId; - respDTO.successTime = successTime; - // 相对通用的字段 - respDTO.outTradeNo = outTradeNo; - respDTO.rawData = rawData; - return respDTO; - } - - /** - * 创建指定状态的订单返回,适合支付渠道回调时 - */ - public static PayOrderRespDTO of(Integer status, String channelOrderNo, String channelUserId, LocalDateTime successTime, - String outTradeNo, Object rawData) { - PayOrderRespDTO respDTO = new PayOrderRespDTO(); - respDTO.status = status; - respDTO.channelOrderNo = channelOrderNo; - respDTO.channelUserId = channelUserId; - respDTO.successTime = successTime; - // 相对通用的字段 - respDTO.outTradeNo = outTradeNo; - respDTO.rawData = rawData; - return respDTO; - } - - /** - * 创建【CLOSED】状态的订单返回,适合调用支付渠道失败时 - */ - public static PayOrderRespDTO closedOf(String channelErrorCode, String channelErrorMsg, - String outTradeNo, Object rawData) { - PayOrderRespDTO respDTO = new PayOrderRespDTO(); - respDTO.status = PayOrderStatusRespEnum.CLOSED.getStatus(); - respDTO.channelErrorCode = channelErrorCode; - respDTO.channelErrorMsg = channelErrorMsg; - // 相对通用的字段 - respDTO.outTradeNo = outTradeNo; - respDTO.rawData = rawData; - return respDTO; - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderUnifiedReqDTO.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderUnifiedReqDTO.java deleted file mode 100644 index b8533815..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/order/PayOrderUnifiedReqDTO.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.win.framework.pay.core.client.dto.order; - -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import lombok.Data; -import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.URL; - -import javax.validation.constraints.DecimalMin; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.Map; - -/** - * 统一下单 Request DTO - * - * @author 芋道源码 - */ -@Data -public class PayOrderUnifiedReqDTO { - - /** - * 用户 IP - */ - @NotEmpty(message = "用户 IP 不能为空") - private String userIp; - - // ========== 商户相关字段 ========== - - /** - * 外部订单号 - * - * 对应 PayOrderExtensionDO 的 no 字段 - */ - @NotEmpty(message = "外部订单编号不能为空") - private String outTradeNo; - /** - * 商品标题 - */ - @NotEmpty(message = "商品标题不能为空") - @Length(max = 32, message = "商品标题不能超过 32") - private String subject; - /** - * 商品描述信息 - */ - @Length(max = 128, message = "商品描述信息长度不能超过128") - private String body; - /** - * 支付结果的 notify 回调地址 - */ - @NotEmpty(message = "支付结果的回调地址不能为空") - @URL(message = "支付结果的 notify 回调地址必须是 URL 格式") - private String notifyUrl; - /** - * 支付结果的 return 回调地址 - */ - @URL(message = "支付结果的 return 回调地址必须是 URL 格式") - private String returnUrl; - - // ========== 订单相关字段 ========== - - /** - * 支付金额,单位:分 - */ - @NotNull(message = "支付金额不能为空") - @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") - private Integer price; - - /** - * 支付过期时间 - */ - @NotNull(message = "支付过期时间不能为空") - private LocalDateTime expireTime; - - // ========== 拓展参数 ========== - /** - * 支付渠道的额外参数 - * - * 例如说,微信公众号需要传递 openid 参数 - */ - private Map channelExtras; - - /** - * 展示模式 - * - * 如果不传递,则每个支付渠道使用默认的方式 - * - * 枚举 {@link PayOrderDisplayModeEnum} - */ - private String displayMode; - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundRespDTO.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundRespDTO.java deleted file mode 100644 index 4b189ddd..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundRespDTO.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.win.framework.pay.core.client.dto.refund; - -import com.win.framework.pay.core.client.exception.PayException; -import com.win.framework.pay.core.enums.refund.PayRefundStatusRespEnum; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 渠道退款订单 Response DTO - * - * @author jason - */ -@Data -public class PayRefundRespDTO { - - /** - * 退款状态 - * - * 枚举 {@link PayRefundStatusRespEnum} - */ - private Integer status; - - /** - * 外部退款号 - * - * 对应 PayRefundDO 的 no 字段 - */ - private String outRefundNo; - - /** - * 渠道退款单号 - * - * 对应 PayRefundDO.channelRefundNo 字段 - */ - private String channelRefundNo; - - /** - * 退款成功时间 - */ - private LocalDateTime successTime; - - /** - * 原始的异步通知结果 - */ - private Object rawData; - - /** - * 调用渠道的错误码 - * - * 注意:这里返回的是业务异常,而是不系统异常。 - * 如果是系统异常,则会抛出 {@link PayException} - */ - private String channelErrorCode; - /** - * 调用渠道报错时,错误信息 - */ - private String channelErrorMsg; - - private PayRefundRespDTO() { - } - - /** - * 创建【WAITING】状态的退款返回 - */ - public static PayRefundRespDTO waitingOf(String channelRefundNo, - String outRefundNo, Object rawData) { - PayRefundRespDTO respDTO = new PayRefundRespDTO(); - respDTO.status = PayRefundStatusRespEnum.WAITING.getStatus(); - respDTO.channelRefundNo = channelRefundNo; - // 相对通用的字段 - respDTO.outRefundNo = outRefundNo; - respDTO.rawData = rawData; - return respDTO; - } - - /** - * 创建【SUCCESS】状态的退款返回 - */ - public static PayRefundRespDTO successOf(String channelRefundNo, LocalDateTime successTime, - String outRefundNo, Object rawData) { - PayRefundRespDTO respDTO = new PayRefundRespDTO(); - respDTO.status = PayRefundStatusRespEnum.SUCCESS.getStatus(); - respDTO.channelRefundNo = channelRefundNo; - respDTO.successTime = successTime; - // 相对通用的字段 - respDTO.outRefundNo = outRefundNo; - respDTO.rawData = rawData; - return respDTO; - } - - /** - * 创建【FAILURE】状态的退款返回 - */ - public static PayRefundRespDTO failureOf(String outRefundNo, Object rawData) { - return failureOf(null, null, - outRefundNo, rawData); - } - - /** - * 创建【FAILURE】状态的退款返回 - */ - public static PayRefundRespDTO failureOf(String channelErrorCode, String channelErrorMsg, - String outRefundNo, Object rawData) { - PayRefundRespDTO respDTO = new PayRefundRespDTO(); - respDTO.status = PayRefundStatusRespEnum.FAILURE.getStatus(); - respDTO.channelErrorCode = channelErrorCode; - respDTO.channelErrorMsg = channelErrorMsg; - // 相对通用的字段 - respDTO.outRefundNo = outRefundNo; - respDTO.rawData = rawData; - return respDTO; - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundUnifiedReqDTO.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundUnifiedReqDTO.java deleted file mode 100644 index 438b11b6..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/dto/refund/PayRefundUnifiedReqDTO.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.win.framework.pay.core.client.dto.refund; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; -import org.hibernate.validator.constraints.URL; - -import javax.validation.constraints.DecimalMin; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 统一 退款 Request DTO - * - * @author jason - */ -@Accessors(chain = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Data -public class PayRefundUnifiedReqDTO { - - /** - * 外部订单号 - * - * 对应 PayOrderExtensionDO 的 no 字段 - */ - @NotEmpty(message = "外部订单编号不能为空") - private String outTradeNo; - - /** - * 外部退款号 - * - * 对应 PayRefundDO 的 no 字段 - */ - @NotEmpty(message = "退款请求单号不能为空") - private String outRefundNo; - - /** - * 退款原因 - */ - @NotEmpty(message = "退款原因不能为空") - private String reason; - - /** - * 支付金额,单位:分 - * - * 目前微信支付在退款的时候,必须传递该字段 - */ - @NotNull(message = "支付金额不能为空") - @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") - private Integer payPrice; - /** - * 退款金额,单位:分 - */ - @NotNull(message = "退款金额不能为空") - @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") - private Integer refundPrice; - - /** - * 退款结果的 notify 回调地址 - */ - @NotEmpty(message = "支付结果的回调地址不能为空") - @URL(message = "支付结果的 notify 回调地址必须是 URL 格式") - private String notifyUrl; - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/exception/PayException.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/exception/PayException.java deleted file mode 100644 index ee0df611..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/exception/PayException.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.framework.pay.core.client.exception; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 支付系统异常 Exception - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class PayException extends RuntimeException { - - public PayException(Throwable cause) { - super(cause); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/AbstractPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/AbstractPayClient.java deleted file mode 100644 index 2b7ae468..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/AbstractPayClient.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.win.framework.pay.core.client.impl; - -import com.win.framework.common.exception.ServiceException; -import com.win.framework.common.util.validation.ValidationUtils; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.PayClientConfig; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.client.exception.PayException; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; - -import static com.win.framework.common.util.json.JsonUtils.toJsonString; - -/** - * 支付客户端的抽象类,提供模板方法,减少子类的冗余代码 - * - * @author 芋道源码 - */ -@Slf4j -public abstract class AbstractPayClient implements PayClient { - - /** - * 渠道编号 - */ - private final Long channelId; - /** - * 渠道编码 - */ - @SuppressWarnings("FieldCanBeLocal") - private final String channelCode; - /** - * 支付配置 - */ - protected Config config; - - public AbstractPayClient(Long channelId, String channelCode, Config config) { - this.channelId = channelId; - this.channelCode = channelCode; - this.config = config; - } - - /** - * 初始化 - */ - public final void init() { - doInit(); - log.debug("[init][客户端({}) 初始化完成]", getId()); - } - - /** - * 自定义初始化 - */ - protected abstract void doInit(); - - public final void refresh(Config config) { - // 判断是否更新 - if (config.equals(this.config)) { - return; - } - log.info("[refresh][客户端({})发生变化,重新初始化]", getId()); - this.config = config; - // 初始化 - this.init(); - } - - @Override - public Long getId() { - return channelId; - } - - // ============ 支付相关 ========== - - @Override - public final PayOrderRespDTO unifiedOrder(PayOrderUnifiedReqDTO reqDTO) { - ValidationUtils.validate(reqDTO); - // 执行统一下单 - PayOrderRespDTO resp; - try { - resp = doUnifiedOrder(reqDTO); - } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可 - throw ex; - } catch (Throwable ex) { - // 系统异常,则包装成 PayException 异常抛出 - log.error("[unifiedOrder][客户端({}) request({}) 发起支付异常]", - getId(), toJsonString(reqDTO), ex); - throw buildPayException(ex); - } - return resp; - } - - protected abstract PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) - throws Throwable; - - @Override - public final PayOrderRespDTO parseOrderNotify(Map params, String body) { - try { - return doParseOrderNotify(params, body); - } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可 - throw ex; - } catch (Throwable ex) { - log.error("[parseOrderNotify][客户端({}) params({}) body({}) 解析失败]", - getId(), params, body, ex); - throw buildPayException(ex); - } - } - - protected abstract PayOrderRespDTO doParseOrderNotify(Map params, String body) - throws Throwable; - - @Override - public final PayOrderRespDTO getOrder(String outTradeNo) { - try { - return doGetOrder(outTradeNo); - } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可 - throw ex; - } catch (Throwable ex) { - log.error("[getOrder][客户端({}) outTradeNo({}) 查询支付单异常]", - getId(), outTradeNo, ex); - throw buildPayException(ex); - } - } - - protected abstract PayOrderRespDTO doGetOrder(String outTradeNo) - throws Throwable; - - // ============ 退款相关 ========== - - @Override - public final PayRefundRespDTO unifiedRefund(PayRefundUnifiedReqDTO reqDTO) { - ValidationUtils.validate(reqDTO); - // 执行统一退款 - PayRefundRespDTO resp; - try { - resp = doUnifiedRefund(reqDTO); - } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可 - throw ex; - } catch (Throwable ex) { - // 系统异常,则包装成 PayException 异常抛出 - log.error("[unifiedRefund][客户端({}) request({}) 发起退款异常]", - getId(), toJsonString(reqDTO), ex); - throw buildPayException(ex); - } - return resp; - } - - protected abstract PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable; - - @Override - public final PayRefundRespDTO parseRefundNotify(Map params, String body) { - try { - return doParseRefundNotify(params, body); - } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可 - throw ex; - } catch (Throwable ex) { - log.error("[parseRefundNotify][客户端({}) params({}) body({}) 解析失败]", - getId(), params, body, ex); - throw buildPayException(ex); - } - } - - protected abstract PayRefundRespDTO doParseRefundNotify(Map params, String body) - throws Throwable; - - @Override - public final PayRefundRespDTO getRefund(String outTradeNo, String outRefundNo) { - try { - return doGetRefund(outTradeNo, outRefundNo); - } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可 - throw ex; - } catch (Throwable ex) { - log.error("[getRefund][客户端({}) outTradeNo({}) outRefundNo({}) 查询退款单异常]", - getId(), outTradeNo, outRefundNo, ex); - throw buildPayException(ex); - } - } - - protected abstract PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) - throws Throwable; - - // ========== 各种工具方法 ========== - - private PayException buildPayException(Throwable ex) { - if (ex instanceof PayException) { - return (PayException) ex; - } - throw new PayException(ex); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java deleted file mode 100644 index 3e33d0aa..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.framework.pay.core.client.impl; - -import com.win.framework.pay.core.client.PayClientConfig; -import lombok.Data; - -import javax.validation.Validator; - -/** - * 无需任何配置 PayClientConfig 实现类 - * - * @author jason - */ -@Data -public class NonePayClientConfig implements PayClientConfig { - - /** - * 配置名称 - *

- * 如果不加任何属性,JsonUtils.parseObject2 解析会报错,所以暂时加个名称 - */ - private String name; - - public NonePayClientConfig(){ - this.name = "none-config"; - } - - @Override - public void validate(Validator validator) { - // 无任何配置不需要校验 - } -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java deleted file mode 100644 index de63c5ca..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.win.framework.pay.core.client.impl; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ReflectUtil; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.PayClientConfig; -import com.win.framework.pay.core.client.PayClientFactory; -import com.win.framework.pay.core.client.impl.alipay.*; -import com.win.framework.pay.core.client.impl.mock.MockPayClient; -import com.win.framework.pay.core.client.impl.weixin.*; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import static com.win.framework.pay.core.enums.channel.PayChannelEnum.*; - -/** - * 支付客户端的工厂实现类 - * - * @author 芋道源码 - */ -@Slf4j -public class PayClientFactoryImpl implements PayClientFactory { - - /** - * 支付客户端 Map - * - * key:渠道编号 - */ - private final ConcurrentMap> clients = new ConcurrentHashMap<>(); - - /** - * 支付客户端 Class Map - */ - private final Map> clientClass = new ConcurrentHashMap<>(); - - public PayClientFactoryImpl() { - // 微信支付客户端 - clientClass.put(WX_PUB, WxPubPayClient.class); - clientClass.put(WX_LITE, WxLitePayClient.class); - clientClass.put(WX_APP, WxAppPayClient.class); - clientClass.put(WX_BAR, WxBarPayClient.class); - clientClass.put(WX_NATIVE, WxNativePayClient.class); - // 支付包支付客户端 - clientClass.put(ALIPAY_WAP, AlipayWapPayClient.class); - clientClass.put(ALIPAY_QR, AlipayQrPayClient.class); - clientClass.put(ALIPAY_APP, AlipayAppPayClient.class); - clientClass.put(ALIPAY_PC, AlipayPcPayClient.class); - clientClass.put(ALIPAY_BAR, AlipayBarPayClient.class); - // Mock 支付客户端 - clientClass.put(MOCK, MockPayClient.class); - } - - @Override - public void registerPayClientClass(PayChannelEnum channel, Class payClientClass) { - clientClass.put(channel, payClientClass); - } - - @Override - public PayClient getPayClient(Long channelId) { - AbstractPayClient client = clients.get(channelId); - if (client == null) { - log.error("[getPayClient][渠道编号({}) 找不到客户端]", channelId); - } - return client; - } - - @Override - @SuppressWarnings("unchecked") - public void createOrUpdatePayClient(Long channelId, String channelCode, - Config config) { - AbstractPayClient client = (AbstractPayClient) clients.get(channelId); - if (client == null) { - client = this.createPayClient(channelId, channelCode, config); - client.init(); - clients.put(client.getId(), client); - } else { - client.refresh(config); - } - } - - @SuppressWarnings("unchecked") - private AbstractPayClient createPayClient(Long channelId, String channelCode, - Config config) { - PayChannelEnum channelEnum = PayChannelEnum.getByCode(channelCode); - Assert.notNull(channelEnum, String.format("支付渠道(%s) 为空", channelCode)); - Class payClientClass = clientClass.get(channelEnum); - Assert.notNull(payClientClass, String.format("支付渠道(%s) Class 为空", channelCode)); - return (AbstractPayClient) ReflectUtil.newInstance(payClientClass, channelId, config); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java deleted file mode 100644 index d223ab85..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.win.framework.common.util.object.ObjectUtils; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.client.impl.AbstractPayClient; -import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayConfig; -import com.alipay.api.AlipayResponse; -import com.alipay.api.DefaultAlipayClient; -import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel; -import com.alipay.api.domain.AlipayTradeQueryModel; -import com.alipay.api.domain.AlipayTradeRefundModel; -import com.alipay.api.internal.util.AlipaySignature; -import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest; -import com.alipay.api.request.AlipayTradeQueryRequest; -import com.alipay.api.request.AlipayTradeRefundRequest; -import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse; -import com.alipay.api.response.AlipayTradeQueryResponse; -import com.alipay.api.response.AlipayTradeRefundResponse; -import lombok.Getter; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.function.Supplier; - -import static cn.hutool.core.date.DatePattern.NORM_DATETIME_FORMATTER; - -/** - * 支付宝抽象类,实现支付宝统一的接口、以及部分实现(退款) - * - * @author jason - */ -@Slf4j -public abstract class AbstractAlipayPayClient extends AbstractPayClient { - - @Getter // 仅用于单测场景 - protected DefaultAlipayClient client; - - public AbstractAlipayPayClient(Long channelId, String channelCode, AlipayPayClientConfig config) { - super(channelId, channelCode, config); - } - - @Override - @SneakyThrows - protected void doInit() { - AlipayConfig alipayConfig = new AlipayConfig(); - BeanUtil.copyProperties(config, alipayConfig, false); - this.client = new DefaultAlipayClient(alipayConfig); - } - - // ============ 支付相关 ========== - - /** - * 构造支付关闭的 {@link PayOrderRespDTO} 对象 - * - * @return 支付关闭的 {@link PayOrderRespDTO} 对象 - */ - protected PayOrderRespDTO buildClosedPayOrderRespDTO(PayOrderUnifiedReqDTO reqDTO, AlipayResponse response) { - Assert.isFalse(response.isSuccess()); - return PayOrderRespDTO.closedOf(response.getSubCode(), response.getSubMsg(), - reqDTO.getOutTradeNo(), response); - } - - @Override - public PayOrderRespDTO doParseOrderNotify(Map params, String body) throws Throwable { - // 1. 校验回调数据 - Map bodyObj = HttpUtil.decodeParamMap(body, StandardCharsets.UTF_8); - AlipaySignature.rsaCheckV1(bodyObj, config.getAlipayPublicKey(), - StandardCharsets.UTF_8.name(), config.getSignType()); - - // 2. 解析订单的状态 - // 额外说明:支付宝不仅仅支付成功会回调,再各种触发支付单数据变化时,都会进行回调,所以这里 status 的解析会写的比较复杂 - Integer status = parseStatus(bodyObj.get("trade_status")); - // 特殊逻辑: 支付宝没有退款成功的状态,所以,如果有退款金额,我们认为是退款成功 - if (MapUtil.getDouble(bodyObj, "refund_fee", 0D) > 0) { - status = PayOrderStatusRespEnum.REFUND.getStatus(); - } - Assert.notNull(status, (Supplier) () -> { - throw new IllegalArgumentException(StrUtil.format("body({}) 的 trade_status 不正确", body)); - }); - return PayOrderRespDTO.of(status, bodyObj.get("trade_no"), bodyObj.get("seller_id"), parseTime(params.get("gmt_payment")), - bodyObj.get("out_trade_no"), body); - } - - @Override - protected PayOrderRespDTO doGetOrder(String outTradeNo) throws Throwable { - // 1.1 构建 AlipayTradeRefundModel 请求 - AlipayTradeQueryModel model = new AlipayTradeQueryModel(); - model.setOutTradeNo(outTradeNo); - // 1.2 构建 AlipayTradeQueryRequest 请求 - AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); - request.setBizModel(model); - - // 2.1 执行请求 - AlipayTradeQueryResponse response = client.execute(request); - if (!response.isSuccess()) { // 不成功,例如说订单不存在 - return PayOrderRespDTO.closedOf(response.getSubCode(), response.getSubMsg(), - outTradeNo, response); - } - // 2.2 解析订单的状态 - Integer status = parseStatus(response.getTradeStatus()); - Assert.notNull(status, (Supplier) () -> { - throw new IllegalArgumentException(StrUtil.format("body({}) 的 trade_status 不正确", response.getBody())); - }); - return PayOrderRespDTO.of(status, response.getTradeNo(), response.getBuyerUserId(), LocalDateTimeUtil.of(response.getSendPayDate()), - outTradeNo, response); - } - - private static Integer parseStatus(String tradeStatus) { - return Objects.equals("WAIT_BUYER_PAY", tradeStatus) ? PayOrderStatusRespEnum.WAITING.getStatus() - : ObjectUtils.equalsAny(tradeStatus, "TRADE_FINISHED", "TRADE_SUCCESS") ? PayOrderStatusRespEnum.SUCCESS.getStatus() - : Objects.equals("TRADE_CLOSED", tradeStatus) ? PayOrderStatusRespEnum.CLOSED.getStatus() : null; - } - - // ============ 退款相关 ========== - - /** - * 支付宝统一的退款接口 alipay.trade.refund - * - * @param reqDTO 退款请求 request DTO - * @return 退款请求 Response - */ - @Override - protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws AlipayApiException { - // 1.1 构建 AlipayTradeRefundModel 请求 - AlipayTradeRefundModel model = new AlipayTradeRefundModel(); - model.setOutTradeNo(reqDTO.getOutTradeNo()); - model.setOutRequestNo(reqDTO.getOutRefundNo()); - model.setRefundAmount(formatAmount(reqDTO.getRefundPrice())); - model.setRefundReason(reqDTO.getReason()); - // 1.2 构建 AlipayTradePayRequest 请求 - AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); - request.setBizModel(model); - - // 2.1 执行请求 - AlipayTradeRefundResponse response = client.execute(request); - if (!response.isSuccess()) { - return PayRefundRespDTO.failureOf(response.getSubCode(), response.getSubMsg(), reqDTO.getOutRefundNo(), response); - } - // 2.2 创建返回结果 - // 支付宝只要退款调用返回 success,就认为退款成功,不需要回调。具体可见 parseNotify 方法的说明。 - // 另外,支付宝没有退款单号,所以不用设置 - return PayRefundRespDTO.successOf(null, LocalDateTimeUtil.of(response.getGmtRefundPay()), - reqDTO.getOutRefundNo(), response); - } - - @Override - public PayRefundRespDTO doParseRefundNotify(Map params, String body) { - // 补充说明:支付宝退款时,没有回调,这点和微信支付是不同的。并且,退款分成部分退款、和全部退款。 - // ① 部分退款:是会有回调,但是它回调的是订单状态的同步回调,不是退款订单的回调 - // ② 全部退款:Wap 支付有订单状态的同步回调,但是 PC/扫码又没有 - // 所以,这里在解析时,即使是退款导致的订单状态同步,我们也忽略不做为“退款同步”,而是订单的回调。 - // 实际上,支付宝退款只要发起成功,就可以认为退款成功,不需要等待回调。 - throw new UnsupportedOperationException("支付宝无退款回调"); - } - - @Override - protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) throws AlipayApiException { - // 1.1 构建 AlipayTradeFastpayRefundQueryModel 请求 - AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel(); - model.setOutTradeNo(outTradeNo); - model.setOutRequestNo(outRefundNo); - model.setQueryOptions(Collections.singletonList("gmt_refund_pay")); - // 1.2 构建 AlipayTradeFastpayRefundQueryRequest 请求 - AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); - request.setBizModel(model); - - // 2.1 执行请求 - AlipayTradeFastpayRefundQueryResponse response = client.execute(request); - if (!response.isSuccess()) { - // 明确不存在的情况,应该就是失败,可进行关闭 - if (ObjectUtils.equalsAny(response.getSubCode(), "TRADE_NOT_EXIST", "ACQ.TRADE_NOT_EXIST")) { - return PayRefundRespDTO.failureOf(outRefundNo, response); - } - // 可能存在“ACQ.SYSTEM_ERROR”系统错误等情况,所以返回 WAIT 继续等待 - return PayRefundRespDTO.waitingOf(null, outRefundNo, response); - } - // 2.2 创建返回结果 - if (Objects.equals(response.getRefundStatus(), "REFUND_SUCCESS")) { - return PayRefundRespDTO.successOf(null, LocalDateTimeUtil.of(response.getGmtRefundPay()), - outRefundNo, response); - } - return PayRefundRespDTO.waitingOf(null, outRefundNo, response); - } - - // ========== 各种工具方法 ========== - - protected String formatAmount(Integer amount) { - return String.valueOf(amount / 100.0); - } - - protected String formatTime(LocalDateTime time) { - return LocalDateTimeUtil.format(time, NORM_DATETIME_FORMATTER); - } - - protected LocalDateTime parseTime(String str) { - return LocalDateTimeUtil.parse(str, NORM_DATETIME_FORMATTER); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java deleted file mode 100644 index 4f22ed2b..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradeAppPayModel; -import com.alipay.api.request.AlipayTradeAppPayRequest; -import com.alipay.api.response.AlipayTradeAppPayResponse; -import lombok.extern.slf4j.Slf4j; - -/** - * 支付宝【App 支付】的 PayClient 实现类 - * - * 文档:App 支付 - * - * // TODO 芋艿:未详细测试,因为手头没 App - * - * @author 芋道源码 - */ -@Slf4j -public class AlipayAppPayClient extends AbstractAlipayPayClient { - - public AlipayAppPayClient(Long channelId, AlipayPayClientConfig config) { - super(channelId, PayChannelEnum.ALIPAY_APP.getCode(), config); - } - - @Override - public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException { - // 1.1 构建 AlipayTradeAppPayModel 请求 - AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); - // ① 通用的参数 - model.setOutTradeNo(reqDTO.getOutTradeNo()); - model.setSubject(reqDTO.getSubject()); - model.setBody(reqDTO.getBody() + "test"); - model.setTotalAmount(formatAmount(reqDTO.getPrice())); - model.setTimeExpire(formatTime(reqDTO.getExpireTime())); - model.setProductCode("QUICK_MSECURITY_PAY"); // 销售产品码:无线快捷支付产品 - // ② 个性化的参数【无】 - // ③ 支付宝扫码支付只有一种展示 - String displayMode = PayOrderDisplayModeEnum.APP.getMode(); - - // 1.2 构建 AlipayTradePrecreateRequest 请求 - AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); - request.setBizModel(model); - request.setNotifyUrl(reqDTO.getNotifyUrl()); - request.setReturnUrl(reqDTO.getReturnUrl()); - - // 2.1 执行请求 - AlipayTradeAppPayResponse response = client.sdkExecute(request); - // 2.2 处理结果 - if (!response.isSuccess()) { - return buildClosedPayOrderRespDTO(reqDTO, response); - } - return PayOrderRespDTO.waitingOf(displayMode, response.getBody(), - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java deleted file mode 100644 index 5b281ace..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradePayModel; -import com.alipay.api.request.AlipayTradePayRequest; -import com.alipay.api.response.AlipayTradePayResponse; -import lombok.extern.slf4j.Slf4j; - -import java.time.LocalDateTime; - -import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; - -/** - * 支付宝【条码支付】的 PayClient 实现类 - * - * 文档:当面付 - * - * @author 芋道源码 - */ -@Slf4j -public class AlipayBarPayClient extends AbstractAlipayPayClient { - - public AlipayBarPayClient(Long channelId, AlipayPayClientConfig config) { - super(channelId, PayChannelEnum.ALIPAY_BAR.getCode(), config); - } - - @Override - public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException { - String authCode = MapUtil.getStr(reqDTO.getChannelExtras(), "auth_code"); - if (StrUtil.isEmpty(authCode)) { - throw exception0(BAD_REQUEST.getCode(), "条形码不能为空"); - } - - // 1.1 构建 AlipayTradePayModel 请求 - AlipayTradePayModel model = new AlipayTradePayModel(); - // ① 通用的参数 - model.setOutTradeNo(reqDTO.getOutTradeNo()); - model.setSubject(reqDTO.getSubject()); - model.setBody(reqDTO.getBody()); - model.setTotalAmount(formatAmount(reqDTO.getPrice())); - model.setScene("bar_code"); // 当面付条码支付场景 - // ② 个性化的参数 - model.setAuthCode(authCode); - // ③ 支付宝条码支付只有一种展示 - String displayMode = PayOrderDisplayModeEnum.BAR_CODE.getMode(); - - // 1.2 构建 AlipayTradePayRequest 请求 - AlipayTradePayRequest request = new AlipayTradePayRequest(); - request.setBizModel(model); - request.setNotifyUrl(reqDTO.getNotifyUrl()); - request.setReturnUrl(reqDTO.getReturnUrl()); - - // 2.1 执行请求 - AlipayTradePayResponse response = client.execute(request); - // 2.2 处理结果 - if (!response.isSuccess()) { - return buildClosedPayOrderRespDTO(reqDTO, response); - } - if ("10000".equals(response.getCode())) { // 免密支付 - LocalDateTime successTime = LocalDateTimeUtil.of(response.getGmtPayment()); - return PayOrderRespDTO.successOf(response.getTradeNo(), response.getBuyerUserId(), successTime, - response.getOutTradeNo(), response) - .setDisplayMode(displayMode).setDisplayContent(""); - } - // 大额支付,需要用户输入密码,所以返回 waiting。此时,前端一般会进行轮询 - return PayOrderRespDTO.waitingOf(displayMode, "", - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java deleted file mode 100644 index 3f01fadf..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import com.win.framework.common.util.validation.ValidationUtils; -import com.win.framework.pay.core.client.PayClientConfig; -import lombok.Data; - -import javax.validation.ConstraintViolation; -import javax.validation.Validator; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.util.Set; - -/** - * 支付宝的 PayClientConfig 实现类 - * 属性主要来自 {@link com.alipay.api.AlipayConfig} 的必要属性 - * - * @author 芋道源码 - */ -@Data -public class AlipayPayClientConfig implements PayClientConfig { - - /** - * 公钥类型 - 公钥模式 - */ - public static final Integer MODE_PUBLIC_KEY = 1; - /** - * 公钥类型 - 证书模式 - */ - public static final Integer MODE_CERTIFICATE = 2; - - /** - * 签名算法类型 - RSA - */ - public static final String SIGN_TYPE_DEFAULT = "RSA2"; - - /** - * 网关地址 - * - * 1. 生产环境 - * 2. 沙箱环境 - */ - @NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) - private String serverUrl; - - /** - * 开放平台上创建的应用的 ID - */ - @NotBlank(message = "开放平台上创建的应用的 ID不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) - private String appId; - - /** - * 签名算法类型,推荐:RSA2 - *

- * {@link #SIGN_TYPE_DEFAULT} - */ - @NotBlank(message = "签名算法类型不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) - private String signType; - - /** - * 公钥类型 - * 1. {@link #MODE_PUBLIC_KEY} 情况,privateKey + alipayPublicKey - * 2. {@link #MODE_CERTIFICATE} 情况,appCertContent + alipayPublicCertContent + rootCertContent - */ - @NotNull(message = "公钥类型不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) - private Integer mode; - - // ========== 公钥模式 ========== - /** - * 商户私钥 - */ - @NotBlank(message = "商户私钥不能为空", groups = {ModePublicKey.class}) - private String privateKey; - - /** - * 支付宝公钥字符串 - */ - @NotBlank(message = "支付宝公钥字符串不能为空", groups = {ModePublicKey.class}) - private String alipayPublicKey; - - // ========== 证书模式 ========== - /** - * 指定商户公钥应用证书内容字符串 - */ - @NotBlank(message = "指定商户公钥应用证书内容不能为空", groups = {ModeCertificate.class}) - private String appCertContent; - /** - * 指定支付宝公钥证书内容字符串 - */ - @NotBlank(message = "指定支付宝公钥证书内容不能为空", groups = {ModeCertificate.class}) - private String alipayPublicCertContent; - /** - * 指定根证书内容字符串 - */ - @NotBlank(message = "指定根证书内容字符串不能为空", groups = {ModeCertificate.class}) - private String rootCertContent; - - public interface ModePublicKey { - } - - public interface ModeCertificate { - } - - @Override - public void validate(Validator validator) { - ValidationUtils.validate(validator, this, - MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java deleted file mode 100644 index 4c1566fb..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.Method; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradePagePayModel; -import com.alipay.api.request.AlipayTradePagePayRequest; -import com.alipay.api.response.AlipayTradePagePayResponse; -import lombok.extern.slf4j.Slf4j; - -import java.util.Objects; - -/** - * 支付宝【PC 网站】的 PayClient 实现类 - * - * 文档:电脑网站支付 - * - * @author XGD - */ -@Slf4j -public class AlipayPcPayClient extends AbstractAlipayPayClient { - - public AlipayPcPayClient(Long channelId, AlipayPayClientConfig config) { - super(channelId, PayChannelEnum.ALIPAY_PC.getCode(), config); - } - - @Override - public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException { - // 1.1 构建 AlipayTradePagePayModel 请求 - AlipayTradePagePayModel model = new AlipayTradePagePayModel(); - // ① 通用的参数 - model.setOutTradeNo(reqDTO.getOutTradeNo()); - model.setSubject(reqDTO.getSubject()); - model.setBody(reqDTO.getBody()); - model.setTotalAmount(formatAmount(reqDTO.getPrice())); - model.setTimeExpire(formatTime(reqDTO.getExpireTime())); - model.setProductCode("FAST_INSTANT_TRADE_PAY"); // 销售产品码. 目前 PC 支付场景下仅支持 FAST_INSTANT_TRADE_PAY - // ② 个性化的参数 - // 如果想弄更多个性化的参数,可参考 https://www.pingxx.com/api/支付渠道 extra 参数说明.html 的 alipay_pc_direct 部分进行拓展 - model.setQrPayMode("2"); // 跳转模式 - 订单码,效果参见:https://help.pingxx.com/article/1137360/ - // ③ 支付宝 PC 支付有两种展示模式:FORM、URL - String displayMode = ObjectUtil.defaultIfNull(reqDTO.getDisplayMode(), - PayOrderDisplayModeEnum.URL.getMode()); - - // 1.2 构建 AlipayTradePagePayRequest 请求 - AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); - request.setBizModel(model); - request.setNotifyUrl(reqDTO.getNotifyUrl()); - request.setReturnUrl(reqDTO.getReturnUrl()); - - // 2.1 执行请求 - AlipayTradePagePayResponse response; - if (Objects.equals(displayMode, PayOrderDisplayModeEnum.FORM.getMode())) { - response = client.pageExecute(request, Method.POST.name()); // 需要特殊使用 POST 请求 - } else { - response = client.pageExecute(request, Method.GET.name()); - } - // 2.2 处理结果 - if (!response.isSuccess()) { - return buildClosedPayOrderRespDTO(reqDTO, response); - } - return PayOrderRespDTO.waitingOf(displayMode, response.getBody(), - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java deleted file mode 100644 index bec7da49..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradePrecreateModel; -import com.alipay.api.request.AlipayTradePrecreateRequest; -import com.alipay.api.response.AlipayTradePrecreateResponse; -import lombok.extern.slf4j.Slf4j; - -/** - * 支付宝【扫码支付】的 PayClient 实现类 - * - * 文档:扫码支付 - * - * @author 芋道源码 - */ -@Slf4j -public class AlipayQrPayClient extends AbstractAlipayPayClient { - - public AlipayQrPayClient(Long channelId, AlipayPayClientConfig config) { - super(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config); - } - - @Override - public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException { - // 1.1 构建 AlipayTradePrecreateModel 请求 - AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); - // ① 通用的参数 - model.setOutTradeNo(reqDTO.getOutTradeNo()); - model.setSubject(reqDTO.getSubject()); - model.setBody(reqDTO.getBody()); - model.setTotalAmount(formatAmount(reqDTO.getPrice())); - model.setProductCode("FACE_TO_FACE_PAYMENT"); // 销售产品码. 目前扫码支付场景下仅支持 FACE_TO_FACE_PAYMENT - // ② 个性化的参数【无】 - // ③ 支付宝扫码支付只有一种展示,考虑到前端可能希望二维码扫描后,手机打开 - String displayMode = PayOrderDisplayModeEnum.QR_CODE.getMode(); - - // 1.2 构建 AlipayTradePrecreateRequest 请求 - AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); - request.setBizModel(model); - request.setNotifyUrl(reqDTO.getNotifyUrl()); - request.setReturnUrl(reqDTO.getReturnUrl()); - - // 2.1 执行请求 - AlipayTradePrecreateResponse response = client.execute(request); - // 2.2 处理结果 - if (!response.isSuccess()) { - return buildClosedPayOrderRespDTO(reqDTO, response); - } - return PayOrderRespDTO.waitingOf(displayMode, response.getQrCode(), - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java deleted file mode 100644 index a2753d45..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.http.Method; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradeWapPayModel; -import com.alipay.api.request.AlipayTradeWapPayRequest; -import com.alipay.api.response.AlipayTradeWapPayResponse; -import lombok.extern.slf4j.Slf4j; - -/** - * 支付宝【Wap 网站】的 PayClient 实现类 - * - * 文档:手机网站支付接口 - * - * @author 芋道源码 - */ -@Slf4j -public class AlipayWapPayClient extends AbstractAlipayPayClient { - - public AlipayWapPayClient(Long channelId, AlipayPayClientConfig config) { - super(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config); - } - - @Override - public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException { - // 1.1 构建 AlipayTradeWapPayModel 请求 - AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); - // ① 通用的参数 - model.setOutTradeNo(reqDTO.getOutTradeNo()); - model.setSubject(reqDTO.getSubject()); - model.setBody(reqDTO.getBody()); - model.setTotalAmount(formatAmount(reqDTO.getPrice())); - model.setProductCode("QUICK_WAP_PAY"); // 销售产品码. 目前 Wap 支付场景下仅支持 QUICK_WAP_PAY - // ② 个性化的参数【无】 - // ③ 支付宝 Wap 支付只有一种展示:URL - String displayMode = PayOrderDisplayModeEnum.URL.getMode(); - - // 1.2 构建 AlipayTradeWapPayRequest 请求 - AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); - request.setBizModel(model); - request.setNotifyUrl(reqDTO.getNotifyUrl()); - request.setReturnUrl(reqDTO.getReturnUrl()); - model.setQuitUrl(reqDTO.getReturnUrl()); - - // 2.1 执行请求 - AlipayTradeWapPayResponse response = client.pageExecute(request, Method.GET.name()); - // 2.2 处理结果 - if (!response.isSuccess()) { - return buildClosedPayOrderRespDTO(reqDTO, response); - } - return PayOrderRespDTO.waitingOf(displayMode, response.getBody(), - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java deleted file mode 100644 index 6faf7146..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.framework.pay.core.client.impl.mock; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.client.impl.AbstractPayClient; -import com.win.framework.pay.core.client.impl.NonePayClientConfig; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; - -import java.time.LocalDateTime; -import java.util.Map; - -/** - * 模拟支付的 PayClient 实现类 - * - * 模拟支付返回结果都是成功,方便大家日常流畅 - * - * @author jason - */ -public class MockPayClient extends AbstractPayClient { - - private static final String MOCK_RESP_SUCCESS_DATA = "MOCK_SUCCESS"; - - public MockPayClient(Long channelId, NonePayClientConfig config) { - super(channelId, PayChannelEnum.MOCK.getCode(), config); - } - - @Override - protected void doInit() { - } - - @Override - protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { - return PayOrderRespDTO.successOf("MOCK-P-" + reqDTO.getOutTradeNo(), "", LocalDateTime.now(), - reqDTO.getOutTradeNo(), MOCK_RESP_SUCCESS_DATA); - } - - @Override - protected PayOrderRespDTO doGetOrder(String outTradeNo) { - return PayOrderRespDTO.successOf("MOCK-P-" + outTradeNo, "", LocalDateTime.now(), - outTradeNo, MOCK_RESP_SUCCESS_DATA); - } - - @Override - protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) { - return PayRefundRespDTO.successOf("MOCK-R-" + reqDTO.getOutRefundNo(), LocalDateTime.now(), - reqDTO.getOutRefundNo(), MOCK_RESP_SUCCESS_DATA); - } - - @Override - protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) { - return PayRefundRespDTO.successOf("MOCK-R-" + outRefundNo, LocalDateTime.now(), - outRefundNo, MOCK_RESP_SUCCESS_DATA); - } - - @Override - protected PayRefundRespDTO doParseRefundNotify(Map params, String body) { - throw new UnsupportedOperationException("模拟支付无退款回调"); - } - - @Override - protected PayOrderRespDTO doParseOrderNotify(Map params, String body) { - throw new UnsupportedOperationException("模拟支付无支付回调"); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java deleted file mode 100644 index 5a1e10d9..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java +++ /dev/null @@ -1,470 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.date.TemporalAccessorUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.util.io.FileUtils; -import com.win.framework.common.util.object.ObjectUtils; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.client.impl.AbstractPayClient; -import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum; -import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; -import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; -import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult; -import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result; -import com.github.binarywang.wxpay.bean.request.*; -import com.github.binarywang.wxpay.bean.result.*; -import com.github.binarywang.wxpay.config.WxPayConfig; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; -import lombok.extern.slf4j.Slf4j; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Map; -import java.util.Objects; - -import static cn.hutool.core.date.DatePattern.*; -import static com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig.API_VERSION_V2; - -/** - * 微信支付抽象类,实现微信统一的接口、以及部分实现(退款) - * - * @author 遇到源码 - */ -@Slf4j -public abstract class AbstractWxPayClient extends AbstractPayClient { - - protected WxPayService client; - - public AbstractWxPayClient(Long channelId, String channelCode, WxPayClientConfig config) { - super(channelId, channelCode, config); - } - - /** - * 初始化 client 客户端 - * - * @param tradeType 交易类型 - */ - protected void doInit(String tradeType) { - // 创建 config 配置 - WxPayConfig payConfig = new WxPayConfig(); - BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent", "privateCertContent"); - payConfig.setTradeType(tradeType); - // weixin-pay-java 无法设置内容,只允许读取文件,所以这里要创建临时文件来解决 - if (Base64.isBase64(config.getKeyContent())) { - payConfig.setKeyPath(FileUtils.createTempFile(Base64.decode(config.getKeyContent())).getPath()); - } - if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) { - payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath()); - } - if (StrUtil.isNotEmpty(config.getPrivateCertContent())) { - payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath()); - } - - // 创建 client 客户端 - client = new WxPayServiceImpl(); - client.setConfig(payConfig); - } - - // ============ 支付相关 ========== - - @Override - protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws Exception { - try { - switch (config.getApiVersion()) { - case API_VERSION_V2: - return doUnifiedOrderV2(reqDTO); - case WxPayClientConfig.API_VERSION_V3: - return doUnifiedOrderV3(reqDTO); - default: - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); - } - } catch (WxPayException e) { - String errorCode = getErrorCode(e); - String errorMessage = getErrorMessage(e); - return PayOrderRespDTO.closedOf(errorCode, errorMessage, - reqDTO.getOutTradeNo(), e.getXmlString()); - } - } - - /** - * 【V2】调用支付渠道,统一下单 - * - * @param reqDTO 下单信息 - * @return 各支付渠道的返回结果 - */ - protected abstract PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) - throws Exception; - - /** - * 【V3】调用支付渠道,统一下单 - * - * @param reqDTO 下单信息 - * @return 各支付渠道的返回结果 - */ - protected abstract PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) - throws WxPayException; - - /** - * 【V2】创建微信下单请求 - * - * @param reqDTO 下信息 - * @return 下单请求 - */ - protected WxPayUnifiedOrderRequest buildPayUnifiedOrderRequestV2(PayOrderUnifiedReqDTO reqDTO) { - return WxPayUnifiedOrderRequest.newBuilder() - .outTradeNo(reqDTO.getOutTradeNo()) - .body(reqDTO.getSubject()) - .detail(reqDTO.getBody()) - .totalFee(reqDTO.getPrice()) // 单位分 - .timeExpire(formatDateV2(reqDTO.getExpireTime())) - .spbillCreateIp(reqDTO.getUserIp()) - .notifyUrl(reqDTO.getNotifyUrl()) - .build(); - } - - /** - * 【V3】创建微信下单请求 - * - * @param reqDTO 下信息 - * @return 下单请求 - */ - protected WxPayUnifiedOrderV3Request buildPayUnifiedOrderRequestV3(PayOrderUnifiedReqDTO reqDTO) { - WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request(); - request.setOutTradeNo(reqDTO.getOutTradeNo()); - request.setDescription(reqDTO.getSubject()); - request.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(reqDTO.getPrice())); // 单位分 - request.setTimeExpire(formatDateV3(reqDTO.getExpireTime())); - request.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp(reqDTO.getUserIp())); - request.setNotifyUrl(reqDTO.getNotifyUrl()); - return request; - } - - @Override - public PayOrderRespDTO doParseOrderNotify(Map params, String body) throws WxPayException { - switch (config.getApiVersion()) { - case API_VERSION_V2: - return doParseOrderNotifyV2(body); - case WxPayClientConfig.API_VERSION_V3: - return doParseOrderNotifyV3(body); - default: - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); - } - } - - private PayOrderRespDTO doParseOrderNotifyV2(String body) throws WxPayException { - // 1. 解析回调 - WxPayOrderNotifyResult response = client.parseOrderNotifyResult(body); - // 2. 构建结果 - // V2 微信支付的回调,只有 SUCCESS 支付成功、CLOSED 支付失败两种情况,无需像支付宝一样解析的比较复杂 - Integer status = Objects.equals(response.getResultCode(), "SUCCESS") ? - PayOrderStatusRespEnum.SUCCESS.getStatus() : PayOrderStatusRespEnum.CLOSED.getStatus(); - return PayOrderRespDTO.of(status, response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()), - response.getOutTradeNo(), body); - } - - private PayOrderRespDTO doParseOrderNotifyV3(String body) throws WxPayException { - // 1. 解析回调 - WxPayOrderNotifyV3Result response = client.parseOrderNotifyV3Result(body, null); - WxPayOrderNotifyV3Result.DecryptNotifyResult result = response.getResult(); - // 2. 构建结果 - Integer status = parseStatus(result.getTradeState()); - String openid = result.getPayer() != null ? result.getPayer().getOpenid() : null; - return PayOrderRespDTO.of(status, result.getTransactionId(), openid, parseDateV3(result.getSuccessTime()), - result.getOutTradeNo(), body); - } - - @Override - protected PayOrderRespDTO doGetOrder(String outTradeNo) throws Throwable { - try { - switch (config.getApiVersion()) { - case API_VERSION_V2: - return doGetOrderV2(outTradeNo); - case WxPayClientConfig.API_VERSION_V3: - return doGetOrderV3(outTradeNo); - default: - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); - } - } catch (WxPayException e) { - if (ObjectUtils.equalsAny(e.getErrCode(), "ORDERNOTEXIST", "ORDER_NOT_EXIST")) { - String errorCode = getErrorCode(e); - String errorMessage = getErrorMessage(e); - return PayOrderRespDTO.closedOf(errorCode, errorMessage, - outTradeNo, e.getXmlString()); - } - throw e; - } - } - - private PayOrderRespDTO doGetOrderV2(String outTradeNo) throws WxPayException { - // 构建 WxPayUnifiedOrderRequest 对象 - WxPayOrderQueryRequest request = WxPayOrderQueryRequest.newBuilder() - .outTradeNo(outTradeNo).build(); - // 执行请求 - WxPayOrderQueryResult response = client.queryOrder(request); - - // 转换结果 - Integer status = parseStatus(response.getTradeState()); - return PayOrderRespDTO.of(status, response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()), - outTradeNo, response); - } - - private PayOrderRespDTO doGetOrderV3(String outTradeNo) throws WxPayException { - // 构建 WxPayUnifiedOrderRequest 对象 - WxPayOrderQueryV3Request request = new WxPayOrderQueryV3Request() - .setOutTradeNo(outTradeNo); - // 执行请求 - WxPayOrderQueryV3Result response = client.queryOrderV3(request); - - // 转换结果 - Integer status = parseStatus(response.getTradeState()); - String openid = response.getPayer() != null ? response.getPayer().getOpenid() : null; - return PayOrderRespDTO.of(status, response.getTransactionId(), openid, parseDateV3(response.getSuccessTime()), - outTradeNo, response); - } - - private static Integer parseStatus(String tradeState) { - switch (tradeState) { - case "NOTPAY": - case "USERPAYING": // 支付中,等待用户输入密码(条码支付独有) - return PayOrderStatusRespEnum.WAITING.getStatus(); - case "SUCCESS": - return PayOrderStatusRespEnum.SUCCESS.getStatus(); - case "REFUND": - return PayOrderStatusRespEnum.REFUND.getStatus(); - case "CLOSED": - case "REVOKED": // 已撤销(刷卡支付独有) - case "PAYERROR": // 支付失败(其它原因,如银行返回失败) - return PayOrderStatusRespEnum.CLOSED.getStatus(); - default: - throw new IllegalArgumentException(StrUtil.format("未知的支付状态({})", tradeState)); - } - } - - // ============ 退款相关 ========== - - @Override - protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable { - try { - switch (config.getApiVersion()) { - case API_VERSION_V2: - return doUnifiedRefundV2(reqDTO); - case WxPayClientConfig.API_VERSION_V3: - return doUnifiedRefundV3(reqDTO); - default: - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); - } - } catch (WxPayException e) { - String errorCode = getErrorCode(e); - String errorMessage = getErrorMessage(e); - return PayRefundRespDTO.failureOf(errorCode, errorMessage, - reqDTO.getOutTradeNo(), e.getXmlString()); - } - } - - private PayRefundRespDTO doUnifiedRefundV2(PayRefundUnifiedReqDTO reqDTO) throws Throwable { - // 1. 构建 WxPayRefundRequest 请求 - WxPayRefundRequest request = new WxPayRefundRequest() - .setOutTradeNo(reqDTO.getOutTradeNo()) - .setOutRefundNo(reqDTO.getOutRefundNo()) - .setRefundFee(reqDTO.getRefundPrice()) - .setRefundDesc(reqDTO.getReason()) - .setTotalFee(reqDTO.getPayPrice()) - .setNotifyUrl(reqDTO.getNotifyUrl()); - // 2.1 执行请求 - WxPayRefundResult response = client.refundV2(request); - // 2.2 创建返回结果 - if (Objects.equals("SUCCESS", response.getResultCode())) { // V2 情况下,不直接返回退款成功,而是等待异步通知 - return PayRefundRespDTO.waitingOf(response.getRefundId(), - reqDTO.getOutRefundNo(), response); - } - return PayRefundRespDTO.failureOf(reqDTO.getOutRefundNo(), response); - } - - private PayRefundRespDTO doUnifiedRefundV3(PayRefundUnifiedReqDTO reqDTO) throws Throwable { - // 1. 构建 WxPayRefundRequest 请求 - WxPayRefundV3Request request = new WxPayRefundV3Request() - .setOutTradeNo(reqDTO.getOutTradeNo()) - .setOutRefundNo(reqDTO.getOutRefundNo()) - .setAmount(new WxPayRefundV3Request.Amount().setRefund(reqDTO.getRefundPrice()) - .setTotal(reqDTO.getPayPrice()).setCurrency("CNY")) - .setReason(reqDTO.getReason()) - .setNotifyUrl(reqDTO.getNotifyUrl()); - // 2.1 执行请求 - WxPayRefundV3Result response = client.refundV3(request); - // 2.2 创建返回结果 - if (Objects.equals("SUCCESS", response.getStatus())) { - return PayRefundRespDTO.successOf(response.getRefundId(), parseDateV3(response.getSuccessTime()), - reqDTO.getOutRefundNo(), response); - } - if (Objects.equals("PROCESSING", response.getStatus())) { - return PayRefundRespDTO.waitingOf(response.getRefundId(), - reqDTO.getOutRefundNo(), response); - } - return PayRefundRespDTO.failureOf(reqDTO.getOutRefundNo(), response); - } - - @Override - public PayRefundRespDTO doParseRefundNotify(Map params, String body) throws WxPayException { - switch (config.getApiVersion()) { - case API_VERSION_V2: - return doParseRefundNotifyV2(body); - case WxPayClientConfig.API_VERSION_V3: - return parseRefundNotifyV3(body); - default: - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); - } - } - - private PayRefundRespDTO doParseRefundNotifyV2(String body) throws WxPayException { - // 1. 解析回调 - WxPayRefundNotifyResult response = client.parseRefundNotifyResult(body); - WxPayRefundNotifyResult.ReqInfo result = response.getReqInfo(); - // 2. 构建结果 - if (Objects.equals("SUCCESS", result.getRefundStatus())) { - return PayRefundRespDTO.successOf(result.getRefundId(), parseDateV2B(result.getSuccessTime()), - result.getOutRefundNo(), response); - } - return PayRefundRespDTO.failureOf(result.getOutRefundNo(), response); - } - - private PayRefundRespDTO parseRefundNotifyV3(String body) throws WxPayException { - // 1. 解析回调 - WxPayRefundNotifyV3Result response = client.parseRefundNotifyV3Result(body, null); - WxPayRefundNotifyV3Result.DecryptNotifyResult result = response.getResult(); - // 2. 构建结果 - if (Objects.equals("SUCCESS", result.getRefundStatus())) { - return PayRefundRespDTO.successOf(result.getRefundId(), parseDateV3(result.getSuccessTime()), - result.getOutRefundNo(), response); - } - return PayRefundRespDTO.failureOf(result.getOutRefundNo(), response); - } - - @Override - protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) throws WxPayException { - try { - switch (config.getApiVersion()) { - case API_VERSION_V2: - return doGetRefundV2(outTradeNo, outRefundNo); - case WxPayClientConfig.API_VERSION_V3: - return doGetRefundV3(outTradeNo, outRefundNo); - default: - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); - } - } catch (WxPayException e) { - if (ObjectUtils.equalsAny(e.getErrCode(), "REFUNDNOTEXIST", "RESOURCE_NOT_EXISTS")) { - String errorCode = getErrorCode(e); - String errorMessage = getErrorMessage(e); - return PayRefundRespDTO.failureOf(errorCode, errorMessage, - outRefundNo, e.getXmlString()); - } - throw e; - } - } - - private PayRefundRespDTO doGetRefundV2(String outTradeNo, String outRefundNo) throws WxPayException { - // 1. 构建 WxPayRefundRequest 请求 - WxPayRefundQueryRequest request = WxPayRefundQueryRequest.newBuilder() - .outTradeNo(outTradeNo) - .outRefundNo(outRefundNo) - .build(); - // 2.1 执行请求 - WxPayRefundQueryResult response = client.refundQuery(request); - // 2.2 创建返回结果 - if (!Objects.equals("SUCCESS", response.getResultCode())) { - return PayRefundRespDTO.waitingOf(null, - outRefundNo, response); - } - WxPayRefundQueryResult.RefundRecord refund = CollUtil.findOne(response.getRefundRecords(), - record -> record.getOutRefundNo().equals(outRefundNo)); - if (refund == null) { - return PayRefundRespDTO.failureOf(outRefundNo, response); - } - switch (refund.getRefundStatus()) { - case "SUCCESS": - return PayRefundRespDTO.successOf(refund.getRefundId(), parseDateV2B(refund.getRefundSuccessTime()), - outRefundNo, response); - case "PROCESSING": - return PayRefundRespDTO.waitingOf(refund.getRefundId(), - outRefundNo, response); - case "CHANGE": // 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财付通转账的方式进行退款 - case "FAIL": - return PayRefundRespDTO.failureOf(outRefundNo, response); - default: - throw new IllegalArgumentException(String.format("未知的退款状态(%s)", refund.getRefundStatus())); - } - } - - private PayRefundRespDTO doGetRefundV3(String outTradeNo, String outRefundNo) throws WxPayException { - // 1. 构建 WxPayRefundRequest 请求 - WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request(); - request.setOutRefundNo(outRefundNo); - // 2.1 执行请求 - WxPayRefundQueryV3Result response = client.refundQueryV3(request); - // 2.2 创建返回结果 - switch (response.getStatus()) { - case "SUCCESS": - return PayRefundRespDTO.successOf(response.getRefundId(), parseDateV3(response.getSuccessTime()), - outRefundNo, response); - case "PROCESSING": - return PayRefundRespDTO.waitingOf(response.getRefundId(), - outRefundNo, response); - case "ABNORMAL": // 退款异常 - case "CLOSED": - return PayRefundRespDTO.failureOf(outRefundNo, response); - default: - throw new IllegalArgumentException(String.format("未知的退款状态(%s)", response.getStatus())); - } - } - - // ========== 各种工具方法 ========== - - static String formatDateV2(LocalDateTime time) { - return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), PURE_DATETIME_PATTERN); - } - - static LocalDateTime parseDateV2(String time) { - return LocalDateTimeUtil.parse(time, PURE_DATETIME_PATTERN); - } - - static LocalDateTime parseDateV2B(String time) { - return LocalDateTimeUtil.parse(time, NORM_DATETIME_PATTERN); - } - - static String formatDateV3(LocalDateTime time) { - return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), UTC_WITH_XXX_OFFSET_PATTERN); - } - - static LocalDateTime parseDateV3(String time) { - return LocalDateTimeUtil.parse(time, UTC_WITH_XXX_OFFSET_PATTERN); - } - - static String getErrorCode(WxPayException e) { - if (StrUtil.isNotEmpty(e.getErrCode())) { - return e.getErrCode(); - } - if (StrUtil.isNotEmpty(e.getCustomErrorMsg())) { - return "CUSTOM_ERROR"; - } - return e.getReturnCode(); - } - - static String getErrorMessage(WxPayException e) { - if (StrUtil.isNotEmpty(e.getErrCode())) { - return e.getErrCodeDes(); - } - if (StrUtil.isNotEmpty(e.getCustomErrorMsg())) { - return e.getCustomErrorMsg(); - } - return e.getReturnMsg(); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java deleted file mode 100644 index 5da51a4a..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.exception.WxPayException; -import lombok.extern.slf4j.Slf4j; - -import static com.win.framework.common.util.json.JsonUtils.toJsonString; - -/** - * 微信支付【App 支付】的 PayClient 实现类 - * - * 文档:App 支付 - * - * // TODO 芋艿:未详细测试,因为手头没 App - * - * @author 芋道源码 - */ -@Slf4j -public class WxAppPayClient extends AbstractWxPayClient { - - public WxAppPayClient(Long channelId, WxPayClientConfig config) { - super(channelId, PayChannelEnum.WX_APP.getCode(), config); - } - - @Override - protected void doInit() { - super.doInit(WxPayConstants.TradeType.APP); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 构建 WxPayUnifiedOrderRequest 对象 - WxPayUnifiedOrderRequest request = buildPayUnifiedOrderRequestV2(reqDTO); - // 执行请求 - WxPayMpOrderResult response = client.createOrder(request); - - // 转换结果 - return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response), - reqDTO.getOutTradeNo(), response); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 构建 WxPayUnifiedOrderV3Request 对象 - WxPayUnifiedOrderV3Request request = buildPayUnifiedOrderRequestV3(reqDTO); - // 执行请求 - WxPayUnifiedOrderV3Result.AppResult response = client.createOrderV3(TradeTypeEnum.APP, request); - - // 转换结果 - return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response), - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java deleted file mode 100644 index 7071eb7e..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest; -import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.exception.WxPayException; -import lombok.extern.slf4j.Slf4j; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.concurrent.TimeUnit; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.invalidParamException; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; - -/** - * 微信支付【付款码支付】的 PayClient 实现类 - * - * 文档:付款码支付 - * - * @author 芋道源码 - */ -@Slf4j -public class WxBarPayClient extends AbstractWxPayClient { - - /** - * 微信付款码的过期时间 - */ - private static final Duration AUTH_CODE_EXPIRE = Duration.ofMinutes(3); - - public WxBarPayClient(Long channelId, WxPayClientConfig config) { - super(channelId, PayChannelEnum.WX_BAR.getCode(), config); - } - - @Override - protected void doInit() { - super.doInit(WxPayConstants.TradeType.MICROPAY); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 由于付款码需要不断轮询,所以需要在较短的时间完成支付 - LocalDateTime expireTime = LocalDateTimeUtils.addTime(AUTH_CODE_EXPIRE); - if (expireTime.isAfter(reqDTO.getExpireTime())) { - expireTime = reqDTO.getExpireTime(); - } - // 构建 WxPayMicropayRequest 对象 - WxPayMicropayRequest request = WxPayMicropayRequest.newBuilder() - .outTradeNo(reqDTO.getOutTradeNo()) - .body(reqDTO.getSubject()) - .detail(reqDTO.getBody()) - .totalFee(reqDTO.getPrice()) // 单位分 - .timeExpire(formatDateV2(expireTime)) - .spbillCreateIp(reqDTO.getUserIp()) - .authCode(getAuthCode(reqDTO)) - .build(); - // 执行请求,重试直到失败(过期),或者成功 - WxPayException lastWxPayException = null; - for (int i = 1; i < Byte.MAX_VALUE; i++) { - try { - WxPayMicropayResult response = client.micropay(request); - // 支付成功,例如说:1)用户输入了密码;2)用户免密支付 - return PayOrderRespDTO.successOf(response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()), - response.getOutTradeNo(), response) - .setDisplayMode(PayOrderDisplayModeEnum.BAR_CODE.getMode()); - } catch (WxPayException ex) { - lastWxPayException = ex; - // 如果不满足这 3 种任一的,则直接抛出 WxPayException 异常,不仅需处理 - // 1. SYSTEMERROR:接口返回错误:请立即调用被扫订单结果查询API,查询当前订单状态,并根据订单的状态决定下一步的操作。 - // 2. USERPAYING:用户支付中,需要输入密码:等待 5 秒,然后调用被扫订单结果查询 API,查询当前订单的不同状态,决定下一步的操作。 - // 3. BANKERROR:银行系统异常:请立即调用被扫订单结果查询 API,查询当前订单的不同状态,决定下一步的操作。 - if (!StrUtil.equalsAny(ex.getErrCode(), "SYSTEMERROR", "USERPAYING", "BANKERROR")) { - throw ex; - } - // 等待 5 秒,继续下一轮重新发起支付 - log.info("[doUnifiedOrderV2][发起微信 Bar 支付第({})失败,等待下一轮重试,请求({}),响应({})]", i, - toJsonString(request), ex.getMessage()); - ThreadUtil.sleep(5, TimeUnit.SECONDS); - } - } - throw lastWxPayException; - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - return doUnifiedOrderV2(reqDTO); - } - - // ========== 各种工具方法 ========== - - static String getAuthCode(PayOrderUnifiedReqDTO reqDTO) { - String authCode = MapUtil.getStr(reqDTO.getChannelExtras(), "authCode"); - if (StrUtil.isEmpty(authCode)) { - throw invalidParamException("支付请求的 authCode 不能为空!"); - } - return authCode; - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java deleted file mode 100644 index 0b315f74..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import lombok.extern.slf4j.Slf4j; - -/** - * 微信支付【小程序】的 PayClient 实现类 - * - * 由于公众号和小程序的微信支付逻辑一致,所以直接进行继承 - * - * 文档:JSAPI 下单 - * - * @author zwy - */ -@Slf4j -public class WxLitePayClient extends WxPubPayClient { - - public WxLitePayClient(Long channelId, WxPayClientConfig config) { - super(channelId, PayChannelEnum.WX_LITE.getCode(), config); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java deleted file mode 100644 index 59c3e089..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.exception.WxPayException; -import lombok.extern.slf4j.Slf4j; - -/** - * 微信支付【Native 二维码】的 PayClient 实现类 - * - * 文档:Native 下单 - * - * @author zwy - */ -@Slf4j -public class WxNativePayClient extends AbstractWxPayClient { - - public WxNativePayClient(Long channelId, WxPayClientConfig config) { - super(channelId, PayChannelEnum.WX_NATIVE.getCode(), config); - } - - @Override - protected void doInit() { - super.doInit(WxPayConstants.TradeType.NATIVE); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 构建 WxPayUnifiedOrderRequest 对象 - WxPayUnifiedOrderRequest request = buildPayUnifiedOrderRequestV2(reqDTO); - // 执行请求 - WxPayNativeOrderResult response = client.createOrder(request); - - // 转换结果 - return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.QR_CODE.getMode(), response.getCodeUrl(), - reqDTO.getOutTradeNo(), response); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 构建 WxPayUnifiedOrderV3Request 对象 - WxPayUnifiedOrderV3Request request = buildPayUnifiedOrderRequestV3(reqDTO); - // 执行请求 - String response = client.createOrderV3(TradeTypeEnum.NATIVE, request); - - // 转换结果 - return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.QR_CODE.getMode(), response, - reqDTO.getOutTradeNo(), response); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java deleted file mode 100644 index c6d2b93a..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import cn.hutool.core.io.IoUtil; -import com.win.framework.common.util.validation.ValidationUtils; -import com.win.framework.pay.core.client.PayClientConfig; -import lombok.Data; - -import javax.validation.Validator; -import javax.validation.constraints.NotBlank; -import java.io.FileInputStream; -import java.io.FileNotFoundException; - -/** - * 微信支付的 PayClientConfig 实现类 - * 属性主要来自 {@link com.github.binarywang.wxpay.config.WxPayConfig} 的必要属性 - * - * @author 芋道源码 - */ -@Data -public class WxPayClientConfig implements PayClientConfig { - - /** - * API 版本 - V2 - * - * V2 协议说明 - */ - public static final String API_VERSION_V2 = "v2"; - /** - * API 版本 - V3 - * - * V3 协议说明 - */ - public static final String API_VERSION_V3 = "v3"; - - /** - * 公众号或者小程序的 appid - * - * 只有公众号或小程序需要该字段 - */ - @NotBlank(message = "APPID 不能为空", groups = {V2.class, V3.class}) - private String appId; - /** - * 商户号 - */ - @NotBlank(message = "商户号不能为空", groups = {V2.class, V3.class}) - private String mchId; - /** - * API 版本 - */ - @NotBlank(message = "API 版本不能为空", groups = {V2.class, V3.class}) - private String apiVersion; - - // ========== V2 版本的参数 ========== - - /** - * 商户密钥 - */ - @NotBlank(message = "商户密钥不能为空", groups = V2.class) - private String mchKey; - /** - * apiclient_cert.p12 证书文件的对应字符串【base64 格式】 - * - * 为什么采用 base64 格式?因为 p12 读取后是二进制,需要转换成 base64 格式才好传输和存储 - */ - @NotBlank(message = "apiclient_cert.p12 不能为空", groups = V2.class) - private String keyContent; - - // ========== V3 版本的参数 ========== - /** - * apiclient_key.pem 证书文件的对应字符串 - */ - @NotBlank(message = "apiclient_key 不能为空", groups = V3.class) - private String privateKeyContent; - /** - * apiclient_cert.pem 证书文件的对应的字符串 - */ - @NotBlank(message = "apiclient_cert 不能为空", groups = V3.class) - private String privateCertContent; - /** - * apiV3 密钥值 - */ - @NotBlank(message = "apiV3 密钥值不能为空", groups = V3.class) - private String apiV3Key; - - /** - * 分组校验 v2版本 - */ - public interface V2 { - } - - /** - * 分组校验 v3版本 - */ - public interface V3 { - } - - @Override - public void validate(Validator validator) { - ValidationUtils.validate(validator, this, - API_VERSION_V2.equals(this.getApiVersion()) ? V2.class : V3.class); - } - - public static void main(String[] args) throws FileNotFoundException { - String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.p12"; - /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_key.pem"; - /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"; - System.out.println(IoUtil.readUtf8(new FileInputStream(path))); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java deleted file mode 100644 index 0c4e98fe..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.exception.WxPayException; -import lombok.extern.slf4j.Slf4j; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.invalidParamException; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; - -/** - * 微信支付(公众号)的 PayClient 实现类 - * - * 文档:JSAPI 下单 - * - * @author 芋道源码 - */ -@Slf4j -public class WxPubPayClient extends AbstractWxPayClient { - - public WxPubPayClient(Long channelId, WxPayClientConfig config) { - super(channelId, PayChannelEnum.WX_PUB.getCode(), config); - } - - protected WxPubPayClient(Long channelId, String channelCode, WxPayClientConfig config) { - super(channelId, channelCode, config); - } - - @Override - protected void doInit() { - super.doInit(WxPayConstants.TradeType.JSAPI); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 构建 WxPayUnifiedOrderRequest 对象 - WxPayUnifiedOrderRequest request = buildPayUnifiedOrderRequestV2(reqDTO) - .setOpenid(getOpenid(reqDTO)); - // 执行请求 - WxPayMpOrderResult response = client.createOrder(request); - - // 转换结果 - return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response), - reqDTO.getOutTradeNo(), response); - } - - @Override - protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { - // 构建 WxPayUnifiedOrderRequest 对象 - WxPayUnifiedOrderV3Request request = buildPayUnifiedOrderRequestV3(reqDTO) - .setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(getOpenid(reqDTO))); - // 执行请求 - WxPayUnifiedOrderV3Result.JsapiResult response = client.createOrderV3(TradeTypeEnum.JSAPI, request); - - // 转换结果 - return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response), - reqDTO.getOutTradeNo(), response); - } - - // ========== 各种工具方法 ========== - - static String getOpenid(PayOrderUnifiedReqDTO reqDTO) { - String openid = MapUtil.getStr(reqDTO.getChannelExtras(), "openid"); - if (StrUtil.isEmpty(openid)) { - throw invalidParamException("支付请求的 openid 不能为空!"); - } - return openid; - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java deleted file mode 100644 index 758fdb56..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.win.framework.pay.core.enums.channel; - -import cn.hutool.core.util.ArrayUtil; -import com.win.framework.pay.core.client.impl.NonePayClientConfig; -import com.win.framework.pay.core.client.PayClientConfig; -import com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; -import com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 支付渠道的编码的枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayChannelEnum { - - WX_PUB("wx_pub", "微信 JSAPI 支付", WxPayClientConfig.class), // 公众号网页 - WX_LITE("wx_lite", "微信小程序支付", WxPayClientConfig.class), - WX_APP("wx_app", "微信 App 支付", WxPayClientConfig.class), - WX_NATIVE("wx_native", "微信 Native 支付", WxPayClientConfig.class), - WX_BAR("wx_bar", "微信付款码支付", WxPayClientConfig.class), - - ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付", AlipayPayClientConfig.class), - ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付", AlipayPayClientConfig.class), - ALIPAY_APP("alipay_app", "支付宝App 支付", AlipayPayClientConfig.class), - ALIPAY_QR("alipay_qr", "支付宝扫码支付", AlipayPayClientConfig.class), - ALIPAY_BAR("alipay_bar", "支付宝条码支付", AlipayPayClientConfig.class), - - MOCK("mock", "模拟支付", NonePayClientConfig.class), - - WALLET("wallet", "钱包支付", NonePayClientConfig.class); - - /** - * 编码 - * - * 参考 支付渠道属性值 - */ - private final String code; - /** - * 名字 - */ - private final String name; - - /** - * 配置类 - */ - private final Class configClass; - - /** - * 微信支付 - */ - public static final String WECHAT = "WECHAT"; - - /** - * 支付宝支付 - */ - public static final String ALIPAY = "ALIPAY"; - - public static PayChannelEnum getByCode(String code) { - return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values()); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java deleted file mode 100644 index 47e2112a..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.framework.pay.core.enums.order; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 支付 UI 展示模式 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayOrderDisplayModeEnum { - - URL("url"), // Redirect 跳转链接的方式 - IFRAME("iframe"), // IFrame 内嵌链接的方式【目前暂时用不到】 - FORM("form"), // HTML 表单提交 - QR_CODE("qr_code"), // 二维码的文字内容 - QR_CODE_URL("qr_code_url"), // 二维码的图片链接 - BAR_CODE("bar_code"), // 条形码 - APP("app"), // 应用:Android、iOS、微信小程序、微信公众号等,需要做自定义处理的 - ; - - /** - * 展示模式 - */ - private final String mode; - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java deleted file mode 100644 index 4ed2cefc..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.framework.pay.core.enums.order; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 渠道的支付状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayOrderStatusRespEnum { - - WAITING(0, "未支付"), - SUCCESS(10, "支付成功"), - REFUND(20, "已退款"), - CLOSED(30, "支付关闭"), - ; - - private final Integer status; - private final String name; - - /** - * 判断是否支付成功 - * - * @param status 状态 - * @return 是否支付成功 - */ - public static boolean isSuccess(Integer status) { - return Objects.equals(status, SUCCESS.getStatus()); - } - - /** - * 判断是否已退款 - * - * @param status 状态 - * @return 是否支付成功 - */ - public static boolean isRefund(Integer status) { - return Objects.equals(status, REFUND.getStatus()); - } - - /** - * 判断是否支付关闭 - * - * @param status 状态 - * @return 是否支付关闭 - */ - public static boolean isClosed(Integer status) { - return Objects.equals(status, CLOSED.getStatus()); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java deleted file mode 100644 index 4844b7d3..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.framework.pay.core.enums.refund; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 渠道的退款状态枚举 - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum PayRefundStatusRespEnum { - - WAITING(0, "等待退款"), - SUCCESS(10, "退款成功"), - FAILURE(20, "退款失败"); - - private final Integer status; - private final String name; - - public static boolean isSuccess(Integer status) { - return Objects.equals(status, SUCCESS.getStatus()); - } - - public static boolean isFailure(Integer status) { - return Objects.equals(status, FAILURE.getStatus()); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 5dcd61e3..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -com.win.framework.pay.config.WinPayAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java deleted file mode 100644 index 4bf6dca3..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.win.framework.pay.core.client.impl; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.RandomUtil; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; -import com.win.framework.pay.core.client.impl.alipay.AlipayQrPayClient; -import com.win.framework.pay.core.client.impl.alipay.AlipayWapPayClient; -import com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig; -import com.win.framework.pay.core.client.impl.weixin.WxPubPayClient; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; - -/** - * {@link PayClientFactoryImpl} 的集成测试 - * - * @author 芋道源码 - */ -@Disabled -public class PayClientFactoryImplIntegrationTest { - - private static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do"; - - private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl(); - - /** - * {@link WxPubPayClient} 的 V2 版本 - */ - @Test - public void testCreatePayClient_WX_PUB_V2() { - // 创建配置 - WxPayClientConfig config = new WxPayClientConfig(); - config.setAppId("wx041349c6f39b268b"); - config.setMchId("1545083881"); - config.setApiVersion(WxPayClientConfig.API_VERSION_V2); - config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p"); - // 创建客户端 - Long channelId = RandomUtil.randomLong(); - payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config); - PayClient client = payClientFactory.getPayClient(channelId); - // 发起支付 - PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); -// CommonResult result = client.unifiedOrder(reqDTO); -// System.out.println(result); - } - - /** - * {@link WxPubPayClient} 的 V3 版本 - */ - @Test - public void testCreatePayClient_WX_PUB_V3() throws FileNotFoundException { - // 创建配置 - WxPayClientConfig config = new WxPayClientConfig(); - config.setAppId("wx041349c6f39b268b"); - config.setMchId("1545083881"); - config.setApiVersion(WxPayClientConfig.API_VERSION_V3); - config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem"))); - config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"))); - config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"); - // 创建客户端 - Long channelId = RandomUtil.randomLong(); - payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config); - PayClient client = payClientFactory.getPayClient(channelId); - // 发起支付 - PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); -// CommonResult result = client.unifiedOrder(reqDTO); -// System.out.println(result); - } - - /** - * {@link AlipayQrPayClient} - */ - @Test - @SuppressWarnings("unchecked") - public void testCreatePayClient_ALIPAY_QR() { - // 创建配置 - AlipayPayClientConfig config = new AlipayPayClientConfig(); - config.setAppId("2021000118634035"); - config.setServerUrl(SERVER_URL_SANDBOX); - config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); - config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); - config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); - // 创建客户端 - Long channelId = RandomUtil.randomLong(); - payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config); - PayClient client = payClientFactory.getPayClient(channelId); - // 发起支付 - PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); - reqDTO.setNotifyUrl("http://yunai.natapp1.cc/admin-api/pay/notify/callback/18"); // TODO @tina: 这里改成你的 natapp 回调地址 -// CommonResult result = (CommonResult) client.unifiedOrder(reqDTO); -// System.out.println(JsonUtils.toJsonString(result)); -// System.out.println(result.getData().getQrCode()); - } - - /** - * {@link AlipayWapPayClient} - */ - @Test - public void testCreatePayClient_ALIPAY_WAP() { - // 创建配置 - AlipayPayClientConfig config = new AlipayPayClientConfig(); - config.setAppId("2021000118634035"); - config.setServerUrl(SERVER_URL_SANDBOX); - config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); - config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); - config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); - // 创建客户端 - Long channelId = RandomUtil.randomLong(); - payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config); - PayClient client = payClientFactory.getPayClient(channelId); - // 发起支付 - PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); -// CommonResult result = client.unifiedOrder(reqDTO); -// System.out.println(JsonUtils.toJsonString(result)); - } - - private static PayOrderUnifiedReqDTO buildPayOrderUnifiedReqDTO() { - PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO(); - reqDTO.setPrice(123); - reqDTO.setSubject("IPhone 13"); - reqDTO.setBody("biubiubiu"); - reqDTO.setOutTradeNo(String.valueOf(System.currentTimeMillis())); - reqDTO.setUserIp("127.0.0.1"); - reqDTO.setNotifyUrl("http://127.0.0.1:8080"); - return reqDTO; - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java deleted file mode 100644 index e46a38ab..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.exception.ServiceException; -import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; -import com.win.framework.common.exception.util.ServiceExceptionUtil; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.client.exception.PayException; -import com.win.framework.pay.core.enums.refund.PayRefundStatusRespEnum; -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.alipay.api.AlipayApiException; -import com.alipay.api.DefaultAlipayClient; -import com.alipay.api.DefaultSigner; -import com.alipay.api.domain.AlipayTradeRefundModel; -import com.alipay.api.request.AlipayTradeRefundRequest; -import com.alipay.api.response.AlipayTradeRefundResponse; -import lombok.Setter; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.Mock; - -import javax.validation.ConstraintViolationException; -import java.util.Date; - -import static com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig.MODE_PUBLIC_KEY; -import static com.win.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.when; - -/** - * 支付宝 Client 的测试基类 - * - * @author jason - */ -public abstract class AbstractAlipayClientTest extends BaseMockitoUnitTest { - - protected AlipayPayClientConfig config = randomPojo(AlipayPayClientConfig.class, o -> { - o.setServerUrl(randomURL()); - o.setPrivateKey(randomString()); - o.setMode(MODE_PUBLIC_KEY); - o.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); - o.setAppCertContent(""); - o.setAlipayPublicCertContent(""); - o.setRootCertContent(""); - }); - - @Mock - protected DefaultAlipayClient defaultAlipayClient; - - @Setter - private AbstractAlipayPayClient client; - - /** - * 子类需要实现该方法. 设置 client 的具体实现 - */ - @BeforeEach - public abstract void setUp(); - - @Test - @DisplayName("支付宝 Client 初始化") - public void testDoInit() { - // 调用 - client.doInit(); - // 断言 - DefaultAlipayClient realClient = client.getClient(); - assertNotSame(defaultAlipayClient, realClient); - assertInstanceOf(DefaultSigner.class, realClient.getSigner()); - assertEquals(config.getPrivateKey(), ((DefaultSigner) realClient.getSigner()).getPrivateKey()); - } - - @Test - @DisplayName("支付宝 Client 统一退款:成功") - public void testUnifiedRefund_success() throws AlipayApiException { - // mock 方法 - String notifyUrl = randomURL(); - Date refundTime = randomDate(); - String outRefundNo = randomString(); - String outTradeNo = randomString(); - Integer refundAmount = randomInteger(); - AlipayTradeRefundResponse response = randomPojo(AlipayTradeRefundResponse.class, o -> { - o.setSubCode(""); - o.setGmtRefundPay(refundTime); - }); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertInstanceOf(AlipayTradeRefundModel.class, request.getBizModel()); - AlipayTradeRefundModel bizModel = (AlipayTradeRefundModel) request.getBizModel(); - assertEquals(outRefundNo, bizModel.getOutRequestNo()); - assertEquals(outTradeNo, bizModel.getOutTradeNo()); - assertEquals(String.valueOf(refundAmount / 100.0), bizModel.getRefundAmount()); - return true; - }))).thenReturn(response); - // 准备请求参数 - PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> { - o.setOutRefundNo(outRefundNo); - o.setOutTradeNo(outTradeNo); - o.setNotifyUrl(notifyUrl); - o.setRefundPrice(refundAmount); - }); - - // 调用 - PayRefundRespDTO resp = client.unifiedRefund(refundReqDTO); - // 断言 - assertEquals(PayRefundStatusRespEnum.SUCCESS.getStatus(), resp.getStatus()); - assertEquals(outRefundNo, resp.getOutRefundNo()); - assertNull(resp.getChannelRefundNo()); - assertEquals(LocalDateTimeUtil.of(refundTime), resp.getSuccessTime()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝 Client 统一退款:渠道返回失败") - public void test_unified_refund_channel_failed() throws AlipayApiException { - // mock 方法 - String notifyUrl = randomURL(); - String subCode = randomString(); - String subMsg = randomString(); - AlipayTradeRefundResponse response = randomPojo(AlipayTradeRefundResponse.class, o -> { - o.setSubCode(subCode); - o.setSubMsg(subMsg); - }); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertInstanceOf(AlipayTradeRefundModel.class, request.getBizModel()); - return true; - }))).thenReturn(response); - // 准备请求参数 - String outRefundNo = randomString(); - String outTradeNo = randomString(); - PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> { - o.setOutRefundNo(outRefundNo); - o.setOutTradeNo(outTradeNo); - o.setNotifyUrl(notifyUrl); - }); - - // 调用 - PayRefundRespDTO resp = client.unifiedRefund(refundReqDTO); - // 断言 - assertEquals(PayRefundStatusRespEnum.FAILURE.getStatus(), resp.getStatus()); - assertEquals(outRefundNo, resp.getOutRefundNo()); - assertNull(resp.getChannelRefundNo()); - assertNull(resp.getSuccessTime()); - assertSame(response, resp.getRawData()); - assertEquals(subCode, resp.getChannelErrorCode()); - assertEquals(subMsg, resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝 Client 统一退款:参数校验不通过") - public void testUnifiedRefund_paramInvalidate() { - // 准备请求参数 - String notifyUrl = randomURL(); - PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> { - o.setOutTradeNo(""); - o.setNotifyUrl(notifyUrl); - }); - - // 调用,并断言 - assertThrows(ConstraintViolationException.class, () -> client.unifiedRefund(refundReqDTO)); - } - - @Test - @DisplayName("支付宝 Client 统一退款:抛出业务异常") - public void testUnifiedRefund_throwServiceException() throws AlipayApiException { - // mock 方法 - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true))) - .thenThrow(ServiceExceptionUtil.exception(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR)); - // 准备请求参数 - String notifyUrl = randomURL(); - PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> o.setNotifyUrl(notifyUrl)); - - // 调用,并断言 - assertThrows(ServiceException.class, () -> client.unifiedRefund(refundReqDTO)); - } - - @Test - @DisplayName("支付宝 Client 统一退款:抛出系统异常") - public void testUnifiedRefund_throwPayException() throws AlipayApiException { - // mock 方法 - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true))) - .thenThrow(new RuntimeException("系统异常")); - // 准备请求参数 - String notifyUrl = randomURL(); - PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> o.setNotifyUrl(notifyUrl)); - - // 调用,并断言 - assertThrows(PayException.class, () -> client.unifiedRefund(refundReqDTO)); - } - - @Test - @DisplayName("支付宝 Client 统一下单:参数校验不通过") - public void testUnifiedOrder_paramInvalidate() { - // 准备请求参数 - String outTradeNo = randomString(); - String notifyUrl = randomURL(); - PayOrderUnifiedReqDTO reqDTO = randomPojo(PayOrderUnifiedReqDTO.class, o -> { - o.setOutTradeNo(outTradeNo); - o.setNotifyUrl(notifyUrl); - }); - - // 调用,并断言 - assertThrows(ConstraintViolationException.class, () -> client.unifiedOrder(reqDTO)); - } - - protected PayOrderUnifiedReqDTO buildOrderUnifiedReqDTO(String notifyUrl, String outTradeNo, Integer price) { - return randomPojo(PayOrderUnifiedReqDTO.class, o -> { - o.setOutTradeNo(outTradeNo); - o.setNotifyUrl(notifyUrl); - o.setPrice(price); - o.setSubject(RandomUtil.randomString(32)); - o.setBody(RandomUtil.randomString(32)); - }); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java deleted file mode 100644 index bf1dc885..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.core.date.LocalDateTimeUtil; -import com.win.framework.common.exception.ServiceException; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradePayModel; -import com.alipay.api.request.AlipayTradePayRequest; -import com.alipay.api.response.AlipayTradePayResponse; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.InjectMocks; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED; -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING; -import static com.win.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.when; - -/** - * {@link AlipayBarPayClient} 单元测试 - * - * @author jason - */ -public class AlipayBarPayClientTest extends AbstractAlipayClientTest { - - @InjectMocks - private AlipayBarPayClient client = new AlipayBarPayClient(randomLongId(), config); - - @Override - @BeforeEach - public void setUp() { - setClient(client); - } - - @Test - @DisplayName("支付宝条码支付:非免密码支付下单成功") - public void testUnifiedOrder_success() throws AlipayApiException { - // mock 方法 - String outTradeNo = randomString(); - String notifyUrl = randomURL(); - Integer price = randomInteger(); - String authCode = randomString(); - AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> o.setSubCode("")); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertInstanceOf(AlipayTradePayModel.class, request.getBizModel()); - assertEquals(notifyUrl, request.getNotifyUrl()); - AlipayTradePayModel model = (AlipayTradePayModel) request.getBizModel(); - assertEquals(outTradeNo, model.getOutTradeNo()); - assertEquals(String.valueOf(price / 100.0), model.getTotalAmount()); - assertEquals(authCode, model.getAuthCode()); - return true; - }))).thenReturn(response); - // 准备请求参数 - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - Map extraParam = new HashMap<>(); - extraParam.put("auth_code", authCode); - reqDTO.setChannelExtras(extraParam); - - // 调用方法 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(WAITING.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertEquals(PayOrderDisplayModeEnum.BAR_CODE.getMode(), resp.getDisplayMode()); - assertEquals("", resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝条码支付:免密码支付下单成功") - public void testUnifiedOrder_code10000Success() throws AlipayApiException { - // mock 方法 - String outTradeNo = randomString(); - String channelNo = randomString(); - String channelUserId = randomString(); - Date payTime = randomDate(); - AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> { - o.setSubCode(""); - o.setCode("10000"); - o.setOutTradeNo(outTradeNo); - o.setTradeNo(channelNo); - o.setBuyerUserId(channelUserId); - o.setGmtPayment(payTime); - }); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true))) - .thenReturn(response); - // 准备请求参数 - String authCode = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger()); - Map extraParam = new HashMap<>(); - extraParam.put("auth_code", authCode); - reqDTO.setChannelExtras(extraParam); - - // 下单请求 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(PayOrderStatusRespEnum.SUCCESS.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertEquals(channelNo, resp.getChannelOrderNo()); - assertEquals(channelUserId, resp.getChannelUserId()); - assertEquals(LocalDateTimeUtil.of(payTime), resp.getSuccessTime()); - assertEquals(PayOrderDisplayModeEnum.BAR_CODE.getMode(), resp.getDisplayMode()); - assertEquals("", resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝条码支付:没有传条码") - public void testUnifiedOrder_emptyAuthCode() { - // 准备参数 - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), randomString(), randomInteger()); - - // 调用,并断言 - assertThrows(ServiceException.class, () -> client.unifiedOrder(reqDTO)); - } - - @Test - @DisplayName("支付宝条码支付:渠道返回失败") - public void test_unified_order_channel_failed() throws AlipayApiException { - // mock 方法 - String subCode = randomString(); - String subMsg = randomString(); - AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> { - o.setSubCode(subCode); - o.setSubMsg(subMsg); - }); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true))) - .thenReturn(response); - // 准备请求参数 - String authCode = randomString(); - String outTradeNo = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger()); - Map extraParam = new HashMap<>(); - extraParam.put("auth_code", authCode); - reqDTO.setChannelExtras(extraParam); - - // 调用方法 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(CLOSED.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertNull(resp.getDisplayMode()); - assertNull(resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertEquals(subCode, resp.getChannelErrorCode()); - assertEquals(subMsg, resp.getChannelErrorMsg()); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java deleted file mode 100644 index b6d02d38..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.http.Method; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.request.AlipayTradePagePayRequest; -import com.alipay.api.response.AlipayTradePagePayResponse; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.InjectMocks; - -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED; -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING; -import static com.win.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link AlipayPcPayClient} 单元测试 - * - * @author jason - */ -public class AlipayPcPayClientTest extends AbstractAlipayClientTest { - - @InjectMocks - private AlipayPcPayClient client = new AlipayPcPayClient(randomLongId(), config); - - @Override - @BeforeEach - public void setUp() { - setClient(client); - } - - @Test - @DisplayName("支付宝 PC 网站支付:URL Display Mode 下单成功") - public void testUnifiedOrder_urlSuccess() throws AlipayApiException { - // mock 方法 - String notifyUrl = randomURL(); - AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> o.setSubCode("")); - when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true), - eq(Method.GET.name()))).thenReturn(response); - // 准备请求参数 - String outTradeNo = randomString(); - Integer price = randomInteger(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - reqDTO.setDisplayMode(null); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(WAITING.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertEquals(PayOrderDisplayModeEnum.URL.getMode(), resp.getDisplayMode()); - assertEquals(response.getBody(), resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝 PC 网站支付:Form Display Mode 下单成功") - public void testUnifiedOrder_formSuccess() throws AlipayApiException { - // mock 方法 - String notifyUrl = randomURL(); - AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> o.setSubCode("")); - when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true), - eq(Method.POST.name()))).thenReturn(response); - // 准备请求参数 - String outTradeNo = randomString(); - Integer price = randomInteger(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - reqDTO.setDisplayMode(PayOrderDisplayModeEnum.FORM.getMode()); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(WAITING.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertEquals(PayOrderDisplayModeEnum.FORM.getMode(), resp.getDisplayMode()); - assertEquals(response.getBody(), resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝 PC 网站支付:渠道返回失败") - public void testUnifiedOrder_channelFailed() throws AlipayApiException { - // mock 方法 - String subCode = randomString(); - String subMsg = randomString(); - AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> { - o.setSubCode(subCode); - o.setSubMsg(subMsg); - }); - when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true), - eq(Method.GET.name()))).thenReturn(response); - // 准备请求参数 - String outTradeNo = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger()); - reqDTO.setDisplayMode(PayOrderDisplayModeEnum.URL.getMode()); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(CLOSED.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertNull(resp.getDisplayMode()); - assertNull(resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertEquals(subCode, resp.getChannelErrorCode()); - assertEquals(subMsg, resp.getChannelErrorMsg()); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java deleted file mode 100644 index cf6cd303..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import com.win.framework.common.exception.ServiceException; -import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; -import com.win.framework.common.exception.util.ServiceExceptionUtil; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.exception.PayException; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.request.AlipayTradePrecreateRequest; -import com.alipay.api.response.AlipayTradePrecreateResponse; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.InjectMocks; - -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED; -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING; -import static com.win.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.when; - -/** - * {@link AlipayQrPayClient} 单元测试 - * - * @author jason - */ -public class AlipayQrPayClientTest extends AbstractAlipayClientTest { - - @InjectMocks - private AlipayQrPayClient client = new AlipayQrPayClient(randomLongId(), config); - - @BeforeEach - public void setUp() { - setClient(client); - } - - @Test - @DisplayName("支付宝扫描支付:下单成功") - public void testUnifiedOrder_success() throws AlipayApiException { - // mock 方法 - String notifyUrl = randomURL(); - String qrCode = randomString(); - Integer price = randomInteger(); - AlipayTradePrecreateResponse response = randomPojo(AlipayTradePrecreateResponse.class, o -> { - o.setQrCode(qrCode); - o.setSubCode(""); - }); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertEquals(notifyUrl, request.getNotifyUrl()); - return true; - }))).thenReturn(response); - // 准备请求参数 - String outTradeNo = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(WAITING.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertEquals(PayOrderDisplayModeEnum.QR_CODE.getMode(), resp.getDisplayMode()); - assertEquals(response.getQrCode(), resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝扫描支付:渠道返回失败") - public void testUnifiedOrder_channelFailed() throws AlipayApiException { - // mock 方法 - String notifyUrl = randomURL(); - String subCode = randomString(); - String subMsg = randomString(); - Integer price = randomInteger(); - AlipayTradePrecreateResponse response = randomPojo(AlipayTradePrecreateResponse.class, o -> { - o.setSubCode(subCode); - o.setSubMsg(subMsg); - }); - // mock - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertEquals(notifyUrl, request.getNotifyUrl()); - return true; - }))).thenReturn(response); - // 准备请求参数 - String outTradeNo = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(CLOSED.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertNull(resp.getDisplayMode()); - assertNull(resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertEquals(subCode, resp.getChannelErrorCode()); - assertEquals(subMsg, resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝扫描支付, 抛出系统异常") - public void testUnifiedOrder_throwPayException() throws AlipayApiException { - // mock 方法 - String outTradeNo = randomString(); - String notifyUrl = randomURL(); - Integer price = randomInteger(); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertEquals(notifyUrl, request.getNotifyUrl()); - return true; - }))).thenThrow(new RuntimeException("系统异常")); - // 准备请求参数 - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo,price); - - // 调用,并断言 - assertThrows(PayException.class, () -> client.unifiedOrder(reqDTO)); - } - - @Test - @DisplayName("支付宝 Client 统一下单:抛出业务异常") - public void testUnifiedOrder_throwServiceException() throws AlipayApiException { - // mock 方法 - String outTradeNo = randomString(); - String notifyUrl = randomURL(); - Integer price = randomInteger(); - when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> { - assertEquals(notifyUrl, request.getNotifyUrl()); - return true; - }))).thenThrow(ServiceExceptionUtil.exception(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR)); - // 准备请求参数 - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - - // 调用,并断言 - assertThrows(ServiceException.class, () -> client.unifiedOrder(reqDTO)); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java deleted file mode 100644 index 86855776..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.win.framework.pay.core.client.impl.alipay; - -import cn.hutool.http.Method; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradeWapPayModel; -import com.alipay.api.request.AlipayTradeWapPayRequest; -import com.alipay.api.response.AlipayTradeWapPayResponse; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.InjectMocks; - -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED; -import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING; -import static com.win.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link AlipayWapPayClient} 单元测试 - * - * @author jason - */ -public class AlipayWapPayClientTest extends AbstractAlipayClientTest { - - /** - * 支付宝 H5 支付 Client - */ - @InjectMocks - private AlipayWapPayClient client = new AlipayWapPayClient(randomLongId(), config); - - @BeforeEach - public void setUp() { - setClient(client); - } - - @Test - @DisplayName("支付宝 H5 支付:下单成功") - public void testUnifiedOrder_success() throws AlipayApiException { - // mock 方法 - String h5Body = randomString(); - Integer price = randomInteger(); - AlipayTradeWapPayResponse response = randomPojo(AlipayTradeWapPayResponse.class, o -> { - o.setSubCode(""); - o.setBody(h5Body); - }); - String notifyUrl = randomURL(); - when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> { - assertInstanceOf(AlipayTradeWapPayModel.class, request.getBizModel()); - AlipayTradeWapPayModel bizModel = (AlipayTradeWapPayModel) request.getBizModel(); - assertEquals(String.valueOf(price / 100.0), bizModel.getTotalAmount()); - assertEquals(notifyUrl, request.getNotifyUrl()); - return true; - }), eq(Method.GET.name()))).thenReturn(response); - // 准备请求参数 - String outTradeNo = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(WAITING.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertEquals(PayOrderDisplayModeEnum.URL.getMode(), resp.getDisplayMode()); - assertEquals(response.getBody(), resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertNull(resp.getChannelErrorCode()); - assertNull(resp.getChannelErrorMsg()); - } - - @Test - @DisplayName("支付宝 H5 支付:渠道返回失败") - public void test_unified_order_channel_failed() throws AlipayApiException { - // mock 方法 - String subCode = randomString(); - String subMsg = randomString(); - AlipayTradeWapPayResponse response = randomPojo(AlipayTradeWapPayResponse.class, o -> { - o.setSubCode(subCode); - o.setSubMsg(subMsg); - }); - when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true), - eq(Method.GET.name()))).thenReturn(response); - String outTradeNo = randomString(); - PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger()); - - // 调用 - PayOrderRespDTO resp = client.unifiedOrder(reqDTO); - // 断言 - assertEquals(CLOSED.getStatus(), resp.getStatus()); - assertEquals(outTradeNo, resp.getOutTradeNo()); - assertNull(resp.getChannelOrderNo()); - assertNull(resp.getChannelUserId()); - assertNull(resp.getSuccessTime()); - assertNull(resp.getDisplayMode()); - assertNull(resp.getDisplayContent()); - assertSame(response, resp.getRawData()); - assertEquals(subCode, resp.getChannelErrorCode()); - assertEquals(subMsg, resp.getChannelErrorMsg()); - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java deleted file mode 100644 index 40f3263f..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.framework.common.util.json.JsonUtils; -import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult; -import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest; -import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; -import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult; -import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; -import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; -import com.github.binarywang.wxpay.config.WxPayConfig; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.time.Duration; - -import static com.win.framework.pay.core.client.impl.weixin.AbstractWxPayClient.formatDateV2; - -/** - * {@link WxBarPayClient} 的集成测试,用于快速调试微信条码支付 - * - * @author 芋道源码 - */ -@Disabled -public class WxBarPayClientIntegrationTest { - - @Test - public void testPayV2() throws WxPayException { - // 创建 config 配置 - WxPayConfig config = buildWxPayConfigV2(); - // 创建 WxPayService 客户端 - WxPayService client = new WxPayServiceImpl(); - client.setConfig(config); - - // 执行发起支付 - WxPayMicropayRequest request = WxPayMicropayRequest.newBuilder() - .outTradeNo(String.valueOf(System.currentTimeMillis())) - .body("测试支付-body") - .detail("测试支付-detail") - .totalFee(1) // 单位分 - .timeExpire(formatDateV2(LocalDateTimeUtils.addTime(Duration.ofMinutes(2)))) - .spbillCreateIp("127.0.0.1") - .authCode("134298744426278497") - .build(); - System.out.println("========= request =========="); - System.out.println(JsonUtils.toJsonPrettyString(request)); - WxPayMicropayResult response = client.micropay(request); - System.out.println("========= response =========="); - System.out.println(JsonUtils.toJsonPrettyString(response)); - } - - @Test - public void testParseRefundNotifyV2() throws WxPayException { - // 创建 config 配置 - WxPayConfig config = buildWxPayConfigV2(); - // 创建 WxPayService 客户端 - WxPayService client = new WxPayServiceImpl(); - client.setConfig(config); - - // 执行解析 - String xml = "SUCCESS"; - WxPayRefundNotifyResult response = client.parseRefundNotifyResult(xml); - System.out.println(response.getReqInfo()); - } - - @Test - public void testRefundV2() throws WxPayException { - // 创建 config 配置 - WxPayConfig config = buildWxPayConfigV2(); - // 创建 WxPayService 客户端 - WxPayService client = new WxPayServiceImpl(); - client.setConfig(config); - - // 执行发起退款 - WxPayRefundRequest request = new WxPayRefundRequest() - .setOutTradeNo("1689545667276") - .setOutRefundNo(String.valueOf(System.currentTimeMillis())) - .setRefundFee(1) - .setRefundDesc("就是想退了") - .setTotalFee(1); - System.out.println("========= request =========="); - System.out.println(JsonUtils.toJsonPrettyString(request)); - WxPayRefundResult response = client.refund(request); - System.out.println("========= response =========="); - System.out.println(JsonUtils.toJsonPrettyString(response)); - } - - @Test - public void testRefundV3() throws WxPayException { - // 创建 config 配置 - WxPayConfig config = buildWxPayConfigV2(); - // 创建 WxPayService 客户端 - WxPayService client = new WxPayServiceImpl(); - client.setConfig(config); - - // 执行发起退款 - WxPayRefundV3Request request = new WxPayRefundV3Request() - .setOutTradeNo("1689506325635") - .setOutRefundNo(String.valueOf(System.currentTimeMillis())) - .setAmount(new WxPayRefundV3Request.Amount().setTotal(1).setRefund(1).setCurrency("CNY")) - .setReason("就是想退了"); - System.out.println("========= request =========="); - System.out.println(JsonUtils.toJsonPrettyString(request)); - WxPayRefundV3Result response = client.refundV3(request); - System.out.println("========= response =========="); - System.out.println(JsonUtils.toJsonPrettyString(response)); - } - - private WxPayConfig buildWxPayConfigV2() { - WxPayConfig config = new WxPayConfig(); - config.setAppId("wx62056c0d5e8db250"); - config.setMchId("1545083881"); - config.setMchKey("dS1ngeN63JLr3NRbvPH9AJy3MyUxZdim"); -// config.setSignType(WxPayConstants.SignType.MD5); - config.setKeyPath("/Users/yunai/Downloads/wx_pay/apiclient_cert.p12"); - return config; - } - -} diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java deleted file mode 100644 index e9354905..00000000 --- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.win.framework.pay.core.client.impl.weixin; - -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.framework.common.util.json.JsonUtils; -import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.config.WxPayConfig; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.time.Duration; - -import static com.win.framework.pay.core.client.impl.weixin.AbstractWxPayClient.formatDateV3; - -/** - * {@link WxNativePayClient} 的集成测试,用于快速调试微信扫码支付 - * - * @author 芋道源码 - */ -@Disabled -public class WxNativePayClientIntegrationTest { - - @Test - public void testPayV3() throws WxPayException { - // 创建 config 配置 - WxPayConfig config = buildWxPayConfigV3(); - // 创建 WxPayService 客户端 - WxPayService client = new WxPayServiceImpl(); - client.setConfig(config); - - // 执行发起支付 - WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request() - .setOutTradeNo(String.valueOf(System.currentTimeMillis())) - .setDescription("测试支付-body") - .setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(1)) // 单位分 - .setTimeExpire(formatDateV3(LocalDateTimeUtils.addTime(Duration.ofMinutes(2)))) - .setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp("127.0.0.1")) - .setNotifyUrl("http://127.0.0.1:48080"); - System.out.println("========= request =========="); - System.out.println(JsonUtils.toJsonPrettyString(request)); - String response = client.createOrderV3(TradeTypeEnum.NATIVE, request); - System.out.println("========= response =========="); - System.out.println(JsonUtils.toJsonPrettyString(response)); - } - - @Test - public void testRefundV3() throws WxPayException { - // 创建 config 配置 - WxPayConfig config = buildWxPayConfigV3(); - // 创建 WxPayService 客户端 - WxPayService client = new WxPayServiceImpl(); - client.setConfig(config); - - // 执行发起退款 - WxPayRefundV3Request request = new WxPayRefundV3Request() - .setOutTradeNo("1689545729695") - .setOutRefundNo(String.valueOf(System.currentTimeMillis())) - .setAmount(new WxPayRefundV3Request.Amount().setTotal(1).setRefund(1).setCurrency("CNY")) - .setReason("就是想退了"); - System.out.println("========= request =========="); - System.out.println(JsonUtils.toJsonPrettyString(request)); - WxPayRefundV3Result response = client.refundV3(request); - System.out.println("========= response =========="); - System.out.println(JsonUtils.toJsonPrettyString(response)); - } - - private WxPayConfig buildWxPayConfigV3() { - WxPayConfig config = new WxPayConfig(); - config.setAppId("wx62056c0d5e8db250"); - config.setMchId("1545083881"); - config.setApiV3Key("459arNsYHl1mgkiO6H9ZH5KkhFXSxaA4"); -// config.setCertSerialNo(serialNo); - config.setPrivateCertPath("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"); - config.setPrivateKeyPath("/Users/yunai/Downloads/wx_pay/apiclient_key.pem"); - return config; - } - -} diff --git a/win-module-mall/pom.xml b/win-module-mall/pom.xml deleted file mode 100644 index 9e213d44..00000000 --- a/win-module-mall/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - win - com.win - ${revision} - - 4.0.0 - - win-module-mall - pom - - ${project.artifactId} - - - 商城大模块,由 product 商品、promotion 营销、trade 交易等组成 - - - win-module-promotion-api - win-module-promotion-biz - win-module-product-api - win-module-product-biz - win-module-trade-api - win-module-trade-biz - - - diff --git a/win-module-mall/win-module-product-api/pom.xml b/win-module-mall/win-module-product-api/pom.xml deleted file mode 100644 index 63b530c6..00000000 --- a/win-module-mall/win-module-product-api/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 4.0.0 - - com.win - win-module-mall - ${revision} - - - win-module-product-api - jar - - ${project.artifactId} - - product 模块 API,暴露给其它模块调用 - - - - - com.win - win-common - - - - - org.springframework.boot - spring-boot-starter-validation - true - - - - diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java deleted file mode 100644 index 88459315..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.product.api.comment; - -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; - -/** - * 产品评论 API 接口 - * - * @author HUIHUI - */ -public interface ProductCommentApi { - - /** - * 创建评论 - * - * @param createReqDTO 评论参数 - * @return 返回评论创建后的 id - */ - Long createComment(ProductCommentCreateReqDTO createReqDTO); - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java deleted file mode 100644 index 127edfeb..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.module.product.api.comment.dto; - -import lombok.Data; - -import java.util.List; - -/** - * 评论创建请求 DTO - * - * @author HUIHUI - */ -@Data -public class ProductCommentCreateReqDTO { - - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 订单编号 - */ - private Long orderId; - /** - * 交易订单项编号 - */ - private Long orderItemId; - - /** - * 评分星级 1-5 分 - */ - private Integer scores; - /** - * 描述星级 1-5 分 - */ - private Integer descriptionScores; - /** - * 服务星级 1-5 分 - */ - private Integer benefitScores; - /** - * 评论内容 - */ - private String content; - /** - * 评论图片地址数组,以逗号分隔最多上传 9 张 - */ - private List picUrls; - - /** - * 是否匿名 - */ - private Boolean anonymous; - /** - * 评价人 - */ - private Long userId; - - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java deleted file mode 100644 index fb9263d1..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package com.win.module.product.api; \ No newline at end of file diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java deleted file mode 100644 index d1d77dd0..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.product.api.property; - -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; - -import java.util.Collection; -import java.util.List; - -/** - * 商品属性值 API 接口 - * - * @author 芋道源码 - */ -public interface ProductPropertyValueApi { - - /** - * 根据编号数组,获得属性值列表 - * - * @param ids 编号数组 - * @return 属性值明细列表 - */ - List getPropertyValueDetailList(Collection ids); - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java deleted file mode 100644 index 865689c1..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.product.api.property.dto; - -import lombok.Data; - -/** - * 商品属性项的明细 Response DTO - * - * @author 芋道源码 - */ -@Data -public class ProductPropertyValueDetailRespDTO { - - /** - * 属性的编号 - */ - private Long propertyId; - - /** - * 属性的名称 - */ - private String propertyName; - - /** - * 属性值的编号 - */ - private Long valueId; - - /** - * 属性值的名称 - */ - private String valueName; - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java deleted file mode 100644 index 06c0e7c8..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.product.api.sku; - -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; - -import java.util.Collection; -import java.util.List; - -/** - * 商品 SKU API 接口 - * - * @author LeeYan9 - * @since 2022-08-26 - */ -public interface ProductSkuApi { - - /** - * 查询 SKU 信息 - * - * @param id SKU 编号 - * @return SKU 信息 - */ - ProductSkuRespDTO getSku(Long id); - - /** - * 批量查询 SKU 数组 - * - * @param ids SKU 编号列表 - * @return SKU 数组 - */ - List getSkuList(Collection ids); - - /** - * 批量查询 SKU 数组 - * - * @param spuIds SPU 编号列表 - * @return SKU 数组 - */ - List getSkuListBySpuId(Collection spuIds); - - /** - * 更新 SKU 库存 - * - * @param updateStockReqDTO 更新请求 - */ - void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO); - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java deleted file mode 100644 index 7906afe2..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.win.module.product.api.sku.dto; - -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import lombok.Data; - -import java.util.List; - -/** - * 商品 SKU 信息 Response DTO - * - * @author LeeYan9 - * @since 2022-08-26 - */ -@Data -public class ProductSkuRespDTO { - - /** - * 商品 SKU 编号,自增 - */ - private Long id; - /** - * SPU 编号 - */ - private Long spuId; - - /** - * 属性数组 - */ - private List properties; - /** - * 销售价格,单位:分 - */ - private Integer price; - /** - * 市场价,单位:分 - */ - private Integer marketPrice; - /** - * 成本价,单位:分 - */ - private Integer costPrice; - /** - * SKU 的条形码 - */ - private String barCode; - /** - * 图片地址 - */ - private String picUrl; - /** - * 库存 - */ - private Integer stock; - /** - * 商品重量,单位:kg 千克 - */ - private Double weight; - /** - * 商品体积,单位:m^3 平米 - */ - private Double volume; - - // TODO @puhui:这 2 字段,需要改下;firstBrokerageRecord、secondBrokerageRecord;和分佣保持一致; - /** - * 一级分销的佣金,单位:分 - */ - private Integer subCommissionFirstPrice; - /** - * 二级分销的佣金,单位:分 - */ - private Integer subCommissionSecondPrice; - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java deleted file mode 100644 index f68a32bb..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.product.api.sku.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 商品 SKU 更新库存 Request DTO - * - * @author LeeYan9 - * @since 2022-08-26 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ProductSkuUpdateStockReqDTO { - - /** - * 商品 SKU - */ - @NotNull(message = "商品 SKU 不能为空") - private List items; - - @Data - public static class Item { - - /** - * 商品 SKU 编号 - */ - @NotNull(message = "商品 SKU 编号不能为空") - private Long id; - - /** - * 库存变化数量 - * - * 正数:增加库存 - * 负数:扣减库存 - */ - @NotNull(message = "库存变化数量不能为空") - private Integer incrCount; - - } - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java deleted file mode 100644 index aab05ad5..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.product.api.spu; - -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; - -import java.util.Collection; -import java.util.List; - -/** - * 商品 SPU API 接口 - * - * @author LeeYan9 - * @since 2022-08-26 - */ -public interface ProductSpuApi { - - /** - * 批量查询 SPU 数组 - * - * @param ids SPU 编号列表 - * @return SPU 数组 - */ - List getSpuList(Collection ids); - - /** - * 获得 SPU - * - * @return SPU - */ - ProductSpuRespDTO getSpu(Long id); - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java deleted file mode 100644 index e6c0d3a1..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.win.module.product.api.spu.dto; - -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import lombok.Data; - -import java.util.List; - -// TODO @LeeYan9: ProductSpuRespDTO -/** - * 商品 SPU 信息 Response DTO - * - * @author LeeYan9 - * @since 2022-08-26 - */ -@Data -public class ProductSpuRespDTO { - - /** - * 商品 SPU 编号,自增 - */ - private Long id; - - // ========== 基本信息 ========= - - /** - * 商品名称 - */ - private String name; - /** - * 关键字 - */ - private String keyword; - /** - * 商品简介 - */ - private String introduction; - /** - * 商品详情 - */ - private String description; - // TODO @芋艿:是不是要删除 - /** - * 商品条码(一维码) - */ - private String barCode; - - /** - * 商品分类编号 - */ - private Long categoryId; - /** - * 商品品牌编号 - */ - private Long brandId; - /** - * 商品封面图 - */ - private String picUrl; - /** - * 商品轮播图 - */ - private List sliderPicUrls; - /** - * 商品视频 - */ - private String videoUrl; - - /** - * 排序字段 - */ - private Integer sort; - /** - * 商品状态 - *

- * 枚举 {@link ProductSpuStatusEnum} - */ - private Integer status; - - // ========== SKU 相关字段 ========= - - /** - * 规格类型 - * - * false - 单规格 - * true - 多规格 - */ - private Boolean specType; - /** - * 商品价格,单位使用:分 - */ - private Integer price; - /** - * 市场价,单位使用:分 - */ - private Integer marketPrice; - /** - * 成本价,单位使用:分 - */ - private Integer costPrice; - /** - * 库存 - */ - private Integer stock; - - // ========== 物流相关字段 ========= - - /** - * 物流配置模板编号 - * - * 对应 TradeDeliveryExpressTemplateDO 的 id 编号 - */ - private Long deliveryTemplateId; - - // ========== 统计相关字段 ========= - - /** - * 商品销量 - */ - private Integer salesCount; - /** - * 虚拟销量 - */ - private Integer virtualSalesCount; - /** - * 商品点击量 - */ - private Integer clickCount; - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java deleted file mode 100644 index 1d321fc0..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.win.module.product.enums; - -/** - * product 字典类型的枚举类 - * - * @author HUIHUI - */ -public interface DictTypeConstants { - - String PRODUCT_UNIT = "product_unit"; // 商品单位 - String PRODUCT_SPU_STATUS = "product_spu_status"; // 商品 SPU 状态 - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java deleted file mode 100644 index 7d90caa4..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.product.enums; - -import com.win.framework.common.exception.ErrorCode; - -/** - * Product 错误码枚举类 - * - * product 系统,使用 1-008-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== 商品分类相关 1-008-001-000 ============ - ErrorCode CATEGORY_NOT_EXISTS = new ErrorCode(1_008_001_000, "商品分类不存在"); - ErrorCode CATEGORY_PARENT_NOT_EXISTS = new ErrorCode(1_008_001_001, "父分类不存在"); - ErrorCode CATEGORY_PARENT_NOT_FIRST_LEVEL = new ErrorCode(1_008_001_002, "父分类不能是二级分类"); - ErrorCode CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_008_001_003, "存在子分类,无法删除"); - ErrorCode CATEGORY_DISABLED = new ErrorCode(1_008_001_004, "商品分类({})已禁用,无法使用"); - ErrorCode CATEGORY_HAVE_BIND_SPU = new ErrorCode(1_008_001_005, "类别下存在商品,无法删除"); - - // ========== 商品品牌相关编号 1-008-002-000 ========== - ErrorCode BRAND_NOT_EXISTS = new ErrorCode(1_008_002_000, "品牌不存在"); - ErrorCode BRAND_DISABLED = new ErrorCode(1_008_002_001, "品牌已禁用"); - ErrorCode BRAND_NAME_EXISTS = new ErrorCode(1_008_002_002, "品牌名称已存在"); - - // ========== 商品属性项 1-008-003-000 ========== - ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1_008_003_000, "属性项不存在"); - ErrorCode PROPERTY_EXISTS = new ErrorCode(1_008_003_001, "属性项的名称已存在"); - ErrorCode PROPERTY_DELETE_FAIL_VALUE_EXISTS = new ErrorCode(1_008_003_002, "属性项下存在属性值,无法删除"); - - // ========== 商品属性值 1-008-004-000 ========== - ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1_008_004_000, "属性值不存在"); - ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1_008_004_001, "属性值的名称已存在"); - - // ========== 商品 SPU 1-008-005-000 ========== - ErrorCode SPU_NOT_EXISTS = new ErrorCode(1_008_005_000, "商品 SPU 不存在"); - ErrorCode SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR = new ErrorCode(1_008_005_001, "商品分类不正确,原因:必须使用第二级的商品分类及以下"); - ErrorCode SPU_NOT_ENABLE = new ErrorCode(1_008_005_002, "商品 SPU 不处于上架状态"); - ErrorCode SPU_NOT_RECYCLE = new ErrorCode(1_008_005_003, "商品 SPU 不处于回收站状态"); - - // ========== 商品 SKU 1-008-006-000 ========== - ErrorCode SKU_NOT_EXISTS = new ErrorCode(1_008_006_000, "商品 SKU 不存在"); - ErrorCode SKU_PROPERTIES_DUPLICATED = new ErrorCode(1_008_006_001, "商品 SKU 的属性组合存在重复"); - ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1_008_006_002, "一个 SPU 下的每个 SKU,其属性项必须一致"); - ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1_008_006_003, "一个 SPU 下的每个 SKU,必须不重复"); - ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1_008_006_004, "商品 SKU 库存不足"); - - // ========== 商品 评价 1-008-007-000 ========== - ErrorCode COMMENT_NOT_EXISTS = new ErrorCode(1_008_007_000, "商品评价不存在"); - ErrorCode COMMENT_ORDER_EXISTS = new ErrorCode(1_008_007_001, "订单的商品评价已存在"); - - // ========== 商品 收藏 1-008-008-000 ========== - ErrorCode FAVORITE_EXISTS = new ErrorCode(1_008_008_000, "该商品已经被收藏"); - ErrorCode FAVORITE_NOT_EXISTS = new ErrorCode(1_008_008_001, "商品收藏不存在"); - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java deleted file mode 100644 index 7a08c788..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.product.enums; - -/** - * Product 常量 - * - * @author HUIHUI - */ -public interface ProductConstants { - - /** - * 警戒库存 TODO 警戒库存暂时为 10,后期需要使用常量或者数据库配置替换 - */ - int ALERT_STOCK = 10; - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java deleted file mode 100644 index 5b4d515a..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.product.enums.comment; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 商品评论的审批状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum ProductCommentAuditStatusEnum implements IntArrayValuable { - - NONE(1, "待审核"), - APPROVE(2, "审批通过"), - REJECT(2, "审批不通过"),; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductCommentAuditStatusEnum::getStatus).toArray(); - - /** - * 审批状态 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java deleted file mode 100644 index 62c54f42..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.product.enums.comment; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 商品评论的星级枚举 - * - * @author wangzhs - */ -@Getter -@AllArgsConstructor -public enum ProductCommentScoresEnum implements IntArrayValuable { - - ONE(1, "1星"), - TWO(2, "2星"), - THREE(3, "3星"), - FOUR(4, "4星"), - FIVE(5, "5星"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductCommentScoresEnum::getScores).toArray(); - - /** - * 星级 - */ - private final Integer scores; - - /** - * 星级名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java deleted file mode 100644 index eb597af0..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.product.enums.group; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 商品分组的样式枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum ProductGroupStyleEnum implements IntArrayValuable { - - ONE(1, "每列一个"), - TWO(2, "每列两个"), - THREE(2, "每列三个"),; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductGroupStyleEnum::getStyle).toArray(); - - /** - * 列表样式 - */ - private final Integer style; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java deleted file mode 100644 index dc83e1ec..00000000 --- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.product.enums.spu; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 商品 SPU 状态 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum ProductSpuStatusEnum implements IntArrayValuable { - - RECYCLE(-1, "回收站"), - DISABLE(0, "下架"), - ENABLE(1, "上架"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductSpuStatusEnum::getStatus).toArray(); - - /** - * 状态 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - - /** - * 判断是否处于【上架】状态 - * - * @param status 状态 - * @return 是否处于【上架】状态 - */ - public static boolean isEnable(Integer status) { - return ENABLE.getStatus().equals(status); - } - -} diff --git a/win-module-mall/win-module-product-biz/pom.xml b/win-module-mall/win-module-product-biz/pom.xml deleted file mode 100644 index 683923e5..00000000 --- a/win-module-mall/win-module-product-biz/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - com.win - win-module-mall - ${revision} - - 4.0.0 - win-module-product-biz - jar - - ${project.artifactId} - - product 模块,主要实现商品相关功能 - 例如:品牌、商品分类、spu、sku等功能。 - - - - - com.win - win-module-product-api - ${revision} - - - - com.win - win-module-trade-api - ${revision} - - - com.win - win-module-member-api - ${revision} - - - - - com.win - win-spring-boot-starter-biz-operatelog - - - com.win - win-spring-boot-starter-biz-dict - - - - - com.win - win-spring-boot-starter-web - - - com.win - win-spring-boot-starter-security - - - - - com.win - win-spring-boot-starter-mybatis - - - - - com.win - win-spring-boot-starter-test - - - - - com.win - win-spring-boot-starter-excel - - - - diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java deleted file mode 100644 index ca916817..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.product.api.comment; - -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; -import com.win.module.product.service.comment.ProductCommentService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * 商品评论 API 实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class ProductCommentApiImpl implements ProductCommentApi { - - @Resource - private ProductCommentService productCommentService; - - @Override - public Long createComment(ProductCommentCreateReqDTO createReqDTO) { - return productCommentService.createComment(createReqDTO); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java deleted file mode 100644 index 1712c1c2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.product.api; diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java deleted file mode 100644 index 123b035b..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.product.api.property; - -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.product.convert.propertyvalue.ProductPropertyValueConvert; -import com.win.module.product.service.property.ProductPropertyValueService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -/** - * 商品属性值 API 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ProductPropertyValueApiImpl implements ProductPropertyValueApi { - - @Resource - private ProductPropertyValueService productPropertyValueService; - - @Override - public List getPropertyValueDetailList(Collection ids) { - return ProductPropertyValueConvert.INSTANCE.convertList02( - productPropertyValueService.getPropertyValueDetailList(ids)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java deleted file mode 100644 index fb6004d8..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.module.product.api.sku; - -import cn.hutool.core.collection.CollUtil; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import com.win.module.product.convert.sku.ProductSkuConvert; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.service.sku.ProductSkuService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * 商品 SKU API 实现类 - * - * @author LeeYan9 - * @since 2022-09-06 - */ -@Service -@Validated -public class ProductSkuApiImpl implements ProductSkuApi { - - @Resource - private ProductSkuService productSkuService; - - @Override - public ProductSkuRespDTO getSku(Long id) { - ProductSkuDO sku = productSkuService.getSku(id); - return ProductSkuConvert.INSTANCE.convert02(sku); - } - - @Override - public List getSkuList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - List skus = productSkuService.getSkuList(ids); - return ProductSkuConvert.INSTANCE.convertList04(skus); - } - - @Override - public List getSkuListBySpuId(Collection spuIds) { - if (CollUtil.isEmpty(spuIds)) { - return Collections.emptyList(); - } - List skus = productSkuService.getSkuListBySpuId(spuIds); - return ProductSkuConvert.INSTANCE.convertList04(skus); - } - - @Override - public void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO) { - productSkuService.updateSkuStock(updateStockReqDTO); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java deleted file mode 100644 index 79afddc7..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.product.api.spu; - -import cn.hutool.core.collection.CollectionUtil; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.product.convert.spu.ProductSpuConvert; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.dal.mysql.spu.ProductSpuMapper; -import com.win.module.product.service.sku.ProductSkuService; -import com.win.module.product.service.spu.ProductSpuService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * 商品 SPU API 接口实现类 - * - * @author LeeYan9 - * @since 2022-09-06 - */ -@Service -@Validated -public class ProductSpuApiImpl implements ProductSpuApi { - - @Resource - private ProductSpuService spuService; - - @Override - public List getSpuList(Collection ids) { - if (CollectionUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return ProductSpuConvert.INSTANCE.convertList2(spuService.getSpuList(ids)); - } - - @Override - public ProductSpuRespDTO getSpu(Long id) { - return ProductSpuConvert.INSTANCE.convert02(spuService.getSpu(id)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java deleted file mode 100644 index 9750cb64..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.win.module.product.controller.admin.brand; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.brand.vo.*; -import com.win.module.product.convert.brand.ProductBrandConvert; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; -import com.win.module.product.service.brand.ProductBrandService; -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.Comparator; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 商品品牌") -@RestController -@RequestMapping("/product/brand") -@Validated -public class ProductBrandController { - - @Resource - private ProductBrandService brandService; - - @PostMapping("/create") - @Operation(summary = "创建品牌") - @PreAuthorize("@ss.hasPermission('product:brand:create')") - public CommonResult createBrand(@Valid @RequestBody ProductBrandCreateReqVO createReqVO) { - return success(brandService.createBrand(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新品牌") - @PreAuthorize("@ss.hasPermission('product:brand:update')") - public CommonResult updateBrand(@Valid @RequestBody ProductBrandUpdateReqVO updateReqVO) { - brandService.updateBrand(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除品牌") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:brand:delete')") - public CommonResult deleteBrand(@RequestParam("id") Long id) { - brandService.deleteBrand(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得品牌") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:brand:query')") - public CommonResult getBrand(@RequestParam("id") Long id) { - ProductBrandDO brand = brandService.getBrand(id); - return success(ProductBrandConvert.INSTANCE.convert(brand)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取品牌精简信息列表", description = "主要用于前端的下拉选项") - public CommonResult> getSimpleBrandList() { - // 获取品牌列表,只要开启状态的 - List list = brandService.getBrandListByStatus(CommonStatusEnum.ENABLE.getStatus()); - // 排序后,返回给前端 - return success(ProductBrandConvert.INSTANCE.convertList1(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得品牌分页") - @PreAuthorize("@ss.hasPermission('product:brand:query')") - public CommonResult> getBrandPage(@Valid ProductBrandPageReqVO pageVO) { - PageResult pageResult = brandService.getBrandPage(pageVO); - return success(ProductBrandConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/list") - @Operation(summary = "获得品牌列表") - @PreAuthorize("@ss.hasPermission('product:brand:query')") - public CommonResult> getBrandList(@Valid ProductBrandListReqVO listVO) { - List list = brandService.getBrandList(listVO); - list.sort(Comparator.comparing(ProductBrandDO::getSort)); - return success(ProductBrandConvert.INSTANCE.convertList(list)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java deleted file mode 100644 index 25a741b2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.product.controller.admin.brand.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 ProductBrandBaseVO { - - @Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "苹果") - @NotNull(message = "品牌名称不能为空") - private String name; - - @Schema(description = "品牌图片", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "品牌图片不能为空") - private String picUrl; - - @Schema(description = "品牌排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "品牌排序不能为空") - private Integer sort; - - @Schema(description = "品牌描述", example = "描述") - private String description; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "状态不能为空") - private Integer status; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java deleted file mode 100644 index 60b304df..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.product.controller.admin.brand.vo; - -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 ProductBrandCreateReqVO extends ProductBrandBaseVO { - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java deleted file mode 100644 index ae85112d..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.win.module.product.controller.admin.brand.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 商品品牌分页 Request VO") -@Data -public class ProductBrandListReqVO { - - @Schema(description = "品牌名称", example = "苹果") - private String name; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java deleted file mode 100644 index e5a5d7ef..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.product.controller.admin.brand.vo; - -import com.win.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 com.win.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 ProductBrandPageReqVO extends PageParam { - - @Schema(description = "品牌名称", example = "苹果") - private String name; - - @Schema(description = "状态", example = "0") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java deleted file mode 100644 index 2a913cea..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.admin.brand.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 ProductBrandRespVO extends ProductBrandBaseVO { - - @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java deleted file mode 100644 index 2843d3e6..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.product.controller.admin.brand.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Schema(description = "管理后台 - 品牌精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ProductBrandSimpleRespVO { - - @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "苹果") - private String name; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java deleted file mode 100644 index 9cc3cab0..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.product.controller.admin.brand.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductBrandUpdateReqVO extends ProductBrandBaseVO { - - @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "品牌编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java deleted file mode 100644 index 785f6a11..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.win.module.product.controller.admin.category; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryRespVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; -import com.win.module.product.convert.category.ProductCategoryConvert; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import com.win.module.product.service.category.ProductCategoryService; -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.Comparator; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 商品分类") -@RestController -@RequestMapping("/product/category") -@Validated -public class ProductCategoryController { - - @Resource - private ProductCategoryService categoryService; - - @PostMapping("/create") - @Operation(summary = "创建商品分类") - @PreAuthorize("@ss.hasPermission('product:category:create')") - public CommonResult createCategory(@Valid @RequestBody ProductCategoryCreateReqVO createReqVO) { - return success(categoryService.createCategory(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新商品分类") - @PreAuthorize("@ss.hasPermission('product:category:update')") - public CommonResult updateCategory(@Valid @RequestBody ProductCategoryUpdateReqVO updateReqVO) { - categoryService.updateCategory(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除商品分类") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('product:category:delete')") - public CommonResult deleteCategory(@RequestParam("id") Long id) { - categoryService.deleteCategory(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得商品分类") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:category:query')") - public CommonResult getCategory(@RequestParam("id") Long id) { - ProductCategoryDO category = categoryService.getCategory(id); - return success(ProductCategoryConvert.INSTANCE.convert(category)); - } - - @GetMapping("/list") - @Operation(summary = "获得商品分类列表") - @PreAuthorize("@ss.hasPermission('product:category:query')") - public CommonResult> getCategoryList(@Valid ProductCategoryListReqVO treeListReqVO) { - List list = categoryService.getEnableCategoryList(treeListReqVO); - list.sort(Comparator.comparing(ProductCategoryDO::getSort)); - return success(ProductCategoryConvert.INSTANCE.convertList(list)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java deleted file mode 100644 index e8cdf550..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.product.controller.admin.category.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** -* 商品分类 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class ProductCategoryBaseVO { - - @Schema(description = "父分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "父分类编号不能为空") - private Long parentId; - - @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "办公文具") - @NotBlank(message = "分类名称不能为空") - private String name; - - @Schema(description = "移动端分类图", requiredMode = Schema.RequiredMode.REQUIRED) - @NotBlank(message = "移动端分类图不能为空") - private String picUrl; - - @Schema(description = "PC 端分类图") - private String bigPicUrl; - - @Schema(description = "分类排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer sort; - - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "开启状态不能为空") - private Integer status; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java deleted file mode 100644 index 37ed9004..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.product.controller.admin.category.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotBlank; - -@Schema(description = "管理后台 - 商品分类创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductCategoryCreateReqVO extends ProductCategoryBaseVO { - - @Schema(description = "分类描述", example = "描述") - private String description; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java deleted file mode 100644 index 4d735888..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.product.controller.admin.category.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 商品分类列表查询 Request VO") -@Data -public class ProductCategoryListReqVO { - - @Schema(description = "分类名称", example = "办公文具") - private String name; - - @Schema(description = "开启状态", example = "0") - private Integer status; - - @Schema(description = "父分类编号", example = "1") - private Long parentId; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java deleted file mode 100644 index 8d061f51..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.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; - -@Schema(description = "管理后台 - 商品分类 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductCategoryRespVO extends ProductCategoryBaseVO { - - @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java deleted file mode 100644 index 7ef2098c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.product.controller.admin.category.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 商品分类更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductCategoryUpdateReqVO extends ProductCategoryBaseVO { - - @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "分类编号不能为空") - private Long id; - - @Schema(description = "分类描述", example = "描述") - private String description; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.http b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.http deleted file mode 100644 index e69de29b..00000000 diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java deleted file mode 100644 index f8db554c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.product.controller.admin.comment; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.comment.vo.*; -import com.win.module.product.convert.comment.ProductCommentConvert; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import com.win.module.product.service.comment.ProductCommentService; -import io.swagger.v3.oas.annotations.Operation; -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 static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 商品评价") -@RestController -@RequestMapping("/product/comment") -@Validated -public class ProductCommentController { - - @Resource - private ProductCommentService productCommentService; - - @GetMapping("/page") - @Operation(summary = "获得商品评价分页") - @PreAuthorize("@ss.hasPermission('product:comment:query')") - public CommonResult> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { - PageResult pageResult = productCommentService.getCommentPage(pageVO); - return success(ProductCommentConvert.INSTANCE.convertPage(pageResult)); - } - - @PutMapping("/update-visible") - @Operation(summary = "显示 / 隐藏评论") - @PreAuthorize("@ss.hasPermission('product:comment:update')") - public CommonResult updateCommentVisible(@Valid @RequestBody ProductCommentUpdateVisibleReqVO updateReqVO) { - productCommentService.updateCommentVisible(updateReqVO); - return success(true); - } - - @PutMapping("/reply") - @Operation(summary = "商家回复") - @PreAuthorize("@ss.hasPermission('product:comment:update')") - public CommonResult commentReply(@Valid @RequestBody ProductCommentReplyReqVO replyVO) { - productCommentService.replyComment(replyVO, getLoginUserId()); - return success(true); - } - - @PostMapping("/create") - @Operation(summary = "添加自评") - @PreAuthorize("@ss.hasPermission('product:comment:update')") - public CommonResult createComment(@Valid @RequestBody ProductCommentCreateReqVO createReqVO) { - productCommentService.createComment(createReqVO); - return success(true); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java deleted file mode 100644 index afaed3a2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.product.controller.admin.comment.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -@Data -public class ProductCommentBaseVO { - - @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868") - private Long userId; - - @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292") - private Long orderItemId; - - @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉") - @NotNull(message = "评价人名称不能为空") - private String userNickname; - - @Schema(description = "评价人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - @NotNull(message = "评价人头像不能为空") - private String userAvatar; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "描述星级不能为空") - private Integer descriptionScores; - - @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "服务星级分不能为空") - private Integer benefitScores; - - @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "穿起来非常丝滑凉快") - @NotNull(message = "评论内容不能为空") - private String content; - - @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png]") - @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张") - private List picUrls; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java deleted file mode 100644 index 0e450396..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.product.controller.admin.comment.vo; - -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 ProductCommentCreateReqVO extends ProductCommentBaseVO { - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java deleted file mode 100644 index e8abe066..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.product.controller.admin.comment.vo; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -import com.win.module.product.enums.comment.ProductCommentScoresEnum; -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 com.win.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 ProductCommentPageReqVO extends PageParam { - - @Schema(description = "评价人名称", example = "王二狗") - private String userNickname; - - @Schema(description = "交易订单编号", example = "24428") - private Long orderId; - - @Schema(description = "商品SPU编号", example = "29502") - private Long spuId; - - @Schema(description = "商品SPU名称", example = "感冒药") - private String spuName; - - @Schema(description = "评分星级 1-5 分", example = "5") - @InEnum(ProductCommentScoresEnum.class) - private Integer scores; - - @Schema(description = "商家是否回复", example = "true") - private Boolean replyStatus; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java deleted file mode 100644 index 73982d94..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.product.controller.admin.comment.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 商品评价的商家回复 Request VO") -@Data -@ToString(callSuper = true) -public class ProductCommentReplyReqVO { - - @Schema(description = "评价编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721") - @NotNull(message = "评价编号不能为空") - private Long id; - - @Schema(description = "商家回复内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "谢谢亲") - @NotEmpty(message = "商家回复内容不能为空") - private String replyContent; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java deleted file mode 100644 index db1d5cd1..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.product.controller.admin.comment.vo; - -import com.win.module.product.controller.admin.sku.vo.ProductSkuBaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管理后台 - 商品评价 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductCommentRespVO extends ProductCommentBaseVO { - - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24965") - private Long id; - - @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean anonymous; - - @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24428") - private Long orderId; - - @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED) - private Boolean visible; - - @Schema(description = "商家是否回复", requiredMode = Schema.RequiredMode.REQUIRED) - private Boolean replyStatus; - - @Schema(description = "回复管理员编号", example = "9527") - private Long replyUserId; - - @Schema(description = "商家回复内容", example = "感谢好评哦亲(づ ̄3 ̄)づ╭❤~") - private String replyContent; - - @Schema(description = "商家回复时间", example = "2023-08-08 12:20:55") - private LocalDateTime replyTime; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - private Integer scores; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑透气小短袖") - @NotNull(message = "商品 SPU 编号不能为空") - private Long spuId; - - @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - @NotNull(message = "商品 SPU 名称不能为空") - private String spuName; - - @Schema(description = "商品 SKU 图片地址", example = "https://www.iocoder.cn/win.jpg") - private String skuPicUrl; - - @Schema(description = "商品 SKU 规格值数组") - private List skuProperties; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java deleted file mode 100644 index b7914122..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.admin.comment.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 商品评价可见修改 Request VO") -@Data -@ToString(callSuper = true) -public class ProductCommentUpdateVisibleReqVO { - - @Schema(description = "评价编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721") - @NotNull(message = "评价编号不能为空") - private Long id; - - @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是否可见不能为空") - private Boolean visible; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java deleted file mode 100644 index adf30dba..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.win.module.product.controller.admin.property; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.property.vo.property.*; -import com.win.module.product.convert.property.ProductPropertyConvert; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import com.win.module.product.service.property.ProductPropertyService; -import com.win.module.product.service.property.ProductPropertyValueService; -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.Collections; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 商品属性项") -@RestController -@RequestMapping("/product/property") -@Validated -public class ProductPropertyController { - - @Resource - private ProductPropertyService productPropertyService; - @Resource - private ProductPropertyValueService productPropertyValueService; - - @PostMapping("/create") - @Operation(summary = "创建属性项") - @PreAuthorize("@ss.hasPermission('product:property:create')") - public CommonResult createProperty(@Valid @RequestBody ProductPropertyCreateReqVO createReqVO) { - return success(productPropertyService.createProperty(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新属性项") - @PreAuthorize("@ss.hasPermission('product:property:update')") - public CommonResult updateProperty(@Valid @RequestBody ProductPropertyUpdateReqVO updateReqVO) { - productPropertyService.updateProperty(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除属性项") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('product:property:delete')") - public CommonResult deleteProperty(@RequestParam("id") Long id) { - productPropertyService.deleteProperty(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得属性项") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:property:query')") - public CommonResult getProperty(@RequestParam("id") Long id) { - return success(ProductPropertyConvert.INSTANCE.convert(productPropertyService.getProperty(id))); - } - - @GetMapping("/list") - @Operation(summary = "获得属性项列表") - @PreAuthorize("@ss.hasPermission('product:property:query')") - public CommonResult> getPropertyList(@Valid ProductPropertyListReqVO listReqVO) { - return success(ProductPropertyConvert.INSTANCE.convertList(productPropertyService.getPropertyList(listReqVO))); - } - - @GetMapping("/page") - @Operation(summary = "获得属性项分页") - @PreAuthorize("@ss.hasPermission('product:property:query')") - public CommonResult> getPropertyPage(@Valid ProductPropertyPageReqVO pageVO) { - return success(ProductPropertyConvert.INSTANCE.convertPage(productPropertyService.getPropertyPage(pageVO))); - } - - @PostMapping("/get-value-list") - @Operation(summary = "获得属性项列表") - @PreAuthorize("@ss.hasPermission('product:property:query')") - public CommonResult> getPropertyAndValueList( - @Valid @RequestBody ProductPropertyListReqVO listReqVO) { - // 查询属性项 - List keys = productPropertyService.getPropertyList(listReqVO); - if (CollUtil.isEmpty(keys)) { - return success(Collections.emptyList()); - } - // 查询属性值 - List values = productPropertyValueService.getPropertyValueListByPropertyId( - convertSet(keys, ProductPropertyDO::getId)); - return success(ProductPropertyConvert.INSTANCE.convertList(keys, values)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java deleted file mode 100644 index 5132d0d3..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.win.module.product.controller.admin.property; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.crypto.symmetric.AES; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO; -import com.win.module.product.convert.propertyvalue.ProductPropertyValueConvert; -import com.win.module.product.service.property.ProductPropertyValueService; -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.Arrays; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 商品属性值") -@RestController -@RequestMapping("/product/property/value") -@Validated -public class ProductPropertyValueController { - - @Resource - private ProductPropertyValueService productPropertyValueService; - - @PostMapping("/create") - @Operation(summary = "创建属性值") - @PreAuthorize("@ss.hasPermission('product:property:create')") - public CommonResult createPropertyValue(@Valid @RequestBody ProductPropertyValueCreateReqVO createReqVO) { - return success(productPropertyValueService.createPropertyValue(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新属性值") - @PreAuthorize("@ss.hasPermission('product:property:update')") - public CommonResult updatePropertyValue(@Valid @RequestBody ProductPropertyValueUpdateReqVO updateReqVO) { - productPropertyValueService.updatePropertyValue(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除属性值") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:property:delete')") - public CommonResult deletePropertyValue(@RequestParam("id") Long id) { - productPropertyValueService.deletePropertyValue(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得属性值") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:property:query')") - public CommonResult getPropertyValue(@RequestParam("id") Long id) { - return success(ProductPropertyValueConvert.INSTANCE.convert(productPropertyValueService.getPropertyValue(id))); - } - - @GetMapping("/page") - @Operation(summary = "获得属性值分页") - @PreAuthorize("@ss.hasPermission('product:property:query')") - public CommonResult> getPropertyValuePage(@Valid ProductPropertyValuePageReqVO pageVO) { - return success(ProductPropertyValueConvert.INSTANCE.convertPage(productPropertyValueService.getPropertyValuePage(pageVO))); - } -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java deleted file mode 100644 index a5e6bb23..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 商品属性项 + 属性值 Response VO") -@Data -public class ProductPropertyAndValueRespVO { - - @Schema(description = "属性项的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "属性项的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") - private String name; - - /** - * 属性值的集合 - */ - private List values; - - @Schema(description = "管理后台 - 属性值的简单 Response VO") - @Data - public static class Value { - - @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long id; - - @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") - private String name; - - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java deleted file mode 100644 index afa37bfa..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** - * 商品属性项 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class ProductPropertyBaseVO { - - @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") - @NotBlank(message = "名称不能为空") - private String name; - - @Schema(description = "备注", example = "颜色") - private String remark; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java deleted file mode 100644 index 83c280eb..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -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 ProductPropertyCreateReqVO extends ProductPropertyBaseVO { - - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java deleted file mode 100644 index 1f759ca2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import java.util.List; - -@Schema(description = "管理后台 - 属性项 List Request VO") -@Data -@ToString(callSuper = true) -public class ProductPropertyListReqVO { - - @Schema(description = "属性名称", example = "颜色") - private String name; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java deleted file mode 100644 index 4a6a83b0..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -import com.win.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 com.win.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 ProductPropertyPageReqVO extends PageParam { - - @Schema(description = "名称", example = "颜色") - private String name; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java deleted file mode 100644 index d9a6b313..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -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 ProductPropertyRespVO extends ProductPropertyBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java deleted file mode 100644 index f192d8ab..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.property; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductPropertyUpdateReqVO extends ProductPropertyBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "主键不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java deleted file mode 100644 index a93834f5..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.value; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** -* 属性值 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class ProductPropertyValueBaseVO { - - @Schema(description = "属性项的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "属性项的编号不能为空") - private Long propertyId; - - @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") - @NotEmpty(message = "名称名字不能为空") - private String name; - - @Schema(description = "备注", example = "颜色") - private String remark; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java deleted file mode 100644 index ffc62dc3..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.value; - -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 ProductPropertyValueCreateReqVO extends ProductPropertyValueBaseVO { - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java deleted file mode 100644 index 9770a2d8..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.value; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 商品属性值的明细 Response VO") -@Data -public class ProductPropertyValueDetailRespVO { - - @Schema(description = "属性的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long propertyId; - - @Schema(description = "属性的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") - private String propertyName; - - @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long valueId; - - @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") - private String valueName; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java deleted file mode 100644 index 1da472d6..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.value; - -import com.win.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 ProductPropertyValuePageReqVO extends PageParam { - - @Schema(description = "属性项的编号", example = "1024") - private String propertyId; - - @Schema(description = "名称", example = "红色") - private String name; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java deleted file mode 100644 index a7ed3d4b..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.value; - -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 ProductPropertyValueRespVO extends ProductPropertyValueBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Long id; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java deleted file mode 100644 index 5b0c4f8e..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.product.controller.admin.property.vo.value; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductPropertyValueUpdateReqVO extends ProductPropertyValueBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "主键不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java deleted file mode 100644 index 0f3ef2d6..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.product.controller.admin.sku; - -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "管理后台 - 商品 SKU") -@RestController -@RequestMapping("/product/sku") -@Validated -public class ProductSkuController { - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java deleted file mode 100644 index 77ab1da0..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.product.controller.admin.sku.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** -* 商品 SKU Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class ProductSkuBaseVO { - - @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") - @NotEmpty(message = "商品 SKU 名字不能为空") - private String name; - - @Schema(description = "销售价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") - @NotNull(message = "销售价格,单位:分不能为空") - private Integer price; - - @Schema(description = "市场价", example = "2999") - private Integer marketPrice; - - @Schema(description = "成本价", example = "19") - private Integer costPrice; - - @Schema(description = "条形码", example = "15156165456") - private String barCode; - - @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - @NotNull(message = "图片地址不能为空") - private String picUrl; - - @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "库存不能为空") - private Integer stock; - - @Schema(description = "预警预存", example = "10") - private Integer warnStock; - - @Schema(description = "商品重量,单位:kg 千克", example = "1.2") - private Double weight; - - @Schema(description = "商品体积,单位:m^3 平米", example = "2.5") - private Double volume; - - @Schema(description = "一级分销的佣金,单位:分", example = "199") - private Integer subCommissionFirstPrice; - - @Schema(description = "二级分销的佣金,单位:分", example = "19") - private Integer subCommissionSecondPrice; - - @Schema(description = "属性数组") - private List properties; - - @Schema(description = "商品属性") - @Data - @NoArgsConstructor - @AllArgsConstructor - public static class Property { - - @Schema(description = "属性编号", example = "10") - private Long propertyId; - - @Schema(description = "属性名字", example = "颜色") - private String propertyName; - - @Schema(description = "属性值编号", example = "10") - private Long valueId; - - @Schema(description = "属性值名字", example = "红色") - private String valueName; - - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java deleted file mode 100644 index 87c7f06a..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.product.controller.admin.sku.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.List; - -@Schema(description = "管理后台 - 商品 SKU 创建/更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO { - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java deleted file mode 100644 index 6ee03db1..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.product.controller.admin.sku.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 商品 SKU Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSkuRespVO extends ProductSkuBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http deleted file mode 100644 index 4ab7b4f7..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http +++ /dev/null @@ -1,4 +0,0 @@ -### 获得商品 SPU 明细 -GET {{baseUrl}}/product/spu/get-detail?id=4 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java deleted file mode 100644 index 1d8e3732..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.win.module.product.controller.admin.spu; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.excel.core.util.ExcelUtils; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.module.product.controller.admin.spu.vo.*; -import com.win.module.product.convert.spu.ProductSpuConvert; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.service.sku.ProductSkuService; -import com.win.module.product.service.spu.ProductSpuService; -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 java.util.Map; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -import static com.win.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; - -@Tag(name = "管理后台 - 商品 SPU") -@RestController -@RequestMapping("/product/spu") -@Validated -public class ProductSpuController { - - @Resource - private ProductSpuService productSpuService; - @Resource - private ProductSkuService productSkuService; - - @PostMapping("/create") - @Operation(summary = "创建商品 SPU") - @PreAuthorize("@ss.hasPermission('product:spu:create')") - public CommonResult createProductSpu(@Valid @RequestBody ProductSpuCreateReqVO createReqVO) { - return success(productSpuService.createSpu(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新商品 SPU") - @PreAuthorize("@ss.hasPermission('product:spu:update')") - public CommonResult updateSpu(@Valid @RequestBody ProductSpuUpdateReqVO updateReqVO) { - productSpuService.updateSpu(updateReqVO); - return success(true); - } - - @PutMapping("/update-status") - @Operation(summary = "更新商品 SPU Status") - @PreAuthorize("@ss.hasPermission('product:spu:update')") - public CommonResult updateStatus(@Valid @RequestBody ProductSpuUpdateStatusReqVO updateReqVO) { - productSpuService.updateSpuStatus(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除商品 SPU") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:spu:delete')") - public CommonResult deleteSpu(@RequestParam("id") Long id) { - productSpuService.deleteSpu(id); - return success(true); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得商品 SPU 明细") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('product:spu:query')") - public CommonResult getSpuDetail(@RequestParam("id") Long id) { - // 获得商品 SPU - ProductSpuDO spu = productSpuService.getSpu(id); - if (spu == null) { - throw exception(SPU_NOT_EXISTS); - } - // 查询商品 SKU - List skus = productSkuService.getSkuListBySpuId(spu.getId()); - return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespVO(spu, skus)); - } - - @GetMapping("/get-simple-list") - @Operation(summary = "获得商品 SPU 精简列表") - @PreAuthorize("@ss.hasPermission('product:spu:query')") - public CommonResult> getSpuSimpleList() { - List list = productSpuService.getSpuList(); - return success(ProductSpuConvert.INSTANCE.convertList02(list)); - } - - @GetMapping("/list") - @Operation(summary = "获得商品 SPU 详情列表") - @Parameter(name = "spuIds", description = "spu 编号列表", required = true, example = "[1,2,3]") - @PreAuthorize("@ss.hasPermission('product:spu:query')") - public CommonResult> getSpuList(@RequestParam("spuIds") Collection spuIds) { - return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespListVO( - productSpuService.getSpuList(spuIds), productSkuService.getSkuListBySpuId(spuIds))); - } - - @GetMapping("/page") - @Operation(summary = "获得商品 SPU 分页") - @PreAuthorize("@ss.hasPermission('product:spu:query')") - public CommonResult> getSpuPage(@Valid ProductSpuPageReqVO pageVO) { - return success(ProductSpuConvert.INSTANCE.convertPage(productSpuService.getSpuPage(pageVO))); - } - - @GetMapping("/get-count") - @Operation(summary = "获得商品 SPU 分页 tab count") - @PreAuthorize("@ss.hasPermission('product:spu:query')") - public CommonResult> getSpuCount() { - return success(productSpuService.getTabsCount()); - } - - @GetMapping("/export") - @Operation(summary = "导出商品") - @PreAuthorize("@ss.hasPermission('product:spu:export')") - @OperateLog(type = EXPORT) - public void exportUserList(@Validated ProductSpuExportReqVO reqVO, - HttpServletResponse response) throws IOException { - List spuList = productSpuService.getSpuList(reqVO); - // 导出 Excel - List datas = ProductSpuConvert.INSTANCE.convertList03(spuList); - ExcelUtils.write(response, "商品列表.xls", "数据", ProductSpuExcelVO.class, datas); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuBaseVO.java deleted file mode 100644 index dbf8d369..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuBaseVO.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** -* 商品 SPU Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author HUIHUI - */ -@Data -public class ProductSpuBaseVO { - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") - @NotEmpty(message = "商品名称不能为空") - private String name; - - @Schema(description = "关键字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑不出汗") - @NotEmpty(message = "商品关键字不能为空") - private String keyword; - - @Schema(description = "商品简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖简介") - @NotEmpty(message = "商品简介不能为空") - private String introduction; - - @Schema(description = "商品详情", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖详情") - @NotEmpty(message = "商品详情不能为空") - private String description; - - @Schema(description = "商品分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品分类不能为空") - private Long categoryId; - - @Schema(description = "商品品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品品牌不能为空") - private Long brandId; - - @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - @NotEmpty(message = "商品封面图不能为空") - private String picUrl; - - @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") - private List sliderPicUrls; - - @Schema(description = "商品视频", example = "https://www.iocoder.cn/xx.mp4") - private String videoUrl; - - @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品单位不能为空") - private Integer unit; - - @Schema(description = "排序字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品排序字段不能为空") - private Integer sort; - - // ========== SKU 相关字段 ========= - - @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品规格类型不能为空") - private Boolean specType; - - // ========== 物流相关字段 ========= - - @Schema(description = "物流配置模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") - @NotNull(message = "物流配置模板编号不能为空") - private Long deliveryTemplateId; - - // ========== 营销相关字段 ========= - - @Schema(description = "是否热卖推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品推荐不能为空") - private Boolean recommendHot; - - @Schema(description = "是否优惠推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品推荐不能为空") - private Boolean recommendBenefit; - - @Schema(description = "是否精品推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品推荐不能为空") - private Boolean recommendBest; - - @Schema(description = "是否新品推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品推荐不能为空") - private Boolean recommendNew; - - @Schema(description = "是否优品推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品推荐不能为空") - private Boolean recommendGood; - - @Schema(description = "赠送积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") - @NotNull(message = "商品赠送积分不能为空") - private Integer giveIntegral; - - @Schema(description = "赠送的优惠劵编号的数组", example = "[1, 10]") // TODO 这块前端还未实现 - private List giveCouponTemplateIds; - - @Schema(description = "分销类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "商品分销类型不能为空") - private Boolean subCommissionType; - - @Schema(description = "活动展示顺序", example = "[1, 3, 2, 4, 5]") // TODO 这块前端还未实现 - private List activityOrders; - - // ========== 统计相关字段 ========= - - @Schema(description = "虚拟销量", example = "芋道") - private Integer virtualSalesCount; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuCreateReqVO.java deleted file mode 100644 index 0ea481b3..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuCreateReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import java.util.List; - -@Schema(description = "管理后台 - 商品 SPU 创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSpuCreateReqVO extends ProductSpuBaseVO { - - // ========== SKU 相关字段 ========= - - @Schema(description = "SKU 数组") - @Valid - private List skus; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java deleted file mode 100644 index 2bc25f70..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import com.win.module.product.controller.admin.sku.vo.ProductSkuRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.List; - -@Schema(description = "管理后台 - 商品 SPU 详细 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSpuDetailRespVO extends ProductSpuBaseVO { - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1212") - private Long id; - - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000") - private Integer salesCount; - - @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20000") - private Integer browseCount; - - @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - // ========== SKU 相关字段 ========= - - @Schema(description = "SKU 数组") - private List skus; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExcelVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExcelVO.java deleted file mode 100644 index 60bda3a4..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExcelVO.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import com.win.framework.excel.core.annotations.DictFormat; -import com.win.framework.excel.core.convert.DictConvert; -import com.win.module.product.enums.DictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - - -import java.time.LocalDateTime; - -/** - * 商品 Spu Excel 导出 VO TODO 暂定 - * - * @author HUIHUI - */ -@Data -public class ProductSpuExcelVO { - - @ExcelProperty("商品编号") - private Long id; - - @ExcelProperty("商品名称") - private String name; - - @ExcelProperty("关键字") - private String keyword; - - @ExcelProperty("商品简介") - private String introduction; - - @ExcelProperty("商品详情") - private String description; - - @ExcelProperty("条形码") - private String barCode; - - @ExcelProperty("商品分类编号") - private Long categoryId; - - @ExcelProperty("商品品牌编号") - private Long brandId; - - @ExcelProperty("商品封面图") - private String picUrl; - - @ExcelProperty("商品视频") - private String videoUrl; - - @ExcelProperty(value = "商品单位", converter = DictConvert.class) - @DictFormat(DictTypeConstants.PRODUCT_UNIT) - private Integer unit; - - @ExcelProperty("排序字段") - private Integer sort; - - @ExcelProperty(value = "商品状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.PRODUCT_SPU_STATUS) - private Integer status; - - @ExcelProperty("规格类型") - private Boolean specType; - - @ExcelProperty("商品价格") - private Integer price; - - @ExcelProperty("市场价") - private Integer marketPrice; - - @ExcelProperty("成本价") - private Integer costPrice; - - @ExcelProperty("库存") - private Integer stock; - - @ExcelProperty("物流配置模板编号") - private Long deliveryTemplateId; - - @ExcelProperty("是否热卖推荐") - private Boolean recommendHot; - - @ExcelProperty("是否优惠推荐") - private Boolean recommendBenefit; - - @ExcelProperty("是否精品推荐") - private Boolean recommendBest; - - @ExcelProperty("是否新品推荐") - private Boolean recommendNew; - - @ExcelProperty("是否优品推荐") - private Boolean recommendGood; - - @ExcelProperty("赠送积分") - private Integer giveIntegral; - - @ExcelProperty("分销类型") - private Boolean subCommissionType; - - @ExcelProperty("商品销量") - private Integer salesCount; - - @ExcelProperty("虚拟销量") - private Integer virtualSalesCount; - - @ExcelProperty("商品点击量") - private Integer browseCount; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExportReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExportReqVO.java deleted file mode 100644 index f70c3751..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuExportReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 商品 SPU 导出 Request VO,参数和 ProductSpuPageReqVO 是一致的") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ProductSpuExportReqVO { - - @Schema(description = "商品名称", example = "清凉小短袖") - private String name; - - @Schema(description = "前端请求的tab类型", example = "1") - private Integer tabType; - - @Schema(description = "商品分类编号", example = "100") - private Long categoryId; - - @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java deleted file mode 100644 index bd2f4b57..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import com.win.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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 商品 SPU 分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSpuPageReqVO extends PageParam { - - /** - * 出售中商品 - */ - public static final Integer FOR_SALE = 0; - - /** - * 仓库中商品 - */ - public static final Integer IN_WAREHOUSE = 1; - - /** - * 已售空商品 - */ - public static final Integer SOLD_OUT = 2; - - /** - * 警戒库存 - */ - public static final Integer ALERT_STOCK = 3; - - /** - * 商品回收站 - */ - public static final Integer RECYCLE_BIN = 4; - - @Schema(description = "商品名称", example = "清凉小短袖") - private String name; - - @Schema(description = "前端请求的tab类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer tabType; - - @Schema(description = "商品分类编号", example = "1") - private Long categoryId; - - @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuRespVO.java deleted file mode 100644 index d0ec028b..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuRespVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 商品 SPU Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSpuRespVO extends ProductSpuBaseVO { - - @Schema(description = "spuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") - private Long id; - - @Schema(description = "商品价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") - private Integer price; - - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") - private Integer salesCount; - - @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "199") - private Integer marketPrice; - - @Schema(description = "成本价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "19") - private Integer costPrice; - - @Schema(description = "商品库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000") - private Integer stock; - - @Schema(description = "商品创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-05-24 00:00:00") - private LocalDateTime createTime; - - @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuSimpleRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuSimpleRespVO.java deleted file mode 100644 index 73b418ce..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuSimpleRespVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "管理后台 - 商品 SPU 精简 Response VO") -@Data -@ToString(callSuper = true) -public class ProductSpuSimpleRespVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "213") - private Long id; - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖") - private String name; - - @Schema(description = "商品价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") - private Integer price; - - @Schema(description = "商品市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "199") - private Integer marketPrice; - - @Schema(description = "商品成本价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "19") - private Integer costPrice; - - @Schema(description = "商品库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") - private Integer stock; - - // ========== 统计相关字段 ========= - - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer salesCount; - - @Schema(description = "商品虚拟销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20000") - private Integer virtualSalesCount; - - @Schema(description = "商品浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") - private Integer browseCount; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateReqVO.java deleted file mode 100644 index f2c2e749..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateReqVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 商品 SPU 更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ProductSpuUpdateReqVO extends ProductSpuBaseVO { - - @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品编号不能为空") - private Long id; - - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") - private Integer salesCount; - - @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999") - private Integer browseCount; - - @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @InEnum(ProductSpuStatusEnum.class) - private Integer status; - - // ========== SKU 相关字段 ========= - - @Schema(description = "SKU 数组") - @Valid - private List skus; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateStatusReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateStatusReqVO.java deleted file mode 100644 index 3cf725f4..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/vo/ProductSpuUpdateStatusReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.product.controller.admin.spu.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 商品 SPU Status 更新 Request VO") -@Data -public class ProductSpuUpdateStatusReqVO{ - - @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品编号不能为空") - private Long id; - - @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品状态不能为空") - @InEnum(ProductSpuStatusEnum.class) - private Integer status; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/AppCategoryController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/AppCategoryController.java deleted file mode 100644 index 1570ce20..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/AppCategoryController.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.product.controller.app.category; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.product.controller.app.category.vo.AppCategoryRespVO; -import com.win.module.product.convert.category.ProductCategoryConvert; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import com.win.module.product.service.category.ProductCategoryService; -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.Comparator; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 商品分类") -@RestController -@RequestMapping("/product/category") -@Validated -public class AppCategoryController { - - @Resource - private ProductCategoryService categoryService; - - @GetMapping("/list") - @Operation(summary = "获得商品分类列表") - public CommonResult> getProductCategoryList() { - List list = categoryService.getEnableCategoryList(); - list.sort(Comparator.comparing(ProductCategoryDO::getSort)); - return success(ProductCategoryConvert.INSTANCE.convertList03(list)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/vo/AppCategoryRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/vo/AppCategoryRespVO.java deleted file mode 100644 index 27789067..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/category/vo/AppCategoryRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.product.controller.app.category.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -@Data -@Schema(description = "用户 APP - 商品分类 Response VO") -public class AppCategoryRespVO { - - @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private Long id; - - @Schema(description = "父分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "父分类编号不能为空") - private Long parentId; - - @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "办公文具") - @NotBlank(message = "分类名称不能为空") - private String name; - - @Schema(description = "分类图片", requiredMode = Schema.RequiredMode.REQUIRED) - @NotBlank(message = "分类图片不能为空") - private String picUrl; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppCommentController.http b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppCommentController.http deleted file mode 100644 index e69de29b..00000000 diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppProductCommentController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppProductCommentController.java deleted file mode 100644 index 0aa1c8d3..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/AppProductCommentController.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.win.module.product.controller.app.comment; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.app.comment.vo.AppCommentPageReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; -import com.win.module.product.controller.app.comment.vo.AppProductCommentRespVO; -import com.win.module.product.convert.comment.ProductCommentConvert; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import com.win.module.product.service.comment.ProductCommentService; -import com.win.module.product.service.sku.ProductSkuService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.context.annotation.Lazy; -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; -import javax.validation.Valid; -import java.util.List; -import java.util.Set; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "用户 APP - 商品评价") -@RestController -@RequestMapping("/product/comment") -@Validated -public class AppProductCommentController { - - @Resource - private ProductCommentService productCommentService; - - @Resource - @Lazy - private ProductSkuService productSkuService; - - @GetMapping("/list") - @Operation(summary = "获得最近的 n 条商品评价") - @Parameters({ - @Parameter(name = "spuId", description = "商品 SPU 编号", required = true, example = "1024"), - @Parameter(name = "count", description = "数量", required = true, example = "10") - }) - public CommonResult> getCommentList( - @RequestParam("spuId") Long spuId, - @RequestParam(value = "count", defaultValue = "10") Integer count) { - return success(productCommentService.getCommentList(spuId, count)); - } - - @GetMapping("/page") - @Operation(summary = "获得商品评价分页") - public CommonResult> getCommentPage(@Valid AppCommentPageReqVO pageVO) { - // 查询评论分页 - PageResult commentPageResult = productCommentService.getCommentPage(pageVO, Boolean.TRUE); - if (CollUtil.isEmpty(commentPageResult.getList())) { - return success(PageResult.empty(commentPageResult.getTotal())); - } - - // 拼接返回 - Set skuIds = convertSet(commentPageResult.getList(), ProductCommentDO::getSkuId); - PageResult commentVOPageResult = ProductCommentConvert.INSTANCE.convertPage02( - commentPageResult, productSkuService.getSkuList(skuIds)); - return success(commentVOPageResult); - } - - // TODO 芋艿:需要搞下 - @GetMapping("/statistics") - @Operation(summary = "获得商品的评价统计") - public CommonResult getCommentStatistics(@Valid @RequestParam("spuId") Long spuId) { - return success(productCommentService.getCommentStatistics(spuId, Boolean.TRUE)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentPageReqVO.java deleted file mode 100644 index 34b3f13a..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentPageReqVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.product.controller.app.comment.vo; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 商品评价分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppCommentPageReqVO extends PageParam { - - /** - * 好评 - */ - public static final Integer GOOD_COMMENT = 1; - /** - * 中评 - */ - public static final Integer MEDIOCRE_COMMENT = 2; - /** - * 差评 - */ - public static final Integer NEGATIVE_COMMENT = 3; - - @Schema(description = "商品SPU编号", example = "29502") - @NotNull(message = "商品SPU编号不能为空") - private Long spuId; - - @Schema(description = "app 评论页 tab 类型 (0 全部、1 好评、2 中评、3 差评)", example = "0") - @NotNull(message = "商品SPU编号不能为空") - private Integer type; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentStatisticsRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentStatisticsRespVO.java deleted file mode 100644 index 09164320..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppCommentStatisticsRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.product.controller.app.comment.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "APP - 商品评价页评论分类数统计 Response VO") -@Data -@ToString(callSuper = true) -public class AppCommentStatisticsRespVO { - - @Schema(description = "好评数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721") - private Long goodCount; - - @Schema(description = "中评数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721") - private Long mediocreCount; - - @Schema(description = "差评数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721") - private Long negativeCount; - - @Schema(description = "总平均分", requiredMode = Schema.RequiredMode.REQUIRED, example = "3.55") - private Double scores; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppProductCommentRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppProductCommentRespVO.java deleted file mode 100644 index 11daef1c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/comment/vo/AppProductCommentRespVO.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.win.module.product.controller.app.comment.vo; - -import com.win.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "用户 App - 商品评价详情 Response VO") -@Data -@ToString(callSuper = true) -public class AppProductCommentRespVO { - - @Schema(description = "评价人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721") - private Long userId; - - @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - private String userNickname; - - @Schema(description = "评价人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - private String userAvatar; - - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24965") - private Long id; - - @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean anonymous; - - @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24428") - private Long orderId; - - @Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8233") - private Long orderItemId; - - @Schema(description = "商家是否回复", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean replyStatus; - - @Schema(description = "回复管理员编号", example = "22212") - private Long replyUserId; - - @Schema(description = "商家回复内容", example = "亲,你的好评就是我的动力(*^▽^*)") - private String replyContent; - - @Schema(description = "商家回复时间") - private LocalDateTime replyTime; - - @Schema(description = "追加评价内容", example = "穿了很久都很丝滑诶") - private String additionalContent; - - @Schema(description = "追评评价图片地址数组,以逗号分隔最多上传 9 张", example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") - private List additionalPicUrls; - - @Schema(description = "追加评价时间") - private LocalDateTime additionalTime; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "91192") - @NotNull(message = "商品 SPU 编号不能为空") - private Long spuId; - - @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑小短袖") - @NotNull(message = "商品 SPU 名称不能为空") - private String spuName; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "81192") - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - @Schema(description = "商品 SKU 属性", requiredMode = Schema.RequiredMode.REQUIRED) - private List skuProperties; - - @Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "评分星级 1-5 分不能为空") - private Integer scores; - - @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "描述星级 1-5 分不能为空") - private Integer descriptionScores; - - @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "服务星级 1-5 分不能为空") - private Integer benefitScores; - - @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "哇,真的很丝滑凉快诶,好评") - @NotNull(message = "评论内容不能为空") - private String content; - - @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png]") - @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张") - private List picUrls; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/AppFavoriteController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/AppFavoriteController.java deleted file mode 100644 index af6af04c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/AppFavoriteController.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.win.module.product.controller.app.favorite; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.product.controller.app.favorite.vo.AppFavoriteBatchReqVO; -import com.win.module.product.controller.app.favorite.vo.AppFavoritePageReqVO; -import com.win.module.product.controller.app.favorite.vo.AppFavoriteReqVO; -import com.win.module.product.controller.app.favorite.vo.AppFavoriteRespVO; -import com.win.module.product.convert.favorite.ProductFavoriteConvert; -import com.win.module.product.dal.dataobject.favorite.ProductFavoriteDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.service.favorite.ProductFavoriteService; -import com.win.module.product.service.spu.ProductSpuService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 APP - 商品收藏") -@RestController -@RequestMapping("/product/favorite") -public class AppFavoriteController { - - @Resource - private ProductFavoriteService productFavoriteService; - @Resource - private ProductSpuService productSpuService; - - @PostMapping(value = "/create") - @Operation(summary = "添加商品收藏") - @PreAuthenticated - public CommonResult createFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { - return success(productFavoriteService.createFavorite(getLoginUserId(), reqVO.getSpuId())); - } - - @PostMapping(value = "/create-list") - @Operation(summary = "添加多个商品收藏") - @PreAuthenticated - public CommonResult createFavoriteList(@RequestBody @Valid AppFavoriteBatchReqVO reqVO) { - // todo @jason:待实现;如果有已经收藏的,不用报错,忽略即可; - return success(true); - } - - @DeleteMapping(value = "/delete") - @Operation(summary = "取消单个商品收藏") - @PreAuthenticated - public CommonResult deleteFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { - productFavoriteService.deleteFavorite(getLoginUserId(), reqVO.getSpuId()); - return success(Boolean.TRUE); - } - - @DeleteMapping(value = "/delete-list") - @Operation(summary = "取消多个商品收藏") - @PreAuthenticated - public CommonResult deleteFavoriteList(@RequestBody @Valid AppFavoriteBatchReqVO reqVO) { - // todo @jason:待实现 -// productFavoriteService.deleteFavorite(getLoginUserId(), reqVO.getSpuId()); - return success(Boolean.TRUE); - } - - @GetMapping(value = "/page") - @Operation(summary = "获得商品收藏分页") - @PreAuthenticated - public CommonResult> getFavoritePage(AppFavoritePageReqVO reqVO) { - PageResult favoritePage = productFavoriteService.getFavoritePage(getLoginUserId(), reqVO); - if (CollUtil.isEmpty(favoritePage.getList())) { - return success(PageResult.empty()); - } - - // 得到商品 spu 信息 - List favorites = favoritePage.getList(); - List spuIds = convertList(favorites, ProductFavoriteDO::getSpuId); - List spus = productSpuService.getSpuList(spuIds); - - // 转换 VO 结果 - PageResult pageResult = new PageResult<>(favoritePage.getTotal()); - pageResult.setList(ProductFavoriteConvert.INSTANCE.convertList(favorites, spus)); - return success(pageResult); - } - - @GetMapping(value = "/exits") - @Operation(summary = "检查是否收藏过商品") - @PreAuthenticated - public CommonResult isFavoriteExists(AppFavoriteReqVO reqVO) { - ProductFavoriteDO favorite = productFavoriteService.getFavorite(getLoginUserId(), reqVO.getSpuId()); - return success(favorite != null); - } - - @GetMapping(value = "/get-count") - @Operation(summary = "获得商品收藏数量") - @PreAuthenticated - public CommonResult getFavoriteCount() { - return success(productFavoriteService.getFavoriteCount(getLoginUserId())); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteBatchReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteBatchReqVO.java deleted file mode 100644 index 27e161d1..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteBatchReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.product.controller.app.favorite.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import java.util.List; - -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -@Schema(description = "用户 APP - 商品收藏的批量 Request VO") // 用于收藏、取消收藏、获取收藏 -@Data -public class AppFavoriteBatchReqVO { - - @Schema(description = "商品 SPU 编号数组", requiredMode = REQUIRED, example = "29502") - @NotEmpty(message = "商品 SPU 编号数组不能为空") - private List spuIds; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoritePageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoritePageReqVO.java deleted file mode 100644 index d6474e14..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoritePageReqVO.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.win.module.product.controller.app.favorite.vo; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 商品收藏分页查询 Request VO") -@Data -public class AppFavoritePageReqVO extends PageParam { -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java deleted file mode 100644 index 4ea038ab..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.product.controller.app.favorite.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -@Schema(description = "用户 APP - 商品收藏的单个 Request VO") // 用于收藏、取消收藏、获取收藏 -@Data -public class AppFavoriteReqVO { - - @Schema(description = "商品 SPU 编号", requiredMode = REQUIRED, example = "29502") - @NotNull(message = "商品 SPU 编号不能为空") - private Long spuId; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteRespVO.java deleted file mode 100644 index 72b019be..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/favorite/vo/AppFavoriteRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.product.controller.app.favorite.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -@Schema(description = "用户 App - 商品收藏 Response VO") -@Data -public class AppFavoriteRespVO { - - @Schema(description = "编号", requiredMode = REQUIRED, example = "1") - private Long id; - - @Schema(description = "商品 SPU 编号", requiredMode = REQUIRED, example = "29502") - private Long spuId; - - // ========== 商品相关字段 ========== - - @Schema(description = "商品 SPU 名称", example = "赵六") - private String spuName; - - @Schema(description = "商品封面图", example = "https://domain/pic.png") - private String picUrl; - - @Schema(description = "商品单价", example = "100") - private Integer price; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/package-info.java deleted file mode 100644 index b106ba0e..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位符,无时间作用,避免 package 缩进 - */ -package com.win.module.product.controller.app.property; diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/property/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/property/package-info.java deleted file mode 100644 index 4d227d23..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/property/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位符,无时间作用,避免 package 缩进 - */ -package com.win.module.product.controller.app.property.vo.property; diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/value/AppProductPropertyValueDetailRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/value/AppProductPropertyValueDetailRespVO.java deleted file mode 100644 index 4c453706..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/property/vo/value/AppProductPropertyValueDetailRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.product.controller.app.property.vo.value; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 商品属性值的明细 Response VO") -@Data -public class AppProductPropertyValueDetailRespVO { - - @Schema(description = "属性的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long propertyId; - - @Schema(description = "属性的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") - private String propertyName; - - @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long valueId; - - @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") - private String valueName; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.http b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.http deleted file mode 100644 index c391b587..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.http +++ /dev/null @@ -1,18 +0,0 @@ -### 获得订单交易的分页(默认) -GET {{appApi}}/product/spu/page?pageNo=1&pageSize=10 -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### 获得订单交易的分页(价格) -GET {{appApi}}/product/spu/page?pageNo=1&pageSize=10&sortField=price&sortAsc=true -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### 获得订单交易的分页(销售) -GET {{appApi}}/product/spu/page?pageNo=1&pageSize=10&sortField=salesCount&sortAsc=true -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### 获得商品 SPU 明细 -GET {{appApi}}/product/spu/get-detail?id=102 -tenant-id: {{appTenentId}} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.java deleted file mode 100644 index 34cf6938..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/AppProductSpuController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.win.module.product.controller.app.spu; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageRespVO; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; -import com.win.module.product.convert.spu.ProductSpuConvert; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.product.service.sku.ProductSkuService; -import com.win.module.product.service.spu.ProductSpuService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.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; -import javax.validation.Valid; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.module.product.enums.ErrorCodeConstants.SPU_NOT_ENABLE; -import static com.win.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; - -@Tag(name = "用户 APP - 商品 SPU") -@RestController -@RequestMapping("/product/spu") -@Validated -public class AppProductSpuController { - - @Resource - private ProductSpuService productSpuService; - @Resource - private ProductSkuService productSkuService; - - @GetMapping("/list") - @Operation(summary = "获得商品 SPU 列表") - @Parameters({ - @Parameter(name = "recommendType", description = "推荐类型", required = true), // 参见 AppProductSpuPageReqVO.RECOMMEND_TYPE_XXX 常量 - @Parameter(name = "count", description = "数量", required = true) - }) - public CommonResult> getSpuList( - @RequestParam("recommendType") String recommendType, - @RequestParam(value = "count", defaultValue = "10") Integer count) { - List list = productSpuService.getSpuList(recommendType, count); - return success(ProductSpuConvert.INSTANCE.convertListForGetSpuList(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得商品 SPU 分页") - public CommonResult> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) { - PageResult pageResult = productSpuService.getSpuPage(pageVO); - return success(ProductSpuConvert.INSTANCE.convertPageForGetSpuPage(pageResult)); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得商品 SPU 明细") - @Parameter(name = "id", description = "编号", required = true) - public CommonResult getSpuDetail(@RequestParam("id") Long id) { - // 获得商品 SPU - ProductSpuDO spu = productSpuService.getSpu(id); - if (spu == null) { - throw exception(SPU_NOT_EXISTS); - } - if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) { - throw exception(SPU_NOT_ENABLE); - } - - // 查询商品 SKU - List skus = productSkuService.getSkuListBySpuId(spu.getId()); - // 拼接 - return success(ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuDetailRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuDetailRespVO.java deleted file mode 100644 index 0aa49c12..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuDetailRespVO.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.win.module.product.controller.app.spu.vo; - -import com.win.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 商品 SPU 明细 Response VO") -@Data -public class AppProductSpuDetailRespVO { - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - // ========== 基本信息 ========= - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") - private String name; - - @Schema(description = "商品简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是一个快乐简介") - private String introduction; - - @Schema(description = "商品详情", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是商品描述") - private String description; - - @Schema(description = "商品分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long categoryId; - - @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED) - private String picUrl; - - @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED) - private List sliderPicUrls; - - @Schema(description = "商品视频", requiredMode = Schema.RequiredMode.REQUIRED) - private String videoUrl; - - @Schema(description = "单位名", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") - private String unitName; - - // ========== 营销相关字段 ========= - - @Schema(description = "活动排序数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private List activityOrders; - - // ========== SKU 相关字段 ========= - - @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean specType; - - @Schema(description = "商品价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer price; - - @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer marketPrice; - - @Schema(description = "VIP 价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "968") // 通过会员等级,计算出折扣后价格 - private Integer vipPrice; - - @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") - private Integer stock; - - /** - * SKU 数组 - */ - private List skus; - - // ========== 统计相关字段 ========= - - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer salesCount; - - @Schema(description = "用户 App - 商品 SPU 明细的 SKU 信息") - @Data - public static class Sku { - - @Schema(description = "商品 SKU 编号", example = "1") - private Long id; - - /** - * 商品属性数组 - */ - private List properties; - - @Schema(description = "销售价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer price; - - @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer marketPrice; - - @Schema(description = "VIP 价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "968") // 通过会员等级,计算出折扣后价格 - private Integer vipPrice; - - @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - private String picUrl; - - @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer stock; - - @Schema(description = "商品重量", example = "1") // 单位:kg 千克 - private Double weight; - - @Schema(description = "商品体积", example = "1024") // 单位:m^3 平米 - private Double volume; - - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageReqVO.java deleted file mode 100644 index a9fe693c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageReqVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.product.controller.app.spu.vo; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageParam; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.AssertTrue; - -@Schema(description = "用户 App - 商品 SPU 分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppProductSpuPageReqVO extends PageParam { - - public static final String SORT_FIELD_PRICE = "price"; - public static final String SORT_FIELD_SALES_COUNT = "salesCount"; - - public static final String RECOMMEND_TYPE_HOT = "hot"; - public static final String RECOMMEND_TYPE_BENEFIT = "benefit"; - public static final String RECOMMEND_TYPE_BEST = "best"; - public static final String RECOMMEND_TYPE_NEW = "new"; - public static final String RECOMMEND_TYPE_GOOD = "good"; - - @Schema(description = "分类编号", example = "1") - private Long categoryId; - - @Schema(description = "关键字", example = "好看") - private String keyword; - - @Schema(description = "排序字段", example = "price") // 参见 AppProductSpuPageReqVO.SORT_FIELD_XXX 常量 - private String sortField; - - @Schema(description = "排序方式", example = "true") - private Boolean sortAsc; - - @Schema(description = "推荐类型", example = "hot") // 参见 AppProductSpuPageReqVO.RECOMMEND_TYPE_XXX 常量 - private String recommendType; - - @AssertTrue(message = "排序字段不合法") - @JsonIgnore - public boolean isSortFieldValid() { - if (StrUtil.isEmpty(sortField)) { - return true; - } - return StrUtil.equalsAny(sortField, SORT_FIELD_PRICE, SORT_FIELD_SALES_COUNT); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageRespVO.java deleted file mode 100644 index 2531477f..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/app/spu/vo/AppProductSpuPageRespVO.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.product.controller.app.spu.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 商品 SPU Response VO") -@Data -public class AppProductSpuPageRespVO { - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") - private String name; - - @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED) - private Long categoryId; - - @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED) - private String picUrl; - - @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED) - private List sliderPicUrls; - - @Schema(description = "单位名", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") - private String unitName; - - // ========== SKU 相关字段 ========= - - @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean specType; - - @Schema(description = "商品价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer price; - - @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer marketPrice; - - @Schema(description = "VIP 价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "968") // 通过会员等级,计算出折扣后价格 - private Integer vipPrice; - - @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") - private Integer stock; - - // ========== 营销相关字段 ========= - - @Schema(description = "活动排序数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private List activityOrders; - - // ========== 统计相关字段 ========= - - @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer salesCount; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/brand/ProductBrandConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/brand/ProductBrandConvert.java deleted file mode 100644 index aff02f5c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/brand/ProductBrandConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.product.convert.brand; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandRespVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandSimpleRespVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 品牌 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface ProductBrandConvert { - - ProductBrandConvert INSTANCE = Mappers.getMapper(ProductBrandConvert.class); - - ProductBrandDO convert(ProductBrandCreateReqVO bean); - - ProductBrandDO convert(ProductBrandUpdateReqVO bean); - - ProductBrandRespVO convert(ProductBrandDO bean); - - List convertList1(List list); - - List convertList(List list); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/category/ProductCategoryConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/category/ProductCategoryConvert.java deleted file mode 100644 index 440065f4..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/category/ProductCategoryConvert.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.product.convert.category; - -import com.win.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryRespVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; -import com.win.module.product.controller.app.category.vo.AppCategoryRespVO; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 商品分类 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface ProductCategoryConvert { - - ProductCategoryConvert INSTANCE = Mappers.getMapper(ProductCategoryConvert.class); - - ProductCategoryDO convert(ProductCategoryCreateReqVO bean); - - ProductCategoryDO convert(ProductCategoryUpdateReqVO bean); - - ProductCategoryRespVO convert(ProductCategoryDO bean); - - List convertList(List list); - - List convertList03(List list); -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/comment/ProductCommentConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/comment/ProductCommentConvert.java deleted file mode 100644 index 152d090c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/comment/ProductCommentConvert.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.win.module.product.convert.comment; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentRespVO; -import com.win.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; -import com.win.module.product.controller.app.comment.vo.AppProductCommentRespVO; -import com.win.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.MapUtils.findAndThen; - -/** - * 商品评价 Convert - * - * @author wangzhs - */ -@Mapper -public interface ProductCommentConvert { - - ProductCommentConvert INSTANCE = Mappers.getMapper(ProductCommentConvert.class); - - ProductCommentRespVO convert(ProductCommentDO bean); - - @Mapping(target = "scores", expression = "java(calculateOverallScore(goodCount, mediocreCount, negativeCount))") - AppCommentStatisticsRespVO convert(Long goodCount, Long mediocreCount, Long negativeCount); - - @Named("calculateOverallScore") - default double calculateOverallScore(long goodCount, long mediocreCount, long negativeCount) { - return (goodCount * 5 + mediocreCount * 3 + negativeCount) / (double) (goodCount + mediocreCount + negativeCount); - } - - List convertList(List list); - - PageResult convertPage(PageResult page); - - PageResult convertPage01(PageResult pageResult); - - default PageResult convertPage02(PageResult pageResult, - List skuList) { - Map skuMap = CollectionUtils.convertMap(skuList, ProductSkuDO::getId); - PageResult page = convertPage01(pageResult); - page.getList().forEach(item -> { - // 判断用户是否选择匿名 - if (ObjectUtil.equal(item.getAnonymous(), true)) { - item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS); - } - // 设置 SKU 规格值 - findAndThen(skuMap, item.getSkuId(), - sku -> item.setSkuProperties(convertList01(sku.getProperties()))); - }); - return page; - } - - List convertList01(List properties); - - /** - * 计算综合评分 - * - * @param descriptionScores 描述星级 - * @param benefitScores 服务星级 - * @return 综合评分 - */ - @Named("convertScores") - default Integer convertScores(Integer descriptionScores, Integer benefitScores) { - // 计算评价最终综合评分 最终星数 = (商品评星 + 服务评星) / 2 - BigDecimal sumScore = new BigDecimal(descriptionScores + benefitScores); - BigDecimal divide = sumScore.divide(BigDecimal.valueOf(2L), 0, RoundingMode.DOWN); - return divide.intValue(); - } - - ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO); - - @Mapping(target = "scores", - expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))") - default ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, ProductSpuDO spuDO, ProductSkuDO skuDO, MemberUserRespDTO user) { - ProductCommentDO commentDO = convert(createReqDTO); - if (user != null) { - commentDO.setUserId(user.getId()); - commentDO.setUserNickname(user.getNickname()); - commentDO.setUserAvatar(user.getAvatar()); - } - if (spuDO != null) { - commentDO.setSpuId(spuDO.getId()); - commentDO.setSpuName(spuDO.getName()); - } - if (skuDO != null) { - commentDO.setSkuPicUrl(skuDO.getPicUrl()); - commentDO.setSkuProperties(skuDO.getProperties()); - } - return commentDO; - } - - @Mapping(target = "visible", constant = "true") - @Mapping(target = "replyStatus", constant = "false") - @Mapping(target = "userId", constant = "0L") - @Mapping(target = "orderId", constant = "0L") - @Mapping(target = "orderItemId", constant = "0L") - @Mapping(target = "anonymous", expression = "java(Boolean.FALSE)") - @Mapping(target = "scores", - expression = "java(convertScores(createReq.getDescriptionScores(), createReq.getBenefitScores()))") - ProductCommentDO convert(ProductCommentCreateReqVO createReq); - - List convertList02(List list); - - default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spu, ProductSkuDO sku) { - ProductCommentDO commentDO = convert(createReq); - if (spu != null) { - commentDO.setSpuId(spu.getId()).setSpuName(spu.getName()); - } - if (sku != null) { - commentDO.setSkuPicUrl(sku.getPicUrl()).setSkuProperties(sku.getProperties()); - } - return commentDO; - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/favorite/ProductFavoriteConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/favorite/ProductFavoriteConvert.java deleted file mode 100644 index 8190d196..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/favorite/ProductFavoriteConvert.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.product.convert.favorite; - -import com.win.module.product.controller.app.favorite.vo.AppFavoriteRespVO; -import com.win.module.product.dal.dataobject.favorite.ProductFavoriteDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -@Mapper -public interface ProductFavoriteConvert { - - ProductFavoriteConvert INSTANCE = Mappers.getMapper(ProductFavoriteConvert.class); - - ProductFavoriteDO convert(Long userId, Long spuId); - - @Mapping(target = "id", source = "favorite.id") - @Mapping(target = "spuName", source = "spu.name") - AppFavoriteRespVO convert(ProductSpuDO spu, ProductFavoriteDO favorite); - - default List convertList(List favorites, List spus) { - List resultList = new ArrayList<>(favorites.size()); - Map spuMap = convertMap(spus, ProductSpuDO::getId); - for (ProductFavoriteDO favorite : favorites) { - ProductSpuDO spuDO = spuMap.get(favorite.getSpuId()); - resultList.add(convert(spuDO, favorite)); - } - return resultList; - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/property/ProductPropertyConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/property/ProductPropertyConvert.java deleted file mode 100644 index da344a14..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/property/ProductPropertyConvert.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.product.convert.property; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyAndValueRespVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyCreateReqVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyRespVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyUpdateReqVO; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.pojo.CommonResult.success; - -/** - * 属性项 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface ProductPropertyConvert { - - ProductPropertyConvert INSTANCE = Mappers.getMapper(ProductPropertyConvert.class); - - ProductPropertyDO convert(ProductPropertyCreateReqVO bean); - - ProductPropertyDO convert(ProductPropertyUpdateReqVO bean); - - ProductPropertyRespVO convert(ProductPropertyDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default List convertList(List keys, List values) { - Map> valueMap = CollectionUtils.convertMultiMap(values, ProductPropertyValueDO::getPropertyId); - return CollectionUtils.convertList(keys, key -> { - ProductPropertyAndValueRespVO respVO = convert02(key); - // 如果属性值为空value不为null,返回空列表 - if (CollUtil.isEmpty(values)) { - respVO.setValues(Collections.emptyList()); - }else { - respVO.setValues(convertList02(valueMap.get(key.getId()))); - } - return respVO; - }); - } - ProductPropertyAndValueRespVO convert02(ProductPropertyDO bean); - List convertList02(List list); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/propertyvalue/ProductPropertyValueConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/propertyvalue/ProductPropertyValueConvert.java deleted file mode 100644 index 3eabc2d2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/propertyvalue/ProductPropertyValueConvert.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.product.convert.propertyvalue; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import com.win.module.product.service.property.bo.ProductPropertyValueDetailRespBO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 属性值 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface ProductPropertyValueConvert { - - ProductPropertyValueConvert INSTANCE = Mappers.getMapper(ProductPropertyValueConvert.class); - - ProductPropertyValueDO convert(ProductPropertyValueCreateReqVO bean); - - ProductPropertyValueDO convert(ProductPropertyValueUpdateReqVO bean); - - ProductPropertyValueRespVO convert(ProductPropertyValueDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default List convertList(List values, List keys) { - Map keyMap = convertMap(keys, ProductPropertyDO::getId); - return CollectionUtils.convertList(values, value -> { - ProductPropertyValueDetailRespBO valueDetail = new ProductPropertyValueDetailRespBO() - .setValueId(value.getId()).setValueName(value.getName()); - // 设置属性项 - MapUtils.findAndThen(keyMap, value.getPropertyId(), - key -> valueDetail.setPropertyId(key.getId()).setPropertyName(key.getName())); - return valueDetail; - }); - } - - List convertList02(List list); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/sku/ProductSkuConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/sku/ProductSkuConvert.java deleted file mode 100644 index 2e6dea5c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/sku/ProductSkuConvert.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.win.module.product.convert.sku; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuRespVO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 商品 SKU Convert - * - * @author 芋道源码 - */ -@Mapper -public interface ProductSkuConvert { - - ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class); - - ProductSkuDO convert(ProductSkuCreateOrUpdateReqVO bean); - - ProductSkuRespVO convert(ProductSkuDO bean); - - List convertList(List list); - - List convertList06(List list); - - default List convertList06(List list, Long spuId) { - List result = convertList06(list); - result.forEach(item -> item.setSpuId(spuId)); - return result; - } - - ProductSkuRespDTO convert02(ProductSkuDO bean); - - List convertList04(List list); - - /** - * 获得 SPU 的库存变化 Map - * - * @param items SKU 库存变化 - * @param skus SKU 列表 - * @return SPU 的库存变化 Map - */ - default Map convertSpuStockMap(List items, - List skus) { - Map skuIdAndSpuIdMap = convertMap(skus, ProductSkuDO::getId, ProductSkuDO::getSpuId); // SKU 与 SKU 编号的 Map 关系 - Map spuIdAndStockMap = new HashMap<>(); // SPU 的库存变化 Map 关系 - items.forEach(item -> { - Long spuId = skuIdAndSpuIdMap.get(item.getId()); - if (spuId == null) { - return; - } - Integer stock = spuIdAndStockMap.getOrDefault(spuId, 0) + item.getIncrCount(); - spuIdAndStockMap.put(spuId, stock); - }); - return spuIdAndStockMap; - } - - default String buildPropertyKey(ProductSkuDO bean) { - if (CollUtil.isEmpty(bean.getProperties())) { - return StrUtil.EMPTY; - } - List properties = new ArrayList<>(bean.getProperties()); - properties.sort(Comparator.comparing(ProductSkuDO.Property::getValueId)); - return properties.stream().map(m -> String.valueOf(m.getValueId())).collect(Collectors.joining()); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/spu/ProductSpuConvert.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/spu/ProductSpuConvert.java deleted file mode 100644 index 2fe03c7b..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/convert/spu/ProductSpuConvert.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.win.module.product.convert.spu; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.dict.core.util.DictFrameworkUtils; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.product.controller.admin.spu.vo.*; -import com.win.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageRespVO; -import com.win.module.product.convert.sku.ProductSkuConvert; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.enums.DictTypeConstants; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static cn.hutool.core.util.ObjectUtil.defaultIfNull; -import static com.win.framework.common.util.collection.CollectionUtils.convertMultiMap; - -/** - * 商品 SPU Convert - * - * @author 芋道源码 - */ -@Mapper -public interface ProductSpuConvert { - - ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class); - - ProductSpuDO convert(ProductSpuCreateReqVO bean); - - ProductSpuDO convert(ProductSpuUpdateReqVO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - ProductSpuPageReqVO convert(AppProductSpuPageReqVO bean); - - List convertList2(List list); - - List convertList02(List list); - - @Mapping(target = "price", expression = "java(spu.getPrice() / 100)") - @Mapping(target = "marketPrice", expression = "java(spu.getMarketPrice() / 100)") - @Mapping(target = "costPrice", expression = "java(spu.getCostPrice() / 100)") - ProductSpuExcelVO convert(ProductSpuDO spu); - - default List convertList03(List list) { - List spuExcelVOs = new ArrayList<>(); - list.forEach(spu -> { - ProductSpuExcelVO spuExcelVO = convert(spu); - spuExcelVOs.add(spuExcelVO); - }); - return spuExcelVOs; - } - - ProductSpuDetailRespVO convert03(ProductSpuDO spu); - - ProductSpuRespDTO convert02(ProductSpuDO bean); - - // ========== 用户 App 相关 ========== - - PageResult convertPageForGetSpuPage(PageResult page); - - default List convertListForGetSpuList(List list) { - // 处理虚拟销量 - list.forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); - // 处理 VO 字段 - List voList = convertListForGetSpuList0(list); - for (int i = 0; i < list.size(); i++) { - ProductSpuDO spu = list.get(i); - AppProductSpuPageRespVO spuVO = voList.get(i); - spuVO.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit())); - // 计算 vip 价格 TODO 芋艿:临时的逻辑,等 vip 支持后 - spuVO.setVipPrice((int) (spuVO.getPrice() * 0.9)); - } - return voList; - } - - @Named("convertListForGetSpuList0") - List convertListForGetSpuList0(List list); - - default AppProductSpuDetailRespVO convertForGetSpuDetail(ProductSpuDO spu, List skus) { - // 处理 SPU - AppProductSpuDetailRespVO spuVO = convertForGetSpuDetail(spu) - .setSalesCount(spu.getSalesCount() + defaultIfNull(spu.getVirtualSalesCount(), 0)) - .setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit())); - // 处理 SKU - spuVO.setSkus(convertListForGetSpuDetail(skus)); - // 计算 vip 价格 TODO 芋艿:临时的逻辑,等 vip 支持后 - if (true) { - spuVO.setVipPrice((int) (spuVO.getPrice() * 0.9)); - spuVO.getSkus().forEach(sku -> sku.setVipPrice((int) (sku.getPrice() * 0.9))); - } - return spuVO; - } - - AppProductSpuDetailRespVO convertForGetSpuDetail(ProductSpuDO spu); - - List convertListForGetSpuDetail(List skus); - - default ProductSpuDetailRespVO convertForSpuDetailRespVO(ProductSpuDO spu, List skus) { - ProductSpuDetailRespVO detailRespVO = convert03(spu); - detailRespVO.setSkus(ProductSkuConvert.INSTANCE.convertList(skus)); - return detailRespVO; - } - - default List convertForSpuDetailRespListVO(List spus, List skus) { - Map> skuMultiMap = convertMultiMap(skus, ProductSkuDO::getSpuId); - return CollectionUtils.convertList(spus, spu -> convert03(spu) - .setSkus(ProductSkuConvert.INSTANCE.convertList(skuMultiMap.get(spu.getId())))); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/brand/ProductBrandDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/brand/ProductBrandDO.java deleted file mode 100644 index 39d036b9..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/brand/ProductBrandDO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.product.dal.dataobject.brand; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 商品品牌 DO - * - * @author 芋道源码 - */ -@TableName("product_brand") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductBrandDO extends BaseDO { - - /** - * 品牌编号 - */ - @TableId - private Long id; - /** - * 品牌名称 - */ - private String name; - /** - * 品牌图片 - */ - private String picUrl; - /** - * 品牌排序 - */ - private Integer sort; - /** - * 品牌描述 - */ - private String description; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - - // TODO 芋艿:firstLetter 首字母 - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/category/ProductCategoryDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/category/ProductCategoryDO.java deleted file mode 100644 index 8a142c58..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/category/ProductCategoryDO.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.win.module.product.dal.dataobject.category; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 商品分类 DO - * - * @author 芋道源码 - */ -@TableName("product_category") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductCategoryDO extends BaseDO { - - /** - * 父分类编号 - 根分类 - */ - public static final Long PARENT_ID_NULL = 0L; - /** - * 限定分类层级 - */ - public static final int CATEGORY_LEVEL = 2; - - /** - * 分类编号 - */ - @TableId - private Long id; - /** - * 父分类编号 - */ - private Long parentId; - /** - * 分类名称 - */ - private String name; - /** - * 移动端分类图 - * - * 建议 180*180 分辨率 - */ - private String picUrl; - /** - * PC 端分类图 - * - * 建议 468*340 分辨率 - */ - private String bigPicUrl; - /** - * 分类排序 - */ - private Integer sort; - /** - * 开启状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/comment/ProductCommentDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/comment/ProductCommentDO.java deleted file mode 100644 index 19ab3c2a..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/comment/ProductCommentDO.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.win.module.product.dal.dataobject.comment; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -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 com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 商品评论 DO - * - * @author 芋道源码 - */ -@TableName(value = "product_comment", autoResultMap = true) -@KeySequence("product_comment_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductCommentDO extends BaseDO { - - /** - * 默认匿名昵称 - */ - public static final String NICKNAME_ANONYMOUS = "匿名用户"; - - /** - * 评论编号,主键自增 - */ - @TableId - private Long id; - - /** - * 评价人的用户编号 - * - * 关联 MemberUserDO 的 id 编号 - */ - private Long userId; - /** - * 评价人名称 - */ - private String userNickname; - /** - * 评价人头像 - */ - private String userAvatar; - /** - * 是否匿名 - */ - private Boolean anonymous; - - /** - * 交易订单编号 - * - * 关联 TradeOrderDO 的 id 编号 - */ - private Long orderId; - /** - * 交易订单项编号 - * - * 关联 TradeOrderItemDO 的 id 编号 - */ - private Long orderItemId; - - /** - * 商品 SPU 编号 - * - * 关联 {@link ProductSpuDO#getId()} - */ - private Long spuId; - /** - * 商品 SPU 名称 - * - * 关联 {@link ProductSpuDO#getName()} - */ - private String spuName; - /** - * 商品 SKU 编号 - * - * 关联 {@link ProductSkuDO#getId()} - */ - private Long skuId; - /** - * 商品 SKU 图片地址 - * - * 关联 {@link ProductSkuDO#getPicUrl()} - */ - private String skuPicUrl; - /** - * 属性数组,JSON 格式 - * - * 关联 {@link ProductSkuDO#getProperties()} - */ - @TableField(typeHandler = ProductSkuDO.PropertyTypeHandler.class) - private List skuProperties; - - /** - * 是否可见 - * - * true:显示 - * false:隐藏 - */ - private Boolean visible; - /** - * 评分星级 - * - * 1-5 分 - */ - private Integer scores; - /** - * 描述星级 - * - * 1-5 星 - */ - private Integer descriptionScores; - /** - * 服务星级 - * - * 1-5 星 - */ - private Integer benefitScores; - /** - * 评论内容 - */ - private String content; - /** - * 评论图片地址数组 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List picUrls; - - /** - * 商家是否回复 - */ - private Boolean replyStatus; - /** - * 回复管理员编号 - * 关联 AdminUserDO 的 id 编号 - */ - private Long replyUserId; - /** - * 商家回复内容 - */ - private String replyContent; - /** - * 商家回复时间 - */ - private LocalDateTime replyTime; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/favorite/ProductFavoriteDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/favorite/ProductFavoriteDO.java deleted file mode 100644 index e91559d8..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/favorite/ProductFavoriteDO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.product.dal.dataobject.favorite; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 商品收藏 DO - * - * @author 芋道源码 - */ -@TableName("product_favorite") -@KeySequence("product_favorite_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductFavoriteDO extends BaseDO { - - /** - * 编号,主键自增 - */ - @TableId - private Long id; - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 编号 - */ - private Long userId; - /** - * 商品 SPU 编号 - * - * 关联 {@link ProductSpuDO#getId()} - */ - private Long spuId; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyDO.java deleted file mode 100644 index e1bc276f..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyDO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.product.dal.dataobject.property; - -import com.win.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 芋道源码 - */ -@TableName("product_property") -@KeySequence("product_property_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductPropertyDO extends BaseDO { - - /** - * SPU 单规格时,默认属性 id - */ - public static final Long ID_DEFAULT = 0L; - /** - * SPU 单规格时,默认属性名字 - */ - public static final String NAME_DEFAULT = "默认"; - - /** - * 主键 - */ - @TableId - private Long id; - /** - * 名称 - */ - private String name; - /** - * 状态 - */ - private Integer status; - /** - * 备注 - */ - private String remark; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyValueDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyValueDO.java deleted file mode 100644 index f310c618..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/property/ProductPropertyValueDO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.product.dal.dataobject.property; - -import com.win.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 芋道源码 - */ -@TableName("product_property_value") -@KeySequence("product_property_value_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductPropertyValueDO extends BaseDO { - - /** - * SPU 单规格时,默认属性值 id - */ - public static final Long ID_DEFAULT = 0L; - /** - * SPU 单规格时,默认属性值名字 - */ - public static final String NAME_DEFAULT = "默认"; - - /** - * 主键 - */ - @TableId - private Long id; - /** - * 属性项的编号 - * - * 关联 {@link ProductPropertyDO#getId()} - */ - private Long propertyId; - /** - * 名称 - */ - private String name; - /** - * 备注 - * - */ - private String remark; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/sku/ProductSkuDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/sku/ProductSkuDO.java deleted file mode 100644 index 9ebb42f6..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/sku/ProductSkuDO.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.win.module.product.dal.dataobject.sku; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -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 com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; -import lombok.*; - -import java.util.List; - -/** - * 商品 SKU DO - * - * @author 芋道源码 - */ -@TableName(value = "product_sku", autoResultMap = true) -@KeySequence("product_sku_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductSkuDO extends BaseDO { - - /** - * 商品 SKU 编号,自增 - */ - @TableId - private Long id; - /** - * SPU 编号 - * - * 关联 {@link ProductSpuDO#getId()} - */ - private Long spuId; - /** - * 属性数组,JSON 格式 - */ - @TableField(typeHandler = PropertyTypeHandler.class) - private List properties; - /** - * 商品价格,单位:分 - */ - private Integer price; - /** - * 市场价,单位:分 - */ - private Integer marketPrice; - /** - * 成本价,单位:分 - */ - private Integer costPrice; - /** - * 商品条码 - */ - private String barCode; - /** - * 图片地址 - */ - private String picUrl; - /** - * 库存 - */ - private Integer stock; - /** - * 商品重量,单位:kg 千克 - */ - private Double weight; - /** - * 商品体积,单位:m^3 平米 - */ - private Double volume; - - /** - * 一级分销的佣金,单位:分 - */ - private Integer subCommissionFirstPrice; - /** - * 二级分销的佣金,单位:分 - */ - private Integer subCommissionSecondPrice; - - // ========== 营销相关字段 ========= - - // ========== 统计相关字段 ========= - /** - * 商品销量 - */ - private Integer salesCount; - - /** - * 商品属性 - */ - @Data - @NoArgsConstructor - @AllArgsConstructor - public static class Property { - - /** - * 属性编号 - * 关联 {@link ProductPropertyDO#getId()} - */ - private Long propertyId; - /** - * 属性名字 - * 冗余 {@link ProductPropertyDO#getName()} - * - * 注意:每次属性名字发生变化时,需要更新该冗余 - */ - private String propertyName; - - /** - * 属性值编号 - * 关联 {@link ProductPropertyValueDO#getId()} - */ - private Long valueId; - /** - * 属性值名字 - * 冗余 {@link ProductPropertyValueDO#getName()} - * - * 注意:每次属性值名字发生变化时,需要更新该冗余 - */ - private String valueName; - - } - - // TODO @芋艿:可以找一些新的思路 - public static class PropertyTypeHandler extends AbstractJsonTypeHandler { - - @Override - protected Object parse(String json) { - return JsonUtils.parseArray(json, Property.class); - } - - @Override - protected String toJson(Object obj) { - return JsonUtils.toJsonString(obj); - } - - } - - // TODO 芋艿:integral from y - // TODO 芋艿:pinkPrice from y - // TODO 芋艿:seckillPrice from y - // TODO 芋艿:pinkStock from y - // TODO 芋艿:seckillStock from y - -} - diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/spu/ProductSpuDO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/spu/ProductSpuDO.java deleted file mode 100644 index 5c8636dc..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/dataobject/spu/ProductSpuDO.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.win.module.product.dal.dataobject.spu; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -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 com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.List; - -/** - * 商品 SPU DO - * - * @author 芋道源码 - */ -@TableName(value = "product_spu", autoResultMap = true) -@KeySequence("product_spu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProductSpuDO extends BaseDO { - - /** - * 商品 SPU 编号,自增 - */ - @TableId - private Long id; - - // ========== 基本信息 ========= - - /** - * 商品名称 - */ - private String name; - /** - * 关键字 - */ - private String keyword; - /** - * 商品简介 - */ - private String introduction; - /** - * 商品详情 - */ - private String description; - // TODO @芋艿:是不是要删除 - /** - * 商品条码(一维码) - */ - private String barCode; - - /** - * 商品分类编号 - * - * 关联 {@link ProductCategoryDO#getId()} - */ - private Long categoryId; - /** - * 商品品牌编号 - * - * 关联 {@link ProductBrandDO#getId()} - */ - private Long brandId; - /** - * 商品封面图 - */ - private String picUrl; - /** - * 商品轮播图 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List sliderPicUrls; - /** - * 商品视频 - */ - private String videoUrl; - - /** - * 单位 - * - * 对应 product_unit 数据字典 - */ - private Integer unit; - /** - * 排序字段 - */ - private Integer sort; - /** - * 商品状态 - * - * 枚举 {@link ProductSpuStatusEnum} - */ - private Integer status; - - // ========== SKU 相关字段 ========= - - /** - * 规格类型 - * - * false - 单规格 - * true - 多规格 - */ - private Boolean specType; - /** - * 商品价格,单位使用:分 - * - * 基于其对应的 {@link ProductSkuDO#getPrice()} sku单价最低的商品的 - */ - private Integer price; - /** - * 市场价,单位使用:分 - * - * 基于其对应的 {@link ProductSkuDO#getMarketPrice()} sku单价最低的商品的 - */ - private Integer marketPrice; - /** - * 成本价,单位使用:分 - * - * 基于其对应的 {@link ProductSkuDO#getCostPrice()} sku单价最低的商品的 - */ - private Integer costPrice; - /** - * 库存 - * - * 基于其对应的 {@link ProductSkuDO#getStock()} 求和 - */ - private Integer stock; - - // ========== 物流相关字段 ========= - - /** - * 物流配置模板编号 - * - * 对应 TradeDeliveryExpressTemplateDO 的 id 编号 - */ - private Long deliveryTemplateId; - - // ========== 营销相关字段 ========= - /** - * 是否热卖推荐 - */ - private Boolean recommendHot; - /** - * 是否优惠推荐 - */ - private Boolean recommendBenefit; - /** - * 是否精品推荐 - */ - private Boolean recommendBest; - /** - * 是否新品推荐 - */ - private Boolean recommendNew; - /** - * 是否优品推荐 - */ - private Boolean recommendGood; - - /** - * 赠送积分 - */ - private Integer giveIntegral; - /** - * 赠送的优惠劵编号的数组 - * - * 对应 CouponTemplateDO 的 id 属性 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List giveCouponTemplateIds; - - /** - * 分销类型 - * - * false - 默认 - * true - 自行设置 - */ - private Boolean subCommissionType; - - /** - * 活动展示顺序 - * - * 对应 PromotionTypeEnum 枚举 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List activityOrders; - - // ========== 统计相关字段 ========= - - /** - * 商品销量 - */ - private Integer salesCount; - /** - * 虚拟销量 - */ - private Integer virtualSalesCount; - /** - * 浏览量 - */ - private Integer browseCount; -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/brand/ProductBrandMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/brand/ProductBrandMapper.java deleted file mode 100644 index bddf0884..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/brand/ProductBrandMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.product.dal.mysql.brand; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.product.controller.admin.brand.vo.ProductBrandListReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandPageReqVO; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ProductBrandMapper extends BaseMapperX { - - default PageResult selectPage(ProductBrandPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(ProductBrandDO::getName, reqVO.getName()) - .eqIfPresent(ProductBrandDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(ProductBrandDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(ProductBrandDO::getId)); - } - - - default List selectList(ProductBrandListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(ProductBrandDO::getName, reqVO.getName())); - } - - default ProductBrandDO selectByName(String name) { - return selectOne(ProductBrandDO::getName, name); - } - - default List selectListByStatus(Integer status) { - return selectList(ProductBrandDO::getStatus, status); - } -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/category/ProductCategoryMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/category/ProductCategoryMapper.java deleted file mode 100644 index 0f983405..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/category/ProductCategoryMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.product.dal.mysql.category; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 商品分类 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface ProductCategoryMapper extends BaseMapperX { - - default List selectList(ProductCategoryListReqVO listReqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(ProductCategoryDO::getName, listReqVO.getName()) - .eqIfPresent(ProductCategoryDO::getParentId, listReqVO.getParentId()) - .eqIfPresent(ProductCategoryDO::getStatus, listReqVO.getStatus()) - .orderByDesc(ProductCategoryDO::getId)); - } - - default Long selectCountByParentId(Long parentId) { - return selectCount(ProductCategoryDO::getParentId, parentId); - } - - default List selectListByStatus(Integer status) { - return selectList(ProductCategoryDO::getStatus, status); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/comment/ProductCommentMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/comment/ProductCommentMapper.java deleted file mode 100644 index 8dba0134..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/comment/ProductCommentMapper.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.win.module.product.dal.mysql.comment; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.product.controller.admin.comment.vo.ProductCommentPageReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentPageReqVO; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProductCommentMapper extends BaseMapperX { - - default PageResult selectPage(ProductCommentPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(ProductCommentDO::getUserNickname, reqVO.getUserNickname()) - .eqIfPresent(ProductCommentDO::getOrderId, reqVO.getOrderId()) - .eqIfPresent(ProductCommentDO::getSpuId, reqVO.getSpuId()) - .eqIfPresent(ProductCommentDO::getScores, reqVO.getScores()) - .eqIfPresent(ProductCommentDO::getReplyStatus, reqVO.getReplyStatus()) - .betweenIfPresent(ProductCommentDO::getCreateTime, reqVO.getCreateTime()) - .likeIfPresent(ProductCommentDO::getSpuName, reqVO.getSpuName()) - .orderByDesc(ProductCommentDO::getId)); - } - - static void appendTabQuery(LambdaQueryWrapperX queryWrapper, Integer type) { - LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); - // 构建好评查询语句:好评计算 总评 >= 4 - if (ObjectUtil.equal(type, AppCommentPageReqVO.GOOD_COMMENT)) { - queryWrapperX.ge(ProductCommentDO::getScores, 4); - } - // 构建中评查询语句:中评计算 总评 >= 3 且 总评 < 4 - if (ObjectUtil.equal(type, AppCommentPageReqVO.MEDIOCRE_COMMENT)) { - queryWrapperX.ge(ProductCommentDO::getScores, 3); - queryWrapperX.lt(ProductCommentDO::getScores, 4); - } - // 构建差评查询语句:差评计算 总评 < 3 - if (ObjectUtil.equal(type, AppCommentPageReqVO.NEGATIVE_COMMENT)) { - queryWrapperX.lt(ProductCommentDO::getScores, 3); - } - } - - default PageResult selectPage(AppCommentPageReqVO reqVO, Boolean visible) { - LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() - .eqIfPresent(ProductCommentDO::getSpuId, reqVO.getSpuId()) - .eqIfPresent(ProductCommentDO::getVisible, visible); - // 构建评价查询语句 - appendTabQuery(queryWrapper, reqVO.getType()); - // 按评价时间排序最新的显示在前面 - queryWrapper.orderByDesc(ProductCommentDO::getCreateTime); - return selectPage(reqVO, queryWrapper); - } - - default ProductCommentDO selectByUserIdAndOrderItemId(Long userId, Long orderItemId) { - return selectOne(new LambdaQueryWrapperX() - .eq(ProductCommentDO::getUserId, userId) - .eq(ProductCommentDO::getOrderItemId, orderItemId)); - } - - default Long selectCountBySpuId(Long spuId, Boolean visible, Integer type) { - LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() - .eqIfPresent(ProductCommentDO::getSpuId, spuId) - .eqIfPresent(ProductCommentDO::getVisible, visible); - // 构建评价查询语句 - appendTabQuery(queryWrapper, type); - return selectCount(queryWrapper); - } - - default PageResult selectCommentList(Long spuId, Integer count) { - // 构建分页查询条件 - return selectPage(new PageParam().setPageSize(count), new LambdaQueryWrapperX() - .eqIfPresent(ProductCommentDO::getSpuId, spuId) - .orderByDesc(ProductCommentDO::getCreateTime) - ); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/favorite/ProductFavoriteMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/favorite/ProductFavoriteMapper.java deleted file mode 100644 index 9555a3db..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/favorite/ProductFavoriteMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.product.dal.mysql.favorite; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.product.controller.app.favorite.vo.AppFavoritePageReqVO; -import com.win.module.product.dal.dataobject.favorite.ProductFavoriteDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProductFavoriteMapper extends BaseMapperX { - - default ProductFavoriteDO selectByUserIdAndSpuId(Long userId, Long spuId) { - return selectOne(ProductFavoriteDO::getUserId, userId, - ProductFavoriteDO::getSpuId, spuId); - } - - default PageResult selectPageByUserAndType(Long userId, AppFavoritePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapper() - .eq(ProductFavoriteDO::getUserId, userId) - .orderByDesc(ProductFavoriteDO::getId)); - } - - default Long selectCountByUserId(Long userId) { - return selectCount(ProductFavoriteDO::getUserId, userId); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyMapper.java deleted file mode 100644 index 08f314a9..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.product.dal.mysql.property; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyListReqVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyPageReqVO; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ProductPropertyMapper extends BaseMapperX { - - default PageResult selectPage(ProductPropertyPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(ProductPropertyDO::getName, reqVO.getName()) - .betweenIfPresent(ProductPropertyDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(ProductPropertyDO::getId)); - } - - default ProductPropertyDO selectByName(String name) { - return selectOne(ProductPropertyDO::getName, name); - } - - default List selectList(ProductPropertyListReqVO listReqVO) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(ProductPropertyDO::getName, listReqVO.getName())); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyValueMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyValueMapper.java deleted file mode 100644 index fdff8bad..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/property/ProductPropertyValueMapper.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.product.dal.mysql.property; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface ProductPropertyValueMapper extends BaseMapperX { - - default List selectListByPropertyId(Collection propertyIds) { - return selectList(new LambdaQueryWrapperX() - .inIfPresent(ProductPropertyValueDO::getPropertyId, propertyIds)); - } - - default ProductPropertyValueDO selectByName(Long propertyId, String name) { - return selectOne(new LambdaQueryWrapperX() - .eq(ProductPropertyValueDO::getPropertyId, propertyId) - .eq(ProductPropertyValueDO::getName, name)); - } - - default void deleteByPropertyId(Long propertyId) { - delete(new LambdaQueryWrapperX() - .eq(ProductPropertyValueDO::getPropertyId, propertyId)); - } - - default PageResult selectPage(ProductPropertyValuePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(ProductPropertyValueDO::getPropertyId, reqVO.getPropertyId()) - .likeIfPresent(ProductPropertyValueDO::getName, reqVO.getName()) - .orderByDesc(ProductPropertyValueDO::getId)); - } - - default Integer selectCountByPropertyId(Long propertyId) { - return selectCount(ProductPropertyValueDO::getPropertyId, propertyId).intValue(); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/sku/ProductSkuMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/sku/ProductSkuMapper.java deleted file mode 100644 index b292cff2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/sku/ProductSkuMapper.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.product.dal.mysql.sku; - -import cn.hutool.core.lang.Assert; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface ProductSkuMapper extends BaseMapperX { - - default List selectListBySpuId(Long spuId) { - return selectList(ProductSkuDO::getSpuId, spuId); - } - - default List selectListBySpuId(Collection spuIds) { - return selectList(ProductSkuDO::getSpuId, spuIds); - } - - default void deleteBySpuId(Long spuId) { - delete(new LambdaQueryWrapperX().eq(ProductSkuDO::getSpuId, spuId)); - } - - /** - * 更新 SKU 库存(增加) - * - * @param id 编号 - * @param incrCount 增加库存(正数) - */ - default void updateStockIncr(Long id, Integer incrCount) { - Assert.isTrue(incrCount > 0); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" stock = stock + " + incrCount) - .eq(ProductSkuDO::getId, id); - update(null, lambdaUpdateWrapper); - } - - /** - * 更新 SKU 库存(减少) - * - * @param id 编号 - * @param incrCount 减少库存(负数) - * @return 更新条数 - */ - default int updateStockDecr(Long id, Integer incrCount) { - Assert.isTrue(incrCount < 0); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() - .setSql(" stock = stock + " + incrCount) // 负数,所以使用 + 号 - .eq(ProductSkuDO::getId, id) - .ge(ProductSkuDO::getStock, -incrCount); // cas 逻辑 - return update(null, updateWrapper); - } - - default List selectListByAlarmStock() { - return selectList(new QueryWrapper().apply("stock <= warn_stock")); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/spu/ProductSpuMapper.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/spu/ProductSpuMapper.java deleted file mode 100644 index 32d5b828..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/dal/mysql/spu/ProductSpuMapper.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.win.module.product.dal.mysql.spu; - -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.framework.mybatis.core.query.QueryWrapperX; -import com.win.module.product.controller.admin.spu.vo.ProductSpuExportReqVO; -import com.win.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.enums.ProductConstants; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; -import java.util.Objects; -import java.util.Set; - -@Mapper -public interface ProductSpuMapper extends BaseMapperX { - - /** - * 获取商品 SPU 分页列表数据 - * - * @param reqVO 分页请求参数 - * @return 商品 SPU 分页列表数据 - */ - default PageResult selectPage(ProductSpuPageReqVO reqVO) { - Integer tabType = reqVO.getTabType(); - LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() - .likeIfPresent(ProductSpuDO::getName, reqVO.getName()) - .eqIfPresent(ProductSpuDO::getCategoryId, reqVO.getCategoryId()) - .betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(ProductSpuDO::getSort); - appendTabQuery(tabType, queryWrapper); - return selectPage(reqVO, queryWrapper); - } - - /** - * 查询触发警戒库存的 SPU 数量 - * - * @return 触发警戒库存的 SPU 数量 - */ - default Long selectCount() { - LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX<>(); - // 库存小于等于警戒库存 - queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK) - // 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数 - .notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()); - return selectCount(queryWrapper); - } - - /** - * 获得商品 SPU 分页,提供给用户 App 使用 - */ - default PageResult selectPage(AppProductSpuPageReqVO pageReqVO, Set categoryIds) { - LambdaQueryWrapperX query = new LambdaQueryWrapperX() - // 关键字匹配,目前只匹配商品名 - .likeIfPresent(ProductSpuDO::getName, pageReqVO.getKeyword()) - // 分类 - .inIfPresent(ProductSpuDO::getCategoryId, categoryIds); - // 上架状态 且有库存 - query.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()).gt(ProductSpuDO::getStock, 0); - // 推荐类型的过滤条件 - if (ObjUtil.equal(pageReqVO.getRecommendType(), AppProductSpuPageReqVO.RECOMMEND_TYPE_HOT)) { - query.eq(ProductSpuDO::getRecommendHot, true); - } else if (ObjUtil.equal(pageReqVO.getRecommendType(), AppProductSpuPageReqVO.RECOMMEND_TYPE_BENEFIT)) { - query.eq(ProductSpuDO::getRecommendBenefit, true); - } else if (ObjUtil.equal(pageReqVO.getRecommendType(), AppProductSpuPageReqVO.RECOMMEND_TYPE_BEST)) { - query.eq(ProductSpuDO::getRecommendBest, true); - } else if (ObjUtil.equal(pageReqVO.getRecommendType(), AppProductSpuPageReqVO.RECOMMEND_TYPE_NEW)) { - query.eq(ProductSpuDO::getRecommendNew, true); - } else if (ObjUtil.equal(pageReqVO.getRecommendType(), AppProductSpuPageReqVO.RECOMMEND_TYPE_GOOD)) { - query.eq(ProductSpuDO::getRecommendGood, true); - } - - // 排序逻辑 - if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_SALES_COUNT)) { - query.last(String.format(" ORDER BY (sales_count + virtual_sales_count) %s, sort DESC, id DESC", - pageReqVO.getSortAsc() ? "ASC" : "DESC")); - } else if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_PRICE)) { - query.orderBy(true, pageReqVO.getSortAsc(), ProductSpuDO::getPrice) - .orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId); - } else { - query.orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId); - } - return selectPage(pageReqVO, query); - } - - default List selectListByRecommendType(String recommendType, Integer count) { - QueryWrapperX query = new QueryWrapperX<>(); - // 上架状态 且有库存 - query.eq("status", ProductSpuStatusEnum.ENABLE.getStatus()).gt("stock", 0); - // 推荐类型的过滤条件 - if (ObjUtil.equal(recommendType, AppProductSpuPageReqVO.RECOMMEND_TYPE_HOT)) { - query.eq("recommend_hot", true); - } else if (ObjUtil.equal(recommendType, AppProductSpuPageReqVO.RECOMMEND_TYPE_GOOD)) { - query.eq("recommend_good", true); - } - // 设置最大长度 - query.limitN(count); - return selectList(query); - } - - /** - * 更新商品 SPU 库存 - * - * @param id 商品 SPU 编号 - * @param incrCount 增加的库存数量 - */ - default void updateStock(Long id, Integer incrCount) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() - // 负数,所以使用 + 号 - .setSql(" stock = stock +" + incrCount) - .eq(ProductSpuDO::getId, id); - update(null, updateWrapper); - } - - /** - * 获得 Spu 列表 - * - * @param reqVO 查询条件 - * @return Spu 列表 - */ - default List selectList(ProductSpuExportReqVO reqVO) { - Integer tabType = reqVO.getTabType(); - LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX<>(); - queryWrapper.eqIfPresent(ProductSpuDO::getName, reqVO.getName()); - queryWrapper.eqIfPresent(ProductSpuDO::getCategoryId, reqVO.getCategoryId()); - queryWrapper.betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getCreateTime()); - appendTabQuery(tabType, queryWrapper); - return selectList(queryWrapper); - } - - /** - * 添加后台 Tab 选项的查询条件 - * - * @param tabType 标签类型 - * @param query 查询条件 - */ - static void appendTabQuery(Integer tabType, LambdaQueryWrapperX query) { - // 出售中商品 - if (ObjectUtil.equals(ProductSpuPageReqVO.FOR_SALE, tabType)) { - query.eqIfPresent(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()); - } - // 仓储中商品 - if (ObjectUtil.equals(ProductSpuPageReqVO.IN_WAREHOUSE, tabType)) { - query.eqIfPresent(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus()); - } - // 已售空商品 - if (ObjectUtil.equals(ProductSpuPageReqVO.SOLD_OUT, tabType)) { - query.eqIfPresent(ProductSpuDO::getStock, 0); - } - // 警戒库存 - if (ObjectUtil.equals(ProductSpuPageReqVO.ALERT_STOCK, tabType)) { - query.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK) - // 如果库存触发警戒库存且状态为回收站的话则不在警戒库存列表展示 - .notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()); - } - // 回收站 - if (ObjectUtil.equals(ProductSpuPageReqVO.RECYCLE_BIN, tabType)) { - query.eqIfPresent(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()); - } - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/package-info.java deleted file mode 100644 index 00479eea..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 product 模块的 framework 封装 - * - * @author 芋道源码 - */ -package com.win.module.product.framework; diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/config/ProductWebConfiguration.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/config/ProductWebConfiguration.java deleted file mode 100644 index 12a81acf..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/config/ProductWebConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.product.framework.web.config; - -import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; -import org.springdoc.core.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * product 模块的 web 组件的 Configuration - * - * @author 芋道源码 - */ -@Configuration(proxyBeanMethods = false) -public class ProductWebConfiguration { - - /** - * product 模块的 API 分组 - */ - @Bean - public GroupedOpenApi productGroupedOpenApi() { - return WinSwaggerAutoConfiguration.buildGroupedOpenApi("product"); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/package-info.java deleted file mode 100644 index 6f4c2b5c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * product 模块的 web 配置 - */ -package com.win.module.product.framework.web; diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/package-info.java deleted file mode 100644 index 42266cfb..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * trade 模块,主要实现交易相关功能 - * 例如:订单、退款、购物车等功能。 - * - * 1. Controller URL:以 /product/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 product_ 开头,方便在数据库中区分 - */ -package com.win.module.product; diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandService.java deleted file mode 100644 index ebf96065..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.win.module.product.service.brand; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.brand.vo.*; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 商品品牌 Service 接口 - * - * @author 芋道源码 - */ -public interface ProductBrandService { - - /** - * 创建品牌 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createBrand(@Valid ProductBrandCreateReqVO createReqVO); - - /** - * 更新品牌 - * - * @param updateReqVO 更新信息 - */ - void updateBrand(@Valid ProductBrandUpdateReqVO updateReqVO); - - /** - * 删除品牌 - * - * @param id 编号 - */ - void deleteBrand(Long id); - - /** - * 获得品牌 - * - * @param id 编号 - * @return 品牌 - */ - ProductBrandDO getBrand(Long id); - - /** - * 获得品牌列表 - * - * @param ids 编号 - * @return 品牌列表 - */ - List getBrandList(Collection ids); - - /** - * 获得品牌列表 - * - * @param listReqVO 请求参数 - * @return 品牌列表 - */ - List getBrandList(ProductBrandListReqVO listReqVO); - - /** - * 验证选择的商品分类是否合法 - * - * @param id 分类编号 - */ - void validateProductBrand(Long id); - - /** - * 获得品牌分页 - * - * @param pageReqVO 分页查询 - * @return 品牌分页 - */ - PageResult getBrandPage(ProductBrandPageReqVO pageReqVO); - - /** - * 获取指定状态的品牌列表 - * - * @param status 状态 - * @return 返回品牌列表 - */ - List getBrandListByStatus(Integer status); -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandServiceImpl.java deleted file mode 100644 index b8e7eed8..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/brand/ProductBrandServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.win.module.product.service.brand; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandListReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandPageReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO; -import com.win.module.product.convert.brand.ProductBrandConvert; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; -import com.win.module.product.dal.mysql.brand.ProductBrandMapper; -import com.google.common.annotations.VisibleForTesting; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.product.enums.ErrorCodeConstants.*; - -/** - * 品牌 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ProductBrandServiceImpl implements ProductBrandService { - - @Resource - private ProductBrandMapper brandMapper; - - @Override - public Long createBrand(ProductBrandCreateReqVO createReqVO) { - // 校验 - validateBrandNameUnique(null, createReqVO.getName()); - - // 插入 - ProductBrandDO brand = ProductBrandConvert.INSTANCE.convert(createReqVO); - brandMapper.insert(brand); - // 返回 - return brand.getId(); - } - - @Override - public void updateBrand(ProductBrandUpdateReqVO updateReqVO) { - // 校验存在 - validateBrandExists(updateReqVO.getId()); - validateBrandNameUnique(updateReqVO.getId(), updateReqVO.getName()); - // 更新 - ProductBrandDO updateObj = ProductBrandConvert.INSTANCE.convert(updateReqVO); - brandMapper.updateById(updateObj); - } - - @Override - public void deleteBrand(Long id) { - // 校验存在 - validateBrandExists(id); - // 删除 - brandMapper.deleteById(id); - } - - private void validateBrandExists(Long id) { - if (brandMapper.selectById(id) == null) { - throw exception(BRAND_NOT_EXISTS); - } - } - - @VisibleForTesting - public void validateBrandNameUnique(Long id, String name) { - ProductBrandDO brand = brandMapper.selectByName(name); - if (brand == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 - if (id == null) { - throw exception(BRAND_NAME_EXISTS); - } - if (!brand.getId().equals(id)) { - throw exception(BRAND_NAME_EXISTS); - } - } - - @Override - public ProductBrandDO getBrand(Long id) { - return brandMapper.selectById(id); - } - - @Override - public List getBrandList(Collection ids) { - return brandMapper.selectBatchIds(ids); - } - - @Override - public List getBrandList(ProductBrandListReqVO listReqVO) { - return brandMapper.selectList(listReqVO); - } - - @Override - public void validateProductBrand(Long id) { - ProductBrandDO brand = brandMapper.selectById(id); - if (brand == null) { - throw exception(BRAND_NOT_EXISTS); - } - if (brand.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { - throw exception(BRAND_DISABLED); - } - } - - @Override - public PageResult getBrandPage(ProductBrandPageReqVO pageReqVO) { - return brandMapper.selectPage(pageReqVO); - } - - @Override - public List getBrandListByStatus(Integer status) { - return brandMapper.selectListByStatus(status); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryService.java deleted file mode 100644 index 0fd31e08..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryService.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.product.service.category; - -import com.win.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 商品分类 Service 接口 - * - * @author 芋道源码 - */ -public interface ProductCategoryService { - - /** - * 创建商品分类 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createCategory(@Valid ProductCategoryCreateReqVO createReqVO); - - /** - * 更新商品分类 - * - * @param updateReqVO 更新信息 - */ - void updateCategory(@Valid ProductCategoryUpdateReqVO updateReqVO); - - /** - * 删除商品分类 - * - * @param id 编号 - */ - void deleteCategory(Long id); - - /** - * 获得商品分类 - * - * @param id 编号 - * @return 商品分类 - */ - ProductCategoryDO getCategory(Long id); - - /** - * 校验商品分类 - * - * @param id 分类编号 - */ - void validateCategory(Long id); - - /** - * 获得商品分类的层级 - * - * @param id 编号 - * @return 商品分类的层级 - */ - Integer getCategoryLevel(Long id); - - /** - * 获得商品分类列表 - * - * @param listReqVO 查询条件 - * @return 商品分类列表 - */ - List getEnableCategoryList(ProductCategoryListReqVO listReqVO); - - /** - * 获得开启状态的商品分类列表 - * - * @return 商品分类列表 - */ - List getEnableCategoryList(); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryServiceImpl.java deleted file mode 100644 index d65af464..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/category/ProductCategoryServiceImpl.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.win.module.product.service.category; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; -import com.win.module.product.convert.category.ProductCategoryConvert; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import com.win.module.product.dal.mysql.category.ProductCategoryMapper; -import com.win.module.product.service.spu.ProductSpuService; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Objects; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.product.dal.dataobject.category.ProductCategoryDO.PARENT_ID_NULL; -import static com.win.module.product.enums.ErrorCodeConstants.*; - -/** - * 商品分类 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ProductCategoryServiceImpl implements ProductCategoryService { - - @Resource - private ProductCategoryMapper productCategoryMapper; - @Resource - @Lazy // 循环依赖,避免报错 - private ProductSpuService productSpuService; - - @Override - public Long createCategory(ProductCategoryCreateReqVO createReqVO) { - // 校验父分类存在 - validateParentProductCategory(createReqVO.getParentId()); - - // 插入 - ProductCategoryDO category = ProductCategoryConvert.INSTANCE.convert(createReqVO); - productCategoryMapper.insert(category); - // 返回 - return category.getId(); - } - - @Override - public void updateCategory(ProductCategoryUpdateReqVO updateReqVO) { - // 校验分类是否存在 - validateProductCategoryExists(updateReqVO.getId()); - // 校验父分类存在 - validateParentProductCategory(updateReqVO.getParentId()); - - // 更新 - ProductCategoryDO updateObj = ProductCategoryConvert.INSTANCE.convert(updateReqVO); - productCategoryMapper.updateById(updateObj); - } - - @Override - public void deleteCategory(Long id) { - // 校验分类是否存在 - validateProductCategoryExists(id); - // 校验是否还有子分类 - if (productCategoryMapper.selectCountByParentId(id) > 0) { - throw exception(CATEGORY_EXISTS_CHILDREN); - } - // 校验分类是否绑定了 SPU - Long spuCount = productSpuService.getSpuCountByCategoryId(id); - if (spuCount > 0) { - throw exception(CATEGORY_HAVE_BIND_SPU); - } - // 删除 - productCategoryMapper.deleteById(id); - } - - private void validateParentProductCategory(Long id) { - // 如果是根分类,无需验证 - if (Objects.equals(id, PARENT_ID_NULL)) { - return; - } - // 父分类不存在 - ProductCategoryDO category = productCategoryMapper.selectById(id); - if (category == null) { - throw exception(CATEGORY_PARENT_NOT_EXISTS); - } - // 父分类不能是二级分类 - if (!Objects.equals(category.getParentId(), PARENT_ID_NULL)) { - throw exception(CATEGORY_PARENT_NOT_FIRST_LEVEL); - } - } - - private void validateProductCategoryExists(Long id) { - ProductCategoryDO category = productCategoryMapper.selectById(id); - if (category == null) { - throw exception(CATEGORY_NOT_EXISTS); - } - } - - @Override - public ProductCategoryDO getCategory(Long id) { - return productCategoryMapper.selectById(id); - } - - @Override - public void validateCategory(Long id) { - ProductCategoryDO category = productCategoryMapper.selectById(id); - if (category == null) { - throw exception(CATEGORY_NOT_EXISTS); - } - if (Objects.equals(category.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { - throw exception(CATEGORY_DISABLED, category.getName()); - } - } - - @Override - public Integer getCategoryLevel(Long id) { - if (Objects.equals(id, PARENT_ID_NULL)) { - return 0; - } - int level = 1; - // for 的原因,是因为避免脏数据,导致可能的死循环。一般不会超过 100 层哈 - for (int i = 0; i < Byte.MAX_VALUE; i++) { - // 如果没有父节点,break 结束 - ProductCategoryDO category = productCategoryMapper.selectById(id); - if (category == null - || Objects.equals(category.getParentId(), PARENT_ID_NULL)) { - break; - } - // 继续递归父节点 - level++; - id = category.getParentId(); - } - return level; - } - - @Override - public List getEnableCategoryList(ProductCategoryListReqVO listReqVO) { - return productCategoryMapper.selectList(listReqVO); - } - - @Override - public List getEnableCategoryList() { - return productCategoryMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentService.java deleted file mode 100644 index 73820a7e..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentService.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.win.module.product.service.comment; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentPageReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentUpdateVisibleReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentPageReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; -import com.win.module.product.controller.app.comment.vo.AppProductCommentRespVO; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; - -/** - * 商品评论 Service 接口 - * - * @author wangzhs - */ -@Service -@Validated -public interface ProductCommentService { - - /** - * 创建商品评论 - * 后台管理员创建评论使用 - * - * @param createReqVO 商品评价创建 Request VO 对象 - */ - void createComment(ProductCommentCreateReqVO createReqVO); - - /** - * 创建评论 - * 创建商品评论 APP 端创建商品评论使用 - * - * @param createReqDTO 创建请求 dto - * @return 返回评论 id - */ - Long createComment(ProductCommentCreateReqDTO createReqDTO); - - /** - * 修改评论是否可见 - * - * @param updateReqVO 修改评论可见 - */ - void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO); - - /** - * 商家回复 - * - * @param replyVO 商家回复 - * @param userId 管理后台商家登陆人 ID - */ - void replyComment(ProductCommentReplyReqVO replyVO, Long userId); - - /** - * 【管理员】获得商品评价分页 - * - * @param pageReqVO 分页查询 - * @return 商品评价分页 - */ - PageResult getCommentPage(ProductCommentPageReqVO pageReqVO); - - /** - * 【会员】获得商品评价分页 - * - * @param pageVO 分页查询 - * @param visible 是否可见 - * @return 商品评价分页 - */ - PageResult getCommentPage(AppCommentPageReqVO pageVO, Boolean visible); - - /** - * 获得商品的评价统计 - * - * @param spuId spu id - * @param visible 是否可见 - * @return 评价统计 - */ - AppCommentStatisticsRespVO getCommentStatistics(Long spuId, Boolean visible); - - /** - * 得到评论列表 - * - * @param spuId 商品 id - * @param count 数量 - * @return {@link Object} - */ - List getCommentList(Long spuId, Integer count); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentServiceImpl.java deleted file mode 100644 index b120aa9c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/comment/ProductCommentServiceImpl.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.win.module.product.service.comment; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentPageReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentUpdateVisibleReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentPageReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; -import com.win.module.product.controller.app.comment.vo.AppProductCommentRespVO; -import com.win.module.product.convert.comment.ProductCommentConvert; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.dal.mysql.comment.ProductCommentMapper; -import com.win.module.product.service.sku.ProductSkuService; -import com.win.module.product.service.spu.ProductSpuService; -import org.springframework.context.annotation.Lazy; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.product.enums.ErrorCodeConstants.*; - -/** - * 商品评论 Service 实现类 - * - * @author wangzhs - */ -@Service -@Validated -public class ProductCommentServiceImpl implements ProductCommentService { - - @Resource - private ProductCommentMapper productCommentMapper; - - @Resource - private ProductSpuService productSpuService; - - @Resource - @Lazy - private ProductSkuService productSkuService; - - @Resource - private MemberUserApi memberUserApi; - - @Override - public void createComment(ProductCommentCreateReqVO createReqVO) { - // 校验 SKU - ProductSkuDO skuDO = validateSku(createReqVO.getSkuId()); - // 校验 SPU - ProductSpuDO spuDO = validateSpu(skuDO.getSpuId()); - - // 创建评论 - ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO, skuDO); - productCommentMapper.insert(comment); - } - - @Override - public Long createComment(ProductCommentCreateReqDTO createReqDTO) { - // 校验 SKU - ProductSkuDO skuDO = validateSku(createReqDTO.getSkuId()); - // 校验 SPU - ProductSpuDO spuDO = validateSpu(skuDO.getSpuId()); - // 校验评论 - validateCommentExists(createReqDTO.getUserId(), createReqDTO.getOrderId()); - // 获取用户详细信息 - MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId()); - - // 创建评论 - ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, skuDO, user); - productCommentMapper.insert(comment); - return comment.getId(); - } - - /** - * 判断当前订单的当前商品用户是否评价过 - * - * @param userId 用户编号 - * @param orderItemId 订单项编号 - */ - private void validateCommentExists(Long userId, Long orderItemId) { - ProductCommentDO exist = productCommentMapper.selectByUserIdAndOrderItemId(userId, orderItemId); - if (exist != null) { - throw exception(COMMENT_ORDER_EXISTS); - } - } - - private ProductSkuDO validateSku(Long skuId) { - ProductSkuDO sku = productSkuService.getSku(skuId); - if (sku == null) { - throw exception(SKU_NOT_EXISTS); - } - return sku; - } - - private ProductSpuDO validateSpu(Long spuId) { - ProductSpuDO spu = productSpuService.getSpu(spuId); - if (null == spu) { - throw exception(SPU_NOT_EXISTS); - } - return spu; - } - - @Override - public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) { - // 校验评论是否存在 - validateCommentExists(updateReqVO.getId()); - - // 更新可见状态 - productCommentMapper.updateById(new ProductCommentDO().setId(updateReqVO.getId()) - .setVisible(true)); - } - - @Override - public void replyComment(ProductCommentReplyReqVO replyVO, Long userId) { - // 校验评论是否存在 - validateCommentExists(replyVO.getId()); - // 回复评论 - productCommentMapper.updateById(new ProductCommentDO().setId(replyVO.getId()) - .setReplyTime(LocalDateTime.now()).setReplyUserId(userId) - .setReplyStatus(Boolean.TRUE).setReplyContent(replyVO.getReplyContent())); - } - - private ProductCommentDO validateCommentExists(Long id) { - ProductCommentDO productComment = productCommentMapper.selectById(id); - if (productComment == null) { - throw exception(COMMENT_NOT_EXISTS); - } - return productComment; - } - - @Override - public AppCommentStatisticsRespVO getCommentStatistics(Long spuId, Boolean visible) { - return ProductCommentConvert.INSTANCE.convert( - // 查询商品 id = spuId 的所有好评数量 - productCommentMapper.selectCountBySpuId(spuId, visible, AppCommentPageReqVO.GOOD_COMMENT), - // 查询商品 id = spuId 的所有中评数量 - productCommentMapper.selectCountBySpuId(spuId, visible, AppCommentPageReqVO.MEDIOCRE_COMMENT), - // 查询商品 id = spuId 的所有差评数量 - productCommentMapper.selectCountBySpuId(spuId, visible, AppCommentPageReqVO.NEGATIVE_COMMENT) - ); - } - - @Override - public List getCommentList(Long spuId, Integer count) { - return ProductCommentConvert.INSTANCE.convertList02(productCommentMapper.selectCommentList(spuId, count).getList()); - } - - @Override - public PageResult getCommentPage(AppCommentPageReqVO pageVO, Boolean visible) { - return productCommentMapper.selectPage(pageVO, visible); - } - - @Override - public PageResult getCommentPage(ProductCommentPageReqVO pageReqVO) { - return productCommentMapper.selectPage(pageReqVO); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteService.java deleted file mode 100644 index 463b4264..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteService.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.product.service.favorite; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.app.favorite.vo.AppFavoritePageReqVO; -import com.win.module.product.dal.dataobject.favorite.ProductFavoriteDO; - -import javax.validation.Valid; - -/** - * 商品收藏 Service 接口 - * - * @author jason - */ -public interface ProductFavoriteService { - - /** - * 创建商品收藏 - * - * @param userId 用户编号 - * @param spuId SPU 编号 - */ - Long createFavorite(Long userId, Long spuId); - - /** - * 取消商品收藏 - * - * @param userId 用户编号 - * @param spuId SPU 编号 - */ - void deleteFavorite(Long userId, Long spuId); - - /** - * 分页查询用户收藏列表 - * - * @param userId 用户编号 - * @param reqVO 请求 vo - */ - PageResult getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO); - - /** - * 获取收藏过商品 - * - * @param userId 用户编号 - * @param spuId SPU 编号 - */ - ProductFavoriteDO getFavorite(Long userId, Long spuId); - - /** - * 获取用户收藏数量 - * - * @param userId 用户编号 - * @return 数量 - */ - Long getFavoriteCount(Long userId); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteServiceImpl.java deleted file mode 100644 index 9d343ebe..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/favorite/ProductFavoriteServiceImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.module.product.service.favorite; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.app.favorite.vo.AppFavoritePageReqVO; -import com.win.module.product.convert.favorite.ProductFavoriteConvert; -import com.win.module.product.dal.dataobject.favorite.ProductFavoriteDO; -import com.win.module.product.dal.mysql.favorite.ProductFavoriteMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.product.enums.ErrorCodeConstants.FAVORITE_EXISTS; -import static com.win.module.product.enums.ErrorCodeConstants.FAVORITE_NOT_EXISTS; - -/** - * 商品收藏 Service 实现类 - * - * @author jason - */ -@Service -@Validated -public class ProductFavoriteServiceImpl implements ProductFavoriteService { - - @Resource - private ProductFavoriteMapper productFavoriteMapper; - - @Override - public Long createFavorite(Long userId, Long spuId) { - ProductFavoriteDO favorite = productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId); - if (favorite != null) { - throw exception(FAVORITE_EXISTS); - } - - ProductFavoriteDO entity = ProductFavoriteConvert.INSTANCE.convert(userId, spuId); - productFavoriteMapper.insert(entity); - return entity.getId(); - } - - @Override - public void deleteFavorite(Long userId, Long spuId) { - ProductFavoriteDO favorite = productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId); - if (favorite == null) { - throw exception(FAVORITE_NOT_EXISTS); - } - - productFavoriteMapper.deleteById(favorite.getId()); - } - - @Override - public PageResult getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO) { - return productFavoriteMapper.selectPageByUserAndType(userId, reqVO); - } - - @Override - public ProductFavoriteDO getFavorite(Long userId, Long spuId) { - return productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId); - } - - @Override - public Long getFavoriteCount(Long userId) { - return productFavoriteMapper.selectCountByUserId(userId); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyService.java deleted file mode 100644 index 5f986721..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyService.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.win.module.product.service.property; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.property.vo.property.*; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 商品属性项 Service 接口 - * - * @author 芋道源码 - */ -public interface ProductPropertyService { - - /** - * 创建属性项 - * 注意,如果已经存在该属性项,直接返回它的编号即可 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createProperty(@Valid ProductPropertyCreateReqVO createReqVO); - - /** - * 更新属性项 - * - * @param updateReqVO 更新信息 - */ - void updateProperty(@Valid ProductPropertyUpdateReqVO updateReqVO); - - /** - * 删除属性项 - * - * @param id 编号 - */ - void deleteProperty(Long id); - - /** - * 获得属性项列表 - * - * @param listReqVO 集合查询 - * @return 属性项集合 - */ - List getPropertyList(ProductPropertyListReqVO listReqVO); - - /** - * 获取属性名称分页 - * - * @param pageReqVO 分页条件 - * @return 属性项分页 - */ - PageResult getPropertyPage(ProductPropertyPageReqVO pageReqVO); - - /** - * 获得指定编号的属性项 - * - * @param id 编号 - * @return 属性项 - */ - ProductPropertyDO getProperty(Long id); - - /** - * 根据属性项的编号的集合,获得对应的属性项数组 - * - * @param ids 属性项的编号的集合 - * @return 属性项数组 - */ - List getPropertyList(Collection ids); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyServiceImpl.java deleted file mode 100644 index 1b431eb2..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyServiceImpl.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.win.module.product.service.property; - -import cn.hutool.core.util.ObjUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyCreateReqVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyListReqVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyPageReqVO; -import com.win.module.product.controller.admin.property.vo.property.ProductPropertyUpdateReqVO; -import com.win.module.product.convert.property.ProductPropertyConvert; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.mysql.property.ProductPropertyMapper; -import com.win.module.product.service.sku.ProductSkuService; -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.util.Collection; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.product.enums.ErrorCodeConstants.*; - -/** - * 商品属性项 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ProductPropertyServiceImpl implements ProductPropertyService { - - @Resource - private ProductPropertyMapper productPropertyMapper; - - @Resource - @Lazy // 延迟加载,解决循环依赖问题 - private ProductPropertyValueService productPropertyValueService; - - @Resource - private ProductSkuService productSkuService; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createProperty(ProductPropertyCreateReqVO createReqVO) { - // 如果已经添加过该属性项,直接返回 - ProductPropertyDO dbProperty = productPropertyMapper.selectByName(createReqVO.getName()); - if (dbProperty != null) { - return dbProperty.getId(); - } - - // 插入 - ProductPropertyDO property = ProductPropertyConvert.INSTANCE.convert(createReqVO); - productPropertyMapper.insert(property); - // 返回 - return property.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateProperty(ProductPropertyUpdateReqVO updateReqVO) { - validatePropertyExists(updateReqVO.getId()); - // 校验名字重复 - ProductPropertyDO productPropertyDO = productPropertyMapper.selectByName(updateReqVO.getName()); - if (productPropertyDO != null && - ObjUtil.notEqual(productPropertyDO.getId(), updateReqVO.getId())) { - throw exception(PROPERTY_EXISTS); - } - - // 更新 - ProductPropertyDO updateObj = ProductPropertyConvert.INSTANCE.convert(updateReqVO); - productPropertyMapper.updateById(updateObj); - // 更新 sku 相关属性 - productSkuService.updateSkuProperty(updateObj.getId(), updateObj.getName()); - } - - @Override - public void deleteProperty(Long id) { - // 校验存在 - validatePropertyExists(id); - // 校验其下是否有规格值 - if (productPropertyValueService.getPropertyValueCountByPropertyId(id) > 0) { - throw exception(PROPERTY_DELETE_FAIL_VALUE_EXISTS); - } - - // 删除 - productPropertyMapper.deleteById(id); - // 同步删除属性值 - productPropertyValueService.deletePropertyValueByPropertyId(id); - } - - private void validatePropertyExists(Long id) { - if (productPropertyMapper.selectById(id) == null) { - throw exception(PROPERTY_NOT_EXISTS); - } - } - - @Override - public List getPropertyList(ProductPropertyListReqVO listReqVO) { - return productPropertyMapper.selectList(listReqVO); - } - - @Override - public PageResult getPropertyPage(ProductPropertyPageReqVO pageReqVO) { - return productPropertyMapper.selectPage(pageReqVO); - } - - @Override - public ProductPropertyDO getProperty(Long id) { - return productPropertyMapper.selectById(id); - } - - @Override - public List getPropertyList(Collection ids) { - return productPropertyMapper.selectBatchIds(ids); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueService.java deleted file mode 100644 index cbf687ab..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueService.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.win.module.product.service.property; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import com.win.module.product.service.property.bo.ProductPropertyValueDetailRespBO; - -import java.util.Collection; -import java.util.List; - -/** - * 商品属性值 Service 接口 - * - * @author LuoWenFeng - */ -public interface ProductPropertyValueService { - - /** - * 创建属性值 - * 注意,如果已经存在该属性值,直接返回它的编号即可 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createPropertyValue(ProductPropertyValueCreateReqVO createReqVO); - - /** - * 更新属性值 - * - * @param updateReqVO 更新信息 - */ - void updatePropertyValue(ProductPropertyValueUpdateReqVO updateReqVO); - - /** - * 删除属性值 - * - * @param id 编号 - */ - void deletePropertyValue(Long id); - - /** - * 获得属性值 - * - * @param id 编号 - * @return 属性值 - */ - ProductPropertyValueDO getPropertyValue(Long id); - - /** - * 根据属性项编号数组,获得属性值列表 - * - * @param propertyIds 属性项目编号数组 - * @return 属性值列表 - */ - List getPropertyValueListByPropertyId(Collection propertyIds); - - /** - * 根据编号数组,获得属性值列表 - * - * @param ids 编号数组 - * @return 属性值明细列表 - */ - List getPropertyValueDetailList(Collection ids); - - /** - * 根据属性项编号,活的属性值数量 - * - * @param propertyId 属性项编号数 - * @return 属性值数量 - */ - Integer getPropertyValueCountByPropertyId(Long propertyId); - - /** - * 获取属性值的分页 - * - * @param pageReqVO 查询条件 - * @return 属性值的分页 - */ - PageResult getPropertyValuePage(ProductPropertyValuePageReqVO pageReqVO); - - /** - * 删除指定属性项编号下的属性值们 - * - * @param propertyId 属性项的编号 - */ - void deletePropertyValueByPropertyId(Long propertyId); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueServiceImpl.java deleted file mode 100644 index 9052731d..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/ProductPropertyValueServiceImpl.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.win.module.product.service.property; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO; -import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO; -import com.win.module.product.convert.propertyvalue.ProductPropertyValueConvert; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import com.win.module.product.dal.mysql.property.ProductPropertyValueMapper; -import com.win.module.product.service.property.bo.ProductPropertyValueDetailRespBO; -import com.win.module.product.service.sku.ProductSkuService; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.module.product.enums.ErrorCodeConstants.PROPERTY_VALUE_EXISTS; -import static com.win.module.product.enums.ErrorCodeConstants.PROPERTY_VALUE_NOT_EXISTS; - -/** - * 商品属性值 Service 实现类 - * - * @author LuoWenFeng - */ -@Service -@Validated -public class ProductPropertyValueServiceImpl implements ProductPropertyValueService { - - @Resource - private ProductPropertyValueMapper productPropertyValueMapper; - - @Resource - @Lazy // 延迟加载,避免循环依赖 - private ProductPropertyService productPropertyService; - - @Resource - @Lazy // 延迟加载,避免循环依赖 - private ProductSkuService productSkuService; - - @Override - public Long createPropertyValue(ProductPropertyValueCreateReqVO createReqVO) { - // 如果已经添加过该属性值,直接返回 - ProductPropertyValueDO dbValue = productPropertyValueMapper.selectByName( - createReqVO.getPropertyId(), createReqVO.getName()); - if (dbValue != null) { - return dbValue.getId(); - } - - // 新增 - ProductPropertyValueDO value = ProductPropertyValueConvert.INSTANCE.convert(createReqVO); - productPropertyValueMapper.insert(value); - return value.getId(); - } - - @Override - public void updatePropertyValue(ProductPropertyValueUpdateReqVO updateReqVO) { - validatePropertyValueExists(updateReqVO.getId()); - // 校验名字唯一 - ProductPropertyValueDO productPropertyValueDO = productPropertyValueMapper.selectByName - (updateReqVO.getPropertyId(), updateReqVO.getName()); - if (productPropertyValueDO != null && !productPropertyValueDO.getId().equals(updateReqVO.getId())) { - throw exception(PROPERTY_VALUE_EXISTS); - } - - // 更新 - ProductPropertyValueDO updateObj = ProductPropertyValueConvert.INSTANCE.convert(updateReqVO); - productPropertyValueMapper.updateById(updateObj); - // 更新 sku 相关属性 - productSkuService.updateSkuPropertyValue(updateObj.getId(), updateObj.getName()); - } - - @Override - public void deletePropertyValue(Long id) { - validatePropertyValueExists(id); - productPropertyValueMapper.deleteById(id); - } - - private void validatePropertyValueExists(Long id) { - if (productPropertyValueMapper.selectById(id) == null) { - throw exception(PROPERTY_VALUE_NOT_EXISTS); - } - } - - @Override - public ProductPropertyValueDO getPropertyValue(Long id) { - return productPropertyValueMapper.selectById(id); - } - - @Override - public List getPropertyValueListByPropertyId(Collection propertyIds) { - return productPropertyValueMapper.selectListByPropertyId(propertyIds); - } - - @Override - public List getPropertyValueDetailList(Collection ids) { - // 获得属性值列表 - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - List values = productPropertyValueMapper.selectBatchIds(ids); - if (CollUtil.isEmpty(values)) { - return Collections.emptyList(); - } - // 获得属性项列表 - List keys = productPropertyService.getPropertyList( - convertSet(values, ProductPropertyValueDO::getPropertyId)); - // 组装明细 - return ProductPropertyValueConvert.INSTANCE.convertList(values, keys); - } - - @Override - public Integer getPropertyValueCountByPropertyId(Long propertyId) { - return productPropertyValueMapper.selectCountByPropertyId(propertyId); - } - - @Override - public PageResult getPropertyValuePage(ProductPropertyValuePageReqVO pageReqVO) { - return productPropertyValueMapper.selectPage(pageReqVO); - } - - @Override - public void deletePropertyValueByPropertyId(Long propertyId) { - productPropertyValueMapper.deleteByPropertyId(propertyId); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/bo/ProductPropertyValueDetailRespBO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/bo/ProductPropertyValueDetailRespBO.java deleted file mode 100644 index 0e11859c..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/property/bo/ProductPropertyValueDetailRespBO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.product.service.property.bo; - -import lombok.Data; - -/** - * 商品属性项的明细 Response BO - * - * @author 芋道源码 - */ -@Data -public class ProductPropertyValueDetailRespBO { - - /** - * 属性的编号 - */ - private Long propertyId; - - /** - * 属性的名称 - */ - private String propertyName; - - /** - * 属性值的编号 - */ - private Long valueId; - - /** - * 属性值的名称 - */ - private String valueName; - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuService.java deleted file mode 100644 index 01b41eae..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuService.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.win.module.product.service.sku; - -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; - -import java.util.Collection; -import java.util.List; - -/** - * 商品 SKU Service 接口 - * - * @author 芋道源码 - */ -public interface ProductSkuService { - - /** - * 删除商品 SKU - * - * @param id 编号 - */ - void deleteSku(Long id); - - /** - * 获得商品 SKU 信息 - * - * @param id 编号 - * @return 商品 SKU 信息 - */ - ProductSkuDO getSku(Long id); - - /** - * 获得商品 SKU 列表 - * - * @return 商品sku列表 - */ - List getSkuList(); - - /** - * 获得商品 SKU 列表 - * - * @param ids 编号 - * @return 商品sku列表 - */ - List getSkuList(Collection ids); - - /** - * 对 sku 的组合的属性等进行合法性校验 - * - * @param list sku组合的集合 - */ - void validateSkuList(List list, Boolean specType); - - /** - * 批量创建 SKU - * - * @param spuId 商品 SPU 编号 - * @param list SKU 对象集合 - */ - void createSkuList(Long spuId, List list); - - /** - * 根据 SPU 编号,批量更新它的 SKU 信息 - * - * @param spuId SPU 编码 - * @param skus SKU 的集合 - */ - void updateSkuList(Long spuId, List skus); - - /** - * 更新 SKU 库存(增量) - *

- * 如果更新的库存不足,会抛出异常 - * - * @param updateStockReqDTO 更行请求 - */ - void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO); - - /** - * 获得商品 SKU 集合 - * - * @param spuId spu 编号 - * @return 商品sku 集合 - */ - List getSkuListBySpuId(Long spuId); - - /** - * 获得 spu 对应的 SKU 集合 - * - * @param spuIds spu 编码集合 - * @return 商品 sku 集合 - */ - List getSkuListBySpuId(Collection spuIds); - - /** - * 通过 spuId 删除 sku 信息 - * - * @param spuId spu 编码 - */ - void deleteSkuBySpuId(Long spuId); - - /** - * 获得库存预警的 SKU 数组 - * - * @return SKU 数组 - */ - List getSkuListByAlarmStock(); - - /** - * 更新 sku 属性 - * - * @param propertyId 属性 id - * @param propertyName 属性名 - * @return int 影响的行数 - */ - int updateSkuProperty(Long propertyId, String propertyName); - - /** - * 更新 sku 属性值 - * - * @param propertyValueId 属性值 id - * @param propertyValueName 属性值名字 - * @return int 影响的行数 - */ - int updateSkuPropertyValue(Long propertyValueId, String propertyValueName); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuServiceImpl.java deleted file mode 100644 index ab62cd24..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/sku/ProductSkuServiceImpl.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.win.module.product.service.sku; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuBaseVO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.convert.sku.ProductSkuConvert; -import com.win.module.product.dal.dataobject.property.ProductPropertyDO; -import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.mysql.sku.ProductSkuMapper; -import com.win.module.product.service.property.ProductPropertyService; -import com.win.module.product.service.property.ProductPropertyValueService; -import com.win.module.product.service.spu.ProductSpuService; -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.util.*; -import java.util.stream.Collectors; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.module.product.enums.ErrorCodeConstants.*; - -/** - * 商品 SKU Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ProductSkuServiceImpl implements ProductSkuService { - - @Resource - private ProductSkuMapper productSkuMapper; - - @Resource - @Lazy // 循环依赖,避免报错 - private ProductSpuService productSpuService; - @Resource - @Lazy // 循环依赖,避免报错 - private ProductPropertyService productPropertyService; - @Resource - private ProductPropertyValueService productPropertyValueService; - - @Override - public void deleteSku(Long id) { - // 校验存在 - validateSkuExists(id); - // 删除 - productSkuMapper.deleteById(id); - } - - private void validateSkuExists(Long id) { - if (productSkuMapper.selectById(id) == null) { - throw exception(SKU_NOT_EXISTS); - } - } - - @Override - public ProductSkuDO getSku(Long id) { - return productSkuMapper.selectById(id); - } - - @Override - public List getSkuList() { - return productSkuMapper.selectList(); - } - - @Override - public List getSkuList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return ListUtil.empty(); - } - return productSkuMapper.selectBatchIds(ids); - } - - @Override - public void validateSkuList(List skus, Boolean specType) { - // 0、校验skus是否为空 - if (CollUtil.isEmpty(skus)) { - throw exception(SKU_NOT_EXISTS); - } - // 单规格,赋予单规格默认属性 - if (ObjectUtil.equal(specType, false)) { - ProductSkuCreateOrUpdateReqVO skuVO = skus.get(0); - List properties = new ArrayList<>(); - ProductSkuBaseVO.Property property = new ProductSkuBaseVO.Property(); - property.setPropertyId(ProductPropertyDO.ID_DEFAULT); - property.setPropertyName(ProductPropertyDO.NAME_DEFAULT); - property.setValueId(ProductPropertyValueDO.ID_DEFAULT); - property.setValueName(ProductPropertyValueDO.NAME_DEFAULT); - properties.add(property); - skuVO.setProperties(properties); - return; // 单规格不需要后续的校验 - } - - // 1、校验属性项存在 - Set propertyIds = skus.stream().filter(p -> p.getProperties() != null) - // 遍历多个 Property 属性 - .flatMap(p -> p.getProperties().stream()) - // 将每个 Property 转换成对应的 propertyId,最后形成集合 - .map(ProductSkuCreateOrUpdateReqVO.Property::getPropertyId) - .collect(Collectors.toSet()); - List propertyList = productPropertyService.getPropertyList(propertyIds); - if (propertyList.size() != propertyIds.size()) { - throw exception(PROPERTY_NOT_EXISTS); - } - - // 2. 校验,一个 SKU 下,没有重复的属性。校验方式是,遍历每个 SKU ,看看是否有重复的属性 propertyId - Map propertyValueMap = convertMap(productPropertyValueService.getPropertyValueListByPropertyId(propertyIds), ProductPropertyValueDO::getId); - skus.forEach(sku -> { - Set skuPropertyIds = convertSet(sku.getProperties(), propertyItem -> propertyValueMap.get(propertyItem.getValueId()).getPropertyId()); - if (skuPropertyIds.size() != sku.getProperties().size()) { - throw exception(SKU_PROPERTIES_DUPLICATED); - } - }); - - // 3. 再校验,每个 Sku 的属性值的数量,是一致的。 - int attrValueIdsSize = skus.get(0).getProperties().size(); - for (int i = 1; i < skus.size(); i++) { - if (attrValueIdsSize != skus.get(i).getProperties().size()) { - throw exception(SPU_ATTR_NUMBERS_MUST_BE_EQUALS); - } - } - - // 4. 最后校验,每个 Sku 之间不是重复的 - // 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的. - Set> skuAttrValues = new HashSet<>(); - for (ProductSkuCreateOrUpdateReqVO sku : skus) { - // 添加失败,说明重复 - if (!skuAttrValues.add(convertSet(sku.getProperties(), ProductSkuCreateOrUpdateReqVO.Property::getValueId))) { - throw exception(SPU_SKU_NOT_DUPLICATE); - } - } - } - - @Override - public void createSkuList(Long spuId, List skuCreateReqList) { - productSkuMapper.insertBatch(ProductSkuConvert.INSTANCE.convertList06(skuCreateReqList, spuId)); - } - - @Override - public List getSkuListBySpuId(Long spuId) { - return productSkuMapper.selectListBySpuId(spuId); - } - - @Override - public List getSkuListBySpuId(Collection spuIds) { - return productSkuMapper.selectListBySpuId(spuIds); - } - - @Override - public void deleteSkuBySpuId(Long spuId) { - productSkuMapper.deleteBySpuId(spuId); - } - - @Override - public List getSkuListByAlarmStock() { - return productSkuMapper.selectListByAlarmStock(); - } - - @Override - public int updateSkuProperty(Long propertyId, String propertyName) { - // 获取所有的 sku - List skuDOList = productSkuMapper.selectList(); - // 处理后需要更新的 sku - List updateSkus = new ArrayList<>(); - if (CollUtil.isEmpty(skuDOList)) { - return 0; - } - skuDOList.stream().filter(sku -> sku.getProperties() != null) - .forEach(sku -> sku.getProperties().forEach(property -> { - if (property.getPropertyId().equals(propertyId)) { - property.setPropertyName(propertyName); - updateSkus.add(sku); - } - })); - if (CollUtil.isEmpty(updateSkus)) { - return 0; - } - - productSkuMapper.updateBatch(updateSkus); - return updateSkus.size(); - } - - @Override - public int updateSkuPropertyValue(Long propertyValueId, String propertyValueName) { - // 获取所有的 sku - List skuDOList = productSkuMapper.selectList(); - // 处理后需要更新的 sku - List updateSkus = new ArrayList<>(); - if (CollUtil.isEmpty(skuDOList)) { - return 0; - } - skuDOList.stream() - .filter(sku -> sku.getProperties() != null) - .forEach(sku -> sku.getProperties().forEach(property -> { - if (property.getValueId().equals(propertyValueId)) { - property.setValueName(propertyValueName); - updateSkus.add(sku); - } - })); - if (CollUtil.isEmpty(updateSkus)) { - return 0; - } - - productSkuMapper.updateBatch(updateSkus); - return updateSkus.size(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateSkuList(Long spuId, List skus) { - // 构建属性与 SKU 的映射关系; - Map existsSkuMap = convertMap(productSkuMapper.selectListBySpuId(spuId), - ProductSkuConvert.INSTANCE::buildPropertyKey, ProductSkuDO::getId); - - // 拆分三个集合,新插入的、需要更新的、需要删除的 - List insertSkus = new ArrayList<>(); - List updateSkus = new ArrayList<>(); - List allUpdateSkus = ProductSkuConvert.INSTANCE.convertList06(skus, spuId); - allUpdateSkus.forEach(sku -> { - String propertiesKey = ProductSkuConvert.INSTANCE.buildPropertyKey(sku); - // 1、找得到的,进行更新 - Long existsSkuId = existsSkuMap.remove(propertiesKey); - if (existsSkuId != null) { - sku.setId(existsSkuId); - updateSkus.add(sku); - return; - } - // 2、找不到,进行插入 - sku.setSpuId(spuId); - insertSkus.add(sku); - }); - - // 执行最终的批量操作 - if (CollUtil.isNotEmpty(insertSkus)) { - productSkuMapper.insertBatch(insertSkus); - } - if (CollUtil.isNotEmpty(updateSkus)) { - updateSkus.forEach(sku -> productSkuMapper.updateById(sku)); - } - if (CollUtil.isNotEmpty(existsSkuMap)) { - productSkuMapper.deleteBatchIds(existsSkuMap.values()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO) { - // 更新 SKU 库存 - updateStockReqDTO.getItems().forEach(item -> { - if (item.getIncrCount() > 0) { - productSkuMapper.updateStockIncr(item.getId(), item.getIncrCount()); - } else if (item.getIncrCount() < 0) { - int updateStockIncr = productSkuMapper.updateStockDecr(item.getId(), item.getIncrCount()); - if (updateStockIncr == 0) { - throw exception(SKU_STOCK_NOT_ENOUGH); - } - } - }); - - // 更新 SPU 库存 - List skus = productSkuMapper.selectBatchIds( - convertSet(updateStockReqDTO.getItems(), ProductSkuUpdateStockReqDTO.Item::getId)); - Map spuStockIncrCounts = ProductSkuConvert.INSTANCE.convertSpuStockMap( - updateStockReqDTO.getItems(), skus); - productSpuService.updateSpuStock(spuStockIncrCounts); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuService.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuService.java deleted file mode 100644 index 68d7856e..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuService.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.win.module.product.service.spu; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.controller.admin.spu.vo.*; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 商品 SPU Service 接口 - * - * @author 芋道源码 - */ -public interface ProductSpuService { - - /** - * 创建商品 SPU - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createSpu(@Valid ProductSpuCreateReqVO createReqVO); - - /** - * 更新商品 SPU - * - * @param updateReqVO 更新信息 - */ - void updateSpu(@Valid ProductSpuUpdateReqVO updateReqVO); - - /** - * 删除商品 SPU - * - * @param id 编号 - */ - void deleteSpu(Long id); - - /** - * 获得商品 SPU - * - * @param id 编号 - * @return 商品 SPU - */ - ProductSpuDO getSpu(Long id); - - /** - * 获得商品 SPU 列表 - * - * @param ids 编号数组 - * @return 商品 SPU 列表 - */ - List getSpuList(Collection ids); - - /** - * 获得商品 SPU 映射 - * - * @param ids 编号数组 - * @return 商品 SPU 映射 - */ - default Map getSpuMap(Collection ids) { - return convertMap(getSpuList(ids), ProductSpuDO::getId); - } - - /** - * 获得所有商品 SPU 列表 - * - * @return 商品 SPU 列表 - */ - List getSpuList(); - - /** - * 获得所有商品 SPU 列表 - * - * @param reqVO 导出条件 - * @return 商品 SPU 列表 - */ - List getSpuList(ProductSpuExportReqVO reqVO); - - /** - * 获得商品 SPU 分页,提供给挂你兰后台使用 - * - * @param pageReqVO 分页查询 - * @return 商品spu分页 - */ - PageResult getSpuPage(ProductSpuPageReqVO pageReqVO); - - /** - * 获得商品 SPU 分页,提供给用户 App 使用 - * - * @param pageReqVO 分页查询 - * @return 商品 SPU 分页 - */ - PageResult getSpuPage(AppProductSpuPageReqVO pageReqVO); - - /** - * 获得商品 SPU 列表,提供给用户 App 使用 - * - * @param recommendType 推荐类型 - * @param count 数量 - * @return 商品 SPU 列表 - */ - List getSpuList(String recommendType, Integer count); - - /** - * 更新商品 SPU 库存(增量) - * - * @param stockIncrCounts SPU 编号与库存变化(增量)的映射 - */ - void updateSpuStock(Map stockIncrCounts); - - /** - * 更新 SPU 状态 - * - * @param updateReqVO 更新请求 - */ - void updateSpuStatus(ProductSpuUpdateStatusReqVO updateReqVO); - - /** - * 获取 SPU 列表标签对应的 Count 数量 - * - * @return Count 数量 - */ - Map getTabsCount(); - - /** - * 通过分类 categoryId 查询 SPU 个数 - * - * @param categoryId 分类 categoryId - * @return SPU 数量 - */ - Long getSpuCountByCategoryId(Long categoryId); - -} diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuServiceImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuServiceImpl.java deleted file mode 100644 index 89290122..00000000 --- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/service/spu/ProductSpuServiceImpl.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.win.module.product.service.spu; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.controller.admin.spu.vo.*; -import com.win.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; -import com.win.module.product.convert.spu.ProductSpuConvert; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.dal.mysql.spu.ProductSpuMapper; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.product.service.brand.ProductBrandService; -import com.win.module.product.service.category.ProductCategoryService; -import com.win.module.product.service.property.ProductPropertyValueService; -import com.win.module.product.service.sku.ProductSkuService; -import com.google.common.collect.Maps; -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.util.*; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.getMinValue; -import static com.win.framework.common.util.collection.CollectionUtils.getSumValue; -import static com.win.module.product.dal.dataobject.category.ProductCategoryDO.CATEGORY_LEVEL; -import static com.win.module.product.enums.ErrorCodeConstants.*; - -/** - * 商品 SPU Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ProductSpuServiceImpl implements ProductSpuService { - - @Resource - private ProductSpuMapper productSpuMapper; - - @Resource - @Lazy // 循环依赖,避免报错 - private ProductSkuService productSkuService; - @Resource - private ProductBrandService brandService; - @Resource - private ProductCategoryService categoryService; - @Resource - @Lazy // 循环依赖,避免报错 - private ProductPropertyValueService productPropertyValueService; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createSpu(ProductSpuCreateReqVO createReqVO) { - // 校验分类、品牌 - validateCategory(createReqVO.getCategoryId()); - brandService.validateProductBrand(createReqVO.getBrandId()); - // 校验 SKU - List skuSaveReqList = createReqVO.getSkus(); - productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); - - ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO); - // 初始化 SPU 中 SKU 相关属性 - initSpuFromSkus(spu, skuSaveReqList); - // 插入 SPU - productSpuMapper.insert(spu); - // 插入 SKU - productSkuService.createSkuList(spu.getId(), skuSaveReqList); - // 返回 - return spu.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateSpu(ProductSpuUpdateReqVO updateReqVO) { - // 校验 SPU 是否存在 - validateSpuExists(updateReqVO.getId()); - // 校验分类、品牌 - validateCategory(updateReqVO.getCategoryId()); - brandService.validateProductBrand(updateReqVO.getBrandId()); - // 校验SKU - List skuSaveReqList = updateReqVO.getSkus(); - productSkuService.validateSkuList(skuSaveReqList, updateReqVO.getSpecType()); - - // 更新 SPU - ProductSpuDO updateObj = ProductSpuConvert.INSTANCE.convert(updateReqVO); - initSpuFromSkus(updateObj, skuSaveReqList); - productSpuMapper.updateById(updateObj); - // 批量更新 SKU - productSkuService.updateSkuList(updateObj.getId(), updateReqVO.getSkus()); - } - - /** - * 基于 SKU 的信息,初始化 SPU 的信息 - * 主要是计数相关的字段,例如说市场价、最大最小价、库存等等 - * - * @param spu 商品 SPU - * @param skus 商品 SKU 数组 - */ - private void initSpuFromSkus(ProductSpuDO spu, List skus) { - // sku 单价最低的商品的价格 - spu.setPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getPrice)); - // sku 单价最低的商品的市场价格 - spu.setMarketPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getMarketPrice)); - // sku 单价最低的商品的成本价格 - spu.setCostPrice(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getCostPrice)); - // sku 单价最低的商品的条形码 TODO 芋艿:条形码字段,是不是可以删除 - spu.setBarCode(""); -// spu.setBarCode(getMinValue(skus, ProductSkuCreateOrUpdateReqVO::getBarCode)); - // skus 库存总数 - spu.setStock(getSumValue(skus, ProductSkuCreateOrUpdateReqVO::getStock, Integer::sum)); - // 若是 spu 已有状态则不处理 - if (spu.getStatus() == null) { - // 默认状态为上架 - spu.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()); - // 默认商品销量 - spu.setSalesCount(0); - // 默认商品浏览量 - spu.setBrowseCount(0); - } - } - - /** - * 校验商品分类是否合法 - * - * @param id 商品分类编号 - */ - private void validateCategory(Long id) { - categoryService.validateCategory(id); - // 校验层级 - if (categoryService.getCategoryLevel(id) < CATEGORY_LEVEL) { - throw exception(SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteSpu(Long id) { - // 校验存在 - validateSpuExists(id); - // 校验商品状态不是回收站不能删除 - ProductSpuDO spuDO = productSpuMapper.selectById(id); - // 判断 SPU 状态是否为回收站 - if (ObjectUtil.notEqual(spuDO.getStatus(), ProductSpuStatusEnum.RECYCLE.getStatus())) { - throw exception(SPU_NOT_RECYCLE); - } - - // 删除 SPU - productSpuMapper.deleteById(id); - // 删除关联的 SKU - productSkuService.deleteSkuBySpuId(id); - } - - private void validateSpuExists(Long id) { - if (productSpuMapper.selectById(id) == null) { - throw exception(SPU_NOT_EXISTS); - } - } - - @Override - public ProductSpuDO getSpu(Long id) { - return productSpuMapper.selectById(id); - } - - @Override - public List getSpuList(Collection ids) { - return productSpuMapper.selectBatchIds(ids); - } - - @Override - public List getSpuList() { - return productSpuMapper.selectList(); - } - - @Override - public List getSpuList(ProductSpuExportReqVO reqVO) { - return productSpuMapper.selectList(reqVO); - } - - @Override - public PageResult getSpuPage(ProductSpuPageReqVO pageReqVO) { - return productSpuMapper.selectPage(pageReqVO); - } - - @Override - public PageResult getSpuPage(AppProductSpuPageReqVO pageReqVO) { - // 查找时,如果查找某个分类编号,则包含它的子分类。因为顶级分类不包含商品 - Set categoryIds = new HashSet<>(); - if (pageReqVO.getCategoryId() != null && pageReqVO.getCategoryId() > 0) { - categoryIds.add(pageReqVO.getCategoryId()); - List categoryChildren = categoryService.getEnableCategoryList(new ProductCategoryListReqVO() - .setParentId(pageReqVO.getCategoryId()).setStatus(CommonStatusEnum.ENABLE.getStatus())); - categoryIds.addAll(CollectionUtils.convertList(categoryChildren, ProductCategoryDO::getId)); - } - // 分页查询 - return productSpuMapper.selectPage(pageReqVO, categoryIds); - } - - @Override - public List getSpuList(String recommendType, Integer count) { - return productSpuMapper.selectListByRecommendType(recommendType, count); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateSpuStock(Map stockIncrCounts) { - stockIncrCounts.forEach((id, incCount) -> productSpuMapper.updateStock(id, incCount)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateSpuStatus(ProductSpuUpdateStatusReqVO updateReqVO) { - // 校验存在 - validateSpuExists(updateReqVO.getId()); - - // 更新状态 - ProductSpuDO productSpuDO = productSpuMapper.selectById(updateReqVO.getId()).setStatus(updateReqVO.getStatus()); - productSpuMapper.updateById(productSpuDO); - } - - @Override - public Map getTabsCount() { - Map counts = Maps.newLinkedHashMapWithExpectedSize(5); - // 查询销售中的商品数量 - counts.put(ProductSpuPageReqVO.FOR_SALE, - productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus())); - // 查询仓库中的商品数量 - counts.put(ProductSpuPageReqVO.IN_WAREHOUSE, - productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus())); - // 查询售空的商品数量 - counts.put(ProductSpuPageReqVO.SOLD_OUT, - productSpuMapper.selectCount(ProductSpuDO::getStock, 0)); - // 查询触发警戒库存的商品数量 - counts.put(ProductSpuPageReqVO.ALERT_STOCK, - productSpuMapper.selectCount()); - // 查询回收站中的商品数量 - counts.put(ProductSpuPageReqVO.RECYCLE_BIN, - productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus())); - return counts; - } - - @Override - public Long getSpuCountByCategoryId(Long categoryId) { - return productSpuMapper.selectCount(ProductSpuDO::getCategoryId, categoryId); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/brand/ProductBrandServiceImplTest.java b/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/brand/ProductBrandServiceImplTest.java deleted file mode 100644 index 15886c10..00000000 --- a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/brand/ProductBrandServiceImplTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.win.module.product.service.brand; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandPageReqVO; -import com.win.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO; -import com.win.module.product.dal.dataobject.brand.ProductBrandDO; -import com.win.module.product.dal.mysql.brand.ProductBrandMapper; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.product.enums.ErrorCodeConstants.BRAND_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link ProductBrandServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(ProductBrandServiceImpl.class) -public class ProductBrandServiceImplTest extends BaseDbUnitTest { - - @Resource - private ProductBrandServiceImpl brandService; - - @Resource - private ProductBrandMapper brandMapper; - - @Test - public void testCreateBrand_success() { - // 准备参数 - ProductBrandCreateReqVO reqVO = randomPojo(ProductBrandCreateReqVO.class); - - // 调用 - Long brandId = brandService.createBrand(reqVO); - // 断言 - assertNotNull(brandId); - // 校验记录的属性是否正确 - ProductBrandDO brand = brandMapper.selectById(brandId); - assertPojoEquals(reqVO, brand); - } - - @Test - public void testUpdateBrand_success() { - // mock 数据 - ProductBrandDO dbBrand = randomPojo(ProductBrandDO.class); - brandMapper.insert(dbBrand);// @Sql: 先插入出一条存在的数据 - // 准备参数 - ProductBrandUpdateReqVO reqVO = randomPojo(ProductBrandUpdateReqVO.class, o -> { - o.setId(dbBrand.getId()); // 设置更新的 ID - }); - - // 调用 - brandService.updateBrand(reqVO); - // 校验是否更新正确 - ProductBrandDO brand = brandMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, brand); - } - - @Test - public void testUpdateBrand_notExists() { - // 准备参数 - ProductBrandUpdateReqVO reqVO = randomPojo(ProductBrandUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> brandService.updateBrand(reqVO), BRAND_NOT_EXISTS); - } - - @Test - public void testDeleteBrand_success() { - // mock 数据 - ProductBrandDO dbBrand = randomPojo(ProductBrandDO.class); - brandMapper.insert(dbBrand);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbBrand.getId(); - - // 调用 - brandService.deleteBrand(id); - // 校验数据不存在了 - assertNull(brandMapper.selectById(id)); - } - - @Test - public void testDeleteBrand_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> brandService.deleteBrand(id), BRAND_NOT_EXISTS); - } - - @Test - public void testGetBrandPage() { - // mock 数据 - ProductBrandDO dbBrand = randomPojo(ProductBrandDO.class, o -> { // 等会查询到 - o.setName("芋道源码"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(buildTime(2022, 2, 1)); - }); - brandMapper.insert(dbBrand); - // 测试 name 不匹配 - brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setName("源码"))); - // 测试 status 不匹配 - brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setCreateTime(buildTime(2022, 3, 1)))); - // 准备参数 - ProductBrandPageReqVO reqVO = new ProductBrandPageReqVO(); - reqVO.setName("芋道"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setCreateTime((new LocalDateTime[]{buildTime(2022, 1, 1), buildTime(2022, 2, 25)})); - - // 调用 - PageResult pageResult = brandService.getBrandPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbBrand, pageResult.getList().get(0)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/category/ProductCategoryServiceImplTest.java b/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/category/ProductCategoryServiceImplTest.java deleted file mode 100644 index c49ec548..00000000 --- a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/category/ProductCategoryServiceImplTest.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.win.module.product.service.category; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import com.win.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; -import com.win.module.product.dal.dataobject.category.ProductCategoryDO; -import com.win.module.product.dal.mysql.category.ProductCategoryMapper; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.product.dal.dataobject.category.ProductCategoryDO.PARENT_ID_NULL; -import static com.win.module.product.enums.ErrorCodeConstants.CATEGORY_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link ProductCategoryServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(ProductCategoryServiceImpl.class) -public class ProductCategoryServiceImplTest extends BaseDbUnitTest { - - @Resource - private ProductCategoryServiceImpl productCategoryService; - - @Resource - private ProductCategoryMapper productCategoryMapper; - - @Test - public void testCreateCategory_success() { - // 准备参数 - ProductCategoryCreateReqVO reqVO = randomPojo(ProductCategoryCreateReqVO.class); - - // mock 父类 - ProductCategoryDO parentProductCategory = randomPojo(ProductCategoryDO.class, o -> { - reqVO.setParentId(o.getId()); - o.setParentId(PARENT_ID_NULL); - }); - productCategoryMapper.insert(parentProductCategory); - - // 调用 - Long categoryId = productCategoryService.createCategory(reqVO); - // 断言 - assertNotNull(categoryId); - // 校验记录的属性是否正确 - ProductCategoryDO category = productCategoryMapper.selectById(categoryId); - assertPojoEquals(reqVO, category); - } - - @Test - public void testUpdateCategory_success() { - // mock 数据 - ProductCategoryDO dbCategory = randomPojo(ProductCategoryDO.class); - productCategoryMapper.insert(dbCategory);// @Sql: 先插入出一条存在的数据 - // 准备参数 - ProductCategoryUpdateReqVO reqVO = randomPojo(ProductCategoryUpdateReqVO.class, o -> { - o.setId(dbCategory.getId()); // 设置更新的 ID - }); - // mock 父类 - ProductCategoryDO parentProductCategory = randomPojo(ProductCategoryDO.class, o -> o.setId(reqVO.getParentId())); - productCategoryMapper.insert(parentProductCategory); - - // 调用 - productCategoryService.updateCategory(reqVO); - // 校验是否更新正确 - ProductCategoryDO category = productCategoryMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, category); - } - - @Test - public void testUpdateCategory_notExists() { - // 准备参数 - ProductCategoryUpdateReqVO reqVO = randomPojo(ProductCategoryUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> productCategoryService.updateCategory(reqVO), CATEGORY_NOT_EXISTS); - } - - @Test - public void testDeleteCategory_success() { - // mock 数据 - ProductCategoryDO dbCategory = randomPojo(ProductCategoryDO.class); - productCategoryMapper.insert(dbCategory);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbCategory.getId(); - - // 调用 - productCategoryService.deleteCategory(id); - // 校验数据不存在了 - assertNull(productCategoryMapper.selectById(id)); - } - - @Test - public void testDeleteCategory_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> productCategoryService.deleteCategory(id), CATEGORY_NOT_EXISTS); - } - - @Test - public void testGetCategoryLevel() { - // mock 数据 - ProductCategoryDO category1 = randomPojo(ProductCategoryDO.class, - o -> o.setParentId(PARENT_ID_NULL)); - productCategoryMapper.insert(category1); - ProductCategoryDO category2 = randomPojo(ProductCategoryDO.class, - o -> o.setParentId(category1.getId())); - productCategoryMapper.insert(category2); - ProductCategoryDO category3 = randomPojo(ProductCategoryDO.class, - o -> o.setParentId(category2.getId())); - productCategoryMapper.insert(category3); - - // 调用,并断言 - assertEquals(productCategoryService.getCategoryLevel(category1.getId()), 1); - assertEquals(productCategoryService.getCategoryLevel(category2.getId()), 2); - assertEquals(productCategoryService.getCategoryLevel(category3.getId()), 3); - } - - @Test - public void testGetCategoryList() { - // mock 数据 - ProductCategoryDO dbCategory = randomPojo(ProductCategoryDO.class, o -> { // 等会查询到 - o.setName("奥特曼"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setParentId(PARENT_ID_NULL); - }); - productCategoryMapper.insert(dbCategory); - // 测试 name 不匹配 - productCategoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setName("奥特块"))); - // 测试 status 不匹配 - productCategoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 parentId 不匹配 - productCategoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setParentId(3333L))); - // 准备参数 - ProductCategoryListReqVO reqVO = new ProductCategoryListReqVO(); - reqVO.setName("特曼"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setParentId(PARENT_ID_NULL); - - // 调用 - List list = productCategoryService.getEnableCategoryList(reqVO); - List all = productCategoryService.getEnableCategoryList(new ProductCategoryListReqVO()); - // 断言 - assertEquals(1, list.size()); - assertEquals(4, all.size()); - assertPojoEquals(dbCategory, list.get(0)); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/comment/ProductCommentServiceImplTest.java b/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/comment/ProductCommentServiceImplTest.java deleted file mode 100644 index 61bfd26a..00000000 --- a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/comment/ProductCommentServiceImplTest.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.win.module.product.service.comment; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.product.controller.admin.comment.vo.ProductCommentPageReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentRespVO; -import com.win.module.product.controller.admin.comment.vo.ProductCommentUpdateVisibleReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentPageReqVO; -import com.win.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; -import com.win.module.product.convert.comment.ProductCommentConvert; -import com.win.module.product.dal.dataobject.comment.ProductCommentDO; -import com.win.module.product.dal.mysql.comment.ProductCommentMapper; -import com.win.module.product.enums.comment.ProductCommentScoresEnum; -import com.win.module.product.service.sku.ProductSkuService; -import com.win.module.product.service.spu.ProductSpuService; -import com.win.module.trade.api.order.TradeOrderApi; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Lazy; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.Date; - -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -// TODO 芋艿:单测详细 review 下 -/** - * {@link ProductCommentServiceImpl} 的单元测试类 - * - * @author wangzhs - */ -@Import(ProductCommentServiceImpl.class) -public class ProductCommentServiceImplTest extends BaseDbUnitTest { - - @Resource - private ProductCommentMapper productCommentMapper; - - @Resource - @Lazy - private ProductCommentServiceImpl productCommentService; - - @MockBean - private TradeOrderApi tradeOrderApi; - @MockBean - private ProductSpuService productSpuService; - @MockBean - private ProductSkuService productSkuService; - - public String generateNo() { - return DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomInt(100000, 999999); - } - - public Long generateId() { - return RandomUtil.randomLong(100000, 999999); - } - - @Test - public void testCreateCommentAndGet_success() { - // mock 测试 - ProductCommentDO productComment = randomPojo(ProductCommentDO.class); - productCommentMapper.insert(productComment); - - // 断言 - // 校验记录的属性是否正确 - ProductCommentDO comment = productCommentMapper.selectById(productComment.getId()); - assertPojoEquals(productComment, comment); - } - - @Test - public void testGetCommentPage_success() { - // 准备参数 - ProductCommentDO productComment = randomPojo(ProductCommentDO.class, o -> { - o.setUserNickname("王二狗"); - o.setSpuName("感冒药"); - o.setScores(ProductCommentScoresEnum.FOUR.getScores()); - o.setReplyStatus(Boolean.TRUE); - o.setVisible(Boolean.TRUE); - o.setId(generateId()); - o.setUserId(generateId()); - o.setAnonymous(Boolean.TRUE); - o.setOrderId(generateId()); - o.setOrderItemId(generateId()); - o.setSpuId(generateId()); - o.setSkuId(generateId()); - o.setDescriptionScores(ProductCommentScoresEnum.FOUR.getScores()); - o.setBenefitScores(ProductCommentScoresEnum.FOUR.getScores()); - o.setContent("真好吃"); - o.setReplyUserId(generateId()); - o.setReplyContent("确实"); - o.setReplyTime(LocalDateTime.now()); - o.setCreateTime(LocalDateTime.now()); - o.setUpdateTime(LocalDateTime.now()); - }); - productCommentMapper.insert(productComment); - - Long orderId = productComment.getOrderId(); - Long spuId = productComment.getSpuId(); - - // 测试 userNickname 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setUserNickname("王三").setScores(ProductCommentScoresEnum.ONE.getScores()))); - // 测试 orderId 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setOrderId(generateId()))); - // 测试 spuId 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setSpuId(generateId()))); - // 测试 spuName 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setSpuName("感康"))); - // 测试 scores 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setScores(ProductCommentScoresEnum.ONE.getScores()))); - // 测试 replied 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setReplyStatus(Boolean.FALSE))); - // 测试 visible 不匹配 - productCommentMapper.insert(cloneIgnoreId(productComment, o -> o.setVisible(Boolean.FALSE))); - - // 调用 - ProductCommentPageReqVO productCommentPageReqVO = new ProductCommentPageReqVO(); - productCommentPageReqVO.setUserNickname("王二"); - productCommentPageReqVO.setOrderId(orderId); - productCommentPageReqVO.setSpuId(spuId); - productCommentPageReqVO.setSpuName("感冒药"); - productCommentPageReqVO.setScores(ProductCommentScoresEnum.FOUR.getScores()); - productCommentPageReqVO.setReplyStatus(Boolean.TRUE); - - PageResult commentPage = productCommentService.getCommentPage(productCommentPageReqVO); - PageResult result = ProductCommentConvert.INSTANCE.convertPage(productCommentMapper.selectPage(productCommentPageReqVO)); - assertEquals(result.getTotal(), commentPage.getTotal()); - - PageResult all = productCommentService.getCommentPage(new ProductCommentPageReqVO()); - assertEquals(8, all.getTotal()); - - // 测试获取所有商品分页评论数据 - PageResult result1 = productCommentService.getCommentPage(new AppCommentPageReqVO(), Boolean.TRUE); - assertEquals(7, result1.getTotal()); - - // 测试获取所有商品分页中评数据 - PageResult result2 = productCommentService.getCommentPage(new AppCommentPageReqVO().setType(AppCommentPageReqVO.MEDIOCRE_COMMENT), Boolean.TRUE); - assertEquals(2, result2.getTotal()); - - // 测试获取指定 spuId 商品分页中评数据 - PageResult result3 = productCommentService.getCommentPage(new AppCommentPageReqVO().setSpuId(spuId).setType(AppCommentPageReqVO.MEDIOCRE_COMMENT), Boolean.TRUE); - assertEquals(2, result3.getTotal()); - - // 测试分页 tab count - AppCommentStatisticsRespVO tabsCount = productCommentService.getCommentStatistics(spuId, Boolean.TRUE); - assertEquals(4, tabsCount.getGoodCount()); - assertEquals(2, tabsCount.getMediocreCount()); - assertEquals(0, tabsCount.getNegativeCount()); - - } - - @Test - public void testUpdateCommentVisible_success() { - // mock 测试 - ProductCommentDO productComment = randomPojo(ProductCommentDO.class, o -> { - o.setVisible(Boolean.TRUE); - }); - productCommentMapper.insert(productComment); - - Long productCommentId = productComment.getId(); - - ProductCommentUpdateVisibleReqVO updateReqVO = new ProductCommentUpdateVisibleReqVO(); - updateReqVO.setId(productCommentId); - updateReqVO.setVisible(Boolean.FALSE); - productCommentService.updateCommentVisible(updateReqVO); - - ProductCommentDO productCommentDO = productCommentMapper.selectById(productCommentId); - assertFalse(productCommentDO.getVisible()); - } - - - @Test - public void testCommentReply_success() { - // mock 测试 - ProductCommentDO productComment = randomPojo(ProductCommentDO.class); - productCommentMapper.insert(productComment); - - Long productCommentId = productComment.getId(); - - ProductCommentReplyReqVO replyVO = new ProductCommentReplyReqVO(); - replyVO.setId(productCommentId); - replyVO.setReplyContent("测试"); - productCommentService.replyComment(replyVO, 1L); - - ProductCommentDO productCommentDO = productCommentMapper.selectById(productCommentId); - assertEquals("测试", productCommentDO.getReplyContent()); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/sku/ProductSkuServiceTest.java b/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/sku/ProductSkuServiceTest.java deleted file mode 100644 index 93da8662..00000000 --- a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/sku/ProductSkuServiceTest.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.win.module.product.service.sku; - -import cn.hutool.core.util.RandomUtil; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.framework.test.core.util.AssertUtils; -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.dal.dataobject.sku.ProductSkuDO; -import com.win.module.product.dal.mysql.sku.ProductSkuMapper; -import com.win.module.product.service.property.ProductPropertyService; -import com.win.module.product.service.property.ProductPropertyValueService; -import com.win.module.product.service.spu.ProductSpuService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; - -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_STOCK_NOT_ENOUGH; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.verify; - -/** - * {@link ProductSkuServiceImpl} 的单元测试 - * - * @author 芋道源码 - */ -@Import(ProductSkuServiceImpl.class) -public class ProductSkuServiceTest extends BaseDbUnitTest { - - @Resource - private ProductSkuService productSkuService; - - @Resource - private ProductSkuMapper productSkuMapper; - - @MockBean - private ProductSpuService productSpuService; - @MockBean - private ProductPropertyService productPropertyService; - @MockBean - private ProductPropertyValueService productPropertyValueService; - - public Long generateId() { - return RandomUtil.randomLong(100000, 999999); - } - - @Test - public void testUpdateSkuList() { - // mock 数据 - ProductSkuDO sku01 = randomPojo(ProductSkuDO.class, o -> { // 测试更新 - o.setSpuId(1L); - o.setProperties(singletonList(new ProductSkuDO.Property( - 10L, "颜色", 20L, "红色"))); - }); - productSkuMapper.insert(sku01); - ProductSkuDO sku02 = randomPojo(ProductSkuDO.class, o -> { // 测试删除 - o.setSpuId(1L); - o.setProperties(singletonList(new ProductSkuDO.Property( - 10L, "颜色", 30L, "蓝色"))); - - }); - productSkuMapper.insert(sku02); - // 准备参数 - Long spuId = 1L; - String spuName = "测试商品"; - List skus = Arrays.asList( - randomPojo(ProductSkuCreateOrUpdateReqVO.class, o -> { // 测试更新 - o.setProperties(singletonList(new ProductSkuCreateOrUpdateReqVO.Property( - 10L, "颜色", 20L, "红色"))); - }), - randomPojo(ProductSkuCreateOrUpdateReqVO.class, o -> { // 测试新增 - o.setProperties(singletonList(new ProductSkuCreateOrUpdateReqVO.Property( - 10L, "颜色", 20L, "红色"))); - }) - ); - - // 调用 - productSkuService.updateSkuList(spuId, skus); - // 断言 - List dbSkus = productSkuMapper.selectListBySpuId(spuId); - assertEquals(dbSkus.size(), 2); - // 断言更新的 - assertEquals(dbSkus.get(0).getId(), sku01.getId()); - assertPojoEquals(dbSkus.get(0), skus.get(0), "properties"); - assertEquals(skus.get(0).getProperties().size(), 1); - assertPojoEquals(dbSkus.get(0).getProperties().get(0), skus.get(0).getProperties().get(0)); - // 断言新增的 - assertNotEquals(dbSkus.get(1).getId(), sku02.getId()); - assertPojoEquals(dbSkus.get(1), skus.get(1), "properties"); - assertEquals(skus.get(1).getProperties().size(), 1); - assertPojoEquals(dbSkus.get(1).getProperties().get(0), skus.get(1).getProperties().get(0)); - } - - @Test - public void testUpdateSkuStock_incrSuccess() { - // 准备参数 - ProductSkuUpdateStockReqDTO updateStockReqDTO = new ProductSkuUpdateStockReqDTO() - .setItems(singletonList(new ProductSkuUpdateStockReqDTO.Item().setId(1L).setIncrCount(10))); - // mock 数据 - productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> { - o.setId(1L).setSpuId(10L).setStock(20); - o.getProperties().forEach(p -> { - // 指定 id 范围 解决 Value too long - p.setPropertyId(generateId()); - p.setValueId(generateId()); - }); - })); - - // 调用 - productSkuService.updateSkuStock(updateStockReqDTO); - // 断言 - ProductSkuDO sku = productSkuMapper.selectById(1L); - assertEquals(sku.getStock(), 30); - verify(productSpuService).updateSpuStock(argThat(spuStockIncrCounts -> { - assertEquals(spuStockIncrCounts.size(), 1); - assertEquals(spuStockIncrCounts.get(10L), 10); - return true; - })); - } - - @Test - public void testUpdateSkuStock_decrSuccess() { - // 准备参数 - ProductSkuUpdateStockReqDTO updateStockReqDTO = new ProductSkuUpdateStockReqDTO() - .setItems(singletonList(new ProductSkuUpdateStockReqDTO.Item().setId(1L).setIncrCount(-10))); - // mock 数据 - productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> { - o.setId(1L).setSpuId(10L).setStock(20); - o.getProperties().forEach(p -> { - // 指定 id 范围 解决 Value too long - p.setPropertyId(generateId()); - p.setValueId(generateId()); - }); - })); - - // 调用 - productSkuService.updateSkuStock(updateStockReqDTO); - // 断言 - ProductSkuDO sku = productSkuMapper.selectById(1L); - assertEquals(sku.getStock(), 10); - verify(productSpuService).updateSpuStock(argThat(spuStockIncrCounts -> { - assertEquals(spuStockIncrCounts.size(), 1); - assertEquals(spuStockIncrCounts.get(10L), -10); - return true; - })); - } - - @Test - public void testUpdateSkuStock_decrFail() { - // 准备参数 - ProductSkuUpdateStockReqDTO updateStockReqDTO = new ProductSkuUpdateStockReqDTO() - .setItems(singletonList(new ProductSkuUpdateStockReqDTO.Item().setId(1L).setIncrCount(-30))); - // mock 数据 - productSkuMapper.insert(randomPojo(ProductSkuDO.class, o -> { - o.setId(1L).setSpuId(10L).setStock(20); - o.getProperties().forEach(p -> { - // 指定 id 范围 解决 Value too long - p.setPropertyId(generateId()); - p.setValueId(generateId()); - }); - })); - // 调用并断言 - AssertUtils.assertServiceException(() -> productSkuService.updateSkuStock(updateStockReqDTO), - SKU_STOCK_NOT_ENOUGH); - } - - @Test - public void testDeleteSku_success() { - ProductSkuDO dbSku = randomPojo(ProductSkuDO.class, o -> { - o.setId(generateId()).setSpuId(generateId()); - o.getProperties().forEach(p -> { - // 指定 id 范围 解决 Value too long - p.setPropertyId(generateId()); - p.setValueId(generateId()); - }); - }); - // mock 数据 - productSkuMapper.insert(dbSku); - // 准备参数 - Long id = dbSku.getId(); - - // 调用 - productSkuService.deleteSku(id); - // 校验数据不存在了 - assertNull(productSkuMapper.selectById(id)); - } - - @Test - public void testDeleteSku_notExists() { - // 准备参数 - Long id = 1L; - - // 调用, 并断言异常 - assertServiceException(() -> productSkuService.deleteSku(id), SKU_NOT_EXISTS); - } -} diff --git a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/spu/ProductSpuServiceImplTest.java b/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/spu/ProductSpuServiceImplTest.java deleted file mode 100644 index cd577c66..00000000 --- a/win-module-mall/win-module-product-biz/src/test/java/com/win/module/product/service/spu/ProductSpuServiceImplTest.java +++ /dev/null @@ -1,503 +0,0 @@ -package com.win.module.product.service.spu; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.exception.ServiceException; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; -import com.win.module.product.controller.admin.spu.vo.ProductSpuCreateReqVO; -import com.win.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; -import com.win.module.product.controller.admin.spu.vo.ProductSpuRespVO; -import com.win.module.product.controller.admin.spu.vo.ProductSpuUpdateReqVO; -import com.win.module.product.convert.spu.ProductSpuConvert; -import com.win.module.product.dal.dataobject.spu.ProductSpuDO; -import com.win.module.product.dal.mysql.spu.ProductSpuMapper; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.product.service.brand.ProductBrandServiceImpl; -import com.win.module.product.service.category.ProductCategoryServiceImpl; -import com.win.module.product.service.property.ProductPropertyService; -import com.win.module.product.service.property.ProductPropertyValueService; -import com.win.module.product.service.sku.ProductSkuServiceImpl; -import com.google.common.collect.Lists; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static org.assertj.core.util.Lists.newArrayList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -// TODO @芋艿:review 下单元测试 - -/** - * {@link ProductSpuServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(ProductSpuServiceImpl.class) -public class ProductSpuServiceImplTest extends BaseDbUnitTest { - - @Resource - private ProductSpuServiceImpl productSpuService; - - @Resource - private ProductSpuMapper productSpuMapper; - - @MockBean - private ProductSkuServiceImpl productSkuService; - @MockBean - private ProductCategoryServiceImpl categoryService; - @MockBean - private ProductBrandServiceImpl brandService; - @MockBean - private ProductPropertyService productPropertyService; - @MockBean - private ProductPropertyValueService productPropertyValueService; - - public String generateNo() { - return DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomInt(100000, 999999); - } - - public Long generateId() { - return RandomUtil.randomLong(100000, 999999); - } - - public int generaInt(){return RandomUtil.randomInt(1,9999999);} - - // TODO @芋艿:单测后续 review 哈 - - @Test - public void testCreateSpu_success() { - // 准备参数 - ProductSkuCreateOrUpdateReqVO skuCreateOrUpdateReqVO = randomPojo(ProductSkuCreateOrUpdateReqVO.class,o->{ - // 限制范围为正整数 - o.setCostPrice(generaInt()); - o.setPrice(generaInt()); - o.setMarketPrice(generaInt()); - o.setStock(generaInt()); - o.setWarnStock(10); - o.setSubCommissionFirstPrice(generaInt()); - o.setSubCommissionSecondPrice(generaInt()); - // 限制分数为两位数 - o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); - o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); - }); - ProductSpuCreateReqVO createReqVO = randomPojo(ProductSpuCreateReqVO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setSkus(newArrayList(skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO)); - }); - when(categoryService.getCategoryLevel(eq(createReqVO.getCategoryId()))).thenReturn(2); - Long spu = productSpuService.createSpu(createReqVO); - ProductSpuDO productSpuDO = productSpuMapper.selectById(spu); - assertPojoEquals(createReqVO, productSpuDO); - } - - @Test - public void testUpdateSpu_success() { - // 准备参数 - ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - }); - productSpuMapper.insert(createReqVO); - // 准备参数 - ProductSkuCreateOrUpdateReqVO skuCreateOrUpdateReqVO = randomPojo(ProductSkuCreateOrUpdateReqVO.class,o->{ - // 限制范围为正整数 - o.setCostPrice(generaInt()); - o.setPrice(generaInt()); - o.setMarketPrice(generaInt()); - o.setStock(generaInt()); - o.setWarnStock(10); - o.setSubCommissionFirstPrice(generaInt()); - o.setSubCommissionSecondPrice(generaInt()); - // 限制分数为两位数 - o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); - o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); - }); - // 准备参数 - ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class, o -> { - o.setId(createReqVO.getId()); // 设置更新的 ID - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - o.setStatus(0); - o.setSkus(newArrayList(skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO,skuCreateOrUpdateReqVO)); - }); - when(categoryService.getCategoryLevel(eq(reqVO.getCategoryId()))).thenReturn(2); - // 调用 - productSpuService.updateSpu(reqVO); - // 校验是否更新正确 - ProductSpuDO spu = productSpuMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, spu); - } - - @Test - public void testValidateSpuExists_exception() { - ProductSpuUpdateReqVO reqVO = randomPojo(ProductSpuUpdateReqVO.class); - // 调用 - Assertions.assertThrows(ServiceException.class, () -> productSpuService.updateSpu(reqVO)); - } - - @Test - void deleteSpu() { - // 准备参数 - ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - o.setStatus(-1); // 加入回收站才可删除 - }); - productSpuMapper.insert(createReqVO); - - // 调用 - productSpuService.deleteSpu(createReqVO.getId()); - - Assertions.assertNull(productSpuMapper.selectById(createReqVO.getId())); - } - - @Test - void getSpu() { - // 准备参数 - ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - }); - productSpuMapper.insert(createReqVO); - - ProductSpuDO spu = productSpuService.getSpu(createReqVO.getId()); - assertPojoEquals(createReqVO, spu); - } - - @Test - void getSpuList() { - // 准备参数 - ArrayList createReqVOs = Lists.newArrayList(randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - }), randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - })); - productSpuMapper.insertBatch(createReqVOs); - - // 调用 - List spuList = productSpuService.getSpuList(createReqVOs.stream().map(ProductSpuDO::getId).collect(Collectors.toList())); - Assertions.assertIterableEquals(createReqVOs, spuList); - } - - @Test - void getSpuPage_alarmStock_empty() { - // 准备参数 - ArrayList createReqVOs = Lists.newArrayList(randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(11); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - }), randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(11); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - })); - productSpuMapper.insertBatch(createReqVOs); - // 调用 - ProductSpuPageReqVO productSpuPageReqVO = new ProductSpuPageReqVO(); - productSpuPageReqVO.setTabType(ProductSpuPageReqVO.ALERT_STOCK); - - PageResult spuPage = productSpuService.getSpuPage(productSpuPageReqVO); - - PageResult result = PageResult.empty(); - Assertions.assertIterableEquals(result.getList(), spuPage.getList()); - assertEquals(spuPage.getTotal(), result.getTotal()); - } - - @Test - void getSpuPage_alarmStock() { - // 准备参数 - ArrayList createReqVOs = Lists.newArrayList(randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(5); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - }), randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(9); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - })); - productSpuMapper.insertBatch(createReqVOs); - // 调用 - ProductSpuPageReqVO productSpuPageReqVO = new ProductSpuPageReqVO(); - productSpuPageReqVO.setTabType(ProductSpuPageReqVO.ALERT_STOCK); - PageResult spuPage = productSpuService.getSpuPage(productSpuPageReqVO); - assertEquals(createReqVOs.size(), spuPage.getTotal()); - } - - @Test - void testGetSpuPage() { - // 准备参数 - ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class,o->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - }); - - // 准备参数 - productSpuMapper.insert(createReqVO); - // 测试 status 不匹配 - productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setStatus(ProductSpuStatusEnum.DISABLE.getStatus()))); - productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setStatus(ProductSpuStatusEnum.RECYCLE.getStatus()))); - // 测试 SpecType 不匹配 - productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setSpecType(true))); - // 测试 BrandId 不匹配 - productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setBrandId(generateId()))); - // 测试 CategoryId 不匹配 - productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setCategoryId(generateId()))); - - // 调用 - ProductSpuPageReqVO productSpuPageReqVO = new ProductSpuPageReqVO(); - // 查询条件 按需打开 - //productSpuPageReqVO.setTabType(ProductSpuPageReqVO.ALERT_STOCK); - //productSpuPageReqVO.setTabType(ProductSpuPageReqVO.RECYCLE_BIN); - //productSpuPageReqVO.setTabType(ProductSpuPageReqVO.FOR_SALE); - //productSpuPageReqVO.setTabType(ProductSpuPageReqVO.IN_WAREHOUSE); - //productSpuPageReqVO.setTabType(ProductSpuPageReqVO.SOLD_OUT); - //productSpuPageReqVO.setName(createReqVO.getName()); - //productSpuPageReqVO.setCategoryId(createReqVO.getCategoryId()); - - PageResult spuPage = productSpuService.getSpuPage(productSpuPageReqVO); - - PageResult result = ProductSpuConvert.INSTANCE.convertPage(productSpuMapper.selectPage(productSpuPageReqVO)); - assertEquals(result.getTotal(), spuPage.getTotal()); - } - - /** - * 生成笛卡尔积 - * - * @param data 数据 - * @return 笛卡尔积 - */ - public static List> cartesianProduct(List> data) { - List> res = null; // 结果集(当前为第N个List,则该处存放的就为前N-1个List的笛卡尔积集合) - for (List list : data) { // 遍历数据 - List> temp = new ArrayList<>(); // 临时结果集,存放本次循环后生成的笛卡尔积集合 - if (res == null) { // 结果集为null表示第一次循环既list为第一个List - for (T t : list) { // 便利第一个List - // 利用stream生成List,第一个List的笛卡尔积集合约等于自己本身(需要创建一个List并把对象添加到当中),存放到临时结果集 - temp.add(Stream.of(t).collect(Collectors.toList())); - } - res = temp; // 将临时结果集赋值给结果集 - continue; // 跳过本次循环 - } - // 不为第一个List,计算前面的集合(笛卡尔积)和当前List的笛卡尔积集合 - for (T t : list) { // 便利 - for (List rl : res) { // 便利前面的笛卡尔积集合 - // 利用stream生成List - temp.add(Stream.concat(rl.stream(), Stream.of(t)).collect(Collectors.toList())); - } - } - res = temp; // 将临时结果集赋值给结果集 - } - // 返回结果 - return res; - } - - @Test - public void testUpdateSpuStock() { - // 准备参数 - Map stockIncrCounts = MapUtil.builder(1L, 10).put(2L, -20).build(); - // mock 方法(数据) - productSpuMapper.insert(randomPojo(ProductSpuDO.class, o ->{ - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - o.setId(1L).setStock(20); - })); - productSpuMapper.insert(randomPojo(ProductSpuDO.class, o -> { - o.setCategoryId(generateId()); - o.setBrandId(generateId()); - o.setDeliveryTemplateId(generateId()); - o.setUnit(RandomUtil.randomInt(1,20)); // 限制商品单位范围 - o.setSort(RandomUtil.randomInt(1,100)); // 限制排序范围 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setVirtualSalesCount(generaInt()); // 限制范围为正整数 - o.setActivityOrders(newArrayList(1,3,2,4,5)); // 活动排序 - o.setPrice(generaInt()); // 限制范围为正整数 - o.setMarketPrice(generaInt()); // 限制范围为正整数 - o.setCostPrice(generaInt()); // 限制范围为正整数 - o.setStock(generaInt()); // 限制范围为正整数 - o.setGiveIntegral(generaInt()); // 限制范围为正整数 - o.setSalesCount(generaInt()); // 限制范围为正整数 - o.setBrowseCount(generaInt()); // 限制范围为正整数 - o.setId(2L).setStock(30); - })); - - // 调用 - productSpuService.updateSpuStock(stockIncrCounts); - // 断言 - assertEquals(productSpuService.getSpu(1L).getStock(), 30); - assertEquals(productSpuService.getSpu(2L).getStock(), 10); - } - -} diff --git a/win-module-mall/win-module-product-biz/src/test/resources/application-unit-test.yaml b/win-module-mall/win-module-product-biz/src/test/resources/application-unit-test.yaml deleted file mode 100644 index 6522b78b..00000000 --- a/win-module-mall/win-module-product-biz/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,50 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: - # 数据源配置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口(单元测试,使用 16379 端口) - database: 0 # 数据库索引 - -mybatis-plus: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 - type-aliases-package: ${win.info.base-package}.module.*.dal.dataobject - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -# 芋道配置项,设置当前项目所有自定义的配置 -win: - info: - base-package: com.win diff --git a/win-module-mall/win-module-product-biz/src/test/resources/logback.xml b/win-module-mall/win-module-product-biz/src/test/resources/logback.xml deleted file mode 100644 index daf756bf..00000000 --- a/win-module-mall/win-module-product-biz/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/win-module-mall/win-module-product-biz/src/test/resources/sql/clean.sql b/win-module-mall/win-module-product-biz/src/test/resources/sql/clean.sql deleted file mode 100644 index e9616cd0..00000000 --- a/win-module-mall/win-module-product-biz/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,7 +0,0 @@ -DELETE FROM "product_sku"; -DELETE FROM "product_spu"; -DELETE FROM "product_category"; -DELETE FROM "product_brand"; -DELETE FROM "product_property"; -DELETE FROM "product_property_value"; -DELETE FROM "product_comment"; diff --git a/win-module-mall/win-module-product-biz/src/test/resources/sql/create_tables.sql b/win-module-mall/win-module-product-biz/src/test/resources/sql/create_tables.sql deleted file mode 100644 index f0f0c70e..00000000 --- a/win-module-mall/win-module-product-biz/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,157 +0,0 @@ -CREATE TABLE IF NOT EXISTS `product_sku` ( - `id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `spu_id` bigint NOT NULL COMMENT 'spu编号', - `properties` varchar(512) DEFAULT NULL COMMENT '属性数组,JSON 格式', - `price` int NOT NULL DEFAULT '-1' COMMENT '商品价格,单位:分', - `market_price` int DEFAULT NULL COMMENT '市场价,单位:分', - `cost_price` int NOT NULL DEFAULT '-1' COMMENT '成本价,单位: 分', - `bar_code` varchar(64) DEFAULT NULL COMMENT 'SKU 的条形码', - `pic_url` varchar(256) NOT NULL COMMENT '图片地址', - `stock` int DEFAULT NULL COMMENT '库存', - `weight` double DEFAULT NULL COMMENT '商品重量,单位:kg 千克', - `volume` double DEFAULT NULL COMMENT '商品体积,单位:m^3 平米', - `sub_commission_first_price` int DEFAULT NULL COMMENT '一级分销的佣金,单位:分', - `sub_commission_second_price` int DEFAULT NULL COMMENT '二级分销的佣金,单位:分', - `sales_count` int DEFAULT NULL COMMENT '商品销量', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY("id") -) COMMENT '商品sku'; - -CREATE TABLE IF NOT EXISTS `product_spu` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品 SPU 编号,自增', - `name` varchar(128) NOT NULL COMMENT '商品名称', - `keyword` varchar(256) NOT NULL COMMENT '关键字', - `introduction` varchar(256) NOT NULL COMMENT '商品简介', - `description` text NOT NULL COMMENT '商品详情', - `bar_code` varchar(64) NOT NULL COMMENT '条形码', - `category_id` bigint NOT NULL COMMENT '商品分类编号', - `brand_id` int DEFAULT NULL COMMENT '商品品牌编号', - `pic_url` varchar(256) NOT NULL COMMENT '商品封面图', - `slider_pic_urls` varchar(2000) DEFAULT '' COMMENT '商品轮播图地址\n 数组,以逗号分隔\n 最多上传15张', - `video_url` varchar(256) DEFAULT NULL COMMENT '商品视频', - `unit` tinyint NOT NULL COMMENT '单位', - `sort` int NOT NULL DEFAULT '0' COMMENT '排序字段', - `status` tinyint NOT NULL COMMENT '商品状态: 0 上架(开启) 1 下架(禁用)-1 回收', - `spec_type` bit(1) NOT NULL COMMENT '规格类型:0 单规格 1 多规格', - `price` int NOT NULL DEFAULT '-1' COMMENT '商品价格,单位使用:分', - `market_price` int NOT NULL COMMENT '市场价,单位使用:分', - `cost_price` int NOT NULL DEFAULT '-1' COMMENT '成本价,单位: 分', - `stock` int NOT NULL DEFAULT '0' COMMENT '库存', - `delivery_template_id` bigint NOT NULL COMMENT '物流配置模板编号', - `recommend_hot` bit(1) NOT NULL COMMENT '是否热卖推荐: 0 默认 1 热卖', - `recommend_benefit` bit(1) NOT NULL COMMENT '是否优惠推荐: 0 默认 1 优选', - `recommend_best` bit(1) NOT NULL COMMENT '是否精品推荐: 0 默认 1 精品', - `recommend_new` bit(1) NOT NULL COMMENT '是否新品推荐: 0 默认 1 新品', - `recommend_good` bit(1) NOT NULL COMMENT '是否优品推荐', - `give_integral` int NOT NULL COMMENT '赠送积分', - `give_coupon_template_ids` varchar(512) DEFAULT '' COMMENT '赠送的优惠劵编号的数组', - `sub_commission_type` bit(1) NOT NULL COMMENT '分销类型', - `activity_orders` varchar(16) NOT NULL DEFAULT '' COMMENT '活动显示排序0=默认, 1=秒杀,2=砍价,3=拼团', - `sales_count` int DEFAULT '0' COMMENT '商品销量', - `virtual_sales_count` int DEFAULT '0' COMMENT '虚拟销量', - `browse_count` int DEFAULT '0' COMMENT '商品点击量', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY("id") -) COMMENT '商品spu'; - -CREATE TABLE IF NOT EXISTS `product_category` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类编号', - `parent_id` bigint NOT NULL COMMENT '父分类编号', - `name` varchar(255) NOT NULL COMMENT '分类名称', - `pic_url` varchar(255) NOT NULL COMMENT '移动端分类图', - `big_pic_url` varchar(255) DEFAULT NULL COMMENT 'PC 端分类图', - `sort` int DEFAULT '0' COMMENT '分类排序', - `status` tinyint NOT NULL COMMENT '开启状态', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY("id") -) COMMENT '商品分类'; - -CREATE TABLE IF NOT EXISTS `product_brand` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '品牌编号', - `name` varchar(255) NOT NULL COMMENT '品牌名称', - `pic_url` varchar(255) NOT NULL COMMENT '品牌图片', - `sort` int DEFAULT '0' COMMENT '品牌排序', - `description` varchar(1024) DEFAULT NULL COMMENT '品牌描述', - `status` tinyint NOT NULL COMMENT '状态', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY("id") -) COMMENT '商品品牌'; - -CREATE TABLE IF NOT EXISTS `product_property` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(64) DEFAULT NULL COMMENT '规格名称', - `status` tinyint DEFAULT NULL COMMENT '状态: 0 开启 ,1 禁用', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - PRIMARY KEY("id") -) COMMENT '规格名称'; - -CREATE TABLE IF NOT EXISTS `product_property_value` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `property_id` bigint DEFAULT NULL COMMENT '规格键id', - `name` varchar(128) DEFAULT NULL COMMENT '规格值名字', - `status` tinyint DEFAULT NULL COMMENT '状态: 1 开启 ,2 禁用', - "creator" varchar(64) DEFAULT '', - "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - PRIMARY KEY("id") -) COMMENT '规格值'; - -DROP TABLE IF EXISTS `product_comment` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论编号,主键自增', - `user_id` bigint DEFAULT NULL COMMENT '评价人的用户编号关联 MemberUserDO 的 id 编号', - `user_nickname` varchar(255) DEFAULT NULL COMMENT '评价人名称', - `user_avatar` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '评价人头像', - `anonymous` bit(1) DEFAULT NULL COMMENT '是否匿名', - `order_id` bigint DEFAULT NULL COMMENT '交易订单编号关联 TradeOrderDO 的 id 编号', - `order_item_id` bigint DEFAULT NULL COMMENT '交易订单项编号关联 TradeOrderItemDO 的 id 编号', - `spu_id` bigint DEFAULT NULL COMMENT '商品 SPU 编号关联 ProductSpuDO 的 id', - `spu_name` varchar(255) DEFAULT NULL COMMENT '商品 SPU 名称', - `sku_id` bigint DEFAULT NULL COMMENT '商品 SKU 编号关联 ProductSkuDO 的 id 编号', - `visible` bit(1) DEFAULT NULL COMMENT '是否可见true:显示false:隐藏', - `scores` tinyint DEFAULT NULL COMMENT '评分星级1-5分', - `description_scores` tinyint DEFAULT NULL COMMENT '描述星级1-5 星', - `benefit_scores` tinyint DEFAULT NULL COMMENT '服务星级1-5 星', - `content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '评论内容', - `pic_urls` varchar(4096) DEFAULT NULL COMMENT '评论图片地址数组', - `reply_status` bit(1) DEFAULT NULL COMMENT '商家是否回复', - `reply_user_id` bigint DEFAULT NULL COMMENT '回复管理员编号关联 AdminUserDO 的 id 编号', - `reply_content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '商家回复内容', - `reply_time` datetime DEFAULT NULL COMMENT '商家回复时间', - `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 NOT NULL DEFAULT '0' COMMENT '租户编号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 26 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '商品评论'; \ No newline at end of file diff --git a/win-module-mall/win-module-promotion-api/pom.xml b/win-module-mall/win-module-promotion-api/pom.xml deleted file mode 100644 index df14f388..00000000 --- a/win-module-mall/win-module-promotion-api/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - com.win - win-module-mall - ${revision} - - 4.0.0 - win-module-promotion-api - jar - - ${project.artifactId} - - market 模块 API,暴露给其它模块调用 - - - - - com.win - win-common - - - - - org.springframework.boot - spring-boot-starter-validation - true - - - - - com.fasterxml.jackson.core - jackson-databind - true - - - - diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApi.java deleted file mode 100644 index 38fa6dc8..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApi.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.promotion.api.bargain; - -/** - * 砍价活动 Api 接口 - * - * @author HUIHUI - */ -public interface BargainActivityApi { - - /** - * 更新砍价活动库存 - * - * @param activityId 砍价活动编号 - * @param count 购买数量 - */ - void updateBargainActivityStock(Long activityId, Integer count); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApi.java deleted file mode 100644 index beedc325..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApi.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.promotion.api.bargain; - -import com.win.module.promotion.api.bargain.dto.BargainRecordCreateReqDTO; - -import javax.validation.Valid; - -// TODO @芋艿:后面也再撸撸这几个接口 - -/** - * 砍价记录 API 接口 - * - * @author HUIHUI - */ -public interface BargainRecordApi { - - /** - * 创建砍价记录 - * - * @param reqDTO 请求 DTO - */ - void createBargainRecord(@Valid BargainRecordCreateReqDTO reqDTO); - - /** - * 查询砍价是否成功 - * - * @param userId 用户编号 - * @param orderId 订单编号 - * @return 砍价是否成功 - */ - boolean isBargainRecordSuccess(Long userId, Long orderId); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/dto/BargainRecordCreateReqDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/dto/BargainRecordCreateReqDTO.java deleted file mode 100644 index 627c630d..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/bargain/dto/BargainRecordCreateReqDTO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.win.module.promotion.api.bargain.dto; - -import lombok.Data; - -import javax.validation.constraints.NotNull; - -// TODO @芋艿:这块要在看看 - -/** - * 砍价记录的创建 Request DTO - * - * @author HUIHUI - */ -@Data -public class BargainRecordCreateReqDTO { - - /** - * 砍价活动编号 - */ - @NotNull(message = "砍价活动编号不能为空") - private Long activityId; - /** - * spu 编号 - */ - @NotNull(message = "spu 编号不能为空") - private Long spuId; - /** - * sku 编号 - */ - @NotNull(message = "sku 编号不能为空") - private Long skuId; - /** - * 用户编号 - */ - @NotNull(message = "用户编号不能为空") - private Long userId; - /** - * 订单编号 - */ - @NotNull(message = "订单编号不能为空") - private Long orderId; - - /** - * 砍价商品单价 - */ - @NotNull(message = "砍价底价不能为空") - private Integer bargainPrice; - /** - * 商品原价,单位分 - */ - @NotNull(message = "商品原价不能为空") - private Integer price; - - /** - * 开团状态:进行中 砍价成功 砍价失败 - */ - @NotNull(message = "开团状态不能为空") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApi.java deleted file mode 100644 index 66455b7c..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApi.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.win.module.promotion.api.combination; - -import com.win.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; -import com.win.module.promotion.api.combination.dto.CombinationRecordRespDTO; - -import javax.validation.Valid; -import java.time.LocalDateTime; -import java.util.List; - -// TODO @芋艿:后面也再撸撸这几个接口 - -/** - * 拼团记录 API 接口 - * - * @author HUIHUI - */ -public interface CombinationRecordApi { - - /** - * 创建开团记录 - * - * @param reqDTO 请求 DTO - */ - void createCombinationRecord(@Valid CombinationRecordCreateReqDTO reqDTO); - - /** - * 查询拼团记录是否成功 - * - * @param userId 用户编号 - * @param orderId 订单编号 - * @return 拼团是否成功 - */ - boolean isCombinationRecordSuccess(Long userId, Long orderId); - - /** - * 获取拼团记录 - * - * @param userId 用户编号 - * @param activityId 活动编号 - * @return 拼团记录列表 - */ - List getRecordListByUserIdAndActivityId(Long userId, Long activityId); - - /** - * 验证组合限制数 - * 校验是否满足限购要求 - * - * @param count 本次购买数量 - * @param sumCount 已购买数量合计 - * @param activityId 活动编号 - */ - void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount); - - /** - * 更新拼团状态为成功 - * - * @param userId 用户编号 - * @param orderId 订单编号 - */ - void updateRecordStatusToSuccess(Long userId, Long orderId); - - /** - * 更新拼团状态为失败 - * - * @param userId 用户编号 - * @param orderId 订单编号 - */ - void updateRecordStatusToFailed(Long userId, Long orderId); - - /** - * 更新拼团状态为 进行中 - * - * @param userId 用户编号 - * @param orderId 订单编号 - * @param startTime 开始时间 - */ - void updateRecordStatusToInProgress(Long userId, Long orderId, LocalDateTime startTime); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java deleted file mode 100644 index 06464530..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.promotion.api.combination.dto; - -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -// TODO @芋艿:这块要在看看 -/** - * 拼团记录的创建 Request DTO - * - * @author HUIHUI - */ -@Data -public class CombinationRecordCreateReqDTO { - - /** - * 拼团活动编号 - */ - @NotNull(message = "拼团活动编号不能为空") - private Long activityId; - /** - * spu 编号 - */ - @NotNull(message = "spu 编号不能为空") - private Long spuId; - /** - * sku 编号 - */ - @NotNull(message = "sku 编号不能为空") - private Long skuId; - /** - * 用户编号 - */ - @NotNull(message = "用户编号不能为空") - private Long userId; - /** - * 订单编号 - */ - @NotNull(message = "订单编号不能为空") - private Long orderId; - /** - * 团长编号 - */ - @NotNull(message = "团长编号不能为空") - private Long headId; - /** - * 商品名字 - */ - @NotEmpty(message = "商品名字不能为空") - private String spuName; - /** - * 商品图片 - */ - @NotEmpty(message = "商品图片不能为空") - private String picUrl; - /** - * 拼团商品单价 - */ - @NotNull(message = "拼团商品单价不能为空") - private Integer combinationPrice; - /** - * 用户昵称 - */ - @NotEmpty(message = "用户昵称不能为空") - private String nickname; - /** - * 用户头像 - */ - @NotEmpty(message = "用户头像不能为空") - private String avatar; - /** - * 开团状态:正在开团 拼团成功 拼团失败 - */ - @NotNull(message = "开团状态不能为空") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordRespDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordRespDTO.java deleted file mode 100644 index 970643a9..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/combination/dto/CombinationRecordRespDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.promotion.api.combination.dto; - -import com.win.module.promotion.enums.combination.CombinationRecordStatusEnum; -import lombok.Data; - -/** - * 拼团记录 Response DTO - * - * @author HUIHUI - */ -@Data -public class CombinationRecordRespDTO { - - /** - * 拼团活动编号 - */ - private Long activityId; - /** - * SPU 编号 - */ - private Long spuId; - /** - * SKU 编号 - */ - private Long skuId; - /** - * 用户编号 - */ - private Long userId; - /** - * 订单编号 - */ - private Long orderId; - /** - * 开团状态 - * - * 枚举 {@link CombinationRecordStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/CouponApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/CouponApi.java deleted file mode 100644 index 7e36a062..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/CouponApi.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.promotion.api.coupon; - -import com.win.module.promotion.api.coupon.dto.CouponRespDTO; -import com.win.module.promotion.api.coupon.dto.CouponUseReqDTO; -import com.win.module.promotion.api.coupon.dto.CouponValidReqDTO; - -import javax.validation.Valid; - -/** - * 优惠劵 API 接口 - * - * @author 芋道源码 - */ -public interface CouponApi { - - /** - * 使用优惠劵 - * - * @param useReqDTO 使用请求 - */ - void useCoupon(@Valid CouponUseReqDTO useReqDTO); - - /** - * 退还已使用的优惠券 - * - * @param id 优惠券编号 - */ - void returnUsedCoupon(Long id); - - /** - * 校验优惠劵 - * - * @param validReqDTO 校验请求 - * @return 优惠劵 - */ - CouponRespDTO validateCoupon(@Valid CouponValidReqDTO validReqDTO); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponRespDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponRespDTO.java deleted file mode 100644 index 1b959666..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponRespDTO.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.win.module.promotion.api.coupon.dto; - -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.coupon.CouponStatusEnum; -import com.win.module.promotion.enums.coupon.CouponTakeTypeEnum; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 优惠劵 Response DTO - * - * @author 芋道源码 - */ -@Data -public class CouponRespDTO { - - // ========== 基本信息 BEGIN ========== - /** - * 优惠劵编号 - */ - private Long id; - /** - * 优惠劵模板编号 - */ - private Integer templateId; - /** - * 优惠劵名 - */ - private String name; - /** - * 优惠码状态 - * - * 枚举 {@link CouponStatusEnum} - */ - private Integer status; - - // ========== 基本信息 END ========== - - // ========== 领取情况 BEGIN ========== - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 字段 - */ - private Long userId; - /** - * 领取类型 - * - * 枚举 {@link CouponTakeTypeEnum} - */ - private Integer takeType; - // ========== 领取情况 END ========== - - // ========== 使用规则 BEGIN ========== - /** - * 是否设置满多少金额可用,单位:分 - */ - private Integer usePrice; - /** - * 生效开始时间 - */ - private LocalDateTime validStartTime; - /** - * 生效结束时间 - */ - private LocalDateTime validEndTime; - /** - * 商品范围 - */ - private Integer productScope; - /** - * 商品范围编号的数组 - */ - private List productScopeValues; - // ========== 使用规则 END ========== - - // ========== 使用效果 BEGIN ========== - /** - * 折扣类型 - */ - private Integer discountType; - /** - * 折扣百分比 - */ - private Integer discountPercent; - /** - * 优惠金额,单位:分 - */ - private Integer discountPrice; - /** - * 折扣上限,仅在 {@link #discountType} 等于 {@link PromotionDiscountTypeEnum#PERCENT} 时生效 - */ - private Integer discountLimitPrice; - // ========== 使用效果 END ========== - - // ========== 使用情况 BEGIN ========== - /** - * 使用订单号 - */ - private Long useOrderId; - /** - * 使用时间 - */ - private LocalDateTime useTime; - - // ========== 使用情况 END ========== -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponUseReqDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponUseReqDTO.java deleted file mode 100644 index 59d77d32..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponUseReqDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.promotion.api.coupon.dto; - -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 优惠劵使用 Request DTO - * - * @author 芋道源码 - */ -@Data -public class CouponUseReqDTO { - - /** - * 优惠劵编号 - */ - @NotNull(message = "优惠劵编号不能为空") - private Long id; - - /** - * 用户编号 - */ - @NotNull(message = "用户编号不能为空") - private Long userId; - - /** - * 订单编号 - */ - @NotNull(message = "订单编号不能为空") - private Long orderId; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponValidReqDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponValidReqDTO.java deleted file mode 100644 index 211b566c..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/coupon/dto/CouponValidReqDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.promotion.api.coupon.dto; - -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 优惠劵使用 Request DTO - * - * @author 芋道源码 - */ -@Data -public class CouponValidReqDTO { - - /** - * 优惠劵编号 - */ - @NotNull(message = "优惠劵编号不能为空") - private Long id; - - /** - * 用户编号 - */ - @NotNull(message = "用户编号不能为空") - private Long userId; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApi.java deleted file mode 100644 index c6289d97..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApi.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.api.discount; - -import com.win.module.promotion.api.discount.dto.DiscountProductRespDTO; - -import java.util.Collection; -import java.util.List; - -/** - * 限时折扣 API 接口 - * - * @author 芋道源码 - */ -public interface DiscountActivityApi { - - /** - * 获得商品匹配的的限时折扣信息 - * - * @param skuIds 商品 SKU 编号数组 - * @return 限时折扣信息 - */ - List getMatchDiscountProductList(Collection skuIds); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/dto/DiscountProductRespDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/dto/DiscountProductRespDTO.java deleted file mode 100644 index d00f975c..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/discount/dto/DiscountProductRespDTO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.promotion.api.discount.dto; - -import lombok.Data; - -/** - * 限时折扣活动商品 Response DTO - * - * @author 芋道源码 - */ -@Data -public class DiscountProductRespDTO { - - /** - * 编号,主键自增 - */ - private Long id; - /** - * 商品 SPU 编号 - */ - private Long spuId; - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 折扣类型 - */ - private Integer discountType; - /** - * 折扣百分比 - */ - private Integer discountPercent; - /** - * 优惠金额,单位:分 - */ - private Integer discountPrice; - - // ========== 活动字段 ========== - /** - * 限时折扣活动的编号 - */ - private Long activityId; - /** - * 活动标题 - */ - private String activityName; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/PriceApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/PriceApi.java deleted file mode 100644 index b35e79ca..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/PriceApi.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.api.price; - -import com.win.module.promotion.api.price.dto.PriceCalculateReqDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateRespDTO; - -/** - * 价格 API 接口 - * - * @author 芋道源码 - */ -public interface PriceApi { - - /** - * 计算商品的价格 - * - * @param calculateReqDTO 价格请求 - * @return 价格相应 - */ - PriceCalculateRespDTO calculatePrice(PriceCalculateReqDTO calculateReqDTO); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/CouponMeetRespDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/CouponMeetRespDTO.java deleted file mode 100644 index 6b44491e..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/CouponMeetRespDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.promotion.api.price.dto; - -import lombok.Data; - -/** - * 优惠劵的匹配信息 Response DTO - * - * why 放在 price 包下?主要获取的时候,需要涉及到较多的价格计算逻辑,放在 price 可以更好的复用逻辑 - * - * @author 芋道源码 - */ -@Data -public class CouponMeetRespDTO { - - /** - * 优惠劵编号 - */ - private Long id; - - // ========== 非优惠劵的基本信息字段 ========== - /** - * 是否匹配 - */ - private Boolean meet; - /** - * 不匹配的提示,即 {@link #meet} = true 才有值 - * - * 例如说: - * 1. 所结算商品没有符合条件的商品 - * 2. 差 XXX 元可用优惠劵 - * 3. 优惠劵未到使用时间 - */ - private String meetTip; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateReqDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateReqDTO.java deleted file mode 100644 index 8d27edaf..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateReqDTO.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.promotion.api.price.dto; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 价格计算 Request DTO - * - * @author 芋道源码 - */ -@Data -@Deprecated -public class PriceCalculateReqDTO { - - /** - * 用户编号 - * - * 对应 MemberUserDO 的 id 编号 - */ - private Long userId; - - /** - * 优惠劵编号 - */ - private Long couponId; - - /** - * 收货地址编号 - */ - private Long addressId; - - /** - * 商品 SKU 数组 - */ - @NotNull(message = "商品数组不能为空") - private List items; - - /** - * 商品 SKU - */ - @Data - public static class Item { - - /** - * SKU 编号 - */ - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - /** - * SKU 数量 - */ - @NotNull(message = "商品 SKU 数量不能为空") - @Min(value = 0L, message = "商品 SKU 数量必须大于等于 0") // 可传递 0 数量,用于购物车未选中的情况 - private Integer count; - - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateRespDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateRespDTO.java deleted file mode 100644 index 8893a55c..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/price/dto/PriceCalculateRespDTO.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.win.module.promotion.api.price.dto; - -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import lombok.Data; - -import java.util.List; - -/** - * 价格计算 Response DTO - * - * 整体设计,参考 taobao 的技术文档: - * 1. 订单管理 - * 2. 常用订单金额说明 - * - * 举个例子:订单图 - * 输入: - * 1. 订单实付: trade.payment = 198.00;订单邮费:5 元; - * 2. 商品级优惠 圣诞价: 省 29.00 元 和 圣诞价:省 150.00 元; 订单级优惠,圣诞 2:省 5.00 元; - * 分摊: - * 1. 商品 1:原价 108 元,优惠 29 元,子订单实付 79 元,分摊主订单优惠 1.99 元; - * 2. 商品 2:原价 269 元,优惠 150 元,子订单实付 119 元,分摊主订单优惠 3.01 元; - * - * @author 芋道源码 - */ -@Data -@Deprecated -public class PriceCalculateRespDTO { - - /** - * 订单 - */ - private Order order; - - /** - * 营销活动数组 - * - * 只对应 {@link Order#items} 商品匹配的活动 - */ - private List promotions; - - // TODO @芋艿:需要改造下,主要是价格字段 - /** - * 订单 - */ - @Data - public static class Order { - - /** - * 商品原价(总),单位:分 - * - * 基于 {@link OrderItem#getOriginalPrice()} 求和 - * - * 对应 taobao 的 trade.total_fee 字段 - */ - private Integer totalPrice; - /** - * 订单优惠(总),单位:分 - * - * 订单级优惠:对主订单的优惠,常见如:订单满 200 元减 10 元;订单满 80 包邮。 - * - * 对应 taobao 的 order.discount_fee 字段 - */ - private Integer discountPrice; - /** - * 优惠劵减免金额(总),单位:分 - * - * 对应 taobao 的 trade.coupon_fee 字段 - */ - private Integer couponPrice; - /** - * 积分减免金额(总),单位:分 - * - * 对应 taobao 的 trade.point_fee 字段 - */ - private Integer pointPrice; - /** - * 运费金额,单位:分 - */ - private Integer deliveryPrice; - /** - * 最终购买金额(总),单位:分 - * - * = {@link OrderItem#getPayPrice()} 求和 - * - {@link #couponPrice} - * - {@link #pointPrice} - * + {@link #deliveryPrice} - * - {@link #discountPrice} - */ - private Integer payPrice; - /** - * 商品 SKU 数组 - */ - private List items; - - // ========== 营销基本信息 ========== - /** - * 优惠劵编号 - */ - private Long couponId; - - } - - /** - * 订单商品 SKU - */ - @Data - public static class OrderItem { - - /** - * SPU 编号 - */ - private Long spuId; - /** - * SKU 编号 - */ - private Long skuId; - /** - * 购买数量 - */ - private Integer count; - - /** - * 商品原价(总),单位:分 - * - * = {@link #originalUnitPrice} * {@link #getCount()} - */ - private Integer originalPrice; - /** - * 商品原价(单),单位:分 - * - * 对应 ProductSkuDO 的 price 字段 - * 对应 taobao 的 order.price 字段 - */ - private Integer originalUnitPrice; - /** - * 商品优惠(总),单位:分 - * - * 商品级优惠:对单个商品的,常见如:商品原价的 8 折;商品原价的减 50 元 - * - * 对应 taobao 的 order.discount_fee 字段 - */ - private Integer discountPrice; - /** - * 子订单实付金额,不算主订单分摊金额,单位:分 - * - * = {@link #originalPrice} - * - {@link #discountPrice} - * - * 对应 taobao 的 order.payment 字段 - */ - private Integer payPrice; - - /** - * 子订单分摊金额(总),单位:分 - * 需要分摊 {@link Order#discountPrice}、{@link Order#couponPrice}、{@link Order#pointPrice} - * - * 对应 taobao 的 order.part_mjz_discount 字段 - * 淘宝说明:子订单分摊优惠基础逻辑:一般正常优惠券和满减优惠按照子订单的金额进行分摊,特殊情况如果优惠券是指定商品使用的,只会分摊到对应商品子订单上不分摊。 - */ - private Integer orderPartPrice; - /** - * 分摊后子订单实付金额(总),单位:分 - * - * = {@link #payPrice} - * - {@link #orderPartPrice} - * - * 对应 taobao 的 divide_order_fee 字段 - */ - private Integer orderDividePrice; - - } - - /** - * 营销明细 - */ - @Data - @Deprecated - public static class Promotion { - - /** - * 营销编号 - * - * 例如说:营销活动的编号、优惠劵的编号 - */ - private Long id; - /** - * 营销名字 - */ - private String name; - /** - * 营销类型 - * - * 枚举 {@link PromotionTypeEnum} - */ - private Integer type; - /** - * 营销级别 - * - * 枚举 @link PromotionLevelEnum} TODO PromotionLevelEnum 没有这个枚举类 - */ - private Integer level; - /** - * 计算时的原价(总),单位:分 - */ - private Integer totalPrice; - /** - * 计算时的优惠(总),单位:分 - */ - private Integer discountPrice; - /** - * 匹配的商品 SKU 数组 - */ - private List items; - - // ========== 匹配情况 ========== - - /** - * 是否满足优惠条件 - */ - private Boolean match; - /** - * 满足条件的提示 - * - * 如果 {@link #match} = true 满足,则提示“圣诞价:省 150.00 元” - * 如果 {@link #match} = false 不满足,则提示“购满 85 元,可减 40 元” - */ - private String description; - - } - - /** - * 营销匹配的商品 SKU - */ - @Data - public static class PromotionItem { - - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 计算时的原价(总),单位:分 - */ - private Integer originalPrice; - /** - * 计算时的优惠(总),单位:分 - */ - private Integer discountPrice; - - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/RewardActivityApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/RewardActivityApi.java deleted file mode 100644 index 0ae091a2..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/RewardActivityApi.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.promotion.api.reward; - -import com.win.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; - -import java.util.Collection; -import java.util.List; - -/** - * 满减送活动 API 接口 - * - * @author 芋道源码 - */ -public interface RewardActivityApi { - - - /** - * 基于指定的 SPU 编号数组,获得它们匹配的满减送活动 - * - * @param spuIds SPU 编号数组 - * @return 满减送活动列表 - */ - List getMatchRewardActivityList(Collection spuIds); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/dto/RewardActivityMatchRespDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/dto/RewardActivityMatchRespDTO.java deleted file mode 100644 index afda7975..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/reward/dto/RewardActivityMatchRespDTO.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.win.module.promotion.api.reward.dto; - -import com.win.module.promotion.enums.common.PromotionConditionTypeEnum; -import lombok.Data; - -import java.util.List; - -/** - * 满减送活动的匹配 Response DTO - * - * @author 芋道源码 - */ -@Data -public class RewardActivityMatchRespDTO { - - /** - * 活动编号,主键自增 - */ - private Long id; - /** - * 活动标题 - */ - private String name; - /** - * 条件类型 - * - * 枚举 {@link PromotionConditionTypeEnum} - */ - private Integer conditionType; - /** - * 优惠规则的数组 - */ - private List rules; - - /** - * 商品 SPU 编号的数组 - */ - private List spuIds; - - // TODO 芋艿:后面 RewardActivityRespDTO 有了之后,Rule 可以放过去 - /** - * 优惠规则 - */ - @Data - public static class Rule { - - /** - * 优惠门槛 - * - * 1. 满 N 元,单位:分 - * 2. 满 N 件 - */ - private Integer limit; - /** - * 优惠价格,单位:分 - */ - private Integer discountPrice; - /** - * 是否包邮 - */ - private Boolean freeDelivery; - /** - * 赠送的积分 - */ - private Integer point; - /** - * 赠送的优惠劵编号的数组 - */ - private List couponIds; - /** - * 赠送的优惠卷数量的数组 - */ - private List couponCounts; - - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApi.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApi.java deleted file mode 100644 index 309626e6..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApi.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.promotion.api.seckill; - -import com.win.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO; - -/** - * 秒杀活动 API 接口 - * - * @author HUIHUI - */ -public interface SeckillActivityApi { - - /** - * 更新秒杀库存 - * - * @param updateStockReqDTO 请求 - */ - void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/dto/SeckillActivityUpdateStockReqDTO.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/dto/SeckillActivityUpdateStockReqDTO.java deleted file mode 100644 index 9e62d7d4..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/api/seckill/dto/SeckillActivityUpdateStockReqDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.promotion.api.seckill.dto; - -import lombok.Data; - -import java.util.List; - -/** - * 更新秒杀库存 request DTO - * - * @author HUIHUI - */ -@Data -public class SeckillActivityUpdateStockReqDTO { - - // TODO @puhui999:参数校验 - - // TODO @puhui999:秒杀的话,一次只能购买一种商品哈;不能多个哈; - - /** - * 活动编号 - */ - private Long activityId; - /** - * 总购买数量 - */ - private Integer count; - /** - * 活动商品 - */ - private List items; - - @Data - public static class Item { - - /** - * SPU 编号 - */ - private Long spuId; - /** - * SKU 编号 - */ - private Long skuId; - /** - * 购买数量 - */ - private Integer count; - - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/ErrorCodeConstants.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/ErrorCodeConstants.java deleted file mode 100644 index 352fd075..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.win.module.promotion.enums; - -import com.win.framework.common.exception.ErrorCode; - -/** - * Promotion 错误码枚举类 - *

- * promotion 系统,使用 1-013-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== 促销活动相关 1-013-001-000 ============ - ErrorCode DISCOUNT_ACTIVITY_NOT_EXISTS = new ErrorCode(1_013_001_000, "限时折扣活动不存在"); - ErrorCode DISCOUNT_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1_013_001_001, "存在商品参加了其它限时折扣活动"); - ErrorCode DISCOUNT_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_001_002, "限时折扣活动已关闭,不能修改"); - ErrorCode DISCOUNT_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_001_003, "限时折扣活动未关闭,不能删除"); - ErrorCode DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_001_004, "限时折扣活动已关闭,不能重复关闭"); - ErrorCode DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_END = new ErrorCode(1_013_001_005, "限时折扣活动已结束,不能关闭"); - - // ========== Banner 相关 1-013-002-000 ============ - ErrorCode BANNER_NOT_EXISTS = new ErrorCode(1_013_002_000, "Banner 不存在"); - - // ========== Coupon 相关 1-013-003-000 ============ - ErrorCode COUPON_NO_MATCH_SPU = new ErrorCode(1_013_003_000, "优惠劵没有可使用的商品!"); - ErrorCode COUPON_NO_MATCH_MIN_PRICE = new ErrorCode(1_013_003_001, "所结算的商品中未满足使用的金额"); - - // ========== 优惠劵模板 1-013-004-000 ========== - ErrorCode COUPON_TEMPLATE_NOT_EXISTS = new ErrorCode(1_013_004_000, "优惠劵模板不存在"); - ErrorCode COUPON_TEMPLATE_TOTAL_COUNT_TOO_SMALL = new ErrorCode(1_013_004_001, "发放数量不能小于已领取数量({})"); - ErrorCode COUPON_TEMPLATE_NOT_ENOUGH = new ErrorCode(1_013_004_002, "当前剩余数量不够领取"); - ErrorCode COUPON_TEMPLATE_USER_ALREADY_TAKE = new ErrorCode(1_013_004_003, "用户已领取过此优惠券"); - ErrorCode COUPON_TEMPLATE_EXPIRED = new ErrorCode(1_013_004_004, "优惠券已过期"); - ErrorCode COUPON_TEMPLATE_CANNOT_TAKE = new ErrorCode(1_013_004_005, "领取方式不正确"); - - // ========== 优惠劵 1-013-005-000 ========== - ErrorCode COUPON_NOT_EXISTS = new ErrorCode(1_013_005_000, "优惠券不存在"); - ErrorCode COUPON_DELETE_FAIL_USED = new ErrorCode(1_013_005_001, "回收优惠劵失败,优惠劵已被使用"); - ErrorCode COUPON_STATUS_NOT_UNUSED = new ErrorCode(1_013_005_002, "优惠劵不处于待使用状态"); - ErrorCode COUPON_VALID_TIME_NOT_NOW = new ErrorCode(1_013_005_003, "优惠券不在使用时间范围内"); - ErrorCode COUPON_STATUS_NOT_USED = new ErrorCode(1_013_005_004, "优惠劵不是已使用状态"); - - // ========== 满减送活动 1-013-006-000 ========== - ErrorCode REWARD_ACTIVITY_NOT_EXISTS = new ErrorCode(1_013_006_000, "满减送活动不存在"); - ErrorCode REWARD_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1_013_006_001, "存在商品参加了其它满减送活动"); - ErrorCode REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_002, "满减送活动已关闭,不能修改"); - ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); - ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); - ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_END = new ErrorCode(1_013_006_005, "满减送活动已结束,不能关闭"); - - // ========== TODO 空着 1-013-007-000 ============ - - // ========== 秒杀活动 1-013-008-000 ========== - ErrorCode SECKILL_ACTIVITY_NOT_EXISTS = new ErrorCode(1_013_008_000, "秒杀活动不存在"); - ErrorCode SECKILL_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1_013_008_002, "存在商品参加了其它秒杀活动"); - ErrorCode SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_008_003, "秒杀活动已关闭,不能修改"); - ErrorCode SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1_013_008_004, "秒杀活动未关闭或未结束,不能删除"); - ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_008_005, "秒杀活动已关闭,不能重复关闭"); - ErrorCode SECKILL_ACTIVITY_UPDATE_STOCK_FAIL = new ErrorCode(1013008006, "更新秒杀活动库存失败,原因秒杀库存不足"); - - // ========== 秒杀时段 1-013-009-000 ========== - ErrorCode SECKILL_CONFIG_NOT_EXISTS = new ErrorCode(1_013_009_000, "秒杀时段不存在"); - ErrorCode SECKILL_CONFIG_TIME_CONFLICTS = new ErrorCode(1_013_009_001, "秒杀时段冲突"); - ErrorCode SECKILL_CONFIG_DISABLE = new ErrorCode(1_013_009_004, "秒杀时段已关闭"); - - // ========== 拼团活动 1-013-010-000 ========== - ErrorCode COMBINATION_ACTIVITY_NOT_EXISTS = new ErrorCode(1_013_010_000, "拼团活动不存在"); - ErrorCode COMBINATION_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1_013_010_001, "存在商品参加了其它拼团活动"); - ErrorCode COMBINATION_ACTIVITY_STATUS_DISABLE = new ErrorCode(1_013_010_002, "拼团活动已关闭不能修改"); - ErrorCode COMBINATION_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1_013_010_003, "拼团活动未关闭或未结束,不能删除"); - ErrorCode COMBINATION_RECORD_NOT_EXISTS = new ErrorCode(1_013_010_004, "拼团不存在"); - - // ========== 拼团记录 1-013-011-000 ========== - ErrorCode COMBINATION_RECORD_EXISTS = new ErrorCode(1_013_011_000, "拼团失败,已参与过该拼团"); - ErrorCode COMBINATION_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1_013_011_001, "拼团失败,父拼团不存在"); - ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1_013_011_002, "拼团失败,拼团人数已满"); - ErrorCode COMBINATION_RECORD_FAILED_HAVE_JOINED = new ErrorCode(1_013_011_003, "拼团失败,已参与其它拼团"); - ErrorCode COMBINATION_RECORD_FAILED_TIME_END = new ErrorCode(1_013_011_004, "拼团失败,活动已经结束"); - ErrorCode COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED = new ErrorCode(1_013_011_005, "拼团失败,单次限购超出"); - ErrorCode COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED = new ErrorCode(1_013_011_006, "拼团失败,单次限购超出"); - - // ========== 砍价活动 1-013-012-000 ========== - ErrorCode BARGAIN_ACTIVITY_NOT_EXISTS = new ErrorCode(1_013_012_000, "砍价活动不存在"); - ErrorCode BARGAIN_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1_013_012_001, "存在商品参加了其它砍价活动"); - ErrorCode BARGAIN_ACTIVITY_STATUS_DISABLE = new ErrorCode(1_013_012_002, "砍价活动已关闭不能修改"); - ErrorCode BARGAIN_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1_013_012_003, "砍价活动未关闭或未结束,不能删除"); - - // ========== 砍价记录 1-013-013-000 ========== - ErrorCode BARGAIN_RECORD_NOT_EXISTS = new ErrorCode(1_013_013_000, "砍价记录不存在"); - ErrorCode BARGAIN_RECORD_EXISTS = new ErrorCode(1_013_013_001, "砍价失败,已参与过该砍价"); - ErrorCode BARGAIN_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1_013_013_002, "砍价失败,父砍价不存在"); - ErrorCode BARGAIN_RECORD_USER_FULL = new ErrorCode(1_013_013_003, "砍价失败,砍价人数已满"); - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/combination/CombinationRecordStatusEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/combination/CombinationRecordStatusEnum.java deleted file mode 100644 index 14ba9ab0..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/combination/CombinationRecordStatusEnum.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.promotion.enums.combination; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 拼团状态枚举 - * - * @author HUIHUI - */ -@AllArgsConstructor -@Getter -public enum CombinationRecordStatusEnum implements IntArrayValuable { - - IN_PROGRESS(0, "进行中"), - SUCCESS(1, "拼团成功"), - FAILED(2, "拼团失败"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CombinationRecordStatusEnum::getStatus).toArray(); - - /** - * 状态值 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - - public static boolean isSuccess(Integer status) { - return ObjectUtil.equal(status, SUCCESS.getStatus()); - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionActivityStatusEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionActivityStatusEnum.java deleted file mode 100644 index be5c2b44..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionActivityStatusEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.promotion.enums.common; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 促销活动的状态枚举 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum PromotionActivityStatusEnum implements IntArrayValuable { - - WAIT(10, "未开始"), - RUN(20, "进行中"), - END(30, "已结束"), - CLOSE(40, "已关闭"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionActivityStatusEnum::getStatus).toArray(); - - /** - * 状态值 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionConditionTypeEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionConditionTypeEnum.java deleted file mode 100644 index ec1c814b..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionConditionTypeEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.promotion.enums.common; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 营销的条件类型枚举 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum PromotionConditionTypeEnum implements IntArrayValuable { - - PRICE(10, "满 N 元"), - COUNT(20, "满 N 件"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionConditionTypeEnum::getType).toArray(); - - /** - * 类型值 - */ - private final Integer type; - /** - * 类型名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionDiscountTypeEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionDiscountTypeEnum.java deleted file mode 100644 index 2302e6c3..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionDiscountTypeEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.promotion.enums.common; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 优惠类型枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PromotionDiscountTypeEnum implements IntArrayValuable { - - PRICE(1, "满减"), // 具体金额 - PERCENT(2, "折扣"), // 百分比 - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionDiscountTypeEnum::getType).toArray(); - - /** - * 优惠类型 - */ - private final Integer type; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionProductScopeEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionProductScopeEnum.java deleted file mode 100644 index d6d90ba6..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionProductScopeEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.promotion.enums.common; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 营销的商品范围枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PromotionProductScopeEnum implements IntArrayValuable { - - ALL(1, "通用卷"), // 全部商品 - SPU(2, "商品卷"), // 指定商品 - CATEGORY(3, "品类卷"), // 指定商品 - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionProductScopeEnum::getScope).toArray(); - - /** - * 范围值 - */ - private final Integer scope; - /** - * 范围名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionTypeEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionTypeEnum.java deleted file mode 100644 index d7af9300..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/common/PromotionTypeEnum.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.promotion.enums.common; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 营销类型枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PromotionTypeEnum implements IntArrayValuable { - - SECKILL_ACTIVITY(1, "秒杀活动"), - BARGAIN_ACTIVITY(2, "拼团活动"), - COMBINATION_ACTIVITY(3, "砍价活动"), - - DISCOUNT_ACTIVITY(4, "限时折扣"), - REWARD_ACTIVITY(5, "满减送"), - - MEMBER(6, "会员折扣"), - COUPON(7, "优惠劵") - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionTypeEnum::getType).toArray(); - - /** - * 类型值 - */ - private final Integer type; - /** - * 类型名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponStatusEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponStatusEnum.java deleted file mode 100644 index a72dd05e..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponStatusEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.promotion.enums.coupon; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 优惠劵状态枚举 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum CouponStatusEnum implements IntArrayValuable { - - UNUSED(1, "未使用"), - USED(2, "已使用"), - EXPIRE(3, "已过期"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getStatus).toArray(); - - /** - * 值 - */ - private final Integer status; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTakeTypeEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTakeTypeEnum.java deleted file mode 100644 index 842fa22b..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTakeTypeEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.promotion.enums.coupon; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 优惠劵领取方式 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum CouponTakeTypeEnum implements IntArrayValuable { - - USER(1, "直接领取"), // 用户可在首页、每日领劵直接领取 - ADMIN(2, "指定发放"), // 后台指定会员赠送优惠劵 - REGISTER(3, "新人券"), // 注册时自动领取 - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponTakeTypeEnum::getValue).toArray(); - - /** - * 值 - */ - private final Integer value; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java deleted file mode 100644 index e4058bc2..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.promotion.enums.coupon; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 优惠劵模板的有限期类型的枚举 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum CouponTemplateValidityTypeEnum implements IntArrayValuable { - - DATE(1, "固定日期"), - TERM(2, "领取之后"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponTemplateValidityTypeEnum::getType).toArray(); - - /** - * 值 - */ - private final Integer type; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecorateComponentEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecorateComponentEnum.java deleted file mode 100644 index e690d106..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecorateComponentEnum.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.win.module.promotion.enums.decorate; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 页面组件枚举 - * - * @author jason - */ -@Getter -@AllArgsConstructor -@SuppressWarnings("JavadocLinkAsPlainText") -public enum DecorateComponentEnum { - - /** - * 格式:[{ - * "name": "标题" - * "picUrl": "https://www.iocoder.cn/xxx.png", - * "url": "/pages/users/index" - * }] - * - * 最多 10 个 - */ - MENU("menu", "菜单"), - /** - * 格式:[{ - * "name": "标题" - * "url": "/pages/users/index" - * }] - */ - ROLLING_NEWS("scrolling-news", "滚动新闻"), - /** - * 格式:[{ - * "picUrl": "https://www.iocoder.cn/xxx.png", - * "url": "/pages/users/index" - * }] - */ - SLIDE_SHOW("slide-show", "轮播图"), - /** - * 格式:[{ - * "name": "标题" - * "type": "类型", // best、hot、new、benefit、good - * "tag": "标签" // 例如说:多买多省 - * }] - * - * 最多 4 个 - */ - PRODUCT_RECOMMEND("product-recommend", "商品推荐"); - - /** - * 页面组件代码 - */ - private final String code; - - /** - * 页面组件说明 - */ - private final String desc; - -} diff --git a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecoratePageEnum.java b/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecoratePageEnum.java deleted file mode 100644 index a1607b7f..00000000 --- a/win-module-mall/win-module-promotion-api/src/main/java/com/win/module/promotion/enums/decorate/DecoratePageEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.promotion.enums.decorate; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 装修页面枚举 - * - * @author jason - */ -@AllArgsConstructor -@Getter -public enum DecoratePageEnum implements IntArrayValuable { - - INDEX(1, "首页"), - MY(2, "个人中心"), - ; - - private static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DecoratePageEnum::getPage).toArray(); - - /** - * 页面编号 - */ - private final Integer page; - - /** - * 页面名称 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-promotion-biz/pom.xml b/win-module-mall/win-module-promotion-biz/pom.xml deleted file mode 100644 index 0914f882..00000000 --- a/win-module-mall/win-module-promotion-biz/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - com.win - win-module-mall - ${revision} - - 4.0.0 - jar - win-module-promotion-biz - - ${project.artifactId} - - - market模块,主要实现营销相关功能 - 例如:营销活动、banner广告、优惠券、优惠码等功能。 - - - - - com.win - win-module-promotion-api - ${revision} - - - com.win - win-module-product-api - ${revision} - - - com.win - win-module-member-api - ${revision} - - - - - com.win - win-spring-boot-starter-biz-operatelog - - - com.win - win-spring-boot-starter-biz-weixin - - - - - com.win - win-spring-boot-starter-web - - - com.win - win-spring-boot-starter-security - - - - - com.win - win-spring-boot-starter-mybatis - - - - - com.win - win-spring-boot-starter-test - - - - - com.win - win-spring-boot-starter-excel - - - - diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApiImpl.java deleted file mode 100644 index de61cc22..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainActivityApiImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.promotion.api.bargain; - -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.bargain.BargainActivityDO; -import com.win.module.promotion.service.bargain.BargainActivityService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.BARGAIN_ACTIVITY_NOT_EXISTS; - -/** - * 砍价活动 Api 接口实现类 - * - * @author HUIHUI - */ -@Service -public class BargainActivityApiImpl implements BargainActivityApi { - - @Resource - private BargainActivityService bargainActivityService; - - @Override - public void updateBargainActivityStock(Long activityId, Integer count) { - // TODO @puhui999:可以整个实现到 bargainActivityService 中 - // 查询砍价活动 - BargainActivityDO activity = bargainActivityService.getBargainActivity(activityId); - if (activity == null) { - throw exception(BARGAIN_ACTIVITY_NOT_EXISTS); - } - - // 更新砍价库存 - // TODO @puhui999:考虑下并发更新问题 - BargainActivityUpdateReqVO reqVO = new BargainActivityUpdateReqVO(); - reqVO.setId(activityId); - reqVO.setStock(activity.getStock() - count); - bargainActivityService.updateBargainActivity(reqVO); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApiImpl.java deleted file mode 100644 index ab4ee252..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/bargain/BargainRecordApiImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.promotion.api.bargain; - -import com.win.module.promotion.api.bargain.dto.BargainRecordCreateReqDTO; -import org.springframework.stereotype.Service; - -/** - * 砍价活动 API 实现类 TODO @puhui999 - * - * @author HUIHUI - */ -@Service -public class BargainRecordApiImpl implements BargainRecordApi { - - @Override - public void createBargainRecord(BargainRecordCreateReqDTO reqDTO) { - - } - - @Override - public boolean isBargainRecordSuccess(Long userId, Long orderId) { - return false; - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApiImpl.java deleted file mode 100644 index 5b72786a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/combination/CombinationRecordApiImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.win.module.promotion.api.combination; - -import com.win.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; -import com.win.module.promotion.api.combination.dto.CombinationRecordRespDTO; -import com.win.module.promotion.convert.combination.CombinationActivityConvert; -import com.win.module.promotion.enums.combination.CombinationRecordStatusEnum; -import com.win.module.promotion.service.combination.CombinationRecordService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 拼团活动 API 实现类 - * - * @author HUIHUI - */ -@Service -public class CombinationRecordApiImpl implements CombinationRecordApi { - - @Resource - private CombinationRecordService recordService; - - @Override - public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) { - recordService.createCombinationRecord(reqDTO); - } - - @Override - public boolean isCombinationRecordSuccess(Long userId, Long orderId) { - return CombinationRecordStatusEnum.isSuccess(recordService.getCombinationRecord(userId, orderId).getStatus()); - } - - @Override - public List getRecordListByUserIdAndActivityId(Long userId, Long activityId) { - return CombinationActivityConvert.INSTANCE.convert(recordService.getRecordListByUserIdAndActivityId(userId, activityId)); - } - - @Override - public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) { - recordService.validateCombinationLimitCount(activityId, count, sumCount); - } - - @Override - public void updateRecordStatusToSuccess(Long userId, Long orderId) { - recordService.updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordStatusEnum.SUCCESS.getStatus(), userId, orderId); - } - - @Override - public void updateRecordStatusToFailed(Long userId, Long orderId) { - recordService.updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordStatusEnum.FAILED.getStatus(), userId, orderId); - } - - @Override - public void updateRecordStatusToInProgress(Long userId, Long orderId, LocalDateTime startTime) { - recordService.updateRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordStatusEnum.IN_PROGRESS.getStatus(), - userId, orderId, startTime); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/coupon/CouponApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/coupon/CouponApiImpl.java deleted file mode 100644 index 00a1f609..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/coupon/CouponApiImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.promotion.api.coupon; - - -import com.win.module.promotion.api.coupon.dto.CouponRespDTO; -import com.win.module.promotion.api.coupon.dto.CouponUseReqDTO; -import com.win.module.promotion.api.coupon.dto.CouponValidReqDTO; -import com.win.module.promotion.convert.coupon.CouponConvert; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.service.coupon.CouponService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 优惠劵 API 实现类 - * - * @author 芋道源码 - */ -@Service -public class CouponApiImpl implements CouponApi { - - @Resource - private CouponService couponService; - - @Override - public void useCoupon(CouponUseReqDTO useReqDTO) { - couponService.useCoupon(useReqDTO.getId(), useReqDTO.getUserId(), - useReqDTO.getOrderId()); - } - - @Override - public void returnUsedCoupon(Long id) { - couponService.returnUsedCoupon(id); - } - - @Override - public CouponRespDTO validateCoupon(CouponValidReqDTO validReqDTO) { - CouponDO coupon = couponService.validCoupon(validReqDTO.getId(), validReqDTO.getUserId()); - return CouponConvert.INSTANCE.convert(coupon); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApiImpl.java deleted file mode 100644 index d314d8e4..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/discount/DiscountActivityApiImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.promotion.api.discount; - -import com.win.module.promotion.api.discount.dto.DiscountProductRespDTO; -import com.win.module.promotion.convert.discount.DiscountActivityConvert; -import com.win.module.promotion.service.discount.DiscountActivityService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -/** - * 限时折扣 API 实现类 - * - * @author 芋道源码 - */ -@Service -public class DiscountActivityApiImpl implements DiscountActivityApi { - - @Resource - private DiscountActivityService discountActivityService; - - @Override - public List getMatchDiscountProductList(Collection skuIds) { - return DiscountActivityConvert.INSTANCE.convertList02(discountActivityService.getMatchDiscountProductList(skuIds)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/price/PriceApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/price/PriceApiImpl.java deleted file mode 100644 index cbdf562f..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/price/PriceApiImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.promotion.api.price; - -import com.win.module.promotion.api.price.dto.PriceCalculateReqDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateRespDTO; -import com.win.module.promotion.service.price.PriceService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 价格 API 实现类 - * - * @author 芋道源码 - */ -@Service -public class PriceApiImpl implements PriceApi { - - @Resource - private PriceService priceService; - - @Override - public PriceCalculateRespDTO calculatePrice(PriceCalculateReqDTO calculateReqDTO) { - //return priceService.calculatePrice(calculateReqDTO); TODO 没有 calculatePrice 这个方法 - - return null; - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/reward/RewardActivityApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/reward/RewardActivityApiImpl.java deleted file mode 100644 index 7d1da022..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/reward/RewardActivityApiImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.promotion.api.reward; - -import com.win.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; -import com.win.module.promotion.service.reward.RewardActivityService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -/** - * 满减送活动 API 实现类 - * - * @author 芋道源码 - */ -@Service -public class RewardActivityApiImpl implements RewardActivityApi { - - @Resource - private RewardActivityService rewardActivityService; - - @Override - public List getMatchRewardActivityList(Collection spuIds) { - return rewardActivityService.getMatchRewardActivityList(spuIds); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApiImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApiImpl.java deleted file mode 100644 index de7d4564..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/api/seckill/SeckillActivityApiImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.win.module.promotion.api.seckill; - -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; -import com.win.module.promotion.service.seckill.SeckillActivityService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.SECKILL_ACTIVITY_UPDATE_STOCK_FAIL; - -/** - * 秒杀活动接口 Api 接口实现类 - * - * @author HUIHUI - */ -@Service -public class SeckillActivityApiImpl implements SeckillActivityApi { - - @Resource - private SeckillActivityService activityService; - - // TODO @puhui:建议这块弄到 activityService 实现哈; - // TODO @puhui:这个方法,要考虑事务性 - @Override - public void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO) { - // TODO @puhui999:长方法,最好有 1.1 1.2 2.1 这种步骤哈; - SeckillActivityDO seckillActivity = activityService.getSeckillActivity(updateStockReqDTO.getActivityId()); - if (seckillActivity.getStock() < updateStockReqDTO.getCount()) { - throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL); - } - // 获取活动商品 - // TODO @puhui999:在一个方法里,dos 和 dolist 最好保持一致,要么用 s,要么用 list 哈; - List productDOs = activityService.getSeckillProductListByActivityId(updateStockReqDTO.getActivityId()); - // TODO @puhui999:这个是不是搞成 CollectionUtils.convertMultiMap() - List items = updateStockReqDTO.getItems(); - Map> map = new HashMap<>(); - items.forEach(item -> { - if (map.containsKey(item.getSpuId())) { - List skuIds = map.get(item.getSpuId()); - skuIds.add(item.getSkuId()); - map.put(item.getSpuId(), skuIds); - } else { - List list = new ArrayList<>(); - list.add(item.getSkuId()); - map.put(item.getSpuId(), list); - } - }); - // 过滤出购买的商品 - // TODO @puhui999:productDOList 可以简化成 productList;一般来说,do 之类不用带着哈,在变量里; - List productDOList = CollectionUtils.filterList(productDOs, item -> map.get(item.getSpuId()).contains(item.getSkuId())); - Map productDOMap = CollectionUtils.convertMap(items, SeckillActivityUpdateStockReqDTO.Item::getSkuId, p -> p); - // 检查活动商品库存是否充足 - // TODO @puhui999:避免 b 这种无业务含义的变量; - boolean b = CollectionUtils.anyMatch(productDOList, item -> { - SeckillActivityUpdateStockReqDTO.Item item1 = productDOMap.get(item.getSkuId()); - return (item.getStock() < item1.getCount()) || (item.getStock() - item1.getCount()) < 0; - }); - if (b) { - throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL); - } - // TODO @puhui999:类似 doList,应该和下面的 update 逻辑粘的更紧密一点;so 在空行的时候,应该挪到 74 之后里去;甚至更合理,应该是 79 之后;说白了,逻辑要分块,每个模块涉及的代码要紧密在一起; - List doList = CollectionUtils.convertList(productDOList, item -> { - item.setStock(item.getStock() - productDOMap.get(item.getSkuId()).getCount()); - return item; - }); - - // 更新活动库存 - // TODO @puhui999:考虑下并发更新 - seckillActivity.setStock(seckillActivity.getStock() + updateStockReqDTO.getCount()); - seckillActivity.setTotalStock(seckillActivity.getTotalStock() - updateStockReqDTO.getCount()); - activityService.updateSeckillActivity(seckillActivity); - // 更新活动商品库存 - activityService.updateSeckillActivityProductList(doList); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/BannerController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/BannerController.java deleted file mode 100644 index 754665db..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/BannerController.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.promotion.controller.admin.banner; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.banner.vo.BannerCreateReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerPageReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerRespVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerUpdateReqVO; -import com.win.module.promotion.convert.banner.BannerConvert; -import com.win.module.promotion.dal.dataobject.banner.BannerDO; -import com.win.module.promotion.service.banner.BannerService; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - Banner 管理") -@RestController -@RequestMapping("/market/banner") -@Validated -public class BannerController { - - @Resource - private BannerService bannerService; - - @PostMapping("/create") - @Operation(summary = "创建 Banner") - @PreAuthorize("@ss.hasPermission('market:banner:create')") - public CommonResult createBanner(@Valid @RequestBody BannerCreateReqVO createReqVO) { - return success(bannerService.createBanner(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新 Banner") - @PreAuthorize("@ss.hasPermission('market:banner:update')") - public CommonResult updateBanner(@Valid @RequestBody BannerUpdateReqVO updateReqVO) { - bannerService.updateBanner(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除 Banner") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('market:banner:delete')") - public CommonResult deleteBanner(@RequestParam("id") Long id) { - bannerService.deleteBanner(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得 Banner") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('market:banner:query')") - public CommonResult getBanner(@RequestParam("id") Long id) { - BannerDO banner = bannerService.getBanner(id); - return success(BannerConvert.INSTANCE.convert(banner)); - } - - @GetMapping("/page") - @Operation(summary = "获得 Banner 分页") - @PreAuthorize("@ss.hasPermission('market:banner:query')") - public CommonResult> getBannerPage(@Valid BannerPageReqVO pageVO) { - PageResult pageResult = bannerService.getBannerPage(pageVO); - return success(BannerConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerBaseVO.java deleted file mode 100644 index 86a25b3a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerBaseVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.promotion.controller.admin.banner.vo; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * Banner Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * @author xia - */ -@Data -public class BannerBaseVO { - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "标题不能为空") - private String title; - - @Schema(description = "跳转链接", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "跳转链接不能为空") - private String url; - - @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "图片地址不能为空") - private String picUrl; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排序不能为空") - private Integer sort; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "备注") - private String memo; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerCreateReqVO.java deleted file mode 100644 index 7813bc01..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerCreateReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.promotion.controller.admin.banner.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * @author xia - */ -@Schema(description = "管理后台 - Banner 创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BannerCreateReqVO extends BannerBaseVO { - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java deleted file mode 100644 index 89a1410f..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.promotion.controller.admin.banner.vo; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * @author xia - */ -@Schema(description = "管理后台 - Banner 分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BannerPageReqVO extends PageParam { - - @Schema(description = "标题") - private String title; - - - @Schema(description = "状态") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerRespVO.java deleted file mode 100644 index a3cb7515..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerRespVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.promotion.controller.admin.banner.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "管理后台 - Banner Response VO") -@Data -@ToString(callSuper = true) -public class BannerRespVO extends BannerBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED) - private Long id; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerUpdateReqVO.java deleted file mode 100644 index 87a57a24..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/banner/vo/BannerUpdateReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.controller.admin.banner.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -/** - * @author xia - */ -@Schema(description = "管理后台 - Banner更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BannerUpdateReqVO extends BannerBaseVO { - - @Schema(description = "banner 编号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "banner 编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/BargainActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/BargainActivityController.java deleted file mode 100644 index 3690321d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/BargainActivityController.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.win.module.promotion.controller.admin.bargain; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; -import com.win.module.promotion.convert.bargain.BargainActivityConvert; -import com.win.module.promotion.dal.dataobject.bargain.BargainActivityDO; -import com.win.module.promotion.service.bargain.BargainActivityService; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 砍价活动") -@RestController -@RequestMapping("/promotion/bargain-activity") -@Validated -public class BargainActivityController { - - @Resource - private BargainActivityService activityService; - - @PostMapping("/create") - @Operation(summary = "创建砍价活动") - @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:create')") - public CommonResult createBargainActivity(@Valid @RequestBody BargainActivityCreateReqVO createReqVO) { - return success(activityService.createBargainActivity(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新砍价活动") - @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:update')") - public CommonResult updateBargainActivity(@Valid @RequestBody BargainActivityUpdateReqVO updateReqVO) { - activityService.updateBargainActivity(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除砍价活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:delete')") - public CommonResult deleteBargainActivity(@RequestParam("id") Long id) { - activityService.deleteBargainActivity(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得砍价活动") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')") - public CommonResult getBargainActivity(@RequestParam("id") Long id) { - return success(BargainActivityConvert.INSTANCE.convert(activityService.getBargainActivity(id))); - } - - @GetMapping("/page") - @Operation(summary = "获得砍价活动分页") - @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')") - public CommonResult> getBargainActivityPage( - @Valid BargainActivityPageReqVO pageVO) { - // 查询砍价活动 - PageResult pageResult = activityService.getBargainActivityPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - return success(BargainActivityConvert.INSTANCE.convertPage(activityService.getBargainActivityPage(pageVO))); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityBaseVO.java deleted file mode 100644 index 063413c2..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityBaseVO.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.win.module.promotion.controller.admin.bargain.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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * 砍价活动 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author HUIHUI - */ -@Data -public class BargainActivityBaseVO { - - @Schema(description = "砍价活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "砍得越多省得越多,是兄弟就来砍我") - @NotNull(message = "砍价名称不能为空") - private String name; - - @Schema(description = "商品 SPU 编号", example = "1") - @NotNull(message = "砍价商品不能为空") - private Long spuId; - - @Schema(description = "商品 skuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") - @NotNull(message = "商品 skuId 不能为空") - private Long skuId; - - @Schema(description = "砍价起始价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") - @NotNull(message = "砍价起始价格不能为空") - private Integer bargainFirstPrice; - - @Schema(description = "砍价底价", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") - @NotNull(message = "砍价底价不能为空") - private Integer bargainPrice; - - @Schema(description = "活动库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") - @NotNull(message = "活动库存不能为空") - private Integer stock; - - @Schema(description = "总限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "16218") - @NotNull(message = "总限购数量不能为空") - private Integer totalLimitCount; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2022-07-01 23:59:59]") - @NotNull(message = "活动开始时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2022-07-01 23:59:59]") - @NotNull(message = "活动结束时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; - - @Schema(description = "砍价人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222") - @NotNull(message = "砍价人数不能为空") - private Integer userSize; - - @Schema(description = "最大帮砍次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222") - @NotNull(message = "最大帮砍次数不能为空") - private Integer bargainCount; - - @Schema(description = "用户每次砍价的最小金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222") - @NotNull(message = "用户每次砍价的最小金额不能为空") - private Integer randomMinPrice; - - @Schema(description = "用户每次砍价的最大金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222") - @NotNull(message = "用户每次砍价的最大金额不能为空") - private Integer randomMaxPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityCreateReqVO.java deleted file mode 100644 index 99c2a098..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.promotion.controller.admin.bargain.vo; - -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 BargainActivityCreateReqVO extends BargainActivityBaseVO { - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityPageReqVO.java deleted file mode 100644 index 536bcad3..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.controller.admin.bargain.vo; - -import com.win.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 BargainActivityPageReqVO extends PageParam { - - @Schema(description = "砍价名称", example = "赵六") - private String name; - - @Schema(description = "活动状态", example = "0") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityRespVO.java deleted file mode 100644 index 2f53691e..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityRespVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.promotion.controller.admin.bargain.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.time.LocalDateTime; -@Schema(description = "管理后台 - 砍价活动 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BargainActivityRespVO extends BargainActivityBaseVO { - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促") - private String spuName; - - @Schema(description = "商品主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - private String picUrl; - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-01 23:59:59") - private LocalDateTime createTime; - - @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "999") - private Integer successCount; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "活动状态不能为空") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityUpdateReqVO.java deleted file mode 100644 index 3492cc82..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/bargain/vo/BargainActivityUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.promotion.controller.admin.bargain.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class BargainActivityUpdateReqVO extends BargainActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901") - @NotNull(message = "活动编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/CombinationActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/CombinationActivityController.java deleted file mode 100644 index a40c47da..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/CombinationActivityController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.promotion.controller.admin.combination; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityRespVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; -import com.win.module.promotion.convert.combination.CombinationActivityConvert; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import com.win.module.promotion.dal.dataobject.combination.CombinationProductDO; -import com.win.module.promotion.service.combination.CombinationActivityService; -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.List; - -import static cn.hutool.core.collection.CollectionUtil.newArrayList; -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 拼团活动") -@RestController -@RequestMapping("/promotion/combination-activity") -@Validated -public class CombinationActivityController { - - @Resource - private CombinationActivityService combinationActivityService; - - @Resource - private ProductSpuApi productSpuApi; - - @PostMapping("/create") - @Operation(summary = "创建拼团活动") - @PreAuthorize("@ss.hasPermission('promotion:combination-activity:create')") - public CommonResult createCombinationActivity(@Valid @RequestBody CombinationActivityCreateReqVO createReqVO) { - return success(combinationActivityService.createCombinationActivity(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新拼团活动") - @PreAuthorize("@ss.hasPermission('promotion:combination-activity:update')") - public CommonResult updateCombinationActivity(@Valid @RequestBody CombinationActivityUpdateReqVO updateReqVO) { - combinationActivityService.updateCombinationActivity(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除拼团活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:combination-activity:delete')") - public CommonResult deleteCombinationActivity(@RequestParam("id") Long id) { - combinationActivityService.deleteCombinationActivity(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得拼团活动") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')") - public CommonResult getCombinationActivity(@RequestParam("id") Long id) { - CombinationActivityDO activity = combinationActivityService.getCombinationActivity(id); - List products = combinationActivityService.getCombinationProductsByActivityIds(newArrayList(id)); - return success(CombinationActivityConvert.INSTANCE.convert(activity, products)); - } - - @GetMapping("/page") - @Operation(summary = "获得拼团活动分页") - @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')") - public CommonResult> getCombinationActivityPage( - @Valid CombinationActivityPageReqVO pageVO) { - // 查询拼团活动 - PageResult pageResult = combinationActivityService.getCombinationActivityPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 拼接数据 - List products = combinationActivityService.getCombinationProductsByActivityIds( - convertSet(pageResult.getList(), CombinationActivityDO::getId)); - List spus = productSpuApi.getSpuList( - convertSet(pageResult.getList(), CombinationActivityDO::getSpuId)); - return success(CombinationActivityConvert.INSTANCE.convertPage(pageResult, products, spus)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityBaseVO.java deleted file mode 100644 index aaedf106..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityBaseVO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.activity; - -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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * 拼团活动 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author HUIHUI - */ -@Data -public class CombinationActivityBaseVO { - - @Schema(description = "拼团名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "越拼越省钱") - @NotNull(message = "拼团名称不能为空") - private String name; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "拼团商品不能为空") - private Long spuId; - - @Schema(description = "总限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "16218") - @NotNull(message = "总限购数量不能为空") - private Integer totalLimitCount; - - @Schema(description = "单次限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28265") - @NotNull(message = "单次限购数量不能为空") - private Integer singleLimitCount; - - @Schema(description = "活动时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2022-07-01 23:59:59]") - @NotNull(message = "活动时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; - - @Schema(description = "活动时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2022-07-01 23:59:59]") - @NotNull(message = "活动时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; - - @Schema(description = "开团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222") - @NotNull(message = "开团人数不能为空") - private Integer userSize; - - @Schema(description = "限制时长(小时)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "限制时长不能为空") - private Integer limitDuration; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityCreateReqVO.java deleted file mode 100644 index 3bd225f6..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityCreateReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.activity; - -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductBaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import java.util.List; - -@Schema(description = "管理后台 - 拼团活动创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CombinationActivityCreateReqVO extends CombinationActivityBaseVO { - - @Schema(description = "拼团商品", requiredMode = Schema.RequiredMode.REQUIRED) - @Valid - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityPageReqVO.java deleted file mode 100644 index f474b4ec..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityPageReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.activity; - -import com.win.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 CombinationActivityPageReqVO extends PageParam { - - @Schema(description = "拼团名称", example = "赵六") - private String name; - - @Schema(description = "活动状态:0开启 1关闭", example = "0") - private Integer status; - - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityRespVO.java deleted file mode 100644 index 41d6c60c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityRespVO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.activity; - -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管理后台 - 拼团活动 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CombinationActivityRespVO extends CombinationActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901") - private Long id; - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大促") - private String spuName; - - @Schema(description = "商品主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - private String picUrl; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "开团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") - private Integer userSize; - - @Schema(description = "开团组数", requiredMode = Schema.RequiredMode.REQUIRED, example = "33") - private Integer totalCount; - - @Schema(description = "成团组数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer successCount; - - @Schema(description = "虚拟成团", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer virtualGroup; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; - - @Schema(description = "拼团商品", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityUpdateReqVO.java deleted file mode 100644 index 105451a8..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/activity/CombinationActivityUpdateReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.activity; - -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductBaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 拼团活动更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CombinationActivityUpdateReqVO extends CombinationActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901") - @NotNull(message = "活动编号不能为空") - private Long id; - - @Schema(description = "拼团商品", requiredMode = Schema.RequiredMode.REQUIRED) - @Valid - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductBaseVO.java deleted file mode 100644 index f1979250..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductBaseVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.product; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 拼团商品 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class CombinationProductBaseVO { - - @Schema(description = "商品 spuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "30563") - @NotNull(message = "商品 spuId 不能为空") - private Long spuId; - - @Schema(description = "商品 skuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "30563") - @NotNull(message = "商品 skuId 不能为空") - private Long skuId; - - @Schema(description = "拼团价格,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "27682") - @NotNull(message = "拼团价格不能为空") - private Integer combinationPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductPageReqVO.java deleted file mode 100644 index 15a89b9a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductPageReqVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.product; - -import com.win.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 com.win.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 CombinationProductPageReqVO extends PageParam { - - @Schema(description = "拼团活动编号", example = "6829") - private Long activityId; - - @Schema(description = "商品 SPU 编号", example = "18731") - private Long spuId; - - @Schema(description = "商品 SKU 编号", example = "31675") - private Long skuId; - - @Schema(description = "拼团商品状态", example = "2") - private Integer activityStatus; - - @Schema(description = "活动开始时间点") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] activityStartTime; - - @Schema(description = "活动结束时间点") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] activityEndTime; - - @Schema(description = "拼团价格,单位分", example = "27682") - private Integer activePrice; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductRespVO.java deleted file mode 100644 index 22a7aeb3..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/combination/vo/product/CombinationProductRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.promotion.controller.admin.combination.vo.product; - -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 CombinationProductRespVO extends CombinationProductBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28322") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponController.java deleted file mode 100644 index cd185758..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponPageItemRespVO; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponSendReqVO; -import com.win.module.promotion.convert.coupon.CouponConvert; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.service.coupon.CouponService; -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.Map; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 优惠劵") -@RestController -@RequestMapping("/promotion/coupon") -@Validated -public class CouponController { - - @Resource - private CouponService couponService; - @Resource - private MemberUserApi memberUserApi; - -// @GetMapping("/get") -// @Operation(summary = "获得优惠劵") -// @Parameter(name = "id", description = "编号", required = true, example = "1024") -// @PreAuthorize("@ss.hasPermission('promotion:coupon:query')") -// public CommonResult getCoupon(@RequestParam("id") Long id) { -// CouponDO coupon = couponService.getCoupon(id); -// return success(CouponConvert.INSTANCE.convert(coupon)); -// } - - @DeleteMapping("/delete") - @Operation(summary = "回收优惠劵") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:coupon:delete')") - public CommonResult deleteCoupon(@RequestParam("id") Long id) { - couponService.deleteCoupon(id); - return success(true); - } - - @GetMapping("/page") - @Operation(summary = "获得优惠劵分页") - @PreAuthorize("@ss.hasPermission('promotion:coupon:query')") - public CommonResult> getCouponPage(@Valid CouponPageReqVO pageVO) { - PageResult pageResult = couponService.getCouponPage(pageVO); - PageResult pageResulVO = CouponConvert.INSTANCE.convertPage(pageResult); - if (CollUtil.isEmpty(pageResulVO.getList())) { - return success(pageResulVO); - } - - // 读取用户信息,进行拼接 - Map userMap = memberUserApi.getUserMap(convertSet(pageResult.getList(), CouponDO::getUserId)); - pageResulVO.getList().forEach(itemRespVO -> MapUtils.findAndThen(userMap, itemRespVO.getUserId(), - userRespDTO -> itemRespVO.setNickname(userRespDTO.getNickname()))); - return success(pageResulVO); - } - - @PostMapping("/send") - @Operation(summary = "发送优惠劵") - @PreAuthorize("@ss.hasPermission('promotion:coupon:send')") - public CommonResult sendCoupon(@Valid @RequestBody CouponSendReqVO reqVO) { - couponService.takeCouponByAdmin(reqVO.getTemplateId(), reqVO.getUserIds()); - return success(true); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponTemplateController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponTemplateController.java deleted file mode 100644 index 6b8706f5..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/CouponTemplateController.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.coupon.vo.template.*; -import com.win.module.promotion.convert.coupon.CouponTemplateConvert; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import com.win.module.promotion.service.coupon.CouponTemplateService; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 优惠劵模板") -@RestController -@RequestMapping("/promotion/coupon-template") -@Validated -public class CouponTemplateController { - - @Resource - private CouponTemplateService couponTemplateService; - - @PostMapping("/create") - @Operation(summary = "创建优惠劵模板") - @PreAuthorize("@ss.hasPermission('promotion:coupon-template:create')") - public CommonResult createCouponTemplate(@Valid @RequestBody CouponTemplateCreateReqVO createReqVO) { - return success(couponTemplateService.createCouponTemplate(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新优惠劵模板") - @PreAuthorize("@ss.hasPermission('promotion:coupon-template:update')") - public CommonResult updateCouponTemplate(@Valid @RequestBody CouponTemplateUpdateReqVO updateReqVO) { - couponTemplateService.updateCouponTemplate(updateReqVO); - return success(true); - } - - @PutMapping("/update-status") - @Operation(summary = "更新优惠劵模板状态") - @PreAuthorize("@ss.hasPermission('promotion:coupon-template:update')") - public CommonResult updateCouponTemplateStatus(@Valid @RequestBody CouponTemplateUpdateStatusReqVO reqVO) { - couponTemplateService.updateCouponTemplateStatus(reqVO.getId(), reqVO.getStatus()); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除优惠劵模板") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:coupon-template:delete')") - public CommonResult deleteCouponTemplate(@RequestParam("id") Long id) { - couponTemplateService.deleteCouponTemplate(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得优惠劵模板") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:coupon-template:query')") - public CommonResult getCouponTemplate(@RequestParam("id") Long id) { - CouponTemplateDO couponTemplate = couponTemplateService.getCouponTemplate(id); - return success(CouponTemplateConvert.INSTANCE.convert(couponTemplate)); - } - - @GetMapping("/page") - @Operation(summary = "获得优惠劵模板分页") - @PreAuthorize("@ss.hasPermission('promotion:coupon-template:query')") - public CommonResult> getCouponTemplatePage(@Valid CouponTemplatePageReqVO pageVO) { - PageResult pageResult = couponTemplateService.getCouponTemplatePage(pageVO); - return success(CouponTemplateConvert.INSTANCE.convertPage(pageResult)); - } -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponBaseVO.java deleted file mode 100644 index 7d9dc1bd..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponBaseVO.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.coupon; - -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; - -/** -* 优惠劵 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class CouponBaseVO { - - // ========== 基本信息 BEGIN ========== - @Schema(description = "优惠劵模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "优惠劵模板编号不能为空") - private Long templateId; - - @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送") - @NotNull(message = "优惠劵名不能为空") - private String name; - - @Schema(description = "优惠码状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - // ========== 基本信息 END ========== - - // ========== 领取情况 BEGIN ========== - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "领取方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "领取方式不能为空") - private Integer takeType; - // ========== 领取情况 END ========== - - // ========== 使用规则 BEGIN ========== - @Schema(description = "是否设置满多少金额可用", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 单位:分;0 - 不限制 - @NotNull(message = "是否设置满多少金额可用不能为空") - private Integer usePrice; - - @Schema(description = "固定日期 - 生效开始时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime validStartTime; - - @Schema(description = "固定日期 - 生效结束时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime validEndTime; - - @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品范围不能为空") - @InEnum(PromotionProductScopeEnum.class) - private Integer productScope; - - @Schema(description = "商品范围编号的数组", example = "1,3") - private List productScopeValues; - // ========== 使用规则 END ========== - - // ========== 使用效果 BEGIN ========== - @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "优惠类型不能为空") - @InEnum(PromotionDiscountTypeEnum.class) - private Integer discountType; - - @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 - private Integer discountPercent; - - @Schema(description = "优惠金额", example = "10") - @Min(value = 0, message = "优惠金额需要大于等于 0") - private Integer discountPrice; - - @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 - private Integer discountLimitPrice; - // ========== 使用效果 END ========== - - // ========== 使用情况 BEGIN ========== - - @Schema(description = "使用订单号", example = "4096") - private Long useOrderId; - - @Schema(description = "使用时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime useTime; - - // ========== 使用情况 END ========== - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageItemRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageItemRespVO.java deleted file mode 100644 index 9409d193..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageItemRespVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - 优惠劵分页的每一项 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CouponPageItemRespVO extends CouponRespVO { - - @Schema(description = "用户昵称", example = "老芋艿") - private String nickname; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageReqVO.java deleted file mode 100644 index 2932a556..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponPageReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.coupon; - -import com.win.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 com.win.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 CouponPageReqVO extends PageParam { - - @Schema(description = "优惠劵模板编号", example = "2048") - private Long templateId; - - @Schema(description = "优惠码状态", example = "1") - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "用户昵称", example = "芋艿") - private String nickname; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponRespVO.java deleted file mode 100644 index 057d7804..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.coupon; - -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 CouponRespVO extends CouponBaseVO { - - @Schema(description = "优惠劵编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponSendReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponSendReqVO.java deleted file mode 100644 index 84ab7219..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/coupon/CouponSendReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Set; - -@Schema(description = "管理后台 - 优惠劵发放 Request VO") -@Data -@ToString(callSuper = true) -public class CouponSendReqVO { - - @Schema(description = "优惠劵模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "优惠劵模板编号不能为空") - private Long templateId; - - @Schema(description = "用户编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2]") - @NotEmpty(message = "用户编号列表不能为空") - private Set userIds; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java deleted file mode 100644 index d448f524..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.template; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; - -/** -* 优惠劵模板 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class CouponTemplateBaseVO { - - @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送") - @NotNull(message = "优惠劵名不能为空") - private String name; - - @Schema(description = "发行总量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") // -1 - 则表示不限制发放数量 - @NotNull(message = "发行总量不能为空") - private Integer totalCount; - - @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制 - @NotNull(message = "每人限领个数不能为空") - private Integer takeLimitCount; - - @Schema(description = "领取方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "领取方式不能为空") - private Integer takeType; - - @Schema(description = "是否设置满多少金额可用", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 单位:分;0 - 不限制 - @NotNull(message = "是否设置满多少金额可用不能为空") - private Integer usePrice; - - @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品范围不能为空") - @InEnum(PromotionProductScopeEnum.class) - private Integer productScope; - - @Schema(description = "商品范围编号的数组", example = "[1, 3]") - private List productScopeValues; - - @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "生效日期类型不能为空") - @InEnum(CouponTemplateValidityTypeEnum.class) - private Integer validityType; - - @Schema(description = "固定日期 - 生效开始时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime validStartTime; - - @Schema(description = "固定日期 - 生效结束时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime validEndTime; - - @Schema(description = "领取日期 - 开始天数") - @Min(value = 0L, message = "开始天数必须大于 0") - private Integer fixedStartTerm; - - @Schema(description = "领取日期 - 结束天数") - @Min(value = 1L, message = "开始天数必须大于 1") - private Integer fixedEndTerm; - - @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "优惠类型不能为空") - @InEnum(PromotionDiscountTypeEnum.class) - private Integer discountType; - - @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 - private Integer discountPercent; - - @Schema(description = "优惠金额", example = "10") - @Min(value = 0, message = "优惠金额需要大于等于 0") - private Integer discountPrice; - - @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 - private Integer discountLimitPrice; - - @AssertTrue(message = "商品范围编号的数组不能为空") - @JsonIgnore - public boolean isProductScopeValuesValid() { - return Objects.equals(productScope, PromotionProductScopeEnum.ALL.getScope()) // 全部范围时,可以为空 - || CollUtil.isNotEmpty(productScopeValues); - } - - @AssertTrue(message = "生效开始时间不能为空") - @JsonIgnore - public boolean isValidStartTimeValid() { - return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.DATE.getType()) - || validStartTime != null; - } - - @AssertTrue(message = "生效结束时间不能为空") - @JsonIgnore - public boolean isValidEndTimeValid() { - return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.DATE.getType()) - || validEndTime != null; - } - - @AssertTrue(message = "开始天数不能为空") - @JsonIgnore - public boolean isFixedStartTermValid() { - return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.TERM.getType()) - || fixedStartTerm != null; - } - - @AssertTrue(message = "结束天数不能为空") - @JsonIgnore - public boolean isFixedEndTermValid() { - return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.TERM.getType()) - || fixedEndTerm != null; - } - - @AssertTrue(message = "折扣百分比需要大于等于 1,小于等于 99") - @JsonIgnore - public boolean isDiscountPercentValid() { - return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType()) - || (discountPercent != null && discountPercent >= 1 && discountPercent<= 99); - } - - @AssertTrue(message = "优惠金额不能为空") - @JsonIgnore - public boolean isDiscountPriceValid() { - return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PRICE.getType()) - || discountPrice != null; - } - - @AssertTrue(message = "折扣上限不能为空") - @JsonIgnore - public boolean isDiscountLimitPriceValid() { - return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType()) - || discountLimitPrice != null; - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateCreateReqVO.java deleted file mode 100644 index 24bf3515..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.template; - -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 CouponTemplateCreateReqVO extends CouponTemplateBaseVO { - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplatePageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplatePageReqVO.java deleted file mode 100644 index c1130e5c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplatePageReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.template; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.enums.coupon.CouponTakeTypeEnum; -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 java.util.List; - -import static com.win.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 CouponTemplatePageReqVO extends PageParam { - - @Schema(description = "优惠劵名", example = "你好") - private String name; - - @Schema(description = "状态", example = "1") - private Integer status; - - @Schema(description = "优惠类型", example = "1") - private Integer discountType; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "可以领取的类型", example = "[1,2, 3]") - @InEnum(value = CouponTakeTypeEnum.class, message = "可以领取的类型,必须是 {value}") - private List canTakeTypes; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateRespVO.java deleted file mode 100644 index abd171d5..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.template; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -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 CouponTemplateRespVO extends CouponTemplateBaseVO { - - @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "领取优惠券的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer takeCount; - - @Schema(description = "使用优惠券的次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Integer useCount; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateReqVO.java deleted file mode 100644 index f95ac1d0..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.template; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CouponTemplateUpdateReqVO extends CouponTemplateBaseVO { - - @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "模板编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateStatusReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateStatusReqVO.java deleted file mode 100644 index a6dcd3d5..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateStatusReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.controller.admin.coupon.vo.template; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 优惠劵模板更新状态 Request VO") -@Data -public class CouponTemplateUpdateStatusReqVO { - - @Schema(description = "优惠劵模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "优惠劵模板编号不能为空") - private Long id; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.http b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.http deleted file mode 100644 index 79975c59..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.http +++ /dev/null @@ -1,18 +0,0 @@ -### /promotion/decorate/save 保存页面装修组件 -POST {{baseUrl}}/promotion/decorate/save -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "page": 1, - "code": "slide-show", - "status": 0, - "value": "null" -} - -### /promotion/decorate/list 获取指定页面的组件列表 -GET {{baseUrl}}/promotion/decorate/list?page=1 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.java deleted file mode 100644 index 5f3176f9..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/DecorateComponentController.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.promotion.controller.admin.decorate; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.controller.admin.decorate.vo.DecorateComponentRespVO; -import com.win.module.promotion.controller.admin.decorate.vo.DecorateComponentSaveReqVO; -import com.win.module.promotion.convert.decorate.DecorateComponentConvert; -import com.win.module.promotion.enums.decorate.DecoratePageEnum; -import com.win.module.promotion.service.decorate.DecorateComponentService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 店铺页面装修") -@RestController -@RequestMapping("/promotion/decorate") -@Validated -public class DecorateComponentController { - - @Resource - private DecorateComponentService decorateComponentService; - - @PostMapping("/save") - @Operation(summary = "保存页面装修组件") - @PreAuthorize("@ss.hasPermission('promotion:decorate:save')") - public CommonResult saveDecorateComponent(@Valid @RequestBody DecorateComponentSaveReqVO reqVO) { - decorateComponentService.saveDecorateComponent(reqVO); - return success(true); - } - - @GetMapping("/list") - @Operation(summary = "获取指定页面的组件列表") - @Parameter(name = "page", description = "页面 id", required = true) - @PreAuthorize("@ss.hasPermission('promotion:decorate:query')") - public CommonResult> getDecorateComponentListByPage( - @RequestParam("page") @InEnum(DecoratePageEnum.class) Integer page) { - return success(DecorateComponentConvert.INSTANCE.convertList02( - decorateComponentService.getDecorateComponentListByPage(page, null))); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentRespVO.java deleted file mode 100644 index c36c1d76..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.promotion.controller.admin.decorate.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 页面装修 Resp VO") -@Data -public class DecorateComponentRespVO { - - @Schema(description = "组件编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "nav-menu") - private String code; - - @Schema(description = "组件的内容配置项", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "TODO") - private String value; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentSaveReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentSaveReqVO.java deleted file mode 100644 index 7836fdde..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/decorate/vo/DecorateComponentSaveReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.promotion.controller.admin.decorate.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.enums.decorate.DecoratePageEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 页面装修的保存 Request VO ") -@Data -public class DecorateComponentSaveReqVO { - - @Schema(description = "页面 id ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "页面 id 不能为空") - @InEnum(DecoratePageEnum.class) - private Integer page; - - @Schema(description = "组件编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "nav-menu") - @NotEmpty(message = "组件编码不能为空") - private String code; - - @Schema(description = "组件对应值, json 字符串, 含内容配置,具体数据", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "组件值为空") - private String value; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/DiscountActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/DiscountActivityController.java deleted file mode 100644 index 82df3671..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/DiscountActivityController.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.win.module.promotion.controller.admin.discount; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.discount.vo.*; -import com.win.module.promotion.convert.discount.DiscountActivityConvert; -import com.win.module.promotion.dal.dataobject.discount.DiscountActivityDO; -import com.win.module.promotion.dal.dataobject.discount.DiscountProductDO; -import com.win.module.promotion.service.discount.DiscountActivityService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 限时折扣活动") -@RestController -@RequestMapping("/promotion/discount-activity") -@Validated -public class DiscountActivityController { - - @Resource - private DiscountActivityService discountActivityService; - - @PostMapping("/create") - @Operation(summary = "创建限时折扣活动") - @PreAuthorize("@ss.hasPermission('promotion:discount-activity:create')") - public CommonResult createDiscountActivity(@Valid @RequestBody DiscountActivityCreateReqVO createReqVO) { - return success(discountActivityService.createDiscountActivity(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新限时折扣活动") - @PreAuthorize("@ss.hasPermission('promotion:discount-activity:update')") - public CommonResult updateDiscountActivity(@Valid @RequestBody DiscountActivityUpdateReqVO updateReqVO) { - discountActivityService.updateDiscountActivity(updateReqVO); - return success(true); - } - - @PutMapping("/close") - @Operation(summary = "关闭限时折扣活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:discount-activity:close')") - public CommonResult closeRewardActivity(@RequestParam("id") Long id) { - discountActivityService.closeRewardActivity(id); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除限时折扣活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:discount-activity:delete')") - public CommonResult deleteDiscountActivity(@RequestParam("id") Long id) { - discountActivityService.deleteDiscountActivity(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得限时折扣活动") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:discount-activity:query')") - public CommonResult getDiscountActivity(@RequestParam("id") Long id) { - DiscountActivityDO discountActivity = discountActivityService.getDiscountActivity(id); - if (discountActivity == null) { - return success(null); - } - // 拼接结果 - List discountProducts = discountActivityService.getDiscountProductsByActivityId(id); - return success(DiscountActivityConvert.INSTANCE.convert(discountActivity, discountProducts)); - } - - @GetMapping("/page") - @Operation(summary = "获得限时折扣活动分页") - @PreAuthorize("@ss.hasPermission('promotion:discount-activity:query')") - public CommonResult> getDiscountActivityPage(@Valid DiscountActivityPageReqVO pageVO) { - PageResult pageResult = discountActivityService.getDiscountActivityPage(pageVO); - return success(DiscountActivityConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityBaseVO.java deleted file mode 100644 index aaf5203a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityBaseVO.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.win.module.promotion.controller.admin.discount.vo; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* 限时折扣活动 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class DiscountActivityBaseVO { - - @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "一个标题") - @NotNull(message = "活动标题不能为空") - private String name; - - @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "开始时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; - - @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "结束时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "商品") - @Data - public static class Product { - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品 SPU 编号不能为空") - private Long spuId; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "优惠类型不能为空") - @InEnum(PromotionDiscountTypeEnum.class) - private Integer discountType; - - @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 - private Integer discountPercent; - - @Schema(description = "优惠金额", example = "10") - @Min(value = 0, message = "优惠金额需要大于等于 0") - private Integer discountPrice; - - @AssertTrue(message = "折扣百分比需要大于等于 1,小于等于 99") - @JsonIgnore - public boolean isDiscountPercentValid() { - return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType()) - || (discountPercent != null && discountPercent >= 1 && discountPercent<= 99); - } - - @AssertTrue(message = "优惠金额不能为空") - @JsonIgnore - public boolean isDiscountPriceValid() { - return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PRICE.getType()) - || discountPrice != null; - } - - } -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityCreateReqVO.java deleted file mode 100644 index 55b5b526..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityCreateReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.promotion.controller.admin.discount.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import java.util.List; - -@Schema(description = "管理后台 - 限时折扣活动创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DiscountActivityCreateReqVO extends DiscountActivityBaseVO { - - /** - * 商品列表 - */ - @NotEmpty(message = "商品列表不能为空") - @Valid - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityDetailRespVO.java deleted file mode 100644 index 7af66f30..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityDetailRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.controller.admin.discount.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.List; - -@Schema(description = "管理后台 - 限时折扣活动的详细 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DiscountActivityDetailRespVO extends DiscountActivityRespVO { - - /** - * 商品列表 - */ - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityPageReqVO.java deleted file mode 100644 index ed0c15db..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.promotion.controller.admin.discount.vo; - -import com.win.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 com.win.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 DiscountActivityPageReqVO extends PageParam { - - @Schema(description = "活动标题", example = "一个标题") - private String name; - - @Schema(description = "活动状态", example = "1") - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityRespVO.java deleted file mode 100644 index b84efe52..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.promotion.controller.admin.discount.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.time.LocalDateTime; - -@Schema(description = "管理后台 - 限时折扣活动 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DiscountActivityRespVO extends DiscountActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "活动状态不能为空") - private Integer status; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityUpdateReqVO.java deleted file mode 100644 index 40725a36..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/discount/vo/DiscountActivityUpdateReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.promotion.controller.admin.discount.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 限时折扣活动更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DiscountActivityUpdateReqVO extends DiscountActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "活动编号不能为空") - private Long id; - - /** - * 商品列表 - */ - @NotEmpty(message = "商品列表不能为空") - @Valid - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/RewardActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/RewardActivityController.java deleted file mode 100644 index 036efa4d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/RewardActivityController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.win.module.promotion.controller.admin.reward; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityRespVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; -import com.win.module.promotion.convert.reward.RewardActivityConvert; -import com.win.module.promotion.dal.dataobject.reward.RewardActivityDO; -import com.win.module.promotion.service.reward.RewardActivityService; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 满减送活动") -@RestController -@RequestMapping("/promotion/reward-activity") -@Validated -public class RewardActivityController { - - @Resource - private RewardActivityService rewardActivityService; - - @PostMapping("/create") - @Operation(summary = "创建满减送活动") - @PreAuthorize("@ss.hasPermission('promotion:reward-activity:create')") - public CommonResult createRewardActivity(@Valid @RequestBody RewardActivityCreateReqVO createReqVO) { - return success(rewardActivityService.createRewardActivity(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新满减送活动") - @PreAuthorize("@ss.hasPermission('promotion:reward-activity:update')") - public CommonResult updateRewardActivity(@Valid @RequestBody RewardActivityUpdateReqVO updateReqVO) { - rewardActivityService.updateRewardActivity(updateReqVO); - return success(true); - } - - @PutMapping("/close") - @Operation(summary = "关闭满减送活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:reward-activity:close')") - public CommonResult closeRewardActivity(@RequestParam("id") Long id) { - rewardActivityService.closeRewardActivity(id); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除满减送活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:reward-activity:delete')") - public CommonResult deleteRewardActivity(@RequestParam("id") Long id) { - rewardActivityService.deleteRewardActivity(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得满减送活动") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')") - public CommonResult getRewardActivity(@RequestParam("id") Long id) { - RewardActivityDO rewardActivity = rewardActivityService.getRewardActivity(id); - return success(RewardActivityConvert.INSTANCE.convert(rewardActivity)); - } - - @GetMapping("/page") - @Operation(summary = "获得满减送活动分页") - @PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')") - public CommonResult> getRewardActivityPage(@Valid RewardActivityPageReqVO pageVO) { - PageResult pageResult = rewardActivityService.getRewardActivityPage(pageVO); - return success(RewardActivityConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityBaseVO.java deleted file mode 100644 index e2e8b03c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityBaseVO.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.win.module.promotion.controller.admin.reward.vo; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.enums.common.PromotionConditionTypeEnum; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.Valid; -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.Future; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* 满减送活动 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class RewardActivityBaseVO { - - @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "满啦满啦") - @NotNull(message = "活动标题不能为空") - private String name; - - @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "开始时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; - - @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "结束时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Future(message = "结束时间必须大于当前时间") - private LocalDateTime endTime; - - @Schema(description = "备注", example = "biubiubiu") - private String remark; - - @Schema(description = "条件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "条件类型不能为空") - @InEnum(value = PromotionConditionTypeEnum.class, message = "条件类型必须是 {value}") - private Integer conditionType; - - @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品范围不能为空") - @InEnum(value = PromotionConditionTypeEnum.class, message = "商品范围必须是 {value}") - private Integer productScope; - - @Schema(description = "商品 SPU 编号的数组", example = "1,2,3") - private List productSpuIds; - - /** - * 优惠规则的数组 - */ - @Valid // 校验下子对象 - private List rules; - - @Schema(description = "优惠规则") - @Data - public static class Rule { - - @Schema(description = "优惠门槛", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 1. 满 N 元,单位:分; 2. 满 N 件 - @Min(value = 1L, message = "优惠门槛必须大于等于 1") - private Integer limit; - - @Schema(description = "优惠价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @Min(value = 1L, message = "优惠价格必须大于等于 1") - private Integer discountPrice; - - @Schema(description = "是否包邮", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean freeDelivery; - - @Schema(description = "赠送的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @Min(value = 1L, message = "赠送的积分必须大于等于 1") - private Integer point; - - @Schema(description = "赠送的优惠劵编号的数组", example = "1,2,3") - private List couponIds; - - @Schema(description = "赠送的优惠卷数量的数组", example = "1,2,3") - private List couponCounts; - - @AssertTrue(message = "优惠劵和数量必须一一对应") - @JsonIgnore - public boolean isCouponCountsValid() { - return CollUtil.size(couponCounts) == CollUtil.size(couponCounts); - } - - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityCreateReqVO.java deleted file mode 100644 index d7ab3927..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.promotion.controller.admin.reward.vo; - -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 RewardActivityCreateReqVO extends RewardActivityBaseVO { - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityPageReqVO.java deleted file mode 100644 index 32117f21..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.controller.admin.reward.vo; - -import com.win.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 RewardActivityPageReqVO extends PageParam { - - @Schema(description = "活动标题", example = "满啦满啦") - private String name; - - @Schema(description = "活动状态", example = "1") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityRespVO.java deleted file mode 100644 index 02a0c3bf..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.promotion.controller.admin.reward.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 RewardActivityRespVO extends RewardActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer id; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityUpdateReqVO.java deleted file mode 100644 index b4fba8d1..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/reward/vo/RewardActivityUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.promotion.controller.admin.reward.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class RewardActivityUpdateReqVO extends RewardActivityBaseVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "活动编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillActivityController.java deleted file mode 100644 index eca26e25..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillActivityController.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.*; -import com.win.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; -import com.win.module.promotion.service.seckill.SeckillActivityService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 秒杀活动") -@RestController -@RequestMapping("/promotion/seckill-activity") -@Validated -public class SeckillActivityController { - - @Resource - private SeckillActivityService seckillActivityService; - @Resource - private ProductSpuApi productSpuApi; - - @PostMapping("/create") - @Operation(summary = "创建秒杀活动") - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:create')") - public CommonResult createSeckillActivity(@Valid @RequestBody SeckillActivityCreateReqVO createReqVO) { - return success(seckillActivityService.createSeckillActivity(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新秒杀活动") - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:update')") - public CommonResult updateSeckillActivity(@Valid @RequestBody SeckillActivityUpdateReqVO updateReqVO) { - seckillActivityService.updateSeckillActivity(updateReqVO); - return success(true); - } - - @PutMapping("/close") - @Operation(summary = "关闭秒杀活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:close')") - public CommonResult closeSeckillActivity(@RequestParam("id") Long id) { - seckillActivityService.closeSeckillActivity(id); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除秒杀活动") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:delete')") - public CommonResult deleteSeckillActivity(@RequestParam("id") Long id) { - seckillActivityService.deleteSeckillActivity(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得秒杀活动") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") - public CommonResult getSeckillActivity(@RequestParam("id") Long id) { - SeckillActivityDO activity = seckillActivityService.getSeckillActivity(id); - List products = seckillActivityService.getSeckillProductListByActivityId(id); - return success(SeckillActivityConvert.INSTANCE.convert(activity, products)); - } - - @GetMapping("/page") - @Operation(summary = "获得秒杀活动分页") - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") - public CommonResult> getSeckillActivityPage(@Valid SeckillActivityPageReqVO pageVO) { - // 查询活动列表 - PageResult pageResult = seckillActivityService.getSeckillActivityPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 拼接数据 - List products = seckillActivityService.getSeckillProductListByActivityId( - convertSet(pageResult.getList(), SeckillActivityDO::getId)); - List spuList = productSpuApi.getSpuList( - convertSet(pageResult.getList(), SeckillActivityDO::getSpuId)); - return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult, products, spuList)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillConfigController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillConfigController.java deleted file mode 100644 index 0fee6058..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/SeckillConfigController.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.seckill.vo.config.*; -import com.win.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; -import com.win.module.promotion.service.seckill.SeckillConfigService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 秒杀时段") -@RestController -@RequestMapping("/promotion/seckill-config") -@Validated -public class SeckillConfigController { - - @Resource - private SeckillConfigService seckillConfigService; - - @PostMapping("/create") - @Operation(summary = "创建秒杀时段") - @PreAuthorize("@ss.hasPermission('promotion:seckill-config:create')") - public CommonResult createSeckillConfig(@Valid @RequestBody SeckillConfigCreateReqVO createReqVO) { - return success(seckillConfigService.createSeckillConfig(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新秒杀时段") - @PreAuthorize("@ss.hasPermission('promotion:seckill-config:update')") - public CommonResult updateSeckillConfig(@Valid @RequestBody SeckillConfigUpdateReqVO updateReqVO) { - seckillConfigService.updateSeckillConfig(updateReqVO); - return success(true); - } - - @PutMapping("/update-status") - @Operation(summary = "修改时段配置状态") - @PreAuthorize("@ss.hasPermission('system:seckill-config:update')") - public CommonResult updateSeckillConfigStatus(@Valid @RequestBody SeckillConfigUpdateStatusReqVo reqVO) { - seckillConfigService.updateSeckillConfigStatus(reqVO.getId(), reqVO.getStatus()); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除秒杀时段") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('promotion:seckill-config:delete')") - public CommonResult deleteSeckillConfig(@RequestParam("id") Long id) { - seckillConfigService.deleteSeckillConfig(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得秒杀时段") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')") - public CommonResult getSeckillConfig(@RequestParam("id") Long id) { - SeckillConfigDO seckillConfig = seckillConfigService.getSeckillConfig(id); - return success(SeckillConfigConvert.INSTANCE.convert(seckillConfig)); - } - - @GetMapping("/list") - @Operation(summary = "获得所有秒杀时段列表") - @PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')") - public CommonResult> getSeckillConfigList() { - List list = seckillConfigService.getSeckillConfigList(); - return success(SeckillConfigConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获得所有开启状态的秒杀时段精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getListAllSimple() { - List list = seckillConfigService.getSeckillConfigListByStatus( - CommonStatusEnum.ENABLE.getStatus()); - return success(SeckillConfigConvert.INSTANCE.convertList1(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得秒杀时间段分页") - @PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')") - public CommonResult> getSeckillActivityPage(@Valid SeckillConfigPageReqVO pageVO) { - PageResult pageResult = seckillConfigService.getSeckillConfigPage(pageVO); - return success(SeckillConfigConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityBaseVO.java deleted file mode 100644 index bec24308..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityBaseVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.activity; - -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 java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * 秒杀活动基地签证官 - * 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author HUIHUI - */ -@Data -public class SeckillActivityBaseVO { - - @Schema(description = "秒杀活动商品 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "[121,1212]") - @NotNull(message = "秒杀活动商品不能为空") - private Long spuId; - - @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促") - @NotNull(message = "秒杀活动名称不能为空") - private String name; - - @Schema(description = "备注", example = "清仓大甩卖割韭菜") - private String remark; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "活动开始时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "活动结束时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime endTime; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排序不能为空") - private Integer sort; - - @Schema(description = "秒杀时段 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2,3]") - @NotNull(message = "秒杀时段不能为空") - private List configIds; - - @Schema(description = "总限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12877") - private Integer totalLimitCount; - - @Schema(description = "单次限够数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "31683") - private Integer singleLimitCount; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java deleted file mode 100644 index 3af668dc..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.activity; - - -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO; -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 SeckillActivityCreateReqVO extends SeckillActivityBaseVO { - - @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityDetailRespVO.java deleted file mode 100644 index 6daf1ca2..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityDetailRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.activity; - -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import java.util.List; - -@Schema(description = "管理后台 - 秒杀活动的详细 Response VO") -@Data -@ToString(callSuper = true) -public class SeckillActivityDetailRespVO extends SeckillActivityBaseVO{ - - @Schema(description = "秒杀活动id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityPageReqVO.java deleted file mode 100644 index 752d7317..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityPageReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.activity; - -import com.win.framework.common.pojo.PageParam; -import com.fasterxml.jackson.annotation.JsonFormat; -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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; - -@Schema(description = "管理后台 - 秒杀活动分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SeckillActivityPageReqVO extends PageParam { - - @Schema(description = "秒杀活动名称", example = "晚九点限时秒杀") - private String name; - - @Schema(description = "活动状态", example = "进行中") - private Integer status; - - @Schema(description = "秒杀时段id", example = "1") - private Long configId; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java deleted file mode 100644 index eba61c50..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.activity; - -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductRespVO; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SeckillActivityRespVO extends SeckillActivityBaseVO { - - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促") - private String spuName; - - @Schema(description = "商品主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") - private String picUrl; - - @Schema(description = "秒杀活动 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; - - @Schema(description = "订单实付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "22354") - private Integer totalPrice; - - @Schema(description = "秒杀库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer stock; - - @Schema(description = "秒杀总库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer totalStock; - - @Schema(description = "新增订单数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer orderCount; - - @Schema(description = "付款人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer userCount; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityUpdateReqVO.java deleted file mode 100644 index 033fbe7a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityUpdateReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.activity; - -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO; -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 SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { - - @Schema(description = "秒杀活动id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigBaseVO.java deleted file mode 100644 index 366dbe17..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigBaseVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.NotNull; -import java.time.LocalTime; -import java.util.List; - -/** - * 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author HUIHUI - */ -@Data -public class SeckillConfigBaseVO { - - @Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "早上场") - @NotNull(message = "秒杀时段名称不能为空") - private String name; - - @Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:00:00") - @NotNull(message = "开始时间点不能为空") - private String startTime; - - @Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:00:00") - @NotNull(message = "结束时间点不能为空") - private String endTime; - - @Schema(description = "秒杀轮播图", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png]") - @NotNull(message = "秒杀轮播图不能为空") - private List sliderPicUrls; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "状态不能为空") - private Integer status; - - @AssertTrue(message = "秒杀时段开始时间和结束时间不能相等") - @JsonIgnore - public boolean isValidStartTimeValid() { - return !LocalTime.parse(startTime).equals(LocalTime.parse(endTime)); - } - - @AssertTrue(message = "秒杀时段开始时间不能在结束时间之后") - @JsonIgnore - public boolean isValidEndTimeValid() { - return !LocalTime.parse(startTime).isAfter(LocalTime.parse(endTime)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigCreateReqVO.java deleted file mode 100644 index 2c9cda4d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -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 SeckillConfigCreateReqVO extends SeckillConfigBaseVO { - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigPageReqVO.java deleted file mode 100644 index 600caf6a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -import com.win.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 SeckillConfigPageReqVO extends PageParam { - - @Schema(description = "秒杀时段名称", example = "上午场") - private String name; - - @Schema(description = "状态", example = "0") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigRespVO.java deleted file mode 100644 index 02269f95..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -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 SeckillConfigRespVO extends SeckillConfigBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "秒杀活动数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer seckillActivityCount; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigSimpleRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigSimpleRespVO.java deleted file mode 100644 index c5063fd9..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigSimpleRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 秒杀时段配置精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SeckillConfigSimpleRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "编号不能为空") - private Long id; - - @Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "早上场") - @NotNull(message = "秒杀时段名称不能为空") - private String name; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateReqVO.java deleted file mode 100644 index ce1eb586..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SeckillConfigUpdateReqVO extends SeckillConfigBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateStatusReqVo.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateStatusReqVo.java deleted file mode 100644 index 361ed994..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateStatusReqVo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.config; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 修改时段配置状态 Request VO") -@Data -public class SeckillConfigUpdateStatusReqVo { - - @Schema(description = "时段配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "时段配置编号不能为空") - private Long id; - - @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductBaseVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductBaseVO.java deleted file mode 100644 index 1dd636c5..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductBaseVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.product; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 秒杀参与商品 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author HUIHUI - */ -@Data -public class SeckillProductBaseVO { - - @Schema(description = "商品sku_id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30563") - @NotNull(message = "商品sku_id不能为空") - private Long skuId; - - @Schema(description = "秒杀金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "6689") - @NotNull(message = "秒杀金额,单位:分不能为空") - private Integer seckillPrice; - - @Schema(description = "秒杀库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "秒杀库存不能为空") - private Integer stock; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductRespVO.java deleted file mode 100644 index 3daf7fa1..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/admin/seckill/vo/product/SeckillProductRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.promotion.controller.admin.seckill.vo.product; - -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 SeckillProductRespVO extends SeckillProductBaseVO { - - @Schema(description = "秒杀参与商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "256") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/AppActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/AppActivityController.java deleted file mode 100644 index 1e502b66..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/AppActivityController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.win.module.promotion.controller.app.activity; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.promotion.controller.app.activity.vo.AppActivityRespVO; -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.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 java.time.LocalDateTime; -import java.util.*; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 营销活动") // 用于提供跨多个活动的 HTTP 接口 -@RestController -@RequestMapping("/promotion/activity") -@Validated -public class AppActivityController { - - @GetMapping("/list-by-spu-id") - @Operation(summary = "获得单个商品,近期参与的每个活动") // 每种活动,只返回一个 - @Parameter(name = "spuId", description = "商品编号", required = true) - public CommonResult> getActivityListBySpuId(@RequestParam("spuId") Long spuId) { - // TODO 芋艿,实现 - List randomList = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 3; i++) { // 生成5个随机对象 - AppActivityRespVO vo = new AppActivityRespVO(); - vo.setId(random.nextLong()); // 随机生成一个长整型 ID - vo.setType(i + 1); // 随机生成一个介于0到2之间的整数,对应枚举类型的三种类型之一 - vo.setName(String.format("活动%d", random.nextInt(100))); // 随机生成一个类似于“活动XX”的活动名称,XX为0到99之间的随机整数 - vo.setStartTime(LocalDateTime.now()); // 随机生成一个在过去的一年内的开始时间(以毫秒为单位) - vo.setEndTime(LocalDateTime.now()); // 随机生成一个在未来的一年内的结束时间(以毫秒为单位) - randomList.add(vo); - } - return success(randomList); - } - - @GetMapping("/list-by-spu-ids") - @Operation(summary = "获得多个商品,近期参与的每个活动") // 每种活动,只返回一个;key 为 SPU 编号 - @Parameter(name = "spuIds", description = "商品编号数组", required = true) - public CommonResult>> getActivityListBySpuIds(@RequestParam("spuIds") List spuIds) { - // TODO 芋艿,实现 - List randomList = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 5; i++) { // 生成5个随机对象 - AppActivityRespVO vo = new AppActivityRespVO(); - vo.setId(random.nextLong()); // 随机生成一个长整型 ID - vo.setType(random.nextInt(3)); // 随机生成一个介于0到2之间的整数,对应枚举类型的三种类型之一 - vo.setName(String.format("活动%d", random.nextInt(100))); // 随机生成一个类似于“活动XX”的活动名称,XX为0到99之间的随机整数 - vo.setStartTime(LocalDateTime.now()); // 随机生成一个在过去的一年内的开始时间(以毫秒为单位) - vo.setEndTime(LocalDateTime.now()); // 随机生成一个在未来的一年内的结束时间(以毫秒为单位) - randomList.add(vo); - } - Map> map = new HashMap<>(); - map.put(109L, randomList); - map.put(2L, randomList); - return success(map); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/vo/AppActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/vo/AppActivityRespVO.java deleted file mode 100644 index b12e4be6..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/activity/vo/AppActivityRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.promotion.controller.app.activity.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 营销活动 Response VO") -@Data -public class AppActivityRespVO { - - @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "活动类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - // 对应 PromotionTypeEnum 枚举 - private Integer type; - - @Schema(description = "活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大促") - private String name; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleCategoryController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleCategoryController.java deleted file mode 100644 index fa1361a7..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleCategoryController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.promotion.controller.app.article; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.promotion.controller.app.article.vo.category.AppArticleCategoryRespVO; -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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 文章分类") -@RestController -@RequestMapping("/promotion/article-category") -@Validated -public class AppArticleCategoryController { - - @RequestMapping("/list") - @Operation(summary = "获得文章分类列表") - // TODO @芋艿:swagger 注解 - public CommonResult> getArticleCategoryList() { - List appArticleRespVOList = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppArticleCategoryRespVO appArticleRespVO = new AppArticleCategoryRespVO(); - appArticleRespVO.setId((long) (i + 1)); - appArticleRespVO.setName("分类 - " + i); - appArticleRespVO.setPicUrl("https://www.iocoder.cn/" + (i + 1) + ".png"); - appArticleRespVOList.add(appArticleRespVO); - } - return success(appArticleRespVOList); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleController.java deleted file mode 100644 index b15e6cbe..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/AppArticleController.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.win.module.promotion.controller.app.article; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.app.article.vo.article.AppArticlePageReqVO; -import com.win.module.promotion.controller.app.article.vo.article.AppArticleRespVO; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 文章") -@RestController -@RequestMapping("/promotion/article") -@Validated -public class AppArticleController { - - @RequestMapping("/list") - // TODO @芋艿:swagger 注解 - public CommonResult> getArticleList(@RequestParam(value = "recommendHot", required = false) Boolean recommendHot, - @RequestParam(value = "recommendBanner", required = false) Boolean recommendBanner) { - List appArticleRespVOList = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppArticleRespVO appArticleRespVO = new AppArticleRespVO(); - appArticleRespVO.setId((long) (i + 1)); - appArticleRespVO.setTitle("芋道源码 - " + i + "模块"); - appArticleRespVO.setAuthor("芋道源码"); - appArticleRespVO.setCategoryId((long) random.nextInt(10000)); - appArticleRespVO.setPicUrl("https://www.iocoder.cn/" + (i + 1) + ".png"); - appArticleRespVO.setIntroduction("我是简介"); - appArticleRespVO.setDescription("我是详细"); - appArticleRespVO.setCreateTime(LocalDateTime.now()); - appArticleRespVO.setBrowseCount(random.nextInt(10000)); - appArticleRespVO.setSpuId((long) random.nextInt(10000)); - appArticleRespVOList.add(appArticleRespVO); - } - return success(appArticleRespVOList); - } - - @RequestMapping("/page") - // TODO @芋艿:swagger 注解 - public CommonResult> getArticlePage(AppArticlePageReqVO pageReqVO) { - List appArticleRespVOList = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppArticleRespVO appArticleRespVO = new AppArticleRespVO(); - appArticleRespVO.setId((long) (i + 1)); - appArticleRespVO.setTitle("芋道源码 - " + i + "模块"); - appArticleRespVO.setAuthor("芋道源码"); - appArticleRespVO.setCategoryId((long) random.nextInt(10000)); - appArticleRespVO.setPicUrl("https://www.iocoder.cn/" + (i + 1) + ".png"); - appArticleRespVO.setIntroduction("我是简介"); - appArticleRespVO.setDescription("我是详细"); - appArticleRespVO.setCreateTime(LocalDateTime.now()); - appArticleRespVO.setBrowseCount(random.nextInt(10000)); - appArticleRespVO.setSpuId((long) random.nextInt(10000)); - appArticleRespVOList.add(appArticleRespVO); - } - return success(new PageResult<>(appArticleRespVOList, 10L)); - } - - @RequestMapping("/get") - // TODO @芋艿:swagger 注解 - public CommonResult getArticlePage(@RequestParam("id") Long id) { - Random random = new Random(); - AppArticleRespVO appArticleRespVO = new AppArticleRespVO(); - appArticleRespVO.setId((long) (1)); - appArticleRespVO.setTitle("芋道源码 - " + 0 + "模块"); - appArticleRespVO.setAuthor("芋道源码"); - appArticleRespVO.setCategoryId((long) random.nextInt(10000)); - appArticleRespVO.setPicUrl("https://www.iocoder.cn/" + (0 + 1) + ".png"); - appArticleRespVO.setIntroduction("我是简介"); - appArticleRespVO.setDescription("我是详细"); - appArticleRespVO.setCreateTime(LocalDateTime.now()); - appArticleRespVO.setBrowseCount(random.nextInt(10000)); - appArticleRespVO.setSpuId((long) random.nextInt(10000)); - appArticleRespVO.setSpuId(633L); - return success(appArticleRespVO); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticlePageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticlePageReqVO.java deleted file mode 100644 index 21c822c0..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticlePageReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.promotion.controller.app.article.vo.article; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "应用 App - 文章的分页 Request VO") -@Data -public class AppArticlePageReqVO extends PageParam { - - @Schema(description = "分类编号", example = "2048") - private Long categoryId; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticleRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticleRespVO.java deleted file mode 100644 index 4a473803..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/article/AppArticleRespVO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.promotion.controller.app.article.vo.article; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "应用 App - 文章 Response VO") -@Data -public class AppArticleRespVO { - - @Schema(description = "文章编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "文章标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码 - 促销模块") - private String title; - - @Schema(description = "文章作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - private String author; - - @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long categoryId; - - @Schema(description = "图文封面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String picUrl; - - @Schema(description = "文章简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是简介") - private String introduction; - - @Schema(description = "文章内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是详细") - private String description; - - @Schema(description = "发布时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer browseCount; - - @Schema(description = "关联的商品 SPU 编号", example = "1024") - private Long spuId; - -// TODO 芋艿:下面 2 个字段,后端要存储,前端不用返回; -// @Schema(description = "是否热卖推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") -// private Boolean recommendHot; -// -// @Schema(description = "是否 Banner 推荐", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") -// private Boolean recommendBanner; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/category/AppArticleCategoryRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/category/AppArticleCategoryRespVO.java deleted file mode 100644 index a27dbbc0..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/article/vo/category/AppArticleCategoryRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.promotion.controller.app.article.vo.category; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "应用 App - 文章分类 Response VO") -@Data -public class AppArticleCategoryRespVO { - - @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "技术") - private String name; - - @Schema(description = "分类图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String picUrl; - - // TODO 芋艿:下面 2 个字段,后端要存储,前端不用返回; -// @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") -// private Integer status; -// -// @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") -// private Integer sort; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/AppBannerController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/AppBannerController.java deleted file mode 100644 index 343376db..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/AppBannerController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.promotion.controller.app.banner; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.promotion.controller.app.banner.vo.AppBannerRespVO; -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 java.util.ArrayList; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@RestController -@RequestMapping("/promotion/banner") -@Tag(name = "用户 APP - 首页 Banner") -@Validated -public class AppBannerController { - - @GetMapping("/list") - @Operation(summary = "获得 banner 列表") - // todo @芋艿:swagger 注解,待补全 - // TODO @芋艿:可以增加缓存,提升性能 - // TODO @芋艿:position = 1 时,首页;position = 10 时,拼团活动页 - public CommonResult> getBannerList(@RequestParam("position") Integer position) { - List bannerList = new ArrayList<>(); - AppBannerRespVO banner1 = new AppBannerRespVO(); - banner1.setUrl("https://www.example.com/link1"); - banner1.setPicUrl("https://api.java.crmeb.net/crmebimage/public/content/2022/08/04/0f78716213f64bfa83f191d51a832cbf73f6axavoy.jpg"); - bannerList.add(banner1); - AppBannerRespVO banner2 = new AppBannerRespVO(); - banner2.setUrl("https://www.example.com/link2"); - banner2.setPicUrl("https://api.java.crmeb.net/crmebimage/public/content/2023/01/11/be09e755268b43ee90b0db3a3e1b7132r7a6t2wvsm.jpg"); - bannerList.add(banner2); - return success(bannerList); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/vo/AppBannerRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/vo/AppBannerRespVO.java deleted file mode 100644 index c94915c1..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/banner/vo/AppBannerRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.promotion.controller.app.banner.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - Banner Response VO") -@Data -public class AppBannerRespVO { - - @Schema(description = "跳转链接", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "跳转链接不能为空") - private String url; - - @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "图片地址不能为空") - private String picUrl; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainActivityController.java deleted file mode 100644 index 7c55b271..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainActivityController.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.win.module.promotion.controller.app.bargain; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityDetailRespVO; -import com.win.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityRespVO; -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 java.time.Duration; -import java.util.ArrayList; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 砍价活动") -@RestController -@RequestMapping("/promotion/bargain-activity") -@Validated -public class AppBargainActivityController { - - @GetMapping("/page") - @Operation(summary = "获得砍价活动活动") // TODO 芋艿:只查询进行中,且在时间范围内的 - // TODO 芋艿:缺少 swagger 注解 - public CommonResult> getBargainActivityPage(PageParam pageReqVO) { - List activityList = new ArrayList<>(); - AppBargainActivityRespVO activity1 = new AppBargainActivityRespVO(); - activity1.setId(1L); - activity1.setName("618 大砍价"); - activity1.setSpuId(2048L); - activity1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - activity1.setMarketPrice(50); - activity1.setBargainPrice(100); - activity1.setStartTime(LocalDateTimeUtils.addTime(Duration.ofDays(-2))); - activity1.setEndTime(LocalDateTimeUtils.addTime(Duration.ofDays(1))); - activity1.setStock(10); - activityList.add(activity1); - - AppBargainActivityRespVO activity2 = new AppBargainActivityRespVO(); - activity2.setId(2L); - activity2.setName("双十一砍价"); - activity2.setSpuId(4096L); - activity2.setPicUrl("https://static.iocoder.cn/mall/132.jpeg"); - activity2.setMarketPrice(100); - activity2.setBargainPrice(200); - activity2.setStartTime(LocalDateTimeUtils.addTime(Duration.ofDays(-2))); - activity2.setEndTime(LocalDateTimeUtils.addTime(Duration.ofDays(1))); - activity2.setStock(0); - activityList.add(activity2); - - return success(new PageResult<>(activityList, 10L)); - } - - @GetMapping("/list") - @Operation(summary = "获得砍价活动列表", description = "用于小程序首页") - // TODO 芋艿:增加 Spring Cache - // TODO 芋艿:缺少 swagger 注解 - public CommonResult> getBargainActivityList( - @RequestParam(name = "count", defaultValue = "6") Integer count) { - List activityList = new ArrayList<>(); - AppBargainActivityRespVO activity1 = new AppBargainActivityRespVO(); - activity1.setId(1L); - activity1.setName("618 大砍价"); - activity1.setSpuId(2048L); - activity1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - activity1.setMarketPrice(50); - activity1.setBargainPrice(100); - activityList.add(activity1); - - AppBargainActivityRespVO activity2 = new AppBargainActivityRespVO(); - activity2.setId(2L); - activity2.setName("双十一砍价"); - activity2.setSpuId(4096L); - activity2.setPicUrl("https://static.iocoder.cn/mall/132.jpeg"); - activity2.setMarketPrice(100); - activity2.setBargainPrice(200); - activityList.add(activity2); - - return success(activityList); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得砍价活动详情") - // TODO 芋艿:缺少 swagger 注解 - public CommonResult getBargainActivityDetail(@RequestParam("id") Long id) { - AppBargainActivityDetailRespVO activity = new AppBargainActivityDetailRespVO(); - activity.setId(2L); - activity.setName("618 大砍价"); - activity.setSpuId(2048L); - activity.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - activity.setMarketPrice(50); - activity.setBargainPrice(100); - activity.setStock(10); - activity.setUnitName("件"); - activity.setPrice(40); - activity.setStartTime(LocalDateTimeUtils.addTime(Duration.ofDays(-2))); - activity.setEndTime(LocalDateTimeUtils.addTime(Duration.ofDays(-10))); - activity.setDescription("我吃西红柿"); - activity.setSuccessCount(10); - return success(activity); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainHelpController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainHelpController.java deleted file mode 100644 index b9413654..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainHelpController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.promotion.controller.app.bargain; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.promotion.controller.app.bargain.vo.help.AppBargainHelpCreateReqVO; -import com.win.module.promotion.controller.app.bargain.vo.help.AppBargainHelpRespVO; -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.*; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 砍价助力") -@RestController -@RequestMapping("/promotion/bargain-help") -@Validated -public class AppBargainHelpController { - - @PostMapping("/create") - @Operation(summary = "创建砍价助力", description = "给拼团记录砍一刀") // 返回结果为砍价金额,单位:分 - public CommonResult createBargainHelp(@RequestBody AppBargainHelpCreateReqVO reqVO) { - return success(20L); - } - - @GetMapping("/list") - @Operation(summary = "获得砍价助力列表") - // TODO 芋艿:swagger - public CommonResult> getBargainHelpList(@RequestParam("recordId") Long recordId) { - List list = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - AppBargainHelpRespVO vo = new AppBargainHelpRespVO(); - vo.setNickname("用户" + i); - vo.setAvatar("https://www.iocoder.cn/avatar/" + i + ".jpg"); - vo.setReducePrice((i + 1) * 100); - vo.setCreateTime(LocalDateTime.now()); - list.add(vo); - } - return success(list); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainRecordController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainRecordController.java deleted file mode 100644 index c0f85190..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/AppBargainRecordController.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.win.module.promotion.controller.app.bargain; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.module.promotion.controller.app.bargain.vo.record.AppBargainRecordCreateReqVO; -import com.win.module.promotion.controller.app.bargain.vo.record.AppBargainRecordDetailRespVO; -import com.win.module.promotion.controller.app.bargain.vo.record.AppBargainRecordRespVO; -import com.win.module.promotion.controller.app.bargain.vo.record.AppBargainRecordSummaryRespVO; -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.*; - -import java.time.Duration; -import java.util.ArrayList; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 砍价记录") -@RestController -@RequestMapping("/promotion/bargain-record") -@Validated -public class AppBargainRecordController { - - @GetMapping("/get-summary") - @Operation(summary = "获得砍价记录的概要信息", description = "用于小程序首页") - // TODO 芋艿:增加 @Cache 缓存,1 分钟过期 - public CommonResult getBargainRecordSummary() { - AppBargainRecordSummaryRespVO summary = new AppBargainRecordSummaryRespVO(); - summary.setUserCount(1024); - summary.setSuccessRecords(new ArrayList<>()); - AppBargainRecordSummaryRespVO.Record record1 = new AppBargainRecordSummaryRespVO.Record(); - record1.setNickname("王**"); - record1.setAvatar("https://www.iocoder.cn/xxx.jpg"); - record1.setActivityName("天蚕土豆"); - AppBargainRecordSummaryRespVO.Record record2 = new AppBargainRecordSummaryRespVO.Record(); - record2.setNickname("张**"); - record2.setAvatar("https://www.iocoder.cn/yyy.jpg"); - record2.setActivityName("斗罗大陆"); - summary.getSuccessRecords().add(record1); - summary.getSuccessRecords().add(record2); - return success(summary); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得砍价记录的明细") - // TODO 芋艿:swagger;id 和 activityId 二选一 - public CommonResult getBargainRecordDetail( - @RequestParam(value = "id", required = false) Long id, - @RequestParam(value = "activityId", required = false) Long activityId) { - AppBargainRecordDetailRespVO detail = new AppBargainRecordDetailRespVO(); - detail.setId(1L); - detail.setUserId(1L); - detail.setSpuId(1L); - detail.setSkuId(1L); - detail.setPrice(500); - detail.setActivityId(1L); - detail.setBargainPrice(150); - detail.setPrice(200); - detail.setPayPrice(180); - detail.setStatus(1); - detail.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(2))); - return success(detail); - } - - @GetMapping("/page") - @Operation(summary = "获得砍价记录的分页") - public CommonResult> getBargainRecordPage(PageParam pageParam) { - PageResult page = new PageResult<>(); - page.setList(new ArrayList<>()); - AppBargainRecordRespVO record1 = new AppBargainRecordRespVO(); - record1.setId(1L); - record1.setUserId(1L); - record1.setSpuId(1L); - record1.setSkuId(1L); - record1.setPrice(500); - record1.setActivityId(1L); - record1.setBargainPrice(150); - record1.setPrice(200); - record1.setPayPrice(180); - record1.setStatus(1); - record1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - record1.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(2))); - page.getList().add(record1); - - AppBargainRecordRespVO record2 = new AppBargainRecordRespVO(); - record2.setId(1L); - record2.setUserId(1L); - record2.setSpuId(1L); - record2.setSkuId(1L); - record2.setPrice(500); - record2.setActivityId(1L); - record2.setBargainPrice(150); - record2.setPrice(200); - record2.setPayPrice(280); - record2.setStatus(2); - record2.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - record2.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(2))); - page.getList().add(record2); - - AppBargainRecordRespVO record3 = new AppBargainRecordRespVO(); - record3.setId(1L); - record3.setUserId(1L); - record3.setSpuId(1L); - record3.setSkuId(1L); - record3.setPrice(500); - record3.setActivityId(1L); - record3.setBargainPrice(150); - record3.setPrice(200); - record3.setPayPrice(380); - record3.setStatus(2); - record3.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - record3.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(2))); - record3.setOrderId(100L); - page.getList().add(record3); - - AppBargainRecordRespVO record4 = new AppBargainRecordRespVO(); - record4.setId(1L); - record4.setUserId(1L); - record4.setSpuId(1L); - record4.setSkuId(1L); - record4.setPrice(500); - record4.setActivityId(1L); - record4.setBargainPrice(150); - record4.setPrice(200); - record4.setPayPrice(380); - record4.setStatus(3); - record4.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - record4.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(2))); - record4.setOrderId(100L); - page.getList().add(record4); - - page.setTotal(1L); - return success(page); - } - - @PostMapping("/create") - @Operation(summary = "创建砍价记录", description = "参与拼团活动") - public CommonResult createBargainRecord(@RequestBody AppBargainRecordCreateReqVO reqVO) { - return success(1L); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityDetailRespVO.java deleted file mode 100644 index 6674c9ac..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityDetailRespVO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 砍价活动的明细 Response VO") -@Data -public class AppBargainActivityDetailRespVO { - - @Schema(description = "砍价活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "砍价活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大砍价") - private String name; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long skuId; - - @Schema(description = "商品价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer price; - - @Schema(description = "商品描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "我要吃西红柿") - private String description; - - @Schema(description = "砍价库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "512") - private Integer stock; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") // 从 SPU 的 picUrl 读取 - private String picUrl; - - @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") // 从 SPU 的 marketPrice 读取 - private Integer marketPrice; - - @Schema(description = "商品单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") // 从 SPU 的 unit 读取,然后转换 - private String unitName; - - @Schema(description = "砍价最低金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 从砍价商品里取最低价 - private Integer bargainPrice; - - @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer successCount; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityRespVO.java deleted file mode 100644 index fd94c61a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/activity/AppBargainActivityRespVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 砍价活动 Response VO") -@Data -public class AppBargainActivityRespVO { - - @Schema(description = "砍价活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "砍价活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大砍价") - private String name; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long skuId; - - @Schema(description = "砍价库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "512") - private Integer stock; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") // 从 SPU 的 picUrl 读取 - private String picUrl; - - @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") // 从 SPU 的 marketPrice 读取 - private Integer marketPrice; - - @Schema(description = "砍价最低金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") // 从砍价商品里取最低价 - private Integer bargainPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpCreateReqVO.java deleted file mode 100644 index 839b5101..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpCreateReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.help; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 砍价助力的创建 Request VO") -@Data -public class AppBargainHelpCreateReqVO { - - @Schema(description = "砍价记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "砍价记录编号不能为空") - private Long recordId; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpRespVO.java deleted file mode 100644 index 7b1acd5b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/help/AppBargainHelpRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.help; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 砍价助力 Response VO") -@Data -public class AppBargainHelpRespVO { - - @Schema(description = "助力用户的昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String nickname; - - @Schema(description = "助力用户的头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String avatar; - - @Schema(description = "助力用户的砍价金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer reducePrice; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordCreateReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordCreateReqVO.java deleted file mode 100644 index e9535ac6..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordCreateReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 砍价记录的创建 Request VO") -@Data -public class AppBargainRecordCreateReqVO { - - @Schema(description = "砍价活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "砍价活动编号不能为空") - private Long activityId; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordDetailRespVO.java deleted file mode 100644 index 5ad3a621..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordDetailRespVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 砍价记录的明细 Response VO") -@Data -public class AppBargainRecordDetailRespVO { - - public static final int HELP_ACTION_NONE = 1; // 帮砍动作 - 未帮砍,可以帮砍 - public static final int HELP_ACTION_FULL = 2; // 帮砍动作 - 未帮砍,无法帮砍(可帮砍次数已满) - public static final int HELP_ACTION_SUCCESS = 3; // 帮砍动作 - 已帮砍 - - private Long id; - private Long userId; - private Long spuId; - private Long skuId; - private Long activityId; - private Integer bargainPrice; - private Integer price; - private Integer payPrice; - private Integer status; - - private LocalDateTime expireTime; - - private Long orderId; - private Boolean payStatus; - - private Integer helpAction; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordRespVO.java deleted file mode 100644 index 5900f8b8..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordRespVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 砍价记录的 Response VO") -@Data -public class AppBargainRecordRespVO { - - // TODO @芋艿:status;如果砍价对应的订单支付超时,算失败么?砍价的支付时间,以 expireTime 为准么? - - private Long id; - private Long userId; - private Long spuId; - private Long skuId; - private Long activityId; - private Integer bargainPrice; - private Integer price; - private Integer payPrice; - private Integer status; - private LocalDateTime expireTime; - - private Long orderId; - private Boolean payStatus; - private Long payOrderId; - - private String activityName; - private String picUrl; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordSummaryRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordSummaryRespVO.java deleted file mode 100644 index 4b9c7fa6..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/bargain/vo/record/AppBargainRecordSummaryRespVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.promotion.controller.app.bargain.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 砍价记录的简要概括 Response VO") -@Data -public class AppBargainRecordSummaryRespVO { - - @Schema(description = "砍价用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer userCount; - - @Schema(description = "成功砍价的记录", requiredMode = Schema.RequiredMode.REQUIRED) // 只返回最近的 7 个 - private List successRecords; - - @Schema(description = "成功砍价记录") - @Data - public static class Record { - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王**") - private String nickname; - - @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.jpg") - private String avatar; - - @Schema(description = "活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "天蚕土豆") - private String activityName; - - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationActivityController.java deleted file mode 100644 index 415bfa7a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationActivityController.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.win.module.promotion.controller.app.combination; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityDetailRespVO; -import com.win.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityRespVO; -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.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 java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 拼团活动") -@RestController -@RequestMapping("/promotion/combination-activity") -@Validated -public class AppCombinationActivityController { - - @GetMapping("/list") - @Operation(summary = "获得拼团活动列表", description = "用于小程序首页") - // TODO 芋艿:增加 Spring Cache - // TODO 芋艿:缺少 swagger 注解 - public CommonResult> getCombinationActivityList( - @RequestParam(name = "count", defaultValue = "6") Integer count) { - List activityList = new ArrayList<>(); - AppCombinationActivityRespVO activity1 = new AppCombinationActivityRespVO(); - activity1.setId(1L); - activity1.setName("618 大拼团"); - activity1.setUserSize(3); - activity1.setSpuId(2048L); - activity1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - activity1.setMarketPrice(50); - activity1.setCombinationPrice(100); - activityList.add(activity1); - - AppCombinationActivityRespVO activity2 = new AppCombinationActivityRespVO(); - activity2.setId(2L); - activity2.setName("双十一拼团"); - activity2.setUserSize(5); - activity2.setSpuId(4096L); - activity2.setPicUrl("https://static.iocoder.cn/mall/132.jpeg"); - activity2.setMarketPrice(100); - activity2.setCombinationPrice(200); - activityList.add(activity2); - - return success(activityList); - } - - @GetMapping("/page") - @Operation(summary = "获得拼团活动分页") - public CommonResult> getCombinationActivityPage(PageParam pageParam) { - List activityList = new ArrayList<>(); - AppCombinationActivityRespVO activity1 = new AppCombinationActivityRespVO(); - activity1.setId(1L); - activity1.setName("618 大拼团"); - activity1.setUserSize(3); - activity1.setSpuId(2048L); - activity1.setPicUrl("商品图片地址"); - activity1.setMarketPrice(50); - activity1.setCombinationPrice(100); - activityList.add(activity1); - - AppCombinationActivityRespVO activity2 = new AppCombinationActivityRespVO(); - activity2.setId(2L); - activity2.setName("双十一拼团"); - activity2.setUserSize(5); - activity2.setSpuId(4096L); - activity2.setPicUrl("商品图片地址"); - activity2.setMarketPrice(100); - activity2.setCombinationPrice(200); - activityList.add(activity2); - - return success(new PageResult<>(activityList, 2L)); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得拼团活动明细") - @Parameter(name = "id", description = "活动编号", required = true, example = "1024") - public CommonResult getCombinationActivityDetail(@RequestParam("id") Long id) { - // TODO 芋艿:如果禁用的时候,需要抛出异常; - AppCombinationActivityDetailRespVO obj = new AppCombinationActivityDetailRespVO(); - // 设置其属性的值 - obj.setId(id); - obj.setName("晚九点限时秒杀"); - obj.setStatus(1); - obj.setStartTime(LocalDateTime.of(2023, 6, 15, 0, 0, 0)); - obj.setEndTime(LocalDateTime.of(2023, 6, 20, 23, 59, 0)); - obj.setUserSize(2); - obj.setSuccessCount(100); - obj.setSpuId(633L); - obj.setSingleLimitCount(2); - obj.setTotalLimitCount(3); - - // 创建一个Product对象的列表 - List productList = new ArrayList<>(); - // 创建三个新的Product对象并设置其属性的值 - AppCombinationActivityDetailRespVO.Product product1 = new AppCombinationActivityDetailRespVO.Product(); - product1.setSkuId(1L); - product1.setCombinationPrice(100); - // 将第一个Product对象添加到列表中 - productList.add(product1); - // 创建第二个Product对象并设置其属性的值 - AppCombinationActivityDetailRespVO.Product product2 = new AppCombinationActivityDetailRespVO.Product(); - product2.setSkuId(2L); - product2.setCombinationPrice(200); - // 将第二个Product对象添加到列表中 - productList.add(product2); - // 创建第三个Product对象并设置其属性的值 - AppCombinationActivityDetailRespVO.Product product3 = new AppCombinationActivityDetailRespVO.Product(); - product3.setSkuId(3L); - product3.setCombinationPrice(300); - // 将第三个Product对象添加到列表中 - productList.add(product3); - // 将Product列表设置为对象的属性值 - obj.setProducts(productList); - return success(obj); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationRecordController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationRecordController.java deleted file mode 100644 index 2594b3cf..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/AppCombinationRecordController.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.win.module.promotion.controller.app.combination; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.module.promotion.controller.app.combination.vo.record.AppCombinationRecordDetailRespVO; -import com.win.module.promotion.controller.app.combination.vo.record.AppCombinationRecordRespVO; -import com.win.module.promotion.controller.app.combination.vo.record.AppCombinationRecordSummaryRespVO; -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.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.validation.constraints.Max; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 拼团活动") -@RestController -@RequestMapping("/promotion/combination-record") -@Validated -public class AppCombinationRecordController { - - @GetMapping("/get-summary") - @Operation(summary = "获得拼团记录的概要信息", description = "用于小程序首页") - // TODO 芋艿:增加 @Cache 缓存,1 分钟过期 - public CommonResult getCombinationRecordSummary() { - AppCombinationRecordSummaryRespVO summary = new AppCombinationRecordSummaryRespVO(); - summary.setUserCount(1024); - summary.setAvatars(new ArrayList<>()); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLjFK35Wvia9lJKHoXfQuHhk0qZbvpPNxrAiaEKF7aL2k4I8kuqrdTWwliamdPHeyAA7DjAg725X2GIQ/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTK1pXgdj5DvBMwrbe8v3tFibSWeQATEsAibt3fllD8XwJ460P2r6KS3WCQvDefuv1bVpDhNCle6CTCA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTL7KRGHBE62N0awFyBesmmxiaCicf1fJ7E7UCh6zA8GWlT1QC1zT01gG4OxI7BWDESkdPZ5o7tno4hA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/ouwtwJycbic2JrCoZjETict0klxd1uRuicRneKk00ewMcCClxVcVHQT91Sh9MJGtwibf1fOicD1WpwSP4icJM6eQq1AA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/RpUrhwens58qc99OcGs993xL4M5QPOe05ekqF9Eia440kRicAlicicIdQWicHBmy2bzLgHzHguWEzHHxnIgeictL7bLA/132"); - summary.getAvatars().add("https://thirdwx.qlogo.cn/mmopen/vi_32/S4tfqmxc8GZGsKc1K4mnhpvtG16gtMrLnTQfDibhr7jJich9LRI5RQKZDoqEjZM3azMib5nic7F4ZXKMEgYyLO08KA/132"); - summary.getAvatars().add("https://static.iocoder.cn/mall/132.jpeg"); - return success(summary); - } - - @GetMapping("/get-head-list") - @Operation(summary = "获得最近 n 条拼团记录(团长发起的)") - // TODO @芋艿:注解要补全 - public CommonResult> getHeadCombinationRecordList( - @RequestParam(value = "activityId", required = false) Long activityId, - @RequestParam("status") Integer status, - @RequestParam(value = "count", defaultValue = "20") @Max(20) Integer count) { - List list = new ArrayList<>(); - for (int i = 1; i <= count; i++) { - AppCombinationRecordRespVO record = new AppCombinationRecordRespVO(); - record.setId((long) i); - record.setNickname("用户" + i); - record.setAvatar("头像" + i); - record.setExpireTime(LocalDateTime.now()); - record.setUserSize(10); - record.setUserCount(i); - record.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - record.setActivityId(1L); - record.setSpuName("活动:" + i); - list.add(record); - } - return success(list); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得拼团记录明细") - @Parameter(name = "id", description = "拼团记录编号", required = true, example = "1024") - public CommonResult getCombinationRecordDetail(@RequestParam("id") Long id) { - AppCombinationRecordDetailRespVO detail = new AppCombinationRecordDetailRespVO(); - // 团长 - AppCombinationRecordRespVO headRecord = new AppCombinationRecordRespVO(); - headRecord.setId(1L); - headRecord.setNickname("用户" + 1); - headRecord.setAvatar("头像" + 1); - headRecord.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofDays(1))); - headRecord.setUserSize(10); - headRecord.setUserCount(3); - headRecord.setStatus(1); - headRecord.setActivityId(10L); - headRecord.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - headRecord.setCombinationPrice(100); - detail.setHeadRecord(headRecord); - // 团员 - List list = new ArrayList<>(); - for (int i = 1; i <= 2; i++) { - AppCombinationRecordRespVO record = new AppCombinationRecordRespVO(); - record.setId((long) i); - record.setNickname("用户" + i); - record.setAvatar("头像" + i); - record.setExpireTime(LocalDateTime.now()); - record.setUserSize(10); - record.setUserCount(i); - record.setStatus(1); - list.add(record); - } - detail.setMemberRecords(list); - // 订单编号 - detail.setOrderId(100L); - return success(detail); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityDetailRespVO.java deleted file mode 100644 index 3abab4ee..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityDetailRespVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.promotion.controller.app.combination.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "用户 App - 拼团活动明细 Response VO") -@Data -public class AppCombinationActivityDetailRespVO { - - @Schema(description = "拼团活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "拼团活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大拼团") - private String name; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "拼团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") - private Integer userSize; - - @Schema(description = "成功的拼团数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer successCount; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - - @Schema(description = "总共限购数量", example = "10") - private Integer totalLimitCount; - - @Schema(description = "单次限购数量", example = "5") - private Integer singleLimitCount; - - @Schema(description = "商品信息数组", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - - @Schema(description = "商品信息") - @Data - public static class Product { - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") - private Long skuId; - - @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer combinationPrice; - - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityRespVO.java deleted file mode 100644 index 1a954383..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.promotion.controller.app.combination.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 拼团活动 Response VO") -@Data -public class AppCombinationActivityRespVO { - - @Schema(description = "拼团活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "拼团活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大拼团") - private String name; - - @Schema(description = "拼团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") - private Integer userSize; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") - // 从 SPU 的 picUrl 读取 - private String picUrl; - - @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - // 从 SPU 的 marketPrice 读取 - private Integer marketPrice; - - @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - // 从拼团商品里取最低价 - private Integer combinationPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java deleted file mode 100644 index 5ce999f4..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.promotion.controller.app.combination.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 拼团记录详细 Response VO") -@Data -public class AppCombinationRecordDetailRespVO { - - @Schema(description = "团长的拼团记录", requiredMode = Schema.RequiredMode.REQUIRED) - private AppCombinationRecordRespVO headRecord; - - @Schema(description = "成员的拼团记录", requiredMode = Schema.RequiredMode.REQUIRED) - private List memberRecords; - - @Schema(description = "当前用户参团记录对应的订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - // 如果没参团,返回 null - private Long orderId; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordRespVO.java deleted file mode 100644 index 3d4ab8fa..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordRespVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.promotion.controller.app.combination.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 拼团记录 Response VO") -@Data -public class AppCombinationRecordRespVO { - - @Schema(description = "拼团记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "拼团活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long activityId; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String nickname; - - @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String avatar; - - @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime expireTime; - - @Schema(description = "可参团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer userSize; - - @Schema(description = "已参团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - private Integer userCount; - - @Schema(description = "拼团状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "商品名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是大黄豆") - private String spuName; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String picUrl; - - @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer combinationPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java deleted file mode 100644 index cccbe81d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.promotion.controller.app.combination.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 拼团记录的简要概括 Response VO") -@Data -public class AppCombinationRecordSummaryRespVO { - - @Schema(description = "拼团用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer userCount; - - @Schema(description = "拼团用户头像列表", requiredMode = Schema.RequiredMode.REQUIRED) // 只返回最近的 7 个 - private List avatars; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponController.java deleted file mode 100644 index 5fde25eb..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponController.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.win.module.promotion.controller.app.coupon; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchReqVO; -import com.win.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchRespVO; -import com.win.module.promotion.controller.app.coupon.vo.coupon.AppCouponPageReqVO; -import com.win.module.promotion.controller.app.coupon.vo.coupon.AppCouponRespVO; -import com.win.module.promotion.controller.app.coupon.vo.template.AppCouponTemplatePageReqVO; -import com.win.module.promotion.service.coupon.CouponService; -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.*; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 优惠劵") -@RestController -@RequestMapping("/promotion/coupon") -@Validated -public class AppCouponController { - - @Resource - private CouponService couponService; - - // TODO 芋艿:待实现 - @PostMapping("/take") - @Operation(summary = "领取优惠劵") - public CommonResult takeCoupon(@RequestBody AppCouponTemplatePageReqVO pageReqVO) { - return success(1L); - } - - // TODO 芋艿:待实现 - @GetMapping("/match-list") - @Operation(summary = "获得匹配指定商品的优惠劵列表") - public CommonResult> getMatchCouponList(AppCouponMatchReqVO matchReqVO) { - List list = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppCouponMatchRespVO vo = new AppCouponMatchRespVO(); - vo.setId(i + 1L); - vo.setName("优惠劵" + (i + 1)); - vo.setUsePrice(random.nextInt(100) * 100); - vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10))); - vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10)); - vo.setDiscountType(random.nextInt(2) + 1); - if (vo.getDiscountType() == 1) { - vo.setDiscountPercent(null); - vo.setDiscountPrice(random.nextInt(50) * 100); - vo.setDiscountLimitPrice(null); - } else { - vo.setDiscountPercent(random.nextInt(90) + 10); - vo.setDiscountPrice(null); - vo.setDiscountLimitPrice(random.nextInt(200) * 100); - } - vo.setMatch(random.nextBoolean()); - if (!vo.getMatch()) { - vo.setDescription("不符合条件噢"); - } - list.add(vo); - } - return success(list); - } - - // TODO 芋艿:待实现 - @GetMapping("/page") - @Operation(summary = "优惠劵列表", description = "我的优惠劵") - public CommonResult> takeCoupon(AppCouponPageReqVO pageReqVO) { - List list = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppCouponRespVO vo = new AppCouponRespVO(); - vo.setId(i + 1L); - vo.setName("优惠劵" + (i + 1)); - vo.setStatus(pageReqVO.getStatus()); - vo.setUsePrice(random.nextInt(100) * 100); - vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10))); - vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10)); - vo.setDiscountType(random.nextInt(2) + 1); - if (vo.getDiscountType() == 1) { - vo.setDiscountPercent(null); - vo.setDiscountPrice(random.nextInt(50) * 100); - vo.setDiscountLimitPrice(null); - } else { - vo.setDiscountPercent(random.nextInt(90) + 10); - vo.setDiscountPrice(null); - vo.setDiscountLimitPrice(random.nextInt(200) * 100); - } - list.add(vo); - } - return success(new PageResult<>(list, 20L)); - } - - @GetMapping(value = "/get-unused-count") - @Operation(summary = "获得未使用的优惠劵数量") - @PreAuthenticated - public CommonResult getUnusedCouponCount() { - return success(couponService.getUnusedCouponCount(getLoginUserId())); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponTemplateController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponTemplateController.java deleted file mode 100644 index a0002bf9..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/AppCouponTemplateController.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.win.module.promotion.controller.app.coupon; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.app.coupon.vo.template.AppCouponTemplatePageReqVO; -import com.win.module.promotion.controller.app.coupon.vo.template.AppCouponTemplateRespVO; -import com.win.module.promotion.service.coupon.CouponTemplateService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.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; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 优惠劵模板") -@RestController -@RequestMapping("/promotion/coupon-template") -@Validated -public class AppCouponTemplateController { - - @Resource - private CouponTemplateService couponTemplateService; - - // TODO 芋艿:待实现 - @GetMapping("/list") - @Operation(summary = "获得优惠劵模版列表") - @Parameters({ - @Parameter(name = "spuId", description = "商品 SPU 编号"), // 目前主要给商品详情使用 - @Parameter(name = "useType", description = "使用类型"), - @Parameter(name = "count", description = "数量", required = true) - }) - public CommonResult> getCouponTemplateList(@RequestParam(value = "spuId", required = false) Long spuId, - @RequestParam(value = "useType", required = false) Integer useType, - @RequestParam(value = "count", required = false, defaultValue = "10") Integer count) { - List list = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppCouponTemplateRespVO vo = new AppCouponTemplateRespVO(); - vo.setId(i + 1L); - vo.setName("优惠劵" + (i + 1)); - vo.setTakeLimitCount(random.nextInt(10) + 1); - vo.setUsePrice(random.nextInt(100) * 100); - vo.setValidityType(random.nextInt(2) + 1); - if (vo.getValidityType() == 1) { - vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10))); - vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10)); - } else { - vo.setFixedStartTerm(random.nextInt(10)); - vo.setFixedEndTerm(random.nextInt(10) + vo.getFixedStartTerm() + 1); - } - vo.setDiscountType(random.nextInt(2) + 1); - if (vo.getDiscountType() == 1) { - vo.setDiscountPercent(null); - vo.setDiscountPrice(random.nextInt(50) * 100); - vo.setDiscountLimitPrice(null); - } else { - vo.setDiscountPercent(random.nextInt(90) + 10); - vo.setDiscountPrice(null); - vo.setDiscountLimitPrice(random.nextInt(200) * 100); - } - vo.setTakeStatus(random.nextBoolean()); - list.add(vo); - } - return success(list); - } - - // TODO 芋艿:待实现;和 getCouponTemplateList 类似 - @GetMapping("/page") - @Operation(summary = "获得优惠劵模版分页") - public CommonResult> getCouponTemplatePage(AppCouponTemplatePageReqVO pageReqVO) { - List list = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppCouponTemplateRespVO vo = new AppCouponTemplateRespVO(); - vo.setId(i + 1L); - vo.setName("优惠劵" + (i + 1)); - vo.setTakeLimitCount(random.nextInt(10) + 1); - vo.setUsePrice(random.nextInt(100) * 100); - vo.setValidityType(random.nextInt(2) + 1); - if (vo.getValidityType() == 1) { - vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10))); - vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10)); - } else { - vo.setFixedStartTerm(random.nextInt(10)); - vo.setFixedEndTerm(random.nextInt(10) + vo.getFixedStartTerm() + 1); - } - vo.setDiscountType(random.nextInt(2) + 1); - if (vo.getDiscountType() == 1) { - vo.setDiscountPercent(null); - vo.setDiscountPrice(random.nextInt(50) * 100); - vo.setDiscountLimitPrice(null); - } else { - vo.setDiscountPercent(random.nextInt(90) + 10); - vo.setDiscountPrice(null); - vo.setDiscountLimitPrice(random.nextInt(200) * 100); - } - vo.setTakeStatus(random.nextBoolean()); - list.add(vo); - } - return success(new PageResult<>(list, 20L)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchReqVO.java deleted file mode 100644 index e618c501..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "用户 App - 优惠劵的匹配 Request VO") -@Data -public class AppCouponMatchReqVO { - - @Schema(description = "商品金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "商品金额不能为空") - private Integer price; - - @Schema(description = "商品 SPU 编号的数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2]") - @NotEmpty(message = "商品 SPU 编号不能为空") - private List spuIds; - - @Schema(description = "商品 SKU 编号的数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2]") - @NotEmpty(message = "商品 SKU 编号不能为空") - private List skuIds; - - @Schema(description = "分类编号的数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[10, 20]") - @NotEmpty(message = "分类编号不能为空") - private List categoryIds; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchRespVO.java deleted file mode 100644 index 8352861a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponMatchRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 优惠劵 Response VO") -@Data -public class AppCouponMatchRespVO extends AppCouponRespVO { - - @Schema(description = "是否匹配", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean match; - - @Schema(description = "匹配条件的提示", example = "所结算商品没有符合条件的商品") - private String description; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponPageReqVO.java deleted file mode 100644 index bff0e1e8..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponPageReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.coupon; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "用户 App - 优惠劵分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppCouponPageReqVO extends PageParam { - - @Schema(description = "优惠劵状态", example = "1") - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponRespVO.java deleted file mode 100644 index 2e1e3065..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponRespVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.Min; -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 优惠劵 Response VO") -@Data -public class AppCouponRespVO { - - @Schema(description = "优惠劵编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送") - private String name; - - @Schema(description = "优惠劵状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") // 参见 CouponStatusEnum 枚举 - private Integer status; - - @Schema(description = "是否设置满多少金额可用", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - // 单位:分;0 - 不限制 - private Integer usePrice; - - @Schema(description = "固定日期 - 生效开始时间") - private LocalDateTime validStartTime; - - @Schema(description = "固定日期 - 生效结束时间") - private LocalDateTime validEndTime; - - @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer discountType; - - @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 - private Integer discountPercent; - - @Schema(description = "优惠金额", example = "10") - @Min(value = 0, message = "优惠金额需要大于等于 0") - private Integer discountPrice; - - @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 - private Integer discountLimitPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponTakeReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponTakeReqVO.java deleted file mode 100644 index f1606ac1..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/coupon/AppCouponTakeReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 优惠劵领取 Request VO") -@Data -public class AppCouponTakeReqVO { - - @Schema(description = "优惠劵模板编号", example = "1") - @NotNull(message = "优惠劵模板编号不能为空") - private Long templateId; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplatePageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplatePageReqVO.java deleted file mode 100644 index 62969821..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplatePageReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.template; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "用户 App - 优惠劵模板分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppCouponTemplatePageReqVO extends PageParam { - - @Schema(description = "使用类型", example = "1") - // TODO 芋艿:这里要限制下枚举的使用 - private Integer useType; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java deleted file mode 100644 index 442c4eb4..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.win.module.promotion.controller.app.coupon.vo.template; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.Min; -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 优惠劵模板 Response VO") -@Data -public class AppCouponTemplateRespVO { - - @Schema(description = "优惠劵模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送") - private String name; - - @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制 - private Integer takeLimitCount; - - @Schema(description = "是否设置满多少金额可用", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - // 单位:分;0 - 不限制 - private Integer usePrice; - - // TODO 芋艿:这两要改的 -// @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") -// @InEnum(PromotionProductScopeEnum.class) -// private Integer productScope; -// -// @Schema(description = "商品范围编号的数组", example = "1,3") -// private List productScopeValues; - - @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer validityType; - - @Schema(description = "固定日期 - 生效开始时间") - private LocalDateTime validStartTime; - - @Schema(description = "固定日期 - 生效结束时间") - private LocalDateTime validEndTime; - - @Schema(description = "领取日期 - 开始天数") - @Min(value = 0L, message = "开始天数必须大于 0") - private Integer fixedStartTerm; - - @Schema(description = "领取日期 - 结束天数") - @Min(value = 1L, message = "开始天数必须大于 1") - private Integer fixedEndTerm; - - @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer discountType; - - @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 - private Integer discountPercent; - - @Schema(description = "优惠金额", example = "10") - @Min(value = 0, message = "优惠金额需要大于等于 0") - private Integer discountPrice; - - @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 - private Integer discountLimitPrice; - - // ========== 用户相关字段 ========== - - @Schema(description = "是否已领取", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean takeStatus; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/AppDecorateController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/AppDecorateController.java deleted file mode 100644 index 7269d72b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/AppDecorateController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.promotion.controller.app.decorate; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.validation.InEnum; -import com.win.module.promotion.controller.app.decorate.vo.AppDecorateComponentRespVO; -import com.win.module.promotion.convert.decorate.DecorateComponentConvert; -import com.win.module.promotion.enums.decorate.DecoratePageEnum; -import com.win.module.promotion.service.decorate.DecorateComponentService; -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.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; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 APP - 店铺装修") -@RestController -@RequestMapping("/promotion/decorate") -@Validated -public class AppDecorateController { - - @Resource - private DecorateComponentService decorateComponentService; - - @GetMapping("/list") - @Operation(summary = "获取指定页面的组件列表") - @Parameter(name = "page", description = "页面编号", required = true) - public CommonResult> getDecorateComponentListByPage( - @RequestParam("page") @InEnum(DecoratePageEnum.class) Integer page) { - return success(DecorateComponentConvert.INSTANCE.convertList( - decorateComponentService.getDecorateComponentListByPage(page, CommonStatusEnum.ENABLE.getStatus()))); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/vo/AppDecorateComponentRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/vo/AppDecorateComponentRespVO.java deleted file mode 100644 index 3b09d1f9..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/decorate/vo/AppDecorateComponentRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.promotion.controller.app.decorate.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 页面组件 Resp VO") -@Data -public class AppDecorateComponentRespVO { - - @Schema(description = "组件编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "nav-menu") - private String code; - - @Schema(description = "组件的内容配置项", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "TODO") - private String value; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillActivityController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillActivityController.java deleted file mode 100644 index e2d60934..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillActivityController.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.win.module.promotion.controller.app.seckill; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityDetailRespVO; -import com.win.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityNowRespVO; -import com.win.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO; -import com.win.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityRespVO; -import com.win.module.promotion.controller.app.seckill.vo.config.AppSeckillConfigRespVO; -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.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 java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 秒杀活动") -@RestController -@RequestMapping("/promotion/seckill-activity") -@Validated -public class AppSeckillActivityController { - - @GetMapping("/get-now") - @Operation(summary = "获得当前秒杀活动") // 提供给首页使用 - // TODO 芋艿:需要增加 spring cache - public CommonResult getNowSeckillActivity() { - AppSeckillActivityNowRespVO respVO = new AppSeckillActivityNowRespVO(); - respVO.setConfig(new AppSeckillConfigRespVO().setId(10L).setStartTime("01:00").setEndTime("09:59")); - List activityList = new ArrayList<>(); - AppSeckillActivityRespVO activity1 = new AppSeckillActivityRespVO(); - activity1.setId(1L); - activity1.setName("618 大秒杀"); - activity1.setSpuId(2048L); - activity1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - activity1.setMarketPrice(50); - activity1.setSeckillPrice(100); - activityList.add(activity1); - - AppSeckillActivityRespVO activity2 = new AppSeckillActivityRespVO(); - activity2.setId(2L); - activity2.setName("双十一大秒杀"); - activity2.setSpuId(4096L); - activity2.setPicUrl("https://static.iocoder.cn/mall/132.jpeg"); - activity2.setMarketPrice(100); - activity2.setSeckillPrice(200); - activityList.add(activity2); - respVO.setActivities(activityList); - return success(respVO); - } - - @GetMapping("/page") - @Operation(summary = "获得秒杀活动分页") - // TODO @芋艿:分页参数 - public CommonResult> getSeckillActivityPage(AppSeckillActivityPageReqVO pageReqVO) { - List activityList = new ArrayList<>(); - AppSeckillActivityRespVO activity1 = new AppSeckillActivityRespVO(); - activity1.setId(1L); - activity1.setName("618 大秒杀"); - activity1.setSpuId(2048L); - activity1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg"); - activity1.setMarketPrice(50); - activity1.setSeckillPrice(100); - activity1.setUnitName("个"); - activity1.setStock(1); - activity1.setTotalStock(2); - activityList.add(activity1); - - AppSeckillActivityRespVO activity2 = new AppSeckillActivityRespVO(); - activity2.setId(2L); - activity2.setName("双十一大秒杀"); - activity2.setSpuId(4096L); - activity2.setPicUrl("https://static.iocoder.cn/mall/132.jpeg"); - activity2.setMarketPrice(100); - activity2.setSeckillPrice(200); - activity2.setUnitName("套"); - activity2.setStock(2); - activity2.setTotalStock(3); - activityList.add(activity2); - return success(new PageResult<>(activityList, 100L)); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得秒杀活动明细") - @Parameter(name = "id", description = "活动编号", required = true, example = "1024") - public CommonResult getSeckillActivity(@RequestParam("id") Long id) { - // TODO 芋艿:如果禁用的时候,需要抛出异常; - AppSeckillActivityDetailRespVO obj = new AppSeckillActivityDetailRespVO(); - // 设置其属性的值 - obj.setId(id); - obj.setName("晚九点限时秒杀"); - obj.setStatus(1); - obj.setStartTime(LocalDateTime.of(2023, 6, 16, 0, 0, 0)); - obj.setEndTime(LocalDateTime.of(2023, 6, 20, 23, 59, 0)); - obj.setSpuId(633L); - obj.setSingleLimitCount(2); - obj.setTotalLimitCount(3); - obj.setStock(100); - obj.setTotalStock(200); - - // 创建一个Product对象的列表 - List productList = new ArrayList<>(); - // 创建三个新的Product对象并设置其属性的值 - AppSeckillActivityDetailRespVO.Product product1 = new AppSeckillActivityDetailRespVO.Product(); - product1.setSkuId(1L); - product1.setSeckillPrice(100); - product1.setStock(50); - // 将第一个Product对象添加到列表中 - productList.add(product1); - // 创建第二个Product对象并设置其属性的值 - AppSeckillActivityDetailRespVO.Product product2 = new AppSeckillActivityDetailRespVO.Product(); - product2.setSkuId(2L); - product2.setSeckillPrice(200); - product2.setStock(100); - // 将第二个Product对象添加到列表中 - productList.add(product2); - // 创建第三个Product对象并设置其属性的值 - AppSeckillActivityDetailRespVO.Product product3 = new AppSeckillActivityDetailRespVO.Product(); - product3.setSkuId(3L); - product3.setSeckillPrice(300); - product3.setStock(150); - // 将第三个Product对象添加到列表中 - productList.add(product3); - // 将Product列表设置为对象的属性值 - obj.setProducts(productList); - return success(obj); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillConfigController.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillConfigController.java deleted file mode 100644 index 7494cf61..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/AppSeckillConfigController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.promotion.controller.app.seckill; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.promotion.controller.app.seckill.vo.config.AppSeckillConfigRespVO; -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 java.util.Arrays; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 秒杀时间段") -@RestController -@RequestMapping("/promotion/seckill-config") -@Validated -public class AppSeckillConfigController { - - @GetMapping("/list") - @Operation(summary = "获得秒杀时间段列表") - public CommonResult> getSeckillConfigList() { - return success(Arrays.asList( - new AppSeckillConfigRespVO().setId(1L).setStartTime("00:00").setEndTime("09:59") - .setSliderPicUrls(Arrays.asList("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg", - "https://static.iocoder.cn/mall/132.jpeg")), - new AppSeckillConfigRespVO().setId(2L).setStartTime("10:00").setEndTime("12:59"), - new AppSeckillConfigRespVO().setId(2L).setStartTime("13:00").setEndTime("22:59"), - new AppSeckillConfigRespVO().setId(2L).setStartTime("23:00").setEndTime("23:59") - )); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityDetailRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityDetailRespVO.java deleted file mode 100644 index 915b94fb..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityDetailRespVO.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.promotion.controller.app.seckill.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "用户 App - 秒杀活动的详细 Response VO") -@Data -public class AppSeckillActivityDetailRespVO { - - @Schema(description = "秒杀活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晚九点限时秒杀") - private String name; - - @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - // TODO @芋艿:开始时间、结束时间,要和场次结合起来;就是要算到当前场次,是几点哈; - - @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime startTime; - - @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime endTime; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - - @Schema(description = "总共限购数量", example = "10") - private Integer totalLimitCount; - - @Schema(description = "单次限购数量", example = "5") - private Integer singleLimitCount; - - @Schema(description = "秒杀库存(剩余)", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - private Integer stock; - - @Schema(description = "秒杀库存(总计)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer totalStock; - - @Schema(description = "商品信息数组", requiredMode = Schema.RequiredMode.REQUIRED) - private List products; - - @Schema(description = "商品信息") - @Data - public static class Product { - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") - private Long skuId; - - @Schema(description = "秒杀金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer seckillPrice; - - @Schema(description = "秒杀限量库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - private Integer stock; - - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityNowRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityNowRespVO.java deleted file mode 100644 index e56f27b7..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityNowRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.promotion.controller.app.seckill.vo.activity; - -import com.win.module.promotion.controller.app.seckill.vo.config.AppSeckillConfigRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 当前秒杀活动 Response VO") -@Data -public class AppSeckillActivityNowRespVO { - - @Schema(description = "秒杀时间段", requiredMode = Schema.RequiredMode.REQUIRED) - private AppSeckillConfigRespVO config; - - @Schema(description = "秒杀活动数组", requiredMode = Schema.RequiredMode.REQUIRED) - private List activities; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityPageReqVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityPageReqVO.java deleted file mode 100644 index fd9d5e01..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityPageReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.promotion.controller.app.seckill.vo.activity; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "用户 App - 商品评价分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppSeckillActivityPageReqVO extends PageParam { - - @Schema(description = "秒杀配置编号", example = "1024") - private Long configId; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityRespVO.java deleted file mode 100644 index 1ac3e521..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityRespVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.promotion.controller.app.seckill.vo.activity; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 秒杀活动 Response VO") -@Data -public class AppSeckillActivityRespVO { - - @Schema(description = "秒杀活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晚九点限时秒杀") - private String name; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") - // 从 SPU 的 picUrl 读取 - private String picUrl; - @Schema(description = "单位名", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") - private String unitName; - @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - // 从 SPU 的 marketPrice 读取 - private Integer marketPrice; - - @Schema(description = "秒杀库存(剩余)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer stock; - @Schema(description = "秒杀库存(总共)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer totalStock; - - @Schema(description = "秒杀金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - // 从秒杀商品里取最低价 - private Integer seckillPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/config/AppSeckillConfigRespVO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/config/AppSeckillConfigRespVO.java deleted file mode 100644 index bdefc2b1..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/controller/app/seckill/vo/config/AppSeckillConfigRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.controller.app.seckill.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 秒杀时间段 Response VO") -@Data -public class AppSeckillConfigRespVO { - - @Schema(description = "秒杀时间段编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:00") - private String startTime; - @Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:59") - private String endTime; - - @Schema(description = "轮播图", requiredMode = Schema.RequiredMode.REQUIRED) - private List sliderPicUrls; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/banner/BannerConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/banner/BannerConvert.java deleted file mode 100644 index 4d2bb59d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/banner/BannerConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.promotion.convert.banner; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.banner.vo.BannerCreateReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerRespVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerUpdateReqVO; -import com.win.module.promotion.dal.dataobject.banner.BannerDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface BannerConvert { - - BannerConvert INSTANCE = Mappers.getMapper(BannerConvert.class); - - List convertList(List list); - - PageResult convertPage(PageResult pageResult); - - BannerRespVO convert(BannerDO banner); - - BannerDO convert(BannerCreateReqVO createReqVO); - - BannerDO convert(BannerUpdateReqVO updateReqVO); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/bargain/BargainActivityConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/bargain/BargainActivityConvert.java deleted file mode 100644 index 68bc39c7..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/bargain/BargainActivityConvert.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.promotion.convert.bargain; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.bargain.BargainActivityDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 拼团活动 Convert - * - * @author HUIHUI - */ -@Mapper -public interface BargainActivityConvert { - - BargainActivityConvert INSTANCE = Mappers.getMapper(BargainActivityConvert.class); - - BargainActivityDO convert(BargainActivityBaseVO bean); - - BargainActivityDO convert(BargainActivityUpdateReqVO bean); - - BargainActivityRespVO convert(BargainActivityDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/combination/CombinationActivityConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/combination/CombinationActivityConvert.java deleted file mode 100644 index 2dc992b2..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/combination/CombinationActivityConvert.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.win.module.promotion.convert.combination; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; -import com.win.module.promotion.api.combination.dto.CombinationRecordRespDTO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityRespVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductBaseVO; -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductRespVO; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import com.win.module.promotion.dal.dataobject.combination.CombinationProductDO; -import com.win.module.promotion.dal.dataobject.combination.CombinationRecordDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 拼团活动 Convert - * - * @author HUIHUI - */ -@Mapper -public interface CombinationActivityConvert { - - CombinationActivityConvert INSTANCE = Mappers.getMapper(CombinationActivityConvert.class); - - CombinationActivityDO convert(CombinationActivityCreateReqVO bean); - - CombinationActivityDO convert(CombinationActivityUpdateReqVO bean); - - CombinationActivityRespVO convert(CombinationActivityDO bean); - - CombinationProductRespVO convert(CombinationProductDO bean); - - default CombinationActivityRespVO convert(CombinationActivityDO activity, List products) { - return convert(activity).setProducts(convertList2(products)); - } - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default PageResult convertPage(PageResult page, - List productList, - List spuList) { - Map spuMap = convertMap(spuList, ProductSpuRespDTO::getId); - PageResult pageResult = convertPage(page); - pageResult.getList().forEach(item -> { - MapUtils.findAndThen(spuMap, item.getSpuId(), spu -> { - item.setSpuName(spu.getName()); - item.setPicUrl(spu.getPicUrl()); - }); - item.setProducts(convertList2(productList)); - }); - return pageResult; - } - - List convertList2(List productDOs); - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(target = "activityId", source = "activity.id"), - @Mapping(target = "spuId", source = "activity.spuId"), - @Mapping(target = "skuId", source = "product.skuId"), - @Mapping(target = "combinationPrice", source = "product.combinationPrice"), - @Mapping(target = "activityStartTime", source = "activity.startTime"), - @Mapping(target = "activityEndTime", source = "activity.endTime") - }) - CombinationProductDO convert(CombinationActivityDO activity, CombinationProductBaseVO product); - - default List convertList(List products, CombinationActivityDO activity) { - return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus())); - } - - default List convertList(List updateProductVOs, - List products, CombinationActivityDO activity) { - Map productMap = convertMap(products, CombinationProductDO::getSkuId, CombinationProductDO::getId); - return CollectionUtils.convertList(updateProductVOs, updateProductVO -> convert(activity, updateProductVO) - .setId(productMap.get(updateProductVO.getSkuId())) - .setActivityStatus(activity.getStatus())); - } - - CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO); - - List convert(List bean); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponConvert.java deleted file mode 100644 index eb8618fc..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponConvert.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.promotion.convert.coupon; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.api.coupon.dto.CouponRespDTO; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponPageItemRespVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import com.win.module.promotion.enums.coupon.CouponStatusEnum; -import com.win.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.time.LocalDateTime; - -/** - * 优惠劵 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface CouponConvert { - - CouponConvert INSTANCE = Mappers.getMapper(CouponConvert.class); - - PageResult convertPage(PageResult page); - - CouponRespDTO convert(CouponDO bean); - - default CouponDO convert(CouponTemplateDO template, Long userId) { - CouponDO couponDO = new CouponDO() - .setTemplateId(template.getId()) - .setName(template.getName()) - .setTakeType(template.getTakeType()) - .setUsePrice(template.getUsePrice()) - .setProductScope(template.getProductScope()) - .setProductScopeValues(template.getProductScopeValues()) - .setDiscountType(template.getDiscountType()) - .setDiscountPercent(template.getDiscountPercent()) - .setDiscountPrice(template.getDiscountPrice()) - .setDiscountLimitPrice(template.getDiscountLimitPrice()) - .setStatus(CouponStatusEnum.UNUSED.getStatus()) - .setUserId(userId); - if (CouponTemplateValidityTypeEnum.DATE.getType().equals(template.getValidityType())) { - couponDO.setValidStartTime(template.getValidStartTime()); - couponDO.setValidEndTime(template.getValidEndTime()); - } else if (CouponTemplateValidityTypeEnum.TERM.getType().equals(template.getValidityType())) { - couponDO.setValidStartTime(LocalDateTime.now().plusDays(template.getFixedStartTerm())); - couponDO.setValidEndTime(LocalDateTime.now().plusDays(template.getFixedEndTerm())); - } - return couponDO; - } -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponTemplateConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponTemplateConvert.java deleted file mode 100644 index ee00978e..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/coupon/CouponTemplateConvert.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.promotion.convert.coupon; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateCreateReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateRespVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 优惠劵模板 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface CouponTemplateConvert { - - CouponTemplateConvert INSTANCE = Mappers.getMapper(CouponTemplateConvert.class); - - CouponTemplateDO convert(CouponTemplateCreateReqVO bean); - - CouponTemplateDO convert(CouponTemplateUpdateReqVO bean); - - CouponTemplateRespVO convert(CouponTemplateDO bean); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/decorate/DecorateComponentConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/decorate/DecorateComponentConvert.java deleted file mode 100644 index d0ee21bd..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/decorate/DecorateComponentConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.convert.decorate; - -import com.win.module.promotion.controller.admin.decorate.vo.DecorateComponentRespVO; -import com.win.module.promotion.controller.admin.decorate.vo.DecorateComponentSaveReqVO; -import com.win.module.promotion.controller.app.decorate.vo.AppDecorateComponentRespVO; -import com.win.module.promotion.dal.dataobject.decorate.DecorateComponentDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface DecorateComponentConvert { - - DecorateComponentConvert INSTANCE = Mappers.getMapper(DecorateComponentConvert.class); - - List convertList02(List list); - - DecorateComponentDO convert(DecorateComponentSaveReqVO bean); - - List convertList(List list); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/discount/DiscountActivityConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/discount/DiscountActivityConvert.java deleted file mode 100644 index 8a392454..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/discount/DiscountActivityConvert.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.win.module.promotion.convert.discount; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.api.discount.dto.DiscountProductRespDTO; -import com.win.module.promotion.controller.admin.discount.vo.*; -import com.win.module.promotion.dal.dataobject.discount.DiscountActivityDO; -import com.win.module.promotion.dal.dataobject.discount.DiscountProductDO; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 限时折扣活动 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface DiscountActivityConvert { - - DiscountActivityConvert INSTANCE = Mappers.getMapper(DiscountActivityConvert.class); - - DiscountActivityDO convert(DiscountActivityCreateReqVO bean); - - DiscountActivityDO convert(DiscountActivityUpdateReqVO bean); - - DiscountActivityRespVO convert(DiscountActivityDO bean); - - List convertList(List list); - - List convertList02(List list); - - PageResult convertPage(PageResult page); - - DiscountProductDO convert(DiscountActivityBaseVO.Product bean); - - DiscountActivityDetailRespVO convert(DiscountActivityDO activity, List products); - - // =========== 比较是否相等 ========== - /** - * 比较两个限时折扣商品是否相等 - * - * @param productDO 数据库中的商品 - * @param productVO 前端传入的商品 - * @return 是否匹配 - */ - @SuppressWarnings("DuplicatedCode") - default boolean isEquals(DiscountProductDO productDO, DiscountActivityBaseVO.Product productVO) { - if (ObjectUtil.notEqual(productDO.getSpuId(), productVO.getSpuId()) - || ObjectUtil.notEqual(productDO.getSkuId(), productVO.getSkuId()) - || ObjectUtil.notEqual(productDO.getDiscountType(), productVO.getDiscountType())) { - return false; - } - if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PRICE.getType())) { - return ObjectUtil.equal(productDO.getDiscountPrice(), productVO.getDiscountPrice()); - } - if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PERCENT.getType())) { - return ObjectUtil.equal(productDO.getDiscountPercent(), productVO.getDiscountPercent()); - } - return true; - } - - /** - * 比较两个限时折扣商品是否相等 - * 注意,比较时忽略 id 编号 - * - * @param productDO 商品 1 - * @param productVO 商品 2 - * @return 是否匹配 - */ - @SuppressWarnings("DuplicatedCode") - default boolean isEquals(DiscountProductDO productDO, DiscountProductDO productVO) { - if (ObjectUtil.notEqual(productDO.getSpuId(), productVO.getSpuId()) - || ObjectUtil.notEqual(productDO.getSkuId(), productVO.getSkuId()) - || ObjectUtil.notEqual(productDO.getDiscountType(), productVO.getDiscountType())) { - return false; - } - if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PRICE.getType())) { - return ObjectUtil.equal(productDO.getDiscountPrice(), productVO.getDiscountPrice()); - } - if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PERCENT.getType())) { - return ObjectUtil.equal(productDO.getDiscountPercent(), productVO.getDiscountPercent()); - } - return true; - } - - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/price/PriceConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/price/PriceConvert.java deleted file mode 100644 index 2243897c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/price/PriceConvert.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.promotion.convert.price; - -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.promotion.api.price.dto.CouponMeetRespDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateReqDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateRespDTO; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -@Mapper -public interface PriceConvert { - - PriceConvert INSTANCE = Mappers.getMapper(PriceConvert.class); - - default PriceCalculateRespDTO convert(PriceCalculateReqDTO calculateReqDTO, List skuList) { - // 创建 PriceCalculateRespDTO 对象 - PriceCalculateRespDTO priceCalculate = new PriceCalculateRespDTO(); - // 创建它的 Order 属性 - PriceCalculateRespDTO.Order order = new PriceCalculateRespDTO.Order().setTotalPrice(0).setDiscountPrice(0) - .setCouponPrice(0).setPointPrice(0).setDeliveryPrice(0).setPayPrice(0) - .setItems(new ArrayList<>()).setCouponId(calculateReqDTO.getCouponId()); - priceCalculate.setOrder(order).setPromotions(new ArrayList<>()); - // 创建它的 OrderItem 属性 - Map skuIdCountMap = CollectionUtils.convertMap(calculateReqDTO.getItems(), - PriceCalculateReqDTO.Item::getSkuId, PriceCalculateReqDTO.Item::getCount); - skuList.forEach(sku -> { - Integer count = skuIdCountMap.get(sku.getId()); - PriceCalculateRespDTO.OrderItem orderItem = new PriceCalculateRespDTO.OrderItem() - .setSpuId(sku.getSpuId()).setSkuId(sku.getId()).setCount(count) - .setOriginalUnitPrice(sku.getPrice()).setOriginalPrice(sku.getPrice() * count) - .setDiscountPrice(0).setOrderPartPrice(0); - orderItem.setPayPrice(orderItem.getOriginalPrice()).setOrderDividePrice(orderItem.getOriginalPrice()); - priceCalculate.getOrder().getItems().add(orderItem); - // 补充价格信息到 Order 中 - order.setTotalPrice(order.getTotalPrice() + orderItem.getOriginalPrice()) - .setPayPrice(order.getTotalPrice()); - }); - return priceCalculate; - } - - CouponMeetRespDTO convert(CouponDO coupon); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/reward/RewardActivityConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/reward/RewardActivityConvert.java deleted file mode 100644 index 0a1181b2..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/reward/RewardActivityConvert.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.promotion.convert.reward; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityRespVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.reward.RewardActivityDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 满减送活动 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface RewardActivityConvert { - - RewardActivityConvert INSTANCE = Mappers.getMapper(RewardActivityConvert.class); - - RewardActivityDO convert(RewardActivityCreateReqVO bean); - - RewardActivityDO convert(RewardActivityUpdateReqVO bean); - - RewardActivityRespVO convert(RewardActivityDO bean); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java deleted file mode 100644 index cc1fedbc..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.promotion.convert.seckill.seckillactivity; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityDetailRespVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityRespVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO; -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductRespVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * 秒杀活动 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SeckillActivityConvert { - - SeckillActivityConvert INSTANCE = Mappers.getMapper(SeckillActivityConvert.class); - - SeckillActivityDO convert(SeckillActivityCreateReqVO bean); - - SeckillActivityDO convert(SeckillActivityUpdateReqVO bean); - - SeckillActivityRespVO convert(SeckillActivityDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default PageResult convertPage(PageResult page, - List seckillProducts, - List spuList) { - PageResult pageResult = convertPage(page); - // 拼接商品 - Map spuMap = CollectionUtils.convertMap(spuList, ProductSpuRespDTO::getId); - pageResult.getList().forEach(item -> { - item.setProducts(convertList2(seckillProducts)); - MapUtils.findAndThen(spuMap, item.getSpuId(), - spu -> item.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl())); - }); - return pageResult; - } - - SeckillActivityDetailRespVO convert1(SeckillActivityDO activity); - - default SeckillActivityDetailRespVO convert(SeckillActivityDO activity, List products) { - return convert1(activity).setProducts(convertList2(products)); - } - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(target = "activityId", source = "activity.id"), - @Mapping(target = "configIds", source = "activity.configIds"), - @Mapping(target = "spuId", source = "activity.spuId"), - @Mapping(target = "skuId", source = "product.skuId"), - @Mapping(target = "seckillPrice", source = "product.seckillPrice"), - @Mapping(target = "stock", source = "product.stock"), - @Mapping(target = "activityStartTime", source = "activity.startTime"), - @Mapping(target = "activityEndTime", source = "activity.endTime") - }) - SeckillProductDO convert(SeckillActivityDO activity, SeckillProductBaseVO product); - - default List convertList(List products, SeckillActivityDO activity) { - return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus())); - } - - List convertList2(List list); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillconfig/SeckillConfigConvert.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillconfig/SeckillConfigConvert.java deleted file mode 100644 index d56ac13c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/convert/seckill/seckillconfig/SeckillConfigConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.promotion.convert.seckill.seckillconfig; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigRespVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigSimpleRespVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 秒杀时段 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SeckillConfigConvert { - - SeckillConfigConvert INSTANCE = Mappers.getMapper(SeckillConfigConvert.class); - - SeckillConfigDO convert(SeckillConfigCreateReqVO bean); - - SeckillConfigDO convert(SeckillConfigUpdateReqVO bean); - - SeckillConfigRespVO convert(SeckillConfigDO bean); - - List convertList(List list); - - List convertList1(List list); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/banner/BannerDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/banner/BannerDO.java deleted file mode 100644 index ef9c4735..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/banner/BannerDO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.promotion.dal.dataobject.banner; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * banner DO - * - * @author xia - */ -@TableName("market_banner") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BannerDO extends BaseDO { - - /** - * 编号 - */ - private Long id; - /** - * 标题 - */ - private String title; - /** - * 跳转链接 - */ - private String url; - /** - * 图片链接 - */ - private String picUrl; - /** - * 排序 - */ - private Integer sort; - - /** - * 状态 {@link com.win.framework.common.enums.CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String memo; - - // TODO 芋艿 点击次数。&& 其他数据相关 - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainActivityDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainActivityDO.java deleted file mode 100644 index 2705898e..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainActivityDO.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.win.module.promotion.dal.dataobject.bargain; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 HUIHUI - */ -@TableName("promotion_bargain_activity") -@KeySequence("promotion_bargain_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BargainActivityDO extends BaseDO { - - /** - * 砍价活动编号 - */ - @TableId - private Long id; - - /** - * 砍价活动名称 - */ - private String name; - - /** - * 活动开始时间 - */ - private LocalDateTime startTime; - /** - * 活动结束时间 - */ - private LocalDateTime endTime; - - /** - * 活动状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - - /** - * 商品 SPU 编号 - */ - private Long spuId; - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 砍价起始价格,单位分 - */ - private Integer bargainFirstPrice; - /** - * 砍价底价,单位:分 - */ - private Integer bargainPrice; - /** - * 砍价活动库存 - */ - private Integer stock; - - /** - * 达到该人数,才能砍到低价 - */ - private Integer userSize; - /** - * 最大帮砍次数 - */ - private Integer bargainCount; - - /** - * 总限购数量 - */ - private Integer totalLimitCount; - /** - * 用户每次砍价的最小金额,单位:分 - */ - private Integer randomMinPrice; - /** - * 用户每次砍价的最大金额,单位:分 - */ - private Integer randomMaxPrice; - /** - * 砍价成功数量 - */ - private Integer successCount; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainAssistDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainAssistDO.java deleted file mode 100644 index e9cd569e..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainAssistDO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.promotion.dal.dataobject.bargain; - -import com.win.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 TODO 芋艿:表结构 - * - * @author HUIHUI - */ -@TableName("promotion_bargain_assist") -@KeySequence("promotion_bargain_assist_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BargainAssistDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 砍价活动编号 - */ - private Long activityId; - - /** - * 砍价记录编号 - */ - private Long recordId; - - /** - * 用户编号 - */ - private Long userId; - - /** - * 减少价格。单位分 - */ - private Integer reducePrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainRecordDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainRecordDO.java deleted file mode 100644 index 99e042b5..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/bargain/BargainRecordDO.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.win.module.promotion.dal.dataobject.bargain; - -import com.win.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 TODO - * - * @author HUIHUI - */ -@TableName("promotion_bargain_record") -@KeySequence("promotion_bargain_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BargainRecordDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 砍价活动编号 - */ - private Long activityId; - - /** - * 用户编号 - */ - private Long userId; - - /** - * 商品 SPU 编号 - */ - private Long spuId; - - /** - * 商品 SKU 编号 - */ - private Long skuId; - - /** - * 砍价底价,单位分 - */ - private Integer bargainPrice; - - /** - * 商品原价,单位分 - */ - private Integer price; - - /** - * 应付金额,单位分 - */ - private Integer payPrice; - - /** - * 状态1 - 砍价中;2- 砍价成功;3 - 砍价失败 - */ - private Integer status; - - /** - * 订单编号 - */ - private Long orderId; - - /** - * 结束时间 - */ - private LocalDateTime endTime; - - /** - * 过期时间 - */ - private Data expireTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationActivityDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationActivityDO.java deleted file mode 100644 index 668b7557..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationActivityDO.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.win.module.promotion.dal.dataobject.combination; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 HUIHUI - */ -@TableName("promotion_combination_activity") -@KeySequence("promotion_combination_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class CombinationActivityDO extends BaseDO { - - /** - * 活动编号 - */ - @TableId - private Long id; - /** - * 拼团名称 - */ - private String name; - /** - * 商品 SPU 编号 - * - * 关联 ProductSpuDO 的 id - */ - private Long spuId; - /** - * 总限购数量 - */ - private Integer totalLimitCount; - /** - * 单次限购数量 - */ - private Integer singleLimitCount; - /** - * 开始时间 - */ - private LocalDateTime startTime; - /** - * 结束时间 - */ - private LocalDateTime endTime; - /** - * 几人团 - */ - private Integer userSize; - /** - * 开团组数 - */ - private Integer totalCount; - /** - * 成团组数 - */ - private Integer successCount; - /** - * 参与人数 - */ - private Integer orderUserCount; - /** - * 虚拟成团 - */ - private Integer virtualGroup; - /** - * 活动状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 限制时长(小时) - */ - private Integer limitDuration; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationProductDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationProductDO.java deleted file mode 100644 index 6a0df016..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationProductDO.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.module.promotion.dal.dataobject.combination; - -import com.win.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 HUIHUI - */ -@TableName("promotion_combination_product") -@KeySequence("promotion_combination_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class CombinationProductDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 拼团活动编号 - */ - private Long activityId; - /** - * 商品 SPU 编号 - */ - private Long spuId; - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 拼团价格,单位分 - */ - private Integer combinationPrice; - - /** - * 拼团商品状态 - * - * 关联 {@link CombinationActivityDO#getStatus()} - */ - private Integer activityStatus; - /** - * 活动开始时间点 - * - * 冗余 {@link CombinationActivityDO#getStartTime()} - */ - private LocalDateTime activityStartTime; - /** - * 活动结束时间点 - * - * 冗余 {@link CombinationActivityDO#getEndTime()} - */ - private LocalDateTime activityEndTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationRecordDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationRecordDO.java deleted file mode 100644 index 8a03b22a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/combination/CombinationRecordDO.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.win.module.promotion.dal.dataobject.combination; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.promotion.enums.combination.CombinationRecordStatusEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.time.LocalDateTime; - -// TODO 芋艿:把字段的顺序,和 do 顺序对齐下 -/** - * 拼团记录 DO - * - * 1. 用户参与拼团时,会创建一条记录 - * 2. 团长的拼团记录,和参团人的拼团记录,通过 {@link #headId} 关联 - * - * @author HUIHUI - */ -@TableName("promotion_combination_record") -@KeySequence("promotion_combination_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class CombinationRecordDO extends BaseDO { - - /** - * 编号,主键自增 - */ - @TableId - private Long id; - - /** - * 拼团活动编号 - * - * 关联 {@link CombinationActivityDO#getId()} - */ - private Long activityId; - /** - * 拼团商品单价 - * - * 冗余 {@link CombinationProductDO#getCombinationPrice()} - */ - private Integer combinationPrice; - /** - * SPU 编号 - */ - private Long spuId; - /** - * 商品名字 - */ - private String spuName; - /** - * 商品图片 - */ - private String picUrl; - /** - * SKU 编号 - */ - private Long skuId; - - /** - * 用户编号 - */ - private Long userId; - /** - * 用户昵称 - */ - private String nickname; - /** - * 用户头像 - */ - private String avatar; - - /** - * 团长编号 - * - * 关联 {@link CombinationRecordDO#getId()} - */ - private Long headId; - /** - * 开团状态 - * - * 关联 {@link CombinationRecordStatusEnum} - */ - private Integer status; - /** - * 订单编号 - */ - private Long orderId; - /** - * 开团需要人数 - * - * 关联 {@link CombinationActivityDO#getUserSize()} - */ - private Integer userSize; - /** - * 已加入拼团人数 - */ - private Integer userCount; - /** - * 是否虚拟成团 - */ - private Boolean virtualGroup; - - /** - * 过期时间 - * - * 基于 {@link CombinationRecordDO#getStartTime()} + {@link CombinationActivityDO#getLimitDuration()} 计算 - */ - private LocalDateTime expireTime; - /** - * 开始时间 (订单付款后开始的时间) - */ - private LocalDateTime startTime; - /** - * 结束时间(成团时间/失败时间) - */ - private LocalDateTime endTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponDO.java deleted file mode 100644 index 0e7b5737..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponDO.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.win.module.promotion.dal.dataobject.coupon; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.coupon.CouponStatusEnum; -import com.win.module.promotion.enums.coupon.CouponTakeTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 优惠劵 DO - * - * @author 芋道源码 - */ -@TableName(value = "promotion_coupon", autoResultMap = true) -@KeySequence("promotion_coupon_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -public class CouponDO extends BaseDO { - - // ========== 基本信息 BEGIN ========== - /** - * 优惠劵编号 - */ - private Long id; - /** - * 优惠劵模板编号 - * - * 关联 {@link CouponTemplateDO#getId()} - */ - private Long templateId; - /** - * 优惠劵名 - * - * 冗余 {@link CouponTemplateDO#getName()} - */ - private String name; - /** - * 优惠码状态 - * - * 枚举 {@link CouponStatusEnum} - */ - private Integer status; - - // ========== 基本信息 END ========== - - // ========== 领取情况 BEGIN ========== - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 字段 - */ - private Long userId; - /** - * 领取类型 - * - * 枚举 {@link CouponTakeTypeEnum} - */ - private Integer takeType; - // ========== 领取情况 END ========== - - // ========== 使用规则 BEGIN ========== - /** - * 是否设置满多少金额可用,单位:分 - * - * 冗余 {@link CouponTemplateDO#getUsePrice()} - */ - private Integer usePrice; - /** - * 生效开始时间 - */ - private LocalDateTime validStartTime; - /** - * 生效结束时间 - */ - private LocalDateTime validEndTime; - /** - * 商品范围 - * - * 枚举 {@link PromotionProductScopeEnum} - */ - private Integer productScope; - /** - * 商品范围编号的数组 - * - * 冗余 {@link CouponTemplateDO#getProductScopeValues()} - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List productScopeValues; - // ========== 使用规则 END ========== - - // ========== 使用效果 BEGIN ========== - /** - * 折扣类型 - * - * 冗余 {@link CouponTemplateDO#getDiscountType()} - */ - private Integer discountType; - /** - * 折扣百分比 - * - * 冗余 {@link CouponTemplateDO#getDiscountPercent()} - */ - private Integer discountPercent; - /** - * 优惠金额,单位:分 - * - * 冗余 {@link CouponTemplateDO#getDiscountPrice()} - */ - private Integer discountPrice; - /** - * 折扣上限,仅在 {@link #discountType} 等于 {@link PromotionDiscountTypeEnum#PERCENT} 时生效 - * - * 冗余 {@link CouponTemplateDO#getDiscountLimitPrice()} - */ - private Integer discountLimitPrice; - // ========== 使用效果 END ========== - - // ========== 使用情况 BEGIN ========== - /** - * 使用订单号 - */ - private Long useOrderId; - /** - * 使用时间 - */ - private LocalDateTime useTime; - - // ========== 使用情况 END ========== - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponTemplateDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponTemplateDO.java deleted file mode 100644 index b2fb0a43..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/coupon/CouponTemplateDO.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.win.module.promotion.dal.dataobject.coupon; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.coupon.CouponTakeTypeEnum; -import com.win.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; -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.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 优惠劵模板 DO - * - * 当用户领取时,会生成 {@link CouponDO} 优惠劵 - * - * @author 芋道源码 - */ -@TableName(value = "promotion_coupon_template", autoResultMap = true) -@KeySequence("promotion_coupon_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -public class CouponTemplateDO extends BaseDO { - - // ========== 基本信息 BEGIN ========== - /** - * 模板编号,自增唯一 - */ - @TableId - private Long id; - /** - * 优惠劵名 - */ - private String name; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - - // ========== 基本信息 END ========== - - // ========== 领取规则 BEGIN ========== - /** - * 发放数量 - * - * -1 - 则表示不限制发放数量 - */ - private Integer totalCount; - /** - * 每人限领个数 - * - * -1 - 则表示不限制 - */ - private Integer takeLimitCount; - /** - * 领取方式 - * - * 枚举 {@link CouponTakeTypeEnum} - */ - private Integer takeType; - // ========== 领取规则 END ========== - - // ========== 使用规则 BEGIN ========== - /** - * 是否设置满多少金额可用,单位:分 - * - * 0 - 不限制 - * 大于 0 - 多少金额可用 - */ - private Integer usePrice; - /** - * 商品范围 - * - * 枚举 {@link PromotionProductScopeEnum} - */ - private Integer productScope; - /** - * 商品范围编号的数组 - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List productScopeValues; - /** - * 生效日期类型 - * - * 枚举 {@link CouponTemplateValidityTypeEnum} - */ - private Integer validityType; - /** - * 固定日期 - 生效开始时间 - * - * 当 {@link #validityType} 为 {@link CouponTemplateValidityTypeEnum#DATE} - */ - private LocalDateTime validStartTime; - /** - * 固定日期 - 生效结束时间 - * - * 当 {@link #validityType} 为 {@link CouponTemplateValidityTypeEnum#DATE} - */ - private LocalDateTime validEndTime; - /** - * 领取日期 - 开始天数 - * - * 当 {@link #validityType} 为 {@link CouponTemplateValidityTypeEnum#TERM} - */ - private Integer fixedStartTerm; - /** - * 领取日期 - 结束天数 - * - * 当 {@link #validityType} 为 {@link CouponTemplateValidityTypeEnum#TERM} - */ - private Integer fixedEndTerm; - // ========== 使用规则 END ========== - - // ========== 使用效果 BEGIN ========== - /** - * 折扣类型 - * - * 枚举 {@link PromotionDiscountTypeEnum} - */ - private Integer discountType; - /** - * 折扣百分比 - * - * 例如,80% 为 80 - */ - private Integer discountPercent; - /** - * 优惠金额,单位:分 - * - * 当 {@link #discountType} 为 {@link PromotionDiscountTypeEnum#PRICE} 生效 - */ - private Integer discountPrice; - /** - * 折扣上限,仅在 {@link #discountType} 等于 {@link PromotionDiscountTypeEnum#PERCENT} 时生效 - * - * 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。 - */ - private Integer discountLimitPrice; - // ========== 使用效果 END ========== - - // ========== 统计信息 BEGIN ========== - /** - * 领取优惠券的数量 - */ - private Integer takeCount; - /** - * 使用优惠券的次数 - */ - private Integer useCount; - // ========== 统计信息 END ========== - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/decorate/DecorateComponentDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/decorate/DecorateComponentDO.java deleted file mode 100644 index 6a76b43b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/decorate/DecorateComponentDO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.promotion.dal.dataobject.decorate; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.promotion.enums.decorate.DecoratePageEnum; -import com.win.module.promotion.enums.decorate.DecorateComponentEnum; -import com.baomidou.mybatisplus.annotation.*; - -import lombok.Data; - -/** - * 页面装修组件 DO, 一个页面由多个组件构成 - * - * @author jason - */ -@TableName(value ="promotion_decorate_component") -@KeySequence("promotion_decorate_component_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DecorateComponentDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 所属页面 id - * - * 枚举 {@link DecoratePageEnum#getPage()} - */ - private Integer page; - - /** - * 组件编码 - * 枚举 {@link DecorateComponentEnum#getCode()} - */ - private String code; - - /** - * 组件值:json 格式。包含配置和数据 - */ - private String value; - - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountActivityDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountActivityDO.java deleted file mode 100644 index efab12cc..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountActivityDO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.promotion.dal.dataobject.discount; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 限时折扣活动 DO - * - * 一个活动下,可以有 {@link DiscountProductDO} 商品; - * 一个商品,在指定时间段内,只能属于一个活动; - * - * @author 芋道源码 - */ -@TableName(value = "promotion_discount_activity", autoResultMap = true) -@KeySequence("promotion_discount_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -public class DiscountActivityDO extends BaseDO { - - /** - * 活动编号,主键自增 - */ - @TableId - private Long id; - /** - * 活动标题 - */ - private String name; - // TODO 芋艿:状态调整,只有开启和关闭; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - * - * 活动被关闭后,不允许再次开启。 - */ - private Integer status; - /** - * 开始时间 - */ - private LocalDateTime startTime; - /** - * 结束时间 - */ - private LocalDateTime endTime; - /** - * 备注 - */ - private String remark; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountProductDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountProductDO.java deleted file mode 100644 index 76a9dded..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/discount/DiscountProductDO.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.win.module.promotion.dal.dataobject.discount; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 限时折扣商品 DO - * - * @author 芋道源码 - */ -@TableName(value = "promotion_discount_product", autoResultMap = true) -@KeySequence("promotion_discount_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -public class DiscountProductDO extends BaseDO { - - /** - * 编号,主键自增 - */ - @TableId - private Long id; - - // TODO 芋艿:把 activity 所有的字段冗余过来 - /** - * 限时折扣活动的编号 - * - * 关联 {@link DiscountActivityDO#getId()} - */ - private Long activityId; - - /** - * 商品 SPU 编号 - * - * 关联 ProductSpuDO 的 id 编号 - */ - private Long spuId; - /** - * 商品 SKU 编号 - * - * 关联 ProductSkuDO 的 id 编号 - */ - private Long skuId; - - /** - * 折扣类型 - * - * 枚举 {@link PromotionDiscountTypeEnum} - */ - private Integer discountType; - /** - * 折扣百分比 - * - * 例如,80% 为 80 - */ - private Integer discountPercent; - /** - * 优惠金额,单位:分 - * - * 当 {@link #discountType} 为 {@link PromotionDiscountTypeEnum#PRICE} 生效 - */ - private Integer discountPrice; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/reward/RewardActivityDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/reward/RewardActivityDO.java deleted file mode 100644 index a27cb85d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/reward/RewardActivityDO.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.win.module.promotion.dal.dataobject.reward; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -import com.win.module.promotion.enums.common.PromotionActivityStatusEnum; -import com.win.module.promotion.enums.common.PromotionConditionTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -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 com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 满减送活动 DO - * - * @author 芋道源码 - */ -@TableName(value = "promotion_reward_activity", autoResultMap = true) -@KeySequence("promotion_reward_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -public class RewardActivityDO extends BaseDO { - - /** - * 活动编号,主键自增 - */ - @TableId - private Long id; - /** - * 活动标题 - */ - private String name; - // TODO @芋艿:改成开启、禁用两种状态 - /** - * 状态 - * - * 枚举 {@link PromotionActivityStatusEnum} - */ - private Integer status; - /** - * 开始时间 - */ - private LocalDateTime startTime; - /** - * 结束时间 - */ - private LocalDateTime endTime; - /** - * 备注 - */ - private String remark; - /** - * 条件类型 - * - * 枚举 {@link PromotionConditionTypeEnum} - */ - private Integer conditionType; - /** - * 商品范围 - * - * 枚举 {@link PromotionProductScopeEnum} - */ - private Integer productScope; - /** - * 商品 SPU 编号的数组 - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List productSpuIds; - /** - * 优惠规则的数组 - */ - @TableField(typeHandler = RuleTypeHandler.class) - private List rules; - - /** - * 优惠规则 - */ - @Data - public static class Rule implements Serializable { - - /** - * 优惠门槛 - * - * 1. 满 N 元,单位:分 - * 2. 满 N 件 - */ - private Integer limit; - /** - * 优惠价格,单位:分 - */ - private Integer discountPrice; - /** - * 是否包邮 - */ - private Boolean freeDelivery; - /** - * 赠送的积分 - */ - private Integer point; - /** - * 赠送的优惠劵编号的数组 - */ - private List couponIds; - /** - * 赠送的优惠卷数量的数组 - */ - private List couponCounts; - - } - - // TODO @芋艿:可以找一些新的思路 - public static class RuleTypeHandler extends AbstractJsonTypeHandler> { - - @Override - protected List parse(String json) { - return JsonUtils.parseArray(json, Rule.class); - } - - @Override - protected String toJson(List obj) { - return JsonUtils.toJsonString(obj); - } - - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java deleted file mode 100644 index 87a124fa..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.win.module.promotion.dal.dataobject.seckill.seckillactivity; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -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.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 秒杀活动 DO - * - * @author halfninety - */ -@TableName(value = "promotion_seckill_activity", autoResultMap = true) -@KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SeckillActivityDO extends BaseDO { - - /** - * 秒杀活动编号 - */ - @TableId - private Long id; - /** - * 秒杀活动商品 - */ - private Long spuId; - /** - * 秒杀活动名称 - */ - private String name; - /** - * 活动状态 - * - * 枚举 {@link CommonStatusEnum 对应的类} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - /** - * 活动开始时间 - */ - private LocalDateTime startTime; - /** - * 活动结束时间 - */ - private LocalDateTime endTime; - /** - * 排序 - */ - private Integer sort; - /** - * 秒杀时段 id - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List configIds; - /** - * 新增订单数 - */ - private Integer orderCount; - /** - * 付款人数 - */ - private Integer userCount; - /** - * 订单实付金额,单位:分 - */ - private Long totalPrice; - /** - * 总限购数量 - */ - private Integer totalLimitCount; - /** - * 单次限够数量 - */ - private Integer singleLimitCount; - /** - * 秒杀库存 - */ - private Integer stock; - /** - * 秒杀总库存 - */ - private Integer totalStock; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java deleted file mode 100644 index b27fa19e..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.win.module.promotion.dal.dataobject.seckill.seckillactivity; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; -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.*; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 秒杀参与商品 DO - * - * @author HUIHUI - */ -@TableName("promotion_seckill_product") -@KeySequence("promotion_seckill_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SeckillProductDO extends BaseDO { - - /** - * 秒杀参与商品编号 - */ - @TableId - private Long id; - /** - * 秒杀活动 id - * - * 关联 {@link SeckillActivityDO#getId()} - */ - private Long activityId; - /** - * 秒杀时段 id - * - * 关联 {@link SeckillConfigDO#getId()} - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List configIds; - /** - * 商品 SPU 编号 - */ - private Long spuId; - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 秒杀金额,单位:分 - */ - private Integer seckillPrice; - /** - * 秒杀库存 - */ - private Integer stock; - - /** - * 秒杀商品状态 - * - * 枚举 {@link CommonStatusEnum 对应的类} - */ - private Integer activityStatus; - /** - * 活动开始时间点 - */ - private LocalDateTime activityStartTime; - /** - * 活动结束时间点 - */ - private LocalDateTime activityEndTime; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillconfig/SeckillConfigDO.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillconfig/SeckillConfigDO.java deleted file mode 100644 index 7e02f38d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/dataobject/seckill/seckillconfig/SeckillConfigDO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.promotion.dal.dataobject.seckill.seckillconfig; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.List; - -/** - * 秒杀时段 DO - * - * @author 芋道源码 - */ -@TableName(value = "promotion_seckill_config", autoResultMap = true) -@KeySequence("promotion_seckill_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SeckillConfigDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 秒杀时段名称 - */ - private String name; - /** - * 开始时间点 - */ - private String startTime; - /** - * 结束时间点 - */ - private String endTime; - /** - * 秒杀轮播图 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List sliderPicUrls; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum 对应的类} - */ - private Integer status; - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/banner/BannerMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/banner/BannerMapper.java deleted file mode 100644 index 79b72805..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/banner/BannerMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.promotion.dal.mysql.banner; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.banner.vo.BannerPageReqVO; -import com.win.module.promotion.dal.dataobject.banner.BannerDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * Banner Mapper - * - * @author xia - */ -@Mapper -public interface BannerMapper extends BaseMapperX { - - default PageResult selectPage(BannerPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BannerDO::getTitle, reqVO.getTitle()) - .eqIfPresent(BannerDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(BannerDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BannerDO::getSort)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainActivityMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainActivityMapper.java deleted file mode 100644 index 72df704b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainActivityMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.promotion.dal.mysql.bargain; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO; -import com.win.module.promotion.dal.dataobject.bargain.BargainActivityDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 砍价活动 Mapper - * - * @author HUIHUI - */ -@Mapper -public interface BargainActivityMapper extends BaseMapperX { - - default PageResult selectPage(BargainActivityPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(BargainActivityDO::getName, reqVO.getName()) - .eqIfPresent(BargainActivityDO::getStatus, reqVO.getStatus()) - .orderByDesc(BargainActivityDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(BargainActivityDO::getStatus, status); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainRecordMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainRecordMapper.java deleted file mode 100644 index a7b67a17..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/bargain/BargainRecordMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.promotion.dal.mysql.bargain; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.promotion.dal.dataobject.bargain.BargainRecordDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 砍价记录 Mapper - * - * @author HUIHUI - */ -@Mapper -public interface BargainRecordMapper extends BaseMapperX { - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationActivityMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationActivityMapper.java deleted file mode 100644 index fa524b23..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationActivityMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.promotion.dal.mysql.combination; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 拼团活动 Mapper - * - * @author HUIHUI - */ -@Mapper -public interface CombinationActivityMapper extends BaseMapperX { - - default PageResult selectPage(CombinationActivityPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(CombinationActivityDO::getName, reqVO.getName()) - .eqIfPresent(CombinationActivityDO::getStatus, reqVO.getStatus()) - .orderByDesc(CombinationActivityDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(CombinationActivityDO::getStatus, status); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationProductMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationProductMapper.java deleted file mode 100644 index d2ba9d74..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationProductMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.promotion.dal.mysql.combination; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductPageReqVO; -import com.win.module.promotion.dal.dataobject.combination.CombinationProductDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -/** - * 拼团商品 Mapper - * - * @author HUIHUI - */ -@Mapper -public interface CombinationProductMapper extends BaseMapperX { - - default PageResult selectPage(CombinationProductPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(CombinationProductDO::getActivityId, reqVO.getActivityId()) - .eqIfPresent(CombinationProductDO::getSpuId, reqVO.getSpuId()) - .eqIfPresent(CombinationProductDO::getSkuId, reqVO.getSkuId()) - .eqIfPresent(CombinationProductDO::getActivityStatus, reqVO.getActivityStatus()) - .betweenIfPresent(CombinationProductDO::getActivityStartTime, reqVO.getActivityStartTime()) - .betweenIfPresent(CombinationProductDO::getActivityEndTime, reqVO.getActivityEndTime()) - .eqIfPresent(CombinationProductDO::getCombinationPrice, reqVO.getActivePrice()) - .betweenIfPresent(CombinationProductDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(CombinationProductDO::getId)); - } - - default List selectListByActivityIds(Collection ids) { - return selectList(CombinationProductDO::getActivityId, ids); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationRecordMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationRecordMapper.java deleted file mode 100644 index 2f20172a..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/combination/CombinationRecordMapper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.promotion.dal.mysql.combination; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.dal.dataobject.combination.CombinationRecordDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 拼团记录 Mapper - * - * @author HUIHUI - */ -@Mapper -public interface CombinationRecordMapper extends BaseMapperX { - - default CombinationRecordDO selectByUserIdAndOrderId(Long userId, Long orderId) { - return selectOne(CombinationRecordDO::getUserId, userId, - CombinationRecordDO::getOrderId, orderId); - } - - default List selectListByUserIdAndStatus(Long userId, Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(CombinationRecordDO::getUserId, userId) - .eq(CombinationRecordDO::getStatus, status)); - } - /** - * 查询拼团记录 - * - * @param headId 团长编号 - * @return 拼团记录 - */ - default CombinationRecordDO selectOneByHeadId(Long headId, Integer status) { - return selectOne(new LambdaQueryWrapperX() - .eq(CombinationRecordDO::getId, headId) - .eq(CombinationRecordDO::getStatus, status)); - } - - default List selectListByHeadIdAndStatus(Long headId, Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(CombinationRecordDO::getHeadId, headId) - .eq(CombinationRecordDO::getStatus, status)); - } - - default List selectListByStatus(Integer status) { - return selectList(CombinationRecordDO::getStatus, status); - } - - /** - * 查询拼团记录 - * - * @param userId 用户 id - * @param activityId 活动 id - * @return 拼团记录 - */ - default List selectListByUserIdAndActivityId(Long userId, Long activityId) { - return selectList(new LambdaQueryWrapperX() - .eq(CombinationRecordDO::getUserId, userId) - .eq(CombinationRecordDO::getActivityId, activityId)); - } -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponMapper.java deleted file mode 100644 index e5527071..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponMapper.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.promotion.dal.mysql.coupon; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -/** - * 优惠劵 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface CouponMapper extends BaseMapperX { - - default PageResult selectPage(CouponPageReqVO reqVO, Collection userIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(CouponDO::getTemplateId, reqVO.getTemplateId()) - .eqIfPresent(CouponDO::getStatus, reqVO.getStatus()) - .inIfPresent(CouponDO::getUserId, userIds) - .betweenIfPresent(CouponDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(CouponDO::getId)); - } - - default List selectListByUserIdAndStatus(Long userId, Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(CouponDO::getUserId, userId).eq(CouponDO::getStatus, status)); - } - - default CouponDO selectByIdAndUserId(Long id, Long userId) { - return selectOne(new LambdaQueryWrapperX() - .eq(CouponDO::getId, id).eq(CouponDO::getUserId, userId)); - } - - default int delete(Long id, Collection whereStatuses) { - return update(null, new LambdaUpdateWrapper() - .eq(CouponDO::getId, id).in(CouponDO::getStatus, whereStatuses) - .set(CouponDO::getDeleted, 1)); - } - - default int updateByIdAndStatus(Long id, Integer status, CouponDO updateObj) { - return update(updateObj, new LambdaUpdateWrapper() - .eq(CouponDO::getId, id).eq(CouponDO::getStatus, status)); - } - - default Long selectCountByUserIdAndStatus(Long userId, Integer status) { - return selectCount(new LambdaQueryWrapperX() - .eq(CouponDO::getUserId, userId) - .eq(CouponDO::getStatus, status)); - } - - default List selectListByTemplateIdAndUserId(Long templateId, Collection userIds) { - return selectList(new LambdaQueryWrapperX() - .eq(CouponDO::getTemplateId, templateId) - .in(CouponDO::getUserId, userIds) - ); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java deleted file mode 100644 index 152677c0..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.promotion.dal.mysql.coupon; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.time.LocalDateTime; -import java.util.function.Consumer; - -/** - * 优惠劵模板 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface CouponTemplateMapper extends BaseMapperX { - - default PageResult selectPage(CouponTemplatePageReqVO reqVO) { - // 构建可领取的查询条件, 好啰嗦 ( ╯-_-)╯┴—┴ - Consumer> canTakeConsumer = null; - if (CollUtil.isNotEmpty(reqVO.getCanTakeTypes())) { - canTakeConsumer = w -> - w.eq(CouponTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) // 1. 状态为可用的 - .in(CouponTemplateDO::getTakeType, reqVO.getCanTakeTypes()) // 2. 领取方式一致 - .and(ww -> ww.isNull(CouponTemplateDO::getValidEndTime) // 3. 未过期 - .or().gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now())) - .apply(" take_count < total_count "); // 4. 剩余数量大于 0 - } - // 执行分页查询 - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(CouponTemplateDO::getName, reqVO.getName()) - .eqIfPresent(CouponTemplateDO::getStatus, reqVO.getStatus()) - .eqIfPresent(CouponTemplateDO::getDiscountType, reqVO.getDiscountType()) - .betweenIfPresent(CouponTemplateDO::getCreateTime, reqVO.getCreateTime()) - .and(canTakeConsumer != null, canTakeConsumer) - .orderByDesc(CouponTemplateDO::getId)); - } - - void updateTakeCount(@Param("id") Long id, @Param("incrCount") Integer incrCount); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/decorate/DecorateComponentMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/decorate/DecorateComponentMapper.java deleted file mode 100644 index a4b34030..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/decorate/DecorateComponentMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.promotion.dal.mysql.decorate; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.dal.dataobject.decorate.DecorateComponentDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface DecorateComponentMapper extends BaseMapperX { - - default List selectListByPageAndStatus(Integer page, Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(DecorateComponentDO::getPage, page) - .eqIfPresent(DecorateComponentDO::getStatus, status)); - } - - default DecorateComponentDO selectByPageAndCode(Integer page, String code) { - return selectOne(DecorateComponentDO::getPage, page, - DecorateComponentDO::getCode, code); - } - -} - - - - diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountActivityMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountActivityMapper.java deleted file mode 100644 index b4791eeb..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountActivityMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.promotion.dal.mysql.discount; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; -import com.win.module.promotion.dal.dataobject.discount.DiscountActivityDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * 限时折扣活动 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface DiscountActivityMapper extends BaseMapperX { - - default PageResult selectPage(DiscountActivityPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(DiscountActivityDO::getName, reqVO.getName()) - .eqIfPresent(DiscountActivityDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(DiscountActivityDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(DiscountActivityDO::getId)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountProductMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountProductMapper.java deleted file mode 100644 index 84e84a56..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/discount/DiscountProductMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.promotion.dal.mysql.discount; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.promotion.dal.dataobject.discount.DiscountProductDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -/** - * 限时折扣商城 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface DiscountProductMapper extends BaseMapperX { - - default List selectListBySkuId(Collection skuIds) { - return selectList(DiscountProductDO::getSkuId, skuIds); - } - - default List selectListByActivityId(Long activityId) { - return selectList(DiscountProductDO::getActivityId, activityId); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/reward/RewardActivityMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/reward/RewardActivityMapper.java deleted file mode 100644 index 3a9a2f1f..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/reward/RewardActivityMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.promotion.dal.mysql.reward; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; -import com.win.module.promotion.dal.dataobject.reward.RewardActivityDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -/** - * 满减送活动 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface RewardActivityMapper extends BaseMapperX { - - default PageResult selectPage(RewardActivityPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(RewardActivityDO::getName, reqVO.getName()) - .eqIfPresent(RewardActivityDO::getStatus, reqVO.getStatus()) - .orderByDesc(RewardActivityDO::getId)); - } - - default List selectListByStatus(Collection statuses) { - return selectList(RewardActivityDO::getStatus, statuses); - } - - default List selectListByProductScopeAndStatus(Integer productScope, Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(RewardActivityDO::getProductScope, productScope) - .eq(RewardActivityDO::getStatus, status)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java deleted file mode 100644 index 4c8b3223..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.promotion.dal.mysql.seckill.seckillactivity; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 秒杀活动 Mapper - * - * @author halfninety - */ -@Mapper -public interface SeckillActivityMapper extends BaseMapperX { - - default PageResult selectPage(SeckillActivityPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) - .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) - .apply(ObjectUtil.isNotNull(reqVO.getConfigId()), "FIND_IN_SET(" + reqVO.getConfigId() + ",time_ids) > 0") - .orderByDesc(SeckillActivityDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(SeckillActivityDO::getStatus, status)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java deleted file mode 100644 index edf7c548..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.promotion.dal.mysql.seckill.seckillactivity; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -/** - * 秒杀活动商品 Mapper - * - * @author halfninety - */ -@Mapper -public interface SeckillProductMapper extends BaseMapperX { - - default List selectListByActivityId(Long id) { - return selectList(SeckillProductDO::getActivityId, id); - } - - default List selectListByActivityId(Collection ids) { - return selectList(SeckillProductDO::getActivityId, ids); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillconfig/SeckillConfigMapper.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillconfig/SeckillConfigMapper.java deleted file mode 100644 index 004cf664..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/dal/mysql/seckill/seckillconfig/SeckillConfigMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.promotion.dal.mysql.seckill.seckillconfig; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface SeckillConfigMapper extends BaseMapperX { - - default PageResult selectPage(SeckillConfigPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(SeckillConfigDO::getName, reqVO.getName()) - .eqIfPresent(SeckillConfigDO::getStatus, reqVO.getStatus()) - .orderByAsc(SeckillConfigDO::getStartTime)); - } - - default List selectListByStatus(Integer status) { - return selectList(SeckillConfigDO::getStatus, status); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/package-info.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/package-info.java deleted file mode 100644 index d30b08ec..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 promotion 模块的 framework 封装 - * - * @author 芋道源码 - */ -package com.win.module.promotion.framework; diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/config/PromotionWebConfiguration.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/config/PromotionWebConfiguration.java deleted file mode 100644 index 613ea252..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/config/PromotionWebConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.promotion.framework.web.config; - -import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; -import org.springdoc.core.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * promotion 模块的 web 组件的 Configuration - * - * @author 芋道源码 - */ -@Configuration(proxyBeanMethods = false) -public class PromotionWebConfiguration { - - /** - * promotion 模块的 API 分组 - */ - @Bean - public GroupedOpenApi promotionGroupedOpenApi() { - return WinSwaggerAutoConfiguration.buildGroupedOpenApi("promotion"); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/package-info.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/package-info.java deleted file mode 100644 index 05b7b5d7..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * promotion 模块的 web 配置 - */ -package com.win.module.promotion.framework.web; diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/package-info.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/package-info.java deleted file mode 100644 index 226f4a12..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * promotion 模块,我们放营销业务。 - * 例如说:营销活动、banner、优惠券等等 - * - * 1. Controller URL:以 /promotion/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 promotion_ 开头,方便在数据库中区分 - */ -package com.win.module.promotion; diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerService.java deleted file mode 100644 index e94af291..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerService.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.promotion.service.banner; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.banner.vo.BannerCreateReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerPageReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerUpdateReqVO; -import com.win.module.promotion.dal.dataobject.banner.BannerDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 首页 Banner Service 接口 - * - * @author xia - */ -public interface BannerService { - - /** - * 创建 Banner - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createBanner(@Valid BannerCreateReqVO createReqVO); - - /** - * 更新 Banner - * - * @param updateReqVO 更新信息 - */ - void updateBanner(@Valid BannerUpdateReqVO updateReqVO); - - /** - * 删除 Banner - * - * @param id 编号 - */ - void deleteBanner(Long id); - - /** - * 获得 Banner - * - * @param id 编号 - * @return Banner - */ - BannerDO getBanner(Long id); - - /** - * 获得所有 Banner列表 - * @return Banner列表 - */ - List getBannerList(); - - /** - * 获得 Banner 分页 - * - * @param pageReqVO 分页查询 - * @return Banner分页 - */ - PageResult getBannerPage(BannerPageReqVO pageReqVO); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerServiceImpl.java deleted file mode 100644 index db9ef31b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/banner/BannerServiceImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.promotion.service.banner; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.banner.vo.BannerCreateReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerPageReqVO; -import com.win.module.promotion.controller.admin.banner.vo.BannerUpdateReqVO; -import com.win.module.promotion.convert.banner.BannerConvert; -import com.win.module.promotion.dal.dataobject.banner.BannerDO; -import com.win.module.promotion.dal.mysql.banner.BannerMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.BANNER_NOT_EXISTS; - -/** - * 首页 banner 实现类 - * - * @author xia - */ -@Service -@Validated -public class BannerServiceImpl implements BannerService { - - @Resource - private BannerMapper bannerMapper; - - @Override - public Long createBanner(BannerCreateReqVO createReqVO) { - // 插入 - BannerDO banner = BannerConvert.INSTANCE.convert(createReqVO); - bannerMapper.insert(banner); - // 返回 - return banner.getId(); - } - - @Override - public void updateBanner(BannerUpdateReqVO updateReqVO) { - // 校验存在 - this.validateBannerExists(updateReqVO.getId()); - // 更新 - BannerDO updateObj = BannerConvert.INSTANCE.convert(updateReqVO); - bannerMapper.updateById(updateObj); - } - - @Override - public void deleteBanner(Long id) { - // 校验存在 - this.validateBannerExists(id); - // 删除 - bannerMapper.deleteById(id); - } - - private void validateBannerExists(Long id) { - if (bannerMapper.selectById(id) == null) { - throw exception(BANNER_NOT_EXISTS); - } - } - - @Override - public BannerDO getBanner(Long id) { - return bannerMapper.selectById(id); - } - - @Override - public List getBannerList() { - return bannerMapper.selectList(); - } - - @Override - public PageResult getBannerPage(BannerPageReqVO pageReqVO) { - return bannerMapper.selectPage(pageReqVO); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityService.java deleted file mode 100644 index 2c85db9d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityService.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.promotion.service.bargain; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.bargain.BargainActivityDO; - -import javax.validation.Valid; - -/** - * 砍价活动 Service 接口 - * - * @author HUIHUI - */ -public interface BargainActivityService { - - /** - * 创建砍价活动 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createBargainActivity(@Valid BargainActivityCreateReqVO createReqVO); - - /** - * 更新砍价活动 - * - * @param updateReqVO 更新信息 - */ - void updateBargainActivity(@Valid BargainActivityUpdateReqVO updateReqVO); - - /** - * 删除砍价活动 - * - * @param id 编号 - */ - void deleteBargainActivity(Long id); - - /** - * 获得砍价活动 - * - * @param id 编号 - * @return 砍价活动 - */ - BargainActivityDO getBargainActivity(Long id); - - /** - * 获得砍价活动分页 - * - * @param pageReqVO 分页查询 - * @return 砍价活动分页 - */ - PageResult getBargainActivityPage(BargainActivityPageReqVO pageReqVO); - - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityServiceImpl.java deleted file mode 100644 index f9ecc9b4..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainActivityServiceImpl.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.win.module.promotion.service.bargain; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO; -import com.win.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; -import com.win.module.promotion.convert.bargain.BargainActivityConvert; -import com.win.module.promotion.dal.dataobject.bargain.BargainActivityDO; -import com.win.module.promotion.dal.mysql.bargain.BargainActivityMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.anyMatch; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; - -/** - * 砍价活动 Service 实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class BargainActivityServiceImpl implements BargainActivityService { - - @Resource - private BargainActivityMapper bargainActivityMapper; - - @Resource - private ProductSkuApi productSkuApi; - - @Override - public Long createBargainActivity(BargainActivityCreateReqVO createReqVO) { - // 校验商品 SPU 是否存在是否参加的别的活动 - validateBargainConflict(createReqVO.getSpuId(), null); - // 校验商品 sku 是否存在 - validateSku(createReqVO.getSkuId()); - - // 插入砍价活动 - BargainActivityDO activityDO = BargainActivityConvert.INSTANCE.convert(createReqVO) - .setStatus(CommonStatusEnum.ENABLE.getStatus()).setSuccessCount(0); - bargainActivityMapper.insert(activityDO); - return activityDO.getId(); - } - - @Override - public void updateBargainActivity(BargainActivityUpdateReqVO updateReqVO) { - // 校验存在 - BargainActivityDO activityDO = validateBargainActivityExists(updateReqVO.getId()); - // 校验状态 - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { - throw exception(BARGAIN_ACTIVITY_STATUS_DISABLE); - } - // 校验商品冲突 - validateBargainConflict(updateReqVO.getSpuId(), updateReqVO.getId()); - // 校验商品 sku 是否存在 - validateSku(updateReqVO.getSkuId()); - - // 更新 - BargainActivityDO updateObj = BargainActivityConvert.INSTANCE.convert(updateReqVO); - bargainActivityMapper.updateById(updateObj); - } - - private void validateBargainConflict(Long spuId, Long activityId) { - // 查询所有开启的砍价活动 - List activityList = bargainActivityMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); - if (activityId != null) { // 更新时排除自己 - activityList.removeIf(item -> ObjectUtil.equal(item.getId(), activityId)); - } - // 校验商品 spu 是否参加了其它活动 - if (anyMatch(activityList, activity -> ObjectUtil.equal(activity.getSpuId(), spuId))) { - throw exception(BARGAIN_ACTIVITY_SPU_CONFLICTS); - } - } - - private void validateSku(Long skuId) { - ProductSkuRespDTO sku = productSkuApi.getSku(skuId); - if (sku == null) { - throw exception(SKU_NOT_EXISTS); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteBargainActivity(Long id) { - // 校验存在 - BargainActivityDO activityDO = validateBargainActivityExists(id); - // 校验状态 - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { - throw exception(BARGAIN_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); - } - - // 删除 - bargainActivityMapper.deleteById(id); - } - - private BargainActivityDO validateBargainActivityExists(Long id) { - BargainActivityDO activityDO = bargainActivityMapper.selectById(id); - if (activityDO == null) { - throw exception(BARGAIN_ACTIVITY_NOT_EXISTS); - } - return activityDO; - } - - @Override - public BargainActivityDO getBargainActivity(Long id) { - return bargainActivityMapper.selectById(id); - } - - @Override - public PageResult getBargainActivityPage(BargainActivityPageReqVO pageReqVO) { - return bargainActivityMapper.selectPage(pageReqVO); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordService.java deleted file mode 100644 index 3d20d446..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.win.module.promotion.service.bargain; - - -/** - * 砍价记录 service 接口 - * - * @author HUIHUI - */ -public interface BargainRecordService { - -// TODO - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordServiceImpl.java deleted file mode 100644 index 875258f9..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/bargain/BargainRecordServiceImpl.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.promotion.service.bargain; - -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -/** - * 砍价记录 Service 实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class BargainRecordServiceImpl implements BargainRecordService { -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityService.java deleted file mode 100644 index db621579..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityService.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.win.module.promotion.service.combination; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import com.win.module.promotion.dal.dataobject.combination.CombinationProductDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 拼团活动 Service 接口 - * - * @author HUIHUI - */ -public interface CombinationActivityService { - - /** - * 创建拼团活动 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createCombinationActivity(@Valid CombinationActivityCreateReqVO createReqVO); - - /** - * 更新拼团活动 - * - * @param updateReqVO 更新信息 - */ - void updateCombinationActivity(@Valid CombinationActivityUpdateReqVO updateReqVO); - - /** - * 删除拼团活动 - * - * @param id 编号 - */ - void deleteCombinationActivity(Long id); - - /** - * 校验拼团活动是否存在 - * - * @param id 编号 - * @return 拼团活动 - */ - CombinationActivityDO validateCombinationActivityExists(Long id); - - /** - * 获得拼团活动 - * - * @param id 编号 - * @return 拼团活动 - */ - CombinationActivityDO getCombinationActivity(Long id); - - /** - * 获得拼团活动分页 - * - * @param pageReqVO 分页查询 - * @return 拼团活动分页 - */ - PageResult getCombinationActivityPage(CombinationActivityPageReqVO pageReqVO); - - /** - * 获得拼团活动商品列表 - * - * @param activityIds 拼团活动 ids - * @return 拼团活动的商品列表 - */ - List getCombinationProductsByActivityIds(Collection activityIds); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityServiceImpl.java deleted file mode 100644 index 203938e6..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationActivityServiceImpl.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.win.module.promotion.service.combination; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.product.CombinationProductBaseVO; -import com.win.module.promotion.convert.combination.CombinationActivityConvert; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import com.win.module.promotion.dal.dataobject.combination.CombinationProductDO; -import com.win.module.promotion.dal.mysql.combination.CombinationActivityMapper; -import com.win.module.promotion.dal.mysql.combination.CombinationProductMapper; -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 static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.filterList; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; -import static com.win.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; -import static java.util.Collections.singletonList; - -/** - * 拼团活动 Service 实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class CombinationActivityServiceImpl implements CombinationActivityService { - - @Resource - private CombinationActivityMapper combinationActivityMapper; - @Resource - private CombinationProductMapper combinationProductMapper; - - @Resource - private ProductSpuApi productSpuApi; - @Resource - private ProductSkuApi productSkuApi; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createCombinationActivity(CombinationActivityCreateReqVO createReqVO) { - // 校验商品 SPU 是否存在是否参加的别的活动 - validateProductConflict(createReqVO.getSpuId(), null); - // 校验商品是否存在 - validateProductExists(createReqVO.getSpuId(), createReqVO.getProducts()); - - // 插入拼团活动 - CombinationActivityDO activity = CombinationActivityConvert.INSTANCE.convert(createReqVO) - .setStatus(CommonStatusEnum.ENABLE.getStatus()) - .setTotalCount(0).setSuccessCount(0).setOrderUserCount(0).setVirtualGroup(0); - combinationActivityMapper.insert(activity); - // 插入商品 - List products = CombinationActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), activity); - combinationProductMapper.insertBatch(products); - // 返回 - return activity.getId(); - } - - /** - * 校验拼团商品参与的活动是否存在冲突 - * - * @param spuId 商品 SPU 编号 - * @param activityId 拼团活动编号 - */ - private void validateProductConflict(Long spuId, Long activityId) { - // 查询所有开启的拼团活动 - List activityList = combinationActivityMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); - if (activityId != null) { // 时排除自己 - activityList.removeIf(item -> ObjectUtil.equal(item.getId(), activityId)); - } - // 查找是否有其它活动,选择了该产品 - List matchActivityList = filterList(activityList, activity -> ObjectUtil.equal(activity.getId(), spuId)); - if (CollUtil.isNotEmpty(matchActivityList)) { - throw exception(COMBINATION_ACTIVITY_SPU_CONFLICTS); - } - } - - /** - * 校验拼团商品是否都存在 - * - * @param spuId 商品 SPU 编号 - * @param products 秒杀商品 - */ - private void validateProductExists(Long spuId, List products) { - // 1. 校验商品 spu 是否存在 - ProductSpuRespDTO spu = productSpuApi.getSpu(spuId); - if (spu == null) { - throw exception(SPU_NOT_EXISTS); - } - - // 2. 校验商品 sku 都存在 - Map skuMap = convertMap(productSkuApi.getSkuListBySpuId(singletonList(spuId)), - ProductSkuRespDTO::getId); - products.forEach(product -> { - if (!skuMap.containsKey(product.getSkuId())) { - throw exception(SKU_NOT_EXISTS); - } - }); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCombinationActivity(CombinationActivityUpdateReqVO updateReqVO) { - // 校验存在 - CombinationActivityDO activityDO = validateCombinationActivityExists(updateReqVO.getId()); - // 校验状态 - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { - throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE); - } - // 校验商品冲突 - validateProductConflict(updateReqVO.getSpuId(), updateReqVO.getId()); - // 校验商品是否存在 - validateProductExists(updateReqVO.getSpuId(), updateReqVO.getProducts()); - - // 更新活动 - CombinationActivityDO updateObj = CombinationActivityConvert.INSTANCE.convert(updateReqVO); - combinationActivityMapper.updateById(updateObj); - // 更新商品 - updateCombinationProduct(updateObj, updateReqVO.getProducts()); - } - - /** - * 更新拼团商品 - * - * @param activity 拼团活动 - * @param products 该活动的最新商品配置 - */ - private void updateCombinationProduct(CombinationActivityDO activity, List products) { - // 第一步,对比新老数据,获得添加、修改、删除的列表 - List newList = CombinationActivityConvert.INSTANCE.convertList(products, activity); - List oldList = combinationProductMapper.selectListByActivityIds(CollUtil.newArrayList(activity.getId())); - List> diffList = CollectionUtils.diffList(oldList, newList, (oldVal, newVal) -> { - boolean same = ObjectUtil.equal(oldVal.getSkuId(), newVal.getSkuId()); - if (same) { - newVal.setId(oldVal.getId()); - } - return same; - }); - - // 第二步,批量添加、修改、删除 - if (CollUtil.isNotEmpty(diffList.get(0))) { - combinationProductMapper.insertBatch(diffList.get(0)); - } - if (CollUtil.isNotEmpty(diffList.get(1))) { - combinationProductMapper.updateBatch(diffList.get(1)); - } - if (CollUtil.isNotEmpty(diffList.get(2))) { - combinationProductMapper.deleteBatchIds(CollectionUtils.convertList(diffList.get(2), CombinationProductDO::getId)); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCombinationActivity(Long id) { - // 校验存在 - CombinationActivityDO activityDO = validateCombinationActivityExists(id); - // 校验状态 - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { - throw exception(COMBINATION_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); - } - - // 删除 - combinationActivityMapper.deleteById(id); - } - - @Override - public CombinationActivityDO validateCombinationActivityExists(Long id) { - CombinationActivityDO activityDO = combinationActivityMapper.selectById(id); - if (activityDO == null) { - throw exception(COMBINATION_ACTIVITY_NOT_EXISTS); - } - return activityDO; - } - - @Override - public CombinationActivityDO getCombinationActivity(Long id) { - return validateCombinationActivityExists(id); - } - - @Override - public PageResult getCombinationActivityPage(CombinationActivityPageReqVO pageReqVO) { - return combinationActivityMapper.selectPage(pageReqVO); - } - - @Override - public List getCombinationProductsByActivityIds(Collection activityIds) { - return combinationProductMapper.selectListByActivityIds(activityIds); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordService.java deleted file mode 100644 index b3b37164..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.win.module.promotion.service.combination; - -import com.win.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; -import com.win.module.promotion.dal.dataobject.combination.CombinationRecordDO; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 拼团记录 Service 接口 - * - * @author HUIHUI - */ -public interface CombinationRecordService { - - /** - * 更新拼团状态 - * - * @param status 状态 - * @param userId 用户编号 - * @param orderId 订单编号 - */ - void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId); - - /** - * 创建拼团记录 - * - * @param reqDTO 创建信息 - */ - void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO); - - /** - * 更新拼团状态和开始时间 - * - * @param status 状态 - * @param userId 用户编号 - * @param orderId 订单编号 - * @param startTime 开始时间 - */ - void updateRecordStatusAndStartTimeByUserIdAndOrderId(Integer status, Long userId, Long orderId, LocalDateTime startTime); - - /** - * 获得拼团状态 - * - * @param userId 用户编号 - * @param orderId 订单编号 - * @return 拼团状态 - */ - CombinationRecordDO getCombinationRecord(Long userId, Long orderId); - - /** - * 获取拼团记录 - * - * @param userId 用户 id - * @param activityId 活动 id - * @return 拼团记录列表 - */ - List getRecordListByUserIdAndActivityId(Long userId, Long activityId); - - /** - * 验证组合限制数 - * 校验是否满足限购要求 - * - * @param count 本次购买数量 - * @param sumCount 已购买数量合计 - * @param activityId 活动编号 - */ - void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordServiceImpl.java deleted file mode 100644 index 5d145411..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.win.module.promotion.service.combination; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; -import com.win.module.promotion.convert.combination.CombinationActivityConvert; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import com.win.module.promotion.dal.dataobject.combination.CombinationRecordDO; -import com.win.module.promotion.dal.mysql.combination.CombinationRecordMapper; -import com.win.module.promotion.enums.combination.CombinationRecordStatusEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; - -// TODO 芋艿:等拼团记录做完,完整 review 下 - -/** - * 拼团记录 Service 实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class CombinationRecordServiceImpl implements CombinationRecordService { - - @Resource - private CombinationActivityService combinationActivityService; - - @Resource - private CombinationRecordMapper recordMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) { - // 校验拼团是否存在 - CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId); - - // 更新状态 - recordDO.setStatus(status); - recordMapper.updateById(recordDO); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateRecordStatusAndStartTimeByUserIdAndOrderId(Integer status, Long userId, Long orderId, LocalDateTime startTime) { - CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId); - // 更新状态 - recordDO.setStatus(status); - // 更新开始时间 - recordDO.setStartTime(startTime); - recordMapper.updateById(recordDO); - - // 更新拼团参入人数 - List recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), status); - if (CollUtil.isNotEmpty(recordDOs)) { - recordDOs.forEach(item -> { - item.setUserCount(recordDOs.size()); - // 校验拼团是否满足要求 - if (ObjectUtil.equal(recordDOs.size(), recordDO.getUserSize())) { - item.setStatus(CombinationRecordStatusEnum.SUCCESS.getStatus()); - } - }); - } - recordMapper.updateBatch(recordDOs); - } - - private CombinationRecordDO validateCombinationRecord(Long userId, Long orderId) { - // 校验拼团是否存在 - CombinationRecordDO recordDO = recordMapper.selectByUserIdAndOrderId(userId, orderId); - if (recordDO == null) { - throw exception(COMBINATION_RECORD_NOT_EXISTS); - } - return recordDO; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) { - // 1.1 校验拼团活动 - CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(reqDTO.getActivityId()); - // 1.2 需要校验下,他当前是不是已经参加了该拼团; - CombinationRecordDO recordDO = recordMapper.selectByUserIdAndOrderId(reqDTO.getUserId(), reqDTO.getOrderId()); - if (recordDO != null) { - throw exception(COMBINATION_RECORD_EXISTS); - } - // 1.3 校验用户是否参加了其它拼团 - List recordDOList = recordMapper.selectListByUserIdAndStatus(reqDTO.getUserId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus()); - if (CollUtil.isNotEmpty(recordDOList)) { - throw exception(COMBINATION_RECORD_FAILED_HAVE_JOINED); - } - // 1.4 校验当前活动是否过期 - if (LocalDateTime.now().isAfter(activity.getEndTime())) { - throw exception(COMBINATION_RECORD_FAILED_TIME_END); - } - // 1.5 父拼团是否存在,是否已经满了 - if (reqDTO.getHeadId() != null) { - // 查询进行中的父拼团 - CombinationRecordDO recordDO1 = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus()); - if (recordDO1 == null) { - throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS); - } - // 校验拼团是否满足要求 - if (ObjectUtil.equal(recordDO1.getUserCount(), recordDO1.getUserSize())) { - throw exception(COMBINATION_RECORD_USER_FULL); - } - } - - // 2. 创建拼团记录 - CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO); - record.setVirtualGroup(false); - record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration())); - record.setUserSize(activity.getUserSize()); - recordMapper.insert(record); - } - - @Override - public CombinationRecordDO getCombinationRecord(Long userId, Long orderId) { - return validateCombinationRecord(userId, orderId); - } - - @Override - public List getRecordListByUserIdAndActivityId(Long userId, Long activityId) { - return recordMapper.selectListByUserIdAndActivityId(userId, activityId); - } - - @Override - public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) { - // 1.1 校验拼团活动 - CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(activityId); - // 校验是否达到限购总限购标准 - if ((sumCount + count) > activity.getTotalLimitCount()) { - throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED); - } - // 单次购买是否达到限购标准 - if (count > activity.getSingleLimitCount()) { - throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED); - } - } - - /** - * APP 端获取开团记录 - * - * @return 开团记录 - */ - public List getRecordListByStatus(Integer status) { - return recordMapper.selectListByStatus(status); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponService.java deleted file mode 100644 index dc0709ac..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponService.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.win.module.promotion.service.coupon; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.enums.coupon.CouponTakeTypeEnum; - -import java.util.List; -import java.util.Set; - -/** - * 优惠劵 Service 接口 - * - * @author 芋道源码 - */ -public interface CouponService { - - /** - * 校验优惠劵,包括状态、有限期 - * - * 1. 如果校验通过,则返回优惠劵信息 - * 2. 如果校验不通过,则直接抛出业务异常 - * - * @param id 优惠劵编号 - * @param userId 用户编号 - * @return 优惠劵信息 - */ - CouponDO validCoupon(Long id, Long userId); - - /** - * 校验优惠劵,包括状态、有限期 - * - * @see #validCoupon(Long, Long) 逻辑相同,只是入参不同 - * - * @param coupon 优惠劵 - */ - void validCoupon(CouponDO coupon); - - /** - * 获得优惠劵分页 - * - * @param pageReqVO 分页查询 - * @return 优惠劵分页 - */ - PageResult getCouponPage(CouponPageReqVO pageReqVO); - - /** - * 使用优惠劵 - * - * @param id 优惠劵编号 - * @param userId 用户编号 - * @param orderId 订单编号 - */ - void useCoupon(Long id, Long userId, Long orderId); - - /** - * 退还已使用的优惠券 - * - * @param id 优惠券编号 - */ - void returnUsedCoupon(Long id); - - /** - * 回收优惠劵 - * - * @param id 优惠劵编号 - */ - void deleteCoupon(Long id); - - /** - * 获得用户的优惠劵列表 - * - * @param userId 用户编号 - * @param status 优惠劵状态 - * @return 优惠劵列表 - */ - List getCouponList(Long userId, Integer status); - - /** - * 获得未使用的优惠劵数量 - * - * @param userId 用户编号 - * @return 未使用的优惠劵数量 - */ - Long getUnusedCouponCount(Long userId); - - /** - * 领取优惠券 - * - * @param templateId 优惠券模板编号 - * @param userIds 用户编号列表 - * @param takeType 领取方式 - */ - void takeCoupon(Long templateId, Set userIds, CouponTakeTypeEnum takeType); - - /** - * 【管理员】给用户发送优惠券 - * - * @param templateId 优惠券模板编号 - * @param userIds 用户编号列表 - */ - default void takeCouponByAdmin(Long templateId, Set userIds) { - takeCoupon(templateId, userIds, CouponTakeTypeEnum.ADMIN); - } - - /** - * 【会员】领取优惠券 - * - * @param templateId 优惠券模板编号 - * @param userId 用户编号 - */ - default void takeCouponByUser(Long templateId, Long userId) { - takeCoupon(templateId, CollUtil.newHashSet(userId), CouponTakeTypeEnum.USER); - } - - /** - * 【系统】给用户发送新人券 - * - * @param templateId 优惠券模板编号 - * @param userId 用户编号列表 - */ - default void takeCouponByRegister(Long templateId, Long userId) { - takeCoupon(templateId, CollUtil.newHashSet(userId), CouponTakeTypeEnum.REGISTER); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponServiceImpl.java deleted file mode 100644 index e60c3a53..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponServiceImpl.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.win.module.promotion.service.coupon; - -import cn.hutool.core.collection.CollStreamUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO; -import com.win.module.promotion.convert.coupon.CouponConvert; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import com.win.module.promotion.dal.mysql.coupon.CouponMapper; -import com.win.module.promotion.enums.coupon.CouponStatusEnum; -import com.win.module.promotion.enums.coupon.CouponTakeTypeEnum; -import com.win.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; -import static java.util.Arrays.asList; - -/** - * 优惠劵 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class CouponServiceImpl implements CouponService { - - @Resource - private CouponTemplateService couponTemplateService; - - @Resource - private CouponMapper couponMapper; - - @Resource - private MemberUserApi memberUserApi; - - @Override - public CouponDO validCoupon(Long id, Long userId) { - CouponDO coupon = couponMapper.selectByIdAndUserId(id, userId); - if (coupon == null) { - throw exception(COUPON_NOT_EXISTS); - } - validCoupon(coupon); - return coupon; - } - - @Override - public void validCoupon(CouponDO coupon) { - // 校验状态 - if (ObjectUtil.notEqual(coupon.getStatus(), CouponStatusEnum.UNUSED.getStatus())) { - throw exception(COUPON_STATUS_NOT_UNUSED); - } - // 校验有效期;为避免定时器没跑,实际优惠劵已经过期 - if (LocalDateTimeUtils.isBetween(coupon.getValidStartTime(), coupon.getValidEndTime())) { - throw exception(COUPON_VALID_TIME_NOT_NOW); - } - } - - @Override - public PageResult getCouponPage(CouponPageReqVO pageReqVO) { - // 获得用户编号 - Set userIds = null; - if (StrUtil.isNotEmpty(pageReqVO.getNickname())) { - userIds = CollectionUtils.convertSet(memberUserApi.getUserListByNickname(pageReqVO.getNickname()), - MemberUserRespDTO::getId); - if (CollUtil.isEmpty(userIds)) { - return PageResult.empty(); - } - } - // 分页查询 - return couponMapper.selectPage(pageReqVO, userIds); - } - - @Override - public void useCoupon(Long id, Long userId, Long orderId) { - // 校验优惠劵 - validCoupon(id, userId); - - // 更新状态 - int updateCount = couponMapper.updateByIdAndStatus(id, CouponStatusEnum.UNUSED.getStatus(), - new CouponDO().setStatus(CouponStatusEnum.USED.getStatus()) - .setUseOrderId(orderId).setUseTime(LocalDateTime.now())); - if (updateCount == 0) { - throw exception(COUPON_STATUS_NOT_UNUSED); - } - } - - @Override - public void returnUsedCoupon(Long id) { - // 校验存在 - CouponDO coupon = couponMapper.selectById(id); - if (coupon == null) { - throw exception(COUPON_NOT_EXISTS); - } - // 校验状态 - if (ObjectUtil.notEqual(coupon.getTemplateId(), CouponStatusEnum.USED.getStatus())) { - throw exception(COUPON_STATUS_NOT_USED); - } - - // 退还 - Integer status = LocalDateTimeUtils.beforeNow(coupon.getValidEndTime()) - ? CouponStatusEnum.EXPIRE.getStatus() // 退还时可能已经过期了 - : CouponStatusEnum.UNUSED.getStatus(); - int updateCount = couponMapper.updateByIdAndStatus(id, CouponStatusEnum.UNUSED.getStatus(), - new CouponDO().setStatus(status)); - if (updateCount == 0) { - throw exception(COUPON_STATUS_NOT_USED); - } - - // TODO 增加优惠券变动记录? - } - - @Override - @Transactional - public void deleteCoupon(Long id) { - // 校验存在 - validateCouponExists(id); - - // 更新优惠劵 - int deleteCount = couponMapper.delete(id, - asList(CouponStatusEnum.UNUSED.getStatus(), CouponStatusEnum.EXPIRE.getStatus())); - if (deleteCount == 0) { - throw exception(COUPON_DELETE_FAIL_USED); - } - // 减少优惠劵模板的领取数量 -1 - couponTemplateService.updateCouponTemplateTakeCount(id, -1); - } - - @Override - public List getCouponList(Long userId, Integer status) { - return couponMapper.selectListByUserIdAndStatus(userId, status); - } - - private void validateCouponExists(Long id) { - if (couponMapper.selectById(id) == null) { - throw exception(COUPON_NOT_EXISTS); - } - } - - @Override - public Long getUnusedCouponCount(Long userId) { - return couponMapper.selectCountByUserIdAndStatus(userId, CouponStatusEnum.UNUSED.getStatus()); - } - - @Override - public void takeCoupon(Long templateId, Set userIds, CouponTakeTypeEnum takeType) { - CouponTemplateDO template = couponTemplateService.getCouponTemplate(templateId); - // 1. 过滤掉达到领取限制的用户 - removeTakeLimitUser(userIds, template); - // 2. 校验优惠劵是否可以领取 - validateCouponTemplateCanTake(template, userIds, takeType); - - // 3. 批量保存优惠劵 - couponMapper.insertBatch(convertList(userIds, userId -> CouponConvert.INSTANCE.convert(template, userId))); - - // 3. 增加优惠劵模板的领取数量 - couponTemplateService.updateCouponTemplateTakeCount(templateId, userIds.size()); - } - - /** - * 校验优惠券是否可以领取 - * - * @param couponTemplate 优惠券模板 - * @param userIds 领取人列表 - * @param takeType 领取方式 - */ - private void validateCouponTemplateCanTake(CouponTemplateDO couponTemplate, Set userIds, CouponTakeTypeEnum takeType) { - // 如果所有用户都领取过,则抛出异常 - if (CollUtil.isEmpty(userIds)) { - throw exception(COUPON_TEMPLATE_USER_ALREADY_TAKE); - } - - // 校验模板 - if (couponTemplate == null) { - throw exception(COUPON_TEMPLATE_NOT_EXISTS); - } - // 校验剩余数量 - if (couponTemplate.getTakeCount() + userIds.size() > couponTemplate.getTotalCount()) { - throw exception(COUPON_TEMPLATE_NOT_ENOUGH); - } - // 校验"固定日期"的有效期类型是否过期 - if (CouponTemplateValidityTypeEnum.DATE.getType().equals(couponTemplate.getValidityType())) { - if (LocalDateTimeUtils.beforeNow(couponTemplate.getValidEndTime())) { - throw exception(COUPON_TEMPLATE_EXPIRED); - } - } - // 校验领取方式 - if (ObjectUtil.notEqual(couponTemplate.getTakeType(), takeType.getValue())) { - throw exception(COUPON_TEMPLATE_CANNOT_TAKE); - } - } - - /** - * 过滤掉达到领取上线的用户 - * - * @param userIds 用户编号数组 - * @param couponTemplate 优惠劵模版 - */ - private void removeTakeLimitUser(Set userIds, CouponTemplateDO couponTemplate) { - if (couponTemplate.getTakeLimitCount() <= 0) { - return; - } - // 查询已领过券的用户 - List alreadyTakeCoupons = couponMapper.selectListByTemplateIdAndUserId(couponTemplate.getId(), userIds); - if (CollUtil.isEmpty(alreadyTakeCoupons)) { - return; - } - // 移除达到领取限制的用户 - Map userTakeCountMap = CollStreamUtil.groupBy(alreadyTakeCoupons, CouponDO::getUserId, Collectors.summingInt(c -> 1)); - userIds.removeIf(userId -> MapUtil.getInt(userTakeCountMap, userId, 0) >= couponTemplate.getTakeLimitCount()); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateService.java deleted file mode 100644 index 76b3f542..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateService.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.win.module.promotion.service.coupon; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateCreateReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; - -import javax.validation.Valid; - -/** - * 优惠劵模板 Service 接口 - * - * @author 芋道源码 - */ -public interface CouponTemplateService { - - /** - * 创建优惠劵模板 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createCouponTemplate(@Valid CouponTemplateCreateReqVO createReqVO); - - /** - * 更新优惠劵模板 - * - * @param updateReqVO 更新信息 - */ - void updateCouponTemplate(@Valid CouponTemplateUpdateReqVO updateReqVO); - - /** - * 更新优惠劵模板的状态 - * - * @param id 编号 - * @param status 状态 - */ - void updateCouponTemplateStatus(Long id, Integer status); - - /** - * 删除优惠劵模板 - * - * @param id 编号 - */ - void deleteCouponTemplate(Long id); - - /** - * 获得优惠劵模板 - * - * @param id 编号 - * @return 优惠劵模板 - */ - CouponTemplateDO getCouponTemplate(Long id); - - /** - * 获得优惠劵模板分页 - * - * @param pageReqVO 分页查询 - * @return 优惠劵模板分页 - */ - PageResult getCouponTemplatePage(CouponTemplatePageReqVO pageReqVO); - - /** - * 更新优惠劵模板的领取数量 - * - * @param id 优惠劵模板编号 - * @param incrCount 增加数量 - */ - void updateCouponTemplateTakeCount(Long id, int incrCount); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImpl.java deleted file mode 100644 index a06b2441..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.win.module.promotion.service.coupon; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateCreateReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO; -import com.win.module.promotion.convert.coupon.CouponTemplateConvert; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import com.win.module.promotion.dal.mysql.coupon.CouponTemplateMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_TEMPLATE_TOTAL_COUNT_TOO_SMALL; - -/** - * 优惠劵模板 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class CouponTemplateServiceImpl implements CouponTemplateService { - - @Resource - private CouponTemplateMapper couponTemplateMapper; - - @Override - public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) { - // 插入 - CouponTemplateDO couponTemplate = CouponTemplateConvert.INSTANCE.convert(createReqVO) - .setStatus(CommonStatusEnum.ENABLE.getStatus()); - couponTemplateMapper.insert(couponTemplate); - // 返回 - return couponTemplate.getId(); - } - - @Override - public void updateCouponTemplate(CouponTemplateUpdateReqVO updateReqVO) { - // 校验存在 - CouponTemplateDO couponTemplate = validateCouponTemplateExists(updateReqVO.getId()); - // 校验发放数量不能过小 - if (updateReqVO.getTotalCount() < couponTemplate.getTakeCount()) { - throw exception(COUPON_TEMPLATE_TOTAL_COUNT_TOO_SMALL, couponTemplate.getTakeCount()); - } - - // 更新 - CouponTemplateDO updateObj = CouponTemplateConvert.INSTANCE.convert(updateReqVO); - couponTemplateMapper.updateById(updateObj); - } - - @Override - public void updateCouponTemplateStatus(Long id, Integer status) { - // 校验存在 - validateCouponTemplateExists(id); - // 更新 - couponTemplateMapper.updateById(new CouponTemplateDO().setId(id).setStatus(status)); - } - - @Override - public void deleteCouponTemplate(Long id) { - // 校验存在 - validateCouponTemplateExists(id); - // 删除 - couponTemplateMapper.deleteById(id); - } - - private CouponTemplateDO validateCouponTemplateExists(Long id) { - CouponTemplateDO couponTemplate = couponTemplateMapper.selectById(id); - if (couponTemplate == null) { - throw exception(COUPON_TEMPLATE_NOT_EXISTS); - } - return couponTemplate; - } - - @Override - public CouponTemplateDO getCouponTemplate(Long id) { - return couponTemplateMapper.selectById(id); - } - - @Override - public PageResult getCouponTemplatePage(CouponTemplatePageReqVO pageReqVO) { - return couponTemplateMapper.selectPage(pageReqVO); - } - - @Override - public void updateCouponTemplateTakeCount(Long id, int incrCount) { - couponTemplateMapper.updateTakeCount(id, incrCount); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentService.java deleted file mode 100644 index 3d0c0842..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.promotion.service.decorate; - -import com.win.module.promotion.controller.admin.decorate.vo.DecorateComponentSaveReqVO; -import com.win.module.promotion.dal.dataobject.decorate.DecorateComponentDO; -import com.win.module.promotion.enums.decorate.DecoratePageEnum; - -import java.util.List; - -/** - * 装修组件 Service 接口 - * - * @author jason - */ -public interface DecorateComponentService { - - /** - * 保存页面的组件信息 - * - * @param reqVO 请求 VO - */ - void saveDecorateComponent(DecorateComponentSaveReqVO reqVO); - - /** - * 根据页面 id,获取页面的组件信息 - * - * @param page 页面编号 {@link DecoratePageEnum#getPage()} - * @param status 状态 - */ - List getDecorateComponentListByPage(Integer page, Integer status); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImpl.java deleted file mode 100644 index 5bfb2c5d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.promotion.service.decorate; - -import com.win.module.promotion.controller.admin.decorate.vo.DecorateComponentSaveReqVO; -import com.win.module.promotion.convert.decorate.DecorateComponentConvert; -import com.win.module.promotion.dal.dataobject.decorate.DecorateComponentDO; -import com.win.module.promotion.dal.mysql.decorate.DecorateComponentMapper; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 装修组件 Service 实现 - * - * @author jason - */ -@Service -public class DecorateComponentServiceImpl implements DecorateComponentService { - - @Resource - private DecorateComponentMapper decorateComponentMapper; - - @Override - public void saveDecorateComponent(DecorateComponentSaveReqVO reqVO) { - // 1. 如果存在,则进行更新 - DecorateComponentDO dbComponent = decorateComponentMapper.selectByPageAndCode(reqVO.getPage(), reqVO.getCode()); - if (dbComponent != null) { - decorateComponentMapper.updateById(DecorateComponentConvert.INSTANCE.convert(reqVO).setId(dbComponent.getId())); - return; - } - // 2. 不存在,则进行新增 - decorateComponentMapper.insert(DecorateComponentConvert.INSTANCE.convert(reqVO)); - } - - @Override - public List getDecorateComponentListByPage(Integer page, Integer status) { - return decorateComponentMapper.selectListByPageAndStatus(page, status); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityService.java deleted file mode 100644 index c323268c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.win.module.promotion.service.discount; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.discount.DiscountActivityDO; -import com.win.module.promotion.dal.dataobject.discount.DiscountProductDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 限时折扣 Service 接口 - * - * @author 芋道源码 - */ -public interface DiscountActivityService { - - /** - * 基于指定 SKU 编号数组,获得匹配的限时折扣商品 - * - * 注意,匹配的条件,仅仅是日期符合,并且处于开启状态 - * - * @param skuIds SKU 编号数组 - * @return 匹配的限时折扣商品 - */ - List getMatchDiscountProductList(Collection skuIds); - - /** - * 创建限时折扣活动 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDiscountActivity(@Valid DiscountActivityCreateReqVO createReqVO); - - /** - * 更新限时折扣活动 - * - * @param updateReqVO 更新信息 - */ - void updateDiscountActivity(@Valid DiscountActivityUpdateReqVO updateReqVO); - - /** - * 关闭限时折扣活动 - * - * @param id 编号 - */ - void closeRewardActivity(Long id); - - /** - * 删除限时折扣活动 - * - * @param id 编号 - */ - void deleteDiscountActivity(Long id); - - /** - * 获得限时折扣活动 - * - * @param id 编号 - * @return 限时折扣活动 - */ - DiscountActivityDO getDiscountActivity(Long id); - - /** - * 获得限时折扣活动分页 - * - * @param pageReqVO 分页查询 - * @return 限时折扣活动分页 - */ - PageResult getDiscountActivityPage(DiscountActivityPageReqVO pageReqVO); - - /** - * 获得活动编号,对应对应的商品列表 - * - * @param activityId 活动编号 - * @return 活动的商品列表 - */ - List getDiscountProductsByActivityId(Long activityId); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityServiceImpl.java deleted file mode 100644 index 67ae285f..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/discount/DiscountActivityServiceImpl.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.win.module.promotion.service.discount; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; -import com.win.module.promotion.convert.discount.DiscountActivityConvert; -import com.win.module.promotion.dal.dataobject.discount.DiscountActivityDO; -import com.win.module.promotion.dal.dataobject.discount.DiscountProductDO; -import com.win.module.promotion.dal.mysql.discount.DiscountActivityMapper; -import com.win.module.promotion.dal.mysql.discount.DiscountProductMapper; -import com.win.module.promotion.enums.common.PromotionActivityStatusEnum; -import com.win.module.promotion.util.PromotionUtils; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; - -/** - * 限时折扣 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class DiscountActivityServiceImpl implements DiscountActivityService { - - @Resource - private DiscountActivityMapper discountActivityMapper; - @Resource - private DiscountProductMapper discountProductMapper; - - @Override - public List getMatchDiscountProductList(Collection skuIds) { - // TODO 芋艿:开启、满足 skuId、日期内 - return null; - } - - @Override - public Long createDiscountActivity(DiscountActivityCreateReqVO createReqVO) { - // 校验商品是否冲突 - validateDiscountActivityProductConflicts(null, createReqVO.getProducts()); - - // 插入活动 - DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime())); - discountActivityMapper.insert(discountActivity); - // 插入商品 - List discountProducts = convertList(createReqVO.getProducts(), - product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(discountActivity.getId())); - discountProductMapper.insertBatch(discountProducts); - // 返回 - return discountActivity.getId(); - } - - @Override - public void updateDiscountActivity(DiscountActivityUpdateReqVO updateReqVO) { - // 校验存在 - DiscountActivityDO discountActivity = validateDiscountActivityExists(updateReqVO.getId()); - if (discountActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能修改噢 - throw exception(DISCOUNT_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); - } - // 校验商品是否冲突 - validateDiscountActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); - - // 更新活动 - DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime())); - discountActivityMapper.updateById(updateObj); - // 更新商品 - updateDiscountProduct(updateReqVO); - } - - private void updateDiscountProduct(DiscountActivityUpdateReqVO updateReqVO) { - List dbDiscountProducts = discountProductMapper.selectListByActivityId(updateReqVO.getId()); - // 计算要删除的记录 - List deleteIds = convertList(dbDiscountProducts, DiscountProductDO::getId, - discountProductDO -> updateReqVO.getProducts().stream() - .noneMatch(product -> DiscountActivityConvert.INSTANCE.isEquals(discountProductDO, product))); - if (CollUtil.isNotEmpty(deleteIds)) { - discountProductMapper.deleteBatchIds(deleteIds); - } - // 计算新增的记录 - List newDiscountProducts = convertList(updateReqVO.getProducts(), - product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId())); - newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch( - dbProduct -> DiscountActivityConvert.INSTANCE.isEquals(dbProduct, product))); // 如果匹配到,说明是更新的 - if (CollectionUtil.isNotEmpty(newDiscountProducts)) { - discountProductMapper.insertBatch(newDiscountProducts); - } - } - - // TODO 芋艿:校验逻辑简化,只查询时间冲突的活动,开启状态的。 - /** - * 校验商品是否冲突 - * - * @param id 编号 - * @param products 商品列表 - */ - private void validateDiscountActivityProductConflicts(Long id, List products) { - if (CollUtil.isEmpty(products)) { - return; - } - // 查询商品参加的活动 - List discountActivityProductList = null; -// getRewardProductListBySkuIds( -// convertSet(products, DiscountActivityBaseVO.Product::getSkuId), -// asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus())); - if (id != null) { // 排除自己这个活动 - discountActivityProductList.removeIf(product -> id.equals(product.getActivityId())); - } - // 如果非空,则说明冲突 - if (CollUtil.isNotEmpty(discountActivityProductList)) { - throw exception(DISCOUNT_ACTIVITY_SPU_CONFLICTS); - } - } - - @Override - public void closeRewardActivity(Long id) { - // 校验存在 - DiscountActivityDO dbDiscountActivity = validateDiscountActivityExists(id); - if (dbDiscountActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能关闭噢 - throw exception(DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED); - } - if (dbDiscountActivity.getStatus().equals(PromotionActivityStatusEnum.END.getStatus())) { // 已关闭的活动,不能关闭噢 - throw exception(DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_END); - } - - // 更新为关闭。 - DiscountActivityDO updateObj = new DiscountActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); - discountActivityMapper.updateById(updateObj); - } - - @Override - public void deleteDiscountActivity(Long id) { - // 校验存在 - DiscountActivityDO discountActivity = validateDiscountActivityExists(id); - if (!discountActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 未关闭的活动,不能删除噢 - throw exception(DISCOUNT_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED); - } - - // 删除 - discountActivityMapper.deleteById(id); - } - - private DiscountActivityDO validateDiscountActivityExists(Long id) { - DiscountActivityDO discountActivity = discountActivityMapper.selectById(id); - if (discountActivity == null) { - throw exception(DISCOUNT_ACTIVITY_NOT_EXISTS); - } - return discountActivity; - } - - @Override - public DiscountActivityDO getDiscountActivity(Long id) { - return discountActivityMapper.selectById(id); - } - - @Override - public PageResult getDiscountActivityPage(DiscountActivityPageReqVO pageReqVO) { - return discountActivityMapper.selectPage(pageReqVO); - } - - @Override - public List getDiscountProductsByActivityId(Long activityId) { - return discountProductMapper.selectListByActivityId(activityId); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceService.java deleted file mode 100644 index a78699ad..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.promotion.service.price; - -import com.win.module.promotion.api.price.dto.CouponMeetRespDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateReqDTO; - -import java.util.List; - -/** - * 价格计算 Service 接口 - * - * @author 芋道源码 - */ -public interface PriceService { - - /** - * 获得优惠劵的匹配信息列表 - * - * @param calculateReqDTO 价格请求 - * @return 价格响应 - */ - List getMeetCouponList(PriceCalculateReqDTO calculateReqDTO); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceServiceImpl.java deleted file mode 100644 index 0b26583b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/price/PriceServiceImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.promotion.service.price; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.exception.ServiceException; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.promotion.api.price.dto.CouponMeetRespDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateReqDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateRespDTO; -import com.win.module.promotion.convert.price.PriceConvert; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.enums.coupon.CouponStatusEnum; -import com.win.module.promotion.service.coupon.CouponService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collections; -import java.util.List; - -import static com.win.framework.common.util.collection.CollectionUtils.getSumValue; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_VALID_TIME_NOT_NOW; - -/** - * 价格计算 Service 实现类 - * - * 优惠计算顺序:min(限时折扣, 会员折扣) > 满减送 > 优惠券。 - * 参考文档: - * 1. 有赞文档:限时折扣、满减送、优惠券哪个优先计算? - * - * TODO 芋艿:进一步完善 - * 1. 限时折扣:指定金额、减免金额、折扣 - * 2. 满减送:循环、折扣 - * 3. 优惠劵:待定 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class PriceServiceImpl implements PriceService { - - @Resource - private CouponService couponService; - - @Override - public List getMeetCouponList(PriceCalculateReqDTO calculateReqDTO) { - // 先计算一轮价格 -// PriceCalculateRespDTO priceCalculate = calculatePrice(calculateReqDTO); - PriceCalculateRespDTO priceCalculate = null; - - // 获得用户的待使用优惠劵 - List couponList = couponService.getCouponList(calculateReqDTO.getUserId(), CouponStatusEnum.UNUSED.getStatus()); - if (CollUtil.isEmpty(couponList)) { - return Collections.emptyList(); - } - - // 获得优惠劵的匹配信息 - return CollectionUtils.convertList(couponList, coupon -> { - CouponMeetRespDTO couponMeetRespDTO = PriceConvert.INSTANCE.convert(coupon); - try { - // 校验优惠劵 - couponService.validCoupon(coupon); - - // 获得匹配的商品 SKU 数组 - // TODO 芋艿:后续处理 -// List orderItems = getMatchCouponOrderItems(priceCalculate, coupon); - List orderItems = null; - if (CollUtil.isEmpty(orderItems)) { - return couponMeetRespDTO.setMeet(false).setMeetTip("所结算商品没有符合条件的商品"); - } - - // 计算是否满足优惠劵的使用金额 - Integer originPrice = getSumValue(orderItems, PriceCalculateRespDTO.OrderItem::getOrderDividePrice, Integer::sum); - assert originPrice != null; - if (originPrice < coupon.getUsePrice()) { - return couponMeetRespDTO.setMeet(false) -// .setMeetTip(String.format("差 %s 元可用优惠劵", formatPrice(coupon.getUsePrice() - originPrice))); - .setMeetTip("所结算的商品中未满足使用的金额"); - } - } catch (ServiceException serviceException) { - couponMeetRespDTO.setMeet(false); - if (serviceException.getCode().equals(COUPON_VALID_TIME_NOT_NOW.getCode())) { - couponMeetRespDTO.setMeetTip("优惠劵未到使用时间"); - } else { - log.error("[getMeetCouponList][calculateReqDTO({}) 获得优惠劵匹配信息异常]", calculateReqDTO, serviceException); - couponMeetRespDTO.setMeetTip("优惠劵不满足使用条件"); - } - return couponMeetRespDTO; - } - // 满足 - return couponMeetRespDTO.setMeet(true); - }); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityService.java deleted file mode 100644 index 0123aee5..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityService.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.promotion.service.reward; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.reward.RewardActivityDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 满减送活动 Service 接口 - * - * @author 芋道源码 - */ -public interface RewardActivityService { - - /** - * 创建满减送活动 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createRewardActivity(@Valid RewardActivityCreateReqVO createReqVO); - - /** - * 更新满减送活动 - * - * @param updateReqVO 更新信息 - */ - void updateRewardActivity(@Valid RewardActivityUpdateReqVO updateReqVO); - - /** - * 关闭满减送活动 - * - * @param id 活动编号 - */ - void closeRewardActivity(Long id); - - /** - * 删除满减送活动 - * - * @param id 编号 - */ - void deleteRewardActivity(Long id); - - /** - * 获得满减送活动 - * - * @param id 编号 - * @return 满减送活动 - */ - RewardActivityDO getRewardActivity(Long id); - - /** - * 获得满减送活动分页 - * - * @param pageReqVO 分页查询 - * @return 满减送活动分页 - */ - PageResult getRewardActivityPage(RewardActivityPageReqVO pageReqVO); - - /** - * 基于指定的 SPU 编号数组,获得它们匹配的满减送活动 - * - * @param spuIds SPU 编号数组 - * @return 满减送活动列表 - */ - List getMatchRewardActivityList(Collection spuIds); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityServiceImpl.java deleted file mode 100644 index 196cad89..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/reward/RewardActivityServiceImpl.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.win.module.promotion.service.reward; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; -import com.win.module.promotion.convert.reward.RewardActivityConvert; -import com.win.module.promotion.dal.dataobject.reward.RewardActivityDO; -import com.win.module.promotion.dal.mysql.reward.RewardActivityMapper; -import com.win.module.promotion.enums.common.PromotionActivityStatusEnum; -import com.win.module.promotion.util.PromotionUtils; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; -import static java.util.Arrays.asList; - -/** - * 满减送活动 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class RewardActivityServiceImpl implements RewardActivityService { - - @Resource - private RewardActivityMapper rewardActivityMapper; - - @Override - public Long createRewardActivity(RewardActivityCreateReqVO createReqVO) { - // 校验商品是否冲突 - validateRewardActivitySpuConflicts(null, createReqVO.getProductSpuIds()); - - // 插入 - RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime())); - rewardActivityMapper.insert(rewardActivity); - // 返回 - return rewardActivity.getId(); - } - - @Override - public void updateRewardActivity(RewardActivityUpdateReqVO updateReqVO) { - // 校验存在 - RewardActivityDO dbRewardActivity = validateRewardActivityExists(updateReqVO.getId()); - if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能修改噢 - throw exception(REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); - } - // 校验商品是否冲突 - validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO.getProductSpuIds()); - - // 更新 - RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime())); - rewardActivityMapper.updateById(updateObj); - } - - @Override - public void closeRewardActivity(Long id) { - // 校验存在 - RewardActivityDO dbRewardActivity = validateRewardActivityExists(id); - if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能关闭噢 - throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED); - } - if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.END.getStatus())) { // 已关闭的活动,不能关闭噢 - throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_END); - } - - // 更新 - RewardActivityDO updateObj = new RewardActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); - rewardActivityMapper.updateById(updateObj); - } - - @Override - public void deleteRewardActivity(Long id) { - // 校验存在 - RewardActivityDO dbRewardActivity = validateRewardActivityExists(id); - if (!dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 未关闭的活动,不能删除噢 - throw exception(REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED); - } - - // 删除 - rewardActivityMapper.deleteById(id); - } - - private RewardActivityDO validateRewardActivityExists(Long id) { - RewardActivityDO activity = rewardActivityMapper.selectById(id); - if (activity == null) { - throw exception(REWARD_ACTIVITY_NOT_EXISTS); - } - return activity; - } - - // TODO @芋艿:逻辑有问题,需要优化;要分成全场、和指定来校验; - /** - * 校验商品参加的活动是否冲突 - * - * @param id 活动编号 - * @param spuIds 商品 SPU 编号数组 - */ - private void validateRewardActivitySpuConflicts(Long id, Collection spuIds) { - if (CollUtil.isEmpty(spuIds)) { - return; - } - // 查询商品参加的活动 - List rewardActivityList = getRewardActivityListBySpuIds(spuIds, - asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus())); - if (id != null) { // 排除自己这个活动 - rewardActivityList.removeIf(activity -> id.equals(activity.getId())); - } - // 如果非空,则说明冲突 - if (CollUtil.isNotEmpty(rewardActivityList)) { - throw exception(REWARD_ACTIVITY_SPU_CONFLICTS); - } - } - - /** - * 获得商品参加的满减送活动的数组 - * - * @param spuIds 商品 SPU 编号数组 - * @param statuses 活动状态数组 - * @return 商品参加的满减送活动的数组 - */ - private List getRewardActivityListBySpuIds(Collection spuIds, - Collection statuses) { - List list = rewardActivityMapper.selectListByStatus(statuses); - return CollUtil.filter(list, activity -> CollUtil.containsAny(activity.getProductSpuIds(), spuIds)); - } - - @Override - public RewardActivityDO getRewardActivity(Long id) { - return rewardActivityMapper.selectById(id); - } - - @Override - public PageResult getRewardActivityPage(RewardActivityPageReqVO pageReqVO) { - return rewardActivityMapper.selectPage(pageReqVO); - } - - @Override - public List getMatchRewardActivityList(Collection spuIds) { - // TODO 芋艿:待实现;先指定,然后再全局的; -// // 如果有全局活动,则直接选择它 -// List allActivities = rewardActivityMapper.selectListByProductScopeAndStatus( -// PromotionProductScopeEnum.ALL.getScope(), PromotionActivityStatusEnum.RUN.getStatus()); -// if (CollUtil.isNotEmpty(allActivities)) { -// return MapUtil.builder(allActivities.get(0), spuIds).build(); -// } -// -// // 查询某个活动参加的活动 -// List productActivityList = getRewardActivityListBySpuIds(spuIds, -// singleton(PromotionActivityStatusEnum.RUN.getStatus())); -// return convertMap(productActivityList, activity -> activity, -// rewardActivityDO -> intersectionDistinct(rewardActivityDO.getProductSpuIds(), spuIds)); // 求交集返回 - return null; - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityService.java deleted file mode 100644 index 27fbe0cf..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityService.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.promotion.service.seckill; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 秒杀活动 Service 接口 - * - * @author halfninety - */ -public interface SeckillActivityService { - - /** - * 创建秒杀活动 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createSeckillActivity(@Valid SeckillActivityCreateReqVO createReqVO); - - /** - * 更新秒杀活动 - * - * @param updateReqVO 更新信息 - */ - void updateSeckillActivity(@Valid SeckillActivityUpdateReqVO updateReqVO); - - /** - * 更新秒杀活动 - * - * @param activityDO 秒杀活动 - */ - void updateSeckillActivity(SeckillActivityDO activityDO); - - /** - * 更新秒杀活动商品 - * - * @param productList 活动商品列表 - */ - void updateSeckillActivityProductList(List productList); - - /** - * 关闭秒杀活动 - * - * @param id 编号 - */ - void closeSeckillActivity(Long id); - - /** - * 删除秒杀活动 - * - * @param id 编号 - */ - void deleteSeckillActivity(Long id); - - /** - * 获得秒杀活动 - * - * @param id 编号 - * @return 秒杀活动 - */ - SeckillActivityDO getSeckillActivity(Long id); - - /** - * 获得秒杀活动分页 - * - * @param pageReqVO 分页查询 - * @return 秒杀活动分页 - */ - PageResult getSeckillActivityPage(SeckillActivityPageReqVO pageReqVO); - - /** - * 通过活动编号获取活动商品 - * - * @param activityId 活动编号 - * @return 活动商品列表 - */ - List getSeckillProductListByActivityId(Long activityId); - - /** - * 通过活动编号获取活动商品 - * - * @param activityIds 活动编号 - * @return 活动商品列表 - */ - List getSeckillProductListByActivityId(Collection activityIds); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityServiceImpl.java deleted file mode 100644 index 80f88b3d..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillActivityServiceImpl.java +++ /dev/null @@ -1,244 +0,0 @@ -package com.win.module.promotion.service.seckill; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO; -import com.win.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; -import com.win.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; -import com.win.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper; -import com.win.module.promotion.util.PromotionUtils; -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 static cn.hutool.core.collection.CollUtil.isNotEmpty; -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.*; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; -import static com.win.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; -import static java.util.Collections.singletonList; - -/** - * 秒杀活动 Service 实现类 - * - * @author halfninety - */ -@Service -@Validated -public class SeckillActivityServiceImpl implements SeckillActivityService { - - @Resource - private SeckillActivityMapper seckillActivityMapper; - @Resource - private SeckillProductMapper seckillProductMapper; - @Resource - private SeckillConfigService seckillConfigService; - @Resource - private ProductSpuApi productSpuApi; - @Resource - private ProductSkuApi productSkuApi; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { - // 校验商品秒杀时段是否冲突 - validateProductConflict(createReqVO.getConfigIds(), createReqVO.getSpuId(), null); - // 校验商品是否存在 - validateProductExists(createReqVO.getSpuId(), createReqVO.getProducts()); - - // 插入秒杀活动 - SeckillActivityDO activity = SeckillActivityConvert.INSTANCE.convert(createReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime())) - .setTotalStock(getSumValue(createReqVO.getProducts(), SeckillProductBaseVO::getStock, Integer::sum)); - seckillActivityMapper.insert(activity); - // 插入商品 - List products = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), activity); - seckillProductMapper.insertBatch(products); - return activity.getId(); - } - - /** - * 校验秒杀商品参与的活动是否存在冲突 - * - * 1. 校验秒杀时段是否存在 - * 2. 秒杀商品是否参加其它活动 - * - * @param configIds 秒杀时段数组 - * @param spuId 商品 SPU 编号 - * @param activityId 秒杀活动编号 - */ - private void validateProductConflict(List configIds, Long spuId, Long activityId) { - // 1. 校验秒杀时段是否存在 - seckillConfigService.validateSeckillConfigExists(configIds); - - // 2.1 查询所有开启的秒杀活动 - List activityList = seckillActivityMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); - if (activityId != null) { // 排除自己 - activityList.removeIf(item -> ObjectUtil.equal(item.getId(), activityId)); - } - // 2.2 过滤出所有 configIds 有交集的活动,判断是否存在重叠 - List conflictActivityList = filterList(activityList, s -> containsAny(s.getConfigIds(), configIds)); - if (isNotEmpty(conflictActivityList)) { - throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS); - } - } - - /** - * 校验秒杀商品是否都存在 - * - * @param spuId 商品 SPU 编号 - * @param products 秒杀商品 - */ - private void validateProductExists(Long spuId, List products) { - // 1. 校验商品 spu 是否存在 - ProductSpuRespDTO spu = productSpuApi.getSpu(spuId); - if (spu == null) { - throw exception(SPU_NOT_EXISTS); - } - - // 2. 校验商品 sku 都存在 - Map skuMap = convertMap(productSkuApi.getSkuListBySpuId(singletonList(spuId)), - ProductSkuRespDTO::getId); - products.forEach(product -> { - if (!skuMap.containsKey(product.getSkuId())) { - throw exception(SKU_NOT_EXISTS); - } - }); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateSeckillActivity(SeckillActivityUpdateReqVO updateReqVO) { - // 校验存在 - SeckillActivityDO seckillActivity = validateSeckillActivityExists(updateReqVO.getId()); - if (CommonStatusEnum.DISABLE.getStatus().equals(seckillActivity.getStatus())) { - throw exception(SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); - } - // 校验商品是否冲突 - validateProductConflict(updateReqVO.getConfigIds(), updateReqVO.getSpuId(), updateReqVO.getId()); - // 校验商品是否存在 - validateProductExists(updateReqVO.getSpuId(), updateReqVO.getProducts()); - - // 更新活动 - SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime())) - .setTotalStock(getSumValue(updateReqVO.getProducts(), SeckillProductBaseVO::getStock, Integer::sum)); - seckillActivityMapper.updateById(updateObj); - // 更新商品 - updateSeckillProduct(updateObj, updateReqVO.getProducts()); - } - - @Override - public void updateSeckillActivity(SeckillActivityDO activityDO) { - seckillActivityMapper.updateById(activityDO); - } - - @Override - public void updateSeckillActivityProductList(List productList) { - seckillProductMapper.updateBatch(productList); - } - - /** - * 更新秒杀商品 - * - * @param activity 秒杀活动 - * @param products 该活动的最新商品配置 - */ - private void updateSeckillProduct(SeckillActivityDO activity, List products) { - // 第一步,对比新老数据,获得添加、修改、删除的列表 - List newList = SeckillActivityConvert.INSTANCE.convertList(products, activity); - List oldList = seckillProductMapper.selectListByActivityId(activity.getId()); - List> diffList = diffList(oldList, newList, (oldVal, newVal) -> { - boolean same = ObjectUtil.equal(oldVal.getSkuId(), newVal.getSkuId()); - if (same) { - newVal.setId(oldVal.getId()); - } - return same; - }); - - // 第二步,批量添加、修改、删除 - if (isNotEmpty(diffList.get(0))) { - seckillProductMapper.insertBatch(diffList.get(0)); - } - if (isNotEmpty(diffList.get(1))) { - seckillProductMapper.updateBatch(diffList.get(1)); - } - if (isNotEmpty(diffList.get(2))) { - seckillProductMapper.deleteBatchIds(convertList(diffList.get(2), SeckillProductDO::getId)); - } - } - - @Override - public void closeSeckillActivity(Long id) { - // 校验存在 - SeckillActivityDO activity = validateSeckillActivityExists(id); - if (CommonStatusEnum.DISABLE.getStatus().equals(activity.getStatus())) { - throw exception(SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED); - } - - // 更新 - SeckillActivityDO updateObj = new SeckillActivityDO().setId(id).setStatus(CommonStatusEnum.DISABLE.getStatus()); - seckillActivityMapper.updateById(updateObj); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteSeckillActivity(Long id) { - // 校验存在 - SeckillActivityDO seckillActivity = this.validateSeckillActivityExists(id); - if (CommonStatusEnum.ENABLE.getStatus().equals(seckillActivity.getStatus())) { - throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); - } - - // 删除活动 - seckillActivityMapper.deleteById(id); - // 删除活动商品 - List products = seckillProductMapper.selectListByActivityId(id); - seckillProductMapper.deleteBatchIds(convertSet(products, SeckillProductDO::getId)); - } - - private SeckillActivityDO validateSeckillActivityExists(Long id) { - SeckillActivityDO seckillActivity = seckillActivityMapper.selectById(id); - if (seckillActivity == null) { - throw exception(SECKILL_ACTIVITY_NOT_EXISTS); - } - return seckillActivity; - } - - @Override - public SeckillActivityDO getSeckillActivity(Long id) { - return validateSeckillActivityExists(id); - } - - @Override - public PageResult getSeckillActivityPage(SeckillActivityPageReqVO pageReqVO) { - return seckillActivityMapper.selectPage(pageReqVO); - } - - @Override - public List getSeckillProductListByActivityId(Long activityId) { - return seckillProductMapper.selectListByActivityId(activityId); - } - - @Override - public List getSeckillProductListByActivityId(Collection activityIds) { - return seckillProductMapper.selectListByActivityId(activityIds); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigService.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigService.java deleted file mode 100644 index c9e80fa8..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigService.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.win.module.promotion.service.seckill; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 秒杀时段 Service 接口 - * - * @author halfninety - */ -public interface SeckillConfigService { - - /** - * 创建秒杀时段 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createSeckillConfig(@Valid SeckillConfigCreateReqVO createReqVO); - - /** - * 更新秒杀时段 - * - * @param updateReqVO 更新信息 - */ - void updateSeckillConfig(@Valid SeckillConfigUpdateReqVO updateReqVO); - - /** - * 删除秒杀时段 - * - * @param id 编号 - */ - void deleteSeckillConfig(Long id); - - /** - * 获得秒杀时段 - * - * @param id 编号 - * @return 秒杀时段 - */ - SeckillConfigDO getSeckillConfig(Long id); - - /** - * 获得所有秒杀时段列表 - * - * @return 所有秒杀时段列表 - */ - List getSeckillConfigList(); - - /** - * 校验秒杀时段是否存在 - * - * @param ids 秒杀时段 id 集合 - */ - void validateSeckillConfigExists(Collection ids); - - /** - * 获得秒杀时间段配置分页数据 - * - * @param pageVO 分页请求参数 - * @return 秒杀时段分页列表 - */ - PageResult getSeckillConfigPage(SeckillConfigPageReqVO pageVO); - - /** - * 获得所有正常状态的时段配置列表 - * - * @param status 状态 - * @return 秒杀时段列表 - */ - List getSeckillConfigListByStatus(Integer status); - - /** - * 更新秒杀时段配置状态 - * - * @param id id - * @param status 状态 - */ - void updateSeckillConfigStatus(Long id, Integer status); - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigServiceImpl.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigServiceImpl.java deleted file mode 100644 index 72f49463..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/service/seckill/SeckillConfigServiceImpl.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.win.module.promotion.service.seckill; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO; -import com.win.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; -import com.win.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalTime; -import java.util.Collection; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.promotion.enums.ErrorCodeConstants.*; - -/** - * 秒杀时段 Service 实现类 - * - * @author halfninety - */ -@Service -@Validated -public class SeckillConfigServiceImpl implements SeckillConfigService { - - @Resource - private SeckillConfigMapper seckillConfigMapper; - - @Override - public Long createSeckillConfig(SeckillConfigCreateReqVO createReqVO) { - // 校验时间段是否冲突 - validateSeckillConfigConflict(createReqVO.getStartTime(), createReqVO.getEndTime(), null); - - // 插入 - SeckillConfigDO seckillConfig = SeckillConfigConvert.INSTANCE.convert(createReqVO); - seckillConfigMapper.insert(seckillConfig); - // 返回 - return seckillConfig.getId(); - } - - @Override - public void updateSeckillConfig(SeckillConfigUpdateReqVO updateReqVO) { - // 校验存在 - validateSeckillConfigExists(updateReqVO.getId()); - // 校验时间段是否冲突 - validateSeckillConfigConflict(updateReqVO.getStartTime(), updateReqVO.getEndTime(), updateReqVO.getId()); - - // 更新 - SeckillConfigDO updateObj = SeckillConfigConvert.INSTANCE.convert(updateReqVO); - seckillConfigMapper.updateById(updateObj); - } - - @Override - public void updateSeckillConfigStatus(Long id, Integer status) { - // 校验秒杀时段是否存在 - validateSeckillConfigExists(id); - - // 更新状态 - seckillConfigMapper.updateById(new SeckillConfigDO().setId(id).setStatus(status)); - } - - @Override - public void deleteSeckillConfig(Long id) { - // 校验存在 - validateSeckillConfigExists(id); - - // 删除 - seckillConfigMapper.deleteById(id); - } - - private void validateSeckillConfigExists(Long id) { - if (seckillConfigMapper.selectById(id) == null) { - throw exception(SECKILL_CONFIG_NOT_EXISTS); - } - } - - /** - * 校验时间是否存在冲突 - * - * @param startTimeStr 开始时间 - * @param endTimeStr 结束时间 - */ - private void validateSeckillConfigConflict(String startTimeStr, String endTimeStr, Long id) { - // 1. 查询出所有的时段配置 - LocalTime startTime = LocalTime.parse(startTimeStr); - LocalTime endTime = LocalTime.parse(endTimeStr); - List configs = seckillConfigMapper.selectList(); - // 更新时排除自己 - if (id != null) { - configs.removeIf(item -> ObjectUtil.equal(item.getId(), id)); - } - - // 2. 判断是否有重叠的时间 - boolean hasConflict = configs.stream().anyMatch(config -> LocalDateTimeUtils.isOverlap(startTime, endTime, - LocalTime.parse(config.getStartTime()), LocalTime.parse(config.getEndTime()))); - if (hasConflict) { - throw exception(SECKILL_CONFIG_TIME_CONFLICTS); - } - } - - - @Override - public SeckillConfigDO getSeckillConfig(Long id) { - return seckillConfigMapper.selectById(id); - } - - @Override - public List getSeckillConfigList() { - return seckillConfigMapper.selectList(); - } - - @Override - public void validateSeckillConfigExists(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 1. 如果有数量不匹配,说明有不存在的,则抛出 SECKILL_CONFIG_NOT_EXISTS 业务异常 - List configs = seckillConfigMapper.selectBatchIds(ids); - if (configs.size() != ids.size()) { - throw exception(SECKILL_CONFIG_NOT_EXISTS); - } - - // 2. 如果存在关闭,则抛出 SECKILL_CONFIG_DISABLE 业务异常 - configs.forEach(config -> { - if (ObjectUtil.equal(config.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { - throw exception(SECKILL_CONFIG_DISABLE); - } - }); - } - - @Override - public PageResult getSeckillConfigPage(SeckillConfigPageReqVO pageVO) { - return seckillConfigMapper.selectPage(pageVO); - } - - @Override - public List getSeckillConfigListByStatus(Integer status) { - return seckillConfigMapper.selectListByStatus(status); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/util/PromotionUtils.java b/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/util/PromotionUtils.java deleted file mode 100644 index ec33600c..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/java/com/win/module/promotion/util/PromotionUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.promotion.util; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.util.date.LocalDateTimeUtils; - -import java.time.LocalDateTime; - -/** - * 活动工具类 - * - * @author 芋道源码 - */ -public class PromotionUtils { - - /** - * 根据时间,计算活动状态 - * - * @param endTime 结束时间 - * @return 活动状态 - */ - public static Integer calculateActivityStatus(LocalDateTime endTime) { - return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus(); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/main/resources/mapper/coupon/CouponTemplateMapper.xml b/win-module-mall/win-module-promotion-biz/src/main/resources/mapper/coupon/CouponTemplateMapper.xml deleted file mode 100644 index 32bb1ca6..00000000 --- a/win-module-mall/win-module-promotion-biz/src/main/resources/mapper/coupon/CouponTemplateMapper.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - UPDATE promotion_coupon_template - SET take_count = take_count + #{incrCount} - WHERE id = #{id} - - - diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/combination/CombinationActivityServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/combination/CombinationActivityServiceImplTest.java deleted file mode 100644 index 0258ad90..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/combination/CombinationActivityServiceImplTest.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.win.module.promotion.service.combination; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; -import com.win.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.combination.CombinationActivityDO; -import com.win.module.promotion.dal.mysql.combination.CombinationActivityMapper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.COMBINATION_ACTIVITY_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -// TODO 芋艿:等完成后,在补全单测 -/** - * {@link CombinationActivityServiceImpl} 的单元测试类 - * - * @author HUIHUI - */ -@Import(CombinationActivityServiceImpl.class) -public class CombinationActivityServiceImplTest extends BaseDbUnitTest { - - @Resource - private CombinationActivityServiceImpl combinationActivityService; - - @Resource - private CombinationActivityMapper combinationActivityMapper; - - @Test - public void testCreateCombinationActivity_success() { - // 准备参数 - CombinationActivityCreateReqVO reqVO = randomPojo(CombinationActivityCreateReqVO.class); - - // 调用 - Long combinationActivityId = combinationActivityService.createCombinationActivity(reqVO); - // 断言 - assertNotNull(combinationActivityId); - // 校验记录的属性是否正确 - CombinationActivityDO combinationActivity = combinationActivityMapper.selectById(combinationActivityId); - assertPojoEquals(reqVO, combinationActivity); - } - - @Test - public void testUpdateCombinationActivity_success() { - // mock 数据 - CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class); - combinationActivityMapper.insert(dbCombinationActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - CombinationActivityUpdateReqVO reqVO = randomPojo(CombinationActivityUpdateReqVO.class, o -> { - o.setId(dbCombinationActivity.getId()); // 设置更新的 ID - }); - - // 调用 - combinationActivityService.updateCombinationActivity(reqVO); - // 校验是否更新正确 - CombinationActivityDO combinationActivity = combinationActivityMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, combinationActivity); - } - - @Test - public void testUpdateCombinationActivity_notExists() { - // 准备参数 - CombinationActivityUpdateReqVO reqVO = randomPojo(CombinationActivityUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> combinationActivityService.updateCombinationActivity(reqVO), COMBINATION_ACTIVITY_NOT_EXISTS); - } - - @Test - public void testDeleteCombinationActivity_success() { - // mock 数据 - CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class); - combinationActivityMapper.insert(dbCombinationActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbCombinationActivity.getId(); - - // 调用 - combinationActivityService.deleteCombinationActivity(id); - // 校验数据不存在了 - assertNull(combinationActivityMapper.selectById(id)); - } - - @Test - public void testDeleteCombinationActivity_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> combinationActivityService.deleteCombinationActivity(id), COMBINATION_ACTIVITY_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetCombinationActivityPage() { - // mock 数据 - CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class, o -> { // 等会查询到 - o.setName(null); - //o.setSpuId(null); - o.setTotalLimitCount(null); - o.setSingleLimitCount(null); - o.setStartTime(null); - o.setEndTime(null); - o.setUserSize(null); - o.setTotalCount(null); - o.setSuccessCount(null); - o.setOrderUserCount(null); - o.setVirtualGroup(null); - o.setStatus(null); - o.setLimitDuration(null); - o.setCreateTime(null); - }); - combinationActivityMapper.insert(dbCombinationActivity); - // 测试 name 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setName(null))); - // 测试 spuId 不匹配 - //combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSpuId(null))); - // 测试 totalLimitCount 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalLimitCount(null))); - // 测试 singleLimitCount 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSingleLimitCount(null))); - // 测试 startTime 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStartTime(null))); - // 测试 endTime 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setEndTime(null))); - // 测试 userSize 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setUserSize(null))); - // 测试 totalNum 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalCount(null))); - // 测试 successNum 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessCount(null))); - // 测试 orderUserCount 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setOrderUserCount(null))); - // 测试 virtualGroup 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setVirtualGroup(null))); - // 测试 status 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStatus(null))); - // 测试 limitDuration 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setLimitDuration(null))); - // 测试 createTime 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setCreateTime(null))); - // 准备参数 - CombinationActivityPageReqVO reqVO = new CombinationActivityPageReqVO(); - reqVO.setName(null); - reqVO.setStatus(null); - - // 调用 - PageResult pageResult = combinationActivityService.getCombinationActivityPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbCombinationActivity, pageResult.getList().get(0)); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetCombinationActivityList() { - // mock 数据 - CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class, o -> { // 等会查询到 - o.setName(null); - //o.setSpuId(null); - o.setTotalLimitCount(null); - o.setSingleLimitCount(null); - o.setStartTime(null); - o.setEndTime(null); - o.setUserSize(null); - o.setTotalCount(null); - o.setSuccessCount(null); - o.setOrderUserCount(null); - o.setVirtualGroup(null); - o.setStatus(null); - o.setLimitDuration(null); - o.setCreateTime(null); - }); - combinationActivityMapper.insert(dbCombinationActivity); - // 测试 name 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setName(null))); - // 测试 spuId 不匹配 - //combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSpuId(null))); - // 测试 totalLimitCount 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalLimitCount(null))); - // 测试 singleLimitCount 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSingleLimitCount(null))); - // 测试 startTime 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStartTime(null))); - // 测试 endTime 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setEndTime(null))); - // 测试 userSize 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setUserSize(null))); - // 测试 totalNum 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalCount(null))); - // 测试 successNum 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessCount(null))); - // 测试 orderUserCount 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setOrderUserCount(null))); - // 测试 virtualGroup 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setVirtualGroup(null))); - // 测试 status 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStatus(null))); - // 测试 limitDuration 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setLimitDuration(null))); - // 测试 createTime 不匹配 - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setCreateTime(null))); - - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImplTest.java deleted file mode 100644 index 110a52d0..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/coupon/CouponTemplateServiceImplTest.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.win.module.promotion.service.coupon; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateCreateReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO; -import com.win.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO; -import com.win.module.promotion.dal.dataobject.coupon.CouponTemplateDO; -import com.win.module.promotion.dal.mysql.coupon.CouponTemplateMapper; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link CouponTemplateServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(CouponTemplateServiceImpl.class) -public class CouponTemplateServiceImplTest extends BaseDbUnitTest { - - @Resource - private CouponTemplateServiceImpl couponTemplateService; - - @Resource - private CouponTemplateMapper couponTemplateMapper; - - @Test - public void testCreateCouponTemplate_success() { - // 准备参数 - CouponTemplateCreateReqVO reqVO = randomPojo(CouponTemplateCreateReqVO.class, - o -> o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()) - .setValidityType(randomEle(CouponTemplateValidityTypeEnum.values()).getType()) - .setDiscountType(randomEle(PromotionDiscountTypeEnum.values()).getType())); - - // 调用 - Long couponTemplateId = couponTemplateService.createCouponTemplate(reqVO); - // 断言 - assertNotNull(couponTemplateId); - // 校验记录的属性是否正确 - CouponTemplateDO couponTemplate = couponTemplateMapper.selectById(couponTemplateId); - assertPojoEquals(reqVO, couponTemplate); - } - - @Test - public void testUpdateCouponTemplate_success() { - // mock 数据 - CouponTemplateDO dbCouponTemplate = randomPojo(CouponTemplateDO.class); - couponTemplateMapper.insert(dbCouponTemplate);// @Sql: 先插入出一条存在的数据 - // 准备参数 - CouponTemplateUpdateReqVO reqVO = randomPojo(CouponTemplateUpdateReqVO.class, o -> { - o.setId(dbCouponTemplate.getId()); // 设置更新的 ID - // 其它通用字段 - o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()) - .setValidityType(randomEle(CouponTemplateValidityTypeEnum.values()).getType()) - .setDiscountType(randomEle(PromotionDiscountTypeEnum.values()).getType()); - }); - - // 调用 - couponTemplateService.updateCouponTemplate(reqVO); - // 校验是否更新正确 - CouponTemplateDO couponTemplate = couponTemplateMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, couponTemplate); - } - - @Test - public void testUpdateCouponTemplate_notExists() { - // 准备参数 - CouponTemplateUpdateReqVO reqVO = randomPojo(CouponTemplateUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> couponTemplateService.updateCouponTemplate(reqVO), COUPON_TEMPLATE_NOT_EXISTS); - } - - @Test - public void testDeleteCouponTemplate_success() { - // mock 数据 - CouponTemplateDO dbCouponTemplate = randomPojo(CouponTemplateDO.class); - couponTemplateMapper.insert(dbCouponTemplate);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbCouponTemplate.getId(); - - // 调用 - couponTemplateService.deleteCouponTemplate(id); - // 校验数据不存在了 - assertNull(couponTemplateMapper.selectById(id)); - } - - @Test - public void testDeleteCouponTemplate_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> couponTemplateService.deleteCouponTemplate(id), COUPON_TEMPLATE_NOT_EXISTS); - } - - @Test - public void testGetCouponTemplatePage() { - // mock 数据 - CouponTemplateDO dbCouponTemplate = randomPojo(CouponTemplateDO.class, o -> { // 等会查询到 - o.setName("芋艿"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()); - o.setCreateTime(buildTime(2022, 2, 2)); - }); - couponTemplateMapper.insert(dbCouponTemplate); - // 测试 name 不匹配 - couponTemplateMapper.insert(cloneIgnoreId(dbCouponTemplate, o -> o.setName("土豆"))); - // 测试 status 不匹配 - couponTemplateMapper.insert(cloneIgnoreId(dbCouponTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 type 不匹配 - couponTemplateMapper.insert(cloneIgnoreId(dbCouponTemplate, o -> o.setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()))); - // 测试 createTime 不匹配 - couponTemplateMapper.insert(cloneIgnoreId(dbCouponTemplate, o -> o.setCreateTime(buildTime(2022, 1, 1)))); - // 准备参数 - CouponTemplatePageReqVO reqVO = new CouponTemplatePageReqVO(); - reqVO.setName("芋艿"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()); - reqVO.setCreateTime((new LocalDateTime[]{buildTime(2022, 2, 1), buildTime(2022, 2, 3)})); - - // 调用 - PageResult pageResult = couponTemplateService.getCouponTemplatePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbCouponTemplate, pageResult.getList().get(0)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImplTest.java deleted file mode 100644 index e7e4b23e..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/decorate/DecorateComponentServiceImplTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.promotion.service.decorate; - -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.promotion.dal.mysql.decorate.DecorateComponentMapper; -import org.junit.jupiter.api.BeforeEach; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -// TODO @芋艿:后续 review 下 -/** - * @author jason - */ -public class DecorateComponentServiceImplTest extends BaseMockitoUnitTest { - - @InjectMocks - private DecorateComponentServiceImpl decoratePageService; - - @Mock - private DecorateComponentMapper decorateComponentMapper; - - @BeforeEach - public void init(){ - - } - -// @Test -// void testResp(){ -// List list = new ArrayList<>(1); -// DecorateComponentDO decorateDO = new DecorateComponentDO() -// .setPage(INDEX.getPage()).setValue("") -// .setCode(ROLLING_NEWS.getCode()).setId(1L); -// list.add(decorateDO); -// //mock 方法 -// Mockito.when(decorateComponentMapper.selectListByPageAndStatus(eq(1))).thenReturn(list); -// } -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/discount/DiscountActivityServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/discount/DiscountActivityServiceImplTest.java deleted file mode 100644 index 197241b8..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/discount/DiscountActivityServiceImplTest.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.win.module.promotion.service.discount; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; -import com.win.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.discount.DiscountActivityDO; -import com.win.module.promotion.dal.dataobject.discount.DiscountProductDO; -import com.win.module.promotion.dal.mysql.discount.DiscountActivityMapper; -import com.win.module.promotion.dal.mysql.discount.DiscountProductMapper; -import com.win.module.promotion.enums.common.PromotionActivityStatusEnum; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.addTime; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.DISCOUNT_ACTIVITY_NOT_EXISTS; -import static java.util.Arrays.asList; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link DiscountActivityServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(DiscountActivityServiceImpl.class) -public class DiscountActivityServiceImplTest extends BaseDbUnitTest { - - @Resource - private DiscountActivityServiceImpl discountActivityService; - - @Resource - private DiscountActivityMapper discountActivityMapper; - @Resource - private DiscountProductMapper discountProductMapper; - - @Test - public void testCreateDiscountActivity_success() { - // 准备参数 - DiscountActivityCreateReqVO reqVO = randomPojo(DiscountActivityCreateReqVO.class, o -> { - // 用于触发进行中的状态 - o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); - // 设置商品 - o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L) - .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3), - new DiscountActivityBaseVO.Product().setSpuId(10L).setSkuId(20L) - .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30))); - }); - - // 调用 - Long discountActivityId = discountActivityService.createDiscountActivity(reqVO); - // 断言 - assertNotNull(discountActivityId); - // 校验活动 - DiscountActivityDO discountActivity = discountActivityMapper.selectById(discountActivityId); - assertPojoEquals(reqVO, discountActivity); - assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); - // 校验商品 - List discountProducts = discountProductMapper.selectList(DiscountProductDO::getActivityId, discountActivity.getId()); - assertEquals(discountProducts.size(), reqVO.getProducts().size()); - for (int i = 0; i < reqVO.getProducts().size(); i++) { - DiscountActivityBaseVO.Product product = reqVO.getProducts().get(i); - DiscountProductDO discountProduct = discountProducts.get(i); - assertEquals(discountProduct.getActivityId(), discountActivity.getId()); - assertEquals(discountProduct.getSpuId(), product.getSpuId()); - assertEquals(discountProduct.getSkuId(), product.getSkuId()); - assertEquals(discountProduct.getDiscountType(), product.getDiscountType()); - assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice()); - assertEquals(discountProduct.getDiscountPercent(), product.getDiscountPercent()); - } - } - - @Test - public void testUpdateDiscountActivity_success() { - // mock 数据(商品) - DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class); - discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据 - // mock 数据(活动) - DiscountProductDO dbDiscountProduct01 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId()) - .setSpuId(1L).setSkuId(2L).setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3).setDiscountPercent(null)); - DiscountProductDO dbDiscountProduct02 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId()) - .setSpuId(10L).setSkuId(20L).setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30).setDiscountPrice(null)); - discountProductMapper.insert(dbDiscountProduct01); - discountProductMapper.insert(dbDiscountProduct02); - // 准备参数 - DiscountActivityUpdateReqVO reqVO = randomPojo(DiscountActivityUpdateReqVO.class, o -> { - o.setId(dbDiscountActivity.getId()); // 设置更新的 ID - // 用于触发进行中的状态 - o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); - // 设置商品 - o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L) - .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3).setDiscountPercent(null), - new DiscountActivityBaseVO.Product().setSpuId(100L).setSkuId(200L) - .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30).setDiscountPrice(null))); - }); - - // 调用 - discountActivityService.updateDiscountActivity(reqVO); - // 校验活动 - DiscountActivityDO discountActivity = discountActivityMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, discountActivity); - assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); - // 校验商品 - List discountProducts = discountProductMapper.selectList(DiscountProductDO::getActivityId, discountActivity.getId()); - assertEquals(discountProducts.size(), reqVO.getProducts().size()); - for (int i = 0; i < reqVO.getProducts().size(); i++) { - DiscountActivityBaseVO.Product product = reqVO.getProducts().get(i); - DiscountProductDO discountProduct = discountProducts.get(i); - assertEquals(discountProduct.getActivityId(), discountActivity.getId()); - assertEquals(discountProduct.getSpuId(), product.getSpuId()); - assertEquals(discountProduct.getSkuId(), product.getSkuId()); - assertEquals(discountProduct.getDiscountType(), product.getDiscountType()); - assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice()); - assertEquals(discountProduct.getDiscountPercent(), product.getDiscountPercent()); - } - } - - @Test - public void testCloseDiscountActivity() { - // mock 数据 - DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class, - o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus())); - discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbDiscountActivity.getId(); - - // 调用 - discountActivityService.closeRewardActivity(id); - // 校验状态 - DiscountActivityDO discountActivity = discountActivityMapper.selectById(id); - assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.CLOSE.getStatus()); - } - - @Test - public void testUpdateDiscountActivity_notExists() { - // 准备参数 - DiscountActivityUpdateReqVO reqVO = randomPojo(DiscountActivityUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> discountActivityService.updateDiscountActivity(reqVO), DISCOUNT_ACTIVITY_NOT_EXISTS); - } - - @Test - public void testDeleteDiscountActivity_success() { - // mock 数据 - DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class, - o -> o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus())); - discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbDiscountActivity.getId(); - - // 调用 - discountActivityService.deleteDiscountActivity(id); - // 校验数据不存在了 - assertNull(discountActivityMapper.selectById(id)); - } - - @Test - public void testDeleteDiscountActivity_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> discountActivityService.deleteDiscountActivity(id), DISCOUNT_ACTIVITY_NOT_EXISTS); - } - - @Test - public void testGetDiscountActivityPage() { - // mock 数据 - DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class, o -> { // 等会查询到 - o.setName("芋艿"); - o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus()); - o.setCreateTime(buildTime(2021, 1, 15)); - }); - discountActivityMapper.insert(dbDiscountActivity); - // 测试 name 不匹配 - discountActivityMapper.insert(cloneIgnoreId(dbDiscountActivity, o -> o.setName("土豆"))); - // 测试 status 不匹配 - discountActivityMapper.insert(cloneIgnoreId(dbDiscountActivity, o -> o.setStatus(PromotionActivityStatusEnum.END.getStatus()))); - // 测试 createTime 不匹配 - discountActivityMapper.insert(cloneIgnoreId(dbDiscountActivity, o -> o.setCreateTime(buildTime(2021, 2, 10)))); - // 准备参数 - DiscountActivityPageReqVO reqVO = new DiscountActivityPageReqVO(); - reqVO.setName("芋艿"); - reqVO.setStatus(PromotionActivityStatusEnum.WAIT.getStatus()); - reqVO.setCreateTime((new LocalDateTime[]{buildTime(2021, 1, 1), buildTime(2021, 1, 31)})); - - // 调用 - PageResult pageResult = discountActivityService.getDiscountActivityPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbDiscountActivity, pageResult.getList().get(0)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/price/PriceServiceTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/price/PriceServiceTest.java deleted file mode 100644 index 32a3c837..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/price/PriceServiceTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.win.module.promotion.service.price; - -import com.win.framework.common.exception.ServiceException; -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.promotion.api.price.dto.CouponMeetRespDTO; -import com.win.module.promotion.api.price.dto.PriceCalculateReqDTO; -import com.win.module.promotion.dal.dataobject.coupon.CouponDO; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.coupon.CouponStatusEnum; -import com.win.module.promotion.service.coupon.CouponService; -import com.win.module.promotion.service.reward.RewardActivityService; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.List; - -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_VALID_TIME_NOT_NOW; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; - -/** - * {@link PriceServiceImpl} 的单元测试 - * - * @author 芋道源码 - */ -public class PriceServiceTest extends BaseMockitoUnitTest { - - @InjectMocks - private PriceServiceImpl priceService; - - @Mock - private RewardActivityService rewardActivityService; - @Mock - private CouponService couponService; - @Mock - private ProductSkuApi productSkuApi; - - /** - * 测试满减送活动,不匹配的情况 - */ - @Test - public void testCalculatePrice_rewardActivityNotMeet() { - - } - - @Test - public void testGetMeetCouponList() { - // 准备参数 - PriceCalculateReqDTO calculateReqDTO = new PriceCalculateReqDTO().setUserId(1024L) - .setItems(singletonList(new PriceCalculateReqDTO.Item().setSkuId(10L).setCount(2))); - // mock 方法(商品 SKU 信息) - ProductSkuRespDTO productSku = randomPojo(ProductSkuRespDTO.class, o -> o.setId(10L).setPrice(100)); - when(productSkuApi.getSkuList(eq(asSet(10L)))).thenReturn(singletonList(productSku)); - // mock 方法(情况一:优惠劵未到使用时间) - CouponDO coupon01 = randomPojo(CouponDO.class); - doThrow(new ServiceException(COUPON_VALID_TIME_NOT_NOW)).when(couponService).validCoupon(coupon01); - // mock 方法(情况二:所结算商品没有符合条件的商品) - CouponDO coupon02 = randomPojo(CouponDO.class); - // mock 方法(情况三:使用金额不足) - CouponDO coupon03 = randomPojo(CouponDO.class, o -> o.setProductScope(PromotionProductScopeEnum.ALL.getScope()) - .setUsePrice(300)); - // mock 方法(情况五:满足条件) - CouponDO coupon04 = randomPojo(CouponDO.class, o -> o.setProductScope(PromotionProductScopeEnum.ALL.getScope()) - .setUsePrice(190)); - // mock 方法(获得用户的待使用优惠劵) - when(couponService.getCouponList(eq(1024L), eq(CouponStatusEnum.UNUSED.getStatus()))) - .thenReturn(asList(coupon01, coupon02, coupon03, coupon04)); - // 调用 - List list = priceService.getMeetCouponList(calculateReqDTO); - // 断言 - assertEquals(list.size(), 4); - // 断言情况一:优惠劵未到使用时间 - CouponMeetRespDTO couponMeetRespDTO01 = list.get(0); - assertPojoEquals(couponMeetRespDTO01, coupon01); - assertFalse(couponMeetRespDTO01.getMeet()); - assertEquals(couponMeetRespDTO01.getMeetTip(), "优惠劵未到使用时间"); - // 断言情况二:所结算商品没有符合条件的商品 - CouponMeetRespDTO couponMeetRespDTO02 = list.get(1); - assertPojoEquals(couponMeetRespDTO02, coupon02); - assertFalse(couponMeetRespDTO02.getMeet()); - assertEquals(couponMeetRespDTO02.getMeetTip(), "所结算商品没有符合条件的商品"); - // 断言情况三:差 %s 元可用优惠劵 - CouponMeetRespDTO couponMeetRespDTO03 = list.get(2); - assertPojoEquals(couponMeetRespDTO03, coupon03); - assertFalse(couponMeetRespDTO03.getMeet()); - assertEquals(couponMeetRespDTO03.getMeetTip(), "所结算的商品中未满足使用的金额"); - // 断言情况四:满足条件 - CouponMeetRespDTO couponMeetRespDTO04 = list.get(3); - assertPojoEquals(couponMeetRespDTO04, coupon04); - assertTrue(couponMeetRespDTO04.getMeet()); - assertNull(couponMeetRespDTO04.getMeetTip()); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/reward/RewardActivityServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/reward/RewardActivityServiceImplTest.java deleted file mode 100644 index 54341cf8..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/reward/RewardActivityServiceImplTest.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.win.module.promotion.service.reward; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; -import com.win.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.reward.RewardActivityDO; -import com.win.module.promotion.dal.mysql.reward.RewardActivityMapper; -import com.win.module.promotion.enums.common.PromotionActivityStatusEnum; -import com.win.module.promotion.enums.common.PromotionConditionTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; -import java.util.Map; -import java.util.Set; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static com.win.framework.common.util.date.LocalDateTimeUtils.addTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link RewardActivityServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(RewardActivityServiceImpl.class) -public class RewardActivityServiceImplTest extends BaseDbUnitTest { - - @Resource - private RewardActivityServiceImpl rewardActivityService; - - @Resource - private RewardActivityMapper rewardActivityMapper; - - @Test - public void testCreateRewardActivity_success() { - // 准备参数 - RewardActivityCreateReqVO reqVO = randomPojo(RewardActivityCreateReqVO.class, o -> { - o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType()); - o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()); - // 用于触发进行中的状态 - o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); - }); - - // 调用 - Long rewardActivityId = rewardActivityService.createRewardActivity(reqVO); - // 断言 - assertNotNull(rewardActivityId); - // 校验记录的属性是否正确 - RewardActivityDO rewardActivity = rewardActivityMapper.selectById(rewardActivityId); - assertPojoEquals(reqVO, rewardActivity, "rules"); - assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); - for (int i = 0; i < reqVO.getRules().size(); i++) { - assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); - } - } - - @Test - public void testUpdateRewardActivity_success() { - // mock 数据 - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus())); - rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class, o -> { - o.setId(dbRewardActivity.getId()); // 设置更新的 ID - o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType()); - o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()); - // 用于触发进行中的状态 - o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); - }); - - // 调用 - rewardActivityService.updateRewardActivity(reqVO); - // 校验是否更新正确 - RewardActivityDO rewardActivity = rewardActivityMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, rewardActivity, "rules"); - assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); - for (int i = 0; i < reqVO.getRules().size(); i++) { - assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); - } - } - - @Test - public void testCloseRewardActivity() { - // mock 数据 - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus())); - rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbRewardActivity.getId(); - - // 调用 - rewardActivityService.closeRewardActivity(id); - // 校验状态 - RewardActivityDO rewardActivity = rewardActivityMapper.selectById(id); - assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.CLOSE.getStatus()); - } - - @Test - public void testUpdateRewardActivity_notExists() { - // 准备参数 - RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> rewardActivityService.updateRewardActivity(reqVO), REWARD_ACTIVITY_NOT_EXISTS); - } - - @Test - public void testDeleteRewardActivity_success() { - // mock 数据 - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus())); - rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbRewardActivity.getId(); - - // 调用 - rewardActivityService.deleteRewardActivity(id); - // 校验数据不存在了 - assertNull(rewardActivityMapper.selectById(id)); - } - - @Test - public void testDeleteRewardActivity_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> rewardActivityService.deleteRewardActivity(id), REWARD_ACTIVITY_NOT_EXISTS); - } - - @Test - public void testGetRewardActivityPage() { - // mock 数据 - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到 - o.setName("芋艿"); - o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); - }); - rewardActivityMapper.insert(dbRewardActivity); - // 测试 name 不匹配 - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName("土豆"))); - // 测试 status 不匹配 - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()))); - // 准备参数 - RewardActivityPageReqVO reqVO = new RewardActivityPageReqVO(); - reqVO.setName("芋艿"); - reqVO.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); - - // 调用 - PageResult pageResult = rewardActivityService.getRewardActivityPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); - } - - @Test - public void testGetRewardActivities_all() { - // mock 数据 - RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) - .setProductScope(PromotionProductScopeEnum.ALL.getScope())); - rewardActivityMapper.insert(allActivity); - RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L))); - rewardActivityMapper.insert(productActivity); - // 准备参数 - Set spuIds = asSet(1L, 2L); - - // 调用 TODO getMatchRewardActivities 没有这个方法,但是找到了 getMatchRewardActivityList - //Map> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds); - // 断言 - //assertEquals(matchRewardActivities.size(), 1); - //Map.Entry> next = matchRewardActivities.entrySet().iterator().next(); - //assertPojoEquals(next.getKey(), allActivity); - //assertEquals(next.getValue(), spuIds); - } - - @Test - public void testGetRewardActivities_product() { - // mock 数据 - RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L))); - rewardActivityMapper.insert(productActivity01); - RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(singletonList(3L))); - rewardActivityMapper.insert(productActivity02); - // 准备参数 - Set spuIds = asSet(1L, 2L, 3L); - - // 调用 TODO getMatchRewardActivities 没有这个方法,但是找到了 getMatchRewardActivityList - //Map> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds); - // 断言 - //assertEquals(matchRewardActivities.size(), 2); - //matchRewardActivities.forEach((activity, activitySpuIds) -> { - // if (activity.getId().equals(productActivity01.getId())) { - // assertPojoEquals(activity, productActivity01); - // assertEquals(activitySpuIds, asSet(1L, 2L)); - // } else if (activity.getId().equals(productActivity02.getId())) { - // assertPojoEquals(activity, productActivity02); - // assertEquals(activitySpuIds, asSet(3L)); - // } else { - // fail(); - // } - //}); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java deleted file mode 100644 index b313bda7..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.win.module.promotion.service.seckillactivity; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; -import com.win.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; -import com.win.module.promotion.service.seckill.SeckillActivityServiceImpl; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.SECKILL_ACTIVITY_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link SeckillActivityServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SeckillActivityServiceImpl.class) -@Disabled // TODO 芋艿:未来开启 -public class SeckillActivityServiceImplTest extends BaseDbUnitTest { - - @Resource - private SeckillActivityServiceImpl seckillActivityService; - - @Resource - private SeckillActivityMapper seckillActivityMapper; - - @Test - public void testCreateSeckillActivity_success() { - // 准备参数 - SeckillActivityCreateReqVO reqVO = randomPojo(SeckillActivityCreateReqVO.class); - - // 调用 - Long seckillActivityId = seckillActivityService.createSeckillActivity(reqVO); - // 断言 - assertNotNull(seckillActivityId); - // 校验记录的属性是否正确 - SeckillActivityDO seckillActivity = seckillActivityMapper.selectById(seckillActivityId); - assertPojoEquals(reqVO, seckillActivity); - } - - @Test - public void testUpdateSeckillActivity_success() { - // mock 数据 - SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class); - seckillActivityMapper.insert(dbSeckillActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SeckillActivityUpdateReqVO reqVO = randomPojo(SeckillActivityUpdateReqVO.class, o -> { - o.setId(dbSeckillActivity.getId()); // 设置更新的 ID - }); - - // 调用 - seckillActivityService.updateSeckillActivity(reqVO); - // 校验是否更新正确 - SeckillActivityDO seckillActivity = seckillActivityMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, seckillActivity); - } - - @Test - public void testUpdateSeckillActivity_notExists() { - // 准备参数 - SeckillActivityUpdateReqVO reqVO = randomPojo(SeckillActivityUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> seckillActivityService.updateSeckillActivity(reqVO), SECKILL_ACTIVITY_NOT_EXISTS); - } - - @Test - public void testDeleteSeckillActivity_success() { - // mock 数据 - SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class); - seckillActivityMapper.insert(dbSeckillActivity);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSeckillActivity.getId(); - - // 调用 - seckillActivityService.deleteSeckillActivity(id); - // 校验数据不存在了 - assertNull(seckillActivityMapper.selectById(id)); - } - - @Test - public void testDeleteSeckillActivity_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> seckillActivityService.deleteSeckillActivity(id), SECKILL_ACTIVITY_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetSeckillActivityPage() { - // mock 数据 - SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 - o.setName(null); - o.setStatus(null); - o.setConfigIds(null); - o.setCreateTime(null); - }); - seckillActivityMapper.insert(dbSeckillActivity); - // 测试 name 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setName(null))); - // 测试 status 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); - // 测试 timeId 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setConfigIds(null))); - // 测试 createTime 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); - // 准备参数 - SeckillActivityPageReqVO reqVO = new SeckillActivityPageReqVO(); - reqVO.setName(null); - reqVO.setStatus(null); - reqVO.setConfigId(null); - reqVO.setCreateTime((new LocalDateTime[]{})); - - // 调用 - PageResult pageResult = seckillActivityService.getSeckillActivityPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbSeckillActivity, pageResult.getList().get(0)); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetSeckillActivityList() { - // mock 数据 - SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 - o.setName(null); - o.setStatus(null); - o.setConfigIds(null); - o.setCreateTime(null); - }); - seckillActivityMapper.insert(dbSeckillActivity); - // 测试 name 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setName(null))); - // 测试 status 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); - // 测试 timeId 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setConfigIds(null))); - // 测试 createTime 不匹配 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); - // 准备参数 -// SeckillActivityExportReqVO reqVO = new SeckillActivityExportReqVO(); -// reqVO.setName(null); -// reqVO.setStatus(null); -// reqVO.setTimeId(null); -// reqVO.setCreateTime((new Date[]{})); -// -// // 调用 -// List list = seckillActivityService.getSeckillActivityList(reqVO); -// // 断言 -// assertEquals(1, list.size()); -// assertPojoEquals(dbSeckillActivity, list.get(0)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java b/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java deleted file mode 100644 index 2d18d185..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/java/com/win/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.win.module.promotion.service.seckillconfig; - -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO; -import com.win.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO; -import com.win.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO; -import com.win.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper; -import com.win.module.promotion.service.seckill.SeckillConfigServiceImpl; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.promotion.enums.ErrorCodeConstants.SECKILL_CONFIG_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -/** - * {@link SeckillConfigServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(SeckillConfigServiceImpl.class) -@Disabled // TODO 芋艿:未来开启;后续要 review 下 -public class SeckillConfigServiceImplTest extends BaseDbUnitTest { - - @Resource - private SeckillConfigServiceImpl SeckillConfigService; - - @Resource - private SeckillConfigMapper seckillConfigMapper; - - @Resource - private ObjectMapper objectMapper; - - @Test - public void testJacksonSerializ() { - - // 准备参数 - SeckillConfigCreateReqVO reqVO = randomPojo(SeckillConfigCreateReqVO.class); -// ObjectMapper objectMapper = new ObjectMapper(); - try { - String string = objectMapper.writeValueAsString(reqVO); - System.out.println(string); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - - - } - - @Test - public void testCreateSeckillConfig_success() { - // 准备参数 - SeckillConfigCreateReqVO reqVO = randomPojo(SeckillConfigCreateReqVO.class); - - // 调用 - Long SeckillConfigId = SeckillConfigService.createSeckillConfig(reqVO); - // 断言 - assertNotNull(SeckillConfigId); - // 校验记录的属性是否正确 - SeckillConfigDO SeckillConfig = seckillConfigMapper.selectById(SeckillConfigId); - assertPojoEquals(reqVO, SeckillConfig); - } - - @Test - public void testUpdateSeckillConfig_success() { - // mock 数据 - SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class); - seckillConfigMapper.insert(dbSeckillConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SeckillConfigUpdateReqVO reqVO = randomPojo(SeckillConfigUpdateReqVO.class, o -> { - o.setId(dbSeckillConfig.getId()); // 设置更新的 ID - }); - - // 调用 - SeckillConfigService.updateSeckillConfig(reqVO); - // 校验是否更新正确 - SeckillConfigDO SeckillConfig = seckillConfigMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, SeckillConfig); - } - - @Test - public void testUpdateSeckillConfig_notExists() { - // 准备参数 - SeckillConfigUpdateReqVO reqVO = randomPojo(SeckillConfigUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> SeckillConfigService.updateSeckillConfig(reqVO), SECKILL_CONFIG_NOT_EXISTS); - } - - @Test - public void testDeleteSeckillConfig_success() { - // mock 数据 - SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class); - seckillConfigMapper.insert(dbSeckillConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSeckillConfig.getId(); - - // 调用 - SeckillConfigService.deleteSeckillConfig(id); - // 校验数据不存在了 - assertNull(seckillConfigMapper.selectById(id)); - } - - @Test - public void testDeleteSeckillConfig_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> SeckillConfigService.deleteSeckillConfig(id), SECKILL_CONFIG_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetSeckillConfigPage() { - // mock 数据 -// SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class, o -> { // 等会查询到 -// o.setName(null); -// o.setStartTime(null); -// o.setEndTime(null); -// o.setCreateTime(null); -// }); -// seckillConfigMapper.insert(dbSeckillConfig); -// // 测试 name 不匹配 -// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setName(null))); -// // 测试 startTime 不匹配 -// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setStartTime(null))); -// // 测试 endTime 不匹配 -// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setEndTime(null))); -// // 测试 createTime 不匹配 -// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setCreateTime(null))); -// // 准备参数 -// SeckillConfigPageReqVO reqVO = new SeckillConfigPageReqVO(); -// reqVO.setName(null); -//// reqVO.setStartTime((new LocalTime())); -//// reqVO.setEndTime((new LocalTime[]{})); -//// reqVO.setCreateTime((new Date[]{})); -// -// // 调用 -// PageResult pageResult = SeckillConfigService.getSeckillConfigPage(reqVO); -// // 断言 -// assertEquals(1, pageResult.getTotal()); -// assertEquals(1, pageResult.getList().size()); -// assertPojoEquals(dbSeckillConfig, pageResult.getList().get(0)); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetSeckillConfigList() { - // mock 数据 - SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class, o -> { // 等会查询到 - o.setName(null); - o.setStartTime(null); - o.setEndTime(null); - o.setCreateTime(null); - }); - seckillConfigMapper.insert(dbSeckillConfig); - // 测试 name 不匹配 - seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setName(null))); - // 测试 startTime 不匹配 - seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setStartTime(null))); - // 测试 endTime 不匹配 - seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setEndTime(null))); - // 测试 createTime 不匹配 - seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setCreateTime(null))); - // 准备参数 -// SeckillConfigExportReqVO reqVO = new SeckillConfigExportReqVO(); -// reqVO.setName(null); -// reqVO.setStartTime((new LocalTime[]{})); -// reqVO.setEndTime((new LocalTime[]{})); -// reqVO.setCreateTime((new Date[]{})); -// -// // 调用 -// List list = SeckillConfigService.getSeckillConfigList(reqVO); -// // 断言 -// assertEquals(1, list.size()); -// assertPojoEquals(dbSeckillConfig, list.get(0)); - } - -} diff --git a/win-module-mall/win-module-promotion-biz/src/test/resources/application-unit-test.yaml b/win-module-mall/win-module-promotion-biz/src/test/resources/application-unit-test.yaml deleted file mode 100644 index aa9fd1ce..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: - # 数据源配置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口(单元测试,使用 16379 端口) - database: 0 # 数据库索引 - -mybatis: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -# 芋道配置项,设置当前项目所有自定义的配置 -win: - info: - base-package: com.win.module diff --git a/win-module-mall/win-module-promotion-biz/src/test/resources/logback.xml b/win-module-mall/win-module-promotion-biz/src/test/resources/logback.xml deleted file mode 100644 index daf756bf..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/win-module-mall/win-module-promotion-biz/src/test/resources/sql/clean.sql b/win-module-mall/win-module-promotion-biz/src/test/resources/sql/clean.sql deleted file mode 100644 index 7f3ace7b..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,8 +0,0 @@ -DELETE FROM "market_activity"; -DELETE FROM "promotion_coupon_template"; -DELETE FROM "promotion_coupon"; -DELETE FROM "promotion_reward_activity"; -DELETE FROM "promotion_discount_activity"; -DELETE FROM "promotion_discount_product"; -DELETE FROM "promotion_seckill_config"; -DELETE FROM "promotion_combination_activity"; diff --git a/win-module-mall/win-module-promotion-biz/src/test/resources/sql/create_tables.sql b/win-module-mall/win-module-promotion-biz/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 2855e7a9..00000000 --- a/win-module-mall/win-module-promotion-biz/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,183 +0,0 @@ -CREATE TABLE IF NOT EXISTS "market_activity" -( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "title" varchar(50) NOT NULL, - "activity_type" tinyint(4) NOT NULL, - "status" tinyint(4) NOT NULL, - "start_time" datetime NOT NULL, - "end_time" datetime NOT NULL, - "invalid_time" datetime, - "delete_time" datetime, - "time_limited_discount" varchar(2000), - "full_privilege" varchar(2000), - "creator" varchar(64) DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint(20) NOT NULL, - PRIMARY KEY ("id") -) COMMENT '促销活动'; - -CREATE TABLE IF NOT EXISTS "promotion_coupon_template" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "status" int NOT NULL, - "total_count" int NOT NULL, - "take_limit_count" int NOT NULL, - "take_type" int NOT NULL, - "use_price" int NOT NULL, - "product_scope" int NOT NULL, - "product_spu_ids" varchar, - "validity_type" int NOT NULL, - "valid_start_time" datetime, - "valid_end_time" datetime, - "fixed_start_term" int, - "fixed_end_term" int, - "discount_type" int NOT NULL, - "discount_percent" int, - "discount_price" int, - "discount_limit_price" int, - "take_count" int NOT NULL DEFAULT 0, - "use_count" int NOT NULL DEFAULT 0, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '优惠劵模板'; - -CREATE TABLE IF NOT EXISTS "promotion_coupon" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "template_id" bigint NOT NULL, - "name" varchar NOT NULL, - "status" int NOT NULL, - "user_id" bigint NOT NULL, - "take_type" int NOT NULL, - "useprice" int NOT NULL, - "valid_start_time" datetime NOT NULL, - "valid_end_time" datetime NOT NULL, - "product_scope" int NOT NULL, - "product_spu_ids" varchar, - "discount_type" int NOT NULL, - "discount_percent" int, - "discount_price" int, - "discount_limit_price" int, - "use_order_id" bigint, - "use_time" datetime, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '优惠劵'; - -CREATE TABLE IF NOT EXISTS "promotion_reward_activity" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "status" int NOT NULL, - "start_time" datetime NOT NULL, - "end_time" datetime NOT NULL, - "remark" varchar, - "condition_type" int NOT NULL, - "product_scope" int NOT NULL, - "product_spu_ids" varchar, - "rules" varchar, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '满减送活动'; - -CREATE TABLE IF NOT EXISTS "promotion_discount_activity" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "status" int NOT NULL, - "start_time" datetime NOT NULL, - "end_time" datetime NOT NULL, - "remark" varchar, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '限时折扣活动'; - --- 将该建表 SQL 语句,添加到 win-module-promotion-biz 模块的 test/resources/sql/create_tables.sql 文件里 -CREATE TABLE IF NOT EXISTS "promotion_seckill_activity" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "spu_id" bigint NOT NULL, - "name" varchar NOT NULL, - "status" int NOT NULL, - "remark" varchar, - "start_time" varchar NOT NULL, - "end_time" varchar NOT NULL, - "sort" int NOT NULL, - "config_ids" varchar NOT NULL, - "order_count" int NOT NULL, - "user_count" int NOT NULL, - "total_price" int NOT NULL, - "total_limit_count" int, - "single_limit_count" int, - "stock" int, - "total_stock" int, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint NOT NULL, - PRIMARY KEY ("id") -) COMMENT '秒杀活动'; - -CREATE TABLE IF NOT EXISTS "promotion_seckill_config" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "start_time" varchar NOT NULL, - "end_time" varchar NOT NULL, - "pic_url" varchar NOT NULL, - "status" int NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint NOT NULL, - PRIMARY KEY ("id") -) COMMENT '秒杀时段配置'; - -CREATE TABLE IF NOT EXISTS "promotion_combination_activity" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "spu_id" bigint, - "total_limit_count" int NOT NULL, - "single_limit_count" int NOT NULL, - "start_time" varchar NOT NULL, - "end_time" varchar NOT NULL, - "user_size" int NOT NULL, - "total_num" int NOT NULL, - "success_num" int NOT NULL, - "order_user_count" int NOT NULL, - "virtual_group" int NOT NULL, - "status" int NOT NULL, - "limit_duration" int NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint NOT NULL, - PRIMARY KEY ("id") -) COMMENT '拼团活动'; \ No newline at end of file diff --git a/win-module-mall/win-module-trade-api/pom.xml b/win-module-mall/win-module-trade-api/pom.xml deleted file mode 100644 index 1c43c150..00000000 --- a/win-module-mall/win-module-trade-api/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - com.win - win-module-mall - ${revision} - - 4.0.0 - win-module-trade-api - jar - - ${project.artifactId} - - trade 模块 API,暴露给其它模块调用 - - - - - com.win - win-common - - - - diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/BrokerageApi.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/BrokerageApi.java deleted file mode 100644 index c0394399..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/BrokerageApi.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.trade.api.brokerage; - -import com.win.module.trade.api.brokerage.dto.BrokerageUserDTO; - -/** - * 分销 API 接口 - * - * @author owen - */ -public interface BrokerageApi { - - /** - * 获得分销用户 - * - * @param userId 用户编号 - * @return 分销用户信息 - */ - BrokerageUserDTO getBrokerageUser(Long userId); - - /** - * 绑定推广员 - * - * @param userId 用户编号 - * @param bindUserId 推广员编号 - * @param isNewUser 是否为新用户 - * @return 是否绑定 - */ - boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser); -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/dto/BrokerageUserDTO.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/dto/BrokerageUserDTO.java deleted file mode 100644 index 57b3b6cb..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/brokerage/dto/BrokerageUserDTO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.trade.api.brokerage.dto; - -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 分销用户 DTO - * - * @author owen - */ -@Data -public class BrokerageUserDTO { - - /** - * 用户编号 - *

- * 对应 MemberUserDO 的 id 字段 - */ - private Long id; - - /** - * 推广员编号 - *

- * 关联 MemberUserDO 的 id 字段 - */ - private Long bindUserId; - /** - * 推广员绑定时间 - */ - private LocalDateTime bindUserTime; - - /** - * 推广资格 - */ - private Boolean brokerageEnabled; - /** - * 成为分销员时间 - */ - private LocalDateTime brokerageTime; - - /** - * 可用佣金 - */ - private Integer price; - /** - * 冻结佣金 - */ - private Integer frozenPrice; - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/TradeOrderApi.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/TradeOrderApi.java deleted file mode 100644 index f51c5775..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/TradeOrderApi.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.trade.api.order; - -/** - * 订单 API 接口 - * - * @author HUIHUI - */ -public interface TradeOrderApi { - - /** - * 验证订单 - * - * @param userId 用户 id - * @param orderItemId 订单项 id - * @return 校验通过返回订单 id - */ - Long validateOrder(Long userId, Long orderItemId); - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/dto/TradeOrderRespDTO.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/dto/TradeOrderRespDTO.java deleted file mode 100644 index df685c2c..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/order/dto/TradeOrderRespDTO.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.win.module.trade.api.order.dto; - -import com.win.framework.common.enums.TerminalEnum; -import com.win.module.trade.enums.order.TradeOrderCancelTypeEnum; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import com.win.module.trade.enums.order.TradeOrderTypeEnum; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 订单信息 Response DTO - * - * @author HUIHUI - */ -@Data -public class TradeOrderRespDTO { - - // ========== 订单基本信息 ========== - /** - * 订单编号,主键自增 - */ - private Long id; - /** - * 订单流水号 - * - * 例如说,1146347329394184195 - */ - private String no; - /** - * 订单类型 - * - * 枚举 {@link TradeOrderTypeEnum} - */ - private Integer type; - /** - * 订单来源 - * - * 枚举 {@link TerminalEnum} - */ - private Integer terminal; - /** - * 用户编号 - */ - private Long userId; - /** - * 用户 IP - */ - private String userIp; - /** - * 用户备注 - */ - private String userRemark; - /** - * 订单状态 - * - * 枚举 {@link TradeOrderStatusEnum} - */ - private Integer status; - /** - * 购买的商品数量 - */ - private Integer productCount; - /** - * 订单完成时间 - */ - private LocalDateTime finishTime; - /** - * 订单取消时间 - */ - private LocalDateTime cancelTime; - /** - * 取消类型 - * - * 枚举 {@link TradeOrderCancelTypeEnum} - */ - private Integer cancelType; - /** - * 商家备注 - */ - private String remark; - /** - * 是否评价 - */ - private Boolean commentStatus; - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/package-info.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/package-info.java deleted file mode 100644 index 4dd60837..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.trade.api; \ No newline at end of file diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/ErrorCodeConstants.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/ErrorCodeConstants.java deleted file mode 100644 index 3087d413..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.win.module.trade.enums; - -import com.win.framework.common.exception.ErrorCode; - -/** - * Trade 错误码枚举类 - * trade 系统,使用 1-011-000-000 段 - * - * @author LeeYan9 - * @since 2022-08-26 - */ -public interface ErrorCodeConstants { - - // ========== Order 模块 1-011-000-000 ========== - ErrorCode ORDER_CREATE_SKU_NOT_FOUND = new ErrorCode(1_011_000_001, "商品 SKU 不存在"); - ErrorCode ORDER_CREATE_SPU_NOT_SALE = new ErrorCode(1_011_000_002, "商品 SPU 不可售卖"); - ErrorCode ORDER_CREATE_SKU_STOCK_NOT_ENOUGH = new ErrorCode(1_011_000_004, "商品 SKU 库存不足"); - ErrorCode ORDER_CREATE_SPU_NOT_FOUND = new ErrorCode(1_011_000_005, "商品 SPU 不可售卖"); - ErrorCode ORDER_CREATE_ADDRESS_NOT_FOUND = new ErrorCode(1_011_000_006, "收货地址不存在"); - - ErrorCode ORDER_ITEM_NOT_FOUND = new ErrorCode(1_011_000_010, "交易订单项不存在"); - ErrorCode ORDER_NOT_FOUND = new ErrorCode(1_011_000_011, "交易订单不存在"); - ErrorCode ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL = new ErrorCode(1_011_000_012, "交易订单项更新售后状态失败,请重试"); - ErrorCode ORDER_UPDATE_PAID_STATUS_NOT_UNPAID = new ErrorCode(1_011_000_013, "交易订单更新支付状态失败,订单不是【未支付】状态"); - ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR = new ErrorCode(1_011_000_014, "交易订单更新支付状态失败,支付单编号不匹配"); - ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS = new ErrorCode(1_011_000_015, "交易订单更新支付状态失败,支付单状态不是【支付成功】状态"); - ErrorCode ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH = new ErrorCode(1_011_000_016, "交易订单更新支付状态失败,支付单金额不匹配"); - ErrorCode ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED = new ErrorCode(1_011_000_017, "交易订单发货失败,订单不是【待发货】状态"); - ErrorCode ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED = new ErrorCode(1_011_000_018, "交易订单收货失败,订单不是【待收货】状态"); - ErrorCode ORDER_COMMENT_FAIL_STATUS_NOT_COMPLETED = new ErrorCode(1_011_000_019, "创建交易订单项的评价失败,订单不是【已完成】状态"); - ErrorCode ORDER_COMMENT_STATUS_NOT_FALSE = new ErrorCode(1_011_000_020, "创建交易订单项的评价失败,订单已评价"); - ErrorCode ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE = new ErrorCode(1_011_000_021, "交易订单发货失败,订单已退款或部分退款"); - ErrorCode ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS = new ErrorCode(1_011_000_022, "交易订单发货失败,拼团未成功"); - ErrorCode ORDER_DELIVERY_FAIL_BARGAIN_RECORD_STATUS_NOT_SUCCESS = new ErrorCode(1_011_000_023, "交易订单发货失败,砍价未成功"); - ErrorCode ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS = new ErrorCode(1_011_000_024, "交易订单发货失败,发货类型不是快递"); - ErrorCode ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID = new ErrorCode(1_011_000_025, "交易订单取消失败,订单不是【待支付】状态"); - - // ========== After Sale 模块 1-011-000-100 ========== - ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在"); - ErrorCode AFTER_SALE_CREATE_FAIL_REFUND_PRICE_ERROR = new ErrorCode(1_011_000_101, "申请退款金额错误"); - ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_STATUS_CANCELED = new ErrorCode(1_011_000_102, "订单已关闭,无法申请售后"); - ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID = new ErrorCode(1_011_000_103, "订单未支付,无法申请售后"); - ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED = new ErrorCode(1_011_000_104, "订单未发货,无法申请【退货退款】售后"); - ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED = new ErrorCode(1_011_000_105, "订单项已申请售后,无法重复申请"); - ErrorCode AFTER_SALE_AUDIT_FAIL_STATUS_NOT_APPLY = new ErrorCode(1_011_000_106, "审批失败,售后状态不处于审批中"); - ErrorCode AFTER_SALE_UPDATE_STATUS_FAIL = new ErrorCode(1_011_000_107, "操作售后单失败,请刷新后重试"); - ErrorCode AFTER_SALE_DELIVERY_FAIL_STATUS_NOT_SELLER_AGREE = new ErrorCode(1_011_000_108, "退货失败,售后单状态不处于【待买家退货】"); - ErrorCode AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY = new ErrorCode(1_011_000_109, "确认收货失败,售后单状态不处于【待确认收货】"); - ErrorCode AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND = new ErrorCode(1_011_000_110, "退款失败,售后单状态不是【待退款】"); - ErrorCode AFTER_SALE_CANCEL_FAIL_STATUS_NOT_APPLY_OR_AGREE_OR_BUYER_DELIVERY = - new ErrorCode(1_011_000_111, "取消售后单失败,售后单状态不是【待审核】或【卖家同意】或【商家待收货】"); - - // ========== Cart 模块 1-011-002-000 ========== - ErrorCode CARD_ITEM_NOT_FOUND = new ErrorCode(1_011_002_000, "购物车项不存在"); - - // ========== Price 相关 1-011-003-000 ============ - ErrorCode PRICE_CALCULATE_PAY_PRICE_ILLEGAL = new ErrorCode(1_011_003_000, "支付价格计算异常,原因:价格小于等于 0"); - ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDR_IS_EMPTY = new ErrorCode(1_011_003_001, "计算快递运费异常,收件人地址编号为空"); - ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND = new ErrorCode(1_011_003_002, "计算快递运费异常,找不到对应的运费模板"); - - // ========== 物流 Express 模块 1-011-004-000 ========== - ErrorCode EXPRESS_NOT_EXISTS = new ErrorCode(1_011_004_000, "快递公司不存在"); - ErrorCode EXPRESS_CODE_DUPLICATE = new ErrorCode(1_011_004_001, "已经存在该编码的快递公司"); - ErrorCode EXPRESS_CLIENT_NOT_PROVIDE = new ErrorCode(1_011_004_002, "需要接入快递服务商,比如【快递100】"); - ErrorCode EXPRESS_STATUS_NOT_ENABLE = new ErrorCode(1_011_004_003, "快递公司未启用"); - - ErrorCode EXPRESS_API_QUERY_ERROR = new ErrorCode(1_011_004_101, "快递查询接口异常"); - ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1_011_004_102, "快递查询返回失败,原因:{}"); - - // ========== 物流 Template 模块 1-011-005-000 ========== - ErrorCode EXPRESS_TEMPLATE_NAME_DUPLICATE = new ErrorCode(1_011_005_000, "已经存在该运费模板名"); - ErrorCode EXPRESS_TEMPLATE_NOT_EXISTS = new ErrorCode(1_011_005_001, "运费模板不存在"); - - // ========== 物流 PICK_UP 模块 1-011-006-000 ========== - ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1_011_006_000, "自提门店不存在"); - - // ========== 分销用户 模块 1011007000 ========== - ErrorCode BROKERAGE_USER_NOT_EXISTS = new ErrorCode(1011007000, "分销用户不存在"); - ErrorCode BROKERAGE_USER_FROZEN_PRICE_NOT_ENOUGH = new ErrorCode(1011007001, "用户冻结佣金({})数量不足"); - ErrorCode BROKERAGE_BIND_SELF = new ErrorCode(1011007002, "不能绑定自己"); - ErrorCode BROKERAGE_BIND_USER_NOT_ENABLED = new ErrorCode(1011007003, "绑定用户没有推广资格"); - ErrorCode BROKERAGE_BIND_CONDITION_ADMIN = new ErrorCode(1011007004, "仅可在后台绑定推广员"); - ErrorCode BROKERAGE_BIND_MODE_REGISTER = new ErrorCode(1011007005, "只有在注册时可以绑定"); - ErrorCode BROKERAGE_BIND_OVERRIDE = new ErrorCode(1011007006, "已绑定了推广人"); - ErrorCode BROKERAGE_BIND_LOOP = new ErrorCode(1011007007, "下级不能绑定自己的上级"); - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/MessageTemplateConstants.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/MessageTemplateConstants.java deleted file mode 100644 index 691598d4..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/MessageTemplateConstants.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.win.module.trade.enums; - -// TODO @芋艿:枚举 -/** - * 通知模板枚举类 - * - * @author HUIHUI - */ -public interface MessageTemplateConstants { - - String ORDER_DELIVERY = "order_delivery"; // 短信模版编号 - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java deleted file mode 100644 index d2df674a..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.trade.enums.aftersale; - -/** - * 售后操作类型的枚举 - * - * @author 陈賝 - * @since 2023/6/13 13:53 - */ -// TODO @chenchen:可以 lombok 简化构造方法,和 get 方法 -public enum AfterSaleOperateTypeEnum { - - /** - * 用户申请 - */ - APPLY("用户申请"), - ; - - private final String description; - - AfterSaleOperateTypeEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleStatusEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleStatusEnum.java deleted file mode 100644 index ae8c5ed4..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleStatusEnum.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.win.module.trade.enums.aftersale; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; -import java.util.Collection; - -import static cn.hutool.core.util.ArrayUtil.firstMatch; - -/** - * 售后状态的枚举 - * - * 状态流转 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum TradeAfterSaleStatusEnum implements IntArrayValuable { - - /** - * 【申请售后】 - */ - APPLY(10,"申请中", "会员申请退款"), // 有赞的状态提示:退款申请待商家处理 - /** - * 卖家通过售后;【商品待退货】 - */ - SELLER_AGREE(20, "卖家通过", "商家同意退款"), // 有赞的状态提示:请退货并填写物流信息 - /** - * 买家已退货,等待卖家收货;【商家待收货】 - */ - BUYER_DELIVERY(30,"待卖家收货", "会员填写退货物流信息"), // 有赞的状态提示:退货退款申请待商家处理 - /** - * 卖家已收货,等待平台退款;等待退款【等待退款】 - */ - WAIT_REFUND(40, "等待平台退款", "商家收货"), // 有赞的状态提示:无(有赞无该状态) - /** - * 完成退款【退款成功】 - */ - COMPLETE(50, "完成", "商家确认退款"), // 有赞的状态提示:退款成功 - /** - * 【买家取消】 - */ - BUYER_CANCEL(61, "买家取消售后", "会员取消退款"), // 有赞的状态提示:退款关闭 - /** - * 卖家拒绝售后;商家拒绝【商家拒绝】 - */ - SELLER_DISAGREE(62,"卖家拒绝", "商家拒绝退款"), // 有赞的状态提示:商家不同意退款申请 - /** - * 卖家拒绝收货,终止售后;【商家拒收货】 - */ - SELLER_REFUSE(63,"卖家拒绝收货", "商家拒绝收货"), // 有赞的状态提示:商家拒绝收货,不同意退款 - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleStatusEnum::getStatus).toArray(); - - /** - * 进行中的售后状态 - * - * 不包括已经结束的状态 - */ - public static final Collection APPLYING_STATUSES = Arrays.asList( - APPLY.getStatus(), - SELLER_AGREE.getStatus(), - BUYER_DELIVERY.getStatus(), - WAIT_REFUND.getStatus() - ); - - /** - * 状态 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - /** - * 操作内容 - * - * 目的:记录售后日志的内容 - */ - private final String content; - - @Override - public int[] array() { - return ARRAYS; - } - - public static TradeAfterSaleStatusEnum valueOf(Integer status) { - return firstMatch(value -> value.getStatus().equals(status), values()); - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java deleted file mode 100644 index c51fe67a..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.trade.enums.aftersale; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易售后 - 类型 - * - * @author 芋道源码 - */ -@RequiredArgsConstructor -@Getter -public enum TradeAfterSaleTypeEnum implements IntArrayValuable { - - IN_SALE(10, "售中退款"), // 交易完成前买家申请退款 - AFTER_SALE(20, "售后退款"); // 交易完成后买家申请退款 - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleTypeEnum::getType).toArray(); - - /** - * 类型 - */ - private final Integer type; - /** - * 类型名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleWayEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleWayEnum.java deleted file mode 100644 index 5d43193a..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/aftersale/TradeAfterSaleWayEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.trade.enums.aftersale; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易售后 - 方式 - * - * @author Sin - */ -@RequiredArgsConstructor -@Getter -public enum TradeAfterSaleWayEnum implements IntArrayValuable { - - REFUND(10, "仅退款"), - RETURN_AND_REFUND(20, "退货退款"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleWayEnum::getWay).toArray(); - - /** - * 方式 - */ - private final Integer way; - /** - * 方式名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageBindModeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageBindModeEnum.java deleted file mode 100644 index a0ddb93c..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageBindModeEnum.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.trade.enums.brokerage; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 分销关系绑定模式枚举 - * - * @author owen - */ -@AllArgsConstructor -@Getter -public enum BrokerageBindModeEnum implements IntArrayValuable { - - /** - * 只要用户没有推广人,随时都可以绑定分销关系 - */ - ANYTIME(1, "没有推广人"), - /** - * 仅新用户注册时才能绑定推广关系 - */ - REGISTER(2, "新用户"), - /** - * 每次扫码都覆盖 - */ - OVERRIDE(3, "扫码覆盖"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageBindModeEnum::getMode).toArray(); - - /** - * 模式 - */ - private final Integer mode; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java deleted file mode 100644 index 3a77fba0..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.trade.enums.brokerage; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 分佣模式枚举 - * - * @author owen - */ -@AllArgsConstructor -@Getter -public enum BrokerageEnabledConditionEnum implements IntArrayValuable { - - /** - * 所有用户都可以分销 - */ - ALL(1, "人人分销"), - /** - * 仅可后台手动设置推广员 - */ - ADMIN(2, "指定分销"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageEnabledConditionEnum::getCondition).toArray(); - - /** - * 模式 - */ - private final Integer condition; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java deleted file mode 100644 index 5192b99c..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.win.module.trade.enums.brokerage; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 佣金记录业务类型枚举 - * - * @author owen - */ -@AllArgsConstructor -@Getter -public enum BrokerageRecordBizTypeEnum implements IntArrayValuable { - - ORDER(1, "获得推广佣金", "获得推广佣金 {}", true), - WITHDRAW(2, "提现申请", "提现申请扣除佣金 {}", false), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageRecordBizTypeEnum::getType).toArray(); - - /** - * 类型 - */ - private final Integer type; - /** - * 标题 - */ - private final String title; - /** - * 描述 - */ - private final String description; - /** - * 是否为增加佣金 - */ - private final boolean add; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java deleted file mode 100644 index b19dfc64..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.trade.enums.brokerage; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 佣金记录状态枚举 - * - * @author owen - */ -@AllArgsConstructor -@Getter -public enum BrokerageRecordStatusEnum implements IntArrayValuable { - - WAIT_SETTLEMENT(0, "待结算"), - SETTLEMENT(1, "已结算"), - CANCEL(2, "已取消"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageRecordStatusEnum::getStatus).toArray(); - - /** - * 状态 - */ - private final Integer status; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java deleted file mode 100644 index 68ad71fd..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.trade.enums.brokerage; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 佣金提现状态枚举 - * - * @author owen - */ -@AllArgsConstructor -@Getter -public enum BrokerageWithdrawStatusEnum implements IntArrayValuable { - - AUDITING(0, "审核中"), - AUDIT_SUCCESS(10, "审核通过"), - WITHDRAW_SUCCESS(11, "提现成功"), - AUDIT_FAIL(20, "审核不通过"), - WITHDRAW_FAIL(21, "提现失败"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageWithdrawStatusEnum::getStatus).toArray(); - - /** - * 状态 - */ - private final Integer status; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java deleted file mode 100644 index ada499a7..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.trade.enums.brokerage; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 佣金提现类型枚举 - * - * @author owen - */ -@AllArgsConstructor -@Getter -public enum BrokerageWithdrawTypeEnum implements IntArrayValuable { - - WALLET(1, "钱包"), - BANK(2, "银行卡"), - WECHAT(3, "微信"), - ALIPAY(4, "支付宝"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageWithdrawTypeEnum::getType).toArray(); - - /** - * 类型 - */ - private final Integer type; - /** - * 名字 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java deleted file mode 100644 index af672555..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.trade.enums.delivery; - -import cn.hutool.core.util.ArrayUtil; -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 快递配送计费方式枚举 - * - * @author jason - */ -@AllArgsConstructor -@Getter -public enum DeliveryExpressChargeModeEnum implements IntArrayValuable { - - PIECE(1, "按件"), - WEIGHT(2,"按重量"), - VOLUME(3, "按体积"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryExpressChargeModeEnum::getType).toArray(); - - /** - * 类型 - */ - private final Integer type; - /** - * 描述 - */ - private final String desc; - - @Override - public int[] array() { - return ARRAYS; - } - - public static DeliveryExpressChargeModeEnum valueOf(Integer value) { - return ArrayUtil.firstMatch(chargeMode -> chargeMode.getType().equals(value), DeliveryExpressChargeModeEnum.values()); - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryTypeEnum.java deleted file mode 100644 index 908a98a4..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/delivery/DeliveryTypeEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.trade.enums.delivery; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 配送方式枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum DeliveryTypeEnum implements IntArrayValuable { - - NULL(0, "无需物流"), - EXPRESS(1, "快递发货"), - PICK_UP(2, "用户自提"),; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryTypeEnum::getMode).toArray(); - - /** - * 配送方式 - */ - private final Integer mode; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/notify/TradeNotifyEnums.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/notify/TradeNotifyEnums.java deleted file mode 100644 index 35c3fdec..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/notify/TradeNotifyEnums.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.win.module.trade.enums.notify; - -// TODO @芋艿:这个枚举的作用? -public interface TradeNotifyEnums { -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderCancelTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderCancelTypeEnum.java deleted file mode 100644 index a23424b2..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderCancelTypeEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.trade.enums.order; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易订单 - 关闭类型 - * - * @author Sin - */ -@RequiredArgsConstructor -@Getter -public enum TradeOrderCancelTypeEnum implements IntArrayValuable { - - PAY_TIMEOUT(10, "超时未支付"), - AFTER_SALE_CLOSE(20, "退款关闭"), - MEMBER_CANCEL(30, "买家取消"), - PAY_ON_DELIVERY(40, "已通过货到付款交易"),; // TODO 芋艿:这个类型,是不是可以去掉 - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderCancelTypeEnum::getType).toArray(); - - /** - * 关闭类型 - */ - private final Integer type; - /** - * 关闭类型名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java deleted file mode 100644 index 8232e6a1..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.trade.enums.order; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.core.IntArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易订单项 - 售后状态 - * - * @author 芋道源码 - */ -@RequiredArgsConstructor -@Getter -public enum TradeOrderItemAfterSaleStatusEnum implements IntArrayValuable { - - NONE(0, "未售后"), - APPLY(10, "售后中"), - SUCCESS(20, "售后成功"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderItemAfterSaleStatusEnum::getStatus).toArray(); - - /** - * 状态值 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - - /** - * 判断指定状态,是否正处于【未申请】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean isNone(Integer status) { - return ObjectUtil.equals(status, NONE.getStatus()); - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderRefundStatusEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderRefundStatusEnum.java deleted file mode 100644 index 2126394d..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderRefundStatusEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.trade.enums.order; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易订单 - 退款状态 - * - * @author Sin - */ -@RequiredArgsConstructor -@Getter -public enum TradeOrderRefundStatusEnum implements IntArrayValuable { - - NONE(0, "未退款"), - PART(10, "部分退款"), - ALL(20, "全部退款"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderRefundStatusEnum::getStatus).toArray(); - - /** - * 状态值 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderStatusEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderStatusEnum.java deleted file mode 100644 index 521be243..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderStatusEnum.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.win.module.trade.enums.order; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.core.IntArrayValuable; -import com.win.framework.common.util.object.ObjectUtils; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易订单 - 状态 - * - * @author Sin - */ -@RequiredArgsConstructor -@Getter -public enum TradeOrderStatusEnum implements IntArrayValuable { - - UNPAID(0, "待支付"), - UNDELIVERED(10, "待发货"), - DELIVERED(20, "已发货"), - COMPLETED(30, "已完成"), - CANCELED(40, "已取消"); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderStatusEnum::getStatus).toArray(); - - /** - * 状态值 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - - // ========== 问:为什么写了很多 isXXX 和 haveXXX 的判断逻辑呢? ========== - // ========== 答:方便找到某一类判断,哪些业务正在使用 ========== - - /** - * 判断指定状态,是否正处于【未付款】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean isUnpaid(Integer status) { - return ObjectUtil.equal(UNPAID.getStatus(), status); - } - - /** - * 判断指定状态,是否正处于【待发货】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean isUndelivered(Integer status) { - return ObjectUtil.equal(UNDELIVERED.getStatus(), status); - } - - /** - * 判断指定状态,是否正处于【已发货】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean isDelivered(Integer status) { - return ObjectUtil.equals(status, DELIVERED.getStatus()); - } - - /** - * 判断指定状态,是否正处于【已取消】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean isCanceled(Integer status) { - return ObjectUtil.equals(status, CANCELED.getStatus()); - } - - /** - * 判断指定状态,是否正处于【已完成】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean isCompleted(Integer status) { - return ObjectUtil.equals(status, COMPLETED.getStatus()); - } - - /** - * 判断指定状态,是否有过【已付款】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean havePaid(Integer status) { - return ObjectUtils.equalsAny(status, UNDELIVERED.getStatus(), - DELIVERED.getStatus(), COMPLETED.getStatus()); - } - - /** - * 判断指定状态,是否有过【已发货】状态 - * - * @param status 指定状态 - * @return 是否 - */ - public static boolean haveDelivered(Integer status) { - return ObjectUtils.equalsAny(status, DELIVERED.getStatus(), COMPLETED.getStatus()); - } - -} diff --git a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderTypeEnum.java b/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderTypeEnum.java deleted file mode 100644 index f80a9a34..00000000 --- a/win-module-mall/win-module-trade-api/src/main/java/com/win/module/trade/enums/order/TradeOrderTypeEnum.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.trade.enums.order; - -import com.win.framework.common.core.IntArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -/** - * 交易订单 - 类型 - * - * @author Sin - */ -@RequiredArgsConstructor -@Getter -public enum TradeOrderTypeEnum implements IntArrayValuable { - - NORMAL(0, "普通订单"), - SECKILL(1, "秒杀订单"), - BARGAIN(2, "砍价订单"), - COMBINATION(3, "拼团订单"), - ; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderTypeEnum::getType).toArray(); - - /** - * 类型 - */ - private final Integer type; - /** - * 类型名 - */ - private final String name; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/win-module-mall/win-module-trade-biz/pom.xml b/win-module-mall/win-module-trade-biz/pom.xml deleted file mode 100644 index b66e7f4b..00000000 --- a/win-module-mall/win-module-trade-biz/pom.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - com.win - win-module-mall - ${revision} - - 4.0.0 - win-module-trade-biz - jar - - ${project.artifactId} - - trade 模块,主要实现交易相关功能 - 例如:订单、退款、购物车等功能。 - - - - - com.win - win-module-trade-api - ${revision} - - - com.win - win-module-product-api - ${revision} - - - com.win - win-module-pay-api - ${revision} - - - com.win - win-module-promotion-api - ${revision} - - - com.win - win-module-member-api - ${revision} - - - com.win - win-module-system-api - ${revision} - - - - - com.win - win-spring-boot-starter-biz-operatelog - - - com.win - win-spring-boot-starter-biz-tenant - - - com.win - win-spring-boot-starter-biz-ip - - - - - com.win - win-spring-boot-starter-web - - - - com.win - win-spring-boot-starter-security - - - - - com.win - win-spring-boot-starter-biz-pay - - - - - com.win - win-spring-boot-starter-mybatis - - - - com.win - win-spring-boot-starter-redis - - - - - com.win - win-spring-boot-starter-test - - - - - com.win - win-spring-boot-starter-excel - - - com.win - win-spring-boot-starter-biz-dict - - - - - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/brokerage/BrokerageApiImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/brokerage/BrokerageApiImpl.java deleted file mode 100644 index b87bf20d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/brokerage/BrokerageApiImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.api.brokerage; - -import com.win.module.trade.api.brokerage.dto.BrokerageUserDTO; -import com.win.module.trade.convert.brokerage.user.BrokerageUserConvert; -import com.win.module.trade.service.brokerage.user.BrokerageUserService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * 分销 API 接口实现类 - * - * @author owen - */ -@Service -@Validated -public class BrokerageApiImpl implements BrokerageApi { - - @Resource - private BrokerageUserService brokerageUserService; - - @Override - public BrokerageUserDTO getBrokerageUser(Long userId) { - return BrokerageUserConvert.INSTANCE.convertDTO(brokerageUserService.getBrokerageUser(userId)); - } - - @Override - public boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser) { - return brokerageUserService.bindBrokerageUser(userId, bindUserId, isNewUser); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/order/TradeOrderApiImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/order/TradeOrderApiImpl.java deleted file mode 100644 index fde64f39..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/order/TradeOrderApiImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.trade.api.order; - -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.service.order.TradeOrderQueryService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.ORDER_ITEM_NOT_FOUND; - -/** - * 订单 API 接口实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class TradeOrderApiImpl implements TradeOrderApi { - - @Resource - private TradeOrderQueryService tradeOrderQueryService; - - @Override - public Long validateOrder(Long userId, Long orderItemId) { - // 校验订单项,订单项存在订单就存在 - TradeOrderItemDO item = tradeOrderQueryService.getOrderItem(userId, orderItemId); - if (item == null) { - throw exception(ORDER_ITEM_NOT_FOUND); - } - return item.getOrderId(); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/package-info.java deleted file mode 100644 index 4dd60837..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.trade.api; \ No newline at end of file diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.http b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.http deleted file mode 100644 index 81cb35cb..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.http +++ /dev/null @@ -1,33 +0,0 @@ -### 获得交易售后分页 => 成功 -GET {{baseUrl}}/trade/after-sale/page?pageNo=1&pageSize=10 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 同意售后 => 成功 -PUT {{baseUrl}}/trade/after-sale/agree?id=7 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} -Content-Type: application/json - -### 拒绝售后 => 成功 -PUT {{baseUrl}}/trade/after-sale/disagree -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} -Content-Type: application/json - -{ - "id": 6, - "auditReason": "阿巴巴" -} - -### 确认退款 => 成功 -PUT {{baseUrl}}/trade/after-sale/refund?id=6 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} -Content-Type: application/json - -### 确认收货 => 成功 -PUT {{baseUrl}}/trade/after-sale/receive?id=7 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} -Content-Type: application/json diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.java deleted file mode 100644 index ea163528..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/TradeAfterSaleController.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.pay.api.notify.dto.PayRefundNotifyReqDTO; -import com.win.module.trade.controller.admin.aftersale.vo.*; -import com.win.module.trade.convert.aftersale.TradeAfterSaleConvert; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO; -import com.win.module.trade.framework.aftersalelog.core.service.AfterSaleLogService; -import com.win.module.trade.service.aftersale.TradeAfterSaleService; -import com.win.module.trade.service.order.TradeOrderQueryService; -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.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.annotation.security.PermitAll; -import javax.validation.Valid; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 售后订单") -@RestController -@RequestMapping("/trade/after-sale") -@Validated -@Slf4j -public class TradeAfterSaleController { - - @Resource - private TradeAfterSaleService afterSaleService; - @Resource - private TradeOrderQueryService tradeOrderQueryService; - @Resource - private AfterSaleLogService afterSaleLogService; - @Resource - private MemberUserApi memberUserApi; - - @GetMapping("/page") - @Operation(summary = "获得售后订单分页") - @PreAuthorize("@ss.hasPermission('trade:after-sale:query')") - public CommonResult> getAfterSalePage(@Valid TradeAfterSalePageReqVO pageVO) { - // 查询售后 - PageResult pageResult = afterSaleService.getAfterSalePage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // 查询会员 - Map memberUsers = memberUserApi.getUserMap( - convertSet(pageResult.getList(), TradeAfterSaleDO::getUserId)); - return success(TradeAfterSaleConvert.INSTANCE.convertPage(pageResult, memberUsers)); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得售后订单详情") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('trade:after-sale:query')") - public CommonResult getOrderDetail(@RequestParam("id") Long id) { - // 查询订单 - TradeAfterSaleDO afterSale = afterSaleService.getAfterSale(id); - // TODO @puhui999:这里建议改成,如果为 null,直接返回 success null;主要查询操作,尽量不要有非空的提示哈;交给前端处理; -// if (afterSale == null) { -// return success(null, AFTER_SALE_NOT_FOUND.getMsg()); -// } - - // 查询订单 - TradeOrderDO order = tradeOrderQueryService.getOrder(afterSale.getOrderId()); - // 查询订单项 - List orderItems = tradeOrderQueryService.getOrderItemListByOrderId(id); - // 拼接数据 - MemberUserRespDTO user = memberUserApi.getUser(afterSale.getUserId()); - // 获取售后日志 - List logs = afterSaleLogService.getLog(afterSale.getId()); - // TODO 方便测试看效果,review 后移除 - if (logs == null) { - logs = new ArrayList<>(); - } - for (int i = 1; i <= 6; i++) { - TradeAfterSaleLogRespDTO respVO = new TradeAfterSaleLogRespDTO(); - respVO.setId((long) i); - respVO.setUserId((long) i); - respVO.setUserType(i % 2 == 0 ? 2 : 1); - // 模拟系统操作 - if (i == 2) { - respVO.setUserType(3); - } - respVO.setAfterSaleId(id); - respVO.setOrderId((long) i); - respVO.setOrderItemId((long) i); - respVO.setBeforeStatus((i - 1) * 10); - respVO.setAfterStatus(i * 10); - respVO.setContent("66+6"); - respVO.setCreateTime(LocalDateTime.now()); - logs.add(respVO); - } - return success(TradeAfterSaleConvert.INSTANCE.convert(afterSale, order, orderItems, user, logs)); - } - - @PutMapping("/agree") - @Operation(summary = "同意售后") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('trade:after-sale:agree')") - public CommonResult agreeAfterSale(@RequestParam("id") Long id) { - afterSaleService.agreeAfterSale(getLoginUserId(), id); - return success(true); - } - - @PutMapping("/disagree") - @Operation(summary = "拒绝售后") - @PreAuthorize("@ss.hasPermission('trade:after-sale:disagree')") - public CommonResult disagreeAfterSale(@RequestBody TradeAfterSaleDisagreeReqVO confirmReqVO) { - afterSaleService.disagreeAfterSale(getLoginUserId(), confirmReqVO); - return success(true); - } - - @PutMapping("/receive") - @Operation(summary = "确认收货") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('trade:after-sale:receive')") - public CommonResult receiveAfterSale(@RequestParam("id") Long id) { - afterSaleService.receiveAfterSale(getLoginUserId(), id); - return success(true); - } - - @PutMapping("/refuse") - @Operation(summary = "拒绝收货") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('trade:after-sale:receive')") - public CommonResult refuseAfterSale(TradeAfterSaleRefuseReqVO refuseReqVO) { - afterSaleService.refuseAfterSale(getLoginUserId(), refuseReqVO); - return success(true); - } - - @PutMapping("/refund") - @Operation(summary = "确认退款") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('trade:after-sale:refund')") - public CommonResult refundAfterSale(@RequestParam("id") Long id) { - afterSaleService.refundAfterSale(getLoginUserId(), getClientIP(), id); - return success(true); - } - - @PostMapping("/update-refunded") - @Operation(summary = "更新售后订单为已退款") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob - @PermitAll // 无需登录,安全由 PayDemoOrderService 内部校验实现 - @OperateLog(enable = false) // 禁用操作日志,因为没有操作人 - public CommonResult updateAfterRefund(@RequestBody PayRefundNotifyReqDTO notifyReqDTO) { - // 目前业务逻辑,不需要做任何事情 - // 当然,退款会有小概率会失败的情况,可以监控失败状态,进行告警 - log.info("[updateAfterRefund][notifyReqDTO({})]", notifyReqDTO); - return success(true); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleBaseVO.java deleted file mode 100644 index a6deb720..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleBaseVO.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.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 java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* 交易售后 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class TradeAfterSaleBaseVO { - - @Schema(description = "售后流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202211190847450020500077") - @NotNull(message = "售后流水号不能为空") - private String no; - - @Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "售后状态不能为空") - private Integer status; - - @Schema(description = "售后类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - @NotNull(message = "售后类型不能为空") - private Integer type; - - @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "售后方式不能为空") - private Integer way; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30337") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "申请原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "不喜欢") - @NotNull(message = "申请原因不能为空") - private String applyReason; - - @Schema(description = "补充描述", example = "你说的对") - private String applyDescription; - - @Schema(description = "补充凭证图片", example = "https://www.iocoder.cn/1.png") - private List applyPicUrls; - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18078") - @NotNull(message = "订单编号不能为空") - private Long orderId; - - @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022111917190001") - @NotNull(message = "订单流水号不能为空") - private Long orderNo; - - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "572") - @NotNull(message = "订单项编号不能为空") - private Long orderItemId; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2888") - @NotNull(message = "商品 SPU 编号不能为空") - private Long spuId; - - @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotNull(message = "商品 SPU 名称不能为空") - private String spuName; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15657") - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - @Schema(description = "商品图片", example = "https://www.iocoder.cn/2.png") - private String picUrl; - - @Schema(description = "购买数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20012") - @NotNull(message = "购买数量不能为空") - private Integer count; - - @Schema(description = "审批时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime auditTime; - - @Schema(description = "审批人", example = "30835") - private Long auditUserId; - - @Schema(description = "审批备注", example = "不香") - private String auditReason; - - @Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "18077") - @NotNull(message = "退款金额,单位:分不能为空") - private Integer refundPrice; - - @Schema(description = "支付退款编号", example = "10271") - private Long payRefundId; - - @Schema(description = "退款时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime refundTime; - - @Schema(description = "退货物流公司编号", example = "10") - private Long logisticsId; - - @Schema(description = "退货物流单号", example = "610003952009") - private String logisticsNo; - - @Schema(description = "退货时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime deliveryTime; - - @Schema(description = "收货时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime receiveTime; - - @Schema(description = "收货备注", example = "不喜欢") - private String receiveReason; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDetailRespVO.java deleted file mode 100644 index ebde2c41..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDetailRespVO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.vo; - -import com.win.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO; -import com.win.module.trade.controller.admin.base.member.user.MemberUserRespVO; -import com.win.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderBaseVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderItemBaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 售后订单的详情 Response VO") -@Data -public class TradeAfterSaleDetailRespVO extends TradeAfterSaleBaseVO { - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - /** - * 订单项列表 - */ - private List items; - - /** - * 订单基本信息 - */ - private TradeOrderBaseVO order; - - /** - * 用户信息 - */ - private MemberUserRespVO user; - - /** - * 售后日志 - */ - private List logs; - - @Schema(description = "管理后台 - 交易订单的详情的订单项目") - @Data - public static class Item extends TradeOrderItemBaseVO { - - /** - * 属性数组 - */ - private List properties; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDisagreeReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDisagreeReqVO.java deleted file mode 100644 index b5a4a2e6..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDisagreeReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 交易售后拒绝 Request VO") -@Data -public class TradeAfterSaleDisagreeReqVO { - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "售后编号不能为空") - private Long id; - - @Schema(description = "审批备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - @NotEmpty(message = "审批备注不能为空") - private String auditReason; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSalePageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSalePageReqVO.java deleted file mode 100644 index 53486d06..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSalePageReqVO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.vo; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleWayEnum; -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 com.win.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 TradeAfterSalePageReqVO extends PageParam { - - @Schema(description = "售后流水号", example = "202211190847450020500077") - private String no; - - @Schema(description = "售后状态", example = "10") - @InEnum(value = TradeAfterSaleStatusEnum.class, message = "售后状态必须是 {value}") - private Integer status; - - @Schema(description = "售后类型", example = "20") - @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}") - private Integer type; - - @Schema(description = "售后方式", example = "10") - @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}") - private Integer way; - - @Schema(description = "订单编号", example = "18078") - private String orderNo; - - @Schema(description = "商品 SPU 名称", example = "李四") - private String spuName; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRefuseReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRefuseReqVO.java deleted file mode 100644 index 5b58eba3..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRefuseReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 交易售后拒绝收货 Request VO") -@Data -public class TradeAfterSaleRefuseReqVO { - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "售后编号不能为空") - private Long id; - - @Schema(description = "收货备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - @NotNull(message = "收货备注不能为空") - private String refuseMemo; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRespPageItemVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRespPageItemVO.java deleted file mode 100644 index f584c771..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRespPageItemVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.vo; - -import com.win.module.trade.controller.admin.base.member.user.MemberUserRespVO; -import com.win.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class TradeAfterSaleRespPageItemVO extends TradeAfterSaleBaseVO { - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27630") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - /** - * 商品属性数组 - */ - private List properties; - - /** - * 用户信息 - */ - private MemberUserRespVO user; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/log/TradeAfterSaleLogRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/log/TradeAfterSaleLogRespVO.java deleted file mode 100644 index fead8272..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/aftersale/vo/log/TradeAfterSaleLogRespVO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.trade.controller.admin.aftersale.vo.log; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 交易售后日志 Response VO") -@Data -public class TradeAfterSaleLogRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22634") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "用户类型不能为空") - private Integer userType; - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3023") - @NotNull(message = "售后编号不能为空") - private Long afterSaleId; - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25870") - @NotNull(message = "订单编号不能为空") - private Long orderId; - - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23154") - @NotNull(message = "订单项编号不能为空") - private Long orderItemId; - - @Schema(description = "售后状态(之前)", example = "2") - private Integer beforeStatus; - - @Schema(description = "售后状态(之后)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "售后状态(之后)不能为空") - private Integer afterStatus; - - @Schema(description = "操作明细", requiredMode = Schema.RequiredMode.REQUIRED, example = "维权完成,退款金额:¥37776.00") - @NotNull(message = "操作明细不能为空") - private String content; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/package-info.java deleted file mode 100644 index b3ec77e3..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位符,可忽略 - */ -package com.win.module.trade.controller.admin.base.member; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/user/MemberUserRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/user/MemberUserRespVO.java deleted file mode 100644 index 6bde4dff..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/member/user/MemberUserRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.trade.controller.admin.base.member.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 会员用户 Response VO") -@Data -public class MemberUserRespVO { - - @Schema(description = "用户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - private String nickname; - - @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") - private String avatar; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/package-info.java deleted file mode 100644 index af180f8d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 放置该模块通用的 VO 类 - */ -package com.win.module.trade.controller.admin.base; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/product/property/ProductPropertyValueDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/product/property/ProductPropertyValueDetailRespVO.java deleted file mode 100644 index 4a05f92b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/base/product/property/ProductPropertyValueDetailRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.base.product.property; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 商品属性值的明细 Response VO") -@Data -public class ProductPropertyValueDetailRespVO { - - @Schema(description = "属性的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long propertyId; - - @Schema(description = "属性的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") - private String propertyName; - - @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long valueId; - - @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") - private String valueName; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/BrokerageRecordController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/BrokerageRecordController.java deleted file mode 100644 index c052b25a..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/BrokerageRecordController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.record; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordRespVO; -import com.win.module.trade.convert.brokerage.record.BrokerageRecordConvert; -import com.win.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; -import com.win.module.trade.service.brokerage.record.BrokerageRecordService; -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.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 javax.validation.Valid; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 佣金记录") -@RestController -@RequestMapping("/trade/brokerage-record") -@Validated -public class BrokerageRecordController { - - @Resource - private BrokerageRecordService brokerageRecordService; - - @GetMapping("/get") - @Operation(summary = "获得佣金记录") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('trade:brokerage-record:query')") - public CommonResult getBrokerageRecord(@RequestParam("id") Integer id) { - BrokerageRecordDO brokerageRecord = brokerageRecordService.getBrokerageRecord(id); - return success(BrokerageRecordConvert.INSTANCE.convert(brokerageRecord)); - } - - @GetMapping("/page") - @Operation(summary = "获得佣金记录分页") - @PreAuthorize("@ss.hasPermission('trade:brokerage-record:query')") - public CommonResult> getBrokerageRecordPage(@Valid BrokerageRecordPageReqVO pageVO) { - PageResult pageResult = brokerageRecordService.getBrokerageRecordPage(pageVO); - return success(BrokerageRecordConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordBaseVO.java deleted file mode 100644 index ed1d2e05..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordBaseVO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.record.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * 佣金记录 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class BrokerageRecordBaseVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25973") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23353") - @NotEmpty(message = "业务编号不能为空") - private String bizId; - - @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "业务类型不能为空") - private Integer bizType; - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "标题不能为空") - private String title; - - @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "28731") - @NotNull(message = "金额不能为空") - private Integer price; - - @Schema(description = "当前总佣金", requiredMode = Schema.RequiredMode.REQUIRED, example = "13226") - @NotNull(message = "当前总佣金不能为空") - private Integer totalPrice; - - @Schema(description = "说明", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") - @NotNull(message = "说明不能为空") - private String description; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - private Integer status; - - @Schema(description = "冻结时间(天)", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "冻结时间(天)不能为空") - private Integer frozenDays; - - @Schema(description = "解冻时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime unfreezeTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordPageReqVO.java deleted file mode 100644 index 66cf8c96..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordPageReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.record.vo; - -import com.win.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 com.win.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 BrokerageRecordPageReqVO extends PageParam { - - @Schema(description = "用户编号", example = "25973") - private Long userId; - - @Schema(description = "业务类型", example = "1") - private Integer bizType; - - @Schema(description = "状态", example = "1") - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordRespVO.java deleted file mode 100644 index 1ba8cb87..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.record.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 BrokerageRecordRespVO extends BrokerageRecordBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28896") - private Integer id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/BrokerageUserController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/BrokerageUserController.java deleted file mode 100644 index 7dc1c8d0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/BrokerageUserController.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.trade.controller.admin.brokerage.user.vo.*; -import com.win.module.trade.convert.brokerage.user.BrokerageUserConvert; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.enums.brokerage.BrokerageRecordStatusEnum; -import com.win.module.trade.service.brokerage.record.BrokerageRecordService; -import com.win.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; -import com.win.module.trade.service.brokerage.user.BrokerageUserService; -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.Map; -import java.util.Set; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 分销用户") -@RestController -@RequestMapping("/trade/brokerage-user") -@Validated -public class BrokerageUserController { - - @Resource - private BrokerageUserService brokerageUserService; - @Resource - private BrokerageRecordService brokerageRecordService; - - @Resource - private MemberUserApi memberUserApi; - - @PutMapping("/update-brokerage-user") - @Operation(summary = "修改推广员") - @PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-brokerage-user')") - public CommonResult updateBrokerageUser(@Valid @RequestBody BrokerageUserUpdateBrokerageUserReqVO updateReqVO) { - brokerageUserService.updateBrokerageUserId(updateReqVO.getId(), updateReqVO.getBindUserId()); - return success(true); - } - - @PutMapping("/clear-brokerage-user") - @Operation(summary = "清除推广员") - @PreAuthorize("@ss.hasPermission('trade:brokerage-user:clear-brokerage-user')") - public CommonResult clearBrokerageUser(@Valid @RequestBody BrokerageUserClearBrokerageUserReqVO updateReqVO) { - brokerageUserService.updateBrokerageUserId(updateReqVO.getId(), null); - return success(true); - } - - @PutMapping("/update-brokerage-enable") - @Operation(summary = "修改推广资格") - @PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-brokerage-enable')") - public CommonResult updateBrokerageEnabled(@Valid @RequestBody BrokerageUserUpdateBrokerageEnabledReqVO updateReqVO) { - brokerageUserService.updateBrokerageUserEnabled(updateReqVO.getId(), updateReqVO.getEnabled()); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得分销用户") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('trade:brokerage-user:query')") - public CommonResult getBrokerageUser(@RequestParam("id") Long id) { - BrokerageUserDO brokerageUser = brokerageUserService.getBrokerageUser(id); - return success(BrokerageUserConvert.INSTANCE.convert(brokerageUser)); - } - - @GetMapping("/page") - @Operation(summary = "获得分销用户分页") - @PreAuthorize("@ss.hasPermission('trade:brokerage-user:query')") - public CommonResult> getBrokerageUserPage(@Valid BrokerageUserPageReqVO pageVO) { - // 分页查询 - PageResult pageResult = brokerageUserService.getBrokerageUserPage(pageVO); - - // 涉及到的用户 - Set userIds = convertSet(pageResult.getList(), BrokerageUserDO::getId); - // 查询用户信息 - Map userMap = memberUserApi.getUserMap(userIds); - // 合计分佣订单 - Map userOrderSummaryMap = convertMap(userIds, - userId -> userId, - userId -> brokerageRecordService.getUserBrokerageSummaryByUserId(userId, - BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus())); - // 合计推广用户数量 - Map brokerageUserCountMap = convertMap(userIds, - userId -> userId, - userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId)); - - // todo 合计提现 - - return success(BrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap, userOrderSummaryMap)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserBaseVO.java deleted file mode 100644 index 443ca0d4..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserBaseVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user.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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * 分销用户 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class BrokerageUserBaseVO { - - @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4587") - @NotNull(message = "推广员编号不能为空") - private Long bindUserId; - - @Schema(description = "推广员绑定时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime bindUserTime; - - @Schema(description = "推广资格", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "推广资格不能为空") - private Boolean brokerageEnabled; - - @Schema(description = "成为分销员时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime brokerageTime; - - @Schema(description = "可用佣金", requiredMode = Schema.RequiredMode.REQUIRED, example = "11089") - @NotNull(message = "可用佣金不能为空") - private Integer price; - - @Schema(description = "冻结佣金", requiredMode = Schema.RequiredMode.REQUIRED, example = "30916") - @NotNull(message = "冻结佣金不能为空") - private Integer frozenPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserClearBrokerageUserReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserClearBrokerageUserReqVO.java deleted file mode 100644 index 3cd05e64..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserClearBrokerageUserReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 分销用户 - 清除推广员 Request VO") -@Data -@ToString(callSuper = true) -public class BrokerageUserClearBrokerageUserReqVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20019") - @NotNull(message = "用户编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserPageReqVO.java deleted file mode 100644 index 8f81cf09..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user.vo; - -import com.win.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 com.win.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 BrokerageUserPageReqVO extends PageParam { - - @Schema(description = "推广员编号", example = "4587") - private Long bindUserId; - - @Schema(description = "推广资格") - private Boolean brokerageEnabled; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserRespVO.java deleted file mode 100644 index e01b7ea8..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserRespVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user.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 BrokerageUserRespVO extends BrokerageUserBaseVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20019") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - // ========== 用户信息 ========== - - @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") - private String avatar; - @Schema(description = "用户昵称", example = "李四") - private String nickname; - - // ========== 推广信息 ========== - - @Schema(description = "推广用户数量(一级)", example = "20019") - private Integer brokerageUserCount; - @Schema(description = "推广订单数量", example = "20019") - private Integer brokerageOrderCount; - @Schema(description = "推广订单金额", example = "20019") - private Integer brokerageOrderPrice; - - // ========== 提现信息 ========== - - @Schema(description = "已提现金额", example = "20019") - private Integer withdrawPrice; - @Schema(description = "已提现次数", example = "20019") - private Integer withdrawCount; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageEnabledReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageEnabledReqVO.java deleted file mode 100644 index ed2704f4..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageEnabledReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 分销用户 - 修改推广员 Request VO") -@Data -@ToString(callSuper = true) -public class BrokerageUserUpdateBrokerageEnabledReqVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20019") - @NotNull(message = "用户编号不能为空") - private Long id; - - @Schema(description = "推广资格", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "推广资格不能为空") - private Boolean enabled; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageUserReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageUserReqVO.java deleted file mode 100644 index 912ef873..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/brokerage/user/vo/BrokerageUserUpdateBrokerageUserReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.brokerage.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 分销用户 - 修改推广员 Request VO") -@Data -@ToString(callSuper = true) -public class BrokerageUserUpdateBrokerageUserReqVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20019") - @NotNull(message = "用户编号不能为空") - private Long id; - - @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4587") - @NotNull(message = "推广员编号不能为空") - private Long bindUserId; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/TradeConfigController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/TradeConfigController.java deleted file mode 100644 index f8b3583c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/TradeConfigController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.trade.controller.admin.config; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.trade.controller.admin.config.vo.TradeConfigRespVO; -import com.win.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO; -import com.win.module.trade.convert.config.TradeConfigConvert; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; -import com.win.module.trade.service.config.TradeConfigService; -import io.swagger.v3.oas.annotations.Operation; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 交易中心配置") -@RestController -@RequestMapping("/trade/config") -@Validated -public class TradeConfigController { - - @Resource - private TradeConfigService tradeConfigService; - - @PutMapping("/save") - @Operation(summary = "更新交易中心配置") - @PreAuthorize("@ss.hasPermission('trade:config:save')") - public CommonResult updateConfig(@Valid @RequestBody TradeConfigSaveReqVO updateReqVO) { - tradeConfigService.saveTradeConfig(updateReqVO); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得交易中心配置") - @PreAuthorize("@ss.hasPermission('trade:config:query')") - public CommonResult getConfig() { - TradeConfigDO config = tradeConfigService.getTradeConfig(); - return success(TradeConfigConvert.INSTANCE.convert(config)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java deleted file mode 100644 index 83fe6951..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.win.module.trade.controller.admin.config.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.trade.enums.brokerage.BrokerageBindModeEnum; -import com.win.module.trade.enums.brokerage.BrokerageEnabledConditionEnum; -import com.win.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.Range; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.PositiveOrZero; -import java.util.List; - -/** - * 交易中心配置 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class TradeConfigBaseVO { - - // ========== 分销相关 ========== - - @Schema(description = "是否启用分佣", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否启用分佣不能为空") - private Boolean brokerageEnabled; - - @Schema(description = "分佣模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "分佣模式不能为空") - @InEnum(value = BrokerageEnabledConditionEnum.class, message = "分佣模式必须是 {value}") - private Integer brokerageEnabledCondition; - - @Schema(description = "分销关系绑定模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "分销关系绑定模式不能为空") - @InEnum(value = BrokerageBindModeEnum.class, message = "分销关系绑定模式必须是 {value}") - private Integer brokerageBindMode; - - @Schema(description = "分销海报图地址数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/win.jpg]") - private List brokeragePostUrls; - - @Schema(description = "一级返佣比例", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "一级返佣比例不能为空") - @Range(min = 0, max = 100, message = "一级返佣比例必须在 0 - 100 之间") - private Integer brokerageFirstPercent; - - @Schema(description = "二级返佣比例", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "二级返佣比例不能为空") - @Range(min = 0, max = 100, message = "二级返佣比例必须在 0 - 100 之间") - private Integer brokerageSecondPercent; - - @Schema(description = "用户提现最低金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - @NotNull(message = "用户提现最低金额不能为空") - @PositiveOrZero(message = "用户提现最低金额不能是负数") - private Integer brokerageWithdrawMinPrice; - - @Schema(description = "提现银行", requiredMode = Schema.RequiredMode.REQUIRED, example = "[0, 1]") - @NotEmpty(message = "提现银行不能为空") - private List brokerageBankNames; - - @Schema(description = "佣金冻结时间(天)", requiredMode = Schema.RequiredMode.REQUIRED, example = "7") - @NotNull(message = "佣金冻结时间(天)不能为空") - @PositiveOrZero(message = "佣金冻结时间不能是负数") - private Integer brokerageFrozenDays; - - @Schema(description = "提现方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "[0, 1]") - @NotNull(message = "提现方式不能为空") - @InEnum(value = BrokerageWithdrawTypeEnum.class, message = "提现方式必须是 {value}") - private List brokerageWithdrawType; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigRespVO.java deleted file mode 100644 index bd8621a5..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigRespVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.trade.controller.admin.config.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - 交易中心配置 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class TradeConfigRespVO extends TradeConfigBaseVO { - - @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigSaveReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigSaveReqVO.java deleted file mode 100644 index aad3d415..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/config/vo/TradeConfigSaveReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.trade.controller.admin.config.vo; - -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 TradeConfigSaveReqVO extends TradeConfigBaseVO { - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressController.java deleted file mode 100644 index 4634845b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.trade.controller.admin.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.excel.core.util.ExcelUtils; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.module.trade.controller.admin.delivery.vo.express.*; -import com.win.module.trade.convert.delivery.DeliveryExpressConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.service.delivery.DeliveryExpressService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 快递公司") -@RestController -@RequestMapping("/trade/delivery/express") -@Validated -public class DeliveryExpressController { - - @Resource - private DeliveryExpressService deliveryExpressService; - - @PostMapping("/create") - @Operation(summary = "创建快递公司") - @PreAuthorize("@ss.hasPermission('trade:delivery:express:create')") - public CommonResult createDeliveryExpress(@Valid @RequestBody DeliveryExpressCreateReqVO createReqVO) { - return success(deliveryExpressService.createDeliveryExpress(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新快递公司") - @PreAuthorize("@ss.hasPermission('trade:delivery:express:update')") - public CommonResult updateDeliveryExpress(@Valid @RequestBody DeliveryExpressUpdateReqVO updateReqVO) { - deliveryExpressService.updateDeliveryExpress(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除快递公司") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('trade:delivery:express:delete')") - public CommonResult deleteDeliveryExpress(@RequestParam("id") Long id) { - deliveryExpressService.deleteDeliveryExpress(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得快递公司") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('trade:delivery:express:query')") - public CommonResult getDeliveryExpress(@RequestParam("id") Long id) { - DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(id); - return success(DeliveryExpressConvert.INSTANCE.convert(deliveryExpress)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取快递公司精简信息列表", description = "主要用于前端的下拉选项") - public CommonResult> getSimpleDeliveryExpressList() { - List list = deliveryExpressService.getDeliveryExpressListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(DeliveryExpressConvert.INSTANCE.convertList1(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得快递公司分页") - @PreAuthorize("@ss.hasPermission('trade:delivery:express:query')") - public CommonResult> getDeliveryExpressPage(@Valid DeliveryExpressPageReqVO pageVO) { - PageResult pageResult = deliveryExpressService.getDeliveryExpressPage(pageVO); - return success(DeliveryExpressConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出快递公司 Excel") - @PreAuthorize("@ss.hasPermission('trade:delivery:express:export')") - @OperateLog(type = EXPORT) - public void exportDeliveryExpressExcel(@Valid DeliveryExpressExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = deliveryExpressService.getDeliveryExpressList(exportReqVO); - // 导出 Excel - List dataList = DeliveryExpressConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "快递公司.xls", "数据", DeliveryExpressExcelVO.class, dataList); - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java deleted file mode 100644 index 0dcae5f4..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.win.module.trade.controller.admin.delivery; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.*; -import com.win.module.trade.convert.delivery.DeliveryExpressTemplateConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO; -import com.win.module.trade.service.delivery.DeliveryExpressTemplateService; -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 com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 快递运费模板") -@RestController -@RequestMapping("/trade/delivery/express-template") -@Validated -public class DeliveryExpressTemplateController { - - @Resource - private DeliveryExpressTemplateService deliveryExpressTemplateService; - - @PostMapping("/create") - @Operation(summary = "创建快递运费模板") - @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:create')") - public CommonResult createDeliveryExpressTemplate(@Valid @RequestBody DeliveryExpressTemplateCreateReqVO createReqVO) { - return success(deliveryExpressTemplateService.createDeliveryExpressTemplate(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新快递运费模板") - @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:update')") - public CommonResult updateDeliveryExpressTemplate(@Valid @RequestBody DeliveryExpressTemplateUpdateReqVO updateReqVO) { - deliveryExpressTemplateService.updateDeliveryExpressTemplate(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除快递运费模板") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:delete')") - public CommonResult deleteDeliveryExpressTemplate(@RequestParam("id") Long id) { - deliveryExpressTemplateService.deleteDeliveryExpressTemplate(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得快递运费模板") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:query')") - public CommonResult getDeliveryExpressTemplate(@RequestParam("id") Long id) { - return success(deliveryExpressTemplateService.getDeliveryExpressTemplate(id)); - } - - @GetMapping("/list") - @Operation(summary = "获得快递运费模板列表") - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:query')") - public CommonResult> getDeliveryExpressTemplateList(@RequestParam("ids") Collection ids) { - List list = deliveryExpressTemplateService.getDeliveryExpressTemplateList(ids); - return success(DeliveryExpressTemplateConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取快递模版精简信息列表", description = "主要用于前端的下拉选项") - public CommonResult> getSimpleTemplateList() { - // 获取运费模版列表,只要开启状态的 - List list = deliveryExpressTemplateService.getDeliveryExpressTemplateList(); - // 排序后,返回给前端 - return success(DeliveryExpressTemplateConvert.INSTANCE.convertList1(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得快递运费模板分页") - @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:query')") - public CommonResult> getDeliveryExpressTemplatePage(@Valid DeliveryExpressTemplatePageReqVO pageVO) { - PageResult pageResult = deliveryExpressTemplateService.getDeliveryExpressTemplatePage(pageVO); - return success(DeliveryExpressTemplateConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryPickUpStoreController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryPickUpStoreController.java deleted file mode 100644 index 467bc3c2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/DeliveryPickUpStoreController.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.win.module.trade.controller.admin.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.pickup.*; -import com.win.module.trade.convert.delivery.DeliveryPickUpStoreConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; -import com.win.module.trade.service.delivery.DeliveryPickUpStoreService; -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 com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 自提门店") -@RestController -@RequestMapping("/trade/delivery/pick-up-store") -@Validated -public class DeliveryPickUpStoreController { - - @Resource - private DeliveryPickUpStoreService deliveryPickUpStoreService; - - @PostMapping("/create") - @Operation(summary = "创建自提门店") - @PreAuthorize("@ss.hasPermission('trade:delivery:pick-up-store:create')") - public CommonResult createDeliveryPickUpStore(@Valid @RequestBody DeliveryPickUpStoreCreateReqVO createReqVO) { - return success(deliveryPickUpStoreService.createDeliveryPickUpStore(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新自提门店") - @PreAuthorize("@ss.hasPermission('trade:delivery:pick-up-store:update')") - public CommonResult updateDeliveryPickUpStore(@Valid @RequestBody DeliveryPickUpStoreUpdateReqVO updateReqVO) { - deliveryPickUpStoreService.updateDeliveryPickUpStore(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除自提门店") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('trade:delivery:pick-up-store:delete')") - public CommonResult deleteDeliveryPickUpStore(@RequestParam("id") Long id) { - deliveryPickUpStoreService.deleteDeliveryPickUpStore(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得自提门店") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('trade:delivery:pick-up-store:query')") - public CommonResult getDeliveryPickUpStore(@RequestParam("id") Long id) { - DeliveryPickUpStoreDO deliveryPickUpStore = deliveryPickUpStoreService.getDeliveryPickUpStore(id); - return success(DeliveryPickUpStoreConvert.INSTANCE.convert(deliveryPickUpStore)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获得自提门店精简信息列表") - public CommonResult> getSimpleDeliveryPickUpStoreList() { - List list = deliveryPickUpStoreService.getDeliveryPickUpStoreListByStatus( - CommonStatusEnum.ENABLE.getStatus()); - return success(DeliveryPickUpStoreConvert.INSTANCE.convertList1(list)); - } - - @GetMapping("/list") - @Operation(summary = "获得自提门店列表") - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('trade:delivery:pick-up-store:query')") - public CommonResult> getDeliveryPickUpStoreList(@RequestParam("ids") Collection ids) { - List list = deliveryPickUpStoreService.getDeliveryPickUpStoreList(ids); - return success(DeliveryPickUpStoreConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得自提门店分页") - @PreAuthorize("@ss.hasPermission('trade:delivery:pick-up-store:query')") - public CommonResult> getDeliveryPickUpStorePage(@Valid DeliveryPickUpStorePageReqVO pageVO) { - PageResult pageResult = deliveryPickUpStoreService.getDeliveryPickUpStorePage(pageVO); - return success(DeliveryPickUpStoreConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java deleted file mode 100644 index 59856184..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 快递公司 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class DeliveryExpressBaseVO { - - @Schema(description = "快递公司编码", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "快递公司编码不能为空") - private String code; - - @Schema(description = "快递公司名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotNull(message = "快递公司名称不能为空") - private String name; - - @Schema(description = "快递公司logo") - private String logo; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排序不能为空") - private Integer sort; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - private Integer status; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressCreateReqVO.java deleted file mode 100644 index b1d14188..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -import lombok.*; -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(description = "管理后台 - 快递公司创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeliveryExpressCreateReqVO extends DeliveryExpressBaseVO { - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java deleted file mode 100644 index 50478055..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -import com.win.framework.excel.core.annotations.DictFormat; -import com.win.framework.excel.core.convert.DictConvert; -import com.win.module.system.enums.DictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 快递公司 Excel VO - */ -@Data -public class DeliveryExpressExcelVO { - - @ExcelProperty("编号") - private Long id; - - @ExcelProperty("快递公司编码") - private String code; - - @ExcelProperty("快递公司名称") - private String name; - - @ExcelProperty("快递公司 logo") - private String logo; - - @ExcelProperty("排序") - private Integer sort; - - @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.COMMON_STATUS) - private Integer status; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExportReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExportReqVO.java deleted file mode 100644 index adfae0d9..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExportReqVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 快递公司 Excel 导出 Request VO") -@Data -public class DeliveryExpressExportReqVO { - - @Schema(description = "快递公司编码") - private String code; - - @Schema(description = "快递公司名称", example = "李四") - private String name; - - @Schema(description = "状态(0正常 1停用)", example = "1") - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressPageReqVO.java deleted file mode 100644 index 30ad0204..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressPageReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import com.win.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; - -import static com.win.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 DeliveryExpressPageReqVO extends PageParam { - - @Schema(description = "快递公司编码") - private String code; - - @Schema(description = "快递公司名称", example = "李四") - private String name; - - @Schema(description = "状态(0正常 1停用)", example = "1") - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java deleted file mode 100644 index f449ed25..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -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 DeliveryExpressRespVO extends DeliveryExpressBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6592") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressSimpleRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressSimpleRespVO.java deleted file mode 100644 index 99267d22..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressSimpleRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 快递公司精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DeliveryExpressSimpleRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6592") - @NotNull(message = "编号不能为空") - private Long id; - - @Schema(description = "快递公司名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "顺丰速运") - @NotNull(message = "快递公司名称不能为空") - private String name; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java deleted file mode 100644 index 419601d3..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.express; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeliveryExpressUpdateReqVO extends DeliveryExpressBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6592") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java deleted file mode 100644 index 4ab411af..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 快递运费模板 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class DeliveryExpressTemplateBaseVO { - - @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") - @NotNull(message = "模板名称不能为空") - private String name; - - @Schema(description = "配送计费方式 1:按件 2:按重量 3:按体积", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "配送计费方式 1:按件 2:按重量 3:按体积不能为空") - private Integer chargeMode; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "排序不能为空") - private Integer sort; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java deleted file mode 100644 index 78f706d7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import java.util.Collections; -import java.util.List; - -@Schema(description = "管理后台 - 快递运费模板创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeliveryExpressTemplateCreateReqVO extends DeliveryExpressTemplateBaseVO { - - @Schema(description = "区域运费列表") - @Valid - private List templateCharge; - - @Schema(description = "包邮区域列表") - @Valid - private List templateFree; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java deleted file mode 100644 index 6ec48ec1..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.List; - -@Schema(description = "管理后台 - 快递运费模板的详细 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeliveryExpressTemplateDetailRespVO extends DeliveryExpressTemplateBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "371") - private Long id; - - @Schema(description = "运费模板运费设置", requiredMode = Schema.RequiredMode.REQUIRED) - private List templateCharge; - - @Schema(description = "运费模板包邮区域", requiredMode = Schema.RequiredMode.REQUIRED) - private List templateFree; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplatePageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplatePageReqVO.java deleted file mode 100644 index 6386e920..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplatePageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import com.win.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 com.win.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 DeliveryExpressTemplatePageReqVO extends PageParam { - - @Schema(description = "模板名称", example = "王五") - private String name; - - @Schema(description = "配送计费方式 1:按件 2:按重量 3:按体积") - private Integer chargeMode; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java deleted file mode 100644 index 0ed1c6f7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -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 DeliveryExpressTemplateRespVO extends DeliveryExpressTemplateBaseVO { - - @Schema(description = "编号,自增", requiredMode = Schema.RequiredMode.REQUIRED, example = "371") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java deleted file mode 100644 index d05c9c00..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - - -@Schema(description = "管理后台 - 模版精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DeliveryExpressTemplateSimpleRespVO { - - @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试模版") - private String name; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java deleted file mode 100644 index 6352908b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 快递运费模板更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeliveryExpressTemplateUpdateReqVO extends DeliveryExpressTemplateBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "371") - @NotNull(message = "编号不能为空") - private Long id; - - @Schema(description = "区域运费列表") - @Valid - private List templateCharge; - - @Schema(description = "包邮区域列表") - @Valid - private List templateFree; - - @Schema(description = "管理后台 - 快递运费模板区域运费更新 Request VO") - @Data - public static class ExpressTemplateChargeUpdateVO extends ExpressTemplateChargeBaseVO { - - @Schema(description = "编号", example = "6592") - private Long id; - - // TODO @jason:这几个字段,应该不通过前端传递,而是后端查询后去赋值的 - @Schema(description = "配送模板编号", example = "1") - private Long templateId; - - @Schema(description = "配送计费方式", example = "1") - private Integer chargeMode; - - } - - @Schema(description = "管理后台 - 快递运费模板包邮区域更新 Request VO") - @Data - public static class ExpressTemplateFreeUpdateVO extends ExpressTemplateFreeBaseVO { - - @Schema(description = "编号", example = "6592") - private Long id; - - @Schema(description = "配送模板编号", example = "1") - private Long templateId; - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateChargeBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateChargeBaseVO.java deleted file mode 100644 index 3524380f..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateChargeBaseVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 快递运费模板运费设置 Base VO,提供给添加运费模板使用 - */ -@Data -public class ExpressTemplateChargeBaseVO { - - @Schema(description = "区域编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,120000]") - @NotEmpty(message = "区域编号列表不能为空") - private List areaIds; - - @Schema(description = "首件数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "首件数量不能为空") - private Double startCount; - - @Schema(description = "起步价", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - @NotNull(message = "起步价不能为空") - private Integer startPrice; - - @Schema(description = "续件数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "续件数量不能为空") - private Double extraCount; - - @Schema(description = "额外价", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") - @NotNull(message = "额外价不能为空") - private Integer extraPrice; -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateFreeBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateFreeBaseVO.java deleted file mode 100644 index 78c72aa6..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateFreeBaseVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.expresstemplate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 快递运费模板包邮 Base VO,提供给添加运费模板使用 - */ -@Data -public class ExpressTemplateFreeBaseVO { - - @Schema(description = "区域编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,120000]") - @NotEmpty(message = "区域编号列表不能为空") - private List areaIds; - - @Schema(description = "包邮金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "5000") - @NotNull(message = "包邮金额不能为空") - private Integer freePrice; - - @Schema(description = "包邮件数", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "包邮件数不能为空") - private Integer freeCount; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java deleted file mode 100644 index 8744dd59..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.pickup; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.time.LocalTime; - -/** -* 自提门店 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class DeliveryPickUpStoreBaseVO { - - @Schema(description = "门店名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotBlank(message = "门店名称不能为空") - private String name; - - @Schema(description = "门店简介", example = "我是门店简介") - private String introduction; - - @Schema(description = "门店手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601892312") - @NotBlank(message = "门店手机不能为空") - @Mobile - private String phone; - - @Schema(description = "区域编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18733") - @NotNull(message = "区域编号不能为空") - private Integer areaId; - - @Schema(description = "门店详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "复旦大学路 188 号") - @NotBlank(message = "门店详细地址不能为空") - private String detailAddress; - - @Schema(description = "门店 logo", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - @NotBlank(message = "门店 logo 不能为空") - private String logo; - - @Schema(description = "营业开始时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "营业开始时间不能为空") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") - private LocalTime openingTime; - - @Schema(description = "营业结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "营业结束时间不能为空") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") - private LocalTime closingTime; - - @Schema(description = "纬度", requiredMode = Schema.RequiredMode.REQUIRED, example = "5.88") - @NotNull(message = "纬度不能为空") - private Double latitude; - - @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED, example = "6.99") - @NotNull(message = "经度不能为空") - private Double longitude; - - @Schema(description = "门店状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "门店状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreCreateReqVO.java deleted file mode 100644 index 5e270985..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.pickup; - -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 DeliveryPickUpStoreCreateReqVO extends DeliveryPickUpStoreBaseVO { - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java deleted file mode 100644 index 14b87888..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.pickup; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import lombok.*; - -import java.time.LocalTime; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import com.win.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; -import static com.win.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 DeliveryPickUpStorePageReqVO extends PageParam { - - @Schema(description = "门店名称", example = "李四") - private String name; - - @Schema(description = "门店手机") - private String phone; - - @Schema(description = "区域编号", example = "18733") - private Integer areaId; - - @Schema(description = "门店状态", example = "1") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java deleted file mode 100644 index 30c897c0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.pickup; - -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 DeliveryPickUpStoreRespVO extends DeliveryPickUpStoreBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23128") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreSimpleRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreSimpleRespVO.java deleted file mode 100644 index 4d6d9d29..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreSimpleRespVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.pickup; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Schema(description = "管理后台 - 自提门店精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class DeliveryPickUpStoreSimpleRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23128") - private Long id; - - @Schema(description = "门店名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - private String name; - - @Schema(description = "门店手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601892312") - private String phone; - - @Schema(description = "区域编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18733") - private Integer areaId; - - @Schema(description = "区域名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "xx市") - private String areaName; - - @Schema(description = "门店详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "复旦大学路 188 号") - private String detailAddress; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java deleted file mode 100644 index 1a580009..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.trade.controller.admin.delivery.vo.pickup; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeliveryPickUpStoreUpdateReqVO extends DeliveryPickUpStoreBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23128") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.http b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.http deleted file mode 100644 index 0bf8812b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.http +++ /dev/null @@ -1,9 +0,0 @@ -### 获得交易订单分页 => 成功 -GET {{baseUrl}}/trade/order/page?pageNo=1&pageSize=10 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 获得交易订单分页 => 成功 -GET {{baseUrl}}/trade/order/get-detail?id=21 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.java deleted file mode 100644 index 72f1f8ee..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/TradeOrderController.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.win.module.trade.controller.admin.order; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.trade.controller.admin.order.vo.*; -import com.win.module.trade.convert.order.TradeOrderConvert; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.service.order.TradeOrderQueryService; -import com.win.module.trade.service.order.TradeOrderUpdateService; -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.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 交易订单") -@RestController -@RequestMapping("/trade/order") -@Validated -@Slf4j -public class TradeOrderController { - - @Resource - private TradeOrderUpdateService tradeOrderUpdateService; - @Resource - private TradeOrderQueryService tradeOrderQueryService; - - @Resource - private MemberUserApi memberUserApi; - - @GetMapping("/page") - @Operation(summary = "获得交易订单分页") - @PreAuthorize("@ss.hasPermission('trade:order:query')") - public CommonResult> getOrderPage(TradeOrderPageReqVO reqVO) { - // 查询订单 - PageResult pageResult = tradeOrderQueryService.getOrderPage(reqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // 查询用户信息 - Map userMap = memberUserApi.getUserMap(convertSet(pageResult.getList(), TradeOrderDO::getUserId));; - // 查询订单项 - List orderItems = tradeOrderQueryService.getOrderItemListByOrderId( - convertSet(pageResult.getList(), TradeOrderDO::getId)); - // 最终组合 - return success(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap)); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得交易订单详情") - @Parameter(name = "id", description = "订单编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('trade:order:query')") - public CommonResult getOrderDetail(@RequestParam("id") Long id) { - // 查询订单 - TradeOrderDO order = tradeOrderQueryService.getOrder(id); - // TODO @puhui999:这里建议改成,如果为 null,直接返回 success null;主要查询操作,尽量不要有非空的提示哈;交给前端处理; -// if (order == null) { -// return success(null, ORDER_NOT_FOUND.getMsg()); -// } - - // 查询订单项 - List orderItems = tradeOrderQueryService.getOrderItemListByOrderId(id); - // orderLog - // 拼接数据 - MemberUserRespDTO user = memberUserApi.getUser(order.getUserId()); - return success(TradeOrderConvert.INSTANCE.convert(order, orderItems, user)); - } - - @GetMapping("/get-express-track-list") - @Operation(summary = "获得交易订单的物流轨迹") - @Parameter(name = "id", description = "交易订单编号") - @PreAuthorize("@ss.hasPermission('trade:order:query')") - public CommonResult> getOrderExpressTrackList(@RequestParam("id") Long id) { - return success(TradeOrderConvert.INSTANCE.convertList02( - tradeOrderQueryService.getExpressTrackList(id))); - } - - @PutMapping("/delivery") - @Operation(summary = "订单发货") - @PreAuthorize("@ss.hasPermission('trade:order:update')") - public CommonResult deliveryOrder(@RequestBody TradeOrderDeliveryReqVO deliveryReqVO) { - tradeOrderUpdateService.deliveryOrder(deliveryReqVO); - return success(true); - } - - @PutMapping("/update-remark") - @Operation(summary = "订单备注") - @PreAuthorize("@ss.hasPermission('trade:order:update')") - public CommonResult updateOrderRemark(@RequestBody TradeOrderRemarkReqVO reqVO) { - tradeOrderUpdateService.updateOrderRemark(reqVO); - return success(true); - } - - @PutMapping("/update-price") - @Operation(summary = "订单调价") - @PreAuthorize("@ss.hasPermission('trade:order:update')") - public CommonResult updateOrderPrice(@RequestBody TradeOrderUpdatePriceReqVO reqVO) { - tradeOrderUpdateService.updateOrderPrice(reqVO); - return success(true); - } - - @PutMapping("/update-address") - @Operation(summary = "修改订单收货地址") - @PreAuthorize("@ss.hasPermission('trade:order:update')") - public CommonResult updateOrderAddress(@RequestBody TradeOrderUpdateAddressReqVO reqVO) { - tradeOrderUpdateService.updateOrderAddress(reqVO); - return success(true); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java deleted file mode 100644 index 5400c8ad..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 交易订单 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class TradeOrderBaseVO { - - // ========== 订单基本信息 ========== - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1146347329394184195") - private String no; - - @Schema(description = "下单时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "订单类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer type; - - @Schema(description = "订单来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer terminal; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long userId; - - @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") - private String userIp; - - @Schema(description = "用户备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String userRemark; - - @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "购买的商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer productCount; - - @Schema(description = "订单完成时间") - private LocalDateTime finishTime; - - @Schema(description = "订单取消时间") - private LocalDateTime cancelTime; - - @Schema(description = "取消类型", example = "10") - private Integer cancelType; - - @Schema(description = "商家备注", example = "你猜一下") - private String remark; - - // ========== 价格 + 支付基本信息 ========== - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long payOrderId; - - @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean payStatus; - - @Schema(description = "付款时间") - private LocalDateTime payTime; - - @Schema(description = "支付渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_lite") - private String payChannelCode; - - @Schema(description = "商品原价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer totalPrice; - - @Schema(description = "订单优惠(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer discountPrice; - - @Schema(description = "运费金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer deliveryPrice; - - @Schema(description = "订单调价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer adjustPrice; - - @Schema(description = "应付金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer payPrice; - - // ========== 收件 + 物流基本信息 ========== - - @Schema(description = "配送方式", example = "10") - private Integer deliveryType; - - @Schema(description = "自提门店", example = "10") - private Long pickUpStoreId; - - @Schema(description = "配送模板编号", example = "1024") - private Long deliveryTemplateId; - - @Schema(description = "发货物流公司编号", example = "1024") - private Long logisticsId; - - @Schema(description = "发货物流单号", example = "1024") - private String logisticsNo; - - @Schema(description = "发货状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer deliveryStatus; - - @Schema(description = "发货时间") - private LocalDateTime deliveryTime; - - @Schema(description = "收货时间") - private LocalDateTime receiveTime; - - @Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - private String receiverName; - - @Schema(description = "收件人手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "13800138000") - private String receiverMobile; - - @Schema(description = "收件人地区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") - private Integer receiverAreaId; - - @Schema(description = "收件人详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "中关村大街 1 号") - private String receiverDetailAddress; - - // ========== 售后基本信息 ========== - - @Schema(description = "售后状态", example = "1") - private Integer afterSaleStatus; - - @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer refundPrice; - - // ========== 营销基本信息 ========== - - @Schema(description = "优惠劵编号", example = "1024") - private Long couponId; - - @Schema(description = "优惠劵减免金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer couponPrice; - - @Schema(description = "积分抵扣的金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer pointPrice; -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java deleted file mode 100644 index 24c878b5..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 订单发货 Request VO") -@Data -public class TradeOrderDeliveryReqVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "订单编号不能为空") - private Long id; - - @Schema(description = "发货物流公司编号", example = "1") - @NotNull(message = "发货物流公司不能为空") - private Long logisticsId; - - @Schema(description = "发货物流单号", example = "SF123456789") - private String logisticsNo; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java deleted file mode 100644 index 1658b106..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import com.win.module.trade.controller.admin.base.member.user.MemberUserRespVO; -import com.win.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管理后台 - 交易订单的详情 Response VO") -@Data -public class TradeOrderDetailRespVO extends TradeOrderBaseVO { - - @Schema(description = "收件人地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海 上海市 普陀区") - private String receiverAreaName; - - /** - * 订单项列表 - */ - private List items; - - /** - * 用户信息 - */ - private MemberUserRespVO user; - - /** - * TODO 订单操作日志, 先模拟一波 - */ - private List logs; - - @Schema(description = "管理后台 - 交易订单的操作日志") - @Data - public static class OrderLog { - - @Schema(description = "操作详情", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单发货") - private String content; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-06-01 10:50:20") - private LocalDateTime createTime; - - @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer userType; - - } - - @Schema(description = "管理后台 - 交易订单的详情的订单项目") - @Data - public static class Item extends TradeOrderItemBaseVO { - - /** - * 属性数组 - */ - private List properties; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java deleted file mode 100644 index 5856facc..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -/** - * 交易订单项 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class TradeOrderItemBaseVO { - - // ========== 订单项基本信息 ========== - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long userId; - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long orderId; - - // ========== 商品基本信息 ========== - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long spuId; - - @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - private String spuName; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long skuId; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String picUrl; - - @Schema(description = "购买数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer count; - - // ========== 价格 + 支付基本信息 ========== - - @Schema(description = "商品原价(单)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer price; - - @Schema(description = "商品优惠(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer discountPrice; - - @Schema(description = "商品实付金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer payPrice; - - @Schema(description = "子订单分摊金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer orderPartPrice; - - @Schema(description = "分摊后子订单实付金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer orderDividePrice; - - // ========== 营销基本信息 ========== - - // TODO 芋艿:在捉摸一下 - - // ========== 售后基本信息 ========== - - @Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer afterSaleStatus; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java deleted file mode 100644 index fb108fe8..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 交易订单的分页项 Response VO") -@Data -public class TradeOrderPageItemRespVO extends TradeOrderBaseVO { - - @Schema(description = "收件人地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海 上海市 普陀区") - private String receiverAreaName; - - /** - * 订单项列表 - */ - private List items; - - // TODO @xiaobai:使用 MemberUserRespVO 返回哈;DTO 不直接给前端 - /** - * 用户信息 - */ - private MemberUserRespDTO user; - - @Schema(description = "管理后台 - 交易订单的分页项的订单项目") - @Data - public static class Item extends TradeOrderItemBaseVO { - - /** - * 属性数组 - */ - private List properties; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java deleted file mode 100644 index 2b8697cb..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import com.win.framework.common.enums.TerminalEnum; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 交易订单的分页 Request VO") -@Data -public class TradeOrderPageReqVO extends PageParam { - - @Schema(description = "订单号", example = "88888888") - private String no; - - @Schema(description = "用户编号", example = "1024") - private Long userId; - - @Schema(description = "用户昵称", example = "小王") - private String userNickname; - - @Schema(description = "用户手机号", example = "小王") - @Mobile - private String userMobile; - - @Schema(description = "发货物流公司编号", example = "1") - private Long logisticsId; - - @Schema(description = "自提门店编号", example = "[1,2]") - private List pickUpStoreIds; - - @Schema(description = "收件人名称", example = "小红") - private String receiverName; - - @Schema(description = "收件人手机", example = "1560") - @Mobile - private String receiverMobile; - - @Schema(description = "订单类型", example = "1") - private Integer type; - - @Schema(description = "订单状态", example = "1") - @InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}") - private Integer status; - - @Schema(description = "支付渠道", example = "wx_lite") - private String payChannelCode; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "订单来源", example = "10") - @InEnum(value = TerminalEnum.class, message = "订单来源 {value}") - private Integer terminal; -// TODO 添加配送方式筛选 -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderRemarkReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderRemarkReqVO.java deleted file mode 100644 index b3b7471a..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderRemarkReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 订单备注 Request VO") -@Data -public class TradeOrderRemarkReqVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "订单编号不能为空") - private Long id; - - @Schema(description = "商家备注", example = "你猜一下") - @NotEmpty(message = "订单备注不能为空") - private String remark; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdateAddressReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdateAddressReqVO.java deleted file mode 100644 index 1fc5a610..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdateAddressReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 订单修改地址 Request VO") -@Data -public class TradeOrderUpdateAddressReqVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "订单编号不能为空") - private Long id; - - @Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "z张三") - @NotEmpty(message = "收件人名称不能为空") - private String receiverName; - - @Schema(description = "收件人手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "19988188888") - @NotEmpty(message = "收件人手机不能为空") - private String receiverMobile; - - @Schema(description = "收件人地区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7310") - @NotNull(message = "收件人地区编号不能为空") - private Integer receiverAreaId; - - @Schema(description = "收件人详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "昆明市五华区xxx小区xxx") - @NotEmpty(message = "收件人详细地址不能为空") - private String receiverDetailAddress; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdatePriceReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdatePriceReqVO.java deleted file mode 100644 index 614a8b4d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/admin/order/vo/TradeOrderUpdatePriceReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.trade.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 订单改价 Request VO") -@Data -public class TradeOrderUpdatePriceReqVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "订单编号不能为空") - private Long id; - - @Schema(description = "订单调价,单位:分。正数,加价;负数,减价", requiredMode = Schema.RequiredMode.REQUIRED, example = "-100") - @NotNull(message = "订单调价价格不能为空") - private Integer adjustPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/AppTradeAfterSaleController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/AppTradeAfterSaleController.java deleted file mode 100644 index 7327393c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/AppTradeAfterSaleController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.trade.controller.app.aftersale; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleRespVO; -import com.win.module.trade.convert.aftersale.TradeAfterSaleConvert; -import com.win.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleWayEnum; -import com.win.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog; -import com.win.module.trade.framework.aftersalelog.core.util.AfterSaleLogUtils; -import com.win.module.trade.service.aftersale.TradeAfterSaleService; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 交易售后") -@RestController -@RequestMapping("/trade/after-sale") -@Validated -@Slf4j -public class AppTradeAfterSaleController { - - @Resource - private TradeAfterSaleService afterSaleService; - - @GetMapping(value = "/page") - @Operation(summary = "获得售后分页") - public CommonResult> getAfterSalePage(PageParam pageParam) { - return success(TradeAfterSaleConvert.INSTANCE.convertPage02( - afterSaleService.getAfterSalePage(getLoginUserId(), pageParam))); - } - - @GetMapping(value = "/get") - @Operation(summary = "获得售后订单") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - public CommonResult getAfterSale(@RequestParam("id") Long id) { - return success(TradeAfterSaleConvert.INSTANCE.convert(afterSaleService.getAfterSale(getLoginUserId(), id))); - } - - @GetMapping(value = "/get-applying-count") - @Operation(summary = "获得进行中的售后订单数量") - public CommonResult getApplyingAfterSaleCount() { - return success(afterSaleService.getApplyingAfterSaleCount(getLoginUserId())); - } - - // TODO 芋艿:待实现 - @GetMapping(value = "/get-reason-list") - @Operation(summary = "获得售后原因") - @Parameter(name = "way", description = "售后类型", required = true, example = "10") - public CommonResult> getAfterSaleReasonList(@RequestParam("way") Integer way) { - if (Objects.equals(TradeAfterSaleWayEnum.REFUND.getWay(), way)) { - return success(Arrays.asList("不想要了", "商品质量问题", "商品描述不符")); - } - return success(Arrays.asList("不想要了", "商品质量问题", "商品描述不符", "商品错发漏发", "商品包装破损")); - } - - @PostMapping(value = "/create") - @Operation(summary = "申请售后") - @AfterSaleLog(id = "#info.data", content = "'申请售后:售后编号['+#info.data+'],订单编号['+#createReqVO.orderItemId+'], '", operateType = AfterSaleOperateTypeEnum.APPLY) - public CommonResult createAfterSale(@RequestBody AppTradeAfterSaleCreateReqVO createReqVO) { - AfterSaleLogUtils.setBeforeStatus(0); - AfterSaleLogUtils.setAfterStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); - return success(afterSaleService.createAfterSale(getLoginUserId(), createReqVO)); - } - - @PutMapping(value = "/delivery") - @Operation(summary = "退回货物") - public CommonResult deliveryAfterSale(@RequestBody AppTradeAfterSaleDeliveryReqVO deliveryReqVO) { - afterSaleService.deliveryAfterSale(getLoginUserId(), deliveryReqVO); - return success(true); - } - - @DeleteMapping(value = "/cancel") - @Operation(summary = "取消售后") - @Parameter(name = "id", description = "售后编号", required = true, example = "1") - public CommonResult cancelAfterSale(@RequestParam("id") Long id) { - afterSaleService.cancelAfterSale(getLoginUserId(), id); - return success(true); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java deleted file mode 100644 index 9577c6e4..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.trade.controller.app.aftersale.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleWayEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "用户 App - 交易售后创建 Request VO") -@Data -public class AppTradeAfterSaleCreateReqVO { - - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "订单项编号不能为空") - private Long orderItemId; - - @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "售后方式不能为空") - @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}") - private Integer way; - - @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "退款金额不能为空") - @Min(value = 1, message = "退款金额必须大于 0") - private Integer refundPrice; - - @Schema(description = "申请原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "申请原因不能为空") - private String applyReason; - - @Schema(description = "补充描述", example = "商品质量不好") - private String applyDescription; - - @Schema(description = "补充凭证图片", example = "https://www.iocoder.cn/1.png, https://www.iocoder.cn/2.png") - private List applyPicUrls; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleDeliveryReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleDeliveryReqVO.java deleted file mode 100644 index aaf4da2d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleDeliveryReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.trade.controller.app.aftersale.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 交易售后退回货物 Request VO") -@Data -public class AppTradeAfterSaleDeliveryReqVO { - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "售后编号不能为空") - private Long id; - - @Schema(description = "退货物流公司编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "退货物流公司编号不能为空") - private Long logisticsId; - - @Schema(description = "退货物流单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SF123456789") - @NotNull(message = "退货物流单号不能为空") - private String logisticsNo; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleRespVO.java deleted file mode 100644 index 9a80baac..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleRespVO.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.win.module.trade.controller.app.aftersale.vo; - -import com.win.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "用户 App - 交易售后 Response VO") -@Data -public class AppTradeAfterSaleRespVO { - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "售后流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1146347329394184195") - private String no; - - @Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer way; - - @Schema(description = "售后类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer type; - - @Schema(description = "申请原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String applyReason; - - @Schema(description = "补充描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String applyDescription; - - @Schema(description = "补充凭证图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private List applyPicUrls; - - // ========== 交易订单相关 ========== - - @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long orderId; - - @Schema(description = "交易订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String orderNo; - - @Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long orderItemId; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long spuId; - - @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private String spuName; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long skuId; - - /** - * 属性数组 - */ - private List properties; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/01.jpg") - private String picUrl; - - @Schema(description = "退货商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer count; - - // ========== 审批相关 ========== - - /** - * 审批备注 - * - * 注意,只有审批不通过才会填写 - */ - private String auditReason; - - // ========== 退款相关 ========== - - @Schema(description = "退款金额,单位:分", example = "100") - private Integer refundPrice; - - @Schema(description = "退款时间") - private LocalDateTime refundTime; - - // ========== 退货相关 ========== - - @Schema(description = "退货物流公司编号", example = "1") - private Long logisticsId; - - @Schema(description = "退货物流单号", example = "SF123456789") - private String logisticsNo; - - @Schema(description = "退货时间") - private LocalDateTime deliveryTime; - - @Schema(description = "收货时间") - private LocalDateTime receiveTime; - - @Schema(description = "收货备注") - private String receiveReason; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/package-info.java deleted file mode 100644 index 41cd6e15..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 基础包,放一些通用的 VO 类 - */ -package com.win.module.trade.controller.app.base; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/property/AppProductPropertyValueDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/property/AppProductPropertyValueDetailRespVO.java deleted file mode 100644 index 0f38461c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/property/AppProductPropertyValueDetailRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.app.base.property; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 商品属性值的明细 Response VO") -@Data -public class AppProductPropertyValueDetailRespVO { - - @Schema(description = "属性的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long propertyId; - - @Schema(description = "属性的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色") - private String propertyName; - - @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long valueId; - - @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色") - private String valueName; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/sku/AppProductSkuBaseRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/sku/AppProductSkuBaseRespVO.java deleted file mode 100644 index 7d27ef00..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/sku/AppProductSkuBaseRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.trade.controller.app.base.sku; - -import com.win.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -/** - * 商品 SKU 基础 Response VO - * - * @author 芋道源码 - */ -@Data -public class AppProductSkuBaseRespVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "图片地址", example = "https://www.iocoder.cn/xx.png") - private String picUrl; - - @Schema(description = "销售价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer price; - - @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer stock; - - /** - * 属性数组 - */ - private List properties; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/spu/AppProductSpuBaseRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/spu/AppProductSpuBaseRespVO.java deleted file mode 100644 index a5209c5b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/base/spu/AppProductSpuBaseRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.trade.controller.app.base.spu; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -/** - * 商品 SPU 基础 Response VO - * - * @author 芋道源码 - */ -@Data -public class AppProductSpuBaseRespVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "商品 SPU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") - private String name; - - @Schema(description = "商品主图地址", example = "https://www.iocoder.cn/xx.png") - private String picUrl; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageRecordController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageRecordController.java deleted file mode 100644 index 118f5baf..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageRecordController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.trade.controller.app.brokerage; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO; -import com.win.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO; -import com.win.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordRespVO; -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.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; -import java.time.LocalDateTime; - -import static com.win.framework.common.pojo.CommonResult.success; -import static java.util.Arrays.asList; - -@Tag(name = "用户 APP - 分销用户") -@RestController -@RequestMapping("/trade/brokerage-record") -@Validated -@Slf4j -public class AppBrokerageRecordController { - - // TODO 芋艿:临时 mock => - @GetMapping("/page") - @Operation(summary = "获得分销记录分页") - @PreAuthenticated - public CommonResult> getBrokerageRecordPage(@Valid AppBrokerageRecordPageReqVO pageReqVO) { - AppBrokerageRecordRespVO vo1 = new AppBrokerageRecordRespVO() - .setId(1L).setPrice(10).setTitle("收到钱").setCreateTime(LocalDateTime.now()) - .setFinishTime(LocalDateTime.now()); - AppBrokerageRecordRespVO vo2 = new AppBrokerageRecordRespVO() - .setId(2L).setPrice(-20).setTitle("提现钱").setCreateTime(LocalDateTime.now()) - .setFinishTime(LocalDateTime.now()); - return success(new PageResult<>(asList(vo1, vo2), 10L)); - } - - @GetMapping("/get-product-brokerage-price") - @Operation(summary = "获得商品的分销金额") - public CommonResult getProductBrokeragePrice(@RequestParam("spuId") Long spuId) { - AppBrokerageProductPriceRespVO respVO = new AppBrokerageProductPriceRespVO(); - respVO.setEnabled(true); // TODO @疯狂:需要开启分销 + 人允许分销 - respVO.setBrokerageMinPrice(1); - respVO.setBrokerageMaxPrice(2); - return success(respVO); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageUserController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageUserController.java deleted file mode 100644 index e4c184b1..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageUserController.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.win.module.trade.controller.app.brokerage; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.trade.controller.app.brokerage.vo.user.*; -import com.win.module.trade.service.brokerage.user.BrokerageUserService; -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.format.annotation.DateTimeFormat; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.time.LocalDateTime; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static java.util.Arrays.asList; - -@Tag(name = "用户 APP - 分销用户") -@RestController -@RequestMapping("/trade/brokerage-user") -@Validated -@Slf4j -public class AppBrokerageUserController { - @Resource - private BrokerageUserService brokerageUserService; - - // TODO 芋艿:临时 mock => - @GetMapping("/get") - @Operation(summary = "获得个人分销信息") - @PreAuthenticated - public CommonResult getBrokerageUser() { - AppBrokerageUserRespVO respVO = new AppBrokerageUserRespVO() - .setBrokerageEnabled(true) - .setPrice(2000) - .setFrozenPrice(3000); - return success(respVO); - } - - @PutMapping("/bind") - @Operation(summary = "绑定推广员") - @PreAuthenticated - public CommonResult bindBrokerageUser(@Valid @RequestBody AppBrokerageUserBindReqVO reqVO) { - return success(brokerageUserService.bindBrokerageUser(getLoginUserId(), reqVO.getBindUserId(), false)); - } - - // TODO 芋艿:临时 mock => - @GetMapping("/get-summary") - @Operation(summary = "获得个人分销统计") - @PreAuthenticated - public CommonResult getBrokerageUserSummary() { - AppBrokerageUserMySummaryRespVO respVO = new AppBrokerageUserMySummaryRespVO() - .setYesterdayPrice(1) - .setBrokeragePrice(2) - .setFrozenPrice(3) - .setWithdrawPrice(4) - .setFirstBrokerageUserCount(166) - .setSecondBrokerageUserCount(233); - return success(respVO); - } - - // TODO 芋艿:临时 mock => - @GetMapping("/rank-page-by-user-count") - @Operation(summary = "获得分销用户排行分页(基于用户量)") - @PreAuthenticated - public CommonResult> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO) { - AppBrokerageUserRankByUserCountRespVO vo1 = new AppBrokerageUserRankByUserCountRespVO() - .setId(1L).setNickname("芋1**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokerageUserCount(10); - AppBrokerageUserRankByUserCountRespVO vo2 = new AppBrokerageUserRankByUserCountRespVO() - .setId(2L).setNickname("芋2**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokerageUserCount(6); - AppBrokerageUserRankByUserCountRespVO vo3 = new AppBrokerageUserRankByUserCountRespVO() - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokerageUserCount(4); - AppBrokerageUserRankByUserCountRespVO vo4 = new AppBrokerageUserRankByUserCountRespVO() - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokerageUserCount(4); - return success(new PageResult<>(asList(vo1, vo2, vo3, vo4), 10L)); - } - - // TODO 芋艿:临时 mock => - @GetMapping("/rank-page-by-price") - @Operation(summary = "获得分销用户排行分页(基于佣金)") - @PreAuthenticated - public CommonResult> getBrokerageUserChildSummaryPageByPrice(AppBrokerageUserRankPageReqVO pageReqVO) { - AppBrokerageUserRankByPriceRespVO vo1 = new AppBrokerageUserRankByPriceRespVO() - .setId(1L).setNickname("芋1**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokeragePrice(10); - AppBrokerageUserRankByPriceRespVO vo2 = new AppBrokerageUserRankByPriceRespVO() - .setId(2L).setNickname("芋2**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokeragePrice(6); - AppBrokerageUserRankByPriceRespVO vo3 = new AppBrokerageUserRankByPriceRespVO() - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokeragePrice(4); - AppBrokerageUserRankByPriceRespVO vo4 = new AppBrokerageUserRankByPriceRespVO() - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokeragePrice(4); - return success(new PageResult<>(asList(vo1, vo2, vo3, vo4), 10L)); - } - - // TODO 芋艿:临时 mock => - @GetMapping("/child-summary-page") - @Operation(summary = "获得下级分销统计分页") - @PreAuthenticated - public CommonResult> getBrokerageUserChildSummaryPage( - AppBrokerageUserChildSummaryPageReqVO pageReqVO) { - AppBrokerageUserChildSummaryRespVO vo1 = new AppBrokerageUserChildSummaryRespVO() - .setId(1L).setNickname("芋1**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokeragePrice(10).setBrokeragePrice(20).setBrokerageOrderCount(30) - .setBrokerageTime(LocalDateTime.now()); - AppBrokerageUserChildSummaryRespVO vo2 = new AppBrokerageUserChildSummaryRespVO() - .setId(1L).setNickname("芋2**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") - .setBrokeragePrice(20).setBrokeragePrice(30).setBrokerageOrderCount(40) - .setBrokerageTime(LocalDateTime.now()); - return success(new PageResult<>(asList(vo1, vo2), 10L)); - } - - // TODO 芋艿:临时 mock => - @GetMapping("/get-rank-by-price") - @Operation(summary = "获得分销用户排行(基于佣金)") - @Parameter(name = "times", description = "时间段", required = true) - public CommonResult bindBrokerageUser( - @RequestParam("times") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime[] times) { - return success(1); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java deleted file mode 100644 index 81887241..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.trade.controller.app.brokerage; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO; -import com.win.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawRespVO; -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.*; - -import javax.validation.Valid; -import java.time.LocalDateTime; - -import static com.win.framework.common.pojo.CommonResult.success; -import static java.util.Arrays.asList; - -@Tag(name = "用户 APP - 分销提现") -@RestController -@RequestMapping("/trade/brokerage-withdraw") -@Validated -@Slf4j -public class AppBrokerageWithdrawController { - - // TODO 芋艿:临时 mock => - @GetMapping("/page") - @Operation(summary = "获得分销提现分页") - @PreAuthenticated - public CommonResult> getBrokerageWithdrawPage() { - AppBrokerageWithdrawRespVO vo1 = new AppBrokerageWithdrawRespVO() - .setId(1L).setStatus(10).setPrice(10).setStatusName("审批通过").setCreateTime(LocalDateTime.now()); - AppBrokerageWithdrawRespVO vo2 = new AppBrokerageWithdrawRespVO() - .setId(2L).setStatus(0).setPrice(20).setStatusName("审批中").setCreateTime(LocalDateTime.now()); - return success(new PageResult<>(asList(vo1, vo2), 10L)); - } - - // TODO 芋艿:临时 mock => - @PostMapping("/create") - @Operation(summary = "创建分销提现") - @PreAuthenticated - public CommonResult createBrokerageWithdraw(@RequestBody @Valid AppBrokerageWithdrawCreateReqVO createReqVO) { - return success(1L); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageProductPriceRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageProductPriceRespVO.java deleted file mode 100644 index dce3045e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageProductPriceRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 商品的分销金额 Response VO") -@Data -public class AppBrokerageProductPriceRespVO { - - @Schema(description = "是否开启", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Boolean enabled; - - @Schema(description = "分销最小金额,单位:分", example = "100") - private Integer brokerageMinPrice; - - @Schema(description = "分销最大金额,单位:分", example = "100") - private Integer brokerageMaxPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java deleted file mode 100644 index 23d65b6c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.record; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.enums.brokerage.BrokerageRecordStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "应用 App - 分销记录分页 Request VO") -@Data -public class AppBrokerageRecordPageReqVO extends PageParam { - - @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @InEnum(value = BrokerageRecordBizTypeEnum.class, message = "业务类型必须是 {value}") - private Integer bizType; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @InEnum(value = BrokerageRecordStatusEnum.class, message = "状态必须是 {value}") - private Integer status; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java deleted file mode 100644 index 1a55600d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 分销记录 Response VO") -@Data -public class AppBrokerageRecordRespVO { - - @Schema(description = "记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Long id; - - @Schema(description = "分销标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "用户下单") - private String title; - - @Schema(description = "分销金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer price; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime finishTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java deleted file mode 100644 index 38ceb70e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "应用 App - 绑定推广员 Request VO") -@Data -public class AppBrokerageUserBindReqVO extends PageParam { - - @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "推广员编号不能为空") - private Long bindUserId; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryPageReqVO.java deleted file mode 100644 index dceac1ba..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryPageReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.SortingField; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 下级分销统计分页 Request VO") -@Data -public class AppBrokerageUserChildSummaryPageReqVO extends PageParam { - - public static final String SORT_FIELD_USER_COUNT = "userCount"; - public static final String SORT_FIELD_ORDER_COUNT = "orderCount"; - public static final String SORT_FIELD_PRICE = "price"; - - @Schema(description = "用户昵称", example = "李") // 模糊匹配 - private String nickname; - - @Schema(description = "排序字段", example = "userCount") - private SortingField sortingField; - - @Schema(description = "下级的级别", example = "1") // 1 - 直接下级;2 - 间接下级 - private Integer level; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryRespVO.java deleted file mode 100644 index 08dc3472..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryRespVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 下级分销统计 Response VO") -@Data -public class AppBrokerageUserChildSummaryRespVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Long id; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小王") - private String nickname; - - @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.jpg") - private String avatar; - - @Schema(description = "佣金金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer brokeragePrice; - - @Schema(description = "分销订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer brokerageOrderCount; - - @Schema(description = "分销用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "30") - private Integer brokerageUserCount; - - @Schema(description = "成为分销员时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime brokerageTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserMySummaryRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserMySummaryRespVO.java deleted file mode 100644 index dfed3dfd..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserMySummaryRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 个人分销统计 Response VO") -@Data -public class AppBrokerageUserMySummaryRespVO { - - @Schema(description = "昨天的佣金,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer yesterdayPrice; - - @Schema(description = "提现的佣金,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer withdrawPrice; - - @Schema(description = "可用的佣金,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2408") - private Integer brokeragePrice; - - @Schema(description = "冻结的佣金,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "234") - private Integer frozenPrice; - - @Schema(description = "分销用户数量(一级)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer firstBrokerageUserCount; - - @Schema(description = "分销用户数量(二级)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer secondBrokerageUserCount; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByPriceRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByPriceRespVO.java deleted file mode 100644 index e140f14b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByPriceRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 分销排行用户(基于用户量) Response VO") -@Data -public class AppBrokerageUserRankByPriceRespVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Long id; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小王") - private String nickname; - - @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.jpg") - private String avatar; - - @Schema(description = "佣金金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer brokeragePrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByUserCountRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByUserCountRespVO.java deleted file mode 100644 index 553e7e28..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByUserCountRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 分销排行用户(基于用户量) Response VO") -@Data -public class AppBrokerageUserRankByUserCountRespVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Long id; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小王") - private String nickname; - - @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.jpg") - private String avatar; - - @Schema(description = "邀请用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer brokerageUserCount; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankPageReqVO.java deleted file mode 100644 index 564109ea..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankPageReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotEmpty; -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "应用 App - 分销用户排行 Request VO") -@Data -public class AppBrokerageUserRankPageReqVO extends PageParam { - - @Schema(description = "开始 + 结束时间", requiredMode = Schema.RequiredMode.REQUIRED) - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @NotEmpty(message = "时间不能为空") - private LocalDateTime[] times; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRespVO.java deleted file mode 100644 index 34f67a42..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.user; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 分销用户信息 Response VO") -@Data -public class AppBrokerageUserRespVO { - - @Schema(description = "是否有分销资格", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean brokerageEnabled; - - @Schema(description = "可用的佣金,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2408") - private Integer price; - - @Schema(description = "冻结的佣金,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "234") - private Integer frozenPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java deleted file mode 100644 index aefc703c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.withdraw; - -import com.win.framework.common.util.validation.ValidationUtils; -import com.win.framework.common.validation.InEnum; -import com.win.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.URL; - -import javax.validation.Validator; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; - -@Schema(description = "用户 App - 分销提现创建 Request VO") -@Data -public class AppBrokerageWithdrawCreateReqVO { - - @Schema(description = "提现方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @InEnum(value = BrokerageWithdrawTypeEnum.class, message = "提现方式必须是 {value}") - private Integer type; - - @Schema(description = "提现金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - @Min(value = 1, message = "提现金额不能小于 1") - private Integer price; - - // ========== 银行卡、微信、支付宝 提现相关字段 ========== - - @Schema(description = "提现账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456789") - @NotBlank(message = "提现账号不能为空", groups = {Bank.class, Wechat.class, Alipay.class}) - private String accountNo; - - // ========== 微信、支付宝 提现相关字段 ========== - - @Schema(description = "收款码的图片", example = "https://www.iocoder.cn/1.png") - @URL(message = "收款码的图片,必须是一个 URL") - private String accountQrCodeUrl; - - // ========== 银行卡 提现相关字段 ========== - - @Schema(description = "持卡人姓名", example = "张三") - @NotBlank(message = "持卡人姓名不能为空", groups = {Bank.class}) - private String name; - @Schema(description = "提现银行", example = "1") - @NotBlank(message = "提现银行不能为空", groups = {Bank.class}) - private Integer bankName; - @Schema(description = "开户地址", example = "海淀支行") - private String bankAddress; - - public interface Wallet { - } - - public interface Bank { - } - - public interface Wechat { - } - - public interface Alipay { - } - - public void validate(Validator validator) { - if (BrokerageWithdrawTypeEnum.WALLET.getType().equals(type)) { - ValidationUtils.validate(validator, this, Wallet.class); - } else if (BrokerageWithdrawTypeEnum.BANK.getType().equals(type)) { - ValidationUtils.validate(validator, this, Bank.class); - } else if (BrokerageWithdrawTypeEnum.WECHAT.getType().equals(type)) { - ValidationUtils.validate(validator, this, Wechat.class); - } else if (BrokerageWithdrawTypeEnum.ALIPAY.getType().equals(type)) { - ValidationUtils.validate(validator, this, Alipay.class); - } - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java deleted file mode 100644 index 8acaaec0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.trade.controller.app.brokerage.vo.withdraw; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 分销提现 Response VO") -@Data -public class AppBrokerageWithdrawRespVO { - - @Schema(description = "提现编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Long id; - - @Schema(description = "提现状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer status; - - @Schema(description = "提现状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "审核中") - private String statusName; - - @Schema(description = "提现金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer price; - - @Schema(description = "提现时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.http b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.http deleted file mode 100644 index b341a488..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.http +++ /dev/null @@ -1,42 +0,0 @@ -### 请求 /trade/cart/add 接口 => 成功 -POST {{appApi}}/trade/cart/add -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} -Content-Type: application/json - -{ - "skuId": 1, - "count": 10, - "addStatus": true -} - -### 请求 /trade/cart/update 接口 => 成功 -PUT {{appApi}}/trade/cart/update -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} -Content-Type: application/json - -{ - "id": 35, - "count": 5 -} - -### 请求 /trade/cart/delete 接口 => 成功 -DELETE {{appApi}}/trade/cart/delete?ids=1 -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -### 请求 /trade/cart/get-count 接口 => 成功 -GET {{appApi}}/trade/cart/get-count -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -### 请求 /trade/cart/get-count-map 接口 => 成功 -GET {{appApi}}/trade/cart/get-count-map -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -### 请求 /trade/cart/list 接口 => 成功 -GET {{appApi}}/trade/cart/list -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.java deleted file mode 100644 index 7d28825e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/AppCartController.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.win.module.trade.controller.app.cart; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.trade.controller.app.cart.vo.*; -import com.win.module.trade.service.cart.CartService; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 购物车") -@RestController -@RequestMapping("/trade/cart") -@RequiredArgsConstructor -@Validated -@Slf4j -public class AppCartController { - - @Resource - private CartService cartService; - - @PostMapping("/add") - @Operation(summary = "添加购物车商品") - @PreAuthenticated - public CommonResult addCart(@Valid @RequestBody AppCartAddReqVO addCountReqVO) { - return success(cartService.addCart(getLoginUserId(), addCountReqVO)); - } - - @PutMapping("/update-count") - @Operation(summary = "更新购物车商品数量") - @PreAuthenticated - public CommonResult updateCartCount(@Valid @RequestBody AppCartUpdateCountReqVO updateReqVO) { - cartService.updateCartCount(getLoginUserId(), updateReqVO); - return success(true); - } - - @PutMapping("/update-selected") - @Operation(summary = "更新购物车商品选中") - @PreAuthenticated - public CommonResult updateCartSelected(@Valid @RequestBody AppCartUpdateSelectedReqVO updateReqVO) { - cartService.updateCartSelected(getLoginUserId(), updateReqVO); - return success(true); - } - - @PutMapping("/reset") - @Operation(summary = "重置购物车商品") - @PreAuthenticated - public CommonResult resetCart(@Valid @RequestBody AppCartResetReqVO updateReqVO) { - cartService.resetCart(getLoginUserId(), updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除购物车商品") - @Parameter(name = "ids", description = "购物车商品编号", required = true, example = "1024,2048") - @PreAuthenticated - public CommonResult deleteCart(@RequestParam("ids") List ids) { - cartService.deleteCart(getLoginUserId(), ids); - return success(true); - } - - @GetMapping("get-count") - @Operation(summary = "查询用户在购物车中的商品数量") - @PreAuthenticated - public CommonResult getCartCount() { - return success(cartService.getCartCount(getLoginUserId())); - } - - @GetMapping("/list") - @Operation(summary = "查询用户的购物车列表") - @PreAuthenticated - public CommonResult getCartList() { - return success(cartService.getCartList(getLoginUserId())); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartAddReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartAddReqVO.java deleted file mode 100644 index 18294676..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartAddReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.trade.controller.app.cart.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 购物车添加购物项 Request VO") -@Data -public class AppCartAddReqVO { - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED,example = "1024") - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - @Schema(description = "新增商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "数量不能为空") - private Integer count; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartDetailRespVO.java deleted file mode 100644 index 6e517d4b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartDetailRespVO.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.win.module.trade.controller.app.cart.vo; - -import com.win.module.trade.controller.app.base.sku.AppProductSkuBaseRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 用户的购物车明细 Response VO") -@Data -public class AppCartDetailRespVO { - - /** - * 商品分组数组 - */ - private List itemGroups; - - /** - * 费用 - */ - private Order order; - - @Schema(description = "商品分组") // 多个商品,参加同一个活动,从而形成分组 - @Data - public static class ItemGroup { - - /** - * 商品数组 - */ - private List items; - /** - * 营销活动,订单级别 - */ - private Promotion promotion; - - } - - @Schema(description = "商品 SKU") - @Data - public static class Sku extends AppProductSkuBaseRespVO { - - /** - * SPU 信息 - */ - private AppProductSkuBaseRespVO spu; - - // ========== 购物车相关的字段 ========== - - @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer count; - @Schema(description = "是否选中", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean selected; - - // ========== 价格相关的字段,对应 PriceCalculateRespDTO.OrderItem 的属性 ========== - - // TODO 芋艿:后续可以去除一些无用的字段 - - @Schema(description = "商品原价(单)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer originalPrice; - @Schema(description = "商品原价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer totalOriginalPrice; - @Schema(description = "商品级优惠(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "300") - private Integer totalPromotionPrice; - @Schema(description = "最终购买金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "400") - private Integer totalPresentPrice; - @Schema(description = "最终购买金额(单)", requiredMode = Schema.RequiredMode.REQUIRED, example = "500") - private Integer presentPrice; - @Schema(description = "应付金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "600") - private Integer totalPayPrice; - - // ========== 营销相关的字段 ========== - /** - * 营销活动,商品级别 - */ - private Promotion promotion; - - } - - @Schema(description = "订单") // 对应 PriceCalculateRespDTO.Order 类,用于费用(合计) - @Data - public static class Order { - - // TODO 芋艿:后续可以去除一些无用的字段 - - @Schema(description = "商品原价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer skuOriginalPrice; - @Schema(description = "商品优惠(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer skuPromotionPrice; - @Schema(description = "订单优惠(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "300") - private Integer orderPromotionPrice; - @Schema(description = "运费金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "400") - private Integer deliveryPrice; - @Schema(description = "应付金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "500") - private Integer payPrice; - - } - - @Schema(description = "营销活动") // 对应 PriceCalculateRespDTO.Promotion 类的属性 - @Data - public static class Promotion { - - @Schema(description = "营销编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") // 营销活动的编号、优惠劵的编号 - private Long id; - @Schema(description = "营销名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "xx 活动") - private String name; - @Schema(description = "营销类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer type; - - // ========== 匹配情况 ========== - @Schema(description = "是否满足优惠条件", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean meet; - @Schema(description = "满足条件的提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "圣诞价:省 150.00 元") - private String meetTip; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartListRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartListRespVO.java deleted file mode 100644 index 6ea4f8fa..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartListRespVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.trade.controller.app.cart.vo; - -import com.win.module.trade.controller.app.base.sku.AppProductSkuBaseRespVO; -import com.win.module.trade.controller.app.base.spu.AppProductSpuBaseRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 用户的购物列表 Response VO") -@Data -public class AppCartListRespVO { - - /** - * 有效的购物项数组 - */ - private List validList; - - /** - * 无效的购物项数组 - */ - private List invalidList; - - @Schema(description = "购物项") - @Data - public static class Cart { - - @Schema(description = "购物项的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer count; - - @Schema(description = "是否选中", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean selected; - - /** - * 商品 SPU - */ - private AppProductSpuBaseRespVO spu; - /** - * 商品 SKU - */ - private AppProductSkuBaseRespVO sku; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartResetReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartResetReqVO.java deleted file mode 100644 index 13bbcdae..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartResetReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.trade.controller.app.cart.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 购物车重置 Request VO") -@Data -public class AppCartResetReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED,example = "1024") - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "数量不能为空") - @Min(message = "数量必须大于 0", value = 1L) - private Integer count; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateCountReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateCountReqVO.java deleted file mode 100644 index 1239d071..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateCountReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.controller.app.cart.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 App - 购物车更新数量 Request VO") -@Data -public class AppCartUpdateCountReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - - @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "数量不能为空") - @Min(message = "数量必须大于 0", value = 1L) - private Integer count; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateSelectedReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateSelectedReqVO.java deleted file mode 100644 index a1925c7f..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/cart/vo/AppCartUpdateSelectedReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.trade.controller.app.cart.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.Collection; - -@Schema(description = "用户 App - 购物车更新是否选中 Request VO") -@Data -public class AppCartUpdateSelectedReqVO { - - @Schema(description = "编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024,2048") - @NotNull(message = "编号列表不能为空") - private Collection ids; - - @Schema(description = "是否选中", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否选中不能为空") - private Boolean selected; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/AppTradeConfigController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/AppTradeConfigController.java deleted file mode 100644 index 0a83a6f3..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/AppTradeConfigController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.trade.controller.app.config; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.trade.controller.app.config.vo.AppTradeConfigRespVO; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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 static com.win.framework.common.pojo.CommonResult.success; -import static java.util.Arrays.asList; - -@Tag(name = "用户 App - 交易配置") -@RestController -@RequestMapping("/trade/config") -@RequiredArgsConstructor -@Validated -@Slf4j -public class AppTradeConfigController { - - @GetMapping("/get") - public CommonResult getTradeConfig() { - AppTradeConfigRespVO respVO = new AppTradeConfigRespVO(); - respVO.setBrokeragePosterUrls(asList( - "https://api.java.crmeb.net/crmebimage/product/2020/08/03/755bf516b1ca4b6db3bfeaa4dd5901cdh71kob20re.jpg", - "https://api.java.crmeb.net/crmebimage/maintain/2021/03/01/406d729b84ed4ec9a2171bfcf6fd0634ughzbz9kfi.jpg", - "https://api.java.crmeb.net/crmebimage/maintain/2021/03/01/efb1e4e7fe604fe1988b4213ce08cb11tdsyijtd2r.jpg" - )); - respVO.setBrokerageFrozenDays(10); - respVO.setBrokerageWithdrawMinPrice(100); - return success(respVO); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java deleted file mode 100644 index 6a3c28ff..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.trade.controller.app.config.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 交易配置 Response VO") -@Data -public class AppTradeConfigRespVO { - - @Schema(description = "分销海报地址数组", requiredMode = Schema.RequiredMode.REQUIRED) - private List brokeragePosterUrls; - - @Schema(description = "佣金冻结时间(天)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer brokerageFrozenDays; - - @Schema(description = "佣金提现最小金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer brokerageWithdrawMinPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverConfigController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverConfigController.java deleted file mode 100644 index 4f763f3c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverConfigController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.trade.controller.app.delivery; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.trade.controller.app.delivery.vo.config.AppDeliveryConfigRespVO; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 配送配置") -@RestController -@RequestMapping("/trade/delivery/config") -@Validated -public class AppDeliverConfigController { - - @GetMapping("/get") - @Operation(summary = "获得配送配置") - public CommonResult getDeliveryConfig() { - return success(new AppDeliveryConfigRespVO().setPickUpEnable(true).setTencentLbsKey("123456")); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverExpressController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverExpressController.java deleted file mode 100644 index 70468076..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverExpressController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.trade.controller.app.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.module.trade.controller.app.delivery.vo.express.AppDeliveryExpressRespVO; -import com.win.module.trade.convert.delivery.DeliveryExpressConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.service.delivery.DeliveryExpressService; -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.Comparator; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 快递公司") -@RestController -@RequestMapping("/trade/delivery/express") -@Validated -public class AppDeliverExpressController { - - @Resource - private DeliveryExpressService deliveryExpressService; - - @GetMapping("/list") - @Operation(summary = "获得快递公司列表") - public CommonResult> getDeliveryExpressList() { - List list = deliveryExpressService.getDeliveryExpressListByStatus(CommonStatusEnum.ENABLE.getStatus()); - list.sort(Comparator.comparing(DeliveryExpressDO::getSort)); - return success(DeliveryExpressConvert.INSTANCE.convertList03(list)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java deleted file mode 100644 index 4577cbb2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.trade.controller.app.delivery; - -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.module.trade.controller.app.delivery.vo.pickup.AppDeliveryPickUpStoreRespVO; -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.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 java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 自提门店") -@RestController -@RequestMapping("/trade/delivery/pick-up-store") -@Validated -public class AppDeliverPickUpStoreController { - - // TODO 待实现[门店自提]:如果 latitude、longitude 非空,计算经纬度,并排序。计算的库,可以使用 hutool 的 DistanceUtil 计算。 - @GetMapping("/list") - @Operation(summary = "获得自提门店列表") - public CommonResult> getDeliveryPickUpStoreList( - @RequestParam(value = "latitude", required = false) Double latitude, - @RequestParam(value = "longitude", required = false) Double longitude) { - List list = new ArrayList<>(); - Random random = new Random(); - for (int i = 0; i < 10; i++) { - AppDeliveryPickUpStoreRespVO store = new AppDeliveryPickUpStoreRespVO(); - store.setId(random.nextLong()); - store.setName(RandomUtil.randomString(10)); - store.setLogo("https://www.iocoder.cn/" + (i + 1) + ".png"); - store.setPhone("15601691300"); - store.setAreaId(random.nextInt(100000)); - store.setAreaName("上海-" + RandomUtil.randomString(10)); - store.setDetailAddress("普陀区-" + RandomUtil.randomString(10)); - store.setLatitude(random.nextDouble() * 10); - store.setLongitude(random.nextDouble() * 10); - store.setDistance(random.nextInt(1000)); - - list.add(store); - } - - return success(list); - } - - // TODO 待实现[门店自提]: - @GetMapping("/get") - @Operation(summary = "获得自提门店") - @Parameter(name = "id", description = "门店编号") - public CommonResult getOrder(@RequestParam("id") Long id) { - AppDeliveryPickUpStoreRespVO store = new AppDeliveryPickUpStoreRespVO(); - Random random = new Random(); - store.setId(random.nextLong()); - store.setName(RandomUtil.randomString(10)); - store.setLogo("https://www.iocoder.cn/" + (1) + ".png"); - store.setPhone("15601691300"); - store.setAreaId(random.nextInt(100000)); - store.setAreaName("上海-" + RandomUtil.randomString(10)); - store.setDetailAddress("普陀区-" + RandomUtil.randomString(10)); - store.setLatitude(random.nextDouble() * 10); - store.setLongitude(random.nextDouble() * 10); - store.setDistance(random.nextInt(1000)); - return success(store); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/config/AppDeliveryConfigRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/config/AppDeliveryConfigRespVO.java deleted file mode 100644 index f5ce4982..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/config/AppDeliveryConfigRespVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.trade.controller.app.delivery.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -// TODO 芋艿:后续要实现下,配送配置;后续融合到 AppTradeConfigRespVO 中 -@Schema(description = "用户 App - 配送配置 Response VO") -@Data -public class AppDeliveryConfigRespVO { - - @Schema(description = "腾讯地图 KEY", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") - private String tencentLbsKey; - - @Schema(description = "是否开启自提", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean pickUpEnable; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/express/AppDeliveryExpressRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/express/AppDeliveryExpressRespVO.java deleted file mode 100644 index 5c103299..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/express/AppDeliveryExpressRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.trade.controller.app.delivery.vo.express; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 快递公司 Response VO") -@Data -public class AppDeliveryExpressRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "门店名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "顺丰") - private String name; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java deleted file mode 100644 index e21d02d2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.trade.controller.app.delivery.vo.pickup; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 自提门店 Response VO") -@Data -public class AppDeliveryPickUpStoreRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23128") - private Long id; - - @Schema(description = "门店名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - private String name; - - @Schema(description = "门店 logo", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String logo; - - @Schema(description = "门店手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601892312") - private String phone; - - @Schema(description = "区域编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18733") - private Integer areaId; - - @Schema(description = "地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海上海市普陀区") - private String areaName; - - @Schema(description = "门店详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "复旦大学路 188 号") - private String detailAddress; - - @Schema(description = "纬度", requiredMode = Schema.RequiredMode.REQUIRED, example = "5.88") - private Double latitude; - - @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED, example = "6.99") - private Double longitude; - - @Schema(description = "距离,单位:米", example = "100") // 只有在用户传递了经纬度时,才进行计算 - private Integer distance; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.http b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.http deleted file mode 100644 index 4f3de0c5..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.http +++ /dev/null @@ -1,42 +0,0 @@ -### /trade-order/settlement 获得订单结算信息(基于商品) -GET {{appApi}}/trade/order/settlement?type=0&items[0].skuId=1&items[0].count=2&items[1].skuId=2&items[1].count=3&couponId=1 -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### /trade-order/settlement 获得订单结算信息(基于购物车) -GET {{appApi}}/trade/order/settlement?type=0&items[0].cartId=50&couponId=1 -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### /trade-order/create 创建订单(基于商品) -POST {{appApi}}/trade/order/create -Content-Type: application/json -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -{ - "type": 0, - "addressId": 21, - "items": [ - { - "skuId": 1, - "count": 2 - } - ], - "remark": "我是备注" -} - -### 获得订单交易的分页 -GET {{appApi}}/trade/order/page?pageNo=1&pageSize=10 -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### 获得订单交易的详细 -GET {{appApi}}/trade/order/get-detail?id=21 -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -### 获得交易订单的物流轨迹 -GET {{appApi}}/trade/order/get-express-track-list?id=70 -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.java deleted file mode 100644 index c54ec221..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/AppTradeOrderController.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.win.module.trade.controller.app.order; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.pay.api.notify.dto.PayOrderNotifyReqDTO; -import com.win.module.trade.controller.app.order.vo.*; -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO; -import com.win.module.trade.convert.order.TradeOrderConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import com.win.module.trade.service.delivery.DeliveryExpressService; -import com.win.module.trade.service.order.TradeOrderQueryService; -import com.win.module.trade.service.order.TradeOrderUpdateService; -import com.google.common.collect.Maps; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 交易订单") -@RestController -@RequestMapping("/trade/order") -@Validated -@Slf4j -public class AppTradeOrderController { - - @Resource - private TradeOrderUpdateService tradeOrderUpdateService; - @Resource - private TradeOrderQueryService tradeOrderQueryService; - @Resource - private DeliveryExpressService deliveryExpressService; - - @Resource - private TradeOrderProperties tradeOrderProperties; - - @GetMapping("/settlement") - @Operation(summary = "获得订单结算信息") - @PreAuthenticated - public CommonResult settlementOrder(@Valid AppTradeOrderSettlementReqVO settlementReqVO) { - return success(tradeOrderUpdateService.settlementOrder(getLoginUserId(), settlementReqVO)); - } - - @PostMapping("/create") - @Operation(summary = "创建订单") - @PreAuthenticated - public CommonResult createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO) { - TradeOrderDO order = tradeOrderUpdateService.createOrder(getLoginUserId(), getClientIP(), createReqVO); - return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId())); - } - - @PostMapping("/update-paid") - @Operation(summary = "更新订单为已支付") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob - public CommonResult updateOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) { - tradeOrderUpdateService.updateOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()), - notifyReqDTO.getPayOrderId()); - return success(true); - } - - // TODO @芋艿:如果拼团活动、秒杀活动、砍价活动时,是不是要额外在返回活动之类的信息; - @GetMapping("/get-detail") - @Operation(summary = "获得交易订单") - @Parameter(name = "id", description = "交易订单编号") - public CommonResult getOrder(@RequestParam("id") Long id) { - // 查询订单 - TradeOrderDO order = tradeOrderQueryService.getOrder(getLoginUserId(), id); - // TODO @puhui999:这里建议改成,如果为 null,直接返回 success null;主要查询操作,尽量不要有非空的提示哈;交给前端处理; -// if (order == null) { -// return success(null, ORDER_NOT_FOUND.getMsg()); -// } - - // 查询订单项 - List orderItems = tradeOrderQueryService.getOrderItemListByOrderId(order.getId()); - // 查询物流公司 - DeliveryExpressDO express = order.getLogisticsId() != null && order.getLogisticsId() > 0 ? - deliveryExpressService.getDeliveryExpress(order.getLogisticsId()) : null; - // TODO @puhui999:如果门店自提,信息的拼接; - // 最终组合 - return success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, tradeOrderProperties, express)); - } - - @GetMapping("/get-express-track-list") - @Operation(summary = "获得交易订单的物流轨迹") - @Parameter(name = "id", description = "交易订单编号") - public CommonResult> getOrderExpressTrackList(@RequestParam("id") Long id) { - return success(TradeOrderConvert.INSTANCE.convertList02( - tradeOrderQueryService.getExpressTrackList(id, getLoginUserId()))); - } - - @GetMapping("/page") - @Operation(summary = "获得交易订单分页") - public CommonResult> getOrderPage(AppTradeOrderPageReqVO reqVO) { - // 查询订单 - PageResult pageResult = tradeOrderQueryService.getOrderPage(getLoginUserId(), reqVO); - // 查询订单项 - List orderItems = tradeOrderQueryService.getOrderItemListByOrderId( - convertSet(pageResult.getList(), TradeOrderDO::getId)); - // 最终组合 - return success(TradeOrderConvert.INSTANCE.convertPage02(pageResult, orderItems)); - } - - @GetMapping("/get-count") - @Operation(summary = "获得交易订单数量") - public CommonResult> getOrderCount() { - Map orderCount = Maps.newLinkedHashMapWithExpectedSize(5); - // 全部 - orderCount.put("allCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), null, null)); - // 待付款(未支付) - orderCount.put("unpaidCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), - TradeOrderStatusEnum.UNPAID.getStatus(), null)); - // 待发货 - orderCount.put("undeliveredCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), - TradeOrderStatusEnum.UNDELIVERED.getStatus(), null)); - // 待收货 - orderCount.put("deliveredCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), - TradeOrderStatusEnum.DELIVERED.getStatus(), null)); - // 待评价 - orderCount.put("uncommentedCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), - TradeOrderStatusEnum.COMPLETED.getStatus(), false)); - return success(orderCount); - } - - @PutMapping("/receive") - @Operation(summary = "确认交易订单收货") - @Parameter(name = "id", description = "交易订单编号") - public CommonResult receiveOrder(@RequestParam("id") Long id) { - tradeOrderUpdateService.receiveOrder(getLoginUserId(), id); - return success(true); - } - - @DeleteMapping("/cancel") - @Operation(summary = "取消交易订单") - @Parameter(name = "id", description = "交易订单编号") - public CommonResult cancelOrder(@RequestParam("id") Long id) { - tradeOrderUpdateService.cancelOrder(getLoginUserId(), id); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除交易订单") - @Parameter(name = "id", description = "交易订单编号") - public CommonResult deleteOrder(@RequestParam("id") Long id) { - // TODO @芋艿:未实现,mock 用 - return success(true); - } - - // ========== 订单项 ========== - - @GetMapping("/item/get") - @Operation(summary = "获得交易订单项") - @Parameter(name = "id", description = "交易订单项编号") - public CommonResult getOrderItem(@RequestParam("id") Long id) { - TradeOrderItemDO item = tradeOrderQueryService.getOrderItem(getLoginUserId(), id); - return success(TradeOrderConvert.INSTANCE.convert03(item)); - } - - @PostMapping("/item/create-comment") - @Operation(summary = "创建交易订单项的评价") - public CommonResult createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) { - return success(tradeOrderUpdateService.createOrderItemComment(getLoginUserId(), createReqVO)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppOrderExpressTrackRespDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppOrderExpressTrackRespDTO.java deleted file mode 100644 index 0f8da816..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppOrderExpressTrackRespDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 快递查询的轨迹 Resp DTO - * - * @author jason - */ -@Schema(description = "用户 App - 快递查询的轨迹 Response VO") -@Data -public class AppOrderExpressTrackRespDTO { - - @Schema(description = "发生时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime time; - - @Schema(description = "快递状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "已签收") - private String content; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java deleted file mode 100644 index dccd47bd..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 交易订单创建 Request VO") -@Data -public class AppTradeOrderCreateReqVO extends AppTradeOrderSettlementReqVO { - - @Schema(description = "备注", example = "这个是我的订单哟") - private String remark; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateRespVO.java deleted file mode 100644 index 95495727..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderCreateRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 交易订单创建 Response VO") -@Data -public class AppTradeOrderCreateRespVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long payOrderId; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java deleted file mode 100644 index 52612d3c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; - -@Schema(description = "用户 App - 订单交易的明细 Response VO") -@Data -public class AppTradeOrderDetailRespVO { - - // ========== 订单基本信息 ========== - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1146347329394184195") - private String no; - - @Schema(description = "下单时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "用户备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String userRemark; - - @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "购买的商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer productCount; - - @Schema(description = "订单完成时间") - private LocalDateTime finishTime; - - @Schema(description = "订单取消时间") - private LocalDateTime cancelTime; - - @Schema(description = "是否评价", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean commentStatus; - - // ========== 价格 + 支付基本信息 ========== - - @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean payStatus; - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long payOrderId; - - @Schema(description = "付款时间") - private LocalDateTime payTime; - - @Schema(description = "付款超时时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime payExpireTime; - - @Schema(description = "支付渠道", example = "wx_lite_pay") - private String payChannelCode; - @Schema(description = "支付渠道名", example = "微信小程序支付") - private String payChannelName; - - @Schema(description = "商品原价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer totalPrice; - - @Schema(description = "订单优惠(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer discountPrice; - - @Schema(description = "运费金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer deliveryPrice; - - @Schema(description = "订单调价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer adjustPrice; - - @Schema(description = "应付金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer payPrice; - - // ========== 收件 + 物流基本信息 ========== - - @Schema(description = "配送方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer deliveryType; - - @Schema(description = "发货物流公司编号", example = "10") - private Long logisticsId; - - @Schema(description = "发货物流名称", example = "顺丰快递") - private String logisticsName; - - @Schema(description = "发货物流单号", example = "1024") - private String logisticsNo; - - @Schema(description = "发货时间") - private LocalDateTime deliveryTime; - - @Schema(description = "收货时间") - private LocalDateTime receiveTime; - - @Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - private String receiverName; - - @Schema(description = "收件人手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "13800138000") - private String receiverMobile; - - @Schema(description = "收件人地区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") - private Integer receiverAreaId; - - @Schema(description = "收件人地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海 上海市 普陀区") - private String receiverAreaName; - - @Schema(description = "收件人详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "中关村大街 1 号") - private String receiverDetailAddress; - - @Schema(description = "自提门店编号", example = "1088") - private Long pickUpStoreId; - - // ========== 售后基本信息 ========== - - // ========== 营销基本信息 ========== - - @Schema(description = "优惠劵编号", example = "1024") - private Long couponId; - - @Schema(description = "优惠劵减免金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer couponPrice; - - @Schema(description = "积分抵扣的金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer pointPrice; - - /** - * 订单项数组 - */ - private List items; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java deleted file mode 100644 index 0a17c58b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "用户 App - 订单交易的分页项 Response VO") -@Data -public class AppTradeOrderPageItemRespVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1146347329394184195") - private String no; - - @Schema(description = "订单类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer type; - - @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "购买的商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer productCount; - - @Schema(description = "是否评价", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean commentStatus; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - // ========== 价格 + 支付基本信息 ========== - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long payOrderId; - - @Schema(description = "应付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer payPrice; - - // ========== 收件 + 物流基本信息 ========== - - @Schema(description = "配送方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer deliveryType; - - /** - * 订单项数组 - */ - private List items; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java deleted file mode 100644 index ed2868a3..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.validation.InEnum; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "交易订单分页 Request VO") -@Data -public class AppTradeOrderPageReqVO extends PageParam { - - @Schema(description = "订单状态", example = "1") - @InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}") - private Integer status; - - @Schema(description = "是否评价", example = "true") - private Boolean commentStatus; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java deleted file mode 100644 index efa96813..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.trade.enums.delivery.DeliveryTypeEnum; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.Valid; -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "用户 App - 交易订单结算 Request VO") -@Data -public class AppTradeOrderSettlementReqVO { - - @Schema(description = "商品项数组", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "商品不能为空") - private List items; - - @Schema(description = "优惠劵编号", example = "1024") - private Long couponId; - - @Schema(description = "是否使用积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否使用积分不能为空") - private Boolean pointStatus; - - // ========== 配送相关相关字段 ========== - @Schema(description = "配送方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @InEnum(value = DeliveryTypeEnum.class, message = "配送方式不正确") - private Integer deliveryType; - - @Schema(description = "收件地址编号", example = "1") - private Long addressId; - - @Schema(description = "自提门店编号", example = "1088") - private Long pickUpStoreId; - @Schema(description = "收件人名称", example = "芋艿") // 选择门店自提时,该字段为联系人名 - private String receiverName; - @Schema(description = "收件人手机", example = "15601691300") // 选择门店自提时,该字段为联系人手机 - @Mobile(message = "收件人手机格式不正确") - private String receiverMobile; - - // ========== 秒杀活动相关字段 ========== - @Schema(description = "秒杀活动编号", example = "1024") - private Long seckillActivityId; - - // ========== 拼团活动相关字段 ========== - // TODO @puhui999:是不是拼团记录的编号哈? - @Schema(description = "拼团活动编号", example = "1024") - private Long combinationActivityId; - - @Schema(description = "拼团团长编号", example = "2048") - private Long combinationHeadId; - - // ========== 砍价活动相关字段 ========== - // TODO @puhui999:是不是砍价记录的编号哈? - @Schema(description = "砍价活动编号", example = "123") - private Long bargainActivityId; - - @Data - @Schema(description = "用户 App - 商品项") - @Valid - public static class Item { - - @Schema(description = "商品 SKU 编号", example = "2048") - private Long skuId; - @Schema(description = "购买数量", example = "1") - @Min(value = 1, message = "购买数量最小值为 {value}") - private Integer count; - - @Schema(description = "购物车项的编号", example = "1024") - private Long cartId; - - @AssertTrue(message = "商品不正确") - @JsonIgnore - public boolean isValid() { - // 组合一:skuId + count 使用商品 SKU - if (skuId != null && count != null) { - return true; - } - // 组合二:cartId 使用购物车项 - return cartId != null; - } - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java deleted file mode 100644 index b1a46f37..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.win.module.trade.controller.app.order.vo; - -import com.win.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "用户 App - 交易订单结算信息 Response VO") -@Data -public class AppTradeOrderSettlementRespVO { - - @Schema(description = "交易类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") // 对应 TradeOrderTypeEnum 枚举 - private Integer type = 1; // TODO 芋艿:改成计算 - - @Schema(description = "购物项数组", requiredMode = Schema.RequiredMode.REQUIRED) - private List items; - - @Schema(description = "费用", requiredMode = Schema.RequiredMode.REQUIRED) - private Price price; - - @Schema(description = "收件地址", requiredMode = Schema.RequiredMode.REQUIRED) - private Address address; - - @Schema(description = "已使用的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer usedPoint; - - @Schema(description = "总积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer totalPoint; - - @Schema(description = "购物项") - @Data - public static class Item { - - // ========== SPU 信息 ========== - - @Schema(description = "SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long spuId; - @Schema(description = "SPU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "Apple iPhone 12") - private String spuName; - - // ========== SKU 信息 ========== - - @Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer skuId; - @Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer price; - @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String picUrl; - - @Schema(description = "属性数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private List properties; - - // ========== 购物车信息 ========== - - @Schema(description = "购物车编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Long cartId; - - @Schema(description = "购买数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer count; - - } - - @Schema(description = "费用(合计)") - @Data - @NoArgsConstructor - @AllArgsConstructor - public static class Price { - - @Schema(description = "商品原价(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "500") - private Integer totalPrice; - - @Schema(description = "运费金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - private Integer deliveryPrice; - - @Schema(description = "优惠劵减免金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer couponPrice; - - @Schema(description = "积分抵扣的金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - private Integer pointPrice; - - @Schema(description = "实际支付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "450") - private Integer payPrice; - - } - - @Schema(description = "地址信息") - @Data - public static class Address { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小王") - private String name; - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - private String mobile; - - @Schema(description = "地区编号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "地区编号不能为空") - private Long areaId; - @Schema(description = "地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海上海市普陀区") - private String areaName; - - @Schema(description = "详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "望京悠乐汇 A 座") - private String detailAddress; - - @Schema(description = "是否默认收件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean defaultStatus; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemCommentCreateReqVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemCommentCreateReqVO.java deleted file mode 100644 index c9577738..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemCommentCreateReqVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.trade.controller.app.order.vo.item; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -@Schema(description = "用户 App - 商品评价创建 Request VO") -@Data -public class AppTradeOrderItemCommentCreateReqVO { - - @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否匿名不能为空") - private Boolean anonymous; - - @Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2312312") - @NotNull(message = "交易订单项编号不能为空") - private Long orderItemId; - - @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "描述星级 1-5 分不能为空") - private Integer descriptionScores; - - @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - @NotNull(message = "服务星级 1-5 分不能为空") - private Integer benefitScores; - - @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "穿身上很漂亮诶(*^▽^*)") - @NotNull(message = "评论内容不能为空") - private String content; - - @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png]") - @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张") - private List picUrls; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java deleted file mode 100644 index d5638499..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.win.module.trade.controller.app.order.vo.item; - -import com.win.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "用户 App - 订单交易项 Response VO") -@Data -public class AppTradeOrderItemRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long orderId; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long spuId; - @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - private String spuName; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long skuId; - - /** - * 属性数组 - */ - private List properties; - - @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String picUrl; - - @Schema(description = "购买数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer count; - - @Schema(description = "是否评价", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean commentStatus; - - // ========== 价格 + 支付基本信息 ========== - - @Schema(description = "商品原价(单)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer price; - - @Schema(description = "应付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") - private Integer payPrice; - - // ========== 营销基本信息 ========== - - // TODO 芋艿:在捉摸一下 - - // ========== 售后基本信息 ========== - - @Schema(description = "售后编号", example = "1024") - private Long afterSaleId; - - @Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer afterSaleStatus; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/package-info.java deleted file mode 100644 index 16a58e9f..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 RESTful API 给前端: - * 1. admin 包:提供给管理后台 win-ui-admin 前端项目 - * 2. app 包:提供给用户 APP win-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 - */ -package com.win.module.trade.controller; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/aftersale/TradeAfterSaleConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/aftersale/TradeAfterSaleConvert.java deleted file mode 100644 index fedd794c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/aftersale/TradeAfterSaleConvert.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.win.module.trade.convert.aftersale; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDetailRespVO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRespPageItemVO; -import com.win.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO; -import com.win.module.trade.controller.admin.base.member.user.MemberUserRespVO; -import com.win.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderBaseVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleRespVO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface TradeAfterSaleConvert { - - TradeAfterSaleConvert INSTANCE = Mappers.getMapper(TradeAfterSaleConvert.class); - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(target = "createTime", ignore = true), - @Mapping(target = "updateTime", ignore = true), - @Mapping(target = "creator", ignore = true), - @Mapping(target = "updater", ignore = true), - }) - TradeAfterSaleDO convert(AppTradeAfterSaleCreateReqVO createReqVO, TradeOrderItemDO tradeOrderItem); - - @Mappings({ - @Mapping(source = "afterSale.orderId", target = "merchantOrderId"), - @Mapping(source = "afterSale.id", target = "merchantRefundId"), - @Mapping(source = "afterSale.applyReason", target = "reason"), - @Mapping(source = "afterSale.refundPrice", target = "price") - }) - PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale, - TradeOrderProperties orderProperties); - - MemberUserRespVO convert(MemberUserRespDTO bean); - - PageResult convertPage(PageResult page); - - default PageResult convertPage(PageResult pageResult, - Map memberUsers) { - PageResult voPageResult = convertPage(pageResult); - // 处理会员 - voPageResult.getList().forEach(afterSale -> afterSale.setUser( - convert(memberUsers.get(afterSale.getUserId())))); - return voPageResult; - } - - ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean); - - AppTradeAfterSaleRespVO convert(TradeAfterSaleDO bean); - - PageResult convertPage02(PageResult page); - - List convertList(List list); - - default TradeAfterSaleDetailRespVO convert(TradeAfterSaleDO afterSale, TradeOrderDO order, List orderItems, - MemberUserRespDTO user, List logs) { - TradeAfterSaleDetailRespVO respVO = convert(afterSale, orderItems); - // 处理用户信息 - respVO.setUser(convert(user)); - // 处理订单信息 - respVO.setOrder(convert(order)); - // 处理售后日志 - respVO.setLogs(convertList1(logs)); - return respVO; - } - List convertList1(List list); - @Mapping(target = "id", source = "afterSale.id") - TradeAfterSaleDetailRespVO convert(TradeAfterSaleDO afterSale, List orderItems); - TradeOrderBaseVO convert(TradeOrderDO order); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/record/BrokerageRecordConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/record/BrokerageRecordConvert.java deleted file mode 100644 index 63ad6275..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/record/BrokerageRecordConvert.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.trade.convert.brokerage.record; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordRespVO; -import com.win.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.enums.brokerage.BrokerageRecordStatusEnum; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 佣金记录 Convert - * - * @author owen - */ -@Mapper -public interface BrokerageRecordConvert { - - BrokerageRecordConvert INSTANCE = Mappers.getMapper(BrokerageRecordConvert.class); - - BrokerageRecordRespVO convert(BrokerageRecordDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - // TODO @疯狂:可能 title 不是很固化,会存在类似:沐晴成功购买《XXX JVM 实战》 - default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId, - Integer brokerageFrozenDays, int brokeragePrice, LocalDateTime unfreezeTime, - String title) { - brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0); - // 不冻结时,佣金直接就是结算状态 - Integer status = brokerageFrozenDays > 0 - ? BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus() - : BrokerageRecordStatusEnum.SETTLEMENT.getStatus(); - return new BrokerageRecordDO().setUserId(user.getId()) - .setBizType(bizType.getType()).setBizId(bizId) - .setPrice(brokeragePrice).setTotalPrice(user.getBrokeragePrice()) - .setTitle(title) - .setDescription(StrUtil.format(bizType.getDescription(), String.valueOf(brokeragePrice / 100.0))) - .setStatus(status).setFrozenDays(brokerageFrozenDays).setUnfreezeTime(unfreezeTime); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/user/BrokerageUserConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/user/BrokerageUserConvert.java deleted file mode 100644 index 526b3bdf..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/brokerage/user/BrokerageUserConvert.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.trade.convert.brokerage.user; - -import cn.hutool.core.map.MapUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.trade.api.brokerage.dto.BrokerageUserDTO; -import com.win.module.trade.controller.admin.brokerage.user.vo.BrokerageUserRespVO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.win.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * 分销用户 Convert - * - * @author owen - */ -@Mapper -public interface BrokerageUserConvert { - - BrokerageUserConvert INSTANCE = Mappers.getMapper(BrokerageUserConvert.class); - - BrokerageUserRespVO convert(BrokerageUserDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default PageResult convertPage(PageResult pageResult, - Map userMap, - Map brokerageUserCountMap, - Map userOrderSummaryMap) { - PageResult result = convertPage(pageResult); - for (BrokerageUserRespVO vo : result.getList()) { - // 用户信息 - Optional.ofNullable(userMap.get(vo.getId())).ifPresent( - user -> vo.setNickname(user.getNickname()).setAvatar(user.getAvatar())); - // 推广用户数量(一级) - vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0)); - // 推广订单数量、推广订单金额 - Optional orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId())); - vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0)) - .setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0)); - // todo 已提现次数、已提现金额 - vo.setWithdrawCount(0); - vo.setWithdrawPrice(0); - } - return result; - } - - BrokerageUserDTO convertDTO(BrokerageUserDO brokerageUser); -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/cart/TradeCartConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/cart/TradeCartConvert.java deleted file mode 100644 index 463ffab5..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/cart/TradeCartConvert.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.trade.convert.cart; - -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.trade.controller.app.base.sku.AppProductSkuBaseRespVO; -import com.win.module.trade.controller.app.base.spu.AppProductSpuBaseRespVO; -import com.win.module.trade.controller.app.cart.vo.AppCartListRespVO; -import com.win.module.trade.dal.dataobject.cart.CartDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -@Mapper -public interface TradeCartConvert { - - TradeCartConvert INSTANCE = Mappers.getMapper(TradeCartConvert.class); - - default AppCartListRespVO convertList(List carts, - List spus, List skus) { - Map spuMap = convertMap(spus, ProductSpuRespDTO::getId); - Map skuMap = convertMap(skus, ProductSkuRespDTO::getId); - // 遍历,开始转换 - List validList = new ArrayList<>(carts.size()); - List invalidList = new ArrayList<>(); - carts.forEach(cart -> { - AppCartListRespVO.Cart cartVO = new AppCartListRespVO.Cart(); - cartVO.setId(cart.getId()).setCount(cart.getCount()).setSelected(cart.getSelected()); - ProductSpuRespDTO spu = spuMap.get(cart.getSpuId()); - ProductSkuRespDTO sku = skuMap.get(cart.getSkuId()); - cartVO.setSpu(convert(spu)).setSku(convert(sku)); - // 如果 SPU 不存在,或者下架,或者库存不足,说明是无效的 - if (spu == null - || !ProductSpuStatusEnum.isEnable(spu.getStatus()) - || spu.getStock() <= 0) { - cartVO.setSelected(false); // 强制设置成不可选中 - invalidList.add(cartVO); - } else { - // 虽然 SKU 可能也会不存在,但是可以通过购物车重新选择 - validList.add(cartVO); - } - }); - return new AppCartListRespVO().setValidList(validList).setInvalidList(invalidList); - } - AppProductSpuBaseRespVO convert(ProductSpuRespDTO spu); - AppProductSkuBaseRespVO convert(ProductSkuRespDTO sku); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/config/TradeConfigConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/config/TradeConfigConvert.java deleted file mode 100644 index 21ff95d0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/config/TradeConfigConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.trade.convert.config; - -import com.win.module.trade.controller.admin.config.vo.TradeConfigRespVO; -import com.win.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 交易中心配置 Convert - * - * @author owen - */ -@Mapper -public interface TradeConfigConvert { - - TradeConfigConvert INSTANCE = Mappers.getMapper(TradeConfigConvert.class); - - TradeConfigDO convert(TradeConfigSaveReqVO bean); - - TradeConfigRespVO convert(TradeConfigDO bean); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressConvert.java deleted file mode 100644 index b91c817f..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressConvert.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.trade.convert.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.express.*; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExcelVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressRespVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO; -import com.win.module.trade.controller.app.delivery.vo.express.AppDeliveryExpressRespVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface DeliveryExpressConvert { - - DeliveryExpressConvert INSTANCE = Mappers.getMapper(DeliveryExpressConvert.class); - - DeliveryExpressDO convert(DeliveryExpressCreateReqVO bean); - - DeliveryExpressDO convert(DeliveryExpressUpdateReqVO bean); - - DeliveryExpressRespVO convert(DeliveryExpressDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - - List convertList1(List list); - - List convertList03(List list); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java deleted file mode 100644 index d42cf2f3..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.trade.convert.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.*; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateChargeDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateFreeDO; -import com.win.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO; -import com.google.common.collect.Maps; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMultiMap; -import static com.win.framework.common.util.collection.CollectionUtils.findFirst; - -@Mapper -public interface DeliveryExpressTemplateConvert { - - DeliveryExpressTemplateConvert INSTANCE = Mappers.getMapper(DeliveryExpressTemplateConvert.class); - - // ========== Template ========== - - DeliveryExpressTemplateDO convert(DeliveryExpressTemplateCreateReqVO bean); - - DeliveryExpressTemplateDO convert(DeliveryExpressTemplateUpdateReqVO bean); - - DeliveryExpressTemplateRespVO convert(DeliveryExpressTemplateDO bean); - - DeliveryExpressTemplateDetailRespVO convert2(DeliveryExpressTemplateDO bean); - - List convertList(List list); - - List convertList1(List list); - - PageResult convertPage(PageResult page); - - default DeliveryExpressTemplateDetailRespVO convert(DeliveryExpressTemplateDO bean, - List chargeList, - List freeList) { - DeliveryExpressTemplateDetailRespVO respVO = convert2(bean); - respVO.setTemplateCharge(convertTemplateChargeList(chargeList)); - respVO.setTemplateFree(convertTemplateFreeList(freeList)); - return respVO; - } - - // ========== Template Charge ========== - - DeliveryExpressTemplateChargeDO convertTemplateCharge(Long templateId, Integer chargeMode, ExpressTemplateChargeBaseVO vo); - - DeliveryExpressTemplateChargeDO convertTemplateCharge(DeliveryExpressTemplateUpdateReqVO.ExpressTemplateChargeUpdateVO vo); - - DeliveryExpressTemplateRespBO.Charge convertTemplateCharge(DeliveryExpressTemplateChargeDO bean); - - default List convertTemplateChargeList(Long templateId, Integer chargeMode, List list) { - return CollectionUtils.convertList(list, vo -> convertTemplateCharge(templateId, chargeMode, vo)); - } - - // ========== Template Free ========== - - DeliveryExpressTemplateFreeDO convertTemplateFree(Long templateId, ExpressTemplateFreeBaseVO vo); - - DeliveryExpressTemplateFreeDO convertTemplateFree(DeliveryExpressTemplateUpdateReqVO.ExpressTemplateFreeUpdateVO vo); - - DeliveryExpressTemplateRespBO.Free convertTemplateFree(DeliveryExpressTemplateFreeDO bean); - - List convertTemplateChargeList(List list); - - List convertTemplateFreeList(List list); - - default List convertTemplateFreeList(Long templateId, List list) { - return CollectionUtils.convertList(list, vo -> convertTemplateFree(templateId, vo)); - } - - default Map convertMap(Integer areaId, List templateList, - List chargeList, - List freeList) { - Map> templateIdChargeMap = convertMultiMap(chargeList, - DeliveryExpressTemplateChargeDO::getTemplateId); - Map> templateIdFreeMap = convertMultiMap(freeList, - DeliveryExpressTemplateFreeDO::getTemplateId); - // 组合运费模板配置 RespBO - Map result = Maps.newHashMapWithExpectedSize(templateList.size()); - templateList.forEach(template -> { - DeliveryExpressTemplateRespBO bo = new DeliveryExpressTemplateRespBO() - .setChargeMode(template.getChargeMode()) - .setCharge(convertTemplateCharge(findFirst(templateIdChargeMap.get(template.getId()), charge -> charge.getAreaIds().contains(areaId)))) - .setFree(convertTemplateFree(findFirst(templateIdFreeMap.get(template.getId()), free -> free.getAreaIds().contains(areaId)))); - result.put(template.getId(), bo); - }); - return result; - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java deleted file mode 100644 index c0e3e309..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.trade.convert.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.ip.core.utils.AreaUtils; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreRespVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreSimpleRespVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreUpdateReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface DeliveryPickUpStoreConvert { - - DeliveryPickUpStoreConvert INSTANCE = Mappers.getMapper(DeliveryPickUpStoreConvert.class); - - DeliveryPickUpStoreDO convert(DeliveryPickUpStoreCreateReqVO bean); - - DeliveryPickUpStoreDO convert(DeliveryPickUpStoreUpdateReqVO bean); - - DeliveryPickUpStoreRespVO convert(DeliveryPickUpStoreDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList1(List list); - @Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName") - DeliveryPickUpStoreSimpleRespVO convert02(DeliveryPickUpStoreDO bean); - - @Named("convertAreaIdToAreaName") - default String convertAreaIdToAreaName(Integer areaId) { - return AreaUtils.format(areaId); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/order/TradeOrderConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/order/TradeOrderConvert.java deleted file mode 100644 index 0835f9ab..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/convert/order/TradeOrderConvert.java +++ /dev/null @@ -1,286 +0,0 @@ -package com.win.module.trade.convert.order; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.string.StrUtils; -import com.win.framework.dict.core.util.DictFrameworkUtils; -import com.win.framework.ip.core.utils.AreaUtils; -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.trade.service.brokerage.bo.BrokerageAddReqBO; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.enums.DictTypeConstants; -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import com.win.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; -import com.win.module.trade.api.order.dto.TradeOrderRespDTO; -import com.win.module.trade.controller.admin.base.member.user.MemberUserRespVO; -import com.win.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; -import com.win.module.trade.controller.admin.order.vo.*; -import com.win.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; -import com.win.module.trade.controller.app.order.vo.*; -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO; -import com.win.module.trade.dal.dataobject.cart.CartDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.convertMultiMap; -import static com.win.framework.common.util.date.LocalDateTimeUtils.addTime; - -@Mapper -public interface TradeOrderConvert { - - TradeOrderConvert INSTANCE = Mappers.getMapper(TradeOrderConvert.class); - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(source = "createReqVO.couponId", target = "couponId"), - @Mapping(target = "remark", ignore = true), - @Mapping(source = "createReqVO.remark", target = "userRemark"), - @Mapping(source = "calculateRespBO.price.totalPrice", target = "totalPrice"), - @Mapping(source = "calculateRespBO.price.discountPrice", target = "discountPrice"), - @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"), - @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"), - @Mapping(source = "calculateRespBO.price.pointPrice", target = "pointPrice"), - @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice"), - @Mapping(source = "address.name", target = "receiverName"), - @Mapping(source = "address.mobile", target = "receiverMobile"), - @Mapping(source = "address.areaId", target = "receiverAreaId"), - @Mapping(source = "address.detailAddress", target = "receiverDetailAddress"), - }) - TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, - TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address); - - TradeOrderRespDTO convert(TradeOrderDO orderDO); - - default List convertList(TradeOrderDO tradeOrderDO, TradePriceCalculateRespBO calculateRespBO) { - return CollectionUtils.convertList(calculateRespBO.getItems(), item -> { - TradeOrderItemDO orderItem = convert(item); - orderItem.setOrderId(tradeOrderDO.getId()); - orderItem.setUserId(tradeOrderDO.getUserId()); - orderItem.setAfterSaleStatus(TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - orderItem.setCommentStatus(false); - return orderItem; - }); - } - - TradeOrderItemDO convert(TradePriceCalculateRespBO.OrderItem item); - - default ProductSkuUpdateStockReqDTO convert(List list) { - return new ProductSkuUpdateStockReqDTO(TradeOrderConvert.INSTANCE.convertList(list)); - } - - default ProductSkuUpdateStockReqDTO convertNegative(List list) { - List items = TradeOrderConvert.INSTANCE.convertList(list); - items.forEach(item -> item.setIncrCount(-item.getIncrCount())); - return new ProductSkuUpdateStockReqDTO(items); - } - - List convertList(List list); - - @Mappings({ - @Mapping(source = "skuId", target = "id"), - @Mapping(source = "count", target = "incrCount"), - }) - ProductSkuUpdateStockReqDTO.Item convert(TradeOrderItemDO bean); - - default PayOrderCreateReqDTO convert(TradeOrderDO order, List orderItems, - TradePriceCalculateRespBO calculateRespBO, TradeOrderProperties orderProperties) { - PayOrderCreateReqDTO createReqDTO = new PayOrderCreateReqDTO() - .setAppId(orderProperties.getAppId()).setUserIp(order.getUserIp()); - // 商户相关字段 - createReqDTO.setMerchantOrderId(String.valueOf(order.getId())); - String subject = calculateRespBO.getItems().get(0).getSpuName(); - subject = StrUtils.maxLength(subject, PayOrderCreateReqDTO.SUBJECT_MAX_LENGTH); // 避免超过 32 位 - createReqDTO.setSubject(subject); - createReqDTO.setBody(subject); // TODO 芋艿:临时写死 - // 订单相关字段 - createReqDTO.setPrice(order.getPayPrice()).setExpireTime(addTime(orderProperties.getExpireTime())); - return createReqDTO; - } - - // TODO 芋艿:可简化 - default PageResult convertPage(PageResult pageResult, - List orderItems, - Map memberUserMap) { - Map> orderItemMap = convertMultiMap(orderItems, TradeOrderItemDO::getOrderId); - // 转化 List - List orderVOs = CollectionUtils.convertList(pageResult.getList(), order -> { - List xOrderItems = orderItemMap.get(order.getId()); - TradeOrderPageItemRespVO orderVO = convert(order, xOrderItems); - // 处理收货地址 - orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId())); - // 增加用户昵称 - orderVO.setUser(memberUserMap.get(orderVO.getUserId())); - return orderVO; - }); - return new PageResult<>(orderVOs, pageResult.getTotal()); - } - - TradeOrderPageItemRespVO convert(TradeOrderDO order, List items); - - ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean); - - default TradeOrderDetailRespVO convert(TradeOrderDO order, List orderItems, - MemberUserRespDTO user) { - TradeOrderDetailRespVO orderVO = convert2(order, orderItems); - // 处理收货地址 - orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId())); - // 处理用户信息 - orderVO.setUser(convert(user)); - // TODO puhui999:模拟订单操作日志 - ArrayList orderLogs = new ArrayList<>(); - for (int i = 0; i < 6; i++) { - TradeOrderDetailRespVO.OrderLog orderLog = new TradeOrderDetailRespVO.OrderLog(); - orderLog.setContent("订单操作" + i); - orderLog.setCreateTime(LocalDateTime.now()); - orderLog.setUserType(i % 2 == 0 ? 2 : 1); - orderLogs.add(orderLog); - } - orderVO.setLogs(orderLogs); - return orderVO; - } - - TradeOrderDetailRespVO convert2(TradeOrderDO order, List items); - - MemberUserRespVO convert(MemberUserRespDTO bean); - - default PageResult convertPage02(PageResult pageResult, - List orderItems) { - Map> orderItemMap = convertMultiMap(orderItems, TradeOrderItemDO::getOrderId); - // 转化 List - List orderVOs = CollectionUtils.convertList(pageResult.getList(), order -> { - List xOrderItems = orderItemMap.get(order.getId()); - return convert02(order, xOrderItems); - }); - return new PageResult<>(orderVOs, pageResult.getTotal()); - } - - AppTradeOrderPageItemRespVO convert02(TradeOrderDO order, List items); - - AppProductPropertyValueDetailRespVO convert02(ProductPropertyValueDetailRespDTO bean); - - // TODO 芋艿:可简化 - default AppTradeOrderDetailRespVO convert02(TradeOrderDO order, List orderItems, - TradeOrderProperties tradeOrderProperties, - DeliveryExpressDO express) { - AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems); - orderVO.setPayExpireTime(addTime(tradeOrderProperties.getExpireTime())); - if (StrUtil.isNotEmpty(order.getPayChannelCode())) { - orderVO.setPayChannelName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.CHANNEL_CODE, order.getPayChannelCode())); - } - // 处理收货地址 - orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId())); - if (express != null) { - orderVO.setLogisticsId(express.getId()).setLogisticsName(express.getName()); - } - return orderVO; - } - - AppTradeOrderDetailRespVO convert3(TradeOrderDO order, List items); - - AppTradeOrderItemRespVO convert03(TradeOrderItemDO bean); - - @Mappings({ - @Mapping(target = "skuId", source = "tradeOrderItemDO.skuId"), - @Mapping(target = "orderId", source = "tradeOrderItemDO.orderId"), - @Mapping(target = "orderItemId", source = "tradeOrderItemDO.id"), - @Mapping(target = "descriptionScores", source = "createReqVO.descriptionScores"), - @Mapping(target = "benefitScores", source = "createReqVO.benefitScores"), - @Mapping(target = "content", source = "createReqVO.content"), - @Mapping(target = "picUrls", source = "createReqVO.picUrls"), - @Mapping(target = "anonymous", source = "createReqVO.anonymous"), - @Mapping(target = "userId", source = "tradeOrderItemDO.userId") - }) - ProductCommentCreateReqDTO convert04(AppTradeOrderItemCommentCreateReqVO createReqVO, TradeOrderItemDO tradeOrderItemDO); - - default TradePriceCalculateReqBO convert(Long userId, AppTradeOrderSettlementReqVO settlementReqVO, - List cartList) { - TradePriceCalculateReqBO reqBO = new TradePriceCalculateReqBO(); - reqBO.setUserId(userId).setCouponId(settlementReqVO.getCouponId()).setAddressId(settlementReqVO.getAddressId()) - .setItems(new ArrayList<>(settlementReqVO.getItems().size())); - // 商品项的构建 - Map cartMap = convertMap(cartList, CartDO::getId); - for (AppTradeOrderSettlementReqVO.Item item : settlementReqVO.getItems()) { - // 情况一:skuId + count - if (item.getSkuId() != null) { - reqBO.getItems().add(new TradePriceCalculateReqBO.Item().setSkuId(item.getSkuId()).setCount(item.getCount()) - .setSelected(true)); // true 的原因,下单一定选中 - continue; - } - // 情况二:cartId - CartDO cart = cartMap.get(item.getCartId()); - if (cart == null) { - continue; - } - reqBO.getItems().add(new TradePriceCalculateReqBO.Item().setSkuId(cart.getSkuId()).setCount(cart.getCount()) - .setCartId(item.getCartId()).setSelected(true)); // true 的原因,下单一定选中 - } - return reqBO; - } - - default AppTradeOrderSettlementRespVO convert(TradePriceCalculateRespBO calculate, AddressRespDTO address) { - AppTradeOrderSettlementRespVO respVO = convert0(calculate, address); - if (address != null) { - respVO.getAddress().setAreaName(AreaUtils.format(address.getAreaId())); - } - // TODO 芋艿:积分的接入; - respVO.setUsedPoint(1); - respVO.setTotalPoint(100); - return respVO; - } - - AppTradeOrderSettlementRespVO convert0(TradePriceCalculateRespBO calculate, AddressRespDTO address); - - @Mappings({ - @Mapping(target = "activityId", source = "createReqVO.combinationActivityId"), - @Mapping(target = "spuId", source = "orderItem.spuId"), - @Mapping(target = "skuId", source = "orderItem.skuId"), - @Mapping(target = "userId", source = "order.userId"), - @Mapping(target = "orderId", source = "order.id"), - @Mapping(target = "headId", source = "createReqVO.combinationHeadId"), - @Mapping(target = "spuName", source = "orderItem.spuName"), - @Mapping(target = "picUrl", source = "orderItem.picUrl"), - @Mapping(target = "combinationPrice", source = "orderItem.payPrice"), - @Mapping(target = "nickname", source = "user.nickname"), - @Mapping(target = "avatar", source = "user.avatar"), - @Mapping(target = "status", ignore = true) - }) - CombinationRecordCreateReqDTO convert(TradeOrderDO order, TradeOrderItemDO orderItem, - AppTradeOrderCreateReqVO createReqVO, MemberUserRespDTO user); - - List convertList02(List list); - - TradeOrderDO convert(TradeOrderUpdateAddressReqVO reqVO); - - TradeOrderDO convert(TradeOrderUpdatePriceReqVO reqVO); - - TradeOrderDO convert(TradeOrderRemarkReqVO reqVO); - - default BrokerageAddReqBO convert(TradeOrderItemDO item, ProductSkuRespDTO sku) { - return new BrokerageAddReqBO().setBizId(String.valueOf(item.getId())) - .setBasePrice(item.getPayPrice() * item.getCount()) - .setFirstFixedPrice(sku.getSubCommissionFirstPrice()) - .setSecondFixedPrice(sku.getSubCommissionSecondPrice()); - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java deleted file mode 100644 index 1ccdbacc..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.win.module.trade.dal.dataobject.aftersale; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleWayEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 售后订单,用于处理 {@link TradeOrderDO} 交易订单的退款退货流程 - * - * @author 芋道源码 - */ -@TableName(value = "trade_after_sale", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) -public class TradeAfterSaleDO extends BaseDO { - - /** - * 售后编号,主键自增 - */ - private Long id; - /** - * 售后单号 - * - * 例如说,1146347329394184195 - */ - private String no; - /** - * 退款状态 - * - * 枚举 {@link TradeAfterSaleStatusEnum} - */ - private Integer status; - /** - * 售后方式 - * - * 枚举 {@link TradeAfterSaleWayEnum} - */ - private Integer way; - /** - * 售后类型 - * - * 枚举 {@link TradeAfterSaleTypeEnum} - */ - private Integer type; - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 编号 - */ - private Long userId; - /** - * 申请原因 - * - * type = 退款,对应 trade_after_sale_refund_reason 类型 - * type = 退货退款,对应 trade_after_sale_refund_and_return_reason 类型 - */ - private String applyReason; - /** - * 补充描述 - */ - private String applyDescription; - /** - * 补充凭证图片 - * - * 数组,以逗号分隔 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List applyPicUrls; - - // ========== 交易订单相关 ========== - /** - * 交易订单编号 - * - * 关联 {@link TradeOrderDO#getId()} - */ - private Long orderId; - /** - * 订单流水号 - * - * 冗余 {@link TradeOrderDO#getNo()} - */ - private String orderNo; - /** - * 交易订单项编号 - * - * 关联 {@link TradeOrderItemDO#getId()} - */ - private Long orderItemId; - /** - * 商品 SPU 编号 - * - * 关联 ProductSpuDO 的 id 字段 - * 冗余 {@link TradeOrderItemDO#getSpuId()} - */ - private Long spuId; - /** - * 商品 SPU 名称 - * - * 关联 ProductSkuDO 的 name 字段 - * 冗余 {@link TradeOrderItemDO#getSpuName()} - */ - private String spuName; - /** - * 商品 SKU 编号 - * - * 关联 ProductSkuDO 的编号 - */ - private Long skuId; - /** - * 属性数组,JSON 格式 - * - * 冗余 {@link TradeOrderItemDO#getProperties()} - */ - @TableField(typeHandler = TradeOrderItemDO.PropertyTypeHandler.class) - private List properties; - /** - * 商品图片 - * - * 冗余 {@link TradeOrderItemDO#getPicUrl()} - */ - private String picUrl; - /** - * 退货商品数量 - */ - private Integer count; - - // ========== 审批相关 ========== - - /** - * 审批时间 - */ - private LocalDateTime auditTime; - /** - * 审批人 - * - * 关联 AdminUserDO 的 id 编号 - */ - private Long auditUserId; - /** - * 审批备注 - * - * 注意,只有审批不通过才会填写 - */ - private String auditReason; - - // ========== 退款相关 ========== - /** - * 退款金额,单位:分。 - */ - private Integer refundPrice; - /** - * 支付退款编号 - * - * 对接 pay-module-biz 支付服务的退款订单编号,即 PayRefundDO 的 id 编号 - */ - private Long payRefundId; - /** - * 退款时间 - */ - private LocalDateTime refundTime; - - // ========== 退货相关 ========== - /** - * 退货物流公司编号 - * - * 关联 LogisticsDO 的 id 编号 - */ - private Long logisticsId; - /** - * 退货物流单号 - */ - private String logisticsNo; - /** - * 退货时间 - */ - private LocalDateTime deliveryTime; - /** - * 收货时间 - */ - private LocalDateTime receiveTime; - /** - * 收货备注 - * - * 注意,只有拒绝收货才会填写 - */ - private String receiveReason; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java deleted file mode 100644 index 26244d5d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.win.module.trade.dal.dataobject.aftersale; - -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 交易售后日志 DO - * - * // TODO 可优化:参考淘宝或者有赞:1)增加 action 表示什么操作;2)content 记录每个操作的明细 - * - * @author 芋道源码 - */ -@TableName("trade_after_sale_log") -@KeySequence("trade_after_sale_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class TradeAfterSaleLogDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 用户编号 - * - * 关联 1:AdminUserDO 的 id 字段 - * 关联 2:MemberUserDO 的 id 字段 - */ - private Long userId; - /** - * 用户类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer userType; - /** - * 售后编号 - * - * 关联 {@link TradeAfterSaleDO#getId()} - */ - private Long afterSaleId; - // todo @CHENCHEN: 改成 Integer 哈;主要未来改文案,不好洗 log 存的字段; - /** - * 操作类型 - * - * 枚举 {@link AfterSaleOperateTypeEnum} - */ - private String operateType; - /** - * 操作明细 - */ - private String content; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/record/BrokerageRecordDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/record/BrokerageRecordDO.java deleted file mode 100644 index 4aa75ffe..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/record/BrokerageRecordDO.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.trade.dal.dataobject.brokerage.record; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.enums.brokerage.BrokerageRecordStatusEnum; -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 owen - */ -@TableName("trade_brokerage_record") -@KeySequence("trade_brokerage_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BrokerageRecordDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Integer id; - /** - * 用户编号 - */ - private Long userId; - /** - * 业务编号 - */ - private String bizId; - /** - * 业务类型 - *

- * 枚举 {@link BrokerageRecordBizTypeEnum} - */ - private Integer bizType; - - /** - * 标题 - */ - private String title; - /** - * 说明 - */ - private String description; - - /** - * 金额 - */ - private Integer price; - /** - * 当前总佣金 - */ - private Integer totalPrice; - - /** - * 状态 - *

- * 枚举 {@link BrokerageRecordStatusEnum} - */ - private Integer status; - - /** - * 冻结时间(天) - */ - private Integer frozenDays; - /** - * 解冻时间 - */ - private LocalDateTime unfreezeTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/user/BrokerageUserDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/user/BrokerageUserDO.java deleted file mode 100644 index 38b6fa0d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/brokerage/user/BrokerageUserDO.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.trade.dal.dataobject.brokerage.user; - -import com.win.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 owen - */ -@TableName("trade_brokerage_user") -@KeySequence("trade_brokerage_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BrokerageUserDO extends BaseDO { - - /** - * 用户编号 - *

- * 对应 MemberUserDO 的 id 字段 - */ - @TableId - private Long id; - - /** - * 推广员编号 - *

- * 关联 MemberUserDO 的 id 字段 - */ - private Long bindUserId; - /** - * 推广员绑定时间 - */ - private LocalDateTime bindUserTime; - - /** - * 是否有分销资格 - */ - private Boolean brokerageEnabled; - /** - * 成为分销员时间 - */ - private LocalDateTime brokerageTime; - - /** - * 可用佣金 - */ - private Integer brokeragePrice; - /** - * 冻结佣金 - */ - private Integer frozenPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/cart/CartDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/cart/CartDO.java deleted file mode 100644 index a6691572..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/cart/CartDO.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.module.trade.dal.dataobject.cart; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 购物车的商品信息 DO - * - * 每个商品,对应一条记录,通过 {@link #spuId} 和 {@link #skuId} 关联 - * - * @author 芋道源码 - */ -@TableName("trade_cart") -@Data -@EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) -public class CartDO extends BaseDO { - - // ========= 基础字段 BEGIN ========= - - /** - * 编号,唯一自增 - */ - private Long id; - - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 编号 - */ - private Long userId; - - // ========= 商品信息 ========= - - /** - * 商品 SPU 编号 - * - * 关联 ProductSpuDO 的 id 编号 - */ - private Long spuId; - /** - * 商品 SKU 编号 - * - * 关联 ProductSkuDO 的 id 编号 - */ - private Long skuId; - /** - * 商品购买数量 - */ - private Integer count; - /** - * 是否选中 - */ - private Boolean selected; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/config/TradeConfigDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/config/TradeConfigDO.java deleted file mode 100644 index bf76cd64..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/config/TradeConfigDO.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.win.module.trade.dal.dataobject.config; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.IntegerListTypeHandler; -import com.win.module.trade.enums.brokerage.BrokerageBindModeEnum; -import com.win.module.trade.enums.brokerage.BrokerageEnabledConditionEnum; -import com.win.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; -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 com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.List; - -/** - * 交易中心配置 DO - * - * @author owen - */ -@TableName(value = "trade_config", autoResultMap = true) -@KeySequence("trade_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class TradeConfigDO extends BaseDO { - - /** - * 自增主键 - */ - @TableId - private Long id; - - // ========== 分销相关 ========== - - /** - * 是否启用分佣 - */ - private Boolean brokerageEnabled; - /** - * 分佣模式 - *

- * 枚举 {@link BrokerageEnabledConditionEnum 对应的类} - */ - private Integer brokerageEnabledCondition; - /** - * 分销关系绑定模式 - *

- * 枚举 {@link BrokerageBindModeEnum 对应的类} - */ - private Integer brokerageBindMode; - /** - * 分销海报图地址数组 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List brokeragePostUrls; - /** - * 一级返佣比例 - */ - private Integer brokerageFirstPercent; - /** - * 二级返佣比例 - */ - private Integer brokerageSecondPercent; - /** - * 用户提现最低金额 - */ - private Integer brokerageWithdrawMinPrice; - /** - * 提现银行 - */ - @TableField(typeHandler = IntegerListTypeHandler.class) - private List brokerageBankNames; - /** - * 佣金冻结时间(天) - */ - private Integer brokerageFrozenDays; - /** - * 提现方式 - *

- * 枚举 {@link BrokerageWithdrawTypeEnum 对应的类} - */ - @TableField(typeHandler = IntegerListTypeHandler.class) - private List brokerageWithdrawType; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressDO.java deleted file mode 100644 index 50b40b67..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressDO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.win.module.trade.dal.dataobject.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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.Data; - -/** - * 快递公司 DO - * - * @author jason - */ -@TableName(value ="trade_delivery_express") -@KeySequence("trade_delivery_express_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DeliveryExpressDO extends BaseDO { - - /** - * 编号,自增 - */ - @TableId - private Long id; - - /** - * 快递公司 code - */ - private String code; - - /** - * 快递公司名称 - */ - private String name; - - /** - * 快递公司 logo - */ - private String logo; - - /** - * 排序 - */ - private Integer sort; - - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - - // TODO 芋艿:c 和结算相关的字段,后续在看 - // partnerId 是否需要月结账号 - // partnerKey 是否需要月结密码 - // net 是否需要取件网店 - // account 账号 - // password 网点名称 - // isShow 是否显示 -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateChargeDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateChargeDO.java deleted file mode 100644 index f0c79e77..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateChargeDO.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.module.trade.dal.dataobject.delivery; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.IntegerListTypeHandler; -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.Data; - -import java.util.List; - -/** - * 快递运费模板计费配置 DO - * - * @author jason - */ -@TableName(value ="trade_delivery_express_template_charge", autoResultMap = true) -@KeySequence("trade_delivery_express_template_charge_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DeliveryExpressTemplateChargeDO extends BaseDO { - - /** - * 编号,自增 - */ - @TableId - private Long id; - - /** - * 配送模板编号 - * - * 关联 {@link DeliveryExpressTemplateDO#getId()} - */ - private Long templateId; - - /** - * 配送区域编号列表 - */ - @TableField(typeHandler = IntegerListTypeHandler.class) - private List areaIds; - - /** - * 配送计费方式 - * - * 冗余 {@link DeliveryExpressTemplateDO#getChargeMode()} - */ - private Integer chargeMode; - - /** - * 首件数量(件数,重量,或体积) - */ - private Double startCount; - /** - * 起步价,单位:分 - */ - private Integer startPrice; - - /** - * 续件数量(件, 重量,或体积) - */ - private Double extraCount; - /** - * 额外价,单位:分 - */ - private Integer extraPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java deleted file mode 100644 index ebd9dbab..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.trade.dal.dataobject.delivery; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.trade.enums.delivery.DeliveryExpressChargeModeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 快递运费模板 DO - * - * @author jason - */ -@TableName("trade_delivery_express_template") -@KeySequence("trade_delivery_express_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DeliveryExpressTemplateDO extends BaseDO { - - /** - * 编号,自增 - */ - @TableId - private Long id; - - /** - * 模板名称 - */ - private String name; - - /** - * 配送计费方式 - * - * 枚举 {@link DeliveryExpressChargeModeEnum} - */ - private Integer chargeMode; - - /** - * 排序 - */ - private Integer sort; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateFreeDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateFreeDO.java deleted file mode 100644 index 03012f14..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateFreeDO.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.trade.dal.dataobject.delivery; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.IntegerListTypeHandler; -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.Data; - -import java.util.List; - -/** - * 快递运费模板包邮配置 DO - * - * @author jason - */ -@TableName(value ="trade_delivery_express_template_free", autoResultMap = true) -@KeySequence("trade_delivery_express_template_free_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DeliveryExpressTemplateFreeDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 配送模板编号 - * - * 关联 {@link DeliveryExpressTemplateDO#getId()} - */ - private Long templateId; - - - /** - * 配送区域编号列表 - */ - @TableField(typeHandler = IntegerListTypeHandler.class) - private List areaIds; - - /** - * 包邮金额,单位:分 - * - * 订单总金额 > 包邮金额时,才免运费 - */ - private Integer freePrice; - - /** - * 包邮件数 - * - * 订单总件数 > 包邮件数时,才免运费 - */ - private Integer freeCount; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreDO.java deleted file mode 100644 index 6a499801..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreDO.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.win.module.trade.dal.dataobject.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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.Data; - -import java.time.LocalTime; - -/** - * 自提门店 DO - * - * @author jason - */ -@TableName(value ="trade_delivery_pick_up_store") -@KeySequence("trade_delivery_pick_up_store_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DeliveryPickUpStoreDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 门店名称 - */ - private String name; - - /** - * 门店简介 - */ - private String introduction; - - /** - * 门店手机 - */ - private String phone; - - /** - * 区域编号 - */ - private Integer areaId; - - /** - * 门店详细地址 - */ - private String detailAddress; - - /** - * 门店 logo - */ - private String logo; - - /** - * 营业开始时间 - */ - private LocalTime openingTime; - - /** - * 营业结束时间 - */ - private LocalTime closingTime; - - /** - * 纬度 - */ - private Double latitude; - /** - * 经度 - */ - private Double longitude; - - /** - * 门店状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreStaffDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreStaffDO.java deleted file mode 100644 index ebf2c2f6..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreStaffDO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.trade.dal.dataobject.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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.Data; - -// TODO @芋艿:后续再详细 review 一轮 -// TODO @芋艿:可能改成 DeliveryPickUpStoreUserDO -/** - * 自提门店店员 DO - * - * @author jason - */ -@TableName(value ="trade_delivery_pick_up_store_staff") -@KeySequence("trade_delivery_pick_up_store_staff_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DeliveryPickUpStoreStaffDO extends BaseDO { - - /** - * 编号,自增 - */ - @TableId - private Long id; - - /** - * 自提门店编号 - * - * 关联 {@link DeliveryPickUpStoreDO#getId()} - */ - private Long storeId; - - /** - * 管理员用户id - * - * 关联 {AdminUserDO#getId()} - */ - private Long adminUserId; - - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderDO.java deleted file mode 100644 index 3c7e4f78..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderDO.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.win.module.trade.dal.dataobject.order; - -import com.win.framework.common.enums.TerminalEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; -import com.win.module.trade.enums.delivery.DeliveryTypeEnum; -import com.win.module.trade.enums.order.*; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.time.LocalDateTime; - -/** - * 交易订单 DO - * - * @author 芋道源码 - */ -@TableName("trade_order") -@KeySequence("trade_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class TradeOrderDO extends BaseDO { - - /** - * 发货物流公司编号 - 空(无需发货) - */ - public static final Long LOGISTICS_ID_NULL = 0L; - - // ========== 订单基本信息 ========== - /** - * 订单编号,主键自增 - */ - private Long id; - /** - * 订单流水号 - * - * 例如说,1146347329394184195 - */ - private String no; - /** - * 订单类型 - * - * 枚举 {@link TradeOrderTypeEnum} - */ - private Integer type; - /** - * 订单来源 - * - * 枚举 {@link TerminalEnum} - */ - private Integer terminal; - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 编号 - */ - private Long userId; - /** - * 用户 IP - */ - private String userIp; - /** - * 用户备注 - */ - private String userRemark; - /** - * 订单状态 - * - * 枚举 {@link TradeOrderStatusEnum} - */ - private Integer status; - /** - * 购买的商品数量 - */ - private Integer productCount; - /** - * 订单完成时间 - */ - private LocalDateTime finishTime; - /** - * 订单取消时间 - */ - private LocalDateTime cancelTime; - /** - * 取消类型 - * - * 枚举 {@link TradeOrderCancelTypeEnum} - */ - private Integer cancelType; - /** - * 商家备注 - */ - private String remark; - /** - * 是否评价 - * - * true - 已评价 - * false - 未评价 - */ - private Boolean commentStatus; - - // ========== 价格 + 支付基本信息 ========== - - // 价格文档 - 淘宝:https://open.taobao.com/docV3.htm?docId=108471&docType=1 - // 价格文档 - 京东到家:https://openo2o.jddj.com/api/getApiDetail/182/4d1494c5e7ac4679bfdaaed950c5bc7f.htm - // 价格文档 - 有赞:https://doc.youzanyun.com/detail/API/0/906 - - /** - * 支付订单编号 - * - * 对接 pay-module-biz 支付服务的支付订单编号,即 PayOrderDO 的 id 编号 - */ - private Long payOrderId; - /** - * 是否已支付 - * - * true - 已经支付过 - * false - 没有支付过 - */ - private Boolean payStatus; - /** - * 付款时间 - */ - private LocalDateTime payTime; - /** - * 支付渠道 - * - * 对应 PayChannelEnum 枚举 - */ - private String payChannelCode; - - /** - * 商品原价,单位:分 - * - * totalPrice = {@link TradeOrderItemDO#getPrice()} * {@link TradeOrderItemDO#getCount()} 求和 - * - * 对应 taobao 的 trade.total_fee 字段 - */ - private Integer totalPrice; - /** - * 优惠金额,单位:分 - * - * 对应 taobao 的 order.discount_fee 字段 - */ - private Integer discountPrice; - /** - * 运费金额,单位:分 - */ - private Integer deliveryPrice; - /** - * 订单调价,单位:分 - * - * 正数,加价;负数,减价 - */ - private Integer adjustPrice; - /** - * 应付金额(总),单位:分 - * - * = {@link #totalPrice} - * - {@link #couponPrice} - * - {@link #pointPrice} - * - {@link #discountPrice} - * + {@link #deliveryPrice} - * + {@link #adjustPrice} - */ - private Integer payPrice; - - // ========== 收件 + 物流基本信息 ========== - /** - * 配送方式 - * - * 枚举 {@link DeliveryTypeEnum} - */ - private Integer deliveryType; - /** - * 发货物流公司编号 - * - * 如果无需发货,则 logisticsId 设置为 0。原因是,不想再添加额外字段 - * - * 关联 {@link DeliveryExpressDO#getId()} - */ - private Long logisticsId; - /** - * 发货物流单号 - * - * 如果无需发货,则 logisticsNo 设置 ""。原因是,不想再添加额外字段 - */ - private String logisticsNo; - /** - * 发货时间 - */ - private LocalDateTime deliveryTime; - - /** - * 收货时间 - */ - private LocalDateTime receiveTime; - /** - * 收件人名称 - */ - private String receiverName; - /** - * 收件人手机 - */ - private String receiverMobile; - /** - * 收件人地区编号 - */ - private Integer receiverAreaId; - /** - * 收件人详细地址 - */ - private String receiverDetailAddress; - - /** - * 自提门店编号 - * - * 关联 {@link DeliveryPickUpStoreDO#getId()} - */ - private Long pickUpStoreId; - - // ========== 售后基本信息 ========== - /** - * 售后状态 - * - * 枚举 {@link TradeOrderRefundStatusEnum} - */ - private Integer refundStatus; - /** - * 退款金额,单位:分 - * - * 注意,退款并不会影响 {@link #payPrice} 实际支付金额 - * 也就说,一个订单最终产生多少金额的收入 = payPrice - refundPrice - */ - private Integer refundPrice; - - // ========== 营销基本信息 ========== - /** - * 优惠劵编号 - */ - private Long couponId; - /** - * 优惠劵减免金额,单位:分 - * - * 对应 taobao 的 trade.coupon_fee 字段 - */ - private Integer couponPrice; - // TODO 芋艿:需要记录使用的积分; - /** - * 积分抵扣的金额,单位:分 - * - * 对应 taobao 的 trade.point_fee 字段 - */ - private Integer pointPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderItemDO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderItemDO.java deleted file mode 100644 index ef0a68c8..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/dataobject/order/TradeOrderItemDO.java +++ /dev/null @@ -1,214 +0,0 @@ -package com.win.module.trade.dal.dataobject.order; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; -import com.win.module.trade.dal.dataobject.cart.CartDO; -import com.win.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * 交易订单项 DO - * - * @author 芋道源码 - */ -@TableName(value = "trade_order_item", autoResultMap = true) -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -public class TradeOrderItemDO extends BaseDO { - - // ========== 订单项基本信息 ========== - /** - * 编号 - */ - private Long id; - /** - * 用户编号 - * - * 关联 MemberUserDO 的 id 编号 - */ - private Long userId; - /** - * 订单编号 - * - * 关联 {@link TradeOrderDO#getId()} - */ - private Long orderId; - /** - * 购物车项编号 - * - * 关联 {@link CartDO#getId()} - */ - private Long cartId; - - // ========== 商品基本信息; 冗余较多字段,减少关联查询 ========== - /** - * 商品 SPU 编号 - * - * 关联 ProductSkuDO 的 spuId 编号 - */ - private Long spuId; - /** - * 商品 SPU 名称 - * - * 冗余 ProductSkuDO 的 spuName 编号 - */ - private String spuName; - /** - * 商品 SKU 编号 - * - * 关联 ProductSkuDO 的 id 编号 - */ - private Long skuId; - /** - * 属性数组,JSON 格式 - * - * 冗余 ProductSkuDO 的 properties 字段 - */ - @TableField(typeHandler = PropertyTypeHandler.class) - private List properties; - /** - * 商品图片 - */ - private String picUrl; - /** - * 购买数量 - */ - private Integer count; - /** - * 是否评价 - * - * true - 已评价 - * false - 未评价 - */ - private Boolean commentStatus; - - // ========== 价格 + 支付基本信息 ========== - - /** - * 商品原价(单),单位:分 - * - * 对应 ProductSkuDO 的 price 字段 - * 对应 taobao 的 order.price 字段 - */ - private Integer price; - /** - * 优惠金额(总),单位:分 - * - * 对应 taobao 的 order.discount_fee 字段 - */ - private Integer discountPrice; - /** - * 运费金额(总),单位:分 - */ - private Integer deliveryPrice; - /** - * 订单调价(总),单位:分 - * - * 正数,加价;负数,减价 - */ - private Integer adjustPrice; - /** - * 应付金额(总),单位:分 - * - * = {@link #price} * {@link #count} - * - {@link #couponPrice} - * - {@link #pointPrice} - * - {@link #discountPrice} - * + {@link #deliveryPrice} - * + {@link #adjustPrice} - */ - private Integer payPrice; - - // ========== 营销基本信息 ========== - - /** - * 优惠劵减免金额,单位:分 - * - * 对应 taobao 的 trade.coupon_fee 字段 - */ - private Integer couponPrice; - /** - * 积分抵扣的金额,单位:分 - * - * 对应 taobao 的 trade.point_fee 字段 - */ - private Integer pointPrice; - // TODO @芋艿:如果商品 vip 折扣时,到底是新增一个 vipPrice 记录优惠记录,还是 vipDiscountPrice,记录 vip 的优惠;还是直接使用 vipPrice; - // 目前 crmeb 的选择,单独一个 vipPrice 记录优惠价格;感觉不一定合理,可以在看看有赞的; - - // ========== 售后基本信息 ========== - - /** - * 售后单编号 - * - * 关联 {@link TradeAfterSaleDO#getId()} 字段 - */ - private Long afterSaleId; - /** - * 售后状态 - * - * 枚举 {@link TradeOrderItemAfterSaleStatusEnum} - */ - private Integer afterSaleStatus; - - /** - * 商品属性 - */ - @Data - public static class Property implements Serializable { - - /** - * 属性编号 - * - * 关联 ProductPropertyDO 的 id 编号 - */ - private Long propertyId; - /** - * 属性名字 - * - * 关联 ProductPropertyDO 的 name 字段 - */ - private String propertyName; - - /** - * 属性值编号 - * - * 关联 ProductPropertyValueDO 的 id 编号 - */ - private Long valueId; - /** - * 属性值名字 - * - * 关联 ProductPropertyValueDO 的 name 字段 - */ - private String valueName; - - } - - // TODO @芋艿:可以找一些新的思路 - public static class PropertyTypeHandler extends AbstractJsonTypeHandler> { - - @Override - protected List parse(String json) { - return JsonUtils.parseArray(json, Property.class); - } - - @Override - protected String toJson(List obj) { - return JsonUtils.toJsonString(obj); - } - - } - -} - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleLogMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleLogMapper.java deleted file mode 100644 index 076aa372..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleLogMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.win.module.trade.dal.mysql.aftersale; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface TradeAfterSaleLogMapper extends BaseMapperX { -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java deleted file mode 100644 index 439c51b2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.trade.dal.mysql.aftersale; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; - -@Mapper -public interface TradeAfterSaleMapper extends BaseMapperX { - - default PageResult selectPage(TradeAfterSalePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(TradeAfterSaleDO::getNo, reqVO.getNo()) - .eqIfPresent(TradeAfterSaleDO::getStatus, reqVO.getStatus()) - .eqIfPresent(TradeAfterSaleDO::getType, reqVO.getType()) - .eqIfPresent(TradeAfterSaleDO::getWay, reqVO.getWay()) - .likeIfPresent(TradeAfterSaleDO::getOrderNo, reqVO.getOrderNo()) - .likeIfPresent(TradeAfterSaleDO::getSpuName, reqVO.getSpuName()) - .betweenIfPresent(TradeAfterSaleDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(TradeAfterSaleDO::getId)); - } - - default PageResult selectPage(Long userId, PageParam pageParam) { - return selectPage(pageParam, new LambdaQueryWrapperX() - .eqIfPresent(TradeAfterSaleDO::getUserId, userId) - .orderByDesc(TradeAfterSaleDO::getId)); - } - - default int updateByIdAndStatus(Long id, Integer status, TradeAfterSaleDO update) { - return update(update, new LambdaUpdateWrapper() - .eq(TradeAfterSaleDO::getId, id).eq(TradeAfterSaleDO::getStatus, status)); - } - - default TradeAfterSaleDO selectByIdAndUserId(Long id, Long userId) { - return selectOne(TradeAfterSaleDO::getId, id, - TradeAfterSaleDO::getUserId, userId); - } - - default Long selectCountByUserIdAndStatus(Long userId, Collection statuses) { - return selectCount(new LambdaQueryWrapperX() - .eq(TradeAfterSaleDO::getUserId, userId) - .in(TradeAfterSaleDO::getStatus, statuses)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/record/BrokerageRecordMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/record/BrokerageRecordMapper.java deleted file mode 100644 index b6d7f7b0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/record/BrokerageRecordMapper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.trade.dal.mysql.brokerage.record; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; -import com.win.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; -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.Select; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 佣金记录 Mapper - * - * @author owen - */ -@Mapper -public interface BrokerageRecordMapper extends BaseMapperX { - - default PageResult selectPage(BrokerageRecordPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(BrokerageRecordDO::getUserId, reqVO.getUserId()) - .eqIfPresent(BrokerageRecordDO::getBizType, reqVO.getBizType()) - .eqIfPresent(BrokerageRecordDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(BrokerageRecordDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BrokerageRecordDO::getId)); - } - - default List selectListByStatusAndUnfreezeTimeLt(Integer status, LocalDateTime unfreezeTime) { - return selectList(new LambdaQueryWrapper() - .eq(BrokerageRecordDO::getStatus, status) - .lt(BrokerageRecordDO::getUnfreezeTime, unfreezeTime)); - } - - default int updateByIdAndStatus(Integer id, Integer status, BrokerageRecordDO updateObj) { - return update(updateObj, new LambdaQueryWrapper() - .eq(BrokerageRecordDO::getId, id) - .eq(BrokerageRecordDO::getStatus, status)); - } - - default BrokerageRecordDO selectByBizTypeAndBizId(Integer bizType, String bizId) { - return selectOne(BrokerageRecordDO::getBizType, bizType, - BrokerageRecordDO::getBizId, bizId); - } - - // TODO @疯狂:mysql 关键字,大写哈;这样看起来清晰点;例如说 SELECT COUNT(1) - @Select("select count(1), sum(price) from trade_brokerage_record where user_id = #{userId} and biz_type = #{bizType} and status = #{status}") - UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId, - @Param("bizType") Integer bizType, - @Param("status") Integer status); -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/user/BrokerageUserMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/user/BrokerageUserMapper.java deleted file mode 100644 index a889262e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/brokerage/user/BrokerageUserMapper.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.win.module.trade.dal.mysql.brokerage.user; - -import cn.hutool.core.lang.Assert; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 分销用户 Mapper - * - * @author owen - */ -@Mapper -public interface BrokerageUserMapper extends BaseMapperX { - - default PageResult selectPage(BrokerageUserPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(BrokerageUserDO::getBindUserId, reqVO.getBindUserId()) - .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled()) - .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(BrokerageUserDO::getId)); - } - - /** - * 更新用户可用佣金(增加) - * - * @param id 用户编号 - * @param incrCount 增加佣金(正数) - */ - default void updatePriceIncr(Long id, Integer incrCount) { - Assert.isTrue(incrCount > 0); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" price = price + " + incrCount) - .eq(BrokerageUserDO::getId, id); - update(null, lambdaUpdateWrapper); - } - - /** - * 更新用户可用佣金(减少) - * 注意:理论上佣金可能已经提现,这时会扣出负数,确保平台不会造成损失 - * - * @param id 用户编号 - * @param incrCount 增加佣金(负数) - */ - default void updatePriceDecr(Long id, Integer incrCount) { - Assert.isTrue(incrCount < 0); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" price = price + " + incrCount) // 负数,所以使用 + 号 - .eq(BrokerageUserDO::getId, id); - update(null, lambdaUpdateWrapper); - } - - /** - * 更新用户冻结佣金(增加) - * - * @param id 用户编号 - * @param incrCount 增加冻结佣金(正数) - */ - default void updateFrozenPriceIncr(Long id, Integer incrCount) { - Assert.isTrue(incrCount > 0); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" frozen_price = frozen_price + " + incrCount) - .eq(BrokerageUserDO::getId, id); - update(null, lambdaUpdateWrapper); - } - - /** - * 更新用户冻结佣金(减少) - * 注意:理论上冻结佣金可能已经解冻,这时会扣出负数,确保平台不会造成损失 - * - * @param id 用户编号 - * @param incrCount 减少冻结佣金(负数) - */ - default void updateFrozenPriceDecr(Long id, Integer incrCount) { - Assert.isTrue(incrCount < 0); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" frozen_price = frozen_price + " + incrCount) // 负数,所以使用 + 号 - .eq(BrokerageUserDO::getId, id); - update(null, lambdaUpdateWrapper); - } - - /** - * 更新用户冻结佣金(减少), 更新用户佣金(增加) - * - * @param id 用户编号 - * @param incrCount 减少冻结佣金(负数) - * @return 更新条数 - */ - default int updateFrozenPriceDecrAndPriceIncr(Long id, Integer incrCount) { - Assert.isTrue(incrCount < 0); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" frozen_price = frozen_price + " + incrCount + // 负数,所以使用 + 号 - ", price = price + " + -incrCount) // 负数,所以使用 - 号 - .eq(BrokerageUserDO::getId, id) - .ge(BrokerageUserDO::getFrozenPrice, -incrCount); // cas 逻辑 - return update(null, lambdaUpdateWrapper); - } - - default void updateBindUserIdAndBindUserTimeToNull(Long id) { - update(null, new LambdaUpdateWrapper() - .eq(BrokerageUserDO::getId, id) - .set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null)); - } - - default void updateEnabledFalseAndBrokerageTimeToNull(Long id) { - update(null, new LambdaUpdateWrapper() - .eq(BrokerageUserDO::getId, id) - .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/cart/CartMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/cart/CartMapper.java deleted file mode 100644 index 0e3847a0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/cart/CartMapper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.trade.dal.mysql.cart; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.trade.dal.dataobject.cart.CartDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -@Mapper -public interface CartMapper extends BaseMapperX { - - default CartDO selectByUserIdAndSkuId(Long userId, Long skuId) { - return selectOne(CartDO::getUserId, userId, - CartDO::getSkuId, skuId); - } - - default Integer selectSumByUserId(Long userId) { - // SQL sum 查询 - List> result = selectMaps(new QueryWrapper() - .select("SUM(count) AS sumCount") - .eq("user_id", userId) - .eq("selected", true)); // 只计算选中的 - // 获得数量 - return CollUtil.getFirst(result) != null ? MapUtil.getInt(result.get(0), "sumCount") : 0; - } - - default CartDO selectById(Long id, Long userId) { - return selectOne(CartDO::getId, id, - CartDO::getUserId, userId); - } - - default List selectListByIds(Collection ids, Long userId) { - return selectList(new LambdaQueryWrapper() - .in(CartDO::getId, ids) - .eq(CartDO::getUserId, userId)); - } - - default List selectListByUserId(Long userId) { - return selectList(new LambdaQueryWrapper() - .eq(CartDO::getUserId, userId)); - } - - default List selectListByUserId(Long userId, Set ids) { - return selectList(new LambdaQueryWrapper() - .eq(CartDO::getUserId, userId) - .in(CartDO::getId, ids)); - } - - default void updateByIds(Collection ids, Long userId, CartDO updateObj) { - update(updateObj, new LambdaQueryWrapper() - .in(CartDO::getId, ids) - .eq(CartDO::getUserId, userId)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/config/TradeConfigMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/config/TradeConfigMapper.java deleted file mode 100644 index 189cbd7f..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/config/TradeConfigMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.trade.dal.mysql.config; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 交易中心配置 Mapper - * - * @author owen - */ -@Mapper -public interface TradeConfigMapper extends BaseMapperX { - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressMapper.java deleted file mode 100644 index 3d544d97..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.trade.dal.mysql.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface DeliveryExpressMapper extends BaseMapperX { - - default PageResult selectPage(DeliveryExpressPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(DeliveryExpressDO::getCode, reqVO.getCode()) - .likeIfPresent(DeliveryExpressDO::getName, reqVO.getName()) - .eqIfPresent(DeliveryExpressDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(DeliveryExpressDO::getCreateTime, reqVO.getCreateTime()) - .orderByAsc(DeliveryExpressDO::getSort)); - } - - default List selectList(DeliveryExpressExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(DeliveryExpressDO::getCode, reqVO.getCode()) - .likeIfPresent(DeliveryExpressDO::getName, reqVO.getName()) - .eqIfPresent(DeliveryExpressDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(DeliveryExpressDO::getCreateTime, reqVO.getCreateTime()) - .orderByAsc(DeliveryExpressDO::getSort)); - } - - default DeliveryExpressDO selectByCode(String code) { - return selectOne(new LambdaQueryWrapper() - .eq(DeliveryExpressDO::getCode, code)); - } - - default List selectListByStatus(Integer status) { - return selectList(DeliveryExpressDO::getStatus, status); - } - -} - - - - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateChargeMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateChargeMapper.java deleted file mode 100644 index 58dd60ed..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateChargeMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.dal.mysql.delivery; - - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateChargeDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface DeliveryExpressTemplateChargeMapper extends BaseMapperX { - - default List selectListByTemplateId(Long templateId){ - return selectList(new LambdaQueryWrapper() - .eq(DeliveryExpressTemplateChargeDO::getTemplateId, templateId)); - } - - default int deleteByTemplateId(Long templateId){ - return delete(new LambdaQueryWrapper() - .eq(DeliveryExpressTemplateChargeDO::getTemplateId, templateId)); - } - - default List selectByTemplateIds(Collection templateIds) { - return selectList(DeliveryExpressTemplateChargeDO::getTemplateId, templateIds); - } - -} - - - - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateFreeMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateFreeMapper.java deleted file mode 100644 index df640e3b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateFreeMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.trade.dal.mysql.delivery; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateFreeDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface DeliveryExpressTemplateFreeMapper extends BaseMapperX { - - default List selectListByTemplateId(Long templateId) { - return selectList(new LambdaQueryWrapper() - .eq(DeliveryExpressTemplateFreeDO::getTemplateId, templateId)); - } - - default int deleteByTemplateId(Long templateId) { - return delete(new LambdaQueryWrapper() - .eq(DeliveryExpressTemplateFreeDO::getTemplateId, templateId)); - } - - default List selectListByTemplateIds(Collection templateIds) { - return selectList(DeliveryExpressTemplateFreeDO::getTemplateId, templateIds); - } -} - - - - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateMapper.java deleted file mode 100644 index e8ff7823..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryExpressTemplateMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.trade.dal.mysql.delivery; - - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DeliveryExpressTemplateMapper extends BaseMapperX { - - default PageResult selectPage(DeliveryExpressTemplatePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(DeliveryExpressTemplateDO::getName, reqVO.getName()) - .eqIfPresent(DeliveryExpressTemplateDO::getChargeMode, reqVO.getChargeMode()) - .betweenIfPresent(DeliveryExpressTemplateDO::getCreateTime, reqVO.getCreateTime()) - .orderByAsc(DeliveryExpressTemplateDO::getSort)); - } - - default DeliveryExpressTemplateDO selectByName(String name) { - return selectOne(DeliveryExpressTemplateDO::getName,name); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreMapper.java deleted file mode 100644 index 4629ffdd..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.dal.mysql.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStorePageReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface DeliveryPickUpStoreMapper extends BaseMapperX { - - default PageResult selectPage(DeliveryPickUpStorePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(DeliveryPickUpStoreDO::getName, reqVO.getName()) - .eqIfPresent(DeliveryPickUpStoreDO::getPhone, reqVO.getPhone()) - .eqIfPresent(DeliveryPickUpStoreDO::getAreaId, reqVO.getAreaId()) - .eqIfPresent(DeliveryPickUpStoreDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(DeliveryPickUpStoreDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(DeliveryPickUpStoreDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(DeliveryPickUpStoreDO::getStatus, status); - } - -} - - - - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreStaffMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreStaffMapper.java deleted file mode 100644 index 90636b98..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/delivery/DeliveryPickUpStoreStaffMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.trade.dal.mysql.delivery; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreStaffDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DeliveryPickUpStoreStaffMapper extends BaseMapperX { - -} - - - - diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderItemMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderItemMapper.java deleted file mode 100644 index 2e3ea3f2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderItemMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.trade.dal.mysql.order; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface TradeOrderItemMapper extends BaseMapperX { - - default int updateAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus, - Long afterSaleId) { - return update(new TradeOrderItemDO().setAfterSaleStatus(newAfterSaleStatus).setAfterSaleId(afterSaleId), - new LambdaUpdateWrapper<>(new TradeOrderItemDO().setId(id).setAfterSaleStatus(oldAfterSaleStatus))); - } - - default List selectListByOrderId(Long orderId) { - return selectList(TradeOrderItemDO::getOrderId, orderId); - } - - default List selectListByOrderId(Collection orderIds) { - return selectList(TradeOrderItemDO::getOrderId, orderIds); - } - - default List selectListByOrderIdAnSkuId(Collection orderIds, Collection skuIds) { - return selectList(new LambdaQueryWrapperX() - .in(TradeOrderItemDO::getOrderId, orderIds) - .eq(TradeOrderItemDO::getSkuId, skuIds)); - } - - default TradeOrderItemDO selectByIdAndUserId(Long orderItemId, Long loginUserId) { - return selectOne(new LambdaQueryWrapperX() - .eq(TradeOrderItemDO::getId, orderItemId) - .eq(TradeOrderItemDO::getUserId, loginUserId)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderMapper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderMapper.java deleted file mode 100644 index 3dbbe024..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/order/TradeOrderMapper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.trade.dal.mysql.order; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Set; - -@Mapper -public interface TradeOrderMapper extends BaseMapperX { - - default int updateByIdAndStatus(Long id, Integer status, TradeOrderDO update) { - return update(update, new LambdaUpdateWrapper() - .eq(TradeOrderDO::getId, id).eq(TradeOrderDO::getStatus, status)); - } - - default TradeOrderDO selectByIdAndUserId(Long id, Long userId) { - return selectOne(TradeOrderDO::getId, id, TradeOrderDO::getUserId, userId); - } - - default PageResult selectPage(TradeOrderPageReqVO reqVO, Set userIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(TradeOrderDO::getNo, reqVO.getNo()) - .eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId()) - .inIfPresent(TradeOrderDO::getUserId, userIds) - .likeIfPresent(TradeOrderDO::getReceiverName, reqVO.getReceiverName()) - .likeIfPresent(TradeOrderDO::getReceiverMobile, reqVO.getReceiverMobile()) - .eqIfPresent(TradeOrderDO::getType, reqVO.getType()) - .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus()) - .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode()) - .eqIfPresent(TradeOrderDO::getTerminal,reqVO.getTerminal()) - .eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId()) - .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds()) - .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())); - } - - default PageResult selectPage(AppTradeOrderPageReqVO reqVO, Long userId) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eq(TradeOrderDO::getUserId, userId) - .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus()) - .eqIfPresent(TradeOrderDO::getCommentStatus, reqVO.getCommentStatus()) - .orderByDesc(TradeOrderDO::getId)); // TODO 芋艿:未来不同的 status,不同的排序 - } - - default Long selectCountByUserIdAndStatus(Long userId, Integer status, Boolean commentStatus) { - return selectCount(new LambdaQueryWrapperX() - .eq(TradeOrderDO::getUserId, userId) - .eqIfPresent(TradeOrderDO::getStatus, status) - .eqIfPresent(TradeOrderDO::getCommentStatus, commentStatus)); - } - - default TradeOrderDO selectOrderByIdAndUserId(Long orderId, Long loginUserId) { - return selectOne(new LambdaQueryWrapperX() - .eq(TradeOrderDO::getId, orderId) - .eq(TradeOrderDO::getUserId, loginUserId)); - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/package-info.java deleted file mode 100644 index a357dd4e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/mysql/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * TODO 占位 - */ -package com.win.module.trade.dal.mysql; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/redis/no/TradeOrderNoRedisDAO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/redis/no/TradeOrderNoRedisDAO.java deleted file mode 100644 index 157798dd..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/dal/redis/no/TradeOrderNoRedisDAO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.trade.dal.redis.no; - -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Repository; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -/** - * 订单序号的 Redis DAO - * - * @author HUIHUI - */ -@Repository -public class TradeOrderNoRedisDAO { - - public static final String TRADE_ORDER_NO_PREFIX = "O"; - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 生成序号 - * - * @param prefix 前缀 - * @return 序号 - */ - public String generate(String prefix) { - String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN); - Long no = stringRedisTemplate.opsForValue().increment(noPrefix); - return noPrefix + no; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java deleted file mode 100644 index 70e169ba..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.config; - -import com.win.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -// TODO @chenchen:改成 aftersale 好点哈; -/** - * trade 模块的 afterSaleLog 组件的 Configuration - * - * @author 陈賝 - * @since 2023/6/18 11:09 - */ -@Configuration(proxyBeanMethods = false) -public class AfterSaleLogConfiguration { - - @Bean - public AfterSaleLogAspect afterSaleLogAspect() { - return new AfterSaleLogAspect(); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/annotations/AfterSaleLog.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/annotations/AfterSaleLog.java deleted file mode 100644 index dc8e447e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/annotations/AfterSaleLog.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.core.annotations; - -import com.win.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; - -import java.lang.annotation.*; - -/** - * 售后日志的注解 - * - * 写在方法上时,会自动记录售后日志 - * - * @author 陈賝 - * @since 2023/6/8 17:04 - * @see com.win.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface AfterSaleLog { - - /** - * 售后 ID - */ - String id(); - - /** - * 操作类型 - */ - AfterSaleOperateTypeEnum operateType(); - - /** - * 日志内容 - */ - String content() default ""; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java deleted file mode 100644 index fbdb5f48..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.core.aop; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.util.spring.SpringExpressionUtils; -import com.win.framework.operatelog.core.service.OperateLog; -import com.win.framework.web.core.util.WebFrameworkUtils; -import com.win.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog; -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO; -import com.win.module.trade.framework.aftersalelog.core.service.AfterSaleLogService; -import com.google.common.collect.Maps; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.reflect.MethodSignature; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static java.util.Arrays.asList; - -/** - * 记录售后日志的 AOP 切面 - * - * @author 陈賝 - * @since 2023/6/13 13:54 - */ -@Slf4j -@Aspect -public class AfterSaleLogAspect { - - @Resource - private AfterSaleLogService afterSaleLogService; - /** - * 售前状态 - */ - private static final ThreadLocal BEFORE_STATUS = new ThreadLocal<>(); - /** - * 售后状态 - */ - private static final ThreadLocal AFTER_STATUS = new ThreadLocal<>(); - /** - * 操作类型 - */ - private final static String OPERATE_TYPE = "operateType"; - /** - * ID - */ - private final static String ID = "id"; - /** - * 操作明细 - */ - private final static String CONTENT = "content"; - - /** - * 切面存入日志 - */ - @AfterReturning(pointcut = "@annotation(afterSaleLog)", returning = "info") - public void doAfterReturning(JoinPoint joinPoint, AfterSaleLog afterSaleLog, Object info) { - try { - // 日志对象拼接 - Integer userType = WebFrameworkUtils.getLoginUserType(); - Long id = WebFrameworkUtils.getLoginUserId(); - Map formatObj = spelFormat(joinPoint, info); - TradeAfterSaleLogCreateReqDTO dto = new TradeAfterSaleLogCreateReqDTO() - .setUserId(id) - .setUserType(userType) - .setAfterSaleId(MapUtil.getLong(formatObj, ID)) - .setOperateType(MapUtil.getStr(formatObj, OPERATE_TYPE)) - .setBeforeStatus(BEFORE_STATUS.get()) - .setAfterStatus(AFTER_STATUS.get()) - .setContent(MapUtil.getStr(formatObj, CONTENT)); - // 异步存入数据库 - afterSaleLogService.createLog(dto); - } catch (Exception exception) { - log.error("[doAfterReturning][afterSaleLog({}) 日志记录错误]", toJsonString(afterSaleLog), exception); - }finally { - clearThreadLocal(); - } - } - - /** - * 获取描述信息 - */ - public static Map spelFormat(JoinPoint joinPoint, Object info) { - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - AfterSaleLog afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLog.class); - HashMap result = Maps.newHashMapWithExpectedSize(2); - Map spelMap = SpringExpressionUtils.parseExpression(joinPoint, info, - asList(afterSaleLogPoint.id(), afterSaleLogPoint.content())); - // TODO @chenchen:是不是抽成 3 个方法好点;毕竟 map 太抽象了;; - // 售后ID - String id = MapUtil.getStr(spelMap, afterSaleLogPoint.id()); - result.put(ID, id); - // 操作类型 - String operateType = afterSaleLogPoint.operateType().description(); - result.put(OPERATE_TYPE, operateType); - // 日志内容 - String content = MapUtil.getStr(spelMap, afterSaleLogPoint.content()); - if (ObjectUtil.isNotNull(afterSaleLogPoint.operateType())) { - content += operateType; - } - result.put(CONTENT, content); - return result; - } - - public static void setBeforeStatus(Integer beforestatus) { - BEFORE_STATUS.set(beforestatus); - } - - public static void setAfterStatus(Integer afterStatus) { - AFTER_STATUS.set(afterStatus); - } - - private static void clearThreadLocal() { - AFTER_STATUS.remove(); - BEFORE_STATUS.remove(); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java deleted file mode 100644 index 4162e3f9..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.core.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 售后日志的创建 Request DTO - * - * @author 陈賝 - * @since 2023/6/19 09:54 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class TradeAfterSaleLogCreateReqDTO { - - /** - * 编号 - */ - private Long id; - /** - * 用户编号 - * - * 关联 1:AdminUserDO 的 id 字段 - * 关联 2:MemberUserDO 的 id 字段 - */ - private Long userId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 售后编号 - */ - private Long afterSaleId; - /** - * 操作类型 - */ - private String operateType; - /** - * 操作明细 - */ - private String content; - /** - * 售前状态 - */ - private Integer beforeStatus; - /** - * 售后状态 - */ - private Integer afterStatus; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogRespDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogRespDTO.java deleted file mode 100644 index 1648cd67..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogRespDTO.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.core.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -// TODO @puhui999:这个是不是应该搞成 vo 啊? -/** - * 贸易售后日志详情 DTO - * - * @author HUIHUI - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class TradeAfterSaleLogRespDTO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22634") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "用户类型不能为空") - private Integer userType; - - @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3023") - @NotNull(message = "售后编号不能为空") - private Long afterSaleId; - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25870") - @NotNull(message = "订单编号不能为空") - private Long orderId; - - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23154") - @NotNull(message = "订单项编号不能为空") - private Long orderItemId; - - @Schema(description = "售后状态(之前)", example = "2") - private Integer beforeStatus; - - @Schema(description = "售后状态(之后)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "售后状态(之后)不能为空") - private Integer afterStatus; - - @Schema(description = "操作明细", requiredMode = Schema.RequiredMode.REQUIRED, example = "维权完成,退款金额:¥37776.00") - @NotNull(message = "操作明细不能为空") - private String content; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/service/AfterSaleLogService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/service/AfterSaleLogService.java deleted file mode 100644 index 6e73659b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/service/AfterSaleLogService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.core.service; - - -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO; -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO; - -import java.util.List; - -/** - * 交易售后日志 Service 接口 - * - * @author 陈賝 - * @since 2023/6/12 14:18 - */ -public interface AfterSaleLogService { - - /** - * 创建售后日志 - * - * @param logDTO 日志记录 - * @author 陈賝 - * @since 2023/6/12 14:18 - */ - void createLog(TradeAfterSaleLogCreateReqDTO logDTO); - - /** - * 获取售后日志 - * - * @param afterSaleId 售后编号 - * @return 售后日志 - */ - List getLog(Long afterSaleId); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/util/AfterSaleLogUtils.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/util/AfterSaleLogUtils.java deleted file mode 100644 index fe8b0b64..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/aftersalelog/core/util/AfterSaleLogUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.trade.framework.aftersalelog.core.util; - - -import com.win.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect; - -/** - * 操作日志工具类 - * 目前主要的作用,是提供给业务代码,记录操作明细和拓展字段 - * - * @author 芋道源码 - */ -public class AfterSaleLogUtils { - - public static void setBeforeStatus(Integer status) { - AfterSaleLogAspect.setBeforeStatus(status); - } - - public static void setAfterStatus(Integer status) { - AfterSaleLogAspect.setAfterStatus(status); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/ExpressClientConfig.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/ExpressClientConfig.java deleted file mode 100644 index 5ad24f38..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/ExpressClientConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.trade.framework.delivery.config; - -import com.win.module.trade.framework.delivery.core.client.ExpressClient; -import com.win.module.trade.framework.delivery.core.client.ExpressClientFactory; -import com.win.module.trade.framework.delivery.core.client.impl.ExpressClientFactoryImpl; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -/** - * 快递客户端端配置类: - * - * 1. 快递客户端工厂 {@link ExpressClientFactory} - * 2. 默认的快递客户端实现 {@link ExpressClient} - * - * @author jason - */ -@Configuration(proxyBeanMethods = false) -public class ExpressClientConfig { - - @Bean - public ExpressClientFactory expressClientFactory(TradeExpressProperties tradeExpressProperties, - RestTemplate restTemplate) { - return new ExpressClientFactoryImpl(tradeExpressProperties, restTemplate); - } - - @Bean - public ExpressClient defaultExpressClient(ExpressClientFactory expressClientFactory) { - return expressClientFactory.getDefaultExpressClient(); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/TradeExpressProperties.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/TradeExpressProperties.java deleted file mode 100644 index 79b64422..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/config/TradeExpressProperties.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.win.module.trade.framework.delivery.config; - -import com.win.module.trade.framework.delivery.core.enums.ExpressClientEnum; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; - -// TODO @芋艿:未来要不要放数据库中?考虑 saas 多租户时,不同租户使用不同的配置? -/** - * 交易运费快递的配置项 - * - * @author jason - */ -@Component -@ConfigurationProperties(prefix = "win.trade.express") -@Data -@Validated -public class TradeExpressProperties { - - /** - * 快递客户端 - * - * 默认不提供,需要提醒用户配置一个快递服务商。 - */ - private ExpressClientEnum client = ExpressClientEnum.NOT_PROVIDE; - - /** - * 快递鸟配置 - */ - @Valid - private KdNiaoConfig kdNiao; - /** - * 快递 100 配置 - */ - @Valid - private Kd100Config kd100; - - /** - * 快递鸟配置项目 - */ - @Data - public static class KdNiaoConfig { - - /** - * 快递鸟用户 ID - */ - @NotEmpty(message = "快递鸟用户 ID 配置项不能为空") - private String businessId; - /** - * 快递鸟 API Key - */ - @NotEmpty(message = "快递鸟 Api Key 配置项不能为空") - private String apiKey; - - } - - /** - * 快递 100 配置项 - */ - @Data - public static class Kd100Config { - - /** - * 快递 100 授权码 - */ - @NotEmpty(message = "快递 100 授权码配置项不能为空") - private String customer; - /** - * 快递 100 授权 key - */ - @NotEmpty(message = "快递 100 授权 Key 配置项不能为空") - private String key; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClient.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClient.java deleted file mode 100644 index 9dbb5054..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClient.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client; - -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; - -import java.util.List; - -/** - * 快递客户端接口 - * - * @author jason - */ -public interface ExpressClient { - - /** - * 快递实时查询 - * - * @param reqDTO 查询请求参数 - */ - // TODO @jason:返回字段可以参考 https://doc.youzanyun.com/detail/API/0/5 响应的 data - List getExpressTrackList(ExpressTrackQueryReqDTO reqDTO); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClientFactory.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClientFactory.java deleted file mode 100644 index 3b0de7f7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/ExpressClientFactory.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client; - -import com.win.module.trade.framework.delivery.core.enums.ExpressClientEnum; - -/** - * 快递客户端工厂接口:用于创建和缓存快递客户端 - * - * @author jason - */ -public interface ExpressClientFactory { - - /** - * 获取默认的快递客户端 - */ - ExpressClient getDefaultExpressClient(); - - /** - * 通过枚举获取快递客户端,如果不存在,就创建一个对应快递客户端 - * - * @param clientEnum 快递客户端枚举 - */ - ExpressClient getOrCreateExpressClient(ExpressClientEnum clientEnum); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java deleted file mode 100644 index 5989bd1e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.convert; - -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryRespDTO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface ExpressQueryConvert { - - ExpressQueryConvert INSTANCE = Mappers.getMapper(ExpressQueryConvert.class); - - List convertList(List list); - @Mapping(source = "acceptTime", target = "time") - @Mapping(source = "acceptStation", target = "content") - ExpressTrackRespDTO convert(KdNiaoExpressQueryRespDTO.ExpressTrack track); - - List convertList2(List list); - @Mapping(source = "context", target = "content") - ExpressTrackRespDTO convert(Kd100ExpressQueryRespDTO.ExpressTrack track); - - KdNiaoExpressQueryReqDTO convert(ExpressTrackQueryReqDTO dto); - - Kd100ExpressQueryReqDTO convert2(ExpressTrackQueryReqDTO dto); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackQueryReqDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackQueryReqDTO.java deleted file mode 100644 index d209bfd6..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackQueryReqDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.dto; - -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import lombok.Data; - -/** - * 快递轨迹的查询 Req DTO - * - * @author jason - */ -@Data -public class ExpressTrackQueryReqDTO { - - /** - * 快递公司编码 - * - * 对应 {@link DeliveryExpressDO#getCode()} - */ - private String expressCode; - - /** - * 发货快递单号 - */ - private String logisticsNo; - - /** - * 收、寄件人的电话号码 - */ - private String phone; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackRespDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackRespDTO.java deleted file mode 100644 index 39a55bb2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/ExpressTrackRespDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.dto; - -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 快递查询的轨迹 Resp DTO - * - * @author jason - */ -@Data -public class ExpressTrackRespDTO { - - /** - * 发生时间 - */ - private LocalDateTime time; - - /** - * 快递状态 - */ - private String content; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java deleted file mode 100644 index 8192c8fe..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.dto.kd100; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * 快递 100 快递查询 Req DTO - * - * @author jason - */ -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Kd100ExpressQueryReqDTO { - - /** - * 快递公司编码 - */ - @JsonProperty("com") - private String expressCode; - - /** - * 快递单号 - */ - @JsonProperty("num") - private String logisticsNo; - - /** - * 收、寄件人的电话号码 - */ - private String phone; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java deleted file mode 100644 index 04d498a5..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.dto.kd100; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; - -/** - * 快递 100 实时快递查询 Resp DTO - * - * 参见 快递 100 文档 - * - * @author jason - */ -@Data -public class Kd100ExpressQueryRespDTO { - - /** - * 快递公司编码 - */ - @JsonProperty("com") - private String expressCompanyCode; - /** - * 快递单号 - */ - @JsonProperty("nu") - private String logisticsNo; - /** - * 快递单当前状态 - */ - private String state; - - /** - * 查询结果 - * - * 失败返回 "false" - */ - private String result; - /** - * 查询结果失败时的错误信息 - */ - private String message; - - /** - * 轨迹数组 - */ - @JsonProperty("data") - private List tracks; - - @Data - public static class ExpressTrack { - - /** - * 轨迹发生时间 - */ - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - private LocalDateTime time; - - /** - * 轨迹描述 - */ - private String context; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java deleted file mode 100644 index 92c789ce..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.dto.kdniao; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * 快递鸟快递查询 Req DTO - * - * @author jason - */ -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class KdNiaoExpressQueryReqDTO { - - /** - * 快递公司编码 - */ - @JsonProperty("ShipperCode") - private String expressCode; - /** - * 快递单号 - */ - @JsonProperty("LogisticCode") - private String logisticsNo; - /** - * 订单编号 - */ - @JsonProperty("OrderCode") - private String orderNo; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java deleted file mode 100644 index 9c95ba6d..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.dto.kdniao; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; - -/** - * 快递鸟快递查询 Resp DTO - * - * 参见 快递鸟接口文档 - * - * @author jason - */ -@Data -public class KdNiaoExpressQueryRespDTO { - - /** - * 快递公司编码 - */ - @JsonProperty("ShipperCode") - private String shipperCode; - - /** - * 快递单号 - */ - @JsonProperty("LogisticCode") - private String logisticsNo; - - /** - * 订单编号 - */ - @JsonProperty("OrderCode") - private String orderNo; - - /** - * 用户 ID - */ - @JsonProperty("EBusinessID") - private String businessId; - - /** - * 普通物流状态 - * - * 0 - 暂无轨迹信息 - * 1 - 已揽收 - * 2 - 在途中 - * 3 - 签收 - * 4 - 问题件 - * 5 - 转寄 - * 6 - 清关 - */ - @JsonProperty("State") - private String state; - - /** - * 成功与否 - */ - @JsonProperty("Success") - private Boolean success; - /** - * 失败原因 - */ - @JsonProperty("Reason") - private String reason; - - /** - * 轨迹数组 - */ - @JsonProperty("Traces") - private List tracks; - - @Data - public static class ExpressTrack { - - /** - * 发生时间 - */ - @JsonProperty("AcceptTime") - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - private LocalDateTime acceptTime; - - /** - * 轨迹描述 - */ - @JsonProperty("AcceptStation") - private String acceptStation; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java deleted file mode 100644 index b0e564a7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.impl; - -import cn.hutool.core.lang.Assert; -import com.win.module.trade.framework.delivery.config.TradeExpressProperties; -import com.win.module.trade.framework.delivery.core.client.ExpressClient; -import com.win.module.trade.framework.delivery.core.client.impl.kd100.Kd100ExpressClient; -import com.win.module.trade.framework.delivery.core.client.impl.kdniao.KdNiaoExpressClient; -import com.win.module.trade.framework.delivery.core.enums.ExpressClientEnum; -import com.win.module.trade.framework.delivery.core.client.ExpressClientFactory; -import lombok.AllArgsConstructor; -import org.springframework.web.client.RestTemplate; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 快递客户端工厂实现类 - * - * @author jason - */ -@AllArgsConstructor -public class ExpressClientFactoryImpl implements ExpressClientFactory { - - private final Map clientMap = new ConcurrentHashMap<>(8); - - private final TradeExpressProperties tradeExpressProperties; - private final RestTemplate restTemplate; - - @Override - public ExpressClient getDefaultExpressClient() { - ExpressClient defaultClient = getOrCreateExpressClient(tradeExpressProperties.getClient()); - Assert.notNull("默认的快递客户端不能为空"); - return defaultClient; - } - - @Override - public ExpressClient getOrCreateExpressClient(ExpressClientEnum clientEnum) { - return clientMap.computeIfAbsent(clientEnum, - client -> createExpressClient(client, tradeExpressProperties)); - } - - private ExpressClient createExpressClient(ExpressClientEnum queryProviderEnum, - TradeExpressProperties tradeExpressProperties) { - switch (queryProviderEnum) { - case NOT_PROVIDE: - return new NoProvideExpressClient(); - case KD_NIAO: - return new KdNiaoExpressClient(restTemplate, tradeExpressProperties.getKdNiao()); - case KD_100: - return new Kd100ExpressClient(restTemplate, tradeExpressProperties.getKd100()); - } - return null; - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java deleted file mode 100644 index 2a1b4823..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.impl; - -import com.win.module.trade.framework.delivery.core.client.ExpressClient; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; - -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_CLIENT_NOT_PROVIDE; - -/** - * 未实现的快递客户端,用来提醒用户需要接入快递服务商, - * - * @author jason - */ -public class NoProvideExpressClient implements ExpressClient { - - @Override - public List getExpressTrackList(ExpressTrackQueryReqDTO reqDTO) { - throw exception(EXPRESS_CLIENT_NOT_PROVIDE); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java deleted file mode 100644 index 663b2119..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.impl.kd100; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.HexUtil; -import cn.hutool.crypto.digest.DigestUtil; -import com.win.framework.common.util.json.JsonUtils; -import com.win.module.trade.framework.delivery.config.TradeExpressProperties; -import com.win.module.trade.framework.delivery.core.client.ExpressClient; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED; -import static com.win.module.trade.framework.delivery.core.client.convert.ExpressQueryConvert.INSTANCE; - -/** - * 快递 100 客户端 - * - * @author jason - */ -@Slf4j -@AllArgsConstructor -public class Kd100ExpressClient implements ExpressClient { - - private static final String REAL_TIME_QUERY_URL = "https://poll.kuaidi100.com/poll/query.do"; - - private final RestTemplate restTemplate; - private final TradeExpressProperties.Kd100Config config; - - /** - * 查询快递轨迹 - * - * @see 接口文档 - * - * @param reqDTO 查询请求参数 - * @return 快递轨迹 - */ - @Override - public List getExpressTrackList(ExpressTrackQueryReqDTO reqDTO) { - // 发起请求 - Kd100ExpressQueryReqDTO requestDTO = INSTANCE.convert2(reqDTO) - .setExpressCode(reqDTO.getExpressCode().toLowerCase()); - Kd100ExpressQueryRespDTO respDTO = httpRequest(REAL_TIME_QUERY_URL, requestDTO, - Kd100ExpressQueryRespDTO.class); - - // 处理结果 - if (Objects.equals("false", respDTO.getResult())) { - throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getMessage()); - } - if (CollUtil.isEmpty(respDTO.getTracks())) { - return Collections.emptyList(); - } - return INSTANCE.convertList2(respDTO.getTracks()); - } - - /** - * 快递 100 API 请求 - * - * @param url 请求 url - * @param req 对应请求的请求参数 - * @param respClass 对应请求的响应 class - * @param 每个请求的请求结构 Req DTO - * @param 每个请求的响应结构 Resp DTO - */ - private Resp httpRequest(String url, Req req, Class respClass) { - // 请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - // 请求体 - String param = JsonUtils.toJsonString(req); - String sign = generateReqSign(param, config.getKey(), config.getCustomer()); // 签名 - MultiValueMap requestBody = new LinkedMultiValueMap<>(); - requestBody.add("customer", config.getCustomer()); - requestBody.add("sign", sign); - requestBody.add("param", param); - log.debug("[httpRequest][请求参数({})]", requestBody); - - // 发送请求 - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); - log.debug("[httpRequest][的响应结果({})]", responseEntity); - // 处理响应 - if (!responseEntity.getStatusCode().is2xxSuccessful()) { - throw exception(EXPRESS_API_QUERY_ERROR); - } - return JsonUtils.parseObject(responseEntity.getBody(), respClass); - } - - private String generateReqSign(String param, String key, String customer) { - String plainText = String.format("%s%s%s", param, key, customer); - return HexUtil.encodeHexStr(DigestUtil.md5(plainText), false); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kdniao/KdNiaoExpressClient.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kdniao/KdNiaoExpressClient.java deleted file mode 100644 index 11e85c93..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/client/impl/kdniao/KdNiaoExpressClient.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.impl.kdniao; - -import cn.hutool.core.codec.Base64; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.net.URLEncodeUtil; -import cn.hutool.crypto.digest.DigestUtil; -import com.win.framework.common.util.json.JsonUtils; -import com.win.module.trade.framework.delivery.config.TradeExpressProperties; -import com.win.module.trade.framework.delivery.core.client.ExpressClient; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.kdniao.KdNiaoExpressQueryRespDTO; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.util.Collections; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR; -import static com.win.module.trade.framework.delivery.core.client.convert.ExpressQueryConvert.INSTANCE; - -/** - * 快递鸟客户端 - * - * @author jason - */ -@Slf4j -@AllArgsConstructor -public class KdNiaoExpressClient implements ExpressClient { - - private static final String REAL_TIME_QUERY_URL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"; - - /** - * 快递鸟即时查询免费版 RequestType - */ - private static final String REAL_TIME_FREE_REQ_TYPE = "1002"; - - private final RestTemplate restTemplate; - private final TradeExpressProperties.KdNiaoConfig config; - - /** - * 查询快递轨迹【免费版】 - * - * 仅支持 3 家:申通快递、圆通速递、百世快递 - * - * @see 接口文档 - * - * @param reqDTO 查询请求参数 - * @return 快递轨迹 - */ - @Override - public List getExpressTrackList(ExpressTrackQueryReqDTO reqDTO) { - // 发起请求 - KdNiaoExpressQueryReqDTO requestDTO = INSTANCE.convert(reqDTO) - .setExpressCode(reqDTO.getExpressCode().toUpperCase()); - KdNiaoExpressQueryRespDTO respDTO = httpRequest(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE, - requestDTO, KdNiaoExpressQueryRespDTO.class); - - // 处理结果 - if (respDTO == null || !respDTO.getSuccess()) { - throw exception(EXPRESS_API_QUERY_FAILED, respDTO == null ? "" : respDTO.getReason()); - } - if (CollUtil.isEmpty(respDTO.getTracks())) { - return Collections.emptyList(); - } - return INSTANCE.convertList(respDTO.getTracks()); - } - - /** - * 快递鸟 API 请求 - * - * @param url 请求 url - * @param requestType 对应的请求指令 (快递鸟的 RequestType) - * @param req 对应请求的请求参数 - * @param respClass 对应请求的响应 class - * @param 每个请求的请求结构 Req DTO - * @param 每个请求的响应结构 Resp DTO - */ - private Resp httpRequest(String url, String requestType, Req req, Class respClass) { - // 请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - // 请求体 - String reqData = JsonUtils.toJsonString(req); - String dataSign = generateDataSign(reqData, config.getApiKey()); - MultiValueMap requestBody = new LinkedMultiValueMap<>(); - requestBody.add("RequestData", reqData); - requestBody.add("DataType", "2"); - requestBody.add("EBusinessID", config.getBusinessId()); - requestBody.add("DataSign", dataSign); - requestBody.add("RequestType", requestType); - log.debug("[httpRequest][RequestType({}) 的请求参数({})]", requestType, requestBody); - - // 发送请求 - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); - log.debug("[httpRequest][RequestType({}) 的响应结果({})", requestType, responseEntity); - // 处理响应 - if (!responseEntity.getStatusCode().is2xxSuccessful()) { - throw exception(EXPRESS_API_QUERY_ERROR); - } - return JsonUtils.parseObject(responseEntity.getBody(), respClass); - } - - /** - * 快递鸟生成请求签名 - * - * 参见 签名说明 - * - * @param reqData 请求实体 - * @param apiKey api Key - */ - private String generateDataSign(String reqData, String apiKey) { - String plainText = String.format("%s%s", reqData, apiKey); - return URLEncodeUtil.encode(Base64.encode(DigestUtil.md5Hex(plainText))); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/enums/ExpressClientEnum.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/enums/ExpressClientEnum.java deleted file mode 100644 index 445566f4..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/delivery/core/enums/ExpressClientEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.trade.framework.delivery.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 快递客户端枚举 - * - * @author jason - */ -@Getter -@AllArgsConstructor -public enum ExpressClientEnum { - - NOT_PROVIDE("not-provide","未提供"), - KD_NIAO("kd-niao", "快递鸟"), - KD_100("kd-100", "快递100"); - - /** - * 快递服务商唯一编码 - */ - private final String code; - /** - * 快递服务商名称 - */ - private final String name; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderConfig.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderConfig.java deleted file mode 100644 index 303d09c1..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.trade.framework.order.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -// TODO @LeeYan9: 可以直接给 TradeOrderProperties 一个 @Component生效哈 -/** - * @author LeeYan9 - * @since 2022-09-15 - */ -@Configuration -@EnableConfigurationProperties(TradeOrderProperties.class) -public class TradeOrderConfig { -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderProperties.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderProperties.java deleted file mode 100644 index 854d6ee5..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/order/config/TradeOrderProperties.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.trade.framework.order.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotNull; -import java.time.Duration; - -/** - * 交易订单的配置项 - * - * @author LeeYan9 - * @since 2022-09-15 - */ -@ConfigurationProperties(prefix = "win.trade.order") -@Data -@Validated -public class TradeOrderProperties { - - /** - * 应用编号 - */ - @NotNull(message = "应用编号不能为空") - private Long appId; - - /** - * 支付超时时间 - */ - @NotNull(message = "支付超时时间不能为空") - private Duration expireTime; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/package-info.java deleted file mode 100644 index 42bb0b67..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 trade 模块的 framework 封装 - * - * @author 芋道源码 - */ -package com.win.module.trade.framework; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/config/TradeWebConfiguration.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/config/TradeWebConfiguration.java deleted file mode 100644 index 21e2e3b7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/config/TradeWebConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.trade.framework.web.config; - -import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; -import org.springdoc.core.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * trade 模块的 web 组件的 Configuration - * - * @author 芋道源码 - */ -@Configuration(proxyBeanMethods = false) -public class TradeWebConfiguration { - - /** - * trade 模块的 API 分组 - */ - @Bean - public GroupedOpenApi tradeGroupedOpenApi() { - return WinSwaggerAutoConfiguration.buildGroupedOpenApi("trade"); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/package-info.java deleted file mode 100644 index ccc0de79..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * trade 模块的 web 配置 - */ -package com.win.module.trade.framework.web; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/brokerage/BrokerageRecordUnfreezeJob.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/brokerage/BrokerageRecordUnfreezeJob.java deleted file mode 100644 index e59e1eb8..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/brokerage/BrokerageRecordUnfreezeJob.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.trade.job.brokerage; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.quartz.core.handler.JobHandler; -import com.win.framework.tenant.core.job.TenantJob; -import com.win.module.trade.service.brokerage.record.BrokerageRecordService; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 佣金解冻 Job - * - * @author owen - */ -@Component -@TenantJob -public class BrokerageRecordUnfreezeJob implements JobHandler { - - @Resource - private BrokerageRecordService brokerageRecordService; - - @Override - public String execute(String param) { - int count = brokerageRecordService.unfreezeRecord(); - return StrUtil.format("解冻佣金 {} 个", count); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/package-info.java deleted file mode 100644 index a86a0466..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/job/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位文件,无特殊用途 - */ -package com.win.module.trade.job; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/package-info.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/package-info.java deleted file mode 100644 index 22092b58..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * trade 模块,product 模块,主要实现商品相关功能 - * 例如:品牌、商品分类、spu、sku等功能。 - * - * 1. Controller URL:以 /product/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 product_ 开头,方便在数据库中区分 - */ -package com.win.module.trade; diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleService.java deleted file mode 100644 index 7ef7cfc7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleService.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.win.module.trade.service.aftersale; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDisagreeReqVO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRefuseReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; - -/** - * 售后订单 Service 接口 - * - * @author 芋道源码 - */ -public interface TradeAfterSaleService { - - /** - * 【管理员】获得售后订单分页 - * - * @param pageReqVO 分页查询 - * @return 售后订单分页 - */ - PageResult getAfterSalePage(TradeAfterSalePageReqVO pageReqVO); - - /** - * 【会员】获得售后订单分页 - * - * @param userId 用户编号 - * @param pageParam 分页参数 - * @return 售后订单分页 - */ - PageResult getAfterSalePage(Long userId, PageParam pageParam); - - /** - * 【会员】获得售后单 - * - * @param userId 用户编号 - * @param id 售后编号 - * @return 售后订单 - */ - TradeAfterSaleDO getAfterSale(Long userId, Long id); - - /** - * 【管理员】获得售后单 - * - * @param id 售后编号 - * @return 售后订单 - */ - TradeAfterSaleDO getAfterSale(Long id); - - /** - * 【会员】创建售后订单 - * - * @param userId 会员用户编号 - * @param createReqVO 创建 Request 信息 - * @return 售后编号 - */ - Long createAfterSale(Long userId, AppTradeAfterSaleCreateReqVO createReqVO); - - /** - * 【管理员】同意售后订单 - * - * @param userId 管理员用户编号 - * @param id 售后编号 - */ - void agreeAfterSale(Long userId, Long id); - - /** - * 【管理员】拒绝售后订单 - * - * @param userId 管理员用户编号 - * @param auditReqVO 审批 Request 信息 - */ - void disagreeAfterSale(Long userId, TradeAfterSaleDisagreeReqVO auditReqVO); - - /** - * 【会员】退回货物 - * - * @param userId 会员用户编号 - * @param deliveryReqVO 退货 Request 信息 - */ - void deliveryAfterSale(Long userId, AppTradeAfterSaleDeliveryReqVO deliveryReqVO); - - /** - * 【管理员】确认收货 - * - * @param userId 管理员编号 - * @param id 售后编号 - */ - void receiveAfterSale(Long userId, Long id); - - /** - * 【管理员】拒绝收货 - * - * @param userId 管理员用户编号 - * @param refuseReqVO 拒绝收货 Request 信息 - */ - void refuseAfterSale(Long userId, TradeAfterSaleRefuseReqVO refuseReqVO); - - /** - * 【管理员】确认退款 - * - * @param userId 管理员用户编号 - * @param userIp 管理员用户 IP - * @param id 售后编号 - */ - void refundAfterSale(Long userId, String userIp, Long id); - - /** - * 【会员】取消售后 - * - * @param userId 会员用户编号 - * @param id 售后编号 - */ - void cancelAfterSale(Long userId, Long id); - - /** - * 【会员】获得正在进行中的售后订单数量 - * - * @param userId - * @return 数量 - */ - Long getApplyingAfterSaleCount(Long userId); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java deleted file mode 100644 index 20919f89..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java +++ /dev/null @@ -1,459 +0,0 @@ -package com.win.module.trade.service.aftersale; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.object.ObjectUtils; -import com.win.module.pay.api.refund.PayRefundApi; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDisagreeReqVO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRefuseReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO; -import com.win.module.trade.convert.aftersale.TradeAfterSaleConvert; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.dal.mysql.aftersale.TradeAfterSaleLogMapper; -import com.win.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper; -import com.win.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleWayEnum; -import com.win.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO; -import com.win.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO; -import com.win.module.trade.framework.aftersalelog.core.service.AfterSaleLogService; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import com.win.module.trade.service.order.TradeOrderQueryService; -import com.win.module.trade.service.order.TradeOrderUpdateService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static com.win.module.trade.enums.ErrorCodeConstants.*; - -/** - * 售后订单 Service 实现类 - * - * @author 芋道源码 - */ -@Slf4j -@Service -@Validated -public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSaleLogService { - - @Resource - private TradeOrderUpdateService tradeOrderUpdateService; - @Resource - private TradeOrderQueryService tradeOrderQueryService; - - @Resource - private TradeAfterSaleMapper tradeAfterSaleMapper; - @Resource - private TradeAfterSaleLogMapper tradeAfterSaleLogMapper; - - @Resource - private PayRefundApi payRefundApi; - - @Resource - private TradeOrderProperties tradeOrderProperties; - - @Override - public PageResult getAfterSalePage(TradeAfterSalePageReqVO pageReqVO) { - return tradeAfterSaleMapper.selectPage(pageReqVO); - } - - @Override - public PageResult getAfterSalePage(Long userId, PageParam pageParam) { - return tradeAfterSaleMapper.selectPage(userId, pageParam); - } - - @Override - public TradeAfterSaleDO getAfterSale(Long userId, Long id) { - return tradeAfterSaleMapper.selectByIdAndUserId(id, userId); - } - - @Override - public TradeAfterSaleDO getAfterSale(Long id) { - return tradeAfterSaleMapper.selectById(id); - } - - // TODO 芋艿:拼团失败,要不要发起售后的方式退款?还是走取消逻辑? - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createAfterSale(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) { - // 第一步,前置校验 - TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO); - - // 第二步,存储售后订单 - TradeAfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem); - return afterSale.getId(); - } - - /** - * 校验交易订单项是否可以申请售后 - * - * @param userId 用户编号 - * @param createReqVO 售后创建信息 - * @return 交易订单项 - */ - private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) { - // 校验订单项存在 - TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(userId, createReqVO.getOrderItemId()); - if (orderItem == null) { - throw exception(ORDER_ITEM_NOT_FOUND); - } - - // 已申请售后,不允许再发起售后申请 - if (!TradeOrderItemAfterSaleStatusEnum.isNone(orderItem.getAfterSaleStatus())) { - throw exception(AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED); - } - - // 申请的退款金额,不能超过商品的价格 - if (createReqVO.getRefundPrice() > orderItem.getPayPrice()) { - throw exception(AFTER_SALE_CREATE_FAIL_REFUND_PRICE_ERROR); - } - - // 校验订单存在 - TradeOrderDO order = tradeOrderQueryService.getOrder(userId, orderItem.getOrderId()); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - // TODO 芋艿:超过一定时间,不允许售后 - // 已取消,无法发起售后 - if (TradeOrderStatusEnum.isCanceled(order.getStatus())) { - throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_CANCELED); - } - // 未支付,无法发起售后 - if (!TradeOrderStatusEnum.havePaid(order.getStatus())) { - throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID); - } - // 如果是【退货退款】的情况,需要额外校验是否发货 - if (createReqVO.getWay().equals(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay()) - && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) { - throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED); - } - return orderItem; - } - - private TradeAfterSaleDO createAfterSale(AppTradeAfterSaleCreateReqVO createReqVO, - TradeOrderItemDO orderItem) { - // 创建售后单 - TradeAfterSaleDO afterSale = TradeAfterSaleConvert.INSTANCE.convert(createReqVO, orderItem); - afterSale.setNo(RandomUtil.randomString(10)); // TODO 芋艿:优化 no 生成逻辑 - afterSale.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); - // 标记是售中还是售后 - TradeOrderDO order = tradeOrderQueryService.getOrder(orderItem.getUserId(), orderItem.getOrderId()); - afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索 - afterSale.setType(TradeOrderStatusEnum.isCompleted(order.getStatus()) - ? TradeAfterSaleTypeEnum.AFTER_SALE.getType() : TradeAfterSaleTypeEnum.IN_SALE.getType()); - // TODO 退还积分 - tradeAfterSaleMapper.insert(afterSale); - - // 更新交易订单项的售后状态 - tradeOrderUpdateService.updateOrderItemAfterSaleStatus(orderItem.getId(), - TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(), TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), - afterSale.getId(), null); - - // 记录售后日志 - createAfterSaleLog(orderItem.getUserId(), UserTypeEnum.MEMBER.getValue(), - afterSale, null, afterSale.getStatus()); - - // TODO 发送售后消息 - return afterSale; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void agreeAfterSale(Long userId, Long id) { - // 校验售后单存在,并状态未审批 - TradeAfterSaleDO afterSale = validateAfterSaleAuditable(id); - - // 更新售后单的状态 - // 情况一:退款:标记为 WAIT_REFUND 状态。后续等退款发起成功后,在标记为 COMPLETE 状态 - // 情况二:退货退款:需要等用户退货后,才能发起退款 - Integer newStatus = afterSale.getWay().equals(TradeAfterSaleWayEnum.REFUND.getWay()) ? - TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus() : TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(); - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO() - .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(), - afterSale, afterSale.getStatus(), newStatus); - - // TODO 发送售后消息 - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void disagreeAfterSale(Long userId, TradeAfterSaleDisagreeReqVO auditReqVO) { - // 校验售后单存在,并状态未审批 - TradeAfterSaleDO afterSale = validateAfterSaleAuditable(auditReqVO.getId()); - - // 更新售后单的状态 - Integer newStatus = TradeAfterSaleStatusEnum.SELLER_DISAGREE.getStatus(); - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO() - .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()) - .setAuditReason(auditReqVO.getAuditReason())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(), - afterSale, afterSale.getStatus(), newStatus); - - // TODO 发送售后消息 - - // 更新交易订单项的售后状态为【未申请】 - tradeOrderUpdateService.updateOrderItemAfterSaleStatus(afterSale.getOrderItemId(), - TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - } - - /** - * 校验售后单是否可审批(同意售后、拒绝售后) - * - * @param id 售后编号 - * @return 售后单 - */ - private TradeAfterSaleDO validateAfterSaleAuditable(Long id) { - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); - if (afterSale == null) { - throw exception(AFTER_SALE_NOT_FOUND); - } - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus())) { - throw exception(AFTER_SALE_AUDIT_FAIL_STATUS_NOT_APPLY); - } - return afterSale; - } - - private void updateAfterSaleStatus(Long id, Integer status, TradeAfterSaleDO updateObj) { - int updateCount = tradeAfterSaleMapper.updateByIdAndStatus(id, status, updateObj); - if (updateCount == 0) { - throw exception(AFTER_SALE_UPDATE_STATUS_FAIL); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deliveryAfterSale(Long userId, AppTradeAfterSaleDeliveryReqVO deliveryReqVO) { - // 校验售后单存在,并状态未退货 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(deliveryReqVO.getId()); - if (afterSale == null) { - throw exception(AFTER_SALE_NOT_FOUND); - } - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus())) { - throw exception(AFTER_SALE_DELIVERY_FAIL_STATUS_NOT_SELLER_AGREE); - } - - // 更新售后单的物流信息 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(), new TradeAfterSaleDO() - .setStatus(TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus()) - .setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()) - .setDeliveryTime(LocalDateTime.now())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.MEMBER.getValue(), - afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus()); - - // TODO 发送售后消息 - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void receiveAfterSale(Long userId, Long id) { - // 校验售后单存在,并状态为已退货 - TradeAfterSaleDO afterSale = validateAfterSaleReceivable(id); - - // 更新售后单的状态 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new TradeAfterSaleDO() - .setStatus(TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus()).setReceiveTime(LocalDateTime.now())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(), - afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus()); - - // TODO 发送售后消息 - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void refuseAfterSale(Long userId, TradeAfterSaleRefuseReqVO refuseReqVO) { - // 校验售后单存在,并状态为已退货 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(refuseReqVO.getId()); - if (afterSale == null) { - throw exception(AFTER_SALE_NOT_FOUND); - } - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) { - throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY); - } - - // 更新售后单的状态 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new TradeAfterSaleDO() - .setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()).setReceiveTime(LocalDateTime.now()) - .setReceiveReason(refuseReqVO.getRefuseMemo())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(), - afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()); - - // TODO 发送售后消息 - - // 更新交易订单项的售后状态为【未申请】 - tradeOrderUpdateService.updateOrderItemAfterSaleStatus(afterSale.getOrderItemId(), - TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - } - - /** - * 校验售后单是否可收货,即处于买家已发货 - * - * @param id 售后编号 - * @return 售后单 - */ - private TradeAfterSaleDO validateAfterSaleReceivable(Long id) { - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); - if (afterSale == null) { - throw exception(AFTER_SALE_NOT_FOUND); - } - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) { - throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY); - } - return afterSale; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void refundAfterSale(Long userId, String userIp, Long id) { - // 校验售后单的状态,并状态待退款 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); - if (afterSale == null) { - throw exception(AFTER_SALE_NOT_FOUND); - } - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus())) { - throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND); - } - - // 发起退款单。注意,需要在事务提交后,再进行发起,避免重复发起 - createPayRefund(userIp, afterSale); - - // 更新售后单的状态为【已完成】 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus(), new TradeAfterSaleDO() - .setStatus(TradeAfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(), - afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.COMPLETE.getStatus()); - - // TODO 发送售后消息 - - // 更新交易订单项的售后状态为【已完成】 - tradeOrderUpdateService.updateOrderItemAfterSaleStatus(afterSale.getOrderItemId(), - TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), - null, afterSale.getRefundPrice()); - } - - private void createPayRefund(String userIp, TradeAfterSaleDO afterSale) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - @Override - public void afterCommit() { - // 创建退款单 - PayRefundCreateReqDTO createReqDTO = TradeAfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties); - Long payRefundId = payRefundApi.createRefund(createReqDTO); - // 更新售后单的退款单号 - tradeAfterSaleMapper.updateById(new TradeAfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId)); - } - }); - } - - @Override - public void cancelAfterSale(Long userId, Long id) { - // 校验售后单的状态,并状态待退款 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); - if (afterSale == null) { - throw exception(AFTER_SALE_NOT_FOUND); - } - if (!ObjectUtils.equalsAny(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus(), - TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(), - TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) { - throw exception(AFTER_SALE_CANCEL_FAIL_STATUS_NOT_APPLY_OR_AGREE_OR_BUYER_DELIVERY); - } - - // 更新售后单的状态为【已取消】 - updateAfterSaleStatus(afterSale.getId(), afterSale.getStatus(), new TradeAfterSaleDO() - .setStatus(TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus())); - - // 记录售后日志 - createAfterSaleLog(userId, UserTypeEnum.MEMBER.getValue(), - afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus()); - - // TODO 发送售后消息 - - // 更新交易订单项的售后状态为【未申请】 - tradeOrderUpdateService.updateOrderItemAfterSaleStatus(afterSale.getOrderItemId(), - TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - } - - @Override - public Long getApplyingAfterSaleCount(Long userId) { - return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, TradeAfterSaleStatusEnum.APPLYING_STATUSES); - } - - @Deprecated - private void createAfterSaleLog(Long userId, Integer userType, TradeAfterSaleDO afterSale, - Integer beforeStatus, Integer afterStatus) { - TradeAfterSaleLogCreateReqDTO logDTO = new TradeAfterSaleLogCreateReqDTO() - .setUserId(userId) - .setUserType(userType) - .setAfterSaleId(afterSale.getId()) - .setOperateType(afterStatus.toString()); - // TODO 废弃,待删除 - this.createLog(logDTO); - } - - // TODO @CHENCHEN:这个注释,写在接口就好了,补充重复写哈;@date 应该是 @since - /** - * 日志记录 - * - * @param logDTO 日志记录 - * @author 陈賝 - * @date 2023/6/12 14:18 - */ - @Override - @Async - public void createLog(TradeAfterSaleLogCreateReqDTO logDTO) { - try { - TradeAfterSaleLogDO afterSaleLog = new TradeAfterSaleLogDO() - .setUserId(logDTO.getUserId()) - .setUserType(logDTO.getUserType()) - .setAfterSaleId(logDTO.getAfterSaleId()) - .setOperateType(logDTO.getOperateType()) - .setContent(logDTO.getContent()); - tradeAfterSaleLogMapper.insert(afterSaleLog); - // TODO @CHENCHEN:代码排版哈;空格要正确 - }catch (Exception exception){ - log.error("[createLog][request({}) 日志记录错误]", toJsonString(logDTO), exception); - } - } - - @Override - public List getLog(Long afterSaleId) { - // TODO 不熟悉流程先这么滴 - List saleLogDOs = tradeAfterSaleLogMapper.selectList(TradeAfterSaleLogDO::getAfterSaleId, afterSaleId); - return TradeAfterSaleConvert.INSTANCE.convertList(saleLogDOs); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/BrokerageAddReqBO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/BrokerageAddReqBO.java deleted file mode 100644 index 241aca48..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/BrokerageAddReqBO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.trade.service.brokerage.bo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * 佣金 增加 Request BO - * - * @author owen - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class BrokerageAddReqBO { - - /** - * 业务编号 - */ - @NotBlank(message = "业务编号不能为空") - private String bizId; - /** - * 佣金基数 - */ - @NotNull(message = "佣金基数不能为空") - private Integer basePrice; - /** - * 一级佣金(固定) - */ - private Integer firstFixedPrice; - /** - * 二级佣金(固定) - */ - private Integer secondFixedPrice; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/UserBrokerageSummaryBO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/UserBrokerageSummaryBO.java deleted file mode 100644 index 01a37c0e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/bo/UserBrokerageSummaryBO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.trade.service.brokerage.bo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 用户佣金合计 BO - * - * @author owen - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class UserBrokerageSummaryBO { - - /** - * 佣金数量 - */ - private Integer count; - /** - * 佣金总额 - */ - private Integer price; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordService.java deleted file mode 100644 index e1ec3960..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.win.module.trade.service.brokerage.record; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.service.brokerage.bo.BrokerageAddReqBO; -import com.win.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 佣金记录 Service 接口 - * - * @author owen - */ -public interface BrokerageRecordService { - - /** - * 获得佣金记录 - * - * @param id 编号 - * @return 佣金记录 - */ - BrokerageRecordDO getBrokerageRecord(Integer id); - - /** - * 获得佣金记录分页 - * - * @param pageReqVO 分页查询 - * @return 佣金记录分页 - */ - PageResult getBrokerageRecordPage(BrokerageRecordPageReqVO pageReqVO); - - /** - * 增加佣金 - * - * @param userId 会员编号 - * @param bizType 业务类型 - * @param list 请求参数列表 - */ - void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, @Valid List list); - - /** - * 取消佣金:将佣金记录,状态修改为已失效 - * - * @param userId 会员编号 - * @param bizType 业务类型 - * @param bizId 业务编号 - */ - void cancelBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId); - - /** - * 解冻佣金:将待结算的佣金记录,状态修改为已结算 - * - * @return 解冻佣金的数量 - */ - int unfreezeRecord(); - - /** - * 汇总用户佣金 - * - * @param userId 用户编号 - * @param bizType 业务类型 - * @param status 佣金状态 - * @return 用户佣金汇总 - */ - UserBrokerageSummaryBO getUserBrokerageSummaryByUserId(Long userId, Integer bizType, Integer status); -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImpl.java deleted file mode 100644 index e1972d71..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImpl.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.win.module.trade.service.brokerage.record; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.number.MoneyUtils; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO; -import com.win.module.trade.convert.brokerage.record.BrokerageRecordConvert; -import com.win.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; -import com.win.module.trade.dal.mysql.brokerage.record.BrokerageRecordMapper; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.enums.brokerage.BrokerageRecordStatusEnum; -import com.win.module.trade.service.brokerage.bo.BrokerageAddReqBO; -import com.win.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; -import com.win.module.trade.service.brokerage.user.BrokerageUserService; -import com.win.module.trade.service.config.TradeConfigService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - -/** - * 佣金记录 Service 实现类 - * - * @author owen - */ -@Slf4j -@Service -@Validated -public class BrokerageRecordServiceImpl implements BrokerageRecordService { - - @Resource - private BrokerageRecordMapper brokerageRecordMapper; - @Resource - private TradeConfigService tradeConfigService; - @Resource - private BrokerageUserService brokerageUserService; - - @Override - public BrokerageRecordDO getBrokerageRecord(Integer id) { - return brokerageRecordMapper.selectById(id); - } - - @Override - public PageResult getBrokerageRecordPage(BrokerageRecordPageReqVO pageReqVO) { - return brokerageRecordMapper.selectPage(pageReqVO); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, List list) { - TradeConfigDO memberConfig = tradeConfigService.getTradeConfig(); - // 0 未启用分销功能 - if (memberConfig == null || !BooleanUtil.isTrue(memberConfig.getBrokerageEnabled())) { - log.warn("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({})", userId); - return; - } - - // 1.1 获得一级推广人 - BrokerageUserDO firstUser = brokerageUserService.getBindBrokerageUser(userId); - if (firstUser == null || !BooleanUtil.isTrue(firstUser.getBrokerageEnabled())) { - return; - } - // 1.2 计算一级分佣 - addBrokerage(firstUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageFirstPercent(), BrokerageAddReqBO::getFirstFixedPrice, bizType); - - // 2.1 获得二级推广员 - if (firstUser.getBindUserId() == null) { - return; - } - BrokerageUserDO secondUser = brokerageUserService.getBrokerageUser(firstUser.getBindUserId()); - if (secondUser == null || !BooleanUtil.isTrue(secondUser.getBrokerageEnabled())) { - return; - } - // 2.2 计算二级分佣 - addBrokerage(secondUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageSecondPercent(), BrokerageAddReqBO::getSecondFixedPrice, bizType); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancelBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId) { - // TODO @疯狂:userId 加进去查询,会不会更好一点?万一穿错参数; - BrokerageRecordDO record = brokerageRecordMapper.selectByBizTypeAndBizId(bizType.getType(), bizId); - if (record == null || ObjectUtil.notEqual(record.getUserId(), userId)) { - log.error("[cancelBrokerage][userId({})][bizId({}) 更新为已失效失败:记录不存在]", userId, bizId); - return; - } - - // 1. 更新佣金记录为已失效 - BrokerageRecordDO updateObj = new BrokerageRecordDO().setStatus(BrokerageRecordStatusEnum.CANCEL.getStatus()); - int updateRows = brokerageRecordMapper.updateByIdAndStatus(record.getId(), record.getStatus(), updateObj); - if (updateRows == 0) { - log.error("[cancelBrokerage][record({}) 更新为已失效失败]", record.getId()); - return; - } - - // 2. 更新用户的佣金 - if (BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus().equals(record.getStatus())) { - brokerageUserService.updateUserFrozenPrice(userId, -record.getPrice()); - } else if (BrokerageRecordStatusEnum.SETTLEMENT.getStatus().equals(record.getStatus())) { - brokerageUserService.updateUserPrice(userId, -record.getPrice()); - } - } - - /** - * 计算佣金 - * - * @param basePrice 佣金基数 - * @param percent 佣金比例 - * @param fixedPrice 固定佣金 - * @return 佣金 - */ - int calculatePrice(Integer basePrice, Integer percent, Integer fixedPrice) { - // 1. 优先使用固定佣金 - if (fixedPrice != null && fixedPrice > 0) { - return ObjectUtil.defaultIfNull(fixedPrice, 0); - } - // 2. 根据比例计算佣金 - if (basePrice != null && basePrice > 0 && percent != null && percent > 0) { - return MoneyUtils.calculateRatePriceFloor(basePrice, Double.valueOf(percent)); - } - return 0; - } - - /** - * 增加用户佣金 - * - * @param user 用户 - * @param list 佣金增加参数列表 - * @param brokerageFrozenDays 冻结天数 - * @param brokeragePercent 佣金比例 - * @param fixedPriceFun 固定佣金 // TODO 疯狂:这里是不是可以直接传递 fixedPrice 呀? - * @param bizType 业务类型 - */ - private void addBrokerage(BrokerageUserDO user, List list, Integer brokerageFrozenDays, - Integer brokeragePercent, Function fixedPriceFun, - BrokerageRecordBizTypeEnum bizType) { - // 1.1 处理冻结时间 - LocalDateTime unfreezeTime = null; - if (brokerageFrozenDays != null && brokerageFrozenDays > 0) { - unfreezeTime = LocalDateTime.now().plusDays(brokerageFrozenDays); - } - // 1.2 计算分佣 - int totalBrokerage = 0; - List records = new ArrayList<>(); - for (BrokerageAddReqBO item : list) { - int brokeragePerItem = calculatePrice(item.getBasePrice(), brokeragePercent, fixedPriceFun.apply(item)); - if (brokeragePerItem <= 0) { - continue; - } - records.add(BrokerageRecordConvert.INSTANCE.convert(user, bizType, item.getBizId(), - brokerageFrozenDays, brokeragePerItem, unfreezeTime, bizType.getTitle())); - totalBrokerage += brokeragePerItem; - } - if (CollUtil.isEmpty(records)) { - return; - } - // 1.3 保存佣金记录 - brokerageRecordMapper.insertBatch(records); - - // 2. 更新用户佣金 - if (brokerageFrozenDays != null && brokerageFrozenDays > 0) { // 更新用户冻结佣金 - brokerageUserService.updateUserFrozenPrice(user.getId(), totalBrokerage); - } else { // 更新用户可用佣金 - brokerageUserService.updateUserPrice(user.getId(), totalBrokerage); - } - } - - @Override - public int unfreezeRecord() { - // 1. 查询待结算的佣金记录 - List records = brokerageRecordMapper.selectListByStatusAndUnfreezeTimeLt( - BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus(), LocalDateTime.now()); - if (CollUtil.isEmpty(records)) { - return 0; - } - - // 2. 遍历执行 - int count = 0; - for (BrokerageRecordDO record : records) { - try { - boolean success = getSelf().unfreezeRecord(record); - if (success) { - count++; - } - } catch (Exception e) { - log.error("[unfreezeRecord][record({}) 更新为已结算失败]", record.getId(), e); - } - } - return count; - } - - @Override - public UserBrokerageSummaryBO getUserBrokerageSummaryByUserId(Long userId, Integer bizType, Integer status) { - UserBrokerageSummaryBO summaryBO = brokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status); - return summaryBO != null ? summaryBO : new UserBrokerageSummaryBO(0, 0); - } - - @Transactional(rollbackFor = Exception.class) - public boolean unfreezeRecord(BrokerageRecordDO record) { - // 更新记录状态 - BrokerageRecordDO updateObj = new BrokerageRecordDO() - .setStatus(BrokerageRecordStatusEnum.SETTLEMENT.getStatus()) - .setUnfreezeTime(LocalDateTime.now()); - int updateRows = brokerageRecordMapper.updateByIdAndStatus(record.getId(), record.getStatus(), updateObj); - if (updateRows == 0) { - log.error("[unfreezeRecord][record({}) 更新为已结算失败]", record.getId()); - return false; - } - - // 更新用户冻结佣金 - brokerageUserService.updateFrozenPriceDecrAndPriceIncr(record.getUserId(), -record.getPrice()); - log.info("[unfreezeRecord][record({}) 更新为已结算成功]", record.getId()); - return true; - } - - /** - * 获得自身的代理对象,解决 AOP 生效问题 - * - * @return 自己 - */ - private BrokerageRecordServiceImpl getSelf() { - return SpringUtil.getBean(getClass()); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserService.java deleted file mode 100644 index 9b678851..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserService.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.win.module.trade.service.brokerage.user; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; - -import java.util.Collection; -import java.util.List; - -/** - * 分销用户 Service 接口 - * - * @author owen - */ -public interface BrokerageUserService { - - /** - * 获得分销用户 - * - * @param id 编号 - * @return 分销用户 - */ - BrokerageUserDO getBrokerageUser(Long id); - - /** - * 获得分销用户列表 - * - * @param ids 编号 - * @return 分销用户列表 - */ - List getBrokerageUserList(Collection ids); - - /** - * 获得分销用户分页 - * - * @param pageReqVO 分页查询 - * @return 分销用户分页 - */ - PageResult getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO); - - /** - * 修改推广员编号 - * - * @param id 用户编号 - * @param bindUserId 推广员编号 - */ - void updateBrokerageUserId(Long id, Long bindUserId); - - /** - * 修改推广资格 - * - * @param id 用户编号 - * @param enabled 推广资格 - */ - void updateBrokerageUserEnabled(Long id, Boolean enabled); - - /** - * 获得用户的推广人 - * - * @param id 用户编号 - * @return 用户的推广人 - */ - BrokerageUserDO getBindBrokerageUser(Long id); - - /** - * 更新用户佣金 - * - * @param id 用户编号 - * @param price 用户可用佣金 - */ - void updateUserPrice(Long id, Integer price); - - /** - * 更新用户冻结佣金 - * - * @param id 用户编号 - * @param frozenPrice 用户冻结佣金 - */ - void updateUserFrozenPrice(Long id, Integer frozenPrice); - - /** - * 更新用户冻结佣金(减少),更新用户佣金(增加) - * - * @param id 用户编号 - * @param frozenPrice 减少冻结佣金(负数) - */ - void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice); - - // TODO @疯狂:这个后面可能要支持下,二级 - /** - * 获得推广用户数量(一级) - * - * @param bindUserId 绑定的推广员编号 - * @return 推广用户数量 - */ - Long getBrokerageUserCountByBindUserId(Long bindUserId); - - /** - * 【会员】绑定推广员 - * - * @param userId 用户编号 - * @param bindUserId 推广员编号 - * @param isNewUser 是否为新用户 - * @return 是否绑定 - */ - boolean bindBrokerageUser(Long userId, Long bindUserId, Boolean isNewUser); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImpl.java deleted file mode 100644 index c62f0ef9..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImpl.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.win.module.trade.service.brokerage.user; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.BooleanUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; -import com.win.module.trade.dal.mysql.brokerage.user.BrokerageUserMapper; -import com.win.module.trade.enums.brokerage.BrokerageBindModeEnum; -import com.win.module.trade.enums.brokerage.BrokerageEnabledConditionEnum; -import com.win.module.trade.service.config.TradeConfigService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.*; - -/** - * 分销用户 Service 实现类 - * - * @author owen - */ -@Service -@Validated -public class BrokerageUserServiceImpl implements BrokerageUserService { - - @Resource - private BrokerageUserMapper brokerageUserMapper; - - @Resource - private TradeConfigService tradeConfigService; - - @Override - public BrokerageUserDO getBrokerageUser(Long id) { - return brokerageUserMapper.selectById(id); - } - - @Override - public List getBrokerageUserList(Collection ids) { - return brokerageUserMapper.selectBatchIds(ids); - } - - @Override - public PageResult getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) { - return brokerageUserMapper.selectPage(pageReqVO); - } - - @Override - public void updateBrokerageUserId(Long id, Long bindUserId) { - // 校验存在 - validateBrokerageUserExists(id); - - // 情况一:清除推广员 - if (bindUserId == null) { - // 清除推广员 - brokerageUserMapper.updateBindUserIdAndBindUserTimeToNull(id); - return; - } - - // 情况二:修改推广员 - // TODO @疯狂:要复用一些 validateCanBindUser 的校验哈; - brokerageUserMapper.updateById(new BrokerageUserDO().setId(id) - .setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())); - } - - @Override - public void updateBrokerageUserEnabled(Long id, Boolean enabled) { - // 校验存在 - validateBrokerageUserExists(id); - if (BooleanUtil.isTrue(enabled)) { - // 开通推广资格 - brokerageUserMapper.updateById(new BrokerageUserDO().setId(id) - .setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now())); - } else { - // 取消推广资格 - brokerageUserMapper.updateEnabledFalseAndBrokerageTimeToNull(id); - } - } - - private void validateBrokerageUserExists(Long id) { - if (brokerageUserMapper.selectById(id) == null) { - throw exception(BROKERAGE_USER_NOT_EXISTS); - } - } - - @Override - public BrokerageUserDO getBindBrokerageUser(Long id) { - return Optional.ofNullable(id) - .map(this::getBrokerageUser) - .map(BrokerageUserDO::getBindUserId) - .map(this::getBrokerageUser) - .orElse(null); - } - - @Override - public void updateUserPrice(Long id, Integer price) { - if (price > 0) { - brokerageUserMapper.updatePriceIncr(id, price); - } else if (price < 0) { - brokerageUserMapper.updatePriceDecr(id, price); - } - } - - @Override - public void updateUserFrozenPrice(Long id, Integer frozenPrice) { - if (frozenPrice > 0) { - brokerageUserMapper.updateFrozenPriceIncr(id, frozenPrice); - } else if (frozenPrice < 0) { - brokerageUserMapper.updateFrozenPriceDecr(id, frozenPrice); - } - } - - @Override - public void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice) { - Assert.isTrue(frozenPrice < 0); - int updateRows = brokerageUserMapper.updateFrozenPriceDecrAndPriceIncr(id, frozenPrice); - if (updateRows == 0) { - throw exception(BROKERAGE_USER_FROZEN_PRICE_NOT_ENOUGH); - } - } - - @Override - public Long getBrokerageUserCountByBindUserId(Long bindUserId) { - // TODO @疯狂:mapper 封装下哈;不直接在 service 调用这种基础 mapper 的基础方法 - return brokerageUserMapper.selectCount(BrokerageUserDO::getBindUserId, bindUserId); - } - - // TODO @疯狂:因为现在 user 会存在使用验证码直接注册,所以 isNewUser 不太好传递;我们是不是可以约定绑定的时间,createTime 在 30 秒内,就认为新用户; - @Override - public boolean bindBrokerageUser(Long userId, Long bindUserId, Boolean isNewUser) { - // TODO @疯狂:userId 为空,搞到参数校验里哇; - if (userId == null) { - throw exception(0); - } - - // 1. 获得分销用户 - boolean isNewBrokerageUser = false; - BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); - if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开 - isNewBrokerageUser = true; - brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setBrokeragePrice(0).setFrozenPrice(0); - } - - // 2.1 校验能否绑定 - boolean validated = validateCanBindUser(brokerageUser, bindUserId, isNewUser); - if (!validated) { - return false; - } - - // 2.2 绑定用户 - if (isNewBrokerageUser) { - Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); - if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 - // TODO @疯狂:应该设置下 brokerageTime,而不是 bindUserTime - brokerageUser.setBrokerageEnabled(true).setBindUserTime(LocalDateTime.now()); - } - // TODO @疯狂:这里是不是要设置 bindUserId、bindUserTime 字段哈; - brokerageUserMapper.insert(brokerageUser); - } else { - brokerageUserMapper.updateById(new BrokerageUserDO().setId(userId) - .setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())); - } - return true; - } - - // TODO @疯狂:validate 方法,一般不返回 true false,而是抛出异常;如果要返回 true false 这种,方法名字可以改成 isUserCanBind - private boolean validateCanBindUser(BrokerageUserDO user, Long bindUserId, Boolean isNewUser) { - // TODO @疯狂:bindUserId 为空,搞到参数校验里哇; - if (bindUserId == null) { - return false; - } - - // 校验分销功能是否启用 - TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig(); - if (tradeConfig == null || BooleanUtil.isFalse(tradeConfig.getBrokerageEnabled())) { - return false; - } - - // 校验绑定自己 - if (Objects.equals(user.getId(), bindUserId)) { - throw exception(BROKERAGE_BIND_SELF); - } - - // 校验要绑定的用户有无推广资格 - BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId); - if (bindUser == null || BooleanUtil.isFalse(bindUser.getBrokerageEnabled())) { - throw exception(BROKERAGE_BIND_USER_NOT_ENABLED); - } - - // 校验分佣模式:仅可后台手动设置推广员 - if (BrokerageEnabledConditionEnum.ADMIN.getCondition().equals(tradeConfig.getBrokerageEnabledCondition())) { - throw exception(BROKERAGE_BIND_CONDITION_ADMIN); - } - - // 校验分销关系绑定模式 - if (BrokerageBindModeEnum.REGISTER.getMode().equals(tradeConfig.getBrokerageBindMode())) { - if (!BooleanUtil.isTrue(isNewUser)) { - throw exception(BROKERAGE_BIND_MODE_REGISTER); // 只有在注册时可以绑定 - } - } else if (BrokerageBindModeEnum.ANYTIME.getMode().equals(tradeConfig.getBrokerageBindMode())) { - if (user.getBindUserId() != null) { - throw exception(BROKERAGE_BIND_OVERRIDE); // 已绑定了推广人 - } - } - - // TODO @疯狂:这块是不是一直查询到根节点,中间不允许出现自己;就是不能形成环。虽然目前是 2 级,但是未来可能会改多级; = = 环的话,就会存在问题哈 - // A->B->A:下级不能绑定自己的上级, A->B->C->A可以!! - if (Objects.equals(user.getId(), bindUser.getBindUserId())) { - throw exception(BROKERAGE_BIND_LOOP); - } - return true; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartService.java deleted file mode 100644 index 5e9f6cd0..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.win.module.trade.service.cart; - -import com.win.module.trade.controller.app.cart.vo.*; -import com.win.module.trade.dal.dataobject.cart.CartDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * 购物车 Service 接口 - * - * @author 芋道源码 - */ -public interface CartService { - - /** - * 添加商品到购物车 - * - * @param userId 用户编号 - * @param addReqVO 添加信息 - * @return 购物项的编号 - */ - Long addCart(Long userId, @Valid AppCartAddReqVO addReqVO); - - /** - * 更新购物车商品数量 - * - * @param userId 用户编号 - * @param updateCountReqVO 更新信息 - */ - void updateCartCount(Long userId, AppCartUpdateCountReqVO updateCountReqVO); - - /** - * 更新购物车选中状态 - * - * @param userId 用户编号 - * @param updateSelectedReqVO 更新信息 - */ - void updateCartSelected(Long userId, @Valid AppCartUpdateSelectedReqVO updateSelectedReqVO); - - /** - * 重置购物车商品 - * - * 使用场景:在一个购物车项对应的商品失效(例如说 SPU 被下架),可以重新选择对应的 SKU - * - * @param userId 用户编号 - * @param updateReqVO 重置信息 - */ - void resetCart(Long userId, AppCartResetReqVO updateReqVO); - - /** - * 删除购物车商品 - * - * @param userId 用户编号 - * @param ids 购物项的编号 - */ - void deleteCart(Long userId, Collection ids); - - /** - * 查询用户在购物车中的商品数量 - * - * @param userId 用户编号 - * @return 商品数量 - */ - Integer getCartCount(Long userId); - - /** - * 查询用户的购物车列表 - * - * @param userId 用户编号 - * @return 购物车列表 - */ - AppCartListRespVO getCartList(Long userId); - - /** - * 查询用户的购物车列表 - * - * @param userId 用户编号 - * @param ids 购物项的编号 - * @return 购物车列表 - */ - List getCartList(Long userId, Set ids); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartServiceImpl.java deleted file mode 100644 index efa1283e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/cart/CartServiceImpl.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.win.module.trade.service.cart; - -import cn.hutool.core.collection.CollUtil; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.trade.controller.app.cart.vo.*; -import com.win.module.trade.convert.cart.TradeCartConvert; -import com.win.module.trade.dal.dataobject.cart.CartDO; -import com.win.module.trade.dal.mysql.cart.CartMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; -import static com.win.module.product.enums.ErrorCodeConstants.SKU_STOCK_NOT_ENOUGH; -import static com.win.module.trade.enums.ErrorCodeConstants.CARD_ITEM_NOT_FOUND; -import static java.util.Collections.emptyList; - -/** - * 购物车 Service 实现类 - * - * // TODO 芋艿:未来优化:购物车的价格计算,支持营销信息;目前不支持的原因,前端界面需要前端 pr 支持下; - * - * @author 芋道源码 - */ -@Service -@Validated -public class CartServiceImpl implements CartService { - - @Resource - private CartMapper cartMapper; - - @Resource - private ProductSpuApi productSpuApi; - @Resource - private ProductSkuApi productSkuApi; - - @Override - public Long addCart(Long userId, AppCartAddReqVO addReqVO) { - // 查询 TradeCartDO - CartDO cart = cartMapper.selectByUserIdAndSkuId(userId, addReqVO.getSkuId()); - // 校验 SKU - Integer count = addReqVO.getCount(); - ProductSkuRespDTO sku = checkProductSku(addReqVO.getSkuId(), count); - - // 情况一:存在,则进行数量更新 - if (cart != null) { - cartMapper.updateById(new CartDO().setId(cart.getId()).setSelected(true) - .setCount(cart.getCount() + count)); - return cart.getId(); - // 情况二:不存在,则进行插入 - } else { - cart = new CartDO().setUserId(userId).setSelected(true) - .setSpuId(sku.getSpuId()).setSkuId(sku.getId()).setCount(count); - cartMapper.insert(cart); - } - return cart.getId(); - } - - @Override - public void updateCartCount(Long userId, AppCartUpdateCountReqVO updateReqVO) { - // 校验 TradeCartDO 存在 - CartDO cart = cartMapper.selectById(updateReqVO.getId(), userId); - if (cart == null) { - throw exception(CARD_ITEM_NOT_FOUND); - } - // 校验商品 SKU - checkProductSku(cart.getSkuId(), updateReqVO.getCount()); - - // 更新数量 - cartMapper.updateById(new CartDO().setId(cart.getId()) - .setCount(updateReqVO.getCount())); - } - - @Override - public void updateCartSelected(Long userId, AppCartUpdateSelectedReqVO updateSelectedReqVO) { - cartMapper.updateByIds(updateSelectedReqVO.getIds(), userId, - new CartDO().setSelected(updateSelectedReqVO.getSelected())); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void resetCart(Long userId, AppCartResetReqVO resetReqVO) { - // 第一步:删除原本的购物项 - CartDO oldCart = cartMapper.selectById(resetReqVO.getId(), userId); - if (oldCart == null) { - throw exception(CARD_ITEM_NOT_FOUND); - } - cartMapper.deleteById(oldCart.getId()); - - // 第二步:添加新的购物项 - CartDO newCart = cartMapper.selectByUserIdAndSkuId(userId, resetReqVO.getSkuId()); - if (newCart != null) { - updateCartCount(userId, new AppCartUpdateCountReqVO() - .setId(newCart.getId()).setCount(resetReqVO.getCount())); - } else { - addCart(userId, new AppCartAddReqVO().setSkuId(resetReqVO.getSkuId()) - .setCount(resetReqVO.getCount())); - } - } - - /** - * 购物车删除商品 - * - * @param userId 用户编号 - * @param ids 商品 SKU 编号的数组 - */ - @Override - public void deleteCart(Long userId, Collection ids) { - // 查询 TradeCartDO 列表 - List carts = cartMapper.selectListByIds(ids, userId); - if (CollUtil.isEmpty(carts)) { - return; - } - - // 批量标记删除 - cartMapper.deleteBatchIds(ids); - } - - @Override - public Integer getCartCount(Long userId) { - // TODO 芋艿:需要算上 selected - return cartMapper.selectSumByUserId(userId); - } - - @Override - public AppCartListRespVO getCartList(Long userId) { - // 获得购物车的商品 - List carts = cartMapper.selectListByUserId(userId); - carts.sort(Comparator.comparing(CartDO::getId).reversed()); - // 如果未空,则返回空结果 - if (CollUtil.isEmpty(carts)) { - return new AppCartListRespVO().setValidList(emptyList()) - .setInvalidList(emptyList()); - } - - // 查询 SPU、SKU 列表 - List spus = productSpuApi.getSpuList(convertSet(carts, CartDO::getSpuId)); - List skus = productSkuApi.getSkuList(convertSet(carts, CartDO::getSkuId)); - - // 如果 SPU 被删除,则删除购物车对应的商品。延迟删除 - // 为什么不是 SKU 被删除呢?因为 SKU 被删除时,还可以通过 SPU 选择其它 SKU - deleteCartIfSpuDeleted(carts, spus); - - // 拼接数据 - return TradeCartConvert.INSTANCE.convertList(carts, spus, skus); - } - - @Override - public List getCartList(Long userId, Set ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return cartMapper.selectListByUserId(userId, ids); - } - - private void deleteCartIfSpuDeleted(List carts, List spus) { - // 如果 SPU 被删除,则删除购物车对应的商品。延迟删除 - carts.removeIf(cart -> { - if (spus.stream().noneMatch(spu -> spu.getId().equals(cart.getSpuId()))) { - cartMapper.deleteById(cart.getId()); - return true; - } - return false; - }); - } - - /** - * 校验商品 SKU 是否合法 - * 1. 是否存在 - * 2. 是否下架 - * 3. 库存不足 - * - * @param skuId 商品 SKU 编号 - * @param count 商品数量 - * @return 商品 SKU - */ - private ProductSkuRespDTO checkProductSku(Long skuId, Integer count) { - ProductSkuRespDTO sku = productSkuApi.getSku(skuId); - if (sku == null) { - throw exception(SKU_NOT_EXISTS); - } - if (count > sku.getStock()) { - throw exception(SKU_STOCK_NOT_ENOUGH); - } - return sku; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigService.java deleted file mode 100644 index 0cb7f391..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.trade.service.config; - -import com.win.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; - -import javax.validation.Valid; - -/** - * 交易中心配置 Service 接口 - * - * @author owen - */ -public interface TradeConfigService { - - /** - * 更新交易中心配置 - * - * @param updateReqVO 更新信息 - */ - void saveTradeConfig(@Valid TradeConfigSaveReqVO updateReqVO); - - /** - * 获得交易中心配置 - * - * @return 交易中心配置 - */ - TradeConfigDO getTradeConfig(); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigServiceImpl.java deleted file mode 100644 index e0ed35f2..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/config/TradeConfigServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.trade.service.config; - -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO; -import com.win.module.trade.convert.config.TradeConfigConvert; -import com.win.module.trade.dal.dataobject.config.TradeConfigDO; -import com.win.module.trade.dal.mysql.config.TradeConfigMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 交易中心配置 Service 实现类 - * - * @author owen - */ -@Service -@Validated -public class TradeConfigServiceImpl implements TradeConfigService { - - @Resource - private TradeConfigMapper tradeConfigMapper; - - @Override - public void saveTradeConfig(TradeConfigSaveReqVO saveReqVO) { - // 存在,则进行更新 - TradeConfigDO dbConfig = getTradeConfig(); - if (dbConfig != null) { - tradeConfigMapper.updateById(TradeConfigConvert.INSTANCE.convert(saveReqVO).setId(dbConfig.getId())); - return; - } - // 不存在,则进行插入 - tradeConfigMapper.insert(TradeConfigConvert.INSTANCE.convert(saveReqVO)); - } - - @Override - public TradeConfigDO getTradeConfig() { - List list = tradeConfigMapper.selectList(); - return CollectionUtils.getFirst(list); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressService.java deleted file mode 100644 index 447863e7..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.trade.service.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 快递公司 Service 接口 - * - * @author jason - */ -public interface DeliveryExpressService { - - /** - * 创建快递公司 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDeliveryExpress(@Valid DeliveryExpressCreateReqVO createReqVO); - - /** - * 更新快递公司 - * - * @param updateReqVO 更新信息 - */ - void updateDeliveryExpress(@Valid DeliveryExpressUpdateReqVO updateReqVO); - - /** - * 删除快递公司 - * - * @param id 编号 - */ - void deleteDeliveryExpress(Long id); - - /** - * 获得快递公司 - * - * @param id 编号 - * @return 快递公司 - */ - DeliveryExpressDO getDeliveryExpress(Long id); - - /** - * 校验快递公司是否合法 - * - * @param id 编号 - * @return 快递公司 - */ - DeliveryExpressDO validateDeliveryExpress(Long id); - - /** - * 获得快递公司分页 - * - * @param pageReqVO 分页查询 - * @return 快递公司分页 - */ - PageResult getDeliveryExpressPage(DeliveryExpressPageReqVO pageReqVO); - - /** - * 获得快递公司列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 快递公司列表 - */ - List getDeliveryExpressList(DeliveryExpressExportReqVO exportReqVO); - - /** - * 获取指定状态的快递公司列表 - * - * @param status 状态 - * @return 快递公司列表 - */ - List getDeliveryExpressListByStatus(Integer status); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressServiceImpl.java deleted file mode 100644 index c8ae9eca..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressServiceImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.win.module.trade.service.delivery; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO; -import com.win.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO; -import com.win.module.trade.convert.delivery.DeliveryExpressConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.dal.mysql.delivery.DeliveryExpressMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.*; - -/** - * 快递公司 Service 实现类 - * - * @author jason - */ -@Service -@Validated -public class DeliveryExpressServiceImpl implements DeliveryExpressService { - - @Resource - private DeliveryExpressMapper deliveryExpressMapper; - - @Override - public Long createDeliveryExpress(DeliveryExpressCreateReqVO createReqVO) { - //校验编码是否唯一 - validateExpressCodeUnique(createReqVO.getCode(), null); - // 插入 - DeliveryExpressDO deliveryExpress = DeliveryExpressConvert.INSTANCE.convert(createReqVO); - deliveryExpressMapper.insert(deliveryExpress); - // 返回 - return deliveryExpress.getId(); - } - - @Override - public void updateDeliveryExpress(DeliveryExpressUpdateReqVO updateReqVO) { - // 校验存在 - validateDeliveryExpressExists(updateReqVO.getId()); - //校验编码是否唯一 - validateExpressCodeUnique(updateReqVO.getCode(), updateReqVO.getId()); - // 更新 - DeliveryExpressDO updateObj = DeliveryExpressConvert.INSTANCE.convert(updateReqVO); - deliveryExpressMapper.updateById(updateObj); - } - - @Override - public void deleteDeliveryExpress(Long id) { - // 校验存在 - validateDeliveryExpressExists(id); - // 删除 - deliveryExpressMapper.deleteById(id); - } - - private void validateExpressCodeUnique(String code, Long id) { - DeliveryExpressDO express = deliveryExpressMapper.selectByCode(code); - if (express == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的快递公司 - if (id == null) { - throw exception(EXPRESS_CODE_DUPLICATE); - } - if (!express.getId().equals(id)) { - throw exception(EXPRESS_CODE_DUPLICATE); - } - } - private void validateDeliveryExpressExists(Long id) { - if (deliveryExpressMapper.selectById(id) == null) { - throw exception(EXPRESS_NOT_EXISTS); - } - } - - @Override - public DeliveryExpressDO getDeliveryExpress(Long id) { - return deliveryExpressMapper.selectById(id); - } - - @Override - public DeliveryExpressDO validateDeliveryExpress(Long id) { - DeliveryExpressDO deliveryExpress = deliveryExpressMapper.selectById(id); - if (deliveryExpress == null) { - throw exception(EXPRESS_NOT_EXISTS); - } - if (deliveryExpress.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { - throw exception(EXPRESS_STATUS_NOT_ENABLE); - } - return deliveryExpress; - } - - @Override - public PageResult getDeliveryExpressPage(DeliveryExpressPageReqVO pageReqVO) { - return deliveryExpressMapper.selectPage(pageReqVO); - } - - @Override - public List getDeliveryExpressList(DeliveryExpressExportReqVO exportReqVO) { - return deliveryExpressMapper.selectList(exportReqVO); - } - - @Override - public List getDeliveryExpressListByStatus(Integer status) { - return deliveryExpressMapper.selectListByStatus(status); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateService.java deleted file mode 100644 index 00267a39..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateService.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.win.module.trade.service.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateDetailRespVO; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateUpdateReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO; -import com.win.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 快递运费模板 Service 接口 - * - * @author jason - */ -public interface DeliveryExpressTemplateService { - - /** - * 创建快递运费模板 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDeliveryExpressTemplate(@Valid DeliveryExpressTemplateCreateReqVO createReqVO); - - /** - * 更新快递运费模板 - * - * @param updateReqVO 更新信息 - */ - void updateDeliveryExpressTemplate(@Valid DeliveryExpressTemplateUpdateReqVO updateReqVO); - - /** - * 删除快递运费模板 - * - * @param id 编号 - */ - void deleteDeliveryExpressTemplate(Long id); - - /** - * 获得快递运费模板 - * - * @param id 编号 - * @return 快递运费模板详情 - */ - DeliveryExpressTemplateDetailRespVO getDeliveryExpressTemplate(Long id); - - /** - * 获得快递运费模板列表 - * - * @param ids 编号 - * @return 快递运费模板列表 - */ - List getDeliveryExpressTemplateList(Collection ids); - - /** - * 获得快递运费模板列表 - * - * @return 快递运费模板列表 - */ - List getDeliveryExpressTemplateList(); - - /** - * 获得快递运费模板分页 - * - * @param pageReqVO 分页查询 - * @return 快递运费模板分页 - */ - PageResult getDeliveryExpressTemplatePage(DeliveryExpressTemplatePageReqVO pageReqVO); - - /** - * 校验快递运费模板 - * - * 如果校验不通过,抛出 {@link com.win.framework.common.exception.ServiceException} 异常 - * - * @param templateId 模板编号 - * @return 快递运费模板 - */ - DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId); - - /** - * 基于运费模板编号数组和收件人地址区域编号,获取匹配运费模板 - * - * @param ids 编号列表 - * @param areaId 区域编号 - * @return Map (templateId -> 运费模板设置) - */ - Map getExpressTemplateMapByIdsAndArea(Collection ids, Integer areaId); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java deleted file mode 100644 index 1e89d10e..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java +++ /dev/null @@ -1,251 +0,0 @@ -package com.win.module.trade.service.delivery; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateDetailRespVO; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO; -import com.win.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateUpdateReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateChargeDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateFreeDO; -import com.win.module.trade.dal.mysql.delivery.DeliveryExpressTemplateChargeMapper; -import com.win.module.trade.dal.mysql.delivery.DeliveryExpressTemplateFreeMapper; -import com.win.module.trade.dal.mysql.delivery.DeliveryExpressTemplateMapper; -import com.win.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.*; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.*; -import static com.win.module.trade.convert.delivery.DeliveryExpressTemplateConvert.INSTANCE; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_TEMPLATE_NAME_DUPLICATE; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_TEMPLATE_NOT_EXISTS; - -/** - * 快递运费模板 Service 实现类 - * - * @author jason - */ -@Service -@Validated -public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTemplateService { - - @Resource - private DeliveryExpressTemplateMapper expressTemplateMapper; - @Resource - private DeliveryExpressTemplateChargeMapper expressTemplateChargeMapper; - @Resource - private DeliveryExpressTemplateFreeMapper expressTemplateFreeMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createDeliveryExpressTemplate(DeliveryExpressTemplateCreateReqVO createReqVO) { - // 校验模板名是否唯一 - validateTemplateNameUnique(createReqVO.getName(), null); - - // 插入 - DeliveryExpressTemplateDO deliveryExpressTemplate = INSTANCE.convert(createReqVO); - expressTemplateMapper.insert(deliveryExpressTemplate); - // 插入运费模板计费表 - if (CollUtil.isNotEmpty(createReqVO.getTemplateCharge())) { - expressTemplateChargeMapper.insertBatch( - INSTANCE.convertTemplateChargeList(deliveryExpressTemplate.getId(), createReqVO.getChargeMode(), createReqVO.getTemplateCharge()) - ); - } - // 插入运费模板包邮表 - if (CollUtil.isNotEmpty(createReqVO.getTemplateFree())) { - expressTemplateFreeMapper.insertBatch( - INSTANCE.convertTemplateFreeList(deliveryExpressTemplate.getId(), createReqVO.getTemplateFree()) - ); - } - return deliveryExpressTemplate.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateDeliveryExpressTemplate(DeliveryExpressTemplateUpdateReqVO updateReqVO) { - // 校验存在 - validateDeliveryExpressTemplateExists(updateReqVO.getId()); - // 校验模板名是否唯一 - validateTemplateNameUnique(updateReqVO.getName(), updateReqVO.getId()); - - // 更新运费从表 - updateExpressTemplateCharge(updateReqVO); - // 更新包邮从表 - updateExpressTemplateFree(updateReqVO); - // 更新模板主表 - DeliveryExpressTemplateDO updateObj = INSTANCE.convert(updateReqVO); - expressTemplateMapper.updateById(updateObj); - } - - private void updateExpressTemplateFree(DeliveryExpressTemplateUpdateReqVO updateReqVO) { - // 1.1 获得新增/修改的区域列表 - List oldFreeList = expressTemplateFreeMapper.selectListByTemplateId(updateReqVO.getId()); - List newFreeList = updateReqVO.getTemplateFree(); - List addFreeList = new ArrayList<>(newFreeList.size()); // 新增包邮区域列表 - List updateFreeList = new ArrayList<>(newFreeList.size()); // 更新包邮区域列表 - for (DeliveryExpressTemplateUpdateReqVO.ExpressTemplateFreeUpdateVO item : newFreeList) { - if (Objects.nonNull(item.getId())) { - updateFreeList.add(INSTANCE.convertTemplateFree(item)); - } else { - item.setTemplateId(updateReqVO.getId()); - addFreeList.add(INSTANCE.convertTemplateFree(item)); - } - } - // 1.2 新增 - if (CollUtil.isNotEmpty(addFreeList)) { - expressTemplateFreeMapper.insertBatch(addFreeList); - } - // 1.3 修改 - if (CollUtil.isNotEmpty(updateFreeList)) { - expressTemplateFreeMapper.updateBatch(updateFreeList); - } - - // 2. 删除 - Set deleteFreeIds = convertSet(oldFreeList, DeliveryExpressTemplateFreeDO::getId); - deleteFreeIds.removeAll(convertSet(updateFreeList, DeliveryExpressTemplateFreeDO::getId)); - if (CollUtil.isNotEmpty(deleteFreeIds)) { - expressTemplateFreeMapper.deleteBatchIds(deleteFreeIds); - } - } - - private void updateExpressTemplateCharge(DeliveryExpressTemplateUpdateReqVO updateReqVO) { - // 1.1 获得新增/修改的区域列表 - List oldChargeList = expressTemplateChargeMapper.selectListByTemplateId(updateReqVO.getId()); - List newChargeList = updateReqVO.getTemplateCharge(); - List addList = new ArrayList<>(newChargeList.size()); // 新增运费区域列表 - List updateList = new ArrayList<>(newChargeList.size()); // 更新运费区域列表 - for (DeliveryExpressTemplateUpdateReqVO.ExpressTemplateChargeUpdateVO item : newChargeList) { - if (item.getId() != null) { - // 计费模式以主表为准 - item.setChargeMode(updateReqVO.getChargeMode()); - updateList.add(INSTANCE.convertTemplateCharge(item)); - } else { - item.setTemplateId(updateReqVO.getId()); - item.setChargeMode(updateReqVO.getChargeMode()); - addList.add(INSTANCE.convertTemplateCharge(item)); - } - } - // 1.2 新增 - if (CollUtil.isNotEmpty(addList)) { - expressTemplateChargeMapper.insertBatch(addList); - } - // 1.3 修改 - if (CollUtil.isNotEmpty(updateList)) { - expressTemplateChargeMapper.updateBatch(updateList); - } - - // 2. 删除 - Set deleteChargeIds = convertSet(oldChargeList, DeliveryExpressTemplateChargeDO::getId); - deleteChargeIds.removeAll(convertSet(updateList, DeliveryExpressTemplateChargeDO::getId)); - if (CollUtil.isNotEmpty(deleteChargeIds)) { - expressTemplateChargeMapper.deleteBatchIds(deleteChargeIds); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteDeliveryExpressTemplate(Long id) { - // 校验存在 - validateDeliveryExpressTemplateExists(id); - - // 删除主表 - expressTemplateMapper.deleteById(id); - // 删除运费从表 - expressTemplateChargeMapper.deleteByTemplateId(id); - // 删除包邮从表 - expressTemplateFreeMapper.deleteByTemplateId(id); - } - - /** - * 校验运费模板名是否唯一 - * - * @param name 模板名称 - * @param id 运费模板编号,可以为 null - */ - private void validateTemplateNameUnique(String name, Long id) { - DeliveryExpressTemplateDO template = expressTemplateMapper.selectByName(name); - if (template == null) { - return; - } - // 如果 id 为空 - if (id == null) { - throw exception(EXPRESS_TEMPLATE_NAME_DUPLICATE); - } - if (!template.getId().equals(id)) { - throw exception(EXPRESS_TEMPLATE_NAME_DUPLICATE); - } - } - - private void validateDeliveryExpressTemplateExists(Long id) { - if (expressTemplateMapper.selectById(id) == null) { - throw exception(EXPRESS_TEMPLATE_NOT_EXISTS); - } - } - - @Override - public DeliveryExpressTemplateDetailRespVO getDeliveryExpressTemplate(Long id) { - List chargeList = expressTemplateChargeMapper.selectListByTemplateId(id); - List freeList = expressTemplateFreeMapper.selectListByTemplateId(id); - DeliveryExpressTemplateDO template = expressTemplateMapper.selectById(id); - return INSTANCE.convert(template, chargeList, freeList); - } - - @Override - public List getDeliveryExpressTemplateList(Collection ids) { - return expressTemplateMapper.selectBatchIds(ids); - } - - @Override - public List getDeliveryExpressTemplateList() { - return expressTemplateMapper.selectList(); - } - - @Override - public PageResult getDeliveryExpressTemplatePage(DeliveryExpressTemplatePageReqVO pageReqVO) { - return expressTemplateMapper.selectPage(pageReqVO); - } - - @Override - public DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId) { - DeliveryExpressTemplateDO template = expressTemplateMapper.selectById(templateId); - if (template == null) { - throw exception(EXPRESS_TEMPLATE_NOT_EXISTS); - } - return template; - } - - @Override - public Map getExpressTemplateMapByIdsAndArea(Collection ids, Integer areaId) { - Assert.notNull(areaId, "区域编号 {} 不能为空", areaId); - // 查询 template 数组 - if (CollUtil.isEmpty(ids)) { - return Collections.emptyMap(); - } - List templateList = expressTemplateMapper.selectBatchIds(ids); - // 查询 templateCharge 数组 - List chargeList = expressTemplateChargeMapper.selectByTemplateIds(ids); - // 查询 templateFree 数组 - List freeList = expressTemplateFreeMapper.selectListByTemplateIds(ids); - - // 组合运费模板配置 RespBO - return INSTANCE.convertMap(areaId, templateList, chargeList, freeList); - } - - private DeliveryExpressTemplateRespBO.Charge findMatchExpressTemplateCharge( - List templateChargeList, Integer areaId) { - return INSTANCE.convertTemplateCharge(findFirst(templateChargeList, item -> item.getAreaIds().contains(areaId))); - } - - private DeliveryExpressTemplateRespBO.Free findMatchExpressTemplateFree( - List templateFreeList, Integer areaId) { - return INSTANCE.convertTemplateFree(findFirst(templateFreeList, item -> item.getAreaIds().contains(areaId))); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreService.java deleted file mode 100644 index ebe5d861..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreService.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.win.module.trade.service.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStorePageReqVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreUpdateReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 自提门店 Service 接口 - * - * @author jason - */ -public interface DeliveryPickUpStoreService { - - /** - * 创建自提门店 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDeliveryPickUpStore(@Valid DeliveryPickUpStoreCreateReqVO createReqVO); - - /** - * 更新自提门店 - * - * @param updateReqVO 更新信息 - */ - void updateDeliveryPickUpStore(@Valid DeliveryPickUpStoreUpdateReqVO updateReqVO); - - /** - * 删除自提门店 - * - * @param id 编号 - */ - void deleteDeliveryPickUpStore(Long id); - - /** - * 获得自提门店 - * - * @param id 编号 - * @return 自提门店 - */ - DeliveryPickUpStoreDO getDeliveryPickUpStore(Long id); - - /** - * 获得自提门店列表 - * - * @param ids 编号 - * @return 自提门店列表 - */ - List getDeliveryPickUpStoreList(Collection ids); - - /** - * 获得自提门店分页 - * - * @param pageReqVO 分页查询 - * @return 自提门店分页 - */ - PageResult getDeliveryPickUpStorePage(DeliveryPickUpStorePageReqVO pageReqVO); - - /** - * 获得指定状态的自提门店列表 - * - * @param status 状态 - * @return 自提门店列表 - */ - List getDeliveryPickUpStoreListByStatus(Integer status); -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreServiceImpl.java deleted file mode 100644 index 175649cb..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/DeliveryPickUpStoreServiceImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.win.module.trade.service.delivery; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreCreateReqVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStorePageReqVO; -import com.win.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreUpdateReqVO; -import com.win.module.trade.convert.delivery.DeliveryPickUpStoreConvert; -import com.win.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; -import com.win.module.trade.dal.mysql.delivery.DeliveryPickUpStoreMapper; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.trade.enums.ErrorCodeConstants.PICK_UP_STORE_NOT_EXISTS; - -/** - * 自提门店 Service 实现类 - * - * @author jason - */ -@Service -@Validated -public class DeliveryPickUpStoreServiceImpl implements DeliveryPickUpStoreService { - - @Resource - private DeliveryPickUpStoreMapper deliveryPickUpStoreMapper; - - @Override - public Long createDeliveryPickUpStore(DeliveryPickUpStoreCreateReqVO createReqVO) { - // 插入 - DeliveryPickUpStoreDO deliveryPickUpStore = DeliveryPickUpStoreConvert.INSTANCE.convert(createReqVO); - deliveryPickUpStoreMapper.insert(deliveryPickUpStore); - // 返回 - return deliveryPickUpStore.getId(); - } - - @Override - public void updateDeliveryPickUpStore(DeliveryPickUpStoreUpdateReqVO updateReqVO) { - // 校验存在 - validateDeliveryPickUpStoreExists(updateReqVO.getId()); - // 更新 - DeliveryPickUpStoreDO updateObj = DeliveryPickUpStoreConvert.INSTANCE.convert(updateReqVO); - deliveryPickUpStoreMapper.updateById(updateObj); - } - - @Override - public void deleteDeliveryPickUpStore(Long id) { - // 校验存在 - validateDeliveryPickUpStoreExists(id); - // 删除 - deliveryPickUpStoreMapper.deleteById(id); - } - - private void validateDeliveryPickUpStoreExists(Long id) { - if (deliveryPickUpStoreMapper.selectById(id) == null) { - throw exception(PICK_UP_STORE_NOT_EXISTS); - } - } - - @Override - public DeliveryPickUpStoreDO getDeliveryPickUpStore(Long id) { - return deliveryPickUpStoreMapper.selectById(id); - } - - @Override - public List getDeliveryPickUpStoreList(Collection ids) { - return deliveryPickUpStoreMapper.selectBatchIds(ids); - } - - @Override - public PageResult getDeliveryPickUpStorePage(DeliveryPickUpStorePageReqVO pageReqVO) { - return deliveryPickUpStoreMapper.selectPage(pageReqVO); - } - - @Override - public List getDeliveryPickUpStoreListByStatus(Integer status) { - return deliveryPickUpStoreMapper.selectListByStatus(status); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/bo/DeliveryExpressTemplateRespBO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/bo/DeliveryExpressTemplateRespBO.java deleted file mode 100644 index 6bae8437..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/delivery/bo/DeliveryExpressTemplateRespBO.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.win.module.trade.service.delivery.bo; - -import com.win.module.trade.enums.delivery.DeliveryExpressChargeModeEnum; -import lombok.Data; - -/** - * 运费模板配置 Resp BO - * - * @author jason - */ -@Data -public class DeliveryExpressTemplateRespBO { - - /** - * 配送计费方式 - * - * 枚举 {@link DeliveryExpressChargeModeEnum} - */ - private Integer chargeMode; - - /** - * 运费模板快递运费设置 - */ - private Charge charge; - - /** - * 运费模板包邮设置 - */ - private Free free; - - /** - * 快递运费模板费用配置 BO - * - * @author jason - */ - @Data - public static class Charge { - - /** - * 首件数量(件数,重量,或体积) - */ - private Double startCount; - /** - * 起步价,单位:分 - */ - private Integer startPrice; - /** - * 续件数量(件, 重量,或体积) - */ - private Double extraCount; - /** - * 额外价,单位:分 - */ - private Integer extraPrice; - } - - /** - * 快递运费模板包邮配置 BO - * - * @author jason - */ - @Data - public static class Free { - - /** - * 包邮金额,单位:分 - * - * 订单总金额 > 包邮金额时,才免运费 - */ - private Integer freePrice; - - /** - * 包邮件数 - * - * 订单总件数 > 包邮件数时,才免运费 - */ - private Integer freeCount; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageService.java deleted file mode 100644 index 52f80334..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.trade.service.message; - -import com.win.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO; - -/** - * Trade 消息 service 接口 - * - * @author HUIHUI - */ -public interface TradeMessageService { - - /** - * 订单发货时发送通知 - * - * @param reqBO 发送消息 - */ - void sendMessageWhenDeliveryOrder(TradeOrderMessageWhenDeliveryOrderReqBO reqBO); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageServiceImpl.java deleted file mode 100644 index 4a284c34..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/TradeMessageServiceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.trade.service.message; - -import com.win.module.system.api.notify.NotifyMessageSendApi; -import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; -import com.win.module.trade.enums.MessageTemplateConstants; -import com.win.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -/** - * Trade 消息 service 实现类 - * - * @author HUIHUI - */ -@Service -@Validated -public class TradeMessageServiceImpl implements TradeMessageService { - - @Resource - private NotifyMessageSendApi notifyMessageSendApi; - - @Override - public void sendMessageWhenDeliveryOrder(TradeOrderMessageWhenDeliveryOrderReqBO reqBO) { - // 1、构造消息 - Map msgMap = new HashMap<>(2); - msgMap.put("orderId", reqBO.getOrderId()); - msgMap.put("deliveryMessage", reqBO.getMessage()); - // TODO 芋艿:看下模版 - // 2、发送站内信 - notifyMessageSendApi.sendSingleMessageToMember( - new NotifySendSingleToUserReqDTO() - .setUserId(reqBO.getUserId()) - .setTemplateCode(MessageTemplateConstants.ORDER_DELIVERY) - .setTemplateParams(msgMap)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/bo/TradeOrderMessageWhenDeliveryOrderReqBO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/bo/TradeOrderMessageWhenDeliveryOrderReqBO.java deleted file mode 100644 index b80020ca..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/message/bo/TradeOrderMessageWhenDeliveryOrderReqBO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.trade.service.message.bo; - -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 订单发货时通知创建 Req BO - * - * @author HUIHUI - */ -@Data -public class TradeOrderMessageWhenDeliveryOrderReqBO { - - /** - * 订单编号 - */ - @NotNull(message = "订单编号不能为空") - private Long orderId; - /** - * 用户编号 - */ - @NotNull(message = "用户编号不能为空") - private Long userId; - /** - * 消息 - */ - @NotEmpty(message = "发送消息不能为空") - private String message; - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryService.java deleted file mode 100644 index e7fe0548..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryService.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.win.module.trade.service.order; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; - -import java.util.Collection; -import java.util.List; - -import static java.util.Collections.singleton; - -/** - * 交易订单【读】 Service 接口 - * - * @author 芋道源码 - */ -public interface TradeOrderQueryService { - - // =================== Order =================== - - /** - * 获得指定编号的交易订单 - * - * @param id 交易订单编号 - * @return 交易订单 - */ - TradeOrderDO getOrder(Long id); - - /** - * 获得指定用户,指定的交易订单 - * - * @param userId 用户编号 - * @param id 交易订单编号 - * @return 交易订单 - */ - TradeOrderDO getOrder(Long userId, Long id); - - /** - * 【管理员】获得交易订单分页 - * - * @param reqVO 分页请求 - * @return 交易订单 - */ - PageResult getOrderPage(TradeOrderPageReqVO reqVO); - - /** - * 【会员】获得交易订单分页 - * - * @param userId 用户编号 - * @param reqVO 分页请求 - * @return 交易订单 - */ - PageResult getOrderPage(Long userId, AppTradeOrderPageReqVO reqVO); - - /** - * 【会员】获得交易订单数量 - * - * @param userId 用户编号 - * @param status 订单状态。如果为空,则不进行筛选 - * @param commonStatus 评价状态。如果为空,则不进行筛选 - * @return 订单数量 - */ - Long getOrderCount(Long userId, Integer status, Boolean commonStatus); - - /** - * 【前台】获得订单的物流轨迹 - * - * @param id 订单编号 - * @param userId 用户编号 - * @return 物流轨迹数组 - */ - List getExpressTrackList(Long id, Long userId); - - /** - * 【后台】获得订单的物流轨迹 - * - * @param id 订单编号 - * @return 物流轨迹数组 - */ - List getExpressTrackList(Long id); - - // =================== Order Item =================== - - /** - * 获得指定用户,指定的交易订单项 - * - * @param userId 用户编号 - * @param itemId 交易订单项编号 - * @return 交易订单项 - */ - TradeOrderItemDO getOrderItem(Long userId, Long itemId); - - /** - * 根据交易订单项编号数组,查询交易订单项 - * - * @param ids 交易订单项编号数组 - * @return 交易订单项数组 - */ - List getOrderItemList(Collection ids); - - /** - * 根据交易订单编号,查询交易订单项 - * - * @param orderId 交易订单编号 - * @return 交易订单项数组 - */ - default List getOrderItemListByOrderId(Long orderId) { - return getOrderItemListByOrderId(singleton(orderId)); - } - - /** - * 根据交易订单编号数组,查询交易订单项 - * - * @param orderIds 交易订单编号数组 - * @return 交易订单项数组 - */ - List getOrderItemListByOrderId(Collection orderIds); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryServiceImpl.java deleted file mode 100644 index 6635f64c..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderQueryServiceImpl.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.win.module.trade.service.order; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; -import com.win.module.trade.dal.dataobject.delivery.DeliveryExpressDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.dal.mysql.order.TradeOrderItemMapper; -import com.win.module.trade.dal.mysql.order.TradeOrderMapper; -import com.win.module.trade.framework.delivery.core.client.ExpressClientFactory; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.service.delivery.DeliveryExpressService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.*; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.module.trade.enums.ErrorCodeConstants.EXPRESS_NOT_EXISTS; -import static com.win.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND; - -/** - * 交易订单【读】 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { - - @Resource - private ExpressClientFactory expressClientFactory; - - @Resource - private TradeOrderMapper tradeOrderMapper; - @Resource - private TradeOrderItemMapper tradeOrderItemMapper; - - @Resource - private DeliveryExpressService deliveryExpressService; - - @Resource - private MemberUserApi memberUserApi; - - // =================== Order =================== - - @Override - public TradeOrderDO getOrder(Long id) { - return tradeOrderMapper.selectById(id); - } - - @Override - public TradeOrderDO getOrder(Long userId, Long id) { - TradeOrderDO order = tradeOrderMapper.selectById(id); - if (order != null - && ObjectUtil.notEqual(order.getUserId(), userId)) { - return null; - } - return order; - } - - @Override - public PageResult getOrderPage(TradeOrderPageReqVO reqVO) { - // 获得 userId 相关的查询 - Set userIds = new HashSet<>(); - if (StrUtil.isNotEmpty(reqVO.getUserMobile())) { - MemberUserRespDTO user = memberUserApi.getUserByMobile(reqVO.getUserMobile()); - if (user == null) { // 没查询到用户,说明肯定也没他的订单 - return new PageResult<>(); - } - userIds.add(user.getId()); - } - if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - List users = memberUserApi.getUserListByNickname(reqVO.getUserNickname()); - if (CollUtil.isEmpty(users)) { // 没查询到用户,说明肯定也没他的订单 - return new PageResult<>(); - } - userIds.addAll(convertSet(users, MemberUserRespDTO::getId)); - } - // 分页查询 - return tradeOrderMapper.selectPage(reqVO, userIds); - } - - @Override - public PageResult getOrderPage(Long userId, AppTradeOrderPageReqVO reqVO) { - return tradeOrderMapper.selectPage(reqVO, userId); - } - - @Override - public Long getOrderCount(Long userId, Integer status, Boolean commentStatus) { - return tradeOrderMapper.selectCountByUserIdAndStatus(userId, status, commentStatus); - } - - @Override - public List getExpressTrackList(Long id, Long userId) { - // 查询订单 - TradeOrderDO order = tradeOrderMapper.selectByIdAndUserId(id, userId); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - - return getExpressTrackList(order); - } - - @Override - public List getExpressTrackList(Long id) { - // 查询订单 - TradeOrderDO order = tradeOrderMapper.selectById(id); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - - return getExpressTrackList(order); - } - - /** - * 获得订单的物流轨迹 - * - * @param order 订单 - * @return 物流轨迹 - */ - private List getExpressTrackList(TradeOrderDO order) { - // 查询物流公司 - if (order.getLogisticsId() == null) { - return Collections.emptyList(); - } - DeliveryExpressDO express = deliveryExpressService.getDeliveryExpress(order.getLogisticsId()); - if (express == null) { - throw exception(EXPRESS_NOT_EXISTS); - } - - // 查询物流轨迹 - return expressClientFactory.getDefaultExpressClient().getExpressTrackList( - new ExpressTrackQueryReqDTO().setExpressCode(express.getCode()).setLogisticsNo(order.getLogisticsNo()) - .setPhone(order.getReceiverMobile())); - } - - // =================== Order Item =================== - - @Override - public TradeOrderItemDO getOrderItem(Long userId, Long itemId) { - TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(itemId); - if (orderItem != null - && ObjectUtil.notEqual(orderItem.getUserId(), userId)) { - return null; - } - return orderItem; - } - - @Override - public List getOrderItemList(Collection ids) { - return tradeOrderItemMapper.selectBatchIds(ids); - } - - @Override - public List getOrderItemListByOrderId(Collection orderIds) { - if (CollUtil.isEmpty(orderIds)) { - return Collections.emptyList(); - } - return tradeOrderItemMapper.selectListByOrderId(orderIds); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateService.java deleted file mode 100644 index 1b405fff..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateService.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.win.module.trade.service.order; - -import com.win.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; - -/** - * 交易订单【写】Service 接口 - * - * @author LeeYan9 - * @since 2022-08-26 - */ -public interface TradeOrderUpdateService { - - // =================== Order =================== - - /** - * 获得订单结算信息 - * - * @param userId 登录用户 - * @param settlementReqVO 订单结算请求 - * @return 订单结算结果 - */ - AppTradeOrderSettlementRespVO settlementOrder(Long userId, AppTradeOrderSettlementReqVO settlementReqVO); - - /** - * 【会员】创建交易订单 - * - * @param userId 登录用户 - * @param userIp 用户 IP 地址 - * @param createReqVO 创建交易订单请求模型 - * @return 交易订单的 - */ - TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO); - - /** - * 更新交易订单已支付 - * - * @param id 交易订单编号 - * @param payOrderId 支付订单编号 - */ - void updateOrderPaid(Long id, Long payOrderId); - - /** - * 【管理员】发货交易订单 - * - * @param deliveryReqVO 发货请求 - */ - void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO); - - /** - * 【会员】收货交易订单 - * - * @param userId 用户编号 - * @param id 订单编号 - */ - void receiveOrder(Long userId, Long id); - - /** - * 【管理员】交易订单备注 - * - * @param reqVO 请求 - */ - void updateOrderRemark(TradeOrderRemarkReqVO reqVO); - - /** - * 【管理员】调整价格 - * - * @param reqVO 请求 - */ - void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO); - - /** - * 【管理员】调整地址 - * - * @param reqVO 请求 - */ - void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO); - - // =================== Order Item =================== - - /** - * 更新交易订单项的售后状态 - * - * @param id 交易订单项编号 - * @param oldAfterSaleStatus 当前售后状态;如果不符,更新后会抛出异常 - * @param newAfterSaleStatus 目标售后状态 - */ - default void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus) { - updateOrderItemAfterSaleStatus(id, oldAfterSaleStatus, newAfterSaleStatus, null, null); - } - - /** - * 更新交易订单项的售后状态 - * - * @param id 交易订单项编号 - * @param oldAfterSaleStatus 当前售后状态;如果不符,更新后会抛出异常 - * @param newAfterSaleStatus 目标售后状态 - * @param afterSaleId 售后单编号;当订单项发起售后时,必须传递该字段 - * @param refundPrice 退款金额;当订单项退款成功时,必须传递该值 - */ - void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus, - Long afterSaleId, Integer refundPrice); - - /** - * 创建订单项的评论 - * - * @param userId 用户编号 - * @param createReqVO 创建请求 - * @return 得到评价 id - */ - Long createOrderItemComment(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO); - - /** - * 【会员】取消订单 - * - * @param userId 用户ID - * @param id 订单编号 - */ - void cancelOrder(Long userId, Long id); -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateServiceImpl.java deleted file mode 100644 index d39bbd76..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ /dev/null @@ -1,809 +0,0 @@ -package com.win.module.trade.service.order; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.core.KeyValue; -import com.win.framework.common.enums.TerminalEnum; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.json.JsonUtils; -import com.win.module.member.api.address.AddressApi; -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.member.api.level.MemberLevelApi; -import com.win.module.member.api.point.MemberPointApi; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.enums.MemberExperienceBizTypeEnum; -import com.win.module.member.enums.point.MemberPointBizTypeEnum; -import com.win.module.pay.api.order.PayOrderApi; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.api.order.dto.PayOrderRespDTO; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.product.api.comment.ProductCommentApi; -import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.promotion.api.bargain.BargainActivityApi; -import com.win.module.promotion.api.bargain.BargainRecordApi; -import com.win.module.promotion.api.combination.CombinationRecordApi; -import com.win.module.promotion.api.combination.dto.CombinationRecordRespDTO; -import com.win.module.promotion.api.coupon.CouponApi; -import com.win.module.promotion.api.coupon.dto.CouponUseReqDTO; -import com.win.module.promotion.api.seckill.SeckillActivityApi; -import com.win.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO; -import com.win.module.promotion.enums.combination.CombinationRecordStatusEnum; -import com.win.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; -import com.win.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; -import com.win.module.trade.convert.order.TradeOrderConvert; -import com.win.module.trade.dal.dataobject.cart.CartDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.dal.mysql.order.TradeOrderItemMapper; -import com.win.module.trade.dal.mysql.order.TradeOrderMapper; -import com.win.module.trade.dal.redis.no.TradeOrderNoRedisDAO; -import com.win.module.trade.enums.ErrorCodeConstants; -import com.win.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; -import com.win.module.trade.enums.delivery.DeliveryTypeEnum; -import com.win.module.trade.enums.order.*; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import com.win.module.trade.service.brokerage.record.BrokerageRecordService; -import com.win.module.trade.service.brokerage.bo.BrokerageAddReqBO; -import com.win.module.trade.service.cart.CartService; -import com.win.module.trade.service.delivery.DeliveryExpressService; -import com.win.module.trade.service.message.TradeMessageService; -import com.win.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO; -import com.win.module.trade.service.price.TradePriceService; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Set; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.*; -import static com.win.module.pay.enums.ErrorCodeConstants.ORDER_UPDATE_PRICE_FAIL_EQUAL; -import static com.win.module.pay.enums.ErrorCodeConstants.ORDER_UPDATE_PRICE_FAIL_PAID; -import static com.win.module.trade.enums.ErrorCodeConstants.*; - -/** - * 交易订单【写】Service 实现类 - * - * @author LeeYan9 - * @since 2022-08-26 - */ -@Service -@Slf4j -public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { - - @Resource - private TradeOrderMapper tradeOrderMapper; - @Resource - private TradeOrderItemMapper tradeOrderItemMapper; - @Resource - private TradeOrderNoRedisDAO orderNoRedisDAO; - - @Resource - private CartService cartService; - @Resource - private TradePriceService tradePriceService; - @Resource - private DeliveryExpressService deliveryExpressService; - @Resource - private TradeMessageService tradeMessageService; - - @Resource - private ProductSkuApi productSkuApi; - @Resource - private PayOrderApi payOrderApi; - @Resource - private AddressApi addressApi; - @Resource - private CouponApi couponApi; - @Resource - private CombinationRecordApi combinationRecordApi; - @Resource - private BargainRecordApi bargainRecordApi; - @Resource - private SeckillActivityApi seckillActivityApi; - @Resource - private BargainActivityApi bargainActivityApi; - @Resource - private MemberUserApi memberUserApi; - @Resource - private MemberLevelApi memberLevelApi; - @Resource - private MemberPointApi memberPointApi; - @Resource - private BrokerageRecordService brokerageRecordService; - @Resource - private ProductCommentApi productCommentApi; - - @Resource - private TradeOrderProperties tradeOrderProperties; - - // =================== Order =================== - - @Override - public AppTradeOrderSettlementRespVO settlementOrder(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) { - // 1. 获得收货地址 - AddressRespDTO address = getAddress(userId, settlementReqVO.getAddressId()); - if (address != null) { - settlementReqVO.setAddressId(address.getId()); - } - - // 2. 计算价格 - TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, settlementReqVO); - - // 3. 拼接返回 - return TradeOrderConvert.INSTANCE.convert(calculateRespBO, address); - } - - /** - * 获得用户地址 - * - * @param userId 用户编号 - * @param addressId 地址编号 - * @return 地址 - */ - private AddressRespDTO getAddress(Long userId, Long addressId) { - if (addressId != null) { - return addressApi.getAddress(addressId, userId); - } - return addressApi.getDefaultAddress(userId); - } - - /** - * 计算订单价格 - * - * @param userId 用户编号 - * @param settlementReqVO 结算信息 - * @return 订单价格 - */ - private TradePriceCalculateRespBO calculatePrice(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) { - // 1. 如果来自购物车,则获得购物车的商品 - List cartList = cartService.getCartList(userId, - convertSet(settlementReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId)); - - // 2. 计算价格 - TradePriceCalculateReqBO calculateReqBO = TradeOrderConvert.INSTANCE.convert(userId, settlementReqVO, cartList); - calculateReqBO.getItems().forEach(item -> Assert.isTrue(item.getSelected(), // 防御性编程,保证都是选中的 - "商品({}) 未设置为选中", item.getSkuId())); - return tradePriceService.calculatePrice(calculateReqBO); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) { - // 1. 价格计算 - TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO); - - // 2.1 插入 TradeOrderDO 订单 - TradeOrderDO order = createTradeOrder(userId, userIp, createReqVO, calculateRespBO); - // 2.2 插入 TradeOrderItemDO 订单项 - List orderItems = createTradeOrderItems(order, calculateRespBO); - - // 3. 订单创建完后的逻辑 - afterCreateTradeOrder(userId, createReqVO, order, orderItems, calculateRespBO); - // 3.1 拼团的特殊逻辑 - // TODO @puhui999:这个逻辑,先抽个小方法;未来要通过设计模式,把这些拼团之类的逻辑,抽象出去 - // 拼团 - if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { - createCombinationRecord(userId, createReqVO, orderItems, order); - } - // 3.2 秒杀的特殊逻辑 - if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) { - - } - // 3.3 砍价的特殊逻辑 - - // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来! - return order; - } - - private void createCombinationRecord(Long userId, AppTradeOrderCreateReqVO createReqVO, List orderItems, TradeOrderDO order) { - MemberUserRespDTO user = memberUserApi.getUser(userId); - List recordRespDTOS = combinationRecordApi.getRecordListByUserIdAndActivityId(userId, createReqVO.getCombinationActivityId()); - // TODO 拼团一次应该只能选择一种规格的商品 - TradeOrderItemDO orderItemDO = orderItems.get(0); - if (CollUtil.isNotEmpty(recordRespDTOS)) { - List skuIds = convertList(recordRespDTOS, CombinationRecordRespDTO::getSkuId, item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())); - List tradeOrderItemDOS = tradeOrderItemMapper.selectListByOrderIdAnSkuId(convertList(recordRespDTOS, - CombinationRecordRespDTO::getOrderId, item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())), skuIds); - combinationRecordApi.validateCombinationLimitCount(createReqVO.getCombinationActivityId(), - CollectionUtils.getSumValue(tradeOrderItemDOS, TradeOrderItemDO::getCount, Integer::sum), orderItemDO.getCount()); - } - - combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, orderItemDO, createReqVO, user)); - } - - // TODO @puhui999:订单超时,自动取消; - - /** - * 校验收件地址是否存在 - * - * @param userId 用户编号 - * @param addressId 收件地址编号 - * @return 收件地址 - */ - private AddressRespDTO validateAddress(Long userId, Long addressId) { - AddressRespDTO address = addressApi.getAddress(addressId, userId); - if (address == null) { - throw exception(ErrorCodeConstants.ORDER_CREATE_ADDRESS_NOT_FOUND); - } - return address; - } - - private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO, - TradePriceCalculateRespBO calculateRespBO) { - // 用户选择物流配送的时候才需要填写收货地址 - AddressRespDTO address = new AddressRespDTO(); - if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) { - // 用户收件地址的校验 - address = validateAddress(userId, createReqVO.getAddressId()); - } - TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO, address); - String no = orderNoRedisDAO.generate(TradeOrderNoRedisDAO.TRADE_ORDER_NO_PREFIX); - order.setType(validateActivity(createReqVO)); - order.setNo(no); - order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); - order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); - order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum)); - order.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源? - // 支付信息 - order.setAdjustPrice(0).setPayStatus(false); - // 物流信息 - order.setDeliveryType(createReqVO.getDeliveryType()); - // 退款信息 - order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); - tradeOrderMapper.insert(order); - // TODO @puhui999:如果是门店订单,则需要生成核销码; - return order; - } - - /** - * 校验活动,并返回订单类型 - * - * @param createReqVO 请求参数 - * @return 订单类型 - */ - private Integer validateActivity(AppTradeOrderCreateReqVO createReqVO) { - if (createReqVO.getSeckillActivityId() != null) { - return TradeOrderTypeEnum.SECKILL.getType(); - } - if (createReqVO.getCombinationActivityId() != null) { - return TradeOrderTypeEnum.COMBINATION.getType(); - } - // TODO 砍价敬请期待 - return TradeOrderTypeEnum.NORMAL.getType(); - } - - private List createTradeOrderItems(TradeOrderDO tradeOrderDO, TradePriceCalculateRespBO calculateRespBO) { - List orderItems = TradeOrderConvert.INSTANCE.convertList(tradeOrderDO, calculateRespBO); - tradeOrderItemMapper.insertBatch(orderItems); - return orderItems; - } - - /** - * 执行创建完创建完订单后的逻辑 - * - * 例如说:优惠劵的扣减、积分的扣减、支付单的创建等等 - * - * @param userId 用户编号 - * @param createReqVO 创建订单请求 - * @param tradeOrderDO 交易订单 - * @param calculateRespBO 订单价格计算结果 - */ - private void afterCreateTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO, - TradeOrderDO tradeOrderDO, List orderItems, - TradePriceCalculateRespBO calculateRespBO) { - Integer count = getSumValue(orderItems, TradeOrderItemDO::getCount, Integer::sum); - // 1)如果是秒杀商品:额外扣减秒杀的库存; - if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), tradeOrderDO.getType())) { - SeckillActivityUpdateStockReqDTO updateStockReqDTO = new SeckillActivityUpdateStockReqDTO(); - updateStockReqDTO.setActivityId(createReqVO.getSeckillActivityId()); - updateStockReqDTO.setCount(count); - updateStockReqDTO.setItems(CollectionUtils.convertList(orderItems, item -> { - SeckillActivityUpdateStockReqDTO.Item item1 = new SeckillActivityUpdateStockReqDTO.Item(); - item1.setSpuId(item.getSpuId()); - item1.setSkuId(item.getSkuId()); - item1.setCount(item.getCount()); - return item1; - })); - seckillActivityApi.updateSeckillStock(updateStockReqDTO); - } - // 2)如果是砍价活动:额外扣减砍价的库存; - bargainActivityApi.updateBargainActivityStock(createReqVO.getBargainActivityId(), count); - // 扣减积分 TODO 芋艿:待实现,需要前置; - // 这个是不是应该放到支付成功之后?如果支付后的话,可能积分可以重复使用哈。资源类,都要预扣 - - // 有使用优惠券时更新 TODO 芋艿:需要前置; - if (createReqVO.getCouponId() != null) { - couponApi.useCoupon(new CouponUseReqDTO().setId(createReqVO.getCouponId()).setUserId(userId) - .setOrderId(tradeOrderDO.getId())); - } - - // 下单时扣减商品库存 - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems)); - - // 删除购物车商品 - Set cartIds = convertSet(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId); - if (CollUtil.isNotEmpty(cartIds)) { - cartService.deleteCart(userId, cartIds); - } - - // 生成预支付 - createPayOrder(tradeOrderDO, orderItems, calculateRespBO); - - // 增加订单日志 TODO 芋艿:待实现 - } - - private void createPayOrder(TradeOrderDO order, List orderItems, TradePriceCalculateRespBO calculateRespBO) { - // 创建支付单,用于后续的支付 - PayOrderCreateReqDTO payOrderCreateReqDTO = TradeOrderConvert.INSTANCE.convert( - order, orderItems, calculateRespBO, tradeOrderProperties); - Long payOrderId = payOrderApi.createOrder(payOrderCreateReqDTO); - - // 更新到交易单上 - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId)); - order.setPayOrderId(payOrderId); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateOrderPaid(Long id, Long payOrderId) { - // 校验并获得交易订单(可支付) - KeyValue orderResult = validateOrderPayable(id, payOrderId); - TradeOrderDO order = orderResult.getKey(); - PayOrderRespDTO payOrder = orderResult.getValue(); - - // 更新 TradeOrderDO 状态为已支付,等待发货 - int updateCount = tradeOrderMapper.updateByIdAndStatus(id, order.getStatus(), - new TradeOrderDO().setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus()).setPayStatus(true) - .setPayTime(LocalDateTime.now()).setPayChannelCode(payOrder.getChannelCode())); - if (updateCount == 0) { - throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); - } - // 校验活动 - // 1、拼团活动 - if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { - // 更新拼团状态 TODO puhui999:订单支付失败或订单支付过期删除这条拼团记录 - combinationRecordApi.updateRecordStatusToInProgress(order.getUserId(), order.getId(), LocalDateTime.now()); - } - // TODO 芋艿:发送订单变化的消息 - - // TODO 芋艿:发送站内信 - - // TODO 芋艿:OrderLog - - // 增加用户积分 - getSelf().addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); - // 增加用户经验 - getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); - // 增加用户佣金 - getSelf().addBrokerageAsync(order.getUserId(), order.getId()); - } - - /** - * 校验交易订单满足被支付的条件 - * - * 1. 交易订单未支付 - * 2. 支付单已支付 - * - * @param id 交易订单编号 - * @param payOrderId 支付订单编号 - * @return 交易订单 - */ - private KeyValue validateOrderPayable(Long id, Long payOrderId) { - // 校验订单是否存在 - TradeOrderDO order = validateOrderExists(id); - // 校验订单未支付 - if (!TradeOrderStatusEnum.isUnpaid(order.getStatus()) || order.getPayStatus()) { - log.error("[validateOrderPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]", - id, JsonUtils.toJsonString(order)); - throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); - } - // 校验支付订单匹配 - if (ObjectUtil.notEqual(order.getPayOrderId(), payOrderId)) { // 支付单号 - log.error("[validateOrderPaid][order({}) 支付单不匹配({}),请进行处理!order 数据是:{}]", - id, payOrderId, JsonUtils.toJsonString(order)); - throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); - } - - // 校验支付单是否存在 - PayOrderRespDTO payOrder = payOrderApi.getOrder(payOrderId); - if (payOrder == null) { - log.error("[validateOrderPaid][order({}) payOrder({}) 不存在,请进行处理!]", id, payOrderId); - throw exception(ORDER_NOT_FOUND); - } - // 校验支付单已支付 - if (!PayOrderStatusEnum.isSuccess(payOrder.getStatus())) { - log.error("[validateOrderPaid][order({}) payOrder({}) 未支付,请进行处理!payOrder 数据是:{}]", - id, payOrderId, JsonUtils.toJsonString(payOrder)); - throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS); - } - // 校验支付金额一致 - if (ObjectUtil.notEqual(payOrder.getPrice(), order.getPayPrice())) { - log.error("[validateOrderPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]", - id, payOrderId, JsonUtils.toJsonString(order), JsonUtils.toJsonString(payOrder)); - throw exception(ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH); - } - // 校验支付订单匹配(二次) - if (ObjectUtil.notEqual(payOrder.getMerchantOrderId(), id.toString())) { - log.error("[validateOrderPaid][order({}) 支付单不匹配({}),请进行处理!payOrder 数据是:{}]", - id, payOrderId, JsonUtils.toJsonString(payOrder)); - throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); - } - return new KeyValue<>(order, payOrder); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) { - // 1.1 校验并获得交易订单(可发货) - TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId()); - // 1.2 校验 deliveryType 是否为快递,是快递才可以发货 - if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) { - throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS); - } - - // 2. 更新订单为已发货 - TradeOrderDO updateOrderObj = new TradeOrderDO(); - // 2.1 快递发货 - if (ObjectUtil.notEqual(deliveryReqVO.getLogisticsId(), TradeOrderDO.LOGISTICS_ID_NULL)) { - deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId()); - updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()); - } else { - // 2.2 无需发货 - updateOrderObj.setLogisticsId(0L).setLogisticsNo(""); - } - // 执行更新 - updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now()); - int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj); - if (updateCount == 0) { - throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED); - } - - // TODO 芋艿:发送订单变化的消息 - - // 发送站内信 - tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO().setOrderId(order.getId()) - .setUserId(order.getUserId()).setMessage(null)); - - // TODO 芋艿:OrderLog - } - - /** - * 校验交易订单满足被发货的条件 - * - * 1. 交易订单未发货 - * - * @param id 交易订单编号 - * @return 交易订单 - */ - private TradeOrderDO validateOrderDeliverable(Long id) { - TradeOrderDO order = validateOrderExists(id); - // 校验订单是否退款 - if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) { - throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE); - } - // 订单类型:拼团 - if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { - // 校验订单拼团是否成功 - if (!combinationRecordApi.isCombinationRecordSuccess(order.getUserId(), order.getId())) { - throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS); - } - } - // 订单类类型:砍价 - if (Objects.equals(TradeOrderTypeEnum.BARGAIN.getType(), order.getType())) { - // 校验订单砍价是否成功 - if (!bargainRecordApi.isBargainRecordSuccess(order.getUserId(), order.getId())) { - throw exception(ORDER_DELIVERY_FAIL_BARGAIN_RECORD_STATUS_NOT_SUCCESS); - } - } - return order; - } - - @NotNull - private TradeOrderDO validateOrderExists(Long id) { - // 校验订单是否存在 - TradeOrderDO order = tradeOrderMapper.selectById(id); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - return order; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void receiveOrder(Long userId, Long id) { - // 校验并获得交易订单(可收货) - TradeOrderDO order = validateOrderReceivable(userId, id); - - // 更新 TradeOrderDO 状态为已完成 - int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), - new TradeOrderDO().setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()).setReceiveTime(LocalDateTime.now())); - if (updateCount == 0) { - throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED); - } - // TODO 芋艿:OrderLog - - // TODO 芋艿:lili 发送订单变化的消息 - - // TODO 芋艿:lili 发送商品被购买完成的数据 - - // TODO 芋艿:销售佣金的记录; - - // TODO 芋艿:获得积分; - } - - @Override - public void updateOrderRemark(TradeOrderRemarkReqVO reqVO) { - // 校验并获得交易订单 - validateOrderExists(reqVO.getId()); - - // 更新 - TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(reqVO); - tradeOrderMapper.updateById(order); - } - - @Override - // TODO @puhui999:考虑事务性 - public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) { - // 校验交易订单 - TradeOrderDO order = validateOrderExists(reqVO.getId()); - if (order.getPayStatus()) { - throw exception(ORDER_UPDATE_PRICE_FAIL_PAID); - } - if (ObjectUtil.equal(order.getAdjustPrice(), reqVO.getAdjustPrice())) { - throw exception(ORDER_UPDATE_PRICE_FAIL_EQUAL); - } - - // TODO @puhui999:应该是按照 payPrice 分配;并且要考虑取余问题;payPrice 也要考虑,item 里的 - List itemDOs = tradeOrderItemMapper.selectListByOrderId(order.getId()); - // TradeOrderItemDO 需要做 adjustPrice 的分摊 - int price = reqVO.getAdjustPrice() / itemDOs.size(); - itemDOs.forEach(item -> { - item.setAdjustPrice(price); - }); - // 更新 TradeOrderItem - // TODO @puhui999:不要整个对象去更新哈;应该 new 一下; - tradeOrderItemMapper.updateBatch(itemDOs); - // 更新订单 - // TODO @puhui999:要考虑多次修改价格,不能单单的 payPrice + 价格; - TradeOrderDO update = TradeOrderConvert.INSTANCE.convert(reqVO); - update.setPayPrice(update.getPayPrice() + update.getAdjustPrice()); - // TODO @芋艿:改价时,赠送的积分,要不要做改动??? - tradeOrderMapper.updateById(update); - // 更新支付订单 - payOrderApi.updatePayOrderPriceById(order.getPayOrderId(), update.getPayPrice()); - } - - @Override - public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) { - // 校验交易订单 - validateOrderExists(reqVO.getId()); - // TODO 是否需要校验订单是否发货 - // TODO 发货后是否支持修改收货地址 - - // 更新 - TradeOrderDO update = TradeOrderConvert.INSTANCE.convert(reqVO); - tradeOrderMapper.updateById(update); - } - - /** - * 校验交易订单满足可售货的条件 - * - * 1. 交易订单待收货 - * - * @param userId 用户编号 - * @param id 交易订单编号 - * @return 交易订单 - */ - private TradeOrderDO validateOrderReceivable(Long userId, Long id) { - // 校验订单是否存在 - TradeOrderDO order = tradeOrderMapper.selectByIdAndUserId(id, userId); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - // 校验订单是否是待收货状态 - if (!TradeOrderStatusEnum.isDelivered(order.getStatus())) { - throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED); - } - return order; - } - - // =================== Order Item =================== - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus, - Long afterSaleId, Integer refundPrice) { - // 如果退款成功,则 refundPrice 非空 - if (Objects.equals(newAfterSaleStatus, TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()) - && refundPrice == null) { - throw new IllegalArgumentException(StrUtil.format("id({}) 退款成功,退款金额不能为空", id)); - } - // 如果退款发起,则 afterSaleId 非空 - if (Objects.equals(newAfterSaleStatus, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus()) - && afterSaleId == null) { - throw new IllegalArgumentException(StrUtil.format("id({}) 退款发起,售后单编号不能为空", id)); - } - - // 更新订单项 - int updateCount = tradeOrderItemMapper.updateAfterSaleStatus(id, oldAfterSaleStatus, newAfterSaleStatus, afterSaleId); - if (updateCount <= 0) { - throw exception(ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL); - } - - // 如果有退款金额,则需要更新订单 - if (refundPrice == null) { - return; - } - // 计算总的退款金额 - TradeOrderDO order = tradeOrderMapper.selectById(tradeOrderItemMapper.selectById(id).getOrderId()); - Integer orderRefundPrice = order.getRefundPrice() + refundPrice; - if (isAllOrderItemAfterSaleSuccess(order.getId())) { // 如果都售后成功,则需要取消订单 - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()) - .setRefundStatus(TradeOrderRefundStatusEnum.ALL.getStatus()).setRefundPrice(orderRefundPrice) - .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now())); - - // TODO 芋艿:记录订单日志 - - // TODO 芋艿:站内信? - } else { // 如果部分售后,则更新退款金额 - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()) - .setRefundStatus(TradeOrderRefundStatusEnum.PART.getStatus()).setRefundPrice(orderRefundPrice)); - } - - // 扣减用户积分 - getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); - // 扣减用户经验 - getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); - // 更新分佣记录为已失效 - getSelf().cancelBrokerageAsync(order.getUserId(), id); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createOrderItemComment(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO) { - // 先通过订单项 ID,查询订单项是否存在 - TradeOrderItemDO orderItem = tradeOrderItemMapper.selectByIdAndUserId(createReqVO.getOrderItemId(), userId); - if (orderItem == null) { - throw exception(ORDER_ITEM_NOT_FOUND); - } - // 校验订单相关状态 - TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderItem.getOrderId(), userId); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus())) { - throw exception(ORDER_COMMENT_FAIL_STATUS_NOT_COMPLETED); - } - if (ObjectUtil.notEqual(order.getCommentStatus(), Boolean.FALSE)) { - throw exception(ORDER_COMMENT_STATUS_NOT_FALSE); - } - - // 1. 创建评价 - ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItem); - Long comment = productCommentApi.createComment(productCommentCreateReqDTO); - - // 2. 更新订单项评价状态 - tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE)); - List orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId()); - if (!anyMatch(orderItems, item -> Objects.equals(item.getCommentStatus(), Boolean.FALSE))) { - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)); - // TODO 待实现:已完成评价,要不要写一条订单日志?目前 crmeb 会写,有赞可以研究下 - } - return comment; - } - - @Override - public void cancelOrder(Long userId, Long id) { - // 校验存在 - TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(id, userId); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - // 校验状态 - if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.UNPAID.getStatus())) { - throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID); - } - - // 1.更新 TradeOrderDO 状态为已取消 - int updateCount = tradeOrderMapper.updateByIdAndStatus(id, order.getStatus(), - new TradeOrderDO().setStatus(TradeOrderStatusEnum.CANCELED.getStatus()) - .setCancelTime(LocalDateTime.now()) - .setCancelType(TradeOrderCancelTypeEnum.MEMBER_CANCEL.getType())); - if (updateCount == 0) { - throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID); - } - - // 2.回滚库存 - List orderItems = tradeOrderItemMapper.selectListByOrderId(id); - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems)); - - // 3.回滚优惠券 - couponApi.returnUsedCoupon(order.getCouponId()); - - // 4.回滚积分:积分是支付成功后才增加的吧? 回复:每个项目不同,目前看下来,确认收货貌似更合适,我再看看其它项目的业务选择; - - // TODO 芋艿:OrderLog - - // TODO 芋艿:lili 发送订单变化的消息 - } - - /** - * 判断指定订单的所有订单项,是不是都售后成功 - * - * @param id 订单编号 - * @return 是否都售后成功 - */ - private boolean isAllOrderItemAfterSaleSuccess(Long id) { - List orderItems = tradeOrderItemMapper.selectListByOrderId(id); - return orderItems.stream().allMatch(orderItem -> Objects.equals(orderItem.getAfterSaleStatus(), - TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); - } - - @Async - protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { - int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); - memberLevelApi.addExperience(userId, payPrice, bizType, String.valueOf(orderId)); - } - - @Async - protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId) { - int bizType = MemberExperienceBizTypeEnum.REFUND.getType(); - memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); - } - - @Async - protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) { - int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType(); - memberPointApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); - } - - @Async - protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) { - int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType(); - memberPointApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); - } - - - @Async - protected void addBrokerageAsync(Long userId, Long orderId) { - List orderItems = tradeOrderItemMapper.selectListByOrderId(orderId); - List list = convertList(orderItems, - item -> TradeOrderConvert.INSTANCE.convert(item, productSkuApi.getSku(item.getSkuId()))); - brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, list); - } - - @Async - protected void cancelBrokerageAsync(Long userId, Long orderItemId) { - brokerageRecordService.cancelBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItemId)); - } - - /** - * 获得自身的代理对象,解决 AOP 生效问题 - * - * @return 自己 - */ - private TradeOrderUpdateServiceImpl getSelf() { - return SpringUtil.getBean(getClass()); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceService.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceService.java deleted file mode 100644 index 7542888f..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.trade.service.price; - -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; - -import javax.validation.Valid; - -/** - * 价格计算 Service 接口 - * - * @author 芋道源码 - */ -public interface TradePriceService { - - /** - * 价格计算 - * - * @param calculateReqDTO 计算信息 - * @return 计算结果 - */ - TradePriceCalculateRespBO calculatePrice(@Valid TradePriceCalculateReqBO calculateReqDTO); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceServiceImpl.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceServiceImpl.java deleted file mode 100644 index c47d1554..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/TradePriceServiceImpl.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.win.module.trade.service.price; - -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import com.win.module.trade.service.price.calculator.TradePriceCalculator; -import com.win.module.trade.service.price.calculator.TradePriceCalculatorHelper; -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 java.util.Map; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.module.product.enums.ErrorCodeConstants.*; -import static com.win.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_PAY_PRICE_ILLEGAL; - -/** - * 价格计算 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class TradePriceServiceImpl implements TradePriceService { - - @Resource - private ProductSkuApi productSkuApi; - @Resource - private ProductSpuApi productSpuApi; - - @Resource - private List priceCalculators; - - // TODO @疯狂:需要搞个 TradePriceCalculator,计算赠送积分; - @Override - public TradePriceCalculateRespBO calculatePrice(TradePriceCalculateReqBO calculateReqBO) { - // 1.1 获得商品 SKU 数组 - List skuList = checkSkuList(calculateReqBO); - // 1.2 获得商品 SPU 数组 - List spuList = checkSpuList(skuList); - - // 2.1 计算价格 - TradePriceCalculateRespBO calculateRespBO = TradePriceCalculatorHelper - .buildCalculateResp(calculateReqBO, spuList, skuList); - priceCalculators.forEach(calculator -> calculator.calculate(calculateReqBO, calculateRespBO)); - // 2.2 如果最终支付金额小于等于 0,则抛出业务异常 - if (calculateRespBO.getPrice().getPayPrice() <= 0) { - log.error("[calculatePrice][价格计算不正确,请求 calculateReqDTO({}),结果 priceCalculate({})]", - calculateReqBO, calculateRespBO); - throw exception(PRICE_CALCULATE_PAY_PRICE_ILLEGAL); - } - return calculateRespBO; - } - - private List checkSkuList(TradePriceCalculateReqBO reqBO) { - // 获得商品 SKU 数组 - Map skuIdCountMap = convertMap(reqBO.getItems(), - TradePriceCalculateReqBO.Item::getSkuId, TradePriceCalculateReqBO.Item::getCount); - List skus = productSkuApi.getSkuList(skuIdCountMap.keySet()); - - // 校验商品 SKU - skus.forEach(sku -> { - Integer count = skuIdCountMap.get(sku.getId()); - if (count == null) { - throw exception(SKU_NOT_EXISTS); - } - if (count > sku.getStock()) { - throw exception(SKU_STOCK_NOT_ENOUGH); - } - }); - return skus; - } - - private List checkSpuList(List skuList) { - // 获得商品 SPU 数组 - List spus = productSpuApi.getSpuList(convertSet(skuList, ProductSkuRespDTO::getSpuId)); - - // 校验商品 SPU - spus.forEach(spu -> { - if (spu == null) { - throw exception(SPU_NOT_EXISTS); - } - if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) { - throw exception(SPU_NOT_ENABLE); - } - }); - return spus; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateReqBO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateReqBO.java deleted file mode 100644 index 3c5b49be..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateReqBO.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.win.module.trade.service.price.bo; - -import com.win.module.trade.enums.delivery.DeliveryTypeEnum; -import com.win.module.trade.enums.order.TradeOrderTypeEnum; -import lombok.Data; - -import javax.validation.Valid; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 价格计算 Request BO - * - * @author win源码 - */ -@Data -public class TradePriceCalculateReqBO { - - /** - * 订单类型 - * - * 枚举 {@link TradeOrderTypeEnum} - */ - private Integer type; - - /** - * 用户编号 - * - * 对应 MemberUserDO 的 id 编号 - */ - private Long userId; - - /** - * 优惠劵编号 - * - * 对应 CouponDO 的 id 编号 - */ - private Long couponId; - - /** - * 收货地址编号 - * - * 对应 MemberAddressDO 的 id 编号 - */ - private Long addressId; - - /** - * 配送方式 - * - * 枚举 {@link DeliveryTypeEnum} - */ - private Integer deliveryType; - - /** - * 商品 SKU 数组 - */ - @NotNull(message = "商品数组不能为空") - private List items; - - /** - * 商品 SKU - */ - @Data - @Valid - public static class Item { - - /** - * SKU 编号 - */ - @NotNull(message = "商品 SKU 编号不能为空") - private Long skuId; - - /** - * SKU 数量 - */ - @NotNull(message = "商品 SKU 数量不能为空") - @Min(value = 0L, message = "商品 SKU 数量必须大于等于 0") - private Integer count; - - /** - * 购物车项的编号 - */ - private Long cartId; - - /** - * 是否选中 - */ - @NotNull(message = "是否选中不能为空") - private Boolean selected; - - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateRespBO.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateRespBO.java deleted file mode 100644 index 7ee216f1..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/bo/TradePriceCalculateRespBO.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.win.module.trade.service.price.bo; - -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.enums.order.TradeOrderTypeEnum; -import lombok.Data; - -import java.util.List; - -/** - * 价格计算 Response BO - * - * 整体设计,参考 taobao 的技术文档: - * 1. 订单管理 - * 2. 常用订单金额说明 - * - * @author 芋道源码 - */ -@Data -public class TradePriceCalculateRespBO { - - /** - * 订单类型 - * - * 枚举 {@link TradeOrderTypeEnum} - */ - private Integer type; - - /** - * 订单价格 - */ - private Price price; - - /** - * 订单项数组 - */ - private List items; - - /** - * 营销活动数组 - * - * 只对应 {@link Price#items} 商品匹配的活动 - */ - private List promotions; - - /** - * 优惠劵编号 - */ - private Long couponId; - - /** - * 订单价格 - */ - @Data - public static class Price { - - /** - * 商品原价(总),单位:分 - * - * 基于 {@link OrderItem#getPrice()} * {@link OrderItem#getCount()} 求和 - * - * 对应 taobao 的 trade.total_fee 字段 - */ - private Integer totalPrice; - /** - * 订单优惠(总),单位:分 - * - * 对应 taobao 的 order.discount_fee 字段 - */ - private Integer discountPrice; - /** - * 运费金额,单位:分 - */ - private Integer deliveryPrice; - /** - * 优惠劵减免金额(总),单位:分 - * - * 对应 taobao 的 trade.coupon_fee 字段 - */ - private Integer couponPrice; - /** - * 积分抵扣的金额,单位:分 - * - * 对应 taobao 的 trade.point_fee 字段 - */ - private Integer pointPrice; - /** - * 最终购买金额(总),单位:分 - * - * = {@link #totalPrice} - * - {@link #couponPrice} - * - {@link #pointPrice} - * - {@link #discountPrice} - * + {@link #deliveryPrice} - */ - private Integer payPrice; - - } - - /** - * 订单商品 SKU - */ - @Data - public static class OrderItem { - - /** - * SPU 编号 - */ - private Long spuId; - /** - * SKU 编号 - */ - private Long skuId; - /** - * 购买数量 - */ - private Integer count; - /** - * 购物车项的编号 - */ - private Long cartId; - /** - * 是否选中 - */ - private Boolean selected; - - /** - * 商品原价(单),单位:分 - * - * 对应 ProductSkuDO 的 price 字段 - * 对应 taobao 的 order.price 字段 - */ - private Integer price; - /** - * 优惠金额(总),单位:分 - * - * 对应 taobao 的 order.discount_fee 字段 - */ - private Integer discountPrice; - /** - * 运费金额(总),单位:分 - */ - private Integer deliveryPrice; - /** - * 优惠劵减免金额,单位:分 - * - * 对应 taobao 的 trade.coupon_fee 字段 - */ - private Integer couponPrice; - /** - * 积分抵扣的金额,单位:分 - * - * 对应 taobao 的 trade.point_fee 字段 - */ - private Integer pointPrice; - /** - * 应付金额(总),单位:分 - * - * = {@link #price} * {@link #count} - * - {@link #couponPrice} - * - {@link #pointPrice} - * - {@link #discountPrice} - * + {@link #deliveryPrice} - */ - private Integer payPrice; - - // ========== 商品 SPU 信息 ========== - /** - * 商品名 - */ - private String spuName; - /** - * 商品图片 - * - * 优先级:SKU.picUrl > SPU.picUrl - */ - private String picUrl; - /** - * 分类编号 - */ - private Long categoryId; - - /** - * 运费模板 Id - */ - private Long deliveryTemplateId; - - // ========== 商品 SKU 信息 ========== - /** - * 商品重量,单位:kg 千克 - */ - private Double weight; - /** - * 商品体积,单位:m^3 平米 - */ - private Double volume; - - /** - * 商品属性数组 - */ - private List properties; - - } - - /** - * 营销明细 - */ - @Data - public static class Promotion { - - /** - * 营销编号 - * - * 例如说:营销活动的编号、优惠劵的编号 - */ - private Long id; - /** - * 营销名字 - */ - private String name; - /** - * 营销类型 - * - * 枚举 {@link PromotionTypeEnum} - */ - private Integer type; - /** - * 计算时的原价(总),单位:分 - */ - private Integer totalPrice; - /** - * 计算时的优惠(总),单位:分 - */ - private Integer discountPrice; - /** - * 匹配的商品 SKU 数组 - */ - private List items; - - // ========== 匹配情况 ========== - - /** - * 是否满足优惠条件 - */ - private Boolean match; - /** - * 满足条件的提示 - * - * 如果 {@link #match} = true 满足,则提示“圣诞价:省 150.00 元” - * 如果 {@link #match} = false 不满足,则提示“购满 85 元,可减 40 元” - */ - private String description; - - } - - /** - * 营销匹配的商品 SKU - */ - @Data - public static class PromotionItem { - - /** - * 商品 SKU 编号 - */ - private Long skuId; - /** - * 计算时的原价(总),单位:分 - */ - private Integer totalPrice; - /** - * 计算时的优惠(总),单位:分 - */ - private Integer discountPrice; - - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculator.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculator.java deleted file mode 100644 index 99b4333b..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculator.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.win.module.promotion.api.coupon.CouponApi; -import com.win.module.promotion.api.coupon.dto.CouponRespDTO; -import com.win.module.promotion.api.coupon.dto.CouponValidReqDTO; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.function.Predicate; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.filterList; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_MIN_PRICE; -import static com.win.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_SPU; - -/** - * 优惠劵的 {@link TradePriceCalculator} 实现类 - * - * @author 芋道源码 - */ -@Component -@Order(TradePriceCalculator.ORDER_COUPON) -public class TradeCouponPriceCalculator implements TradePriceCalculator { - - @Resource - private CouponApi couponApi; - - @Override - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { - // 1.1 校验优惠劵 - if (param.getCouponId() == null) { - return; - } - CouponRespDTO coupon = couponApi.validateCoupon(new CouponValidReqDTO() - .setId(param.getCouponId()).setUserId(param.getUserId())); - Assert.notNull(coupon, "校验通过的优惠劵({}),不能为空", param.getCouponId()); - - // 2.1 获得匹配的商品 SKU 数组 - List orderItems = filterMatchCouponOrderItems(result, coupon); - if (CollUtil.isEmpty(orderItems)) { - throw exception(COUPON_NO_MATCH_SPU); - } - // 2.2 计算是否满足优惠劵的使用金额 - Integer totalPayPrice = TradePriceCalculatorHelper.calculateTotalPayPrice(orderItems); - if (totalPayPrice < coupon.getUsePrice()) { - throw exception(COUPON_NO_MATCH_MIN_PRICE); - } - - // 3.1 计算可以优惠的金额 - Integer couponPrice = getCouponPrice(coupon, totalPayPrice); - Assert.isTrue(couponPrice < totalPayPrice, - "优惠劵({}) 的优惠金额({}),不能大于订单总金额({})", coupon.getId(), couponPrice, totalPayPrice); - // 3.2 计算分摊的优惠金额 - List divideCouponPrices = TradePriceCalculatorHelper.dividePrice(orderItems, couponPrice); - - // 4.1 记录使用的优惠劵 - result.setCouponId(param.getCouponId()); - // 4.2 记录优惠明细 - TradePriceCalculatorHelper.addPromotion(result, orderItems, - param.getCouponId(), coupon.getName(), PromotionTypeEnum.COUPON.getType(), - StrUtil.format("优惠劵:省 {} 元", TradePriceCalculatorHelper.formatPrice(couponPrice)), - divideCouponPrices); - // 4.3 更新 SKU 优惠金额 - for (int i = 0; i < orderItems.size(); i++) { - TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i); - orderItem.setCouponPrice(divideCouponPrices.get(i)); - TradePriceCalculatorHelper.recountPayPrice(orderItem); - } - TradePriceCalculatorHelper.recountAllPrice(result); - } - - private Integer getCouponPrice(CouponRespDTO coupon, Integer totalPayPrice) { - if (PromotionDiscountTypeEnum.PRICE.getType().equals(coupon.getDiscountType())) { // 减价 - return coupon.getDiscountPrice(); - } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(coupon.getDiscountType())) { // 打折 - int couponPrice = totalPayPrice * coupon.getDiscountPercent() / 100; - return coupon.getDiscountLimitPrice() == null ? couponPrice - : Math.min(couponPrice, coupon.getDiscountLimitPrice()); // 优惠上限 - } - throw new IllegalArgumentException(String.format("优惠劵(%s) 的优惠类型不正确", coupon)); - } - - /** - * 获得优惠劵可使用的订单项(商品)列表 - * - * @param result 计算结果 - * @param coupon 优惠劵 - * @return 订单项(商品)列表 - */ - private List filterMatchCouponOrderItems(TradePriceCalculateRespBO result, - CouponRespDTO coupon) { - Predicate matchPredicate = TradePriceCalculateRespBO.OrderItem::getSelected; - if (PromotionProductScopeEnum.SPU.getScope().equals(coupon.getProductScope())) { - matchPredicate = matchPredicate // 额外加如下条件 - .and(orderItem -> coupon.getProductScopeValues().contains(orderItem.getSpuId())); - } else if (PromotionProductScopeEnum.CATEGORY.getScope().equals(coupon.getProductScope())) { - matchPredicate = matchPredicate // 额外加如下条件 - .and(orderItem -> coupon.getProductScopeValues().contains(orderItem.getCategoryId())); - } - return filterList(result.getItems(), matchPredicate); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java deleted file mode 100644 index a36c3f32..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java +++ /dev/null @@ -1,224 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import com.win.module.member.api.address.AddressApi; -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.trade.enums.delivery.DeliveryExpressChargeModeEnum; -import com.win.module.trade.enums.delivery.DeliveryTypeEnum; -import com.win.module.trade.service.delivery.DeliveryExpressTemplateService; -import com.win.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO.OrderItem; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.*; -import static com.win.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDR_IS_EMPTY; -import static com.win.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND; - -/** - * 运费的 {@link TradePriceCalculator} 实现类 - * - * @author jason - */ -@Component -@Order(TradePriceCalculator.ORDER_DELIVERY) -@Slf4j -public class TradeDeliveryPriceCalculator implements TradePriceCalculator { - - @Resource - private AddressApi addressApi; - @Resource - private DeliveryExpressTemplateService deliveryExpressTemplateService; - - @Override - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { - // TODO @芋艿:如果门店自提,需要校验是否开启; - // 1.1 判断配送方式 - if (param.getDeliveryType() == null || DeliveryTypeEnum.PICK_UP.getMode().equals(param.getDeliveryType())) { - return; - } - if (param.getAddressId() == null) { - throw exception(PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDR_IS_EMPTY); - } - // 1.2 得到收件地址区域 - AddressRespDTO address = addressApi.getAddress(param.getAddressId(), param.getUserId()); - Assert.notNull(address, "收件人({})的地址,不能为空", param.getUserId()); - - // 2. 过滤出已选中的商品SKU - List selectedItem = filterList(result.getItems(), OrderItem::getSelected); - Set deliveryTemplateIds = convertSet(selectedItem, OrderItem::getDeliveryTemplateId); - Map expressTemplateMap = - deliveryExpressTemplateService.getExpressTemplateMapByIdsAndArea(deliveryTemplateIds, address.getAreaId()); - // 3. 计算配送费用 - if (CollUtil.isEmpty(expressTemplateMap)) { - log.error("[calculate][找不到商品 templateIds {} areaId{} 对应的运费模板]", deliveryTemplateIds, address.getAreaId()); - throw exception(PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND); - } - calculateDeliveryPrice(selectedItem, expressTemplateMap, result); - } - - private void calculateDeliveryPrice(List selectedSkus, - Map expressTemplateMap, - TradePriceCalculateRespBO result) { - // 按商品运费模板来计算商品的运费:相同的运费模板可能对应多条订单商品 SKU - Map> tplIdItemMap = convertMultiMap(selectedSkus, OrderItem::getDeliveryTemplateId); - // 依次计算快递运费 - for (Map.Entry> entry : tplIdItemMap.entrySet()) { - Long templateId = entry.getKey(); - List orderItems = entry.getValue(); - DeliveryExpressTemplateRespBO templateBO = expressTemplateMap.get(templateId); - if (templateBO == null) { - log.error("[calculateDeliveryPrice][不能计算快递运费,找不到 templateId({}) 对应的运费模板配置]", templateId); - continue; - } - // 总件数, 总金额, 总重量, 总体积 - int totalCount = 0; - int totalPrice = 0; - double totalWeight = 0; - double totalVolume = 0; - for (OrderItem orderItem : orderItems) { - totalCount += orderItem.getCount(); - totalPrice += orderItem.getPayPrice(); - totalWeight += totalWeight + orderItem.getWeight() * orderItem.getCount(); - totalVolume += totalVolume + orderItem.getVolume() * orderItem.getCount(); - } - // 优先判断是否包邮. 如果包邮不计算快递运费 - if (isExpressFree(templateBO.getChargeMode(), totalCount, totalWeight, - totalVolume, totalPrice, templateBO.getFree())) { - continue; - } - // 计算快递运费 - calculateExpressFeeByChargeMode(totalCount, totalWeight, totalVolume, - templateBO.getChargeMode(), templateBO.getCharge(), orderItems); - - } - TradePriceCalculatorHelper.recountAllPrice(result); - } - - /** - * 按配送方式来计算运费 - * - * @param totalCount 总件数 - * @param totalWeight 总重量 - * @param totalVolume 总体积 - * @param chargeMode 配送计费方式 - * @param templateCharge 快递运费配置 - * @param orderItems SKU 商品项目 - */ - private void calculateExpressFeeByChargeMode(double totalCount, double totalWeight, double totalVolume, - int chargeMode, DeliveryExpressTemplateRespBO.Charge templateCharge, - List orderItems) { - if (templateCharge == null) { - log.error("[calculateExpressFeeByChargeMode][计算快递运费时,找不到 SKU({}) 对应的运费模版]", orderItems); - return; - } - DeliveryExpressChargeModeEnum chargeModeEnum = DeliveryExpressChargeModeEnum.valueOf(chargeMode); - switch (chargeModeEnum) { - case PIECE: { - calculateExpressFee(totalCount, templateCharge, orderItems); - break; - } - case WEIGHT: { - calculateExpressFee(totalWeight, templateCharge, orderItems); - break; - } - case VOLUME: { - calculateExpressFee(totalVolume, templateCharge, orderItems); - break; - } - } - } - - /** - * 计算 SKU 商品快递费用 - * - * @param total 总件数/总重量/总体积 - * @param templateCharge 快递运费配置 - * @param orderItems SKU 商品项目 - */ - private void calculateExpressFee(double total, DeliveryExpressTemplateRespBO.Charge templateCharge, List orderItems) { - int deliveryPrice; - if (total <= templateCharge.getStartCount()) { - deliveryPrice = templateCharge.getStartPrice(); - } else { - double remainWeight = total - templateCharge.getStartCount(); - // 剩余重量/ 续件 = 续件的次数. 向上取整 - int extraNum = (int) Math.ceil(remainWeight / templateCharge.getExtraCount()); - int extraPrice = templateCharge.getExtraPrice() * extraNum; - deliveryPrice = templateCharge.getStartPrice() + extraPrice; - } - // 分摊快递费用到 SKU. 退费的时候,可能按照 SKU 考虑退费金额 - divideDeliveryPrice(deliveryPrice, orderItems); - } - - /** - * 快递运费分摊到每个 SKU 商品上 - * - * @param deliveryPrice 快递运费 - * @param orderItems SKU 商品 - */ - private void divideDeliveryPrice(int deliveryPrice, List orderItems) { - // TODO @jason:分摊的话,是不是要按照比例呀?重量、价格、数量等等, - // 按比例是不是有点复杂。后面看看是否需要; - // TODO 可以看看别的项目怎么搞的哈。 - int dividePrice = deliveryPrice / orderItems.size(); - for (OrderItem item : orderItems) { - // 更新快递运费 - item.setDeliveryPrice(dividePrice); - TradePriceCalculatorHelper.recountPayPrice(item); - } - } - - /** - * 检查是否包邮 - * - * @param chargeMode 配送计费方式 - * @param totalCount 总件数 - * @param totalWeight 总重量 - * @param totalVolume 总体积 - * @param totalPrice 总金额 - * @param templateFree 包邮配置 - */ - private boolean isExpressFree(Integer chargeMode, int totalCount, double totalWeight, - double totalVolume, int totalPrice, DeliveryExpressTemplateRespBO.Free templateFree) { - if (templateFree == null) { - return false; - } - DeliveryExpressChargeModeEnum chargeModeEnum = DeliveryExpressChargeModeEnum.valueOf(chargeMode); - switch (chargeModeEnum) { - case PIECE: - // 两个条件都满足才包邮 - if (totalCount >= templateFree.getFreeCount() && totalPrice >= templateFree.getFreePrice()) { - return true; - } - break; - case WEIGHT: - // freeCount 是不是应该是 double ?? - // TODO @jason:要不配置的时候,把它的单位和商品对齐?到底是 kg、还是斤 - // TODO @芋艿 目前 包邮 件数/重量/体积 都用的是这个字段 - // TODO @jason:那要不快递模版也改成 kg?这样是不是就不用 double ? - if (totalWeight >= templateFree.getFreeCount() - && totalPrice >= templateFree.getFreePrice()) { - return true; - } - break; - case VOLUME: - if (totalVolume >= templateFree.getFreeCount() - && totalPrice >= templateFree.getFreePrice()) { - return true; - } - break; - } - return false; - } -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java deleted file mode 100644 index 69a67c87..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.win.module.promotion.api.discount.DiscountActivityApi; -import com.win.module.promotion.api.discount.dto.DiscountProductRespDTO; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; - -/** - * 限时折扣的 {@link TradePriceCalculator} 实现类 - * - * @author 芋道源码 - */ -@Component -@Order(TradePriceCalculator.ORDER_DISCOUNT_ACTIVITY) -public class TradeDiscountActivityPriceCalculator implements TradePriceCalculator { - - @Resource - private DiscountActivityApi discountActivityApi; - - @Override - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { - // 获得 SKU 对应的限时折扣活动 - List discountProducts = discountActivityApi.getMatchDiscountProductList( - convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId)); - if (CollUtil.isEmpty(discountProducts)) { - return; - } - Map discountProductMap = convertMap(discountProducts, DiscountProductRespDTO::getSkuId); - - // 处理每个 SKU 的限时折扣 - result.getItems().forEach(orderItem -> { - // 1. 获取该 SKU 的优惠信息 - DiscountProductRespDTO discountProduct = discountProductMap.get(orderItem.getSkuId()); - if (discountProduct == null) { - return; - } - // 2. 计算优惠金额 - Integer newPayPrice = calculatePayPrice(discountProduct, orderItem); - Integer newDiscountPrice = orderItem.getPayPrice() - newPayPrice; - - // 3.1 记录优惠明细 - if (orderItem.getSelected()) { - // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 - TradePriceCalculatorHelper.addPromotion(result, orderItem, - discountProduct.getActivityId(), discountProduct.getActivityName(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(), - StrUtil.format("限时折扣:省 {} 元", formatPrice(newDiscountPrice)), - newDiscountPrice); - } - // 3.2 更新 SKU 优惠金额 - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + newDiscountPrice); - TradePriceCalculatorHelper.recountPayPrice(orderItem); - }); - TradePriceCalculatorHelper.recountAllPrice(result); - } - - private Integer calculatePayPrice(DiscountProductRespDTO discountProduct, - TradePriceCalculateRespBO.OrderItem orderItem) { - Integer price = orderItem.getPayPrice(); - if (PromotionDiscountTypeEnum.PRICE.getType().equals(discountProduct.getDiscountType())) { // 减价 - price -= discountProduct.getDiscountPrice() * orderItem.getCount(); - } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(discountProduct.getDiscountType())) { // 打折 - price = price * discountProduct.getDiscountPercent() / 100; - } else { - throw new IllegalArgumentException(String.format("优惠活动的商品(%s) 的优惠类型不正确", discountProduct)); - } - return price; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculator.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculator.java deleted file mode 100644 index 03b439b8..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; - -/** - * 价格计算的计算器接口 - * - * @author 芋道源码 - */ -public interface TradePriceCalculator { - - int ORDER_DISCOUNT_ACTIVITY = 10; - int ORDER_REWARD_ACTIVITY = 20; - int ORDER_COUPON = 30; - /** - * 快递运费的计算 - * - * 放在各种营销活动、优惠劵后面 TODO - */ - int ORDER_DELIVERY = 40; - - void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result); - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculatorHelper.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculatorHelper.java deleted file mode 100644 index 7a4184a1..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradePriceCalculatorHelper.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import cn.hutool.core.lang.Assert; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.getSumValue; -import static java.util.Collections.singletonList; - -/** - * {@link TradePriceCalculator} 的工具类 - * - * 主要实现对 {@link TradePriceCalculateRespBO} 计算结果的操作 - * - * @author 芋道源码 - */ -public class TradePriceCalculatorHelper { - - public static TradePriceCalculateRespBO buildCalculateResp(TradePriceCalculateReqBO param, - List spuList, List skuList) { - // 创建 PriceCalculateRespDTO 对象 - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO(); - result.setType(param.getType()); - result.setPromotions(new ArrayList<>()); - - // 创建它的 OrderItem 属性 - result.setItems(new ArrayList<>(param.getItems().size())); - Map spuMap = convertMap(spuList, ProductSpuRespDTO::getId); - Map skuMap = convertMap(skuList, ProductSkuRespDTO::getId); - param.getItems().forEach(item -> { - ProductSkuRespDTO sku = skuMap.get(item.getSkuId()); - if (sku == null) { - return; - } - ProductSpuRespDTO spu = spuMap.get(sku.getSpuId()); - if (spu == null) { - return; - } - // 商品项 - TradePriceCalculateRespBO.OrderItem orderItem = new TradePriceCalculateRespBO.OrderItem(); - result.getItems().add(orderItem); - orderItem.setSpuId(sku.getSpuId()).setSkuId(sku.getId()) - .setCount(item.getCount()).setCartId(item.getCartId()).setSelected(item.getSelected()); - // sku 价格 - orderItem.setPrice(sku.getPrice()).setPayPrice(sku.getPrice() * item.getCount()) - .setDiscountPrice(0).setDeliveryPrice(0).setCouponPrice(0).setPointPrice(0); - // sku 信息 - orderItem.setPicUrl(sku.getPicUrl()).setProperties(sku.getProperties()) - .setWeight(sku.getWeight()).setVolume(sku.getVolume()); - // spu 信息 - orderItem.setSpuName(spu.getName()).setCategoryId(spu.getCategoryId()) - .setDeliveryTemplateId(spu.getDeliveryTemplateId()); - if (orderItem.getPicUrl() == null) { - orderItem.setPicUrl(spu.getPicUrl()); - } - }); - - // 创建它的 Price 属性 - result.setPrice(new TradePriceCalculateRespBO.Price()); - recountAllPrice(result); - return result; - } - - /** - * 基于订单项,重新计算 price 总价 - * - * @param result 计算结果 - */ - public static void recountAllPrice(TradePriceCalculateRespBO result) { - // 先重置 - TradePriceCalculateRespBO.Price price = result.getPrice(); - price.setTotalPrice(0).setDiscountPrice(0).setDeliveryPrice(0) - .setCouponPrice(0).setPointPrice(0).setPayPrice(0); - // 再合计 item - result.getItems().forEach(item -> { - if (!item.getSelected()) { - return; - } - price.setTotalPrice(price.getTotalPrice() + item.getPrice() * item.getCount()); - price.setDiscountPrice(price.getDiscountPrice() + item.getDiscountPrice()); - price.setDeliveryPrice(price.getDeliveryPrice() + item.getDeliveryPrice()); - price.setCouponPrice(price.getCouponPrice() + item.getCouponPrice()); - price.setPointPrice(price.getPointPrice() + item.getPointPrice()); - price.setPayPrice(price.getPayPrice() + item.getPayPrice()); - }); - } - - /** - * 重新计算单个订单项的支付金额 - * - * @param orderItem 订单项 - */ - public static void recountPayPrice(TradePriceCalculateRespBO.OrderItem orderItem) { - orderItem.setPayPrice(orderItem.getPrice()* orderItem.getCount() - - orderItem.getDiscountPrice() - + orderItem.getDeliveryPrice() - - orderItem.getCouponPrice() - - orderItem.getPointPrice()); - } - - /** - * 重新计算每个订单项的支付金额 - * - * 【目前主要是单测使用】 - * - * @param orderItems 订单项数组 - */ - public static void recountPayPrice(List orderItems) { - orderItems.forEach(orderItem -> { - if (orderItem.getDiscountPrice() == null) { - orderItem.setDiscountPrice(0); - } - if (orderItem.getDeliveryPrice() == null) { - orderItem.setDeliveryPrice(0); - } - if (orderItem.getCouponPrice() == null) { - orderItem.setCouponPrice(0); - } - if (orderItem.getPointPrice() == null) { - orderItem.setPointPrice(0); - } - recountPayPrice(orderItem); - }); - } - - /** - * 计算已选中的订单项,总支付金额 - * - * @param orderItems 订单项数组 - * @return 总支付金额 - */ - public static Integer calculateTotalPayPrice(List orderItems) { - return getSumValue(orderItems, - orderItem -> orderItem.getSelected() ? orderItem.getPayPrice() : 0, // 未选中的情况下,不计算支付金额 - Integer::sum); - } - - /** - * 计算已选中的订单项,总商品数 - * - * @param orderItems 订单项数组 - * @return 总商品数 - */ - public static Integer calculateTotalCount(List orderItems) { - return getSumValue(orderItems, - orderItem -> orderItem.getSelected() ? orderItem.getCount() : 0, // 未选中的情况下,不计算数量 - Integer::sum); - } - - /** - * 按照支付金额,返回每个订单项的分摊金额数组 - * - * @param orderItems 订单项数组 - * @param price 金额 - * @return 分摊金额数组,和传入的 orderItems 一一对应 - */ - public static List dividePrice(List orderItems, Integer price) { - Integer total = calculateTotalPayPrice(orderItems); - assert total != null; - // 遍历每一个,进行分摊 - List prices = new ArrayList<>(orderItems.size()); - int remainPrice = price; - for (int i = 0; i < orderItems.size(); i++) { - TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i); - // 1. 如果是未选中,则分摊为 0 - if (!orderItem.getSelected()) { - prices.add(0); - continue; - } - // 2. 如果选中,则按照百分比,进行分摊 - int partPrice; - if (i < orderItems.size() - 1) { // 减一的原因,是因为拆分时,如果按照比例,可能会出现.所以最后一个,使用反减 - partPrice = (int) (price * (1.0D * orderItem.getPayPrice() / total)); - remainPrice -= partPrice; - } else { - partPrice = remainPrice; - } - Assert.isTrue(partPrice >= 0, "分摊金额必须大于等于 0"); - prices.add(partPrice); - } - return prices; - } - - /** - * 添加【匹配】单个 OrderItem 的营销明细 - * - * @param result 价格计算结果 - * @param orderItem 单个订单商品 SKU - * @param id 营销编号 - * @param name 营销名字 - * @param description 满足条件的提示 - * @param type 营销类型 - * @param discountPrice 单个订单商品 SKU 的优惠价格(总) - */ - public static void addPromotion(TradePriceCalculateRespBO result, TradePriceCalculateRespBO.OrderItem orderItem, - Long id, String name, Integer type, String description, Integer discountPrice) { - addPromotion(result, singletonList(orderItem), id, name, type, description, singletonList(discountPrice)); - } - - /** - * 添加【匹配】多个 OrderItem 的营销明细 - * - * @param result 价格计算结果 - * @param orderItems 多个订单商品 SKU - * @param id 营销编号 - * @param name 营销名字 - * @param description 满足条件的提示 - * @param type 营销类型 - * @param discountPrices 多个订单商品 SKU 的优惠价格(总),和 orderItems 一一对应 - */ - public static void addPromotion(TradePriceCalculateRespBO result, List orderItems, - Long id, String name, Integer type, String description, List discountPrices) { - // 创建营销明细 Item - List promotionItems = new ArrayList<>(discountPrices.size()); - for (int i = 0; i < orderItems.size(); i++) { - TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i); - promotionItems.add(new TradePriceCalculateRespBO.PromotionItem().setSkuId(orderItem.getSkuId()) - .setTotalPrice(orderItem.getPayPrice()).setDiscountPrice(discountPrices.get(i))); - } - // 创建营销明细 - TradePriceCalculateRespBO.Promotion promotion = new TradePriceCalculateRespBO.Promotion() - .setId(id).setName(name).setType(type) - .setTotalPrice(calculateTotalPayPrice(orderItems)) - .setDiscountPrice(getSumValue(discountPrices, value -> value, Integer::sum)) - .setItems(promotionItems).setMatch(true).setDescription(description); - result.getPromotions().add(promotion); - } - - /** - * 添加【不匹配】多个 OrderItem 的营销明细 - * - * @param result 价格计算结果 - * @param orderItems 多个订单商品 SKU - * @param id 营销编号 - * @param name 营销名字 - * @param description 满足条件的提示 - * @param type 营销类型 - */ - public static void addNotMatchPromotion(TradePriceCalculateRespBO result, List orderItems, - Long id, String name, Integer type, String description) { - // 创建营销明细 Item - List promotionItems = CollectionUtils.convertList(orderItems, - orderItem -> new TradePriceCalculateRespBO.PromotionItem().setSkuId(orderItem.getSkuId()) - .setTotalPrice(orderItem.getPayPrice()).setDiscountPrice(0)); - // 创建营销明细 - TradePriceCalculateRespBO.Promotion promotion = new TradePriceCalculateRespBO.Promotion() - .setId(id).setName(name).setType(type) - .setTotalPrice(calculateTotalPayPrice(orderItems)) - .setDiscountPrice(0) - .setItems(promotionItems).setMatch(false).setDescription(description); - result.getPromotions().add(promotion); - } - - public static String formatPrice(Integer price) { - return String.format("%.2f", price / 100d); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java b/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java deleted file mode 100644 index f33a4c04..00000000 --- a/win-module-mall/win-module-trade-biz/src/main/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.win.module.promotion.api.reward.RewardActivityApi; -import com.win.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; -import com.win.module.promotion.enums.common.PromotionConditionTypeEnum; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; -import static com.win.framework.common.util.collection.CollectionUtils.filterList; -import static com.win.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; - -/** - * 满减送活动的 {@link TradePriceCalculator} 实现类 - * - * @author 芋道源码 - */ -@Component -@Order(TradePriceCalculator.ORDER_REWARD_ACTIVITY) -public class TradeRewardActivityPriceCalculator implements TradePriceCalculator { - - @Resource - private RewardActivityApi rewardActivityApi; - - @Override - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { - // 获得 SKU 对应的满减送活动 - List rewardActivities = rewardActivityApi.getMatchRewardActivityList( - convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSpuId)); - if (CollUtil.isEmpty(rewardActivities)) { - return; - } - - // 处理每个满减送活动 - rewardActivities.forEach(rewardActivity -> calculate(param, result, rewardActivity)); - } - - private void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result, - RewardActivityMatchRespDTO rewardActivity) { - // 1.1 获得满减送的订单项(商品)列表 - List orderItems = filterMatchCouponOrderItems(result, rewardActivity); - if (CollUtil.isEmpty(orderItems)) { - return; - } - // 1.2 获得最大匹配的满减送活动的规则 - RewardActivityMatchRespDTO.Rule rule = getMaxMatchRewardActivityRule(rewardActivity, orderItems); - if (rule == null) { - TradePriceCalculatorHelper.addNotMatchPromotion(result, orderItems, - rewardActivity.getId(), rewardActivity.getName(), PromotionTypeEnum.REWARD_ACTIVITY.getType(), - getRewardActivityNotMeetTip(rewardActivity)); - return; - } - - // 2.1 计算可以优惠的金额 - Integer newDiscountPrice = rule.getDiscountPrice(); - // 2.2 计算分摊的优惠金额 - List divideDiscountPrices = TradePriceCalculatorHelper.dividePrice(orderItems, newDiscountPrice); - - // 3.1 记录使用的优惠劵 - result.setCouponId(param.getCouponId()); - // 3.2 记录优惠明细 - TradePriceCalculatorHelper.addPromotion(result, orderItems, - rewardActivity.getId(), rewardActivity.getName(), PromotionTypeEnum.REWARD_ACTIVITY.getType(), - StrUtil.format("满减送:省 {} 元", formatPrice(rule.getDiscountPrice())), - divideDiscountPrices); - // 3.3 更新 SKU 优惠金额 - for (int i = 0; i < orderItems.size(); i++) { - TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i); - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + divideDiscountPrices.get(i)); - TradePriceCalculatorHelper.recountPayPrice(orderItem); - } - TradePriceCalculatorHelper.recountAllPrice(result); - } - - /** - * 获得满减送的订单项(商品)列表 - * - * @param result 计算结果 - * @param rewardActivity 满减送活动 - * @return 订单项(商品)列表 - */ - private List filterMatchCouponOrderItems(TradePriceCalculateRespBO result, - RewardActivityMatchRespDTO rewardActivity) { - return filterList(result.getItems(), - orderItem -> CollUtil.contains(rewardActivity.getSpuIds(), orderItem.getSpuId())); - } - - /** - * 获得最大匹配的满减送活动的规则 - * - * @param rewardActivity 满减送活动 - * @param orderItems 商品项 - * @return 匹配的活动规则 - */ - private RewardActivityMatchRespDTO.Rule getMaxMatchRewardActivityRule(RewardActivityMatchRespDTO rewardActivity, - List orderItems) { - // 1. 计算数量和价格 - Integer count = TradePriceCalculatorHelper.calculateTotalCount(orderItems); - Integer price = TradePriceCalculatorHelper.calculateTotalPayPrice(orderItems); - assert count != null && price != null; - - // 2. 倒序找一个最大优惠的规则 - for (int i = rewardActivity.getRules().size() - 1; i >= 0; i--) { - RewardActivityMatchRespDTO.Rule rule = rewardActivity.getRules().get(i); - if (PromotionConditionTypeEnum.PRICE.getType().equals(rewardActivity.getConditionType()) - && price >= rule.getLimit()) { - return rule; - } - if (PromotionConditionTypeEnum.COUNT.getType().equals(rewardActivity.getConditionType()) - && count >= rule.getLimit()) { - return rule; - } - } - return null; - } - - /** - * 获得满减送活动部匹配时的提示 - * - * @param rewardActivity 满减送活动 - * @return 提示 - */ - private String getRewardActivityNotMeetTip(RewardActivityMatchRespDTO rewardActivity) { - // TODO 芋艿:后面再想想;应该找第一个规则,算下还差多少即可。 - return "TODO"; - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientIntegrationTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientIntegrationTest.java deleted file mode 100644 index b6593c47..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientIntegrationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.impl; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.module.trade.framework.delivery.config.TradeExpressProperties; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.framework.delivery.core.client.impl.kd100.Kd100ExpressClient; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.web.client.RestTemplate; - -import java.util.List; - -/** - * {@link Kd100ExpressClient} 的集成测试 - * - * @author jason - */ -@Slf4j -public class Kd100ExpressClientIntegrationTest { - - private Kd100ExpressClient client; - - @BeforeEach - public void init() { - RestTemplate restTemplate = new RestTemplateBuilder().build(); - TradeExpressProperties.Kd100Config config = new TradeExpressProperties.Kd100Config() - .setKey("pLXUGAwK5305") - .setCustomer("E77DF18BE109F454A5CD319E44BF5177"); - client = new Kd100ExpressClient(restTemplate, config); - } - - @Test - @Disabled("集成测试,暂时忽略") - public void testGetExpressTrackList() { - ExpressTrackQueryReqDTO reqDTO = new ExpressTrackQueryReqDTO(); - reqDTO.setExpressCode("STO"); - reqDTO.setLogisticsNo("773220402764314"); - List tracks = client.getExpressTrackList(reqDTO); - System.out.println(JsonUtils.toJsonPrettyString(tracks)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientIntegrationTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientIntegrationTest.java deleted file mode 100644 index de7a284e..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientIntegrationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.win.module.trade.framework.delivery.core.client.impl; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.module.trade.framework.delivery.config.TradeExpressProperties; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; -import com.win.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; -import com.win.module.trade.framework.delivery.core.client.impl.kdniao.KdNiaoExpressClient; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.web.client.RestTemplate; - -import java.util.List; - -/** - * {@link KdNiaoExpressClient} 的集成测试 - * - * @author jason - */ -@Slf4j -public class KdNiaoExpressClientIntegrationTest { - - private KdNiaoExpressClient client; - - @BeforeEach - public void init() { - RestTemplate restTemplate = new RestTemplateBuilder().build(); - TradeExpressProperties.KdNiaoConfig config = new TradeExpressProperties.KdNiaoConfig() - .setApiKey("cb022f1e-48f1-4c4a-a723-9001ac9676b8") - .setBusinessId("1809751"); - client = new KdNiaoExpressClient(restTemplate, config); - } - - @Test - @Disabled("集成测试,暂时忽略") - public void testGetExpressTrackList() { - ExpressTrackQueryReqDTO reqDTO = new ExpressTrackQueryReqDTO(); - reqDTO.setExpressCode("STO"); - reqDTO.setLogisticsNo("663220402764314"); - List tracks = client.getExpressTrackList(reqDTO); - System.out.println(JsonUtils.toJsonPrettyString(tracks)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceTest.java deleted file mode 100644 index fd430351..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/aftersale/TradeAfterSaleServiceTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.win.module.trade.service.aftersale; - -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.pay.api.refund.PayRefundApi; -import com.win.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO; -import com.win.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; -import com.win.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.dal.mysql.aftersale.TradeAfterSaleLogMapper; -import com.win.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper; -import com.win.module.trade.enums.aftersale.TradeAfterSaleStatusEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleTypeEnum; -import com.win.module.trade.enums.aftersale.TradeAfterSaleWayEnum; -import com.win.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import com.win.module.trade.service.order.TradeOrderQueryService; -import com.win.module.trade.service.order.TradeOrderUpdateService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Arrays.asList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link TradeAfterSaleService} 的单元测试 - * - * @author 芋道源码 - */ -@Import(TradeAfterSaleServiceImpl.class) -public class TradeAfterSaleServiceTest extends BaseDbUnitTest { - - @Resource - private TradeAfterSaleServiceImpl tradeAfterSaleService; - - @Resource - private TradeAfterSaleMapper tradeAfterSaleMapper; - @Resource - private TradeAfterSaleLogMapper tradeAfterSaleLogMapper; - - @MockBean - private TradeOrderUpdateService tradeOrderUpdateService; - @Resource - private TradeOrderQueryService tradeOrderQueryService; - - @MockBean - private PayRefundApi payRefundApi; - - @MockBean - private TradeOrderProperties tradeOrderProperties; - - @Test - public void testCreateAfterSale() { - // 准备参数 - Long userId = 1024L; - AppTradeAfterSaleCreateReqVO createReqVO = new AppTradeAfterSaleCreateReqVO() - .setOrderItemId(1L).setRefundPrice(100).setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay()) - .setApplyReason("退钱").setApplyDescription("快退") - .setApplyPicUrls(asList("https://www.baidu.com/1.png", "https://www.baidu.com/2.png")); - // mock 方法(交易订单项) - TradeOrderItemDO orderItem = randomPojo(TradeOrderItemDO.class, o -> { - o.setOrderId(111L).setUserId(userId).setPayPrice(200); - o.setAfterSaleStatus(TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - }); - when(tradeOrderQueryService.getOrderItem(eq(1024L), eq(1L))) - .thenReturn(orderItem); - // mock 方法(交易订单) - TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> o.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()) - .setNo("202211301234")); - when(tradeOrderQueryService.getOrder(eq(1024L), eq(111L))).thenReturn(order); - - // 调用 - Long afterSaleId = tradeAfterSaleService.createAfterSale(userId, createReqVO); - // 断言(TradeAfterSaleDO) - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId); - assertNotNull(afterSale.getNo()); - assertEquals(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus()); - assertEquals(afterSale.getType(), TradeAfterSaleTypeEnum.IN_SALE.getType()); - assertPojoEquals(afterSale, createReqVO); - assertEquals(afterSale.getUserId(), 1024L); - assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime"); - assertEquals(afterSale.getOrderNo(), "202211301234"); - assertNull(afterSale.getPayRefundId()); - assertNull(afterSale.getRefundTime()); - assertNull(afterSale.getLogisticsId()); - assertNull(afterSale.getLogisticsNo()); - assertNull(afterSale.getDeliveryTime()); - assertNull(afterSale.getReceiveReason()); - // 断言(TradeAfterSaleLogDO) - TradeAfterSaleLogDO afterSaleLog = tradeAfterSaleLogMapper.selectList().get(0); - assertEquals(afterSaleLog.getUserId(), userId); - assertEquals(afterSaleLog.getUserType(), UserTypeEnum.MEMBER.getValue()); - assertEquals(afterSaleLog.getAfterSaleId(), afterSaleId); - assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime"); - assertEquals(afterSaleLog.getContent(), TradeAfterSaleStatusEnum.APPLY.getContent()); - } - - @Test - public void testGetAfterSalePage() { - // mock 数据 - TradeAfterSaleDO dbAfterSale = randomPojo(TradeAfterSaleDO.class, o -> { // 等会查询到 - o.setNo("202211190847450020500077"); - o.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); - o.setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay()); - o.setType(TradeAfterSaleTypeEnum.IN_SALE.getType()); - o.setOrderNo("202211190847450020500011"); - o.setSpuName("芋艿"); - o.setCreateTime(buildTime(2022, 1, 15)); - }); - tradeAfterSaleMapper.insert(dbAfterSale); - // 测试 no 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setNo("202211190847450020500066"))); - // 测试 status 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()))); - // 测试 way 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setWay(TradeAfterSaleWayEnum.REFUND.getWay()))); - // 测试 type 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setType(TradeAfterSaleTypeEnum.AFTER_SALE.getType()))); - // 测试 orderNo 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setOrderNo("202211190847450020500022"))); - // 测试 spuName 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setSpuName("土豆"))); - // 测试 createTime 不匹配 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setCreateTime(buildTime(2022, 1, 20)))); - // 准备参数 - TradeAfterSalePageReqVO reqVO = new TradeAfterSalePageReqVO(); - reqVO.setNo("20221119084745002050007"); - reqVO.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); - reqVO.setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay()); - reqVO.setType(TradeAfterSaleTypeEnum.IN_SALE.getType()); - reqVO.setOrderNo("20221119084745002050001"); - reqVO.setSpuName("芋"); - reqVO.setCreateTime(new LocalDateTime[]{buildTime(2022, 1, 1), buildTime(2022, 1, 16)}); - - // 调用 - PageResult pageResult = tradeAfterSaleService.getAfterSalePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbAfterSale, pageResult.getList().get(0)); - } -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImplTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImplTest.java deleted file mode 100644 index 5b8d21db..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/record/BrokerageRecordServiceImplTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.win.module.trade.service.brokerage.record; - -import cn.hutool.core.util.NumberUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; -import com.win.module.trade.dal.mysql.brokerage.record.BrokerageRecordMapper; -import com.win.module.trade.service.brokerage.user.BrokerageUserService; -import com.win.module.trade.service.config.TradeConfigService; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.math.RoundingMode; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.hutool.core.util.RandomUtil.randomInt; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomInteger; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; - -// TODO @芋艿:单测后续看看 -/** - * {@link BrokerageRecordServiceImpl} 的单元测试类 - * - * @author owen - */ -@Import(BrokerageRecordServiceImpl.class) -public class BrokerageRecordServiceImplTest extends BaseDbUnitTest { - - @Resource - private BrokerageRecordServiceImpl brokerageRecordService; - @Resource - private BrokerageRecordMapper brokerageRecordMapper; - - @MockBean - private TradeConfigService tradeConfigService; - @MockBean - private BrokerageUserService brokerageUserService; - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBrokerageRecordPage() { - // mock 数据 - BrokerageRecordDO dbBrokerageRecord = randomPojo(BrokerageRecordDO.class, o -> { // 等会查询到 - o.setUserId(null); - o.setBizType(null); - o.setStatus(null); - o.setCreateTime(null); - }); - brokerageRecordMapper.insert(dbBrokerageRecord); - // 测试 userId 不匹配 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setUserId(null))); - // 测试 bizType 不匹配 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setBizType(null))); - // 测试 status 不匹配 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setStatus(null))); - // 测试 createTime 不匹配 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setCreateTime(null))); - // 准备参数 - BrokerageRecordPageReqVO reqVO = new BrokerageRecordPageReqVO(); - reqVO.setUserId(null); - reqVO.setBizType(null); - reqVO.setStatus(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = brokerageRecordService.getBrokerageRecordPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbBrokerageRecord, pageResult.getList().get(0)); - } - - @Test - public void testCalculatePrice_useFixedPrice() { - // mock 数据 - Integer payPrice = randomInteger(); - Integer percent = randomInt(1, 101); - Integer fixedPrice = randomInt(); - // 调用 - int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice); - // 断言 - assertEquals(brokerage, fixedPrice); - } - - @Test - public void testCalculatePrice_usePercent() { - // mock 数据 - Integer payPrice = randomInteger(); - Integer percent = randomInt(1, 101); - Integer fixedPrice = randomEle(new Integer[]{0, null}); - System.out.println("fixedPrice=" + fixedPrice); - // 调用 - int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice); - // 断言 - assertEquals(brokerage, NumberUtil.div(NumberUtil.mul(payPrice, percent), 100, 0, RoundingMode.DOWN).intValue()); - } - - @Test - public void testCalculatePrice_equalsZero() { - // mock 数据 - Integer payPrice = null; - Integer percent = null; - Integer fixedPrice = null; - // 调用 - int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice); - // 断言 - assertEquals(brokerage, 0); - } -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImplTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImplTest.java deleted file mode 100644 index 76bd2f49..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/brokerage/user/BrokerageUserServiceImplTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.trade.service.brokerage.user; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; -import com.win.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; -import com.win.module.trade.dal.mysql.brokerage.user.BrokerageUserMapper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; - -// TODO @芋艿:单测后续看看 -/** - * {@link BrokerageUserServiceImpl} 的单元测试类 - * - * @author owen - */ -@Import(BrokerageUserServiceImpl.class) -public class BrokerageUserServiceImplTest extends BaseDbUnitTest { - - @Resource - private BrokerageUserServiceImpl brokerageUserService; - - @Resource - private BrokerageUserMapper brokerageUserMapper; - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBrokerageUserPage() { - // mock 数据 - BrokerageUserDO dbBrokerageUser = randomPojo(BrokerageUserDO.class, o -> { // 等会查询到 - o.setBindUserId(null); - o.setBrokerageEnabled(null); - o.setCreateTime(null); - }); - brokerageUserMapper.insert(dbBrokerageUser); - // 测试 brokerageUserId 不匹配 - brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setBindUserId(null))); - // 测试 brokerageEnabled 不匹配 - brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setBrokerageEnabled(null))); - // 测试 createTime 不匹配 - brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setCreateTime(null))); - // 准备参数 - BrokerageUserPageReqVO reqVO = new BrokerageUserPageReqVO(); - reqVO.setBindUserId(null); - reqVO.setBrokerageEnabled(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = brokerageUserService.getBrokerageUserPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbBrokerageUser, pageResult.getList().get(0)); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/order/TradeOrderUpdateServiceTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/order/TradeOrderUpdateServiceTest.java deleted file mode 100644 index dccac2af..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/order/TradeOrderUpdateServiceTest.java +++ /dev/null @@ -1,316 +0,0 @@ -package com.win.module.trade.service.order; - -import com.win.framework.common.enums.TerminalEnum; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.member.api.address.AddressApi; -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.pay.api.order.PayOrderApi; -import com.win.module.pay.api.order.dto.PayOrderRespDTO; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.promotion.api.coupon.CouponApi; -import com.win.module.promotion.api.price.PriceApi; -import com.win.module.promotion.api.price.dto.PriceCalculateRespDTO; -import com.win.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; -import com.win.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; -import com.win.module.trade.dal.dataobject.order.TradeOrderDO; -import com.win.module.trade.dal.dataobject.order.TradeOrderItemDO; -import com.win.module.trade.dal.mysql.order.TradeOrderItemMapper; -import com.win.module.trade.dal.mysql.order.TradeOrderMapper; -import com.win.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; -import com.win.module.trade.enums.order.TradeOrderRefundStatusEnum; -import com.win.module.trade.enums.order.TradeOrderStatusEnum; -import com.win.module.trade.enums.order.TradeOrderTypeEnum; -import com.win.module.trade.framework.order.config.TradeOrderConfig; -import com.win.module.trade.framework.order.config.TradeOrderProperties; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; -import java.util.Arrays; -import java.util.List; - -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -/** - * {@link TradeOrderUpdateServiceImpl} 的单元测试类 - * - * @author LeeYan9 - * @since 2022-09-07 - */ -@Import({TradeOrderUpdateServiceImpl.class, TradeOrderConfig.class}) -public class TradeOrderUpdateServiceTest extends BaseDbUnitTest { - - @Resource - private TradeOrderUpdateServiceImpl tradeOrderUpdateService; - - @Resource - private TradeOrderMapper tradeOrderMapper; - @Resource - private TradeOrderItemMapper tradeOrderItemMapper; - - @MockBean - private MemberUserApi memberUserApi; - @MockBean - private ProductSpuApi productSpuApi; - @MockBean - private ProductSkuApi productSkuApi; - @MockBean - private PriceApi priceApi; - @MockBean - private PayOrderApi payOrderApi; - @MockBean - private AddressApi addressApi; - @MockBean - private CouponApi couponApi; - - @MockBean - private TradeOrderProperties tradeOrderProperties; - - @BeforeEach - public void setUp() { - when(tradeOrderProperties.getAppId()).thenReturn(888L); - when(tradeOrderProperties.getExpireTime()).thenReturn(Duration.ofDays(1)); - } - - @Test - public void testCreateTradeOrder_success() { - // 准备参数 - Long userId = 100L; - String userIp = "127.0.0.1"; -// AppTradeOrderCreateReqVO reqVO = new AppTradeOrderCreateReqVO() -// .setAddressId(10L).setCouponId(101L).setRemark("我是备注").setFromCart(true) -// .setItems(Arrays.asList(new AppTradeOrderCreateReqVO.Item().setSkuId(1L).setCount(3), -// new AppTradeOrderCreateReqVO.Item().setSkuId(2L).setCount(4))); - AppTradeOrderCreateReqVO reqVO = null; - // TODO 芋艿:重新高下 - // mock 方法(商品 SKU 检查) - ProductSkuRespDTO sku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(1L).setSpuId(11L) - .setPrice(50).setStock(100) - .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(111L).setValueId(222L)))); - ProductSkuRespDTO sku02 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(2L).setSpuId(21L) - .setPrice(20).setStock(50)) - .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(333L).setValueId(444L))); - when(productSkuApi.getSkuList(eq(asSet(1L, 2L)))).thenReturn(Arrays.asList(sku01, sku02)); - // mock 方法(商品 SPU 检查) - ProductSpuRespDTO spu01 = randomPojo(ProductSpuRespDTO.class, o -> o.setId(11L) - .setStatus(ProductSpuStatusEnum.ENABLE.getStatus()).setName("商品 1")); - ProductSpuRespDTO spu02 = randomPojo(ProductSpuRespDTO.class, o -> o.setId(21L) - .setStatus(ProductSpuStatusEnum.ENABLE.getStatus())); - when(productSpuApi.getSpuList(eq(asSet(11L, 21L)))).thenReturn(Arrays.asList(spu01, spu02)); - // mock 方法(用户收件地址的校验) - AddressRespDTO addressRespDTO = new AddressRespDTO().setId(10L).setUserId(userId).setName("芋艿") - .setMobile("15601691300").setAreaId(3306).setDetailAddress("土豆村"); - when(addressApi.getAddress(eq(10L), eq(userId))).thenReturn(addressRespDTO); - // mock 方法(价格计算) - PriceCalculateRespDTO.OrderItem priceOrderItem01 = new PriceCalculateRespDTO.OrderItem() - .setSpuId(11L).setSkuId(1L).setCount(3).setOriginalPrice(150).setOriginalUnitPrice(50) - .setDiscountPrice(20).setPayPrice(130).setOrderPartPrice(7).setOrderDividePrice(35); - PriceCalculateRespDTO.OrderItem priceOrderItem02 = new PriceCalculateRespDTO.OrderItem() - .setSpuId(21L).setSkuId(2L).setCount(4).setOriginalPrice(80).setOriginalUnitPrice(20) - .setDiscountPrice(40).setPayPrice(40).setOrderPartPrice(15).setOrderDividePrice(25); - PriceCalculateRespDTO.Order priceOrder = new PriceCalculateRespDTO.Order() - .setTotalPrice(230).setDiscountPrice(0).setCouponPrice(30) - .setPointPrice(10).setDeliveryPrice(20).setPayPrice(80).setCouponId(101L).setCouponPrice(30) - .setItems(Arrays.asList(priceOrderItem01, priceOrderItem02)); - when(priceApi.calculatePrice(argThat(priceCalculateReqDTO -> { - assertEquals(priceCalculateReqDTO.getUserId(), 100L); - assertEquals(priceCalculateReqDTO.getCouponId(), 101L); - assertEquals(priceCalculateReqDTO.getItems().get(0).getSkuId(), 1L); - assertEquals(priceCalculateReqDTO.getItems().get(0).getCount(), 3); - assertEquals(priceCalculateReqDTO.getItems().get(1).getSkuId(), 2L); - assertEquals(priceCalculateReqDTO.getItems().get(1).getCount(), 4); - return true; - }))).thenReturn(new PriceCalculateRespDTO().setOrder(priceOrder)); - // mock 方法(创建支付单) - when(payOrderApi.createOrder(argThat(createReqDTO -> { - assertEquals(createReqDTO.getAppId(), 888L); - assertEquals(createReqDTO.getUserIp(), userIp); - assertNotNull(createReqDTO.getMerchantOrderId()); // 由于 tradeOrderId 后生成,只能校验非空 - assertEquals(createReqDTO.getSubject(), "商品 1 等多件"); - assertNull(createReqDTO.getBody()); - assertEquals(createReqDTO.getPrice(), 80); - assertNotNull(createReqDTO.getExpireTime()); - return true; - }))).thenReturn(1000L); - - // 调用方法 - TradeOrderDO order = tradeOrderUpdateService.createOrder(userId, userIp, reqVO); - // 断言 TradeOrderDO 订单 - List tradeOrderDOs = tradeOrderMapper.selectList(); - assertEquals(tradeOrderDOs.size(), 1); - TradeOrderDO tradeOrderDO = tradeOrderDOs.get(0); - assertEquals(tradeOrderDO.getId(), order.getId()); - assertNotNull(tradeOrderDO.getNo()); - assertEquals(tradeOrderDO.getType(), TradeOrderTypeEnum.NORMAL.getType()); - assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal()); - assertEquals(tradeOrderDO.getUserId(), userId); - assertEquals(tradeOrderDO.getUserIp(), userIp); - assertEquals(tradeOrderDO.getStatus(), TradeOrderStatusEnum.UNPAID.getStatus()); - assertEquals(tradeOrderDO.getProductCount(), 7); - assertNull(tradeOrderDO.getFinishTime()); - assertNull(tradeOrderDO.getCancelTime()); - assertNull(tradeOrderDO.getCancelType()); - assertEquals(tradeOrderDO.getUserRemark(), "我是备注"); - assertNull(tradeOrderDO.getRemark()); - assertFalse(tradeOrderDO.getPayStatus()); - assertNull(tradeOrderDO.getPayTime()); - assertEquals(tradeOrderDO.getTotalPrice(), 230); - assertEquals(tradeOrderDO.getDiscountPrice(), 0); - assertEquals(tradeOrderDO.getAdjustPrice(), 0); - assertEquals(tradeOrderDO.getPayPrice(), 80); - assertEquals(tradeOrderDO.getPayOrderId(), 1000L); - assertNull(tradeOrderDO.getPayChannelCode()); - assertNull(tradeOrderDO.getLogisticsId()); - assertNull(tradeOrderDO.getDeliveryTime()); - assertNull(tradeOrderDO.getReceiveTime()); - assertEquals(tradeOrderDO.getReceiverName(), "芋艿"); - assertEquals(tradeOrderDO.getReceiverMobile(), "15601691300"); - assertEquals(tradeOrderDO.getReceiverAreaId(), 3306); - assertEquals(tradeOrderDO.getReceiverDetailAddress(), "土豆村"); - assertEquals(tradeOrderDO.getRefundStatus(), TradeOrderRefundStatusEnum.NONE.getStatus()); - assertEquals(tradeOrderDO.getRefundPrice(), 0); - assertEquals(tradeOrderDO.getCouponPrice(), 30); - assertEquals(tradeOrderDO.getPointPrice(), 10); - // 断言 TradeOrderItemDO 订单(第 1 个) - List tradeOrderItemDOs = tradeOrderItemMapper.selectList(); - assertEquals(tradeOrderItemDOs.size(), 2); - TradeOrderItemDO tradeOrderItemDO01 = tradeOrderItemDOs.get(0); - assertNotNull(tradeOrderItemDO01.getId()); - assertEquals(tradeOrderItemDO01.getUserId(), userId); - assertEquals(tradeOrderItemDO01.getOrderId(), order.getId()); - assertEquals(tradeOrderItemDO01.getSpuId(), 11L); - assertEquals(tradeOrderItemDO01.getSkuId(), 1L); - assertEquals(tradeOrderItemDO01.getProperties().size(), 1); - assertEquals(tradeOrderItemDO01.getProperties().get(0).getPropertyId(), 111L); - assertEquals(tradeOrderItemDO01.getProperties().get(0).getValueId(), 222L); - //assertEquals(tradeOrderItemDO01.getSpuName(), sku01.getSpuName()); TODO 找不到spuName - assertEquals(tradeOrderItemDO01.getPicUrl(), sku01.getPicUrl()); - assertEquals(tradeOrderItemDO01.getCount(), 3); -// assertEquals(tradeOrderItemDO01.getOriginalPrice(), 150); - assertEquals(tradeOrderItemDO01.getPrice(), 50); - assertEquals(tradeOrderItemDO01.getDiscountPrice(), 20); - assertEquals(tradeOrderItemDO01.getPayPrice(), 130); - assertEquals(tradeOrderItemDO01.getAfterSaleStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - // 断言 TradeOrderItemDO 订单(第 2 个) - TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1); - assertNotNull(tradeOrderItemDO02.getId()); - assertEquals(tradeOrderItemDO02.getUserId(), userId); - assertEquals(tradeOrderItemDO02.getOrderId(), order.getId()); - assertEquals(tradeOrderItemDO02.getSpuId(), 21L); - assertEquals(tradeOrderItemDO02.getSkuId(), 2L); - assertEquals(tradeOrderItemDO02.getProperties().size(), 1); - assertEquals(tradeOrderItemDO02.getProperties().get(0).getPropertyId(), 333L); - assertEquals(tradeOrderItemDO02.getProperties().get(0).getValueId(), 444L); - //assertEquals(tradeOrderItemDO02.getSpuName(), sku02.getSpuName()); TODO 找不到spuName - assertEquals(tradeOrderItemDO02.getPicUrl(), sku02.getPicUrl()); - assertEquals(tradeOrderItemDO02.getCount(), 4); -// assertEquals(tradeOrderItemDO02.getOriginalPrice(), 80); - assertEquals(tradeOrderItemDO02.getPrice(), 20); - assertEquals(tradeOrderItemDO02.getDiscountPrice(), 40); - assertEquals(tradeOrderItemDO02.getPayPrice(), 40); - assertEquals(tradeOrderItemDO02.getAfterSaleStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); - // 校验调用 - verify(productSkuApi).updateSkuStock(argThat(updateStockReqDTO -> { - assertEquals(updateStockReqDTO.getItems().size(), 2); - assertEquals(updateStockReqDTO.getItems().get(0).getId(), 1L); - assertEquals(updateStockReqDTO.getItems().get(0).getIncrCount(), 3); - assertEquals(updateStockReqDTO.getItems().get(1).getId(), 2L); - assertEquals(updateStockReqDTO.getItems().get(1).getIncrCount(), 4); - return true; - })); - verify(couponApi).useCoupon(argThat(reqDTO -> { - assertEquals(reqDTO.getId(), reqVO.getCouponId()); - assertEquals(reqDTO.getUserId(), userId); - assertEquals(reqDTO.getOrderId(), order.getId()); - return true; - })); - } - - @Test - public void testUpdateOrderPaid() { - // mock 数据(TradeOrder) - TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> { - o.setId(1L).setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); - o.setPayOrderId(10L).setPayStatus(false).setPayPrice(100).setPayTime(null); - }); - tradeOrderMapper.insert(order); - // 准备参数 - Long id = 1L; - Long payOrderId = 10L; - // mock 方法(支付单) - when(payOrderApi.getOrder(eq(10L))).thenReturn(randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()).setChannelCode("wx_pub") - .setMerchantOrderId("1")).setPrice(100)); - - // 调用 - tradeOrderUpdateService.updateOrderPaid(id, payOrderId); - // 断言 - TradeOrderDO dbOrder = tradeOrderMapper.selectById(id); - assertEquals(dbOrder.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus()); - assertTrue(dbOrder.getPayStatus()); - assertNotNull(dbOrder.getPayTime()); - assertEquals(dbOrder.getPayChannelCode(), "wx_pub"); - } - - @Test - public void testDeliveryOrder() { - // mock 数据(TradeOrder) - TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> { - o.setId(1L).setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus()); - o.setLogisticsId(null).setLogisticsNo(null).setDeliveryTime(null); - }); - tradeOrderMapper.insert(order); - // 准备参数 - TradeOrderDeliveryReqVO deliveryReqVO = new TradeOrderDeliveryReqVO().setId(1L) - .setLogisticsId(10L).setLogisticsNo("100"); - // mock 方法(支付单) - - // 调用 - tradeOrderUpdateService.deliveryOrder(deliveryReqVO); - // 断言 - TradeOrderDO dbOrder = tradeOrderMapper.selectById(1L); - assertEquals(dbOrder.getStatus(), TradeOrderStatusEnum.DELIVERED.getStatus()); - assertPojoEquals(dbOrder, deliveryReqVO); - assertNotNull(dbOrder.getDeliveryTime()); - } - - @Test - public void testReceiveOrder() { - // mock 数据(TradeOrder) - TradeOrderDO order = randomPojo(TradeOrderDO.class, o -> { - o.setId(1L).setUserId(10L).setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()); - o.setReceiveTime(null); - }); - tradeOrderMapper.insert(order); - // 准备参数 - Long id = 1L; - Long userId = 10L; - // mock 方法(支付单) - - // 调用 - tradeOrderUpdateService.receiveOrder(userId, id); - // 断言 - TradeOrderDO dbOrder = tradeOrderMapper.selectById(1L); - assertEquals(dbOrder.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus()); - assertNotNull(dbOrder.getReceiveTime()); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/TradePriceServiceImplTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/TradePriceServiceImplTest.java deleted file mode 100644 index 8adb32da..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/TradePriceServiceImplTest.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.win.module.trade.service.price; - -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import com.win.module.product.api.sku.ProductSkuApi; -import com.win.module.product.api.sku.dto.ProductSkuRespDTO; -import com.win.module.product.api.spu.ProductSpuApi; -import com.win.module.product.api.spu.dto.ProductSpuRespDTO; -import com.win.module.product.enums.spu.ProductSpuStatusEnum; -import com.win.module.trade.enums.order.TradeOrderTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import com.win.module.trade.service.price.calculator.TradePriceCalculator; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; - -import java.util.Arrays; -import java.util.List; - -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.when; - -/** - * {@link TradePriceServiceImpl} 的单元测试 - * - * @author 芋道源码 - */ -public class TradePriceServiceImplTest extends BaseMockitoUnitTest { - - @InjectMocks - private TradePriceServiceImpl tradePriceService; - - @Mock - private ProductSkuApi productSkuApi; - @Mock - private ProductSpuApi productSpuApi; - @Mock - private List priceCalculators; - - @Test - public void testCalculatePrice() { - // 准备参数 - TradePriceCalculateReqBO calculateReqBO = new TradePriceCalculateReqBO() - .setType(TradeOrderTypeEnum.NORMAL.getType()).setUserId(10L) - .setCouponId(20L).setAddressId(30L) - .setItems(Arrays.asList( - new TradePriceCalculateReqBO.Item().setSkuId(100L).setCount(1).setSelected(true), - new TradePriceCalculateReqBO.Item().setSkuId(200L).setCount(3).setSelected(true), - new TradePriceCalculateReqBO.Item().setSkuId(300L).setCount(6).setCartId(233L).setSelected(false) - )); - // mock 方法 - List skuList = Arrays.asList( - new ProductSkuRespDTO().setId(100L).setStock(500).setPrice(1000).setPicUrl("https://t.cn/1.png").setSpuId(1001L) - .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(1L).setPropertyName("颜色") - .setValueId(2L).setValueName("红色"))), - new ProductSkuRespDTO().setId(200L).setStock(400).setPrice(2000).setPicUrl("https://t.cn/2.png").setSpuId(1001L) - .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(1L).setPropertyName("颜色") - .setValueId(3L).setValueName("黄色"))), - new ProductSkuRespDTO().setId(300L).setStock(600).setPrice(3000).setPicUrl("https://t.cn/3.png").setSpuId(1001L) - .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(1L).setPropertyName("颜色") - .setValueId(4L).setValueName("黑色"))) - ); - when(productSkuApi.getSkuList(Mockito.eq(asSet(100L, 200L, 300L)))).thenReturn(skuList); - when(productSpuApi.getSpuList(Mockito.eq(asSet(1001L)))) - .thenReturn(singletonList(new ProductSpuRespDTO().setId(1001L).setName("小菜").setCategoryId(666L) - .setStatus(ProductSpuStatusEnum.ENABLE.getStatus()))); - - // 调用 - TradePriceCalculateRespBO calculateRespBO = tradePriceService.calculatePrice(calculateReqBO); - // 断言 - assertEquals(TradeOrderTypeEnum.NORMAL.getType(), calculateRespBO.getType()); - assertEquals(0, calculateRespBO.getPromotions().size()); - assertNull(calculateRespBO.getCouponId()); - // 断言:订单价格 - assertEquals(7000, calculateRespBO.getPrice().getTotalPrice()); - assertEquals(0, calculateRespBO.getPrice().getDiscountPrice()); - assertEquals(0, calculateRespBO.getPrice().getDeliveryPrice()); - assertEquals(0, calculateRespBO.getPrice().getCouponPrice()); - assertEquals(0, calculateRespBO.getPrice().getPointPrice()); - assertEquals(7000, calculateRespBO.getPrice().getPayPrice()); - // 断言:SKU 1 - assertEquals(1001L, calculateRespBO.getItems().get(0).getSpuId()); - assertEquals(100L, calculateRespBO.getItems().get(0).getSkuId()); - assertEquals(1, calculateRespBO.getItems().get(0).getCount()); - assertNull(calculateRespBO.getItems().get(0).getCartId()); - assertTrue(calculateRespBO.getItems().get(0).getSelected()); - assertEquals(1000, calculateRespBO.getItems().get(0).getPrice()); - assertEquals(0, calculateRespBO.getItems().get(0).getDiscountPrice()); - assertEquals(0, calculateRespBO.getItems().get(0).getDeliveryPrice()); - assertEquals(0, calculateRespBO.getItems().get(0).getCouponPrice()); - assertEquals(0, calculateRespBO.getItems().get(0).getPointPrice()); - assertEquals(1000, calculateRespBO.getItems().get(0).getPayPrice()); - assertEquals("小菜", calculateRespBO.getItems().get(0).getSpuName()); - assertEquals("https://t.cn/1.png", calculateRespBO.getItems().get(0).getPicUrl()); - assertEquals(666L, calculateRespBO.getItems().get(0).getCategoryId()); - assertEquals(skuList.get(0).getProperties(), calculateRespBO.getItems().get(0).getProperties()); - // 断言:SKU 2 - assertEquals(1001L, calculateRespBO.getItems().get(1).getSpuId()); - assertEquals(200L, calculateRespBO.getItems().get(1).getSkuId()); - assertEquals(3, calculateRespBO.getItems().get(1).getCount()); - assertNull(calculateRespBO.getItems().get(1).getCartId()); - assertTrue(calculateRespBO.getItems().get(1).getSelected()); - assertEquals(2000, calculateRespBO.getItems().get(1).getPrice()); - assertEquals(0, calculateRespBO.getItems().get(1).getDiscountPrice()); - assertEquals(0, calculateRespBO.getItems().get(1).getDeliveryPrice()); - assertEquals(0, calculateRespBO.getItems().get(1).getCouponPrice()); - assertEquals(0, calculateRespBO.getItems().get(1).getPointPrice()); - assertEquals(6000, calculateRespBO.getItems().get(1).getPayPrice()); - assertEquals("小菜", calculateRespBO.getItems().get(1).getSpuName()); - assertEquals("https://t.cn/2.png", calculateRespBO.getItems().get(1).getPicUrl()); - assertEquals(666L, calculateRespBO.getItems().get(1).getCategoryId()); - assertEquals(skuList.get(1).getProperties(), calculateRespBO.getItems().get(1).getProperties()); - // 断言:SKU 3 - assertEquals(1001L, calculateRespBO.getItems().get(2).getSpuId()); - assertEquals(300L, calculateRespBO.getItems().get(2).getSkuId()); - assertEquals(6, calculateRespBO.getItems().get(2).getCount()); - assertEquals(233L, calculateRespBO.getItems().get(2).getCartId()); - assertFalse(calculateRespBO.getItems().get(2).getSelected()); - assertEquals(3000, calculateRespBO.getItems().get(2).getPrice()); - assertEquals(0, calculateRespBO.getItems().get(2).getDiscountPrice()); - assertEquals(0, calculateRespBO.getItems().get(2).getDeliveryPrice()); - assertEquals(0, calculateRespBO.getItems().get(2).getCouponPrice()); - assertEquals(0, calculateRespBO.getItems().get(2).getPointPrice()); - assertEquals(18000, calculateRespBO.getItems().get(2).getPayPrice()); - assertEquals("小菜", calculateRespBO.getItems().get(2).getSpuName()); - assertEquals("https://t.cn/3.png", calculateRespBO.getItems().get(2).getPicUrl()); - assertEquals(666L, calculateRespBO.getItems().get(2).getCategoryId()); - assertEquals(skuList.get(2).getProperties(), calculateRespBO.getItems().get(2).getProperties()); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java deleted file mode 100644 index 4ec6cce9..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.promotion.api.coupon.CouponApi; -import com.win.module.promotion.api.coupon.dto.CouponRespDTO; -import com.win.module.promotion.api.coupon.dto.CouponValidReqDTO; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionProductScopeEnum; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.ArrayList; - -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Arrays.asList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link TradeCouponPriceCalculator} 的单元测试类 - * - * @author 芋道源码 - */ -public class TradeCouponPriceCalculatorTest extends BaseMockitoUnitTest { - - @InjectMocks - private TradeCouponPriceCalculator tradeCouponPriceCalculator; - - @Mock - private CouponApi couponApi; - - @Test - public void testCalculate() { - // 准备参数 - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() - .setUserId(233L).setCouponId(1024L) - .setItems(asList( - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配优惠劵 - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 匹配优惠劵 - new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true), // 不匹配优惠劵 - new TradePriceCalculateReqBO.Item().setSkuId(40L).setCount(5).setSelected(false) // 匹配优惠劵,但是未选中 - )); - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() - .setPrice(new TradePriceCalculateRespBO.Price()) - .setPromotions(new ArrayList<>()) - .setItems(asList( - new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) - .setPrice(100).setSpuId(1L), - new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true) - .setPrice(50).setSpuId(2L), - new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(4).setSelected(true) - .setPrice(30).setSpuId(3L), - new TradePriceCalculateRespBO.OrderItem().setSkuId(40L).setCount(5).setSelected(false) - .setPrice(60).setSpuId(1L) - )); - // 保证价格被初始化上 - TradePriceCalculatorHelper.recountPayPrice(result.getItems()); - TradePriceCalculatorHelper.recountAllPrice(result); - - // mock 方法(优惠劵 Coupon 信息) - CouponRespDTO coupon = randomPojo(CouponRespDTO.class, o -> o.setId(1024L).setName("程序员节") - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) - .setUsePrice(350).setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()) - .setDiscountPercent(50).setDiscountLimitPrice(70)); - when(couponApi.validateCoupon(eq(new CouponValidReqDTO().setId(1024L).setUserId(233L)))).thenReturn(coupon); - - // 调用 - tradeCouponPriceCalculator.calculate(param, result); - // 断言 - assertEquals(result.getCouponId(), 1024L); - // 断言:Price 部分 - TradePriceCalculateRespBO.Price price = result.getPrice(); - assertEquals(price.getTotalPrice(), 470); - assertEquals(price.getDiscountPrice(), 0); - assertEquals(price.getPointPrice(), 0); - assertEquals(price.getDeliveryPrice(), 0); - assertEquals(price.getCouponPrice(), 70); - assertEquals(price.getPayPrice(), 400); - // 断言:SKU 1 - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); - assertEquals(orderItem01.getSkuId(), 10L); - assertEquals(orderItem01.getCount(), 2); - assertEquals(orderItem01.getPrice(), 100); - assertEquals(orderItem01.getDiscountPrice(), 0); - assertEquals(orderItem01.getDeliveryPrice(), 0); - assertEquals(orderItem01.getCouponPrice(), 40); - assertEquals(orderItem01.getPointPrice(), 0); - assertEquals(orderItem01.getPayPrice(), 160); - // 断言:SKU 2 - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); - assertEquals(orderItem02.getSkuId(), 20L); - assertEquals(orderItem02.getCount(), 3); - assertEquals(orderItem02.getPrice(), 50); - assertEquals(orderItem02.getDiscountPrice(), 0); - assertEquals(orderItem02.getDeliveryPrice(), 0); - assertEquals(orderItem02.getCouponPrice(), 30); - assertEquals(orderItem02.getPointPrice(), 0); - assertEquals(orderItem02.getPayPrice(), 120); - // 断言:SKU 3 - TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2); - assertEquals(orderItem03.getSkuId(), 30L); - assertEquals(orderItem03.getCount(), 4); - assertEquals(orderItem03.getPrice(), 30); - assertEquals(orderItem03.getDiscountPrice(), 0); - assertEquals(orderItem03.getCouponPrice(), 0); - assertEquals(orderItem03.getPointPrice(), 0); - assertEquals(orderItem03.getPayPrice(), 120); - // 断言:SKU 4 - TradePriceCalculateRespBO.OrderItem orderItem04 = result.getItems().get(3); - assertEquals(orderItem04.getSkuId(), 40L); - assertEquals(orderItem04.getCount(), 5); - assertEquals(orderItem04.getPrice(), 60); - assertEquals(orderItem04.getDiscountPrice(), 0); - assertEquals(orderItem04.getCouponPrice(), 0); - assertEquals(orderItem04.getPointPrice(), 0); - assertEquals(orderItem04.getPayPrice(), 300); - // 断言:Promotion 部分 - assertEquals(result.getPromotions().size(), 1); - TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); - assertEquals(promotion01.getId(), 1024L); - assertEquals(promotion01.getName(), "程序员节"); - assertEquals(promotion01.getType(), PromotionTypeEnum.COUPON.getType()); - assertEquals(promotion01.getTotalPrice(), 350); - assertEquals(promotion01.getDiscountPrice(), 70); - assertTrue(promotion01.getMatch()); - assertEquals(promotion01.getDescription(), "优惠劵:省 0.70 元"); - assertEquals(promotion01.getItems().size(), 2); - TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0); - assertEquals(promotionItem011.getSkuId(), 10L); - assertEquals(promotionItem011.getTotalPrice(), 200); - assertEquals(promotionItem011.getDiscountPrice(), 40); - TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1); - assertEquals(promotionItem012.getSkuId(), 20L); - assertEquals(promotionItem012.getTotalPrice(), 150); - assertEquals(promotionItem012.getDiscountPrice(), 30); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java deleted file mode 100644 index 082bb2e0..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import cn.hutool.core.map.MapUtil; -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.member.api.address.AddressApi; -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.trade.enums.delivery.DeliveryExpressChargeModeEnum; -import com.win.module.trade.enums.delivery.DeliveryTypeEnum; -import com.win.module.trade.service.delivery.DeliveryExpressTemplateService; -import com.win.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.ArrayList; - -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link TradeDeliveryPriceCalculator} 的单元测试 - * - * @author jason - */ -public class TradeDeliveryPriceCalculatorTest extends BaseMockitoUnitTest { - - @InjectMocks - private TradeDeliveryPriceCalculator calculator; - @Mock - private AddressApi addressApi; - @Mock - private DeliveryExpressTemplateService deliveryExpressTemplateService; - - private TradePriceCalculateReqBO reqBO; - private TradePriceCalculateRespBO resultBO; - - private DeliveryExpressTemplateRespBO templateRespBO; - private DeliveryExpressTemplateRespBO.Charge chargeBO; - private DeliveryExpressTemplateRespBO.Free freeBO; - - @BeforeEach - public void init(){ - // 准备参数 - reqBO = new TradePriceCalculateReqBO() - .setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode()) - .setAddressId(10L) - .setUserId(1L) - .setItems(asList( - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(10).setSelected(true), - new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(false) // 未选中 - )); - resultBO = new TradePriceCalculateRespBO() - .setPrice(new TradePriceCalculateRespBO.Price()) - .setPromotions(new ArrayList<>()) - .setItems(asList( - new TradePriceCalculateRespBO.OrderItem().setDeliveryTemplateId(1L).setSkuId(10L).setCount(2).setSelected(true) - .setWeight(10d).setVolume(10d).setPrice(100), - new TradePriceCalculateRespBO.OrderItem().setDeliveryTemplateId(1L).setSkuId(20L).setCount(10).setSelected(true) - .setWeight(10d).setVolume(10d).setPrice(200), - new TradePriceCalculateRespBO.OrderItem().setDeliveryTemplateId(1L).setSkuId(30L).setCount(1).setSelected(false) - .setWeight(10d).setVolume(10d).setPrice(300) - )); - // 保证价格被初始化上 - TradePriceCalculatorHelper.recountPayPrice(resultBO.getItems()); - TradePriceCalculatorHelper.recountAllPrice(resultBO); - - // 准备收件地址数据 - AddressRespDTO addressResp = randomPojo(AddressRespDTO.class, item -> item.setAreaId(10)); - when(addressApi.getAddress(eq(10L), eq(1L))).thenReturn(addressResp); - - // 准备运费模板费用配置数据 - chargeBO = randomPojo(DeliveryExpressTemplateRespBO.Charge.class, - item -> item.setStartCount(10D).setStartPrice(1000).setExtraCount(10D).setExtraPrice(2000)); - // 准备运费模板包邮配置数据:订单总件数 < 包邮件数时 12 < 20 - freeBO = randomPojo(DeliveryExpressTemplateRespBO.Free.class, - item -> item.setFreeCount(20).setFreePrice(100)); - // 准备 SP 运费模板数据 - templateRespBO = randomPojo(DeliveryExpressTemplateRespBO.class, - item -> item.setChargeMode(DeliveryExpressChargeModeEnum.PIECE.getType()) - .setCharge(chargeBO).setFree(freeBO)); - } - - @Test - @DisplayName("按件计算运费不包邮的情况") - public void testCalculateByExpressTemplateCharge() { - // SKU 1 : 100 * 2 = 200 - // SKU 2 :200 * 10 = 2000 - // 运费 首件 1000 + 续件 2000 = 3000 - // mock 方法 - when(deliveryExpressTemplateService.getExpressTemplateMapByIdsAndArea(eq(asSet(1L)), eq(10))) - .thenReturn(MapUtil.of(1L, templateRespBO)); - - // 调用 - calculator.calculate(reqBO, resultBO); - // 断言 - TradePriceCalculateRespBO.Price price = resultBO.getPrice(); - assertThat(price) - .extracting("totalPrice","discountPrice","couponPrice","pointPrice","deliveryPrice","payPrice") - .containsExactly(2200, 0, 0, 0, 3000, 5200); - assertThat(resultBO.getItems()).hasSize(3); - // 断言:SKU1 - assertThat(resultBO.getItems().get(0)) - .extracting("price", "count","discountPrice" ,"couponPrice", "pointPrice","deliveryPrice","payPrice") - .containsExactly(100, 2, 0, 0, 0, 1500, 1700); - // 断言:SKU2 - assertThat(resultBO.getItems().get(1)) - .extracting("price", "count","discountPrice" ,"couponPrice", "pointPrice","deliveryPrice","payPrice") - .containsExactly(200, 10, 0, 0, 0, 1500, 3500); - // 断言:SKU3 未选中 - assertThat(resultBO.getItems().get(2)) - .extracting("price", "count","discountPrice" ,"couponPrice", "pointPrice","deliveryPrice","payPrice") - .containsExactly(300, 1, 0, 0, 0, 0, 300); - } - - @Test - @DisplayName("按件计算运费包邮的情况") - public void testCalculateByExpressTemplateFree() { - // SKU 1 : 100 * 2 = 200 - // SKU 2 :200 * 10 = 2000 - // 运费 0 - // mock 方法 - // 准备运费模板包邮配置数据 包邮 订单总件数 > 包邮件数时 12 > 10 - templateRespBO.setFree(randomPojo(DeliveryExpressTemplateRespBO.Free.class, - item -> item.setFreeCount(10).setFreePrice(1000))); - when(deliveryExpressTemplateService.getExpressTemplateMapByIdsAndArea(eq(asSet(1L)), eq(10))) - .thenReturn(MapUtil.of(1L, templateRespBO)); - - // 调用 - calculator.calculate(reqBO, resultBO); - // 断言 - TradePriceCalculateRespBO.Price price = resultBO.getPrice(); - assertThat(price) - .extracting("totalPrice","discountPrice","couponPrice","pointPrice","deliveryPrice","payPrice") - .containsExactly(2200, 0, 0, 0, 0, 2200); - assertThat(resultBO.getItems()).hasSize(3); - // 断言:SKU1 - assertThat(resultBO.getItems().get(0)) - .extracting("price", "count","discountPrice" ,"couponPrice", "pointPrice","deliveryPrice","payPrice") - .containsExactly(100, 2, 0, 0, 0, 0, 200); - // 断言:SKU2 - assertThat(resultBO.getItems().get(1)) - .extracting("price", "count","discountPrice" ,"couponPrice", "pointPrice","deliveryPrice","payPrice") - .containsExactly(200, 10, 0, 0, 0, 0, 2000); - // 断言:SKU3 未选中 - assertThat(resultBO.getItems().get(2)) - .extracting("price", "count","discountPrice" ,"couponPrice", "pointPrice","deliveryPrice","payPrice") - .containsExactly(300, 1, 0, 0, 0, 0, 300); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java deleted file mode 100644 index 564581d3..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.promotion.api.discount.DiscountActivityApi; -import com.win.module.promotion.api.discount.dto.DiscountProductRespDTO; -import com.win.module.promotion.enums.common.PromotionDiscountTypeEnum; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.ArrayList; - -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Arrays.asList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link TradeDiscountActivityPriceCalculator} 的单元测试类 - * - * @author 芋道源码 - */ -public class TradeDiscountActivityPriceCalculatorTest extends BaseMockitoUnitTest { - - @InjectMocks - private TradeDiscountActivityPriceCalculator tradeDiscountActivityPriceCalculator; - - @Mock - private DiscountActivityApi discountActivityApi; - - @Test - public void testCalculate() { - // 准备参数 - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() - .setItems(asList( - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动,且已选中 - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中 - )); - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() - .setPrice(new TradePriceCalculateRespBO.Price()) - .setPromotions(new ArrayList<>()) - .setItems(asList( - new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) - .setPrice(100), - new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(false) - .setPrice(50) - )); - // 保证价格被初始化上 - TradePriceCalculatorHelper.recountPayPrice(result.getItems()); - TradePriceCalculatorHelper.recountAllPrice(result); - - // mock 方法(限时折扣活动) - when(discountActivityApi.getMatchDiscountProductList(eq(asSet(10L, 20L)))).thenReturn(asList( - randomPojo(DiscountProductRespDTO.class, o -> o.setActivityId(1000L) - .setActivityName("活动 1000 号").setSkuId(10L) - .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(40)), - randomPojo(DiscountProductRespDTO.class, o -> o.setActivityId(2000L) - .setActivityName("活动 2000 号").setSkuId(20L) - .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(60)) - )); - // 10L: 100 * 2 - 40 * 2 = 120 - // 20L:50 * 3 - 50 * 3 * 0.4 = 90 - - // 调用 - tradeDiscountActivityPriceCalculator.calculate(param, result); - // 断言:Price 部分 - TradePriceCalculateRespBO.Price price = result.getPrice(); - assertEquals(price.getTotalPrice(), 200); - assertEquals(price.getDiscountPrice(), 80); - assertEquals(price.getPointPrice(), 0); - assertEquals(price.getDeliveryPrice(), 0); - assertEquals(price.getCouponPrice(), 0); - assertEquals(price.getPayPrice(), 120); - assertNull(result.getCouponId()); - // 断言:SKU 1 - assertEquals(result.getItems().size(), 2); - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); - assertEquals(orderItem01.getSkuId(), 10L); - assertEquals(orderItem01.getCount(), 2); - assertEquals(orderItem01.getPrice(), 100); - assertEquals(orderItem01.getDiscountPrice(), 80); - assertEquals(orderItem01.getDeliveryPrice(), 0); - assertEquals(orderItem01.getCouponPrice(), 0); - assertEquals(orderItem01.getPointPrice(), 0); - assertEquals(orderItem01.getPayPrice(), 120); - // 断言:SKU 2 - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); - assertEquals(orderItem02.getSkuId(), 20L); - assertEquals(orderItem02.getCount(), 3); - assertEquals(orderItem02.getPrice(), 50); - assertEquals(orderItem02.getDiscountPrice(), 60); - assertEquals(orderItem02.getDeliveryPrice(), 0); - assertEquals(orderItem02.getCouponPrice(), 0); - assertEquals(orderItem02.getPointPrice(), 0); - assertEquals(orderItem02.getPayPrice(), 90); - // 断言:Promotion 部分 - assertEquals(result.getPromotions().size(), 1); - TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); - assertEquals(promotion01.getId(), 1000L); - assertEquals(promotion01.getName(), "活动 1000 号"); - assertEquals(promotion01.getType(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType()); - assertEquals(promotion01.getTotalPrice(), 200); - assertEquals(promotion01.getDiscountPrice(), 80); - assertTrue(promotion01.getMatch()); - assertEquals(promotion01.getDescription(), "限时折扣:省 0.80 元"); - TradePriceCalculateRespBO.PromotionItem promotionItem01 = promotion01.getItems().get(0); - assertEquals(promotion01.getItems().size(), 1); - assertEquals(promotionItem01.getSkuId(), 10L); - assertEquals(promotionItem01.getTotalPrice(), 200); - assertEquals(promotionItem01.getDiscountPrice(), 80); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java b/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java deleted file mode 100644 index c77a61cd..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/java/com/win/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.win.module.trade.service.price.calculator; - -import com.win.framework.test.core.ut.BaseMockitoUnitTest; -import com.win.module.promotion.api.reward.RewardActivityApi; -import com.win.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; -import com.win.module.promotion.enums.common.PromotionConditionTypeEnum; -import com.win.module.promotion.enums.common.PromotionTypeEnum; -import com.win.module.trade.service.price.bo.TradePriceCalculateReqBO; -import com.win.module.trade.service.price.bo.TradePriceCalculateRespBO; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.ArrayList; - -import static com.win.framework.common.util.collection.SetUtils.asSet; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link TradeRewardActivityPriceCalculator} 的单元测试类 - * - * @author 芋道源码 - */ -public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest { - - @InjectMocks - private TradeRewardActivityPriceCalculator tradeRewardActivityPriceCalculator; - - @Mock - private RewardActivityApi rewardActivityApi; - - @Test - public void testCalculate_match() { - // 准备参数 - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() - .setItems(asList( - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动 1 - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 匹配活动 1 - new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) // 匹配活动 2 - )); - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() - .setPrice(new TradePriceCalculateRespBO.Price()) - .setPromotions(new ArrayList<>()) - .setItems(asList( - new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) - .setPrice(100).setSpuId(1L), - new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true) - .setPrice(50).setSpuId(2L), - new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(4).setSelected(true) - .setPrice(30).setSpuId(3L) - )); - // 保证价格被初始化上 - TradePriceCalculatorHelper.recountPayPrice(result.getItems()); - TradePriceCalculatorHelper.recountAllPrice(result); - - // mock 方法(限时折扣 DiscountActivity 信息) - when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L, 3L)))).thenReturn(asList( - randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") - .setSpuIds(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) - .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(200).setDiscountPrice(70)))), - randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(2000L).setName("活动 2000 号") - .setSpuIds(singletonList(3L)).setConditionType(PromotionConditionTypeEnum.COUNT.getType()) - .setRules(asList(new RewardActivityMatchRespDTO.Rule().setLimit(1).setDiscountPrice(10), - new RewardActivityMatchRespDTO.Rule().setLimit(2).setDiscountPrice(60), // 最大可满足,因为是 4 个 - new RewardActivityMatchRespDTO.Rule().setLimit(10).setDiscountPrice(100)))) - )); - - // 调用 - tradeRewardActivityPriceCalculator.calculate(param, result); - // 断言 Order 部分 - TradePriceCalculateRespBO.Price price = result.getPrice(); - assertEquals(price.getTotalPrice(), 470); - assertEquals(price.getDiscountPrice(), 130); - assertEquals(price.getPointPrice(), 0); - assertEquals(price.getDeliveryPrice(), 0); - assertEquals(price.getCouponPrice(), 0); - assertEquals(price.getPayPrice(), 340); - assertNull(result.getCouponId()); - // 断言:SKU 1 - assertEquals(result.getItems().size(), 3); - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); - assertEquals(orderItem01.getSkuId(), 10L); - assertEquals(orderItem01.getCount(), 2); - assertEquals(orderItem01.getPrice(), 100); - assertEquals(orderItem01.getDiscountPrice(), 40); - assertEquals(orderItem01.getDeliveryPrice(), 0); - assertEquals(orderItem01.getCouponPrice(), 0); - assertEquals(orderItem01.getPointPrice(), 0); - assertEquals(orderItem01.getPayPrice(), 160); - // 断言:SKU 2 - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); - assertEquals(orderItem02.getSkuId(), 20L); - assertEquals(orderItem02.getCount(), 3); - assertEquals(orderItem02.getPrice(), 50); - assertEquals(orderItem02.getDiscountPrice(), 30); - assertEquals(orderItem02.getDeliveryPrice(), 0); - assertEquals(orderItem02.getCouponPrice(), 0); - assertEquals(orderItem02.getPointPrice(), 0); - assertEquals(orderItem02.getPayPrice(), 120); - // 断言:SKU 3 - TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2); - assertEquals(orderItem03.getSkuId(), 30L); - assertEquals(orderItem03.getCount(), 4); - assertEquals(orderItem03.getPrice(), 30); - assertEquals(orderItem03.getDiscountPrice(), 60); - assertEquals(orderItem03.getDeliveryPrice(), 0); - assertEquals(orderItem03.getCouponPrice(), 0); - assertEquals(orderItem03.getPointPrice(), 0); - assertEquals(orderItem03.getPayPrice(), 60); - // 断言:Promotion 部分(第一个) - assertEquals(result.getPromotions().size(), 2); - TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); - assertEquals(promotion01.getId(), 1000L); - assertEquals(promotion01.getName(), "活动 1000 号"); - assertEquals(promotion01.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); - assertEquals(promotion01.getTotalPrice(), 350); - assertEquals(promotion01.getDiscountPrice(), 70); - assertTrue(promotion01.getMatch()); - assertEquals(promotion01.getDescription(), "满减送:省 0.70 元"); - assertEquals(promotion01.getItems().size(), 2); - TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0); - assertEquals(promotionItem011.getSkuId(), 10L); - assertEquals(promotionItem011.getTotalPrice(), 200); - assertEquals(promotionItem011.getDiscountPrice(), 40); - TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1); - assertEquals(promotionItem012.getSkuId(), 20L); - assertEquals(promotionItem012.getTotalPrice(), 150); - assertEquals(promotionItem012.getDiscountPrice(), 30); - // 断言:Promotion 部分(第二个) - TradePriceCalculateRespBO.Promotion promotion02 = result.getPromotions().get(1); - assertEquals(promotion02.getId(), 2000L); - assertEquals(promotion02.getName(), "活动 2000 号"); - assertEquals(promotion02.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); - assertEquals(promotion02.getTotalPrice(), 120); - assertEquals(promotion02.getDiscountPrice(), 60); - assertTrue(promotion02.getMatch()); - assertEquals(promotion02.getDescription(), "满减送:省 0.60 元"); - TradePriceCalculateRespBO.PromotionItem promotionItem02 = promotion02.getItems().get(0); - assertEquals(promotion02.getItems().size(), 1); - assertEquals(promotionItem02.getSkuId(), 30L); - assertEquals(promotionItem02.getTotalPrice(), 120); - assertEquals(promotionItem02.getDiscountPrice(), 60); - } - - @Test - public void testCalculate_notMatch() { - // 准备参数 - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() - .setItems(asList( - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), - new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) - )); - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() - .setPrice(new TradePriceCalculateRespBO.Price()) - .setPromotions(new ArrayList<>()) - .setItems(asList( - new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) - .setPrice(100).setSpuId(1L), - new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true) - .setPrice(50).setSpuId(2L) - )); - // 保证价格被初始化上 - TradePriceCalculatorHelper.recountPayPrice(result.getItems()); - TradePriceCalculatorHelper.recountAllPrice(result); - - // mock 方法(限时折扣 DiscountActivity 信息) - when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L)))).thenReturn(singletonList( - randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") - .setSpuIds(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) - .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(351).setDiscountPrice(70)))) - )); - - // 调用 - tradeRewardActivityPriceCalculator.calculate(param, result); - // 断言 Order 部分 - TradePriceCalculateRespBO.Price price = result.getPrice(); - assertEquals(price.getTotalPrice(), 350); - assertEquals(price.getDiscountPrice(), 0); - assertEquals(price.getPointPrice(), 0); - assertEquals(price.getDeliveryPrice(), 0); - assertEquals(price.getCouponPrice(), 0); - assertEquals(price.getPayPrice(), 350); - assertNull(result.getCouponId()); - // 断言:SKU 1 - assertEquals(result.getItems().size(), 2); - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); - assertEquals(orderItem01.getSkuId(), 10L); - assertEquals(orderItem01.getCount(), 2); - assertEquals(orderItem01.getPrice(), 100); - assertEquals(orderItem01.getDiscountPrice(), 0); - assertEquals(orderItem01.getDeliveryPrice(), 0); - assertEquals(orderItem01.getCouponPrice(), 0); - assertEquals(orderItem01.getPointPrice(), 0); - assertEquals(orderItem01.getPayPrice(), 200); - // 断言:SKU 2 - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); - assertEquals(orderItem02.getSkuId(), 20L); - assertEquals(orderItem02.getCount(), 3); - assertEquals(orderItem02.getPrice(), 50); - assertEquals(orderItem02.getDiscountPrice(), 0); - assertEquals(orderItem02.getDeliveryPrice(), 0); - assertEquals(orderItem02.getCouponPrice(), 0); - assertEquals(orderItem02.getPointPrice(), 0); - assertEquals(orderItem02.getPayPrice(), 150); - // 断言 Promotion 部分 - assertEquals(result.getPromotions().size(), 1); - TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); - assertEquals(promotion01.getId(), 1000L); - assertEquals(promotion01.getName(), "活动 1000 号"); - assertEquals(promotion01.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); - assertEquals(promotion01.getTotalPrice(), 350); - assertEquals(promotion01.getDiscountPrice(), 0); - assertFalse(promotion01.getMatch()); - assertEquals(promotion01.getDescription(), "TODO"); // TODO 芋艿:后面再想想 - assertEquals(promotion01.getItems().size(), 2); - TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0); - assertEquals(promotionItem011.getSkuId(), 10L); - assertEquals(promotionItem011.getTotalPrice(), 200); - assertEquals(promotionItem011.getDiscountPrice(), 0); - TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1); - assertEquals(promotionItem012.getSkuId(), 20L); - assertEquals(promotionItem012.getTotalPrice(), 150); - assertEquals(promotionItem012.getDiscountPrice(), 0); - } - -} diff --git a/win-module-mall/win-module-trade-biz/src/test/resources/application-unit-test.yaml b/win-module-mall/win-module-trade-biz/src/test/resources/application-unit-test.yaml deleted file mode 100644 index 440e6a1c..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,61 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: - # 数据源配置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口(单元测试,使用 16379 端口) - database: 0 # 数据库索引 - -mybatis: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -# 芋道配置项,设置当前项目所有自定义的配置 -win: - info: - base-package: com.win.module - trade: - order: - app-id: 1 - merchant-order-id: 1 - express: - kd-niao: - api-key: xxxx - business-id: xxxxx - kd100: - customer: xxxxx - key: xxxxx - client: not_provide \ No newline at end of file diff --git a/win-module-mall/win-module-trade-biz/src/test/resources/logback.xml b/win-module-mall/win-module-trade-biz/src/test/resources/logback.xml deleted file mode 100644 index daf756bf..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/win-module-mall/win-module-trade-biz/src/test/resources/sql/clean.sql b/win-module-mall/win-module-trade-biz/src/test/resources/sql/clean.sql deleted file mode 100644 index f02fdcaf..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,6 +0,0 @@ -DELETE FROM trade_order; -DELETE FROM trade_order_item; -DELETE FROM trade_after_sale; -DELETE FROM trade_after_sale_log; -DELETE FROM trade_brokerage_user; -DELETE FROM trade_brokerage_record; diff --git a/win-module-mall/win-module-trade-biz/src/test/resources/sql/create_tables.sql b/win-module-mall/win-module-trade-biz/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 4c0e0fce..00000000 --- a/win-module-mall/win-module-trade-biz/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,166 +0,0 @@ -CREATE TABLE IF NOT EXISTS "trade_order" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "no" varchar NOT NULL, - "type" int NOT NULL, - "terminal" int NOT NULL, - "user_id" bigint NOT NULL, - "user_ip" varchar NOT NULL, - "user_remark" varchar, - "status" int NOT NULL, - "product_count" int NOT NULL, - "cancel_type" int, - "remark" varchar, - "pay_status" bit NOT NULL, - "pay_time" datetime, - "finish_time" datetime, - "cancel_time" datetime, - "original_price" int NOT NULL, - "order_price" int NOT NULL, - "discount_price" int NOT NULL, - "delivery_price" int NOT NULL, - "adjust_price" int NOT NULL, - "pay_price" int NOT NULL, - "pay_order_id" bigint, - "pay_channel_code" varchar, - "delivery_template_id" bigint, - "logistics_id" bigint, - "logistics_no" varchar, - "delivery_time" datetime, - "receive_time" datetime, - "receiver_name" varchar NOT NULL, - "receiver_mobile" varchar NOT NULL, - "receiver_area_id" int NOT NULL, - "receiver_post_code" int, - "receiver_detail_address" varchar NOT NULL, - "after_sale_status" int NOT NULL, - "refund_price" int NOT NULL, - "coupon_id" bigint NOT NULL, - "coupon_price" int NOT NULL, - "point_price" int NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '交易订单表'; - -CREATE TABLE IF NOT EXISTS "trade_order_item" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "order_id" bigint NOT NULL, - "spu_id" bigint NOT NULL, - "spu_name" varchar NOT NULL, - "sku_id" bigint NOT NULL, - "properties" varchar, - "pic_url" varchar, - "count" int NOT NULL, - "original_price" int NOT NULL, - "original_unit_price" int NOT NULL, - "discount_price" int NOT NULL, - "pay_price" int NOT NULL, - "order_part_price" int NOT NULL, - "order_divide_price" int NOT NULL, - "after_sale_status" int NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '交易订单明细表'; - -CREATE TABLE IF NOT EXISTS "trade_after_sale" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "no" varchar NOT NULL, - "status" int NOT NULL, - "type" int NOT NULL, - "way" int NOT NULL, - "user_id" bigint NOT NULL, - "apply_reason" varchar NOT NULL, - "apply_description" varchar, - "apply_pic_urls" varchar, - "order_id" bigint NOT NULL, - "order_no" varchar NOT NULL, - "order_item_id" bigint NOT NULL, - "spu_id" bigint NOT NULL, - "spu_name" varchar NOT NULL, - "sku_id" bigint NOT NULL, - "properties" varchar, - "pic_url" varchar, - "count" int NOT NULL, - "audit_time" varchar, - "audit_user_id" bigint, - "audit_reason" varchar, - "refund_price" int NOT NULL, - "pay_refund_id" bigint, - "refund_time" varchar, - "logistics_id" bigint, - "logistics_no" varchar, - "delivery_time" varchar, - "receive_time" varchar, - "receive_reason" varchar, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '交易售后表'; - -CREATE TABLE IF NOT EXISTS "trade_after_sale_log" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "user_type" int NOT NULL, - "after_sale_id" bigint NOT NULL, - "order_id" bigint NOT NULL, - "order_item_id" bigint NOT NULL, - "before_status" int, - "after_status" int NOT NULL, - "content" varchar NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT '交易售后日志'; - -CREATE TABLE IF NOT EXISTS "trade_brokerage_user" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "bind_user_id" bigint NOT NULL, - "bind_user_time" varchar, - "brokerage_enabled" bit NOT NULL, - "brokerage_time" varchar, - "price" int NOT NULL, - "frozen_price" int NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint NOT NULL DEFAULT '0', - PRIMARY KEY ("id") -) COMMENT '分销用户'; -CREATE TABLE IF NOT EXISTS "trade_brokerage_record" -( - "id" int NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "biz_id" varchar NOT NULL, - "biz_type" varchar NOT NULL, - "title" varchar NOT NULL, - "price" int NOT NULL, - "total_price" int NOT NULL, - "description" varchar NOT NULL, - "status" varchar NOT NULL, - "frozen_days" int NOT NULL, - "unfreeze_time" varchar, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '佣金记录'; \ No newline at end of file diff --git a/win-module-member/pom.xml b/win-module-member/pom.xml deleted file mode 100644 index 1502fabc..00000000 --- a/win-module-member/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - com.win - win - ${revision} - - 4.0.0 - - win-module-member-api - win-module-member-biz - - win-module-member - pom - - ${project.artifactId} - - member 模块,我们放会员业务。 - 例如说:会员中心等等 - - - diff --git a/win-module-member/win-module-member-api/pom.xml b/win-module-member/win-module-member-api/pom.xml deleted file mode 100644 index 1e57d552..00000000 --- a/win-module-member/win-module-member-api/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - com.win - win-module-member - ${revision} - - 4.0.0 - win-module-member-api - jar - - ${project.artifactId} - - member 模块 API,暴露给其它模块调用 - - - - - com.win - win-common - - - - diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/AddressApi.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/AddressApi.java deleted file mode 100644 index d5d2cd63..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/AddressApi.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.member.api.address; - -import com.win.module.member.api.address.dto.AddressRespDTO; - -/** - * 用户收件地址 API 接口 - * - * @author 芋道源码 - */ -public interface AddressApi { - - /** - * 获得用户收件地址 - * - * @param id 收件地址编号 - * @param userId 用户编号 - * @return 用户收件地址 - */ - AddressRespDTO getAddress(Long id, Long userId); - - /** - * 获得用户默认收件地址 - * - * @param userId 用户编号 - * @return 用户收件地址 - */ - AddressRespDTO getDefaultAddress(Long userId); - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/dto/AddressRespDTO.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/dto/AddressRespDTO.java deleted file mode 100644 index 7f1de20c..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/address/dto/AddressRespDTO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.member.api.address.dto; - -import lombok.Data; - -/** - * 用户收件地址 Response DTO - * - * @author 芋道源码 - */ -@Data -public class AddressRespDTO { - - /** - * 编号 - */ - private Long id; - /** - * 用户编号 - */ - private Long userId; - /** - * 收件人名称 - */ - private String name; - /** - * 手机号 - */ - private String mobile; - /** - * 地区编号 - */ - private Integer areaId; - /** - * 收件详细地址 - */ - private String detailAddress; - /** - * 是否默认 - */ - private Boolean defaultStatus; - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/level/MemberLevelApi.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/level/MemberLevelApi.java deleted file mode 100644 index aa82c891..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/level/MemberLevelApi.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.api.level; - -import com.win.module.member.enums.MemberExperienceBizTypeEnum; - -/** - * 会员等级 API 接口 - * - * @author owen - */ -public interface MemberLevelApi { - - /** - * 增加会员经验 - * - * @param userId 会员ID - * @param experience 经验 - * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum} - * @param bizId 业务编号 - */ - void addExperience(Long userId, Integer experience, Integer bizType, String bizId); - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/package-info.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/package-info.java deleted file mode 100644 index 235e2080..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * member API 包,定义暴露给其它模块的 API - */ -package com.win.module.member.api; diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/point/MemberPointApi.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/point/MemberPointApi.java deleted file mode 100644 index 12a229a2..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/point/MemberPointApi.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.api.point; - -import com.win.module.member.enums.point.MemberPointBizTypeEnum; - -/** - * 用户积分的 API 接口 - * - * @author owen - */ -public interface MemberPointApi { - - /** - * 增加用户积分 - * - * @param userId 用户编号 - * @param point 积分 - * @param bizType 业务类型 {@link MemberPointBizTypeEnum} - * @param bizId 业务编号 - */ - void addPoint(Long userId, Integer point, Integer bizType, String bizId); - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/MemberUserApi.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/MemberUserApi.java deleted file mode 100644 index 493417a8..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/MemberUserApi.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.win.module.member.api.user; - -import com.win.module.member.api.user.dto.MemberUserRespDTO; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 会员用户的 API 接口 - * - * @author 芋道源码 - */ -public interface MemberUserApi { - - /** - * 获得会员用户信息 - * - * @param id 用户编号 - * @return 用户信息 - */ - MemberUserRespDTO getUser(Long id); - - /** - * 获得会员用户信息们 - * - * @param ids 用户编号的数组 - * @return 用户信息们 - */ - List getUserList(Collection ids); - - /** - * 获得会员用户 Map - * - * @param ids 用户编号的数组 - * @return 会员用户 Map - */ - default Map getUserMap(Collection ids) { - return convertMap(getUserList(ids), MemberUserRespDTO::getId); - } - - /** - * 基于用户昵称,模糊匹配用户列表 - * - * @param nickname 用户昵称,模糊匹配 - * @return 用户信息的列表 - */ - List getUserListByNickname(String nickname); - - /** - * 基于手机号,精准匹配用户 - * - * @param mobile 手机号 - * @return 用户信息 - */ - MemberUserRespDTO getUserByMobile(String mobile); -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/dto/MemberUserRespDTO.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/dto/MemberUserRespDTO.java deleted file mode 100644 index df2f6e60..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/api/user/dto/MemberUserRespDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.member.api.user.dto; - -import com.win.framework.common.enums.CommonStatusEnum; -import lombok.Data; - -/** - * 用户信息 Response DTO - * - * @author 芋道源码 - */ -@Data -public class MemberUserRespDTO { - - /** - * 用户ID - */ - private Long id; - /** - * 用户昵称 - */ - private String nickname; - /** - * 帐号状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 用户头像 - */ - private String avatar; - /** - * 手机 - */ - private String mobile; - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/DictTypeConstants.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/DictTypeConstants.java deleted file mode 100644 index 7d47b81f..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/DictTypeConstants.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.member.enums; - -/** - * Member 字典类型的枚举类 - * - * @author owen - */ -public interface DictTypeConstants { - - /** - * 会员经验记录 - 业务类型 - */ - String MEMBER_EXPERIENCE_BIZ_TYPE = "member_experience_biz_type"; - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/ErrorCodeConstants.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/ErrorCodeConstants.java deleted file mode 100644 index b9a90e11..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.member.enums; - -import com.win.framework.common.exception.ErrorCode; - -/** - * Member 错误码枚举类 - *

- * member 系统,使用 1-004-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== 用户相关 1-004-001-000 ============ - ErrorCode USER_NOT_EXISTS = new ErrorCode(1_004_001_000, "用户不存在"); - ErrorCode USER_MOBILE_NOT_EXISTS = new ErrorCode(1_004_001_001, "手机号未注册用户"); - ErrorCode USER_MOBILE_USED = new ErrorCode(1_004_001_002, "修改手机失败,该手机号({})已经被使用"); - - // ========== AUTH 模块 1-004-003-000 ========== - ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1_004_003_000, "登录失败,账号密码不正确"); - ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1_004_003_001, "登录失败,账号被禁用"); - ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_004_003_005, "未绑定账号,需要进行绑定"); - ErrorCode AUTH_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_004_003_006, "获得手机号失败"); - ErrorCode AUTH_MOBILE_USED = new ErrorCode(1_004_003_007, "手机号已经被使用"); - - // ========== 用户收件地址 1-004-004-000 ========== - ErrorCode ADDRESS_NOT_EXISTS = new ErrorCode(1_004_004_000, "用户收件地址不存在"); - - //========== 用户标签 1-004-006-000 ========== - ErrorCode TAG_NOT_EXISTS = new ErrorCode(1_004_006_000, "用户标签不存在"); - ErrorCode TAG_NAME_EXISTS = new ErrorCode(1_004_006_001, "用户标签已经存在"); - ErrorCode TAG_HAS_USER = new ErrorCode(1_004_006_002, "用户标签下存在用户,无法删除"); - - //========== 积分配置 1-004-007-000 ========== - - //========== 积分记录 1-004-008-000 ========== - ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1_004_008_000, "用户积分记录业务类型不支持"); - - //========== 签到配置 1-004-009-000 ========== - ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1_004_009_000, "签到天数规则不存在"); - ErrorCode SIGN_IN_CONFIG_EXISTS = new ErrorCode(1_004_009_001, "签到天数规则已存在"); - - //========== 签到配置 1-004-010-000 ========== - - - //========== 用户等级 1-004-011-000 ========== - ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1_004_011_000, "用户等级不存在"); - ErrorCode LEVEL_NAME_EXISTS = new ErrorCode(1_004_011_001, "用户等级名称[{}]已被使用"); - ErrorCode LEVEL_VALUE_EXISTS = new ErrorCode(1_004_011_002, "用户等级值[{}]已被[{}]使用"); - ErrorCode LEVEL_EXPERIENCE_MIN = new ErrorCode(1_004_011_003, "升级经验必须大于上一个等级[{}]设置的升级经验[{}]"); - ErrorCode LEVEL_EXPERIENCE_MAX = new ErrorCode(1_004_011_004, "升级经验必须小于下一个等级[{}]设置的升级经验[{}]"); - ErrorCode LEVEL_HAS_USER = new ErrorCode(1_004_011_005, "用户等级下存在用户,无法删除"); - - ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1_004_011_201, "用户经验业务类型不支持"); - - //========== 用户分组 1-004-012-000 ========== - ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1_004_012_000, "用户分组不存在"); - ErrorCode GROUP_HAS_USER = new ErrorCode(1_004_012_001, "用户分组下存在用户,无法删除"); - -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/MemberExperienceBizTypeEnum.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/MemberExperienceBizTypeEnum.java deleted file mode 100644 index c19c6974..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/MemberExperienceBizTypeEnum.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.member.enums; - -import cn.hutool.core.util.EnumUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 会员经验 - 业务类型 - * - * @author owen - */ -@Getter -@AllArgsConstructor -public enum MemberExperienceBizTypeEnum { - - /** - * 管理员调整、邀请新用户、下单、退单、签到、抽奖 - */ - ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true), - INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true), - ORDER(2, "下单奖励", "下单获得 {} 经验", true), - REFUND(3, "退单扣除", "退单获得 {} 经验", false), - SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true), - LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", true), - ; - - /** - * 业务类型 - */ - private final int type; - /** - * 标题 - */ - private final String title; - /** - * 描述 - */ - private final String description; - /** - * 是否为扣减积分 - */ - private final boolean add; - - public static MemberExperienceBizTypeEnum getByType(Integer type) { - return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, - e -> Objects.equals(type, e.getType())); - } -} diff --git a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/point/MemberPointBizTypeEnum.java b/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/point/MemberPointBizTypeEnum.java deleted file mode 100644 index 63cd1ecd..00000000 --- a/win-module-member/win-module-member-api/src/main/java/com/win/module/member/enums/point/MemberPointBizTypeEnum.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.member.enums.point; - -import cn.hutool.core.util.EnumUtil; -import com.win.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 会员积分的业务类型枚举 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum MemberPointBizTypeEnum implements IntArrayValuable { - - SIGN(1, "签到", "签到获得 {} 积分", true), - ORDER_BUY(10, "订单消费", "下单获得 {} 积分", true), - ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", false); // 退回积分 - - /** - * 类型 - */ - private final Integer type; - /** - * 名字 - */ - private final String name; - /** - * 描述 - */ - private final String description; - /** - * 是否为扣减积分 - */ - private final boolean add; - - @Override - public int[] array() { - return new int[0]; - } - - public static MemberPointBizTypeEnum getByType(Integer type) { - return EnumUtil.getBy(MemberPointBizTypeEnum.class, - e -> Objects.equals(type, e.getType())); - } - -} diff --git a/win-module-member/win-module-member-biz/pom.xml b/win-module-member/win-module-member-biz/pom.xml deleted file mode 100644 index f00ef7ae..00000000 --- a/win-module-member/win-module-member-biz/pom.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - com.win - win-module-member - ${revision} - - 4.0.0 - win-module-member-biz - jar - - ${project.artifactId} - - member 模块,我们放会员业务。 - 例如说:会员中心等等 - - - - - com.win - win-module-member-api - ${revision} - - - com.win - win-module-system-api - ${revision} - - - com.win - win-module-infra-api - ${revision} - - - - - com.win - win-spring-boot-starter-biz-operatelog - - - com.win - win-spring-boot-starter-biz-tenant - - - com.win - win-spring-boot-starter-biz-weixin - - - - - com.win - win-spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-validation - - - - - com.win - win-spring-boot-starter-mybatis - - - - com.win - win-spring-boot-starter-redis - - - - - com.win - win-spring-boot-starter-mq - - - - - com.win - win-spring-boot-starter-test - test - - - - - com.win - win-spring-boot-starter-excel - - - - com.win - win-spring-boot-starter-biz-ip - - - - - diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/address/AddressApiImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/address/AddressApiImpl.java deleted file mode 100644 index af981260..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/address/AddressApiImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.member.api.address; - -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.member.convert.address.AddressConvert; -import com.win.module.member.service.address.AddressService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * 用户收件地址 API 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class AddressApiImpl implements AddressApi { - - @Resource - private AddressService addressService; - - @Override - public AddressRespDTO getAddress(Long id, Long userId) { - return AddressConvert.INSTANCE.convert02(addressService.getAddress(userId, id)); - } - - @Override - public AddressRespDTO getDefaultAddress(Long userId) { - return AddressConvert.INSTANCE.convert02(addressService.getDefaultUserAddress(userId)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/level/MemberLevelApiImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/level/MemberLevelApiImpl.java deleted file mode 100644 index efab39b7..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/level/MemberLevelApiImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.member.api.level; - -import com.win.module.member.enums.MemberExperienceBizTypeEnum; -import com.win.module.member.service.level.MemberLevelService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT; - -/** - * 会员等级 API 实现类 - * - * @author owen - */ -@Service -@Validated -public class MemberLevelApiImpl implements MemberLevelApi { - - @Resource - private MemberLevelService memberLevelService; - - @Override - public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) { - MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType); - if (bizTypeEnum == null) { - throw exception(EXPERIENCE_BIZ_NOT_SUPPORT); - } - memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/package-info.java deleted file mode 100644 index bc71197c..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.member.api; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/point/MemberPointApiImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/point/MemberPointApiImpl.java deleted file mode 100644 index 63d78709..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/point/MemberPointApiImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.member.api.point; - -import com.win.module.member.enums.point.MemberPointBizTypeEnum; -import com.win.module.member.service.point.MemberPointRecordService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; - -/** - * 用户积分的 API 实现类 - * - * @author owen - */ -@Service -@Validated -public class MemberPointApiImpl implements MemberPointApi { - - @Resource - private MemberPointRecordService memberPointRecordService; - - @Override - public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { - MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); - if (bizTypeEnum == null) { - throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); - } - memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/user/MemberUserApiImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/user/MemberUserApiImpl.java deleted file mode 100644 index 78edd09a..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/api/user/MemberUserApiImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.member.api.user; - -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.convert.user.MemberUserConvert; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.service.user.MemberUserService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -/** - * 会员用户的 API 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class MemberUserApiImpl implements MemberUserApi { - - @Resource - private MemberUserService userService; - - @Override - public MemberUserRespDTO getUser(Long id) { - MemberUserDO user = userService.getUser(id); - return MemberUserConvert.INSTANCE.convert2(user); - } - - @Override - public List getUserList(Collection ids) { - return MemberUserConvert.INSTANCE.convertList2(userService.getUserList(ids)); - } - - @Override - public List getUserListByNickname(String nickname) { - return MemberUserConvert.INSTANCE.convertList2(userService.getUserListByNickname(nickname)); - } - - @Override - public MemberUserRespDTO getUserByMobile(String mobile) { - return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/AddressController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/AddressController.java deleted file mode 100644 index b8c7d889..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/AddressController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.member.controller.admin.address; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.member.controller.admin.address.vo.AddressRespVO; -import com.win.module.member.convert.address.AddressConvert; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; -import com.win.module.member.service.address.AddressService; -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.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 java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 用户收件地址") -@RestController -@RequestMapping("/member/address") -@Validated -public class AddressController { - - @Resource - private AddressService addressService; - - @GetMapping("/list") - @Operation(summary = "获得用户收件地址列表") - @Parameter(name = "userId", description = "用户编号", required = true) - @PreAuthorize("@ss.hasPermission('member:user:query')") - public CommonResult> getAddressList(@RequestParam("userId") Long userId) { - List list = addressService.getAddressList(userId); - return success(AddressConvert.INSTANCE.convertList2(list)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/package-info.java deleted file mode 100644 index 894191a4..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.member.controller.admin.address; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressBaseVO.java deleted file mode 100644 index 986e8dcd..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressBaseVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.member.controller.admin.address.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.util.*; -import javax.validation.constraints.*; - -/** - * 用户收件地址 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class AddressBaseVO { - - @Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - @NotNull(message = "收件人名称不能为空") - private String name; - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "手机号不能为空") - private String mobile; - - @Schema(description = "地区编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "15716") - @NotNull(message = "地区编码不能为空") - private Long areaId; - - @Schema(description = "收件详细地址", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "收件详细地址不能为空") - private String detailAddress; - - @Schema(description = "是否默认", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "是否默认不能为空") - private Boolean defaultStatus; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressRespVO.java deleted file mode 100644 index 565c4942..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/address/vo/AddressRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.member.controller.admin.address.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 AddressRespVO extends AddressBaseVO { - - @Schema(description = "收件地址编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7380") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/MemberGroupController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/MemberGroupController.java deleted file mode 100644 index 78095d74..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/MemberGroupController.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.win.module.member.controller.admin.group; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.group.vo.*; -import com.win.module.member.convert.group.MemberGroupConvert; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import com.win.module.member.service.group.MemberGroupService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - - -@Tag(name = "管理后台 - 用户分组") -@RestController -@RequestMapping("/member/group") -@Validated -public class MemberGroupController { - - @Resource - private MemberGroupService groupService; - - @PostMapping("/create") - @Operation(summary = "创建用户分组") - @PreAuthorize("@ss.hasPermission('member:group:create')") - public CommonResult createGroup(@Valid @RequestBody MemberGroupCreateReqVO createReqVO) { - return success(groupService.createGroup(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新用户分组") - @PreAuthorize("@ss.hasPermission('member:group:update')") - public CommonResult updateGroup(@Valid @RequestBody MemberGroupUpdateReqVO updateReqVO) { - groupService.updateGroup(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除用户分组") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('member:group:delete')") - public CommonResult deleteGroup(@RequestParam("id") Long id) { - groupService.deleteGroup(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得用户分组") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('member:group:query')") - public CommonResult getGroup(@RequestParam("id") Long id) { - MemberGroupDO group = groupService.getGroup(id); - return success(MemberGroupConvert.INSTANCE.convert(group)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取会员分组精简信息列表", description = "只包含被开启的会员分组,主要用于前端的下拉选项") - public CommonResult> getSimpleGroupList() { - // 获用户列表,只要开启状态的 - List list = groupService.getEnableGroupList(); - return success(MemberGroupConvert.INSTANCE.convertSimpleList(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得用户分组分页") - @PreAuthorize("@ss.hasPermission('member:group:query')") - public CommonResult> getGroupPage(@Valid MemberGroupPageReqVO pageVO) { - PageResult pageResult = groupService.getGroupPage(pageVO); - return success(MemberGroupConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupBaseVO.java deleted file mode 100644 index a9565092..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupBaseVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.member.controller.admin.group.vo; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 用户分组 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberGroupBaseVO { - - @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "购物达人") - @NotNull(message = "名称不能为空") - private String name; - - @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String remark; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java deleted file mode 100644 index 569c726b..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.member.controller.admin.group.vo; - -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 MemberGroupCreateReqVO extends MemberGroupBaseVO { - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java deleted file mode 100644 index 844c85a9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.member.controller.admin.group.vo; - -import com.win.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 com.win.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 MemberGroupPageReqVO extends PageParam { - - @Schema(description = "名称", example = "购物达人") - private String name; - - @Schema(description = "状态", example = "1") - private Integer status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupRespVO.java deleted file mode 100644 index 5cafa003..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.controller.admin.group.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 MemberGroupRespVO extends MemberGroupBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20357") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java deleted file mode 100644 index d26d36ae..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.member.controller.admin.group.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "管理后台 - 用户分组 Response VO") -@Data -@ToString(callSuper = true) -public class MemberGroupSimpleRespVO { - - @Schema(description = "编号", example = "6103") - private Long id; - - @Schema(description = "等级名称", example = "芋艿") - private String name; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java deleted file mode 100644 index 80bae58d..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.member.controller.admin.group.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberGroupUpdateReqVO extends MemberGroupBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20357") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberExperienceRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberExperienceRecordController.java deleted file mode 100644 index 04ec823c..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberExperienceRecordController.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.member.controller.admin.level; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO; -import com.win.module.member.controller.admin.level.vo.experience.MemberExperienceRecordRespVO; -import com.win.module.member.convert.level.MemberExperienceRecordConvert; -import com.win.module.member.dal.dataobject.level.MemberExperienceRecordDO; -import com.win.module.member.service.level.MemberExperienceRecordService; -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.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 javax.validation.Valid; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 会员经验记录") -@RestController -@RequestMapping("/member/experience-record") -@Validated -public class MemberExperienceRecordController { - - @Resource - private MemberExperienceRecordService experienceLogService; - - @GetMapping("/get") - @Operation(summary = "获得会员经验记录") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('member:experience-record:query')") - public CommonResult getExperienceRecord(@RequestParam("id") Long id) { - MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id); - return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog)); - } - - @GetMapping("/page") - @Operation(summary = "获得会员经验记录分页") - @PreAuthorize("@ss.hasPermission('member:experience-record:query')") - public CommonResult> getExperienceRecordPage( - @Valid MemberExperienceRecordPageReqVO pageVO) { - PageResult pageResult = experienceLogService.getExperienceRecordPage(pageVO); - return success(MemberExperienceRecordConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelController.java deleted file mode 100644 index 92aa3853..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelController.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.win.module.member.controller.admin.level; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.member.controller.admin.level.vo.level.*; -import com.win.module.member.convert.level.MemberLevelConvert; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.service.level.MemberLevelService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 会员等级") -@RestController -@RequestMapping("/member/level") -@Validated -public class MemberLevelController { - - @Resource - private MemberLevelService levelService; - - @PostMapping("/create") - @Operation(summary = "创建会员等级") - @PreAuthorize("@ss.hasPermission('member:level:create')") - public CommonResult createLevel(@Valid @RequestBody MemberLevelCreateReqVO createReqVO) { - return success(levelService.createLevel(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新会员等级") - @PreAuthorize("@ss.hasPermission('member:level:update')") - public CommonResult updateLevel(@Valid @RequestBody MemberLevelUpdateReqVO updateReqVO) { - levelService.updateLevel(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除会员等级") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('member: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('member:level:query')") - public CommonResult getLevel(@RequestParam("id") Long id) { - MemberLevelDO level = levelService.getLevel(id); - return success(MemberLevelConvert.INSTANCE.convert(level)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取会员等级精简信息列表", description = "只包含被开启的会员等级,主要用于前端的下拉选项") - public CommonResult> getSimpleLevelList() { - // 获用户列表,只要开启状态的 - List list = levelService.getEnableLevelList(); - // 排序后,返回给前端 - return success(MemberLevelConvert.INSTANCE.convertSimpleList(list)); - } - - @GetMapping("/list") - @Operation(summary = "获得会员等级列表") - @PreAuthorize("@ss.hasPermission('member:level:query')") - public CommonResult> getLevelList(@Valid MemberLevelListReqVO listReqVO) { - List result = levelService.getLevelList(listReqVO); - return success(MemberLevelConvert.INSTANCE.convertList(result)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelRecordController.java deleted file mode 100644 index 3d5597a2..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/MemberLevelRecordController.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.member.controller.admin.level; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.record.MemberLevelRecordPageReqVO; -import com.win.module.member.controller.admin.level.vo.record.MemberLevelRecordRespVO; -import com.win.module.member.convert.level.MemberLevelRecordConvert; -import com.win.module.member.dal.dataobject.level.MemberLevelRecordDO; -import com.win.module.member.service.level.MemberLevelRecordService; -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.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 javax.validation.Valid; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 会员等级记录") -@RestController -@RequestMapping("/member/level-record") -@Validated -public class MemberLevelRecordController { - - @Resource - private MemberLevelRecordService levelLogService; - - @GetMapping("/get") - @Operation(summary = "获得会员等级记录") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('member:level-record:query')") - public CommonResult getLevelRecord(@RequestParam("id") Long id) { - MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id); - return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog)); - } - - @GetMapping("/page") - @Operation(summary = "获得会员等级记录分页") - @PreAuthorize("@ss.hasPermission('member:level-record:query')") - public CommonResult> getLevelRecordPage( - @Valid MemberLevelRecordPageReqVO pageVO) { - PageResult pageResult = levelLogService.getLevelRecordPage(pageVO); - return success(MemberLevelRecordConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java deleted file mode 100644 index 2cd98d52..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.experience; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 会员经验记录 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberExperienceRecordBaseVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3638") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12164") - @NotNull(message = "业务编号不能为空") - private String bizId; - - @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "业务类型不能为空") - private Integer bizType; - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "增加经验") - @NotNull(message = "标题不能为空") - private String title; - - @Schema(description = "经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "经验不能为空") - private Integer experience; - - @Schema(description = "变更后的经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "变更后的经验不能为空") - private Integer totalExperience; - - @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单增加 100 经验") - @NotNull(message = "描述不能为空") - private String description; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java deleted file mode 100644 index 43514d22..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.experience; - -import com.win.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 com.win.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 MemberExperienceRecordPageReqVO extends PageParam { - - @Schema(description = "用户编号", example = "3638") - private Long userId; - - @Schema(description = "业务编号", example = "12164") - private String bizId; - - @Schema(description = "业务类型", example = "1") - private Integer bizType; - - @Schema(description = "标题", example = "增加经验") - private String title; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java deleted file mode 100644 index c6f764cb..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.experience; - -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 MemberExperienceRecordRespVO extends MemberExperienceRecordBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19610") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java deleted file mode 100644 index daa6ce20..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.level; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.Range; -import org.hibernate.validator.constraints.URL; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Positive; - -/** - * 会员等级 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberLevelBaseVO { - - @Schema(description = "等级名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - @NotBlank(message = "等级名称不能为空") - private String name; - - @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "升级经验不能为空") - @Positive(message = "升级经验必须大于 0") - private Integer experience; - - @Schema(description = "等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "等级不能为空") - @Positive(message = "等级必须大于 0") - private Integer level; - - @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "98") - @NotNull(message = "享受折扣不能为空") - @Range(min = 0, max = 100, message = "享受折扣的范围为 0-100") - private Integer discountPercent; - - @Schema(description = "等级图标", example = "https://www.iocoder.cn/win.jpg") - @URL(message = "等级图标必须是 URL 格式") - private String icon; - - @Schema(description = "等级背景图", example = "https://www.iocoder.cn/win.jpg") - @URL(message = "等级背景图必须是 URL 格式") - private String backgroundUrl; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java deleted file mode 100644 index b106b549..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.level; - -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 MemberLevelCreateReqVO extends MemberLevelBaseVO { - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java deleted file mode 100644 index 3c2e800c..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.level; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "管理后台 - 会员等级列表筛选 Request VO") -@Data -@ToString(callSuper = true) -public class MemberLevelListReqVO { - - @Schema(description = "等级名称", example = "芋艿") - private String name; - - @Schema(description = "状态", example = "1") - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java deleted file mode 100644 index a6a53d40..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.level; - -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 MemberLevelRespVO extends MemberLevelBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6103") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java deleted file mode 100644 index af129393..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.level; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.ToString; - -@Schema(description = "管理后台 - 会员等级 Response VO") -@Data -@ToString(callSuper = true) -public class MemberLevelSimpleRespVO { - - @Schema(description = "编号", example = "6103") - private Long id; - - @Schema(description = "等级名称", example = "芋艿") - private String name; - - @Schema(description = "等级图标", example = "https://www.iocoder.cn/win.jpg") - private String icon; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java deleted file mode 100644 index 502fa516..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.level; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberLevelUpdateReqVO extends MemberLevelBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6103") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordBaseVO.java deleted file mode 100644 index 22c5adf9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordBaseVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 会员等级记录 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberLevelRecordBaseVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25923") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "等级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25985") - @NotNull(message = "等级编号不能为空") - private Long levelId; - - @Schema(description = "会员等级", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "会员等级不能为空") - private Integer level; - - @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319") - @NotNull(message = "享受折扣不能为空") - private Integer discountPercent; - - @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319") - @NotNull(message = "升级经验不能为空") - private Integer experience; - - @Schema(description = "会员此时的经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319") - @NotNull(message = "会员此时的经验不能为空") - private Integer userExperience; - - @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要") - @NotNull(message = "备注不能为空") - private String remark; - - @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级为金牌会员") - @NotNull(message = "描述不能为空") - private String description; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordPageReqVO.java deleted file mode 100644 index 1aa0d409..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.record; - -import com.win.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 com.win.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 MemberLevelRecordPageReqVO extends PageParam { - - @Schema(description = "用户编号", example = "25923") - private Long userId; - - @Schema(description = "等级编号", example = "25985") - private Long levelId; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordRespVO.java deleted file mode 100644 index 534ffb0a..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/level/vo/record/MemberLevelRecordRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.controller.admin.level.vo.record; - -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 MemberLevelRecordRespVO extends MemberLevelRecordBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8741") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointConfigController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointConfigController.java deleted file mode 100644 index ac3fdf97..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointConfigController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.member.controller.admin.point; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.member.controller.admin.point.vo.config.MemberPointConfigRespVO; -import com.win.module.member.controller.admin.point.vo.config.MemberPointConfigSaveReqVO; -import com.win.module.member.convert.point.MemberPointConfigConvert; -import com.win.module.member.dal.dataobject.point.MemberPointConfigDO; -import com.win.module.member.service.point.MemberPointConfigService; -import io.swagger.v3.oas.annotations.Operation; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 会员积分设置") -@RestController -@RequestMapping("/member/point/config") -@Validated -public class MemberPointConfigController { - - @Resource - private MemberPointConfigService memberPointConfigService; - - @PutMapping("/save") - @Operation(summary = "保存会员积分配置") - @PreAuthorize("@ss.hasPermission('point:config:save')") - public CommonResult savePointConfig(@Valid @RequestBody MemberPointConfigSaveReqVO saveReqVO) { - memberPointConfigService.savePointConfig(saveReqVO); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得会员积分配置") - @PreAuthorize("@ss.hasPermission('point:config:query')") - public CommonResult getPointConfig() { - MemberPointConfigDO config = memberPointConfigService.getPointConfig(); - return success(MemberPointConfigConvert.INSTANCE.convert(config)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointRecordController.java deleted file mode 100644 index 1487a14b..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/MemberPointRecordController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.member.controller.admin.point; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; -import com.win.module.member.controller.admin.point.vo.recrod.MemberPointRecordRespVO; -import com.win.module.member.convert.point.MemberPointRecordConvert; -import com.win.module.member.dal.dataobject.point.MemberPointRecordDO; -import com.win.module.member.service.point.MemberPointRecordService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.util.CollectionUtils; -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; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 签到记录") -@RestController -@RequestMapping("/member/point/record") -@Validated -public class MemberPointRecordController { - - @Resource - private MemberPointRecordService pointRecordService; - - @Resource - private MemberUserApi memberUserApi; - - @GetMapping("/page") - @Operation(summary = "获得用户积分记录分页") - @PreAuthorize("@ss.hasPermission('point:record:query')") - public CommonResult> getPointRecordPage(@Valid MemberPointRecordPageReqVO pageVO) { - // 执行分页查询 - PageResult pageResult = pointRecordService.getPointRecordPage(pageVO); - if (CollectionUtils.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 拼接结果返回 - List users = memberUserApi.getUserList( - convertSet(pageResult.getList(), MemberPointRecordDO::getUserId)); - return success(MemberPointRecordConvert.INSTANCE.convertPage(pageResult, users)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigBaseVO.java deleted file mode 100644 index 9c1c7069..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigBaseVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.member.controller.admin.point.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 会员积分配置 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberPointConfigBaseVO { - - @Schema(description = "积分抵扣开关", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "积分抵扣开发不能为空") - private Boolean tradeDeductEnable; - - @Schema(description = "积分抵扣,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "13506") - @NotNull(message = "积分抵扣不能为空") - private Integer tradeDeductUnitPrice; - - @Schema(description = "积分抵扣最大值", requiredMode = Schema.RequiredMode.REQUIRED, example = "32428") - @NotNull(message = "积分抵扣最大值不能为空") - private Integer tradeDeductMaxPrice; - - @Schema(description = "1 元赠送多少分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "1 元赠送积分不能为空") - private Integer tradeGivePoint; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigRespVO.java deleted file mode 100644 index 5580ec4b..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigRespVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.member.controller.admin.point.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - 会员积分配置 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberPointConfigRespVO extends MemberPointConfigBaseVO { - - @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigSaveReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigSaveReqVO.java deleted file mode 100644 index eac5e3c0..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/config/MemberPointConfigSaveReqVO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.win.module.member.controller.admin.point.vo.config; - -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 MemberPointConfigSaveReqVO extends MemberPointConfigBaseVO { -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java deleted file mode 100644 index cf7ea68a..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.member.controller.admin.point.vo.recrod; - -import com.win.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 MemberPointRecordPageReqVO extends PageParam { - - @Schema(description = "用户昵称", example = "张三") - private String nickname; - - @Schema(description = "用户编号", example = "123") - private Long userId; - - @Schema(description = "业务类型", example = "1") - private Integer bizType; - - @Schema(description = "积分标题", example = "呵呵") - private String title; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordRespVO.java deleted file mode 100644 index 2fe7b030..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/point/vo/recrod/MemberPointRecordRespVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.member.controller.admin.point.vo.recrod; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 用户积分记录 Response VO") -@Data -public class MemberPointRecordRespVO { - - @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31457") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long userId; - - @Schema(description = "昵称", example = "张三") - private String nickname; - - @Schema(description = "业务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "22706") - private String bizId; - - @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer bizType; - - @Schema(description = "积分标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String title; - - @Schema(description = "积分描述", example = "你猜") - private String description; - - @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer point; - - @Schema(description = "变动后的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer totalPoint; - - @Schema(description = "发生时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInConfigController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInConfigController.java deleted file mode 100644 index 500184f5..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInConfigController.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.member.controller.admin.signin; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigCreateReqVO; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigRespVO; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigUpdateReqVO; -import com.win.module.member.convert.signin.MemberSignInConfigConvert; -import com.win.module.member.dal.dataobject.signin.MemberSignInConfigDO; -import com.win.module.member.service.signin.MemberSignInConfigService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -// TODO 芋艿:url -@Tag(name = "管理后台 - 签到规则") -@RestController -@RequestMapping("/member/sign-in/config") -@Validated -public class MemberSignInConfigController { - - @Resource - private MemberSignInConfigService signInConfigService; - - @PostMapping("/create") - @Operation(summary = "创建签到规则") - @PreAuthorize("@ss.hasPermission('point:sign-in-config:create')") - public CommonResult createSignInConfig(@Valid @RequestBody MemberSignInConfigCreateReqVO createReqVO) { - return success(signInConfigService.createSignInConfig(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新签到规则") - @PreAuthorize("@ss.hasPermission('point:sign-in-config:update')") - public CommonResult updateSignInConfig(@Valid @RequestBody MemberSignInConfigUpdateReqVO updateReqVO) { - signInConfigService.updateSignInConfig(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除签到规则") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('point:sign-in-config:delete')") - public CommonResult deleteSignInConfig(@RequestParam("id") Long id) { - signInConfigService.deleteSignInConfig(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得签到规则") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('point:sign-in-config:query')") - public CommonResult getSignInConfig(@RequestParam("id") Long id) { - MemberSignInConfigDO signInConfig = signInConfigService.getSignInConfig(id); - return success(MemberSignInConfigConvert.INSTANCE.convert(signInConfig)); - } - - @GetMapping("/list") - @Operation(summary = "获得签到规则列表") - @PreAuthorize("@ss.hasPermission('point:sign-in-config:query')") - public CommonResult> getSignInConfigList() { - List list = signInConfigService.getSignInConfigList(); - return success(MemberSignInConfigConvert.INSTANCE.convertList(list)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInRecordController.java deleted file mode 100644 index 71d09226..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/MemberSignInRecordController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.member.controller.admin.signin; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.controller.admin.signin.vo.record.MemberSignInRecordPageReqVO; -import com.win.module.member.controller.admin.signin.vo.record.MemberSignInRecordRespVO; -import com.win.module.member.convert.signin.MemberSignInRecordConvert; -import com.win.module.member.dal.dataobject.signin.MemberSignInRecordDO; -import com.win.module.member.service.signin.MemberSignInRecordService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.util.CollectionUtils; -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; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 签到记录") -@RestController -@RequestMapping("/member/sign-in/record") -@Validated -public class MemberSignInRecordController { - - @Resource - private MemberSignInRecordService signInRecordService; - - @Resource - private MemberUserApi memberUserApi; - - @GetMapping("/page") - @Operation(summary = "获得签到记录分页") - @PreAuthorize("@ss.hasPermission('point:sign-in-record:query')") - public CommonResult> getSignInRecordPage(@Valid MemberSignInRecordPageReqVO pageVO) { - // 执行分页查询 - PageResult pageResult = signInRecordService.getSignInRecordPage(pageVO); - if (CollectionUtils.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - - // 拼接结果返回 - List users = memberUserApi.getUserList( - convertSet(pageResult.getList(), MemberSignInRecordDO::getUserId)); - return success(MemberSignInRecordConvert.INSTANCE.convertPage(pageResult, users)); - } -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigBaseVO.java deleted file mode 100644 index bdf23cda..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigBaseVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.member.controller.admin.signin.vo.config; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 签到规则 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberSignInConfigBaseVO { - - @Schema(description = "签到第 x 天", requiredMode = Schema.RequiredMode.REQUIRED, example = "7") - @NotNull(message = "签到天数不能为空") - private Integer day; - - @Schema(description = "奖励积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "奖励积分不能为空") - private Integer point; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigCreateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigCreateReqVO.java deleted file mode 100644 index df23bd11..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.win.module.member.controller.admin.signin.vo.config; - -import lombok.*; -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(description = "管理后台 - 签到规则创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberSignInConfigCreateReqVO extends MemberSignInConfigBaseVO { - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigRespVO.java deleted file mode 100644 index a05301ec..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.member.controller.admin.signin.vo.config; - -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 MemberSignInConfigRespVO extends MemberSignInConfigBaseVO { - - @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "20937") - private Integer id; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigUpdateReqVO.java deleted file mode 100644 index d0613ca1..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/config/MemberSignInConfigUpdateReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.member.controller.admin.signin.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -import javax.validation.constraints.*; - -@Schema(description = "管理后台 - 签到规则更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberSignInConfigUpdateReqVO extends MemberSignInConfigBaseVO { - - @Schema(description = "规则自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "13653") - @NotNull(message = "规则自增主键不能为空") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java deleted file mode 100644 index d0842db5..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.member.controller.admin.signin.vo.record; - -import com.win.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 com.win.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 MemberSignInRecordPageReqVO extends PageParam { - - @Schema(description = "签到用户", example = "土豆") - private String nickname; - - @Schema(description = "第几天签到", example = "10") - private Integer day; - - @Schema(description = "用户编号", example = "123") - private Long userId; - - @Schema(description = "签到时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordRespVO.java deleted file mode 100644 index 9c83f8f5..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/signin/vo/record/MemberSignInRecordRespVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.member.controller.admin.signin.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 签到记录 Response VO") -@Data -public class MemberSignInRecordRespVO { - - @Schema(description = "签到自增 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11903") - private Long id; - - @Schema(description = "签到用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "6507") - private Long userId; - - @Schema(description = "昵称", example = "张三") - private String nickname; - - @Schema(description = "第几天签到", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer day; - - @Schema(description = "签到的分数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer point; - - @Schema(description = "签到时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/MemberTagController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/MemberTagController.java deleted file mode 100644 index 584cd796..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/MemberTagController.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.win.module.member.controller.admin.tag; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagPageReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagRespVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagUpdateReqVO; -import com.win.module.member.convert.tag.MemberTagConvert; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import com.win.module.member.service.tag.MemberTagService; -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 com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 会员标签") -@RestController -@RequestMapping("/member/tag") -@Validated -public class MemberTagController { - - @Resource - private MemberTagService tagService; - - @PostMapping("/create") - @Operation(summary = "创建会员标签") - @PreAuthorize("@ss.hasPermission('member:tag:create')") - public CommonResult createTag(@Valid @RequestBody MemberTagCreateReqVO createReqVO) { - return success(tagService.createTag(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新会员标签") - @PreAuthorize("@ss.hasPermission('member:tag:update')") - public CommonResult updateTag(@Valid @RequestBody MemberTagUpdateReqVO updateReqVO) { - tagService.updateTag(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除会员标签") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('member:tag:delete')") - public CommonResult deleteTag(@RequestParam("id") Long id) { - tagService.deleteTag(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得会员标签") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('member:tag:query')") - public CommonResult getMemberTag(@RequestParam("id") Long id) { - MemberTagDO tag = tagService.getTag(id); - return success(MemberTagConvert.INSTANCE.convert(tag)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取会员标签精简信息列表", description = "只包含被开启的会员标签,主要用于前端的下拉选项") - public CommonResult> getSimpleTagList() { - // 获用户列表,只要开启状态的 - List list = tagService.getTagList(); - // 排序后,返回给前端 - return success(MemberTagConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/list") - @Operation(summary = "获得会员标签列表") - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('member:tag:query')") - public CommonResult> getMemberTagList(@RequestParam("ids") Collection ids) { - List list = tagService.getTagList(ids); - return success(MemberTagConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得会员标签分页") - @PreAuthorize("@ss.hasPermission('member:tag:query')") - public CommonResult> getTagPage(@Valid MemberTagPageReqVO pageVO) { - PageResult pageResult = tagService.getTagPage(pageVO); - return success(MemberTagConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagBaseVO.java deleted file mode 100644 index 56ef7a3f..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagBaseVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.member.controller.admin.tag.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 MemberTagBaseVO { - - @Schema(description = "标签名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotNull(message = "标签名称不能为空") - private String name; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagCreateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagCreateReqVO.java deleted file mode 100644 index 7cd8dcb5..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.member.controller.admin.tag.vo; - -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 MemberTagCreateReqVO extends MemberTagBaseVO { - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagPageReqVO.java deleted file mode 100644 index 5d7e77cb..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagPageReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.member.controller.admin.tag.vo; - -import com.win.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 com.win.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 MemberTagPageReqVO extends PageParam { - - @Schema(description = "标签名称", example = "李四") - private String name; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagRespVO.java deleted file mode 100644 index 81201af8..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.controller.admin.tag.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 MemberTagRespVO extends MemberTagBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "907") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagUpdateReqVO.java deleted file mode 100644 index 68bdea22..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/tag/vo/MemberTagUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.member.controller.admin.tag.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberTagUpdateReqVO extends MemberTagBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "907") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/MemberUserController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/MemberUserController.java deleted file mode 100644 index 91ab161e..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/MemberUserController.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.win.module.member.controller.admin.user; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.user.vo.MemberUserPageReqVO; -import com.win.module.member.controller.admin.user.vo.MemberUserRespVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; -import com.win.module.member.convert.user.MemberUserConvert; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.service.group.MemberGroupService; -import com.win.module.member.service.level.MemberLevelService; -import com.win.module.member.service.tag.MemberTagService; -import com.win.module.member.service.user.MemberUserService; -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 java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 会员用户") -@RestController -@RequestMapping("/member/user") -@Validated -public class MemberUserController { - - @Resource - private MemberUserService memberUserService; - @Resource - private MemberTagService memberTagService; - @Resource - private MemberLevelService memberLevelService; - @Resource - private MemberGroupService memberGroupService; - - @PutMapping("/update") - @Operation(summary = "更新会员用户") - @PreAuthorize("@ss.hasPermission('member:user:update')") - public CommonResult updateUser(@Valid @RequestBody MemberUserUpdateReqVO updateReqVO) { - memberUserService.updateUser(updateReqVO); - return success(true); - } - - @PutMapping("/update-level") - @Operation(summary = "更新会员用户等级") - @PreAuthorize("@ss.hasPermission('member:user:update-level')") - public CommonResult updateUserLevel(@Valid @RequestBody MemberUserUpdateLevelReqVO updateReqVO) { - memberLevelService.updateUserLevel(updateReqVO); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得会员用户") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('member:user:query')") - public CommonResult getUser(@RequestParam("id") Long id) { - MemberUserDO user = memberUserService.getUser(id); - return success(MemberUserConvert.INSTANCE.convert03(user)); - } - - @GetMapping("/page") - @Operation(summary = "获得会员用户分页") - @PreAuthorize("@ss.hasPermission('member:user:query')") - public CommonResult> getUserPage(@Valid MemberUserPageReqVO pageVO) { - PageResult pageResult = memberUserService.getUserPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // 处理用户标签返显 - Set tagIds = pageResult.getList().stream() - .map(MemberUserDO::getTagIds) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .collect(Collectors.toSet()); - List tags = memberTagService.getTagList(tagIds); - // 处理用户级别返显 - List levels = memberLevelService.getLevelList( - convertSet(pageResult.getList(), MemberUserDO::getLevelId)); - // 处理用户分组返显 - List groups = memberGroupService.getGroupList( - convertSet(pageResult.getList(), MemberUserDO::getGroupId)); - return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserBaseVO.java deleted file mode 100644 index 05ee5aae..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserBaseVO.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.member.controller.admin.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.URL; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; - -/** - * 会员用户 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MemberUserBaseVO { - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - @NotNull(message = "手机号不能为空") - private String mobile; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "状态不能为空") - private Byte status; - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotNull(message = "用户昵称不能为空") - private String nickname; - - @Schema(description = "头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/x.png") - @URL(message = "头像必须是 URL 格式") - private String avatar; - - @Schema(description = "用户昵称", example = "李四") - private String name; - - @Schema(description = "用户性别", example = "1") - private Byte sex; - - @Schema(description = "所在地编号", example = "4371") - private Long areaId; - - @Schema(description = "所在地全程", example = "上海上海市普陀区") - private String areaName; - - @Schema(description = "出生日期", example = "2023-03-12") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) - private LocalDateTime birthday; - - @Schema(description = "会员备注", example = "我是小备注") - private String mark; - - @Schema(description = "会员标签", example = "[1, 2]") - private List tagIds; - - @Schema(description = "会员等级编号", example = "1") - private Long levelId; - - @Schema(description = "用户分组编号", example = "1") - private Long groupId; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserPageReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserPageReqVO.java deleted file mode 100644 index 3dead7b8..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserPageReqVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.member.controller.admin.user.vo; - -import com.win.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 java.util.List; - -import static com.win.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 MemberUserPageReqVO extends PageParam { - - @Schema(description = "手机号", example = "15601691300") - private String mobile; - - @Schema(description = "用户昵称", example = "李四") - private String nickname; - - @Schema(description = "最后登录时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] loginDate; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "会员标签编号列表", example = "[1, 2]") - private List tagIds; - - @Schema(description = "会员等级编号", example = "1") - private Long levelId; - - @Schema(description = "用户分组编号", example = "1") - private Long groupId; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserRespVO.java deleted file mode 100644 index a1c23304..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserRespVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.member.controller.admin.user.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberUserRespVO extends MemberUserBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788") - private Long id; - - @Schema(description = "注册 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") - private String registerIp; - - @Schema(description = "最后登录IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") - private String loginIp; - - @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime loginDate; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - // ========== 其它信息 ========== - - @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer point; - - @Schema(description = "总积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") - private Integer totalPoint; - - @Schema(description = "会员标签", example = "[红色, 快乐]") - private List tagNames; - - @Schema(description = "会员等级", example = "黄金会员") - private String levelName; - - @Schema(description = "用户分组", example = "购物达人") - private String groupName; - - @Schema(description = "用户经验值", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer experience; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java deleted file mode 100644 index 5f04096d..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.member.controller.admin.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 会员用户 修改等级 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberUserUpdateLevelReqVO extends MemberUserBaseVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788") - @NotNull(message = "用户编号不能为空") - private Long id; - - /** - * 取消用户等级时,值为空 - */ - @Schema(description = "用户等级编号", example = "1") - private Long levelId; - - @Schema(description = "修改原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要") - @NotBlank(message = "修改原因不能为空") - private String reason; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java deleted file mode 100644 index 7c1ade50..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.member.controller.admin.user.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MemberUserUpdateReqVO extends MemberUserBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.http b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.http deleted file mode 100644 index 6bae7c7e..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.http +++ /dev/null @@ -1,54 +0,0 @@ -### 请求 /create 接口 => 成功 -POST {{appApi}}//member/address/create -Content-Type: application/json -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -{ - "name": "yunai", - "mobile": "15601691300", - "areaId": "610632", - "postCode": "200000", - "detailAddress": "芋道源码 233 号 666 室", - "defaulted": true -} - -### 请求 /update 接口 => 成功 -PUT {{appApi}}//member/address/update -Content-Type: application/json -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -{ - "id": "1", - "name": "yunai888", - "mobile": "15601691300", - "areaId": "610632", - "postCode": "200000", - "detailAddress": "芋道源码 233 号 666 室", - "defaulted": false -} - -### 请求 /delete 接口 => 成功 -DELETE {{appApi}}//member/address/delete?id=2 -Content-Type: application/json -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -### 请求 /get 接口 => 成功 -GET {{appApi}}//member/address/get?id=1 -Content-Type: application/json -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -### 请求 /get-default 接口 => 成功 -GET {{appApi}}//member/address/get-default -Content-Type: application/json -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} - -### 请求 /list 接口 => 成功 -GET {{appApi}}//member/address/list -Content-Type: application/json -tenant-id: {{appTenentId}} -Authorization: Bearer {{appToken}} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.java deleted file mode 100644 index b9c70f2a..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/AppAddressController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.member.controller.app.address; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.member.controller.app.address.vo.AppAddressCreateReqVO; -import com.win.module.member.controller.app.address.vo.AppAddressRespVO; -import com.win.module.member.controller.app.address.vo.AppAddressUpdateReqVO; -import com.win.module.member.convert.address.AddressConvert; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; -import com.win.module.member.service.address.AddressService; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 APP - 用户收件地址") -@RestController -@RequestMapping("/member/address") -@Validated -public class AppAddressController { - - @Resource - private AddressService addressService; - - @PostMapping("/create") - @Operation(summary = "创建用户收件地址") - @PreAuthenticated - public CommonResult createAddress(@Valid @RequestBody AppAddressCreateReqVO createReqVO) { - return success(addressService.createAddress(getLoginUserId(), createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新用户收件地址") - @PreAuthenticated - public CommonResult updateAddress(@Valid @RequestBody AppAddressUpdateReqVO updateReqVO) { - addressService.updateAddress(getLoginUserId(), updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除用户收件地址") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthenticated - public CommonResult deleteAddress(@RequestParam("id") Long id) { - addressService.deleteAddress(getLoginUserId(), id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得用户收件地址") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthenticated - public CommonResult getAddress(@RequestParam("id") Long id) { - MemberAddressDO address = addressService.getAddress(getLoginUserId(), id); - return success(AddressConvert.INSTANCE.convert(address)); - } - - @GetMapping("/get-default") - @Operation(summary = "获得默认的用户收件地址") - @PreAuthenticated - public CommonResult getDefaultUserAddress() { - MemberAddressDO address = addressService.getDefaultUserAddress(getLoginUserId()); - return success(AddressConvert.INSTANCE.convert(address)); - } - - @GetMapping("/list") - @Operation(summary = "获得用户收件地址列表") - @PreAuthenticated - public CommonResult> getAddressList() { - List list = addressService.getAddressList(getLoginUserId()); - return success(AddressConvert.INSTANCE.convertList(list)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressBaseVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressBaseVO.java deleted file mode 100644 index 3d8ad9de..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressBaseVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.member.controller.app.address.vo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -// TODO 芋艿:example 缺失 -/** -* 用户收件地址 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class AppAddressBaseVO { - - @Schema(description = "收件人名称", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "收件人名称不能为空") - private String name; - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "手机号不能为空") - private String mobile; - - @Schema(description = "地区编号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "地区编号不能为空") - private Long areaId; - - @Schema(description = "收件详细地址", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "收件详细地址不能为空") - private String detailAddress; - - @Schema(description = "是否默认地址", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "是否默认地址不能为空") - private Boolean defaultStatus; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressCreateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressCreateReqVO.java deleted file mode 100644 index 47be678d..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressCreateReqVO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.win.module.member.controller.app.address.vo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -@Schema(description = "用户 APP - 用户收件地址创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppAddressCreateReqVO extends AppAddressBaseVO { - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressRespVO.java deleted file mode 100644 index 712579fb..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.member.controller.app.address.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "用户 APP - 用户收件地址 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppAddressRespVO extends AppAddressBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海上海市普陀区") - private String areaName; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressUpdateReqVO.java deleted file mode 100644 index 5ff9ebb1..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/address/vo/AppAddressUpdateReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.member.controller.app.address.vo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import javax.validation.constraints.*; - -@Schema(description = "用户 APP - 用户收件地址更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class AppAddressUpdateReqVO extends AppAddressBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.http b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.http deleted file mode 100644 index 648802b8..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.http +++ /dev/null @@ -1,61 +0,0 @@ -### 请求 /login 接口 => 成功 -POST {{appApi}}/member/auth/login -Content-Type: application/json -tenant-id: {{appTenentId}} - -{ - "mobile": "15601691300", - "password": "admin123" -} - -### 请求 /send-sms-code 接口 => 成功 -POST {{appApi}}/member/auth/send-sms-code -Content-Type: application/json -tenant-id: {{appTenentId}} - -{ - "mobile": "15601691399", - "scene": 1 -} - -### 请求 /sms-login 接口 => 成功 -POST {{appApi}}/member/auth/sms-login -Content-Type: application/json -tenant-id: {{appTenentId}} - -{ - "mobile": "15601691301", - "code": 9999 -} - -### 请求 /social-login 接口 => 成功 -POST {{appApi}}/member/auth/social-login -Content-Type: application/json -tenant-id: {{appTenentId}} - -{ - "type": 34, - "code": "0e1oc9000CTjFQ1oim200bhtb61oc90g", - "state": "default" -} - -### 请求 /weixin-mini-app-login 接口 => 成功 -POST {{appApi}}/member/auth/weixin-mini-app-login -Content-Type: application/json -tenant-id: {{appTenentId}} - -{ - "phoneCode": "618e6412e0c728f5b8fc7164497463d0158a923c9e7fd86af8bba393b9decbc5", - "loginCode": "001frTkl21JUf94VGxol2hSlff1frTkR" -} - -### 请求 /logout 接口 => 成功 -POST {{appApi}}/member/auth/logout -Content-Type: application/json -Authorization: Bearer c1b76bdaf2c146c581caa4d7fd81ee66 -tenant-id: {{appTenentId}} - -### 请求 /auth/refresh-token 接口 => 成功 -POST {{appApi}}/member/auth/refresh-token?refreshToken=bc43d929094849a28b3a69f6e6940d70 -Content-Type: application/json -tenant-id: {{appTenentId}} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.java deleted file mode 100644 index 4f74c09c..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/AppAuthController.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.win.module.member.controller.app.auth; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.framework.security.config.SecurityProperties; -import com.win.framework.security.core.util.SecurityFrameworkUtils; -import com.win.module.member.controller.app.auth.vo.*; -import com.win.module.member.service.auth.MemberAuthService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.annotation.security.PermitAll; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 APP - 认证") -@RestController -@RequestMapping("/member/auth") -@Validated -@Slf4j -public class AppAuthController { - - @Resource - private MemberAuthService authService; - - @Resource - private SecurityProperties securityProperties; - - @PostMapping("/login") - @Operation(summary = "使用手机 + 密码登录") - public CommonResult login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { - return success(authService.login(reqVO)); - } - - @PostMapping("/logout") - @PermitAll - @Operation(summary = "登出系统") - public CommonResult logout(HttpServletRequest request) { - String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader()); - if (StrUtil.isNotBlank(token)) { - authService.logout(token); - } - return success(true); - } - - @PostMapping("/refresh-token") - @Operation(summary = "刷新令牌") - @Parameter(name = "refreshToken", description = "刷新令牌", required = true) - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { - return success(authService.refreshToken(refreshToken)); - } - - // ========== 短信登录相关 ========== - - @PostMapping("/sms-login") - @Operation(summary = "使用手机 + 验证码登录") - public CommonResult smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { - return success(authService.smsLogin(reqVO)); - } - - @PostMapping("/send-sms-code") - @Operation(summary = "发送手机验证码") - public CommonResult sendSmsCode(@RequestBody @Valid AppAuthSmsSendReqVO reqVO) { - authService.sendSmsCode(getLoginUserId(), reqVO); - return success(true); - } - - @PostMapping("/validate-sms-code") - @Operation(summary = "校验手机验证码") - public CommonResult validateSmsCode(@RequestBody @Valid AppAuthSmsValidateReqVO reqVO) { - authService.validateSmsCode(getLoginUserId(), reqVO); - return success(true); - } - - // ========== 社交登录相关 ========== - - @GetMapping("/social-auth-redirect") - @Operation(summary = "社交授权的跳转") - @Parameters({ - @Parameter(name = "type", description = "社交类型", required = true), - @Parameter(name = "redirectUri", description = "回调路径") - }) - public CommonResult socialAuthRedirect(@RequestParam("type") Integer type, - @RequestParam("redirectUri") String redirectUri) { - return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri)); - } - - @PostMapping("/social-login") - @Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户") - public CommonResult socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) { - return success(authService.socialLogin(reqVO)); - } - - @PostMapping("/weixin-mini-app-login") - @Operation(summary = "微信小程序的一键登录") - public CommonResult weixinMiniAppLogin(@RequestBody @Valid AppAuthWeixinMiniAppLoginReqVO reqVO) { - return success(authService.weixinMiniAppLogin(reqVO)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java deleted file mode 100644 index 4beb0393..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthCheckCodeReqVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.system.enums.sms.SmsSceneEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -// TODO 芋艿:code review 相关逻辑 -@Schema(description = "用户 APP - 校验验证码 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppAuthCheckCodeReqVO { - - @Schema(description = "手机号", example = "15601691234") - @NotBlank(message = "手机号不能为空") - @Mobile - private String mobile; - - @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotBlank(message = "手机验证码不能为空") - @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位") - @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") - private String code; - - @Schema(description = "发送场景,对应 SmsSceneEnum 枚举", example = "1") - @NotNull(message = "发送场景不能为空") - @InEnum(SmsSceneEnum.class) - private Integer scene; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java deleted file mode 100644 index 4db9e0b3..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginReqVO.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.system.enums.social.SocialTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.NotEmpty; - -@Schema(description = "用户 APP - 手机 + 密码登录 Request VO,如果登录并绑定社交用户,需要传递 social 开头的参数") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppAuthLoginReqVO { - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - @NotEmpty(message = "手机号不能为空") - @Mobile - private String mobile; - - @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") - @NotEmpty(message = "密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - - // ========== 绑定社交登录时,需要传递如下参数 ========== - - @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(SocialTypeEnum.class) - private Integer socialType; - - @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String socialCode; - - @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") - private String socialState; - - @AssertTrue(message = "授权码不能为空") - public boolean isSocialCodeValid() { - return socialType == null || StrUtil.isNotEmpty(socialCode); - } - - @AssertTrue(message = "授权 state 不能为空") - public boolean isSocialState() { - return socialType == null || StrUtil.isNotEmpty(socialState); - } - -} \ No newline at end of file diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java deleted file mode 100644 index fabea4f1..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthLoginRespVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Schema(description = "用户 APP - 登录 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppAuthLoginRespVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long userId; - - @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "happy") - private String accessToken; - - @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") - private String refreshToken; - - @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime expiresTime; - - /** - * 仅社交登录、社交绑定时会返回 - * - * 为什么需要返回?微信公众号、微信小程序支付需要传递 openid 给支付接口 - */ - @Schema(description = "社交用户 openid", example = "qq768") - private String openid; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java deleted file mode 100644 index c702db54..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.system.enums.social.SocialTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Pattern; - -@Schema(description = "用户 APP - 手机 + 验证码登录 Request VO,如果登录并绑定社交用户,需要传递 social 开头的参数") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppAuthSmsLoginReqVO { - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - @NotEmpty(message = "手机号不能为空") - @Mobile - private String mobile; - - @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 = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(SocialTypeEnum.class) - private Integer socialType; - - @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String socialCode; - - @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") - private String socialState; - - @AssertTrue(message = "授权码不能为空") - public boolean isSocialCodeValid() { - return socialType == null || StrUtil.isNotEmpty(socialCode); - } - - @AssertTrue(message = "授权 state 不能为空") - public boolean isSocialState() { - return socialType == null || StrUtil.isNotEmpty(socialState); - } - -} \ No newline at end of file diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsSendReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsSendReqVO.java deleted file mode 100644 index 19b9be55..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsSendReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.system.enums.sms.SmsSceneEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 APP - 发送手机验证码 Request VO") -@Data -@Accessors(chain = true) -public class AppAuthSmsSendReqVO { - - @Schema(description = "手机号", example = "15601691234") - @Mobile - private String mobile; - - @Schema(description = "发送场景,对应 SmsSceneEnum 枚举", example = "1") - @NotNull(message = "发送场景不能为空") - @InEnum(SmsSceneEnum.class) - private Integer scene; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsValidateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsValidateReqVO.java deleted file mode 100644 index c331574d..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSmsValidateReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.framework.common.validation.Mobile; -import com.win.module.system.enums.sms.SmsSceneEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -@Schema(description = "用户 APP - 校验手机验证码 Request VO") -@Data -@Accessors(chain = true) -public class AppAuthSmsValidateReqVO { - - @Schema(description = "手机号", example = "15601691234") - @Mobile - private String mobile; - - @Schema(description = "发送场景,对应 SmsSceneEnum 枚举", example = "1") - @NotNull(message = "发送场景不能为空") - @InEnum(SmsSceneEnum.class) - private Integer scene; - - @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; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java deleted file mode 100644 index b6060d54..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.system.enums.social.SocialTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 APP - 社交快捷登录 Request VO,使用 code 授权码") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppAuthSocialLoginReqVO { - - @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(SocialTypeEnum.class) - @NotNull(message = "社交平台的类型不能为空") - private Integer type; - - @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "授权码不能为空") - private String code; - - @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") - @NotEmpty(message = "state 不能为空") - private String state; - -} \ No newline at end of file diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java deleted file mode 100644 index a51102d1..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/auth/vo/AppAuthWeixinMiniAppLoginReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.member.controller.app.auth.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; - -@Schema(description = "用户 APP - 微信小程序手机登录 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppAuthWeixinMiniAppLoginReqVO { - - @Schema(description = "手机 code,小程序通过 wx.getPhoneNumber 方法获得", requiredMode = Schema.RequiredMode.REQUIRED, example = "hello") - @NotEmpty(message = "手机 code 不能为空") - private String phoneCode; - - @Schema(description = "登录 code,小程序通过 wx.login 方法获得", requiredMode = Schema.RequiredMode.REQUIRED, example = "word") - @NotEmpty(message = "登录 code 不能为空") - private String loginCode; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberExperienceRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberExperienceRecordController.java deleted file mode 100644 index b8bc586e..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberExperienceRecordController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.member.controller.app.level; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.member.controller.app.level.vo.experience.AppMemberExperienceRecordRespVO; -import com.win.module.member.convert.level.MemberExperienceRecordConvert; -import com.win.module.member.dal.dataobject.level.MemberExperienceRecordDO; -import com.win.module.member.service.level.MemberExperienceRecordService; -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 com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 会员经验记录") -@RestController -@RequestMapping("/member/experience-record") -@Validated -public class AppMemberExperienceRecordController { - - @Resource - private MemberExperienceRecordService experienceLogService; - - @GetMapping("/page") - @Operation(summary = "获得会员经验记录分页") - @PreAuthenticated - public CommonResult> getExperienceRecordPage( - @Valid PageParam pageParam) { - PageResult pageResult = experienceLogService.getExperienceRecordPage( - getLoginUserId(), pageParam); - return success(MemberExperienceRecordConvert.INSTANCE.convertPage02(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberLevelController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberLevelController.java deleted file mode 100644 index a8e9bdd3..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/AppMemberLevelController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.member.controller.app.level; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.member.controller.app.level.vo.level.AppMemberLevelRespVO; -import com.win.module.member.convert.level.MemberLevelConvert; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.service.level.MemberLevelService; -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; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 会员等级") -@RestController -@RequestMapping("/member/level") -@Validated -public class AppMemberLevelController { - - @Resource - private MemberLevelService levelService; - - @GetMapping("/list") - @Operation(summary = "获得会员等级列表") - public CommonResult> getLevelList() { - List result = levelService.getEnableLevelList(); - return success(MemberLevelConvert.INSTANCE.convertList02(result)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/experience/AppMemberExperienceRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/experience/AppMemberExperienceRecordRespVO.java deleted file mode 100644 index ec01eb17..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/experience/AppMemberExperienceRecordRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.member.controller.app.level.vo.experience; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 会员经验记录 Response VO") -@Data -public class AppMemberExperienceRecordRespVO { - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "增加经验") - private String title; - - @Schema(description = "经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer experience; - - @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单增加 100 经验") - private String description; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/level/AppMemberLevelRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/level/AppMemberLevelRespVO.java deleted file mode 100644 index 79470dec..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/level/vo/level/AppMemberLevelRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.member.controller.app.level.vo.level; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 会员等级 Response VO") -@Data -public class AppMemberLevelRespVO { - - @Schema(description = "等级名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - private String name; - - @Schema(description = "等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer level; - - @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer experience; - - @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "98") - private Integer discountPercent; - - @Schema(description = "等级图标", example = "https://www.iocoder.cn/win.jpg") - private String icon; - - @Schema(description = "等级背景图", example = "https://www.iocoder.cn/win.jpg") - private String backgroundUrl; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/AppMemberPointRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/AppMemberPointRecordController.java deleted file mode 100644 index 9bb13cb0..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/AppMemberPointRecordController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.member.controller.app.point; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.member.controller.app.point.vo.AppMemberPointRecordRespVO; -import com.win.module.member.convert.point.MemberPointRecordConvert; -import com.win.module.member.dal.dataobject.point.MemberPointRecordDO; -import com.win.module.member.service.point.MemberPointRecordService; -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 com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 签到记录") -@RestController -@RequestMapping("/member/point/record") -@Validated -public class AppMemberPointRecordController { - - @Resource - private MemberPointRecordService pointRecordService; - - @GetMapping("/page") - @Operation(summary = "获得用户积分记录分页") - @PreAuthenticated - public CommonResult> getPointRecordPage(@Valid PageParam pageVO) { - PageResult pageResult = pointRecordService.getPointRecordPage(getLoginUserId(), pageVO); - return success(MemberPointRecordConvert.INSTANCE.convertPage02(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java deleted file mode 100644 index 23095e02..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.member.controller.app.point.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 用户积分记录 Response VO") -@Data -public class AppMemberPointRecordRespVO { - - @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31457") - private Long id;; - - @Schema(description = "积分标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - private String title; - - @Schema(description = "积分描述", example = "你猜") - private String description; - - @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer point; - - @Schema(description = "发生时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInConfigController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInConfigController.java deleted file mode 100644 index a8fd1f38..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInConfigController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.member.controller.app.signin; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.module.member.controller.app.signin.vo.config.AppMemberSignInConfigRespVO; -import com.win.module.member.convert.signin.MemberSignInConfigConvert; -import com.win.module.member.dal.dataobject.signin.MemberSignInConfigDO; -import com.win.module.member.service.signin.MemberSignInConfigService; -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; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "用户 App - 签到规则") -@RestController -@RequestMapping("/member/sign-in/config") -@Validated -public class AppMemberSignInConfigController { - - @Resource - private MemberSignInConfigService signInConfigService; - - @GetMapping("/list") - @Operation(summary = "获得签到规则列表") - public CommonResult> getSignInConfigList() { - List pageResult = signInConfigService.getSignInConfigList(CommonStatusEnum.ENABLE.getStatus()); - return success(MemberSignInConfigConvert.INSTANCE.convertList02(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInRecordController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInRecordController.java deleted file mode 100644 index 34913b96..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/AppMemberSignInRecordController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.win.module.member.controller.app.signin; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.member.controller.app.signin.vo.record.AppMemberSignInRecordRespVO; -import com.win.module.member.controller.app.signin.vo.record.AppMemberSignInRecordSummaryRespVO; -import com.win.module.member.convert.signin.MemberSignInRecordConvert; -import com.win.module.member.dal.dataobject.signin.MemberSignInRecordDO; -import com.win.module.member.service.signin.MemberSignInRecordService; -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.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 签到记录") -@RestController -@RequestMapping("/member/sign-in/record") -@Validated -public class AppMemberSignInRecordController { - - @Resource - private MemberSignInRecordService signInRecordService; - - // TODO 芋艿:临时 mock => UserSignController.getUserInfo - @GetMapping("/get-summary") - @Operation(summary = "获得个人签到统计") - @PreAuthenticated - public CommonResult getSignInRecordSummary() { - AppMemberSignInRecordSummaryRespVO respVO = new AppMemberSignInRecordSummaryRespVO(); - if (false) { - respVO.setTotalDay(100); - respVO.setContinuousDay(5); - respVO.setTodaySignIn(true); - } else { - respVO.setTotalDay(100); - respVO.setContinuousDay(10); - respVO.setTodaySignIn(false); - } - return success(respVO); - } - - // TODO 芋艿:临时 mock => UserSignController.info - @PostMapping("/create") - @Operation(summary = "签到") - @PreAuthenticated - public CommonResult createSignInRecord() { - AppMemberSignInRecordRespVO respVO = new AppMemberSignInRecordRespVO() - .setPoint(10) - .setDay(10) - .setCreateTime(LocalDateTime.now()); - return success(respVO); - } - - @GetMapping("/page") - @Operation(summary = "获得签到记录分页") - @PreAuthenticated - public CommonResult> getSignRecordPage(PageParam pageParam) { - PageResult pageResult = signInRecordService.getSignRecordPage(getLoginUserId(), pageParam); - return success(MemberSignInRecordConvert.INSTANCE.convertPage02(pageResult)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java deleted file mode 100644 index e9d01601..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.member.controller.app.signin.vo.config; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 签到规则 Response VO") -@Data -public class AppMemberSignInConfigRespVO { - - @Schema(description = "签到第 x 天", requiredMode = Schema.RequiredMode.REQUIRED, example = "7") - private Integer day; - - @Schema(description = "奖励积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer point; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java deleted file mode 100644 index 388ab7ce..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.member.controller.app.signin.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 App - 签到记录 Response VO") -@Data -public class AppMemberSignInRecordRespVO { - - @Schema(description = "第几天签到", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer day; - - @Schema(description = "签到的分数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer point; - - @Schema(description = "签到时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java deleted file mode 100644 index 90bcb8e7..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.member.controller.app.signin.vo.record; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 App - 个人签到统计 Response VO") -@Data -public class AppMemberSignInRecordSummaryRespVO { - - @Schema(description = "总签到天数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer totalDay; - - @Schema(description = "连续签到第 x 天", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") - private Integer continuousDay; - - @Schema(description = "今天是否已签到", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean todaySignIn; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/AppSocialUserController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/AppSocialUserController.java deleted file mode 100644 index 285961da..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/AppSocialUserController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.member.controller.app.social; - -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.member.controller.app.social.vo.AppSocialUserBindReqVO; -import com.win.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO; -import com.win.module.member.convert.social.SocialUserConvert; -import com.win.module.system.api.social.SocialUserApi; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Operation; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 App - 社交用户") -@RestController -@RequestMapping("/system/social-user") -@Validated -public class AppSocialUserController { - - @Resource - private SocialUserApi socialUserApi; - - @PostMapping("/bind") - @Operation(summary = "社交绑定,使用 code 授权码") - public CommonResult socialBind(@RequestBody @Valid AppSocialUserBindReqVO reqVO) { - socialUserApi.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO)); - return CommonResult.success(true); - } - - @DeleteMapping("/unbind") - @Operation(summary = "取消社交绑定") - @PreAuthenticated - public CommonResult socialUnbind(@RequestBody AppSocialUserUnbindReqVO reqVO) { - socialUserApi.unbindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO)); - return CommonResult.success(true); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java deleted file mode 100644 index 6d2f47c9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.member.controller.app.social.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.system.enums.social.SocialTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 APP - 社交绑定 Request VO,使用 code 授权码") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppSocialUserBindReqVO { - - @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(SocialTypeEnum.class) - @NotNull(message = "社交平台的类型不能为空") - private Integer type; - - @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotEmpty(message = "授权码不能为空") - private String code; - - @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") - @NotEmpty(message = "state 不能为空") - private String state; - -} \ No newline at end of file diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java deleted file mode 100644 index 2a92d2d9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.member.controller.app.social.vo; - -import com.win.framework.common.validation.InEnum; -import com.win.module.system.enums.social.SocialTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "用户 APP - 取消社交绑定 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppSocialUserUnbindReqVO { - - @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @InEnum(SocialTypeEnum.class) - @NotNull(message = "社交平台的类型不能为空") - private Integer type; - - @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") - @NotEmpty(message = "社交用户的 openid 不能为空") - private String openid; - -} \ No newline at end of file diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.http b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.http deleted file mode 100644 index 745556f7..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.http +++ /dev/null @@ -1,4 +0,0 @@ -### 请求 /member/user/profile/get 接口 => 没有权限 -GET {{appApi}}/member/user/get -Authorization: Bearer test245 -tenant-id: {{appTenentId}} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.java deleted file mode 100644 index 608c13fa..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/AppMemberUserController.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.win.module.member.controller.app.user; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.member.controller.app.user.vo.*; -import com.win.module.member.convert.user.MemberUserConvert; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.service.level.MemberLevelService; -import com.win.module.member.service.user.MemberUserService; -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.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 APP - 用户个人中心") -@RestController -@RequestMapping("/member/user") -@Validated -@Slf4j -public class AppMemberUserController { - - @Resource - private MemberUserService userService; - @Resource - private MemberLevelService levelService; - - @GetMapping("/get") - @Operation(summary = "获得基本信息") - @PreAuthenticated - public CommonResult getUserInfo() { - MemberUserDO user = userService.getUser(getLoginUserId()); - MemberLevelDO level = levelService.getLevel(user.getLevelId()); - return success(MemberUserConvert.INSTANCE.convert(user, level)); - } - - @PutMapping("/update") - @Operation(summary = "修改基本信息") - @PreAuthenticated - public CommonResult updateUser(@RequestBody @Valid AppMemberUserUpdateReqVO reqVO) { - userService.updateUser(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/update-mobile") - @Operation(summary = "修改用户手机") - @PreAuthenticated - public CommonResult updateUserMobile(@RequestBody @Valid AppMemberUserUpdateMobileReqVO reqVO) { - userService.updateUserMobile(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/update-password") - @Operation(summary = "修改用户密码", description = "用户修改密码时使用") - @PreAuthenticated - public CommonResult updatePassword(@RequestBody @Valid AppMemberUserUpdatePasswordReqVO reqVO) { - userService.updateUserPassword(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/reset-password") - @Operation(summary = "重置密码", description = "用户忘记密码时使用") - public CommonResult resetPassword(@RequestBody @Valid AppMemberUserResetPasswordReqVO reqVO) { - userService.resetUserPassword(reqVO); - return success(true); - } - -} - diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java deleted file mode 100644 index 9225a7e2..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.member.controller.app.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Schema(description = "用户 APP - 用户个人信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class AppMemberUserInfoRespVO { - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - private String nickname; - - @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.png") - private String avatar; - - @Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - private String mobile; - - @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer point; - - @Schema(description = "经验值", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer experience; - - @Schema(description = "用户等级") - private Level level; - - @Schema(description = "是否成为推广员", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean brokerageEnabled; - - @Schema(description = "用户 App - 会员等级") - @Data - public static class Level { - - @Schema(description = "等级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "等级名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - private String name; - - @Schema(description = "等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer level; - - @Schema(description = "等级图标", example = "https://www.iocoder.cn/win.jpg") - private String icon; - - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserResetPasswordReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserResetPasswordReqVO.java deleted file mode 100644 index 77e20598..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserResetPasswordReqVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.member.controller.app.user.vo; - -import com.win.framework.common.validation.Mobile; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Pattern; - -@Schema(description = "用户 APP - 重置密码 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppMemberUserResetPasswordReqVO { - - @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") - @NotEmpty(message = "新密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - - @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 = "手机号",requiredMode = Schema.RequiredMode.REQUIRED,example = "15878962356") - @NotBlank(message = "手机号不能为空") - @Mobile - private String mobile; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateMobileReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateMobileReqVO.java deleted file mode 100644 index 482af8bb..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateMobileReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.member.controller.app.user.vo; - -import com.win.framework.common.validation.Mobile; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Pattern; - -@Schema(description = "用户 APP - 修改手机 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppMemberUserUpdateMobileReqVO { - - @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 = "手机号",requiredMode = Schema.RequiredMode.REQUIRED,example = "15823654487") - @NotBlank(message = "手机号不能为空") - @Length(min = 8, max = 11, message = "手机号码长度为 8-11 位") - @Mobile - private String mobile; - - @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 oldCode; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdatePasswordReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdatePasswordReqVO.java deleted file mode 100644 index 864440c5..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdatePasswordReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.member.controller.app.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Pattern; - -@Schema(description = "用户 APP - 修改密码 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AppMemberUserUpdatePasswordReqVO { - - @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") - @NotEmpty(message = "新密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - - @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; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java deleted file mode 100644 index 3aad71dd..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.member.controller.app.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.URL; - -@Schema(description = "用户 App - 会员用户更新 Request VO") -@Data -public class AppMemberUserUpdateReqVO { - - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - private String nickname; - - @Schema(description = "头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/x.png") - @URL(message = "头像必须是 URL 格式") - private String avatar; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/package-info.java deleted file mode 100644 index 15c50c40..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 RESTful API 给前端: - * 1. admin 包:提供给管理后台 win-ui-admin 前端项目 - * 2. app 包:提供给用户 APP win-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 - */ -package com.win.module.member.controller; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/address/AddressConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/address/AddressConvert.java deleted file mode 100644 index 992edd02..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/address/AddressConvert.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.member.convert.address; - -import com.win.framework.ip.core.utils.AreaUtils; -import com.win.module.member.api.address.dto.AddressRespDTO; -import com.win.module.member.controller.admin.address.vo.AddressRespVO; -import com.win.module.member.controller.app.address.vo.AppAddressCreateReqVO; -import com.win.module.member.controller.app.address.vo.AppAddressRespVO; -import com.win.module.member.controller.app.address.vo.AppAddressUpdateReqVO; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 用户收件地址 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface AddressConvert { - - AddressConvert INSTANCE = Mappers.getMapper(AddressConvert.class); - - MemberAddressDO convert(AppAddressCreateReqVO bean); - - MemberAddressDO convert(AppAddressUpdateReqVO bean); - - @Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName") - AppAddressRespVO convert(MemberAddressDO bean); - - List convertList(List list); - - AddressRespDTO convert02(MemberAddressDO bean); - - @Named("convertAreaIdToAreaName") - default String convertAreaIdToAreaName(Integer areaId) { - return AreaUtils.format(areaId); - } - - List convertList2(List list); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/auth/AuthConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/auth/AuthConvert.java deleted file mode 100644 index ebaff94b..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/auth/AuthConvert.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.member.convert.auth; - -import com.win.module.member.controller.app.auth.vo.*; -import com.win.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO; -import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; -import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; -import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; -import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; -import com.win.module.system.api.social.dto.SocialUserBindReqDTO; -import com.win.module.system.api.social.dto.SocialUserUnbindReqDTO; -import com.win.module.system.enums.sms.SmsSceneEnum; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface AuthConvert { - - AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); - - SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLoginReqVO reqVO); - SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO); - - SmsCodeSendReqDTO convert(AppAuthSmsSendReqVO reqVO); - SmsCodeUseReqDTO convert(AppMemberUserResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp); - SmsCodeUseReqDTO convert(AppAuthSmsLoginReqVO reqVO, Integer scene, String usedIp); - - AppAuthLoginRespVO convert(OAuth2AccessTokenRespDTO bean, String openid); - - SmsCodeValidateReqDTO convert(AppAuthSmsValidateReqVO bean); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/group/MemberGroupConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/group/MemberGroupConvert.java deleted file mode 100644 index 0c7c2e76..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/group/MemberGroupConvert.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.member.convert.group; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.group.vo.MemberGroupCreateReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupRespVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupSimpleRespVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 用户分组 Convert - * - * @author owen - */ -@Mapper -public interface MemberGroupConvert { - - MemberGroupConvert INSTANCE = Mappers.getMapper(MemberGroupConvert.class); - - MemberGroupDO convert(MemberGroupCreateReqVO bean); - - MemberGroupDO convert(MemberGroupUpdateReqVO bean); - - MemberGroupRespVO convert(MemberGroupDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertSimpleList(List list); -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberExperienceRecordConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberExperienceRecordConvert.java deleted file mode 100644 index aa1683eb..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberExperienceRecordConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.member.convert.level; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.experience.MemberExperienceRecordRespVO; -import com.win.module.member.controller.app.level.vo.experience.AppMemberExperienceRecordRespVO; -import com.win.module.member.dal.dataobject.level.MemberExperienceRecordDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 会员经验记录 Convert - * - * @author owen - */ -@Mapper -public interface MemberExperienceRecordConvert { - - MemberExperienceRecordConvert INSTANCE = Mappers.getMapper(MemberExperienceRecordConvert.class); - - MemberExperienceRecordRespVO convert(MemberExperienceRecordDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - MemberExperienceRecordDO convert(Long userId, Integer experience, Integer totalExperience, - String bizId, Integer bizType, - String title, String description); - - PageResult convertPage02(PageResult page); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelConvert.java deleted file mode 100644 index df37ec3c..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.member.convert.level; - -import com.win.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelRespVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; -import com.win.module.member.controller.app.level.vo.level.AppMemberLevelRespVO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 会员等级 Convert - * - * @author owen - */ -@Mapper -public interface MemberLevelConvert { - - MemberLevelConvert INSTANCE = Mappers.getMapper(MemberLevelConvert.class); - - MemberLevelDO convert(MemberLevelCreateReqVO bean); - - MemberLevelDO convert(MemberLevelUpdateReqVO bean); - - MemberLevelRespVO convert(MemberLevelDO bean); - - List convertList(List list); - - List convertSimpleList(List list); - - List convertList02(List list); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelRecordConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelRecordConvert.java deleted file mode 100644 index 1ca521e7..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/level/MemberLevelRecordConvert.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.member.convert.level; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.record.MemberLevelRecordRespVO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.dal.dataobject.level.MemberLevelRecordDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 会员等级记录 Convert - * - * @author owen - */ -@Mapper -public interface MemberLevelRecordConvert { - - MemberLevelRecordConvert INSTANCE = Mappers.getMapper(MemberLevelRecordConvert.class); - - MemberLevelRecordRespVO convert(MemberLevelRecordDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default MemberLevelRecordDO copyTo(MemberLevelDO from, MemberLevelRecordDO to) { - if (from != null) { - to.setLevelId(from.getId()); - to.setLevel(from.getLevel()); - to.setDiscountPercent(from.getDiscountPercent()); - to.setExperience(from.getExperience()); - } - return to; - } -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/package-info.java deleted file mode 100644 index 85c74a34..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package com.win.module.member.convert; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointConfigConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointConfigConvert.java deleted file mode 100644 index e557117f..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointConfigConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.member.convert.point; - -import com.win.module.member.controller.admin.point.vo.config.MemberPointConfigRespVO; -import com.win.module.member.controller.admin.point.vo.config.MemberPointConfigSaveReqVO; -import com.win.module.member.dal.dataobject.point.MemberPointConfigDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 会员积分配置 Convert - * - * @author QingX - */ -@Mapper -public interface MemberPointConfigConvert { - - MemberPointConfigConvert INSTANCE = Mappers.getMapper(MemberPointConfigConvert.class); - - MemberPointConfigRespVO convert(MemberPointConfigDO bean); - - MemberPointConfigDO convert(MemberPointConfigSaveReqVO bean); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointRecordConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointRecordConvert.java deleted file mode 100644 index 01e2dfa6..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/point/MemberPointRecordConvert.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.member.convert.point; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.controller.admin.point.vo.recrod.MemberPointRecordRespVO; -import com.win.module.member.controller.app.point.vo.AppMemberPointRecordRespVO; -import com.win.module.member.dal.dataobject.point.MemberPointRecordDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 用户积分记录 Convert - * - * @author QingX - */ -@Mapper -public interface MemberPointRecordConvert { - - MemberPointRecordConvert INSTANCE = Mappers.getMapper(MemberPointRecordConvert.class); - - default PageResult convertPage(PageResult pageResult, List users) { - PageResult voPageResult = convertPage(pageResult); - // user 拼接 - Map userMap = convertMap(users, MemberUserRespDTO::getId); - voPageResult.getList().forEach(record -> MapUtils.findAndThen(userMap, record.getUserId(), - memberUserRespDTO -> record.setNickname(memberUserRespDTO.getNickname()))); - return voPageResult; - } - PageResult convertPage(PageResult pageResult); - - PageResult convertPage02(PageResult pageResult); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInConfigConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInConfigConvert.java deleted file mode 100644 index 3e5f1b72..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInConfigConvert.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.member.convert.signin; - -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigCreateReqVO; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigRespVO; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigUpdateReqVO; -import com.win.module.member.controller.app.signin.vo.config.AppMemberSignInConfigRespVO; -import com.win.module.member.dal.dataobject.signin.MemberSignInConfigDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 签到规则 Convert - * - * @author QingX - */ -@Mapper -public interface MemberSignInConfigConvert { - - MemberSignInConfigConvert INSTANCE = Mappers.getMapper(MemberSignInConfigConvert.class); - - MemberSignInConfigDO convert(MemberSignInConfigCreateReqVO bean); - - MemberSignInConfigDO convert(MemberSignInConfigUpdateReqVO bean); - - MemberSignInConfigRespVO convert(MemberSignInConfigDO bean); - - List convertList(List list); - - List convertList02(List list); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInRecordConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInRecordConvert.java deleted file mode 100644 index d5d5bbed..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/signin/MemberSignInRecordConvert.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.member.convert.signin; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.controller.admin.signin.vo.record.MemberSignInRecordRespVO; -import com.win.module.member.controller.app.signin.vo.record.AppMemberSignInRecordRespVO; -import com.win.module.member.dal.dataobject.signin.MemberSignInRecordDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -/** - * 签到记录 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface MemberSignInRecordConvert { - - MemberSignInRecordConvert INSTANCE = Mappers.getMapper(MemberSignInRecordConvert.class); - - default PageResult convertPage(PageResult pageResult, List users) { - PageResult voPageResult = convertPage(pageResult); - // user 拼接 - Map userMap = convertMap(users, MemberUserRespDTO::getId); - voPageResult.getList().forEach(record -> MapUtils.findAndThen(userMap, record.getUserId(), - memberUserRespDTO -> record.setNickname(memberUserRespDTO.getNickname()))); - return voPageResult; - } - PageResult convertPage(PageResult pageResult); - - PageResult convertPage02(PageResult pageResult); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/social/SocialUserConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/social/SocialUserConvert.java deleted file mode 100644 index d89075e9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/social/SocialUserConvert.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.member.convert.social; - -import com.win.module.member.controller.app.social.vo.AppSocialUserBindReqVO; -import com.win.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO; -import com.win.module.system.api.social.dto.SocialUserBindReqDTO; -import com.win.module.system.api.social.dto.SocialUserUnbindReqDTO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SocialUserConvert { - - SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class); - - SocialUserBindReqDTO convert(Long userId, Integer userType, AppSocialUserBindReqVO reqVO); - - SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/tag/MemberTagConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/tag/MemberTagConvert.java deleted file mode 100644 index 987ddfab..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/tag/MemberTagConvert.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.member.convert.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagRespVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagUpdateReqVO; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 会员标签 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface MemberTagConvert { - - MemberTagConvert INSTANCE = Mappers.getMapper(MemberTagConvert.class); - - MemberTagDO convert(MemberTagCreateReqVO bean); - - MemberTagDO convert(MemberTagUpdateReqVO bean); - - MemberTagRespVO convert(MemberTagDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/user/MemberUserConvert.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/user/MemberUserConvert.java deleted file mode 100644 index a6ea0154..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/user/MemberUserConvert.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.member.convert.user; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.controller.admin.user.vo.MemberUserRespVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserInfoRespVO; -import com.win.module.member.convert.address.AddressConvert; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; - -@Mapper(uses = {AddressConvert.class}) -public interface MemberUserConvert { - - MemberUserConvert INSTANCE = Mappers.getMapper(MemberUserConvert.class); - - AppMemberUserInfoRespVO convert(MemberUserDO bean); - - @Mapping(source = "level", target = "level") - @Mapping(source = "bean.experience", target = "experience") - AppMemberUserInfoRespVO convert(MemberUserDO bean, MemberLevelDO level); - - MemberUserRespDTO convert2(MemberUserDO bean); - - List convertList2(List list); - - MemberUserDO convert(MemberUserUpdateReqVO bean); - - PageResult convertPage(PageResult page); - - @Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName") - MemberUserRespVO convert03(MemberUserDO bean); - - default PageResult convertPage(PageResult pageResult, - List tags, - List levels, - List groups) { - PageResult result = convertPage(pageResult); - // 处理关联数据 - Map tagMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName); - Map levelMap = convertMap(levels, MemberLevelDO::getId, MemberLevelDO::getName); - Map groupMap = convertMap(groups, MemberGroupDO::getId, MemberGroupDO::getName); - // 填充关联数据 - result.getList().forEach(user -> { - user.setTagNames(convertList(user.getTagIds(), tagMap::get)); - user.setLevelName(levelMap.get(user.getLevelId())); - user.setGroupName(groupMap.get(user.getGroupId())); - }); - return result; - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 2f05ebd1..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/address/MemberAddressDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/address/MemberAddressDO.java deleted file mode 100644 index 27d3c28d..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/address/MemberAddressDO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.member.dal.dataobject.address; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 用户收件地址 DO - * - * @author 芋道源码 - */ -@TableName("member_address") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberAddressDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 用户编号 - */ - private Long userId; - /** - * 收件人名称 - */ - private String name; - /** - * 手机号 - */ - private String mobile; - /** - * 地区编号 - */ - private Long areaId; - /** - * 收件详细地址 - */ - private String detailAddress; - /** - * 是否默认 - * - * true - 默认收件地址 - */ - private Boolean defaultStatus; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/group/MemberGroupDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/group/MemberGroupDO.java deleted file mode 100644 index a031f826..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/group/MemberGroupDO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.member.dal.dataobject.group; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 owen - */ -@TableName("member_group") -@KeySequence("member_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberGroupDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 名称 - */ - private String name; - /** - * 备注 - */ - private String remark; - /** - * 状态 - *

- * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberExperienceRecordDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberExperienceRecordDO.java deleted file mode 100644 index 0a020f20..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberExperienceRecordDO.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.win.module.member.dal.dataobject.level; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.enums.MemberExperienceBizTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 会员经验记录 DO - * - * @author owen - */ -@TableName("member_experience_record") -@KeySequence("member_experience_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberExperienceRecordDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 用户编号 - * - * 关联 {@link MemberUserDO#getId()} 字段 - */ - private Long userId; - /** - * 业务类型 - *

- * 枚举 {@link MemberExperienceBizTypeEnum} - */ - private Integer bizType; - /** - * 业务编号 - */ - private String bizId; - /** - * 标题 - */ - private String title; - /** - * 描述 - */ - private String description; - /** - * 经验 - */ - private Integer experience; - /** - * 变更后的经验 - */ - private Integer totalExperience; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelDO.java deleted file mode 100644 index 6e75a6c8..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelDO.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.win.module.member.dal.dataobject.level; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 owen - */ -@TableName("member_level") -@KeySequence("member_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberLevelDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 等级名称 - */ - private String name; - /** - * 等级 - */ - private Integer level; - /** - * 升级经验 - */ - private Integer experience; - /** - * 享受折扣 - */ - private Integer discountPercent; - - /** - * 等级图标 - */ - private String icon; - /** - * 等级背景图 - */ - private String backgroundUrl; - /** - * 状态 - *

- * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelRecordDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelRecordDO.java deleted file mode 100644 index e464dea2..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/level/MemberLevelRecordDO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.win.module.member.dal.dataobject.level; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 会员等级记录 DO - * - * 用户每次等级发生变更时,记录一条日志 - * - * @author owen - */ -@TableName("member_level_record") -@KeySequence("member_level_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberLevelRecordDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 用户编号 - * - * 关联 {@link MemberUserDO#getId()} 字段 - */ - private Long userId; - /** - * 等级编号 - * - * 关联 {@link MemberLevelDO#getId()} 字段 - */ - private Long levelId; - /** - * 会员等级 - * - * 冗余 {@link MemberLevelDO#getLevel()} 字段 - */ - private Integer level; - /** - * 享受折扣 - */ - private Integer discountPercent; - /** - * 升级经验 - */ - private Integer experience; - /** - * 会员此时的经验 - */ - private Integer userExperience; - /** - * 备注 - */ - private String remark; - /** - * 描述 - */ - private String description; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointConfigDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointConfigDO.java deleted file mode 100644 index 30ac7012..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointConfigDO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.win.module.member.dal.dataobject.point; - -import com.win.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 QingX - */ -@TableName(value = "member_point_config", autoResultMap = true) -@KeySequence("member_point_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberPointConfigDO extends BaseDO { - - /** - * 自增主键 - */ - @TableId - private Long id; - /** - * 积分抵扣开关 - */ - private Boolean tradeDeductEnable; - /** - * 积分抵扣,单位:分 - * - * 1 积分抵扣多少分 - */ - private Integer tradeDeductUnitPrice; - /** - * 积分抵扣最大值 - */ - private Integer tradeDeductMaxPrice; - /** - * 1 元赠送多少分 - */ - private Integer tradeGivePoint; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointRecordDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointRecordDO.java deleted file mode 100644 index dee92e95..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/point/MemberPointRecordDO.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.win.module.member.dal.dataobject.point; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.member.enums.point.MemberPointBizTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 用户积分记录 DO - * - * @author QingX - */ -@TableName("member_point_record") -@KeySequence("member_point_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberPointRecordDO extends BaseDO { - - /** - * 自增主键 - */ - @TableId - private Long id; - /** - * 用户编号 - * - * 对应 MemberUserDO 的 id 属性 - */ - private Long userId; - - /** - * 业务编码 - */ - private String bizId; - /** - * 业务类型 - * - * 枚举 {@link MemberPointBizTypeEnum} - */ - private Integer bizType; - - /** - * 积分标题 - */ - private String title; - /** - * 积分描述 - */ - private String description; - - /** - * 变动积分 - * - * 1、正数表示获得积分 - * 2、负数表示消耗积分 - */ - private Integer point; - /** - * 变动后的积分 - */ - private Integer totalPoint; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInConfigDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInConfigDO.java deleted file mode 100644 index 308629a2..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInConfigDO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.win.module.member.dal.dataobject.signin; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 QingX - */ -@TableName("member_sign_in_config") -@KeySequence("member_sign_in_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberSignInConfigDO extends BaseDO { - - /** - * 规则自增主键 - */ - @TableId - private Long id; - /** - * 签到第 x 天 - */ - private Integer day; - /** - * 奖励积分 - */ - private Integer point; - - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInRecordDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInRecordDO.java deleted file mode 100644 index aae5580e..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/signin/MemberSignInRecordDO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.member.dal.dataobject.signin; - -import com.win.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 芋道源码 - */ -@TableName("member_sign_in_record") -@KeySequence("member_sign_in_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberSignInRecordDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 签到用户 - */ - private Long userId; - /** - * 第几天签到 - */ - private Integer day; - /** - * 签到的分数 - */ - private Integer point; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/tag/MemberTagDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/tag/MemberTagDO.java deleted file mode 100644 index b2d722f7..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/tag/MemberTagDO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.member.dal.dataobject.tag; - -import com.win.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 芋道源码 - */ -@TableName("member_tag") -@KeySequence("member_tag_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberTagDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 标签名称 - */ - private String name; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/user/MemberUserDO.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/user/MemberUserDO.java deleted file mode 100644 index 915b615c..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/dataobject/user/MemberUserDO.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.win.module.member.dal.dataobject.user; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.ip.core.Area; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -import com.win.framework.tenant.core.db.TenantBaseDO; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.system.enums.common.SexEnum; -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.*; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 会员用户 DO - * - * uk_mobile 索引:基于 {@link #mobile} 字段 - * - * @author 芋道源码 - */ -@TableName(value = "member_user", autoResultMap = true) -@KeySequence("member_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MemberUserDO extends TenantBaseDO { - - // ========== 账号信息 ========== - - /** - * 用户ID - */ - @TableId - private Long id; - /** - * 手机 - */ - private String mobile; - /** - * 加密后的密码 - * - * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 - */ - private String password; - /** - * 帐号状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 注册 IP - */ - private String registerIp; - /** - * 最后登录IP - */ - private String loginIp; - /** - * 最后登录时间 - */ - private LocalDateTime loginDate; - - // ========== 基础信息 ========== - - /** - * 用户昵称 - */ - private String nickname; - /** - * 用户头像 - */ - private String avatar; - - /** - * 真实名字 - */ - private String name; - /** - * 性别 - * - * 枚举 {@link SexEnum} - */ - private Integer sex; - /** - * 出生日期 - */ - private LocalDateTime birthday; - /** - * 所在地 - * - * 关联 {@link Area#getId()} 字段 - */ - private Integer areaId; - /** - * 用户备注 - */ - private String mark; - - // ========== 其它信息 ========== - - /** - * 积分 - */ - private Integer point; - // TODO 芋艿:增加一个 totalPoint;个人信息接口要返回 - - /** - * 会员标签列表,以逗号分隔 - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List tagIds; - - /** - * 会员级别编号 - * - * 关联 {@link MemberLevelDO#getId()} 字段 - */ - private Long levelId; - /** - * 会员经验 - */ - private Integer experience; - /** - * 用户分组编号 - * - * 关联 {@link MemberGroupDO#getId()} 字段 - */ - private Long groupId; - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/address/MemberAddressMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/address/MemberAddressMapper.java deleted file mode 100644 index bf0b7840..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/address/MemberAddressMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.member.dal.mysql.address; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface MemberAddressMapper extends BaseMapperX { - - default MemberAddressDO selectByIdAndUserId(Long id, Long userId) { - return selectOne(MemberAddressDO::getId, id, MemberAddressDO::getUserId, userId); - } - - default List selectListByUserIdAndDefaulted(Long userId, Boolean defaulted) { - return selectList(new LambdaQueryWrapperX().eq(MemberAddressDO::getUserId, userId) - .eqIfPresent(MemberAddressDO::getDefaultStatus, defaulted)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/group/MemberGroupMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/group/MemberGroupMapper.java deleted file mode 100644 index 48a25195..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/group/MemberGroupMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.member.dal.mysql.group; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.group.vo.MemberGroupPageReqVO; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 用户分组 Mapper - * - * @author owen - */ -@Mapper -public interface MemberGroupMapper extends BaseMapperX { - - default PageResult selectPage(MemberGroupPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MemberGroupDO::getName, reqVO.getName()) - .eqIfPresent(MemberGroupDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(MemberGroupDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MemberGroupDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(MemberGroupDO::getStatus, status); - } -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberExperienceRecordMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberExperienceRecordMapper.java deleted file mode 100644 index 983dc0ec..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberExperienceRecordMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.member.dal.mysql.level; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO; -import com.win.module.member.dal.dataobject.level.MemberExperienceRecordDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 会员经验记录 Mapper - * - * @author owen - */ -@Mapper -public interface MemberExperienceRecordMapper extends BaseMapperX { - - default PageResult selectPage(MemberExperienceRecordPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MemberExperienceRecordDO::getUserId, reqVO.getUserId()) - .eqIfPresent(MemberExperienceRecordDO::getBizId, reqVO.getBizId()) - .eqIfPresent(MemberExperienceRecordDO::getBizType, reqVO.getBizType()) - .eqIfPresent(MemberExperienceRecordDO::getTitle, reqVO.getTitle()) - .betweenIfPresent(MemberExperienceRecordDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MemberExperienceRecordDO::getId)); - } - - default PageResult selectPage(Long userId, PageParam pageParam) { - return selectPage(pageParam, new LambdaQueryWrapper() - .eq(MemberExperienceRecordDO::getUserId, userId) - .orderByDesc(MemberExperienceRecordDO::getId)); - } -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelMapper.java deleted file mode 100644 index 5b263e33..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.member.dal.mysql.level; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelListReqVO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 会员等级 Mapper - * - * @author owen - */ -@Mapper -public interface MemberLevelMapper extends BaseMapperX { - - default List selectList(MemberLevelListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(MemberLevelDO::getName, reqVO.getName()) - .eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus()) - .orderByAsc(MemberLevelDO::getLevel)); - } - - - default List selectListByStatus(Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(MemberLevelDO::getStatus, status) - .orderByAsc(MemberLevelDO::getLevel)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelRecordMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelRecordMapper.java deleted file mode 100644 index f3d2d95f..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/level/MemberLevelRecordMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.member.dal.mysql.level; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.level.vo.record.MemberLevelRecordPageReqVO; -import com.win.module.member.dal.dataobject.level.MemberLevelRecordDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 会员等级记录 Mapper - * - * @author owen - */ -@Mapper -public interface MemberLevelRecordMapper extends BaseMapperX { - - default PageResult selectPage(MemberLevelRecordPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MemberLevelRecordDO::getUserId, reqVO.getUserId()) - .eqIfPresent(MemberLevelRecordDO::getLevelId, reqVO.getLevelId()) - .betweenIfPresent(MemberLevelRecordDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MemberLevelRecordDO::getId)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointConfigMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointConfigMapper.java deleted file mode 100644 index 2bf1d575..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.member.dal.mysql.point; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.member.dal.dataobject.point.MemberPointConfigDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 积分设置 Mapper - * - * @author QingX - */ -@Mapper -public interface MemberPointConfigMapper extends BaseMapperX { -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointRecordMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointRecordMapper.java deleted file mode 100644 index 41c140ae..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/point/MemberPointRecordMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.member.dal.mysql.point; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; -import com.win.module.member.dal.dataobject.point.MemberPointRecordDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Set; - -/** - * 用户积分记录 Mapper - * - * @author QingX - */ -@Mapper -public interface MemberPointRecordMapper extends BaseMapperX { - - default PageResult selectPage(MemberPointRecordPageReqVO reqVO, Set userIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .inIfPresent(MemberPointRecordDO::getUserId, userIds) - .eqIfPresent(MemberPointRecordDO::getUserId, reqVO.getUserId()) - .eqIfPresent(MemberPointRecordDO::getBizType, reqVO.getBizType()) - .likeIfPresent(MemberPointRecordDO::getTitle, reqVO.getTitle()) - .orderByDesc(MemberPointRecordDO::getId)); - } - - default PageResult selectPage(Long userId, PageParam pageVO) { - return selectPage(pageVO, new LambdaQueryWrapperX() - .eq(MemberPointRecordDO::getUserId, userId) - .orderByDesc(MemberPointRecordDO::getId)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInConfigMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInConfigMapper.java deleted file mode 100644 index 92b7b6c9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInConfigMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.member.dal.mysql.signin; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.member.dal.dataobject.signin.MemberSignInConfigDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 签到规则 Mapper - * - * @author QingX - */ -@Mapper -public interface MemberSignInConfigMapper extends BaseMapperX { - - default MemberSignInConfigDO selectByDay(Integer day) { - return selectOne(MemberSignInConfigDO::getDay, day); - } - - default List selectListByStatus(Integer status) { - return selectList(MemberSignInConfigDO::getStatus, status); - } -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInRecordMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInRecordMapper.java deleted file mode 100644 index 020b0512..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/signin/MemberSignInRecordMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.member.dal.mysql.signin; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.signin.vo.record.MemberSignInRecordPageReqVO; -import com.win.module.member.dal.dataobject.signin.MemberSignInRecordDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Set; - -/** - * 签到记录 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MemberSignInRecordMapper extends BaseMapperX { - - default PageResult selectPage(MemberSignInRecordPageReqVO reqVO, Set userIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .inIfPresent(MemberSignInRecordDO::getUserId, userIds) - .eqIfPresent(MemberSignInRecordDO::getUserId, reqVO.getUserId()) - .eqIfPresent(MemberSignInRecordDO::getDay, reqVO.getDay()) - .betweenIfPresent(MemberSignInRecordDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MemberSignInRecordDO::getId)); - } - - default PageResult selectPage(Long userId, PageParam pageParam) { - return selectPage(pageParam, new LambdaQueryWrapperX() - .eq(MemberSignInRecordDO::getUserId, userId) - .orderByDesc(MemberSignInRecordDO::getId)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/tag/MemberTagMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/tag/MemberTagMapper.java deleted file mode 100644 index a21d2623..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/tag/MemberTagMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.member.dal.mysql.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.tag.vo.MemberTagPageReqVO; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 会员标签 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MemberTagMapper extends BaseMapperX { - - default PageResult selectPage(MemberTagPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MemberTagDO::getName, reqVO.getName()) - .betweenIfPresent(MemberTagDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MemberTagDO::getId)); - } - - default MemberTagDO selelctByName(String name) { - return selectOne(MemberTagDO::getName, name); - } -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/user/MemberUserMapper.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/user/MemberUserMapper.java deleted file mode 100644 index caa27d19..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/mysql/user/MemberUserMapper.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.member.dal.mysql.user; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.member.controller.admin.user.vo.MemberUserPageReqVO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 会员 User Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MemberUserMapper extends BaseMapperX { - - default MemberUserDO selectByMobile(String mobile) { - return selectOne(MemberUserDO::getMobile, mobile); - } - - default List selectListByNicknameLike(String nickname) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(MemberUserDO::getNickname, nickname)); - } - - default PageResult selectPage(MemberUserPageReqVO reqVO) { - // 处理 tagIds 过滤条件 - String tagIdSql = ""; - if (CollUtil.isNotEmpty(reqVO.getTagIds())) { - tagIdSql = reqVO.getTagIds().stream() - .map(tagId -> "FIND_IN_SET(" + tagId + ", tag_ids)") - .collect(Collectors.joining(" OR ")); - } - // 分页查询 - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile()) - .betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate()) - .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname()) - .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime()) - .eqIfPresent(MemberUserDO::getLevelId, reqVO.getLevelId()) - .eqIfPresent(MemberUserDO::getGroupId, reqVO.getGroupId()) - .apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql) - .orderByDesc(MemberUserDO::getId)); - } - - default Long selectCountByGroupId(Long groupId) { - return selectCount(MemberUserDO::getGroupId, groupId); - } - - default Long selectCountByLevelId(Long levelId) { - return selectCount(MemberUserDO::getLevelId, levelId); - } - - default Long selectCountByTagId(Long tagId) { - return selectCount(new LambdaQueryWrapperX() - .apply("FIND_IN_SET({0}, tag_ids)", tagId)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/package-info.java deleted file mode 100644 index ee563bd2..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * DAL = Data Access Layer 数据访问层 - * 1. data object:数据对象 - * 2. redis:Redis 的 CRUD 操作 - * 3. mysql:MySQL 的 CRUD 操作 - * - * 其中,MySQL 的表以 member_ 作为前缀 - */ -package com.win.module.member.dal; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/redis/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/redis/package-info.java deleted file mode 100644 index 19c656ce..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/dal/redis/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位,后续有类后,可以删除,避免 package 无法提交到 Git 上 - */ -package com.win.module.member.dal.redis; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/package-info.java deleted file mode 100644 index 4181686d..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 member 模块的 framework 封装 - * - * @author 芋道源码 - */ -package com.win.module.member.framework; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/config/MemberWebConfiguration.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/config/MemberWebConfiguration.java deleted file mode 100644 index fe3cc251..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/config/MemberWebConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.member.framework.web.config; - -import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; -import org.springdoc.core.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * member 模块的 web 组件的 Configuration - * - * @author 芋道源码 - */ -@Configuration(proxyBeanMethods = false) -public class MemberWebConfiguration { - - /** - * member 模块的 API 分组 - */ - @Bean - public GroupedOpenApi memberGroupedOpenApi() { - return WinSwaggerAutoConfiguration.buildGroupedOpenApi("member"); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/package-info.java deleted file mode 100644 index 633720d6..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * member 模块的 web 配置 - */ -package com.win.module.member.framework.web; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/package-info.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/package-info.java deleted file mode 100644 index feb87bc4..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * member 模块,我们放会员业务。 - * 例如说:会员中心等等 - * - * 1. Controller URL:以 /member/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 member_ 开头,方便在数据库中区分 - */ -package com.win.module.member; diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressService.java deleted file mode 100644 index d3ae10ba..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressService.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.module.member.service.address; - -import com.win.module.member.controller.app.address.vo.AppAddressCreateReqVO; -import com.win.module.member.controller.app.address.vo.AppAddressUpdateReqVO; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 用户收件地址 Service 接口 - * - * @author 芋道源码 - */ -public interface AddressService { - - /** - * 创建用户收件地址 - * - * - * @param userId 用户编号 - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createAddress(Long userId, @Valid AppAddressCreateReqVO createReqVO); - - /** - * 更新用户收件地址 - * - * @param userId 用户编号 - * @param updateReqVO 更新信息 - */ - void updateAddress(Long userId, @Valid AppAddressUpdateReqVO updateReqVO); - - /** - * 删除用户收件地址 - * - * @param userId 用户编号 - * @param id 编号 - */ - void deleteAddress(Long userId, Long id); - - /** - * 获得用户收件地址 - * - * @param id 编号 - * @return 用户收件地址 - */ - MemberAddressDO getAddress(Long userId, Long id); - - /** - * 获得用户收件地址列表 - * - * @param userId 用户编号 - * @return 用户收件地址列表 - */ - List getAddressList(Long userId); - - /** - * 获得用户默认的收件地址 - * - * @param userId 用户编号 - * @return 用户收件地址 - */ - MemberAddressDO getDefaultUserAddress(Long userId); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressServiceImpl.java deleted file mode 100644 index b9cee2b4..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/address/AddressServiceImpl.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.win.module.member.service.address; - -import cn.hutool.core.collection.CollUtil; -import com.win.module.member.controller.app.address.vo.AppAddressCreateReqVO; -import com.win.module.member.controller.app.address.vo.AppAddressUpdateReqVO; -import com.win.module.member.convert.address.AddressConvert; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; -import com.win.module.member.dal.mysql.address.MemberAddressMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.ADDRESS_NOT_EXISTS; - -/** - * 用户收件地址 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class AddressServiceImpl implements AddressService { - - @Resource - private MemberAddressMapper memberAddressMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createAddress(Long userId, AppAddressCreateReqVO createReqVO) { - // 如果添加的是默认收件地址,则将原默认地址修改为非默认 - if (Boolean.TRUE.equals(createReqVO.getDefaultStatus())) { - List addresses = memberAddressMapper.selectListByUserIdAndDefaulted(userId, true); - addresses.forEach(address -> memberAddressMapper.updateById(new MemberAddressDO().setId(address.getId()).setDefaultStatus(false))); - } - - // 插入 - MemberAddressDO address = AddressConvert.INSTANCE.convert(createReqVO); - address.setUserId(userId); - memberAddressMapper.insert(address); - // 返回 - return address.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateAddress(Long userId, AppAddressUpdateReqVO updateReqVO) { - // 校验存在,校验是否能够操作 - validAddressExists(userId, updateReqVO.getId()); - - // 如果修改的是默认收件地址,则将原默认地址修改为非默认 - if (Boolean.TRUE.equals(updateReqVO.getDefaultStatus())) { - List addresses = memberAddressMapper.selectListByUserIdAndDefaulted(userId, true); - addresses.stream().filter(u -> !u.getId().equals(updateReqVO.getId())) // 排除自己 - .forEach(address -> memberAddressMapper.updateById(new MemberAddressDO().setId(address.getId()).setDefaultStatus(false))); - } - - // 更新 - MemberAddressDO updateObj = AddressConvert.INSTANCE.convert(updateReqVO); - memberAddressMapper.updateById(updateObj); - } - - @Override - public void deleteAddress(Long userId, Long id) { - // 校验存在,校验是否能够操作 - validAddressExists(userId, id); - // 删除 - memberAddressMapper.deleteById(id); - } - - private void validAddressExists(Long userId, Long id) { - MemberAddressDO addressDO = getAddress(userId, id); - if (addressDO == null) { - throw exception(ADDRESS_NOT_EXISTS); - } - } - - @Override - public MemberAddressDO getAddress(Long userId, Long id) { - return memberAddressMapper.selectByIdAndUserId(id, userId); - } - - @Override - public List getAddressList(Long userId) { - return memberAddressMapper.selectListByUserIdAndDefaulted(userId, null); - } - - @Override - public MemberAddressDO getDefaultUserAddress(Long userId) { - List addresses = memberAddressMapper.selectListByUserIdAndDefaulted(userId, true); - return CollUtil.getFirst(addresses); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthService.java deleted file mode 100644 index a7bd9b52..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthService.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.win.module.member.service.auth; - -import com.win.module.member.controller.app.auth.vo.*; - -import javax.validation.Valid; - -/** - * 会员的认证 Service 接口 - * - * 提供用户的账号密码登录、token 的校验等认证相关的功能 - * - * @author 芋道源码 - */ -public interface MemberAuthService { - - /** - * 手机 + 密码登录 - * - * @param reqVO 登录信息 - * @return 登录结果 - */ - AppAuthLoginRespVO login(@Valid AppAuthLoginReqVO reqVO); - - /** - * 基于 token 退出登录 - * - * @param token token - */ - void logout(String token); - - /** - * 手机 + 验证码登陆 - * - * @param reqVO 登陆信息 - * @return 登录结果 - */ - AppAuthLoginRespVO smsLogin(@Valid AppAuthSmsLoginReqVO reqVO); - - /** - * 社交登录,使用 code 授权码 - * - * @param reqVO 登录信息 - * @return 登录结果 - */ - AppAuthLoginRespVO socialLogin(@Valid AppAuthSocialLoginReqVO reqVO); - - /** - * 微信小程序的一键登录 - * - * @param reqVO 登录信息 - * @return 登录结果 - */ - AppAuthLoginRespVO weixinMiniAppLogin(AppAuthWeixinMiniAppLoginReqVO reqVO); - - /** - * 获得社交认证 URL - * - * @param type 社交平台类型 - * @param redirectUri 跳转地址 - * @return 认证 URL - */ - String getSocialAuthorizeUrl(Integer type, String redirectUri); - - /** - * 给用户发送短信验证码 - * - * @param userId 用户编号 - * @param reqVO 发送信息 - */ - void sendSmsCode(Long userId, AppAuthSmsSendReqVO reqVO); - - /** - * 校验短信验证码是否正确 - * - * @param userId 用户编号 - * @param reqVO 校验信息 - */ - void validateSmsCode(Long userId, AppAuthSmsValidateReqVO reqVO); - - /** - * 刷新访问令牌 - * - * @param refreshToken 刷新令牌 - * @return 登录结果 - */ - AppAuthLoginRespVO refreshToken(String refreshToken); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthServiceImpl.java deleted file mode 100644 index 4beda669..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/auth/MemberAuthServiceImpl.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.win.module.member.service.auth; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.common.util.monitor.TracerUtils; -import com.win.framework.common.util.servlet.ServletUtils; -import com.win.module.member.controller.app.auth.vo.*; -import com.win.module.member.convert.auth.AuthConvert; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.service.user.MemberUserService; -import com.win.module.system.api.logger.LoginLogApi; -import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; -import com.win.module.system.api.oauth2.OAuth2TokenApi; -import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; -import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; -import com.win.module.system.api.sms.SmsCodeApi; -import com.win.module.system.api.social.SocialUserApi; -import com.win.module.system.api.social.dto.SocialUserBindReqDTO; -import com.win.module.system.api.social.dto.SocialUserRespDTO; -import com.win.module.system.enums.logger.LoginLogTypeEnum; -import com.win.module.system.enums.logger.LoginResultEnum; -import com.win.module.system.enums.oauth2.OAuth2ClientConstants; -import com.win.module.system.enums.sms.SmsSceneEnum; -import com.win.module.system.enums.social.SocialTypeEnum; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.Objects; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.module.member.enums.ErrorCodeConstants.*; - -/** - * 会员的认证 Service 接口 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class MemberAuthServiceImpl implements MemberAuthService { - - @Resource - private MemberUserService userService; - @Resource - private SmsCodeApi smsCodeApi; - @Resource - private LoginLogApi loginLogApi; - @Resource - private SocialUserApi socialUserApi; - @Resource - private OAuth2TokenApi oauth2TokenApi; - - @Resource - private WxMaService wxMaService; - - @Override - public AppAuthLoginRespVO login(AppAuthLoginReqVO reqVO) { - // 使用手机 + 密码,进行登录。 - MemberUserDO user = login0(reqVO.getMobile(), reqVO.getPassword()); - - // 如果 socialType 非空,说明需要绑定社交用户 - String openid = null; - if (reqVO.getSocialType() != null) { - openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), - reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); - } - - // 创建 Token 令牌,记录登录日志 - return createTokenAfterLoginSuccess(user, reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE, openid); - } - - @Override - @Transactional - public AppAuthLoginRespVO smsLogin(AppAuthSmsLoginReqVO reqVO) { - // 校验验证码 - String userIp = getClientIP(); - smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)); - - // 获得获得注册用户 - MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); - Assert.notNull(user, "获取用户失败,结果为空"); - - // 如果 socialType 非空,说明需要绑定社交用户 - String openid = null; - if (reqVO.getSocialType() != null) { - openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), - reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); - } - - // 创建 Token 令牌,记录登录日志 - return createTokenAfterLoginSuccess(user, reqVO.getMobile(), LoginLogTypeEnum.LOGIN_SMS, openid); - } - - @Override - public AppAuthLoginRespVO socialLogin(AppAuthSocialLoginReqVO reqVO) { - // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 - SocialUserRespDTO socialUser = socialUserApi.getSocialUser(UserTypeEnum.MEMBER.getValue(), reqVO.getType(), - reqVO.getCode(), reqVO.getState()); - if (socialUser == null) { - throw exception(AUTH_THIRD_LOGIN_NOT_BIND); - } - - // 自动登录 - MemberUserDO user = userService.getUser(socialUser.getUserId()); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - - // 创建 Token 令牌,记录登录日志 - return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, socialUser.getOpenid()); - } - - @Override - public AppAuthLoginRespVO weixinMiniAppLogin(AppAuthWeixinMiniAppLoginReqVO reqVO) { - // 获得对应的手机号信息 - // TODO @芋艿:需要弱化微信小程序的依赖,通过 system 获取手机号 - WxMaPhoneNumberInfo phoneNumberInfo; - try { - phoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(reqVO.getPhoneCode()); - } catch (Exception exception) { - throw exception(AUTH_WEIXIN_MINI_APP_PHONE_CODE_ERROR); - } - // 获得获得注册用户 - MemberUserDO user = userService.createUserIfAbsent(phoneNumberInfo.getPurePhoneNumber(), getClientIP()); - Assert.notNull(user, "获取用户失败,结果为空"); - - // 绑定社交用户 - String openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), - SocialTypeEnum.WECHAT_MINI_APP.getType(), reqVO.getLoginCode(), "")); - - // 创建 Token 令牌,记录登录日志 - return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, openid); - } - - private AppAuthLoginRespVO createTokenAfterLoginSuccess(MemberUserDO user, String mobile, - LoginLogTypeEnum logType, String openid) { - // 插入登陆日志 - createLoginLog(user.getId(), mobile, logType, LoginResultEnum.SUCCESS); - // 创建 Token 令牌 - OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(new OAuth2AccessTokenCreateReqDTO() - .setUserId(user.getId()).setUserType(getUserType().getValue()) - .setClientId(OAuth2ClientConstants.CLIENT_ID_DEFAULT)); - // 构建返回结果 - return AuthConvert.INSTANCE.convert(accessTokenRespDTO, openid); - } - - @Override - public String getSocialAuthorizeUrl(Integer type, String redirectUri) { - return socialUserApi.getAuthorizeUrl(type, redirectUri); - } - - private MemberUserDO login0(String mobile, String password) { - final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_MOBILE; - // 校验账号是否存在 - MemberUserDO user = userService.getUserByMobile(mobile); - if (user == null) { - createLoginLog(null, mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - if (!userService.isPasswordMatch(password, user.getPassword())) { - createLoginLog(user.getId(), mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - // 校验是否禁用 - if (ObjectUtil.notEqual(user.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { - createLoginLog(user.getId(), mobile, logTypeEnum, LoginResultEnum.USER_DISABLED); - throw exception(AUTH_LOGIN_USER_DISABLED); - } - return user; - } - - private void createLoginLog(Long userId, String mobile, LoginLogTypeEnum logType, LoginResultEnum loginResult) { - // 插入登录日志 - LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); - reqDTO.setLogType(logType.getType()); - reqDTO.setTraceId(TracerUtils.getTraceId()); - reqDTO.setUserId(userId); - reqDTO.setUserType(getUserType().getValue()); - reqDTO.setUsername(mobile); - reqDTO.setUserAgent(ServletUtils.getUserAgent()); - reqDTO.setUserIp(getClientIP()); - reqDTO.setResult(loginResult.getResult()); - loginLogApi.createLoginLog(reqDTO); - // 更新最后登录时间 - if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { - userService.updateUserLogin(userId, getClientIP()); - } - } - - @Override - public void logout(String token) { - // 删除访问令牌 - OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.removeAccessToken(token); - if (accessTokenRespDTO == null) { - return; - } - // 删除成功,则记录登出日志 - createLogoutLog(accessTokenRespDTO.getUserId()); - } - - @Override - public void sendSmsCode(Long userId, AppAuthSmsSendReqVO reqVO) { - // 情况 1:如果是修改手机场景,需要校验新手机号是否已经注册,说明不能使用该手机了 - if (Objects.equals(reqVO.getScene(), SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene())) { - MemberUserDO user = userService.getUserByMobile(reqVO.getMobile()); - if (user != null && !Objects.equals(user.getId(), userId)) { - throw exception(AUTH_MOBILE_USED); - } - } - // 情况 2:如果是重置密码场景,需要校验手机号是存在的 - if (Objects.equals(reqVO.getScene(), SmsSceneEnum.MEMBER_RESET_PASSWORD.getScene())) { - MemberUserDO user= userService.getUserByMobile(reqVO.getMobile()); - if (user == null) { - throw exception(USER_MOBILE_NOT_EXISTS); - } - } - - // 执行发送 - smsCodeApi.sendSmsCode(AuthConvert.INSTANCE.convert(reqVO).setCreateIp(getClientIP())); - } - - @Override - public void validateSmsCode(Long userId, AppAuthSmsValidateReqVO reqVO) { - smsCodeApi.validateSmsCode(AuthConvert.INSTANCE.convert(reqVO)); - } - - @Override - public AppAuthLoginRespVO refreshToken(String refreshToken) { - OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.refreshAccessToken(refreshToken, - OAuth2ClientConstants.CLIENT_ID_DEFAULT); - return AuthConvert.INSTANCE.convert(accessTokenDO, null); - } - - private void createLogoutLog(Long userId) { - LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); - reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType()); - reqDTO.setTraceId(TracerUtils.getTraceId()); - reqDTO.setUserId(userId); - reqDTO.setUserType(getUserType().getValue()); - reqDTO.setUsername(getMobile(userId)); - reqDTO.setUserAgent(ServletUtils.getUserAgent()); - reqDTO.setUserIp(getClientIP()); - reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); - loginLogApi.createLoginLog(reqDTO); - } - - private String getMobile(Long userId) { - if (userId == null) { - return null; - } - MemberUserDO user = userService.getUser(userId); - return user != null ? user.getMobile() : null; - } - - private UserTypeEnum getUserType() { - return UserTypeEnum.MEMBER; - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupService.java deleted file mode 100644 index b8706b8f..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.win.module.member.service.group; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.group.vo.MemberGroupCreateReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupPageReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 用户分组 Service 接口 - * - * @author owen - */ -public interface MemberGroupService { - - /** - * 创建用户分组 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createGroup(@Valid MemberGroupCreateReqVO createReqVO); - - /** - * 更新用户分组 - * - * @param updateReqVO 更新信息 - */ - void updateGroup(@Valid MemberGroupUpdateReqVO updateReqVO); - - /** - * 删除用户分组 - * - * @param id 编号 - */ - void deleteGroup(Long id); - - /** - * 获得用户分组 - * - * @param id 编号 - * @return 用户分组 - */ - MemberGroupDO getGroup(Long id); - - /** - * 获得用户分组列表 - * - * @param ids 编号 - * @return 用户分组列表 - */ - List getGroupList(Collection ids); - - /** - * 获得用户分组分页 - * - * @param pageReqVO 分页查询 - * @return 用户分组分页 - */ - PageResult getGroupPage(MemberGroupPageReqVO pageReqVO); - - - /** - * 获得指定状态的用户分组列表 - * - * @param status 状态 - * @return 用户分组列表 - */ - List getGroupListByStatus(Integer status); - - - /** - * 获得开启状态的用户分组列表 - * - * @return 用户分组列表 - */ - default List getEnableGroupList() { - return getGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupServiceImpl.java deleted file mode 100644 index 76397eda..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/group/MemberGroupServiceImpl.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.win.module.member.service.group; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.group.vo.MemberGroupCreateReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupPageReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO; -import com.win.module.member.convert.group.MemberGroupConvert; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import com.win.module.member.dal.mysql.group.MemberGroupMapper; -import com.win.module.member.service.user.MemberUserService; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.GROUP_HAS_USER; -import static com.win.module.member.enums.ErrorCodeConstants.GROUP_NOT_EXISTS; - -/** - * 用户分组 Service 实现类 - * - * @author owen - */ -@Service -@Validated -public class MemberGroupServiceImpl implements MemberGroupService { - - @Resource - private MemberGroupMapper memberGroupMapper; - - @Resource - private MemberUserService memberUserService; - - @Override - public Long createGroup(MemberGroupCreateReqVO createReqVO) { - // 插入 - MemberGroupDO group = MemberGroupConvert.INSTANCE.convert(createReqVO); - memberGroupMapper.insert(group); - // 返回 - return group.getId(); - } - - @Override - public void updateGroup(MemberGroupUpdateReqVO updateReqVO) { - // 校验存在 - validateGroupExists(updateReqVO.getId()); - // 更新 - MemberGroupDO updateObj = MemberGroupConvert.INSTANCE.convert(updateReqVO); - memberGroupMapper.updateById(updateObj); - } - - @Override - public void deleteGroup(Long id) { - // 校验存在 - validateGroupExists(id); - // 校验分组下是否有用户 - validateGroupHasUser(id); - // 删除 - memberGroupMapper.deleteById(id); - } - - void validateGroupExists(Long id) { - if (memberGroupMapper.selectById(id) == null) { - throw exception(GROUP_NOT_EXISTS); - } - } - - void validateGroupHasUser(Long id) { - Long count = memberUserService.getUserCountByGroupId(id); - if (count > 0) { - throw exception(GROUP_HAS_USER); - } - } - - @Override - public MemberGroupDO getGroup(Long id) { - return memberGroupMapper.selectById(id); - } - - @Override - public List getGroupList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return ListUtil.empty(); - } - return memberGroupMapper.selectBatchIds(ids); - } - - @Override - public PageResult getGroupPage(MemberGroupPageReqVO pageReqVO) { - return memberGroupMapper.selectPage(pageReqVO); - } - - @Override - public List getGroupListByStatus(Integer status) { - return memberGroupMapper.selectListByStatus(status); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordService.java deleted file mode 100644 index 784e3459..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordService.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.member.service.level; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO; -import com.win.module.member.dal.dataobject.level.MemberExperienceRecordDO; -import com.win.module.member.enums.MemberExperienceBizTypeEnum; - -/** - * 会员经验记录 Service 接口 - * - * @author owen - */ -public interface MemberExperienceRecordService { - - /** - * 获得会员经验记录 - * - * @param id 编号 - * @return 会员经验记录 - */ - MemberExperienceRecordDO getExperienceRecord(Long id); - - /** - * 【管理员】获得会员经验记录分页 - * - * @param pageReqVO 分页查询 - * @return 会员经验记录分页 - */ - PageResult getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO); - - /** - * 【会员】获得会员经验记录分页 - * - * @param userId 用户编号 - * @param pageParam 分页查询 - * @return 会员经验记录分页 - */ - PageResult getExperienceRecordPage(Long userId, PageParam pageParam); - - /** - * 根据业务类型, 创建 经验变动记录 - * - * @param userId 会员编号 - * @param experience 变动经验值 - * @param totalExperience 会员当前的经验 - * @param bizType 业务类型 - * @param bizId 业务ID - */ - void createExperienceRecord(Long userId, Integer experience, Integer totalExperience, - MemberExperienceBizTypeEnum bizType, String bizId); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordServiceImpl.java deleted file mode 100644 index b6f69d8f..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberExperienceRecordServiceImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.member.service.level; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO; -import com.win.module.member.convert.level.MemberExperienceRecordConvert; -import com.win.module.member.dal.dataobject.level.MemberExperienceRecordDO; -import com.win.module.member.dal.mysql.level.MemberExperienceRecordMapper; -import com.win.module.member.enums.MemberExperienceBizTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -/** - * 会员经验记录 Service 实现类 - * - * @author owen - */ -@Service -@Validated -public class MemberExperienceRecordServiceImpl implements MemberExperienceRecordService { - - @Resource - private MemberExperienceRecordMapper experienceLogMapper; - - @Override - public MemberExperienceRecordDO getExperienceRecord(Long id) { - return experienceLogMapper.selectById(id); - } - - @Override - public PageResult getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO) { - return experienceLogMapper.selectPage(pageReqVO); - } - - @Override - public PageResult getExperienceRecordPage(Long userId, PageParam pageParam) { - return experienceLogMapper.selectPage(userId, pageParam); - } - - @Override - public void createExperienceRecord(Long userId, Integer experience, Integer totalExperience, - MemberExperienceBizTypeEnum bizType, String bizId) { - String description = StrUtil.format(bizType.getDescription(), experience); - MemberExperienceRecordDO record = MemberExperienceRecordConvert.INSTANCE.convert( - userId, experience, totalExperience, - bizId, bizType.getType(), bizType.getTitle(), description); - experienceLogMapper.insert(record); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordService.java deleted file mode 100644 index b2a90541..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordService.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.member.service.level; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.record.MemberLevelRecordPageReqVO; -import com.win.module.member.dal.dataobject.level.MemberLevelRecordDO; - -/** - * 会员等级记录 Service 接口 - * - * @author owen - */ -public interface MemberLevelRecordService { - - /** - * 获得会员等级记录 - * - * @param id 编号 - * @return 会员等级记录 - */ - MemberLevelRecordDO getLevelRecord(Long id); - - /** - * 获得会员等级记录分页 - * - * @param pageReqVO 分页查询 - * @return 会员等级记录分页 - */ - PageResult getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO); - - /** - * 创建会员等级记录 - * - * @param levelRecord 会员等级记录 - */ - void createLevelRecord(MemberLevelRecordDO levelRecord); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordServiceImpl.java deleted file mode 100644 index 141d6f6e..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelRecordServiceImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.member.service.level; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.level.vo.record.MemberLevelRecordPageReqVO; -import com.win.module.member.dal.dataobject.level.MemberLevelRecordDO; -import com.win.module.member.dal.mysql.level.MemberLevelRecordMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * 会员等级记录 Service 实现类 - * - * @author owen - */ -@Service -@Validated -public class MemberLevelRecordServiceImpl implements MemberLevelRecordService { - - @Resource - private MemberLevelRecordMapper levelLogMapper; - - @Override - public MemberLevelRecordDO getLevelRecord(Long id) { - return levelLogMapper.selectById(id); - } - - @Override - public PageResult getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) { - return levelLogMapper.selectPage(pageReqVO); - } - - @Override - public void createLevelRecord(MemberLevelRecordDO levelRecord) { - levelLogMapper.insert(levelRecord); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelService.java deleted file mode 100644 index 22d25296..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelService.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.win.module.member.service.level; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelListReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.enums.MemberExperienceBizTypeEnum; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 会员等级 Service 接口 - * - * @author owen - */ -public interface MemberLevelService { - - /** - * 创建会员等级 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createLevel(@Valid MemberLevelCreateReqVO createReqVO); - - /** - * 更新会员等级 - * - * @param updateReqVO 更新信息 - */ - void updateLevel(@Valid MemberLevelUpdateReqVO updateReqVO); - - /** - * 删除会员等级 - * - * @param id 编号 - */ - void deleteLevel(Long id); - - /** - * 获得会员等级 - * - * @param id 编号 - * @return 会员等级 - */ - MemberLevelDO getLevel(Long id); - - /** - * 获得会员等级列表 - * - * @param ids 编号 - * @return 会员等级列表 - */ - List getLevelList(Collection ids); - - /** - * 获得会员等级列表 - * - * @param listReqVO 查询参数 - * @return 会员等级列表 - */ - List getLevelList(MemberLevelListReqVO listReqVO); - - /** - * 获得指定状态的会员等级列表 - * - * @param status 状态 - * @return 会员等级列表 - */ - List getLevelListByStatus(Integer status); - - /** - * 获得开启状态的会员等级列表 - * - * @return 会员等级列表 - */ - default List getEnableLevelList() { - return getLevelListByStatus(CommonStatusEnum.ENABLE.getStatus()); - } - - /** - * 修改会员的等级 - * - * @param updateReqVO 修改参数 - */ - void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO); - - /** - * 增加会员经验 - * - * @param userId 会员ID - * @param experience 经验 - * @param bizType 业务类型 - * @param bizId 业务编号 - */ - void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelServiceImpl.java deleted file mode 100644 index 189eea9e..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/level/MemberLevelServiceImpl.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.win.module.member.service.level; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.ObjectUtil; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelListReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO; -import com.win.module.member.convert.level.MemberLevelConvert; -import com.win.module.member.convert.level.MemberLevelRecordConvert; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.dal.dataobject.level.MemberLevelRecordDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.dal.mysql.level.MemberLevelMapper; -import com.win.module.member.enums.MemberExperienceBizTypeEnum; -import com.win.module.member.service.user.MemberUserService; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -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.Collections; -import java.util.Comparator; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.*; - -/** - * 会员等级 Service 实现类 - * - * @author owen - */ -@Slf4j -@Service -@Validated -public class MemberLevelServiceImpl implements MemberLevelService { - - @Resource - private MemberLevelMapper memberLevelMapper; - - @Resource - private MemberLevelRecordService memberLevelRecordService; - @Resource - private MemberExperienceRecordService memberExperienceRecordService; - @Resource - private MemberUserService memberUserService; - - @Override - public Long createLevel(MemberLevelCreateReqVO createReqVO) { - // 校验配置是否有效 - validateConfigValid(null, createReqVO.getName(), createReqVO.getLevel(), createReqVO.getExperience()); - - // 插入 - MemberLevelDO level = MemberLevelConvert.INSTANCE.convert(createReqVO); - memberLevelMapper.insert(level); - // 返回 - return level.getId(); - } - - @Override - public void updateLevel(MemberLevelUpdateReqVO updateReqVO) { - // 校验存在 - validateLevelExists(updateReqVO.getId()); - // 校验配置是否有效 - validateConfigValid(updateReqVO.getId(), updateReqVO.getName(), updateReqVO.getLevel(), updateReqVO.getExperience()); - - // 更新 - MemberLevelDO updateObj = MemberLevelConvert.INSTANCE.convert(updateReqVO); - memberLevelMapper.updateById(updateObj); - } - - @Override - public void deleteLevel(Long id) { - // 校验存在 - validateLevelExists(id); - // 校验分组下是否有用户 - validateLevelHasUser(id); - // 删除 - memberLevelMapper.deleteById(id); - } - - @VisibleForTesting - MemberLevelDO validateLevelExists(Long id) { - MemberLevelDO levelDO = memberLevelMapper.selectById(id); - if (levelDO == null) { - throw exception(LEVEL_NOT_EXISTS); - } - return levelDO; - } - - @VisibleForTesting - void validateNameUnique(List list, Long id, String name) { - for (MemberLevelDO levelDO : list) { - if (ObjUtil.notEqual(levelDO.getName(), name)) { - continue; - } - if (id == null || !id.equals(levelDO.getId())) { - throw exception(LEVEL_NAME_EXISTS, levelDO.getName()); - } - } - } - - @VisibleForTesting - void validateLevelUnique(List list, Long id, Integer level) { - for (MemberLevelDO levelDO : list) { - if (ObjUtil.notEqual(levelDO.getLevel(), level)) { - continue; - } - - if (id == null || !id.equals(levelDO.getId())) { - throw exception(LEVEL_VALUE_EXISTS, levelDO.getLevel(), levelDO.getName()); - } - } - } - - @VisibleForTesting - void validateExperienceOutRange(List list, Long id, Integer level, Integer experience) { - for (MemberLevelDO levelDO : list) { - if (levelDO.getId().equals(id)) { - continue; - } - - if (levelDO.getLevel() < level) { - // 经验大于前一个等级 - if (experience <= levelDO.getExperience()) { - throw exception(LEVEL_EXPERIENCE_MIN, levelDO.getName(), levelDO.getExperience()); - } - } else if (levelDO.getLevel() > level) { - //小于下一个级别 - if (experience >= levelDO.getExperience()) { - throw exception(LEVEL_EXPERIENCE_MAX, levelDO.getName(), levelDO.getExperience()); - } - } - } - } - - @VisibleForTesting - void validateConfigValid(Long id, String name, Integer level, Integer experience) { - List list = memberLevelMapper.selectList(); - // 校验名称唯一 - validateNameUnique(list, id, name); - // 校验等级唯一 - validateLevelUnique(list, id, level); - // 校验升级所需经验是否有效: 大于前一个等级,小于下一个级别 - validateExperienceOutRange(list, id, level, experience); - } - - @VisibleForTesting - void validateLevelHasUser(Long id) { - Long count = memberUserService.getUserCountByLevelId(id); - if (count > 0) { - throw exception(LEVEL_HAS_USER); - } - } - - @Override - public MemberLevelDO getLevel(Long id) { - return id != null && id > 0 ? memberLevelMapper.selectById(id) : null; - } - - @Override - public List getLevelList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return memberLevelMapper.selectBatchIds(ids); - } - - @Override - public List getLevelList(MemberLevelListReqVO listReqVO) { - return memberLevelMapper.selectList(listReqVO); - } - - @Override - public List getLevelListByStatus(Integer status) { - return memberLevelMapper.selectListByStatus(status); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) { - MemberUserDO user = memberUserService.getUser(updateReqVO.getId()); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - // 等级未发生变化 - if (ObjUtil.equal(user.getLevelId(), updateReqVO.getLevelId())) { - return; - } - - // 1. 记录等级变动 - MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() - .setUserId(user.getId()).setRemark(updateReqVO.getReason()); - MemberLevelDO memberLevel = null; - if (updateReqVO.getLevelId() == null) { - // 取消用户等级时,需要扣减经验 - levelRecord.setExperience(-user.getExperience()); - levelRecord.setUserExperience(0); - levelRecord.setDescription("管理员取消了等级"); - } else { - // 复制等级配置 - memberLevel = validateLevelExists(updateReqVO.getLevelId()); - MemberLevelRecordConvert.INSTANCE.copyTo(memberLevel, levelRecord); - // 变动经验值 = 等级的升级经验 - 会员当前的经验;正数为增加经验,负数为扣减经验 - levelRecord.setExperience(memberLevel.getExperience() - user.getExperience()); - levelRecord.setUserExperience(memberLevel.getExperience()); // 会员当前的经验 = 等级的升级经验 - levelRecord.setDescription("管理员调整为:" + memberLevel.getName()); - } - memberLevelRecordService.createLevelRecord(levelRecord); - - // 2. 记录会员经验变动 - memberExperienceRecordService.createExperienceRecord(user.getId(), - levelRecord.getExperience(), levelRecord.getUserExperience(), - MemberExperienceBizTypeEnum.ADMIN, String.valueOf(MemberExperienceBizTypeEnum.ADMIN.getType())); - - // 3. 更新会员表上的等级编号、经验值 - memberUserService.updateUserLevel(user.getId(), updateReqVO.getLevelId(), - levelRecord.getUserExperience()); - - // 4. 给会员发送等级变动消息 - notifyMemberLevelChange(user.getId(), memberLevel); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) { - if (experience == 0) { - return; - } - if (!bizType.isAdd() && experience > 0) { - experience = -experience; - } - - // 1. 创建经验记录 - MemberUserDO user = memberUserService.getUser(userId); - int userExperience = NumberUtil.max(user.getExperience() + experience, 0); // 防止扣出负数 - MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() - .setUserId(user.getId()) - .setExperience(experience) - .setUserExperience(userExperience); - memberExperienceRecordService.createExperienceRecord(userId, experience, userExperience, - bizType, bizId); - - // 2.1 保存等级变更记录 - MemberLevelDO newLevel = calculateNewLevel(user, userExperience); - if (newLevel != null) { - MemberLevelRecordConvert.INSTANCE.copyTo(newLevel, levelRecord); - memberLevelRecordService.createLevelRecord(levelRecord); - - // 2.2 给会员发送等级变动消息 - notifyMemberLevelChange(userId, newLevel); - } - - // 3. 更新会员表上的等级编号、经验值 - memberUserService.updateUserLevel(user.getId(), levelRecord.getLevelId(), userExperience); - } - - /** - * 计算会员等级 - * - * @param user 会员 - * @param userExperience 会员当前的经验值 - * @return 会员新的等级,null表示无变化 - */ - private MemberLevelDO calculateNewLevel(MemberUserDO user, int userExperience) { - List list = getEnableLevelList(); - if (CollUtil.isEmpty(list)) { - log.warn("计算会员等级失败:会员等级配置不存在"); - return null; - } - - MemberLevelDO matchLevel = list.stream() - .filter(level -> userExperience >= level.getExperience()) - .max(Comparator.nullsFirst(Comparator.comparing(MemberLevelDO::getLevel))) - .orElse(null); - if (matchLevel == null) { - log.warn("计算会员等级失败:未找到会员{}经验{}对应的等级配置", user.getId(), userExperience); - return null; - } - - // 等级没有变化 - if (ObjectUtil.equal(matchLevel.getId(), user.getLevelId())) { - return null; - } - - return matchLevel; - } - - private void notifyMemberLevelChange(Long userId, MemberLevelDO level) { - //todo: 给会员发消息 - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigService.java deleted file mode 100644 index 64cbec69..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.member.service.point; - -import com.win.module.member.controller.admin.point.vo.config.MemberPointConfigSaveReqVO; -import com.win.module.member.dal.dataobject.point.MemberPointConfigDO; - -import javax.validation.Valid; - -/** - * 会员积分配置 Service 接口 - * - * @author QingX - */ -public interface MemberPointConfigService { - - /** - * 保存会员积分配置 - * - * @param saveReqVO 更新信息 - */ - void savePointConfig(@Valid MemberPointConfigSaveReqVO saveReqVO); - - /** - * 获得会员积分配置 - * - * @return 积分配置 - */ - MemberPointConfigDO getPointConfig(); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigServiceImpl.java deleted file mode 100644 index 32ed54cb..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointConfigServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.member.service.point; - -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.member.controller.admin.point.vo.config.MemberPointConfigSaveReqVO; -import com.win.module.member.convert.point.MemberPointConfigConvert; -import com.win.module.member.dal.dataobject.point.MemberPointConfigDO; -import com.win.module.member.dal.mysql.point.MemberPointConfigMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 会员积分配置 Service 实现类 - * - * @author QingX - */ -@Service -@Validated -public class MemberPointConfigServiceImpl implements MemberPointConfigService { - - @Resource - private MemberPointConfigMapper memberPointConfigMapper; - - @Override - public void savePointConfig(MemberPointConfigSaveReqVO saveReqVO) { - // 存在,则进行更新 - MemberPointConfigDO dbConfig = getPointConfig(); - if (dbConfig != null) { - memberPointConfigMapper.updateById(MemberPointConfigConvert.INSTANCE.convert(saveReqVO).setId(dbConfig.getId())); - return; - } - // 不存在,则进行插入 - memberPointConfigMapper.insert(MemberPointConfigConvert.INSTANCE.convert(saveReqVO)); - } - - @Override - public MemberPointConfigDO getPointConfig() { - List list = memberPointConfigMapper.selectList(); - return CollectionUtils.getFirst(list); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordService.java deleted file mode 100644 index 6d1302d9..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.member.service.point; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; -import com.win.module.member.dal.dataobject.point.MemberPointRecordDO; -import com.win.module.member.enums.point.MemberPointBizTypeEnum; - -/** - * 用户积分记录 Service 接口 - * - * @author QingX - */ -public interface MemberPointRecordService { - - /** - * 【管理员】获得积分记录分页 - * - * @param pageReqVO 分页查询 - * @return 签到记录分页 - */ - PageResult getPointRecordPage(MemberPointRecordPageReqVO pageReqVO); - - /** - * 【会员】获得积分记录分页 - * - * @param userId 用户编号 - * @param pageVO 分页查询 - * @return 签到记录分页 - */ - PageResult getPointRecordPage(Long userId, PageParam pageVO); - - /** - * 创建用户积分记录 - * - * @param userId 用户ID - * @param point 变动积分 - * @param bizType 业务类型 - * @param bizId 业务编号 - */ - void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId); -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordServiceImpl.java deleted file mode 100644 index c68dbbe3..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/point/MemberPointRecordServiceImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.win.module.member.service.point; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; -import com.win.module.member.dal.dataobject.point.MemberPointConfigDO; -import com.win.module.member.dal.dataobject.point.MemberPointRecordDO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.dal.mysql.point.MemberPointRecordMapper; -import com.win.module.member.enums.point.MemberPointBizTypeEnum; -import com.win.module.member.service.user.MemberUserService; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Set; - -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - - -/** - * 积分记录 Service 实现类 - * - * @author QingX - */ -@Slf4j -@Service -@Validated -public class MemberPointRecordServiceImpl implements MemberPointRecordService { - - @Resource - private MemberPointRecordMapper memberPointRecordMapper; - @Resource - private MemberPointConfigService memberPointConfigService; - - @Resource - private MemberUserService memberUserService; - - @Override - public PageResult getPointRecordPage(MemberPointRecordPageReqVO pageReqVO) { - // 根据用户昵称查询出用户 ids - Set userIds = null; - if (StringUtils.isNotBlank(pageReqVO.getNickname())) { - List users = memberUserService.getUserListByNickname(pageReqVO.getNickname()); - // 如果查询用户结果为空直接返回无需继续查询 - if (CollectionUtils.isEmpty(users)) { - return PageResult.empty(); - } - userIds = convertSet(users, MemberUserDO::getId); - } - // 执行查询 - return memberPointRecordMapper.selectPage(pageReqVO, userIds); - } - - @Override - public PageResult getPointRecordPage(Long userId, PageParam pageVO) { - return memberPointRecordMapper.selectPage(userId, pageVO); - } - - @Override - public void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId) { - MemberPointConfigDO pointConfig = memberPointConfigService.getPointConfig(); - if (pointConfig == null || pointConfig.getTradeGivePoint() == null) { - log.error("[createPointRecord][增加积分失败:tradeGivePoint 未配置,userId({}) point({}) bizType({}) bizId({})]", - userId, point, bizType.getType(), bizId); - return; - } - - // 1. 根据配置的比例,换算实际的积分 - point = point * pointConfig.getTradeGivePoint(); - if (!bizType.isAdd() && point > 0) { - point = -point; - } - - // 2. 增加积分记录 - MemberUserDO user = memberUserService.getUser(userId); - Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); - Integer totalPoint = userPoint + point; // 用户变动后的积分 - MemberPointRecordDO record = new MemberPointRecordDO() - .setUserId(userId).setBizId(bizId).setBizType(bizType.getType()) - .setTitle(bizType.getName()).setDescription(StrUtil.format(bizType.getDescription(), point)) - .setPoint(point).setTotalPoint(totalPoint); - memberPointRecordMapper.insert(record); - - // 3. 更新用户积分 - memberUserService.updateUserPoint(userId, totalPoint); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigService.java deleted file mode 100644 index 6ae84fb3..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigService.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.member.service.signin; - -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigCreateReqVO; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigUpdateReqVO; -import com.win.module.member.dal.dataobject.signin.MemberSignInConfigDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 签到规则 Service 接口 - * - * @author QingX - */ -public interface MemberSignInConfigService { - - /** - * 创建签到规则 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createSignInConfig(@Valid MemberSignInConfigCreateReqVO createReqVO); - - /** - * 更新签到规则 - * - * @param updateReqVO 更新信息 - */ - void updateSignInConfig(@Valid MemberSignInConfigUpdateReqVO updateReqVO); - - /** - * 删除签到规则 - * - * @param id 编号 - */ - void deleteSignInConfig(Long id); - - /** - * 获得签到规则 - * - * @param id 编号 - * @return 签到规则 - */ - MemberSignInConfigDO getSignInConfig(Long id); - - /** - * 获得签到规则列表 - * - * @return 签到规则分页 - */ - List getSignInConfigList(); - - /** - * 获得签到规则列表 - * - * @param status 状态 - * @return 签到规则分页 - */ - List getSignInConfigList(Integer status); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigServiceImpl.java deleted file mode 100644 index b4f078a7..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInConfigServiceImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.win.module.member.service.signin; - -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigCreateReqVO; -import com.win.module.member.controller.admin.signin.vo.config.MemberSignInConfigUpdateReqVO; -import com.win.module.member.convert.signin.MemberSignInConfigConvert; -import com.win.module.member.dal.dataobject.signin.MemberSignInConfigDO; -import com.win.module.member.dal.mysql.signin.MemberSignInConfigMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Comparator; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.SIGN_IN_CONFIG_EXISTS; -import static com.win.module.member.enums.ErrorCodeConstants.SIGN_IN_CONFIG_NOT_EXISTS; - -/** - * 签到规则 Service 实现类 - * - * @author QingX - */ -@Service -@Validated -public class MemberSignInConfigServiceImpl implements MemberSignInConfigService { - - @Resource - private MemberSignInConfigMapper memberSignInConfigMapper; - - @Override - public Long createSignInConfig(MemberSignInConfigCreateReqVO createReqVO) { - // 判断是否重复插入签到天数 - validateSignInConfigDayDuplicate(createReqVO.getDay(), null); - - // 插入 - MemberSignInConfigDO signInConfig = MemberSignInConfigConvert.INSTANCE.convert(createReqVO); - memberSignInConfigMapper.insert(signInConfig); - // 返回 - return signInConfig.getId(); - } - - @Override - public void updateSignInConfig(MemberSignInConfigUpdateReqVO updateReqVO) { - // 校验存在 - validateSignInConfigExists(updateReqVO.getId()); - // 判断是否重复插入签到天数 - validateSignInConfigDayDuplicate(updateReqVO.getDay(), updateReqVO.getId()); - - // 判断更新 - MemberSignInConfigDO updateObj = MemberSignInConfigConvert.INSTANCE.convert(updateReqVO); - memberSignInConfigMapper.updateById(updateObj); - } - - @Override - public void deleteSignInConfig(Long id) { - // 校验存在 - validateSignInConfigExists(id); - // 删除 - memberSignInConfigMapper.deleteById(id); - } - - private void validateSignInConfigExists(Long id) { - if (memberSignInConfigMapper.selectById(id) == null) { - throw exception(SIGN_IN_CONFIG_NOT_EXISTS); - } - } - - /** - * 校验 day 是否重复 - * - * @param day 天 - * @param id 编号,只有更新的时候会传递 - */ - private void validateSignInConfigDayDuplicate(Integer day, Long id) { - MemberSignInConfigDO config = memberSignInConfigMapper.selectByDay(day); - // 1. 新增时,config 非空,则说明重复 - if (id == null && config != null) { - throw exception(SIGN_IN_CONFIG_EXISTS); - } - // 2. 更新时,如果 config 非空,且 id 不相等,则说明重复 - if (id != null && config != null && !config.getId().equals(id)) { - throw exception(SIGN_IN_CONFIG_EXISTS); - } - } - - @Override - public MemberSignInConfigDO getSignInConfig(Long id) { - return memberSignInConfigMapper.selectById(id); - } - - @Override - public List getSignInConfigList() { - List list = memberSignInConfigMapper.selectList(); - list.sort(Comparator.comparing(MemberSignInConfigDO::getDay)); - return list; - } - - @Override - public List getSignInConfigList(Integer status) { - List list = memberSignInConfigMapper.selectListByStatus(status); - list.sort(Comparator.comparing(MemberSignInConfigDO::getDay)); - return list; - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordService.java deleted file mode 100644 index 95ee2dd6..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.member.service.signin; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.signin.vo.record.MemberSignInRecordPageReqVO; -import com.win.module.member.dal.dataobject.signin.MemberSignInRecordDO; - -/** - * 签到记录 Service 接口 - * - * @author 芋道源码 - */ -public interface MemberSignInRecordService { - - /** - * 【管理员】获得签到记录分页 - * - * @param pageReqVO 分页查询 - * @return 签到记录分页 - */ - PageResult getSignInRecordPage(MemberSignInRecordPageReqVO pageReqVO); - - /** - * 【会员】获得签到记录分页 - * - * @param userId 用户编号 - * @param pageParam 分页查询 - * @return 签到记录分页 - */ - PageResult getSignRecordPage(Long userId, PageParam pageParam); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordServiceImpl.java deleted file mode 100644 index 32e94893..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/signin/MemberSignInRecordServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.member.service.signin; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.api.user.MemberUserApi; -import com.win.module.member.api.user.dto.MemberUserRespDTO; -import com.win.module.member.controller.admin.signin.vo.record.MemberSignInRecordPageReqVO; -import com.win.module.member.dal.dataobject.signin.MemberSignInRecordDO; -import com.win.module.member.dal.mysql.signin.MemberSignInRecordMapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Set; - -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -/** - * 签到记录 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class MemberSignInRecordServiceImpl implements MemberSignInRecordService { - - @Resource - private MemberSignInRecordMapper memberSignInRecordMapper; - - @Resource - private MemberUserApi memberUserApi; - - @Override - public PageResult getSignInRecordPage(MemberSignInRecordPageReqVO pageReqVO) { - // 根据用户昵称查询出用户 ids - Set userIds = null; - if (StringUtils.isNotBlank(pageReqVO.getNickname())) { - List users = memberUserApi.getUserListByNickname(pageReqVO.getNickname()); - // 如果查询用户结果为空直接返回无需继续查询 - if (CollectionUtils.isEmpty(users)) { - return PageResult.empty(); - } - userIds = convertSet(users, MemberUserRespDTO::getId); - } - // 分页查询 - return memberSignInRecordMapper.selectPage(pageReqVO, userIds); - } - - @Override - public PageResult getSignRecordPage(Long userId, PageParam pageParam) { - return memberSignInRecordMapper.selectPage(userId, pageParam); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagService.java deleted file mode 100644 index 00812431..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagService.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.win.module.member.service.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagPageReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagUpdateReqVO; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 会员标签 Service 接口 - * - * @author 芋道源码 - */ -public interface MemberTagService { - - /** - * 创建会员标签 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createTag(@Valid MemberTagCreateReqVO createReqVO); - - /** - * 更新会员标签 - * - * @param updateReqVO 更新信息 - */ - void updateTag(@Valid MemberTagUpdateReqVO updateReqVO); - - /** - * 删除会员标签 - * - * @param id 编号 - */ - void deleteTag(Long id); - - /** - * 获得会员标签 - * - * @param id 编号 - * @return 会员标签 - */ - MemberTagDO getTag(Long id); - - /** - * 获得会员标签列表 - * - * @param ids 编号 - * @return 会员标签列表 - */ - List getTagList(Collection ids); - - /** - * 获得会员标签分页 - * - * @param pageReqVO 分页查询 - * @return 会员标签分页 - */ - PageResult getTagPage(MemberTagPageReqVO pageReqVO); - - /** - * 获取标签列表 - * - * @return 标签列表 - */ - List getTagList(); - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagServiceImpl.java deleted file mode 100644 index 76058150..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/tag/MemberTagServiceImpl.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.win.module.member.service.tag; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagPageReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagUpdateReqVO; -import com.win.module.member.convert.tag.MemberTagConvert; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import com.win.module.member.dal.mysql.tag.MemberTagMapper; -import com.win.module.member.service.user.MemberUserService; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.member.enums.ErrorCodeConstants.*; - -/** - * 会员标签 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class MemberTagServiceImpl implements MemberTagService { - - @Resource - private MemberTagMapper memberTagMapper; - - @Resource - private MemberUserService memberUserService; - - @Override - public Long createTag(MemberTagCreateReqVO createReqVO) { - // 校验名称唯一 - validateTagNameUnique(null, createReqVO.getName()); - // 插入 - MemberTagDO tag = MemberTagConvert.INSTANCE.convert(createReqVO); - memberTagMapper.insert(tag); - // 返回 - return tag.getId(); - } - - @Override - public void updateTag(MemberTagUpdateReqVO updateReqVO) { - // 校验存在 - validateTagExists(updateReqVO.getId()); - // 校验名称唯一 - validateTagNameUnique(updateReqVO.getId(), updateReqVO.getName()); - // 更新 - MemberTagDO updateObj = MemberTagConvert.INSTANCE.convert(updateReqVO); - memberTagMapper.updateById(updateObj); - } - - @Override - public void deleteTag(Long id) { - // 校验存在 - validateTagExists(id); - // 校验标签下是否有用户 - validateTagHasUser(id); - // 删除 - memberTagMapper.deleteById(id); - } - - private void validateTagExists(Long id) { - if (memberTagMapper.selectById(id) == null) { - throw exception(TAG_NOT_EXISTS); - } - } - - private void validateTagNameUnique(Long id, String name) { - if (StrUtil.isBlank(name)) { - return; - } - MemberTagDO tag = memberTagMapper.selelctByName(name); - if (tag == null) { - return; - } - - // 如果 id 为空,说明不用比较是否为相同 id 的标签 - if (id == null) { - throw exception(TAG_NAME_EXISTS); - } - if (!tag.getId().equals(id)) { - throw exception(TAG_NAME_EXISTS); - } - } - - void validateTagHasUser(Long id) { - Long count = memberUserService.getUserCountByTagId(id); - if (count > 0) { - throw exception(TAG_HAS_USER); - } - } - - @Override - public MemberTagDO getTag(Long id) { - return memberTagMapper.selectById(id); - } - - @Override - public List getTagList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return ListUtil.empty(); - } - return memberTagMapper.selectBatchIds(ids); - } - - @Override - public PageResult getTagPage(MemberTagPageReqVO pageReqVO) { - return memberTagMapper.selectPage(pageReqVO); - } - - @Override - public List getTagList() { - return memberTagMapper.selectList(); - } - -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserService.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserService.java deleted file mode 100644 index 06bac214..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserService.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.win.module.member.service.user; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.validation.Mobile; -import com.win.module.member.controller.admin.user.vo.MemberUserPageReqVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 会员用户 Service 接口 - * - * @author 芋道源码 - */ -public interface MemberUserService { - - /** - * 通过手机查询用户 - * - * @param mobile 手机 - * @return 用户对象 - */ - MemberUserDO getUserByMobile(String mobile); - - /** - * 基于用户昵称,模糊匹配用户列表 - * - * @param nickname 用户昵称,模糊匹配 - * @return 用户信息的列表 - */ - List getUserListByNickname(String nickname); - - /** - * 基于手机号创建用户。 - * 如果用户已经存在,则直接进行返回 - * - * @param mobile 手机号 - * @param registerIp 注册 IP - * @return 用户对象 - */ - MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp); - - /** - * 更新用户的最后登陆信息 - * - * @param id 用户编号 - * @param loginIp 登陆 IP - */ - void updateUserLogin(Long id, String loginIp); - - /** - * 通过用户 ID 查询用户 - * - * @param id 用户ID - * @return 用户对象信息 - */ - MemberUserDO getUser(Long id); - - /** - * 通过用户 ID 查询用户们 - * - * @param ids 用户 ID - * @return 用户对象信息数组 - */ - List getUserList(Collection ids); - - /** - * 【会员】修改基本信息 - * - * @param userId 用户编号 - * @param reqVO 基本信息 - */ - void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO); - - /** - * 【会员】修改手机 - * - * @param userId 用户编号 - * @param reqVO 请求信息 - */ - void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO); - - /** - * 【会员】修改密码 - * - * @param userId 用户编号 - * @param reqVO 请求信息 - */ - void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO); - - /** - * 【会员】忘记密码 - * - * @param reqVO 请求信息 - */ - void resetUserPassword(AppMemberUserResetPasswordReqVO reqVO); - - /** - * 判断密码是否匹配 - * - * @param rawPassword 未加密的密码 - * @param encodedPassword 加密后的密码 - * @return 是否匹配 - */ - boolean isPasswordMatch(String rawPassword, String encodedPassword); - - /** - * 【管理员】更新会员用户 - * - * @param updateReqVO 更新信息 - */ - void updateUser(@Valid MemberUserUpdateReqVO updateReqVO); - - /** - * 【管理员】获得会员用户分页 - * - * @param pageReqVO 分页查询 - * @return 会员用户分页 - */ - PageResult getUserPage(MemberUserPageReqVO pageReqVO); - - /** - * 更新用户的等级和经验 - * - * @param id 用户编号 - * @param levelId 用户等级 - * @param experience 用户经验 - */ - void updateUserLevel(Long id, Long levelId, Integer experience); - - /** - * 获得指定用户分组下的用户数量 - * - * @param groupId 用户分组编号 - * @return 用户数量 - */ - Long getUserCountByGroupId(Long groupId); - - /** - * 获得指定用户等级下的用户数量 - * - * @param levelId 用户等级编号 - * @return 用户数量 - */ - Long getUserCountByLevelId(Long levelId); - - /** - * 获得指定会员标签下的用户数量 - * - * @param tagId 用户标签编号 - * @return 用户数量 - */ - Long getUserCountByTagId(Long tagId); - - /** - * 更新用户的积分 - * - * @param userId 用户编号 - * @param point 积分数量 - */ - void updateUserPoint(Long userId, Integer point); -} diff --git a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserServiceImpl.java b/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserServiceImpl.java deleted file mode 100644 index 0c773c8b..00000000 --- a/win-module-member/win-module-member-biz/src/main/java/com/win/module/member/service/user/MemberUserServiceImpl.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.win.module.member.service.user; - -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.infra.api.file.FileApi; -import com.win.module.member.controller.admin.user.vo.MemberUserPageReqVO; -import com.win.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO; -import com.win.module.member.convert.auth.AuthConvert; -import com.win.module.member.convert.user.MemberUserConvert; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.dal.mysql.user.MemberUserMapper; -import com.win.module.system.api.sms.SmsCodeApi; -import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; -import com.win.module.system.enums.sms.SmsSceneEnum; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.module.member.enums.ErrorCodeConstants.*; - -/** - * 会员 User Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Valid -@Slf4j -public class MemberUserServiceImpl implements MemberUserService { - - @Resource - private MemberUserMapper memberUserMapper; - - @Resource - private FileApi fileApi; - @Resource - private SmsCodeApi smsCodeApi; - - @Resource - private PasswordEncoder passwordEncoder; - - @Override - public MemberUserDO getUserByMobile(String mobile) { - return memberUserMapper.selectByMobile(mobile); - } - - @Override - public List getUserListByNickname(String nickname) { - return memberUserMapper.selectListByNicknameLike(nickname); - } - - @Override - public MemberUserDO createUserIfAbsent(String mobile, String registerIp) { - // 用户已经存在 - MemberUserDO user = memberUserMapper.selectByMobile(mobile); - if (user != null) { - return user; - } - // 用户不存在,则进行创建 - return this.createUser(mobile, registerIp); - } - - private MemberUserDO createUser(String mobile, String registerIp) { - // 生成密码 - String password = IdUtil.fastSimpleUUID(); - // 插入用户 - MemberUserDO user = new MemberUserDO(); - user.setMobile(mobile); - user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 - user.setPassword(encodePassword(password)); // 加密密码 - user.setRegisterIp(registerIp); - memberUserMapper.insert(user); - return user; - } - - @Override - public void updateUserLogin(Long id, String loginIp) { - memberUserMapper.updateById(new MemberUserDO().setId(id) - .setLoginIp(loginIp).setLoginDate(LocalDateTime.now())); - } - - @Override - public MemberUserDO getUser(Long id) { - return memberUserMapper.selectById(id); - } - - @Override - public List getUserList(Collection ids) { - return memberUserMapper.selectBatchIds(ids); - } - - @Override - public void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO) { - memberUserMapper.updateById(new MemberUserDO().setId(userId) - .setNickname(reqVO.getNickname()).setAvatar(reqVO.getAvatar())); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO) { - // 检测用户是否存在 - MemberUserDO user = validateUserExists(userId); - // 校验新手机是否已经被绑定 - validateMobileUnique(null, reqVO.getMobile()); - - // 校验旧手机和旧验证码 - smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getOldCode()) - .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())); - // 使用新验证码 - smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getMobile()).setCode(reqVO.getCode()) - .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())); - - // 更新用户手机 - memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build()); - } - - @Override - public void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO) { - // 检测用户是否存在 - MemberUserDO user = validateUserExists(userId); - // 校验验证码 - smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getCode()) - .setScene(SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP())); - - // 更新用户密码 - memberUserMapper.updateById(MemberUserDO.builder().id(userId) - .password(passwordEncoder.encode(reqVO.getPassword())).build()); - } - - @Override - public void resetUserPassword(AppMemberUserResetPasswordReqVO reqVO) { - // 检验用户是否存在 - MemberUserDO user = validateUserExists(reqVO.getMobile()); - - // 使用验证码 - smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_RESET_PASSWORD, - getClientIP())); - - // 更新密码 - memberUserMapper.updateById(MemberUserDO.builder().id(user.getId()) - .password(passwordEncoder.encode(reqVO.getPassword())).build()); - } - - private MemberUserDO validateUserExists(String mobile) { - MemberUserDO user = memberUserMapper.selectByMobile(mobile); - if (user == null) { - throw exception(USER_MOBILE_NOT_EXISTS); - } - return user; - } - - @Override - public boolean isPasswordMatch(String rawPassword, String encodedPassword) { - return passwordEncoder.matches(rawPassword, encodedPassword); - } - - /** - * 对密码进行加密 - * - * @param password 密码 - * @return 加密后的密码 - */ - private String encodePassword(String password) { - return passwordEncoder.encode(password); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateUser(MemberUserUpdateReqVO updateReqVO) { - // 校验存在 - MemberUserDO user = validateUserExists(updateReqVO.getId()); - // 校验手机唯一 - validateMobileUnique(updateReqVO.getId(), updateReqVO.getMobile()); - - // 更新 - MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO); - memberUserMapper.updateById(updateObj); - } - - @VisibleForTesting - MemberUserDO validateUserExists(Long id) { - if (id == null) { - return null; - } - MemberUserDO user = memberUserMapper.selectById(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - return user; - } - - @VisibleForTesting - void validateMobileUnique(Long id, String mobile) { - if (StrUtil.isBlank(mobile)) { - return; - } - MemberUserDO user = memberUserMapper.selectByMobile(mobile); - if (user == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的用户 - if (id == null) { - throw exception(USER_MOBILE_USED); - } - if (!user.getId().equals(id)) { - throw exception(USER_MOBILE_USED); - } - } - - @Override - public PageResult getUserPage(MemberUserPageReqVO pageReqVO) { - return memberUserMapper.selectPage(pageReqVO); - } - - @Override - public void updateUserLevel(Long id, Long levelId, Integer experience) { - // 0 代表无等级:防止UpdateById时,会被过滤掉的问题 - levelId = ObjectUtil.defaultIfNull(levelId, 0L); - memberUserMapper.updateById(new MemberUserDO() - .setId(id) - .setLevelId(levelId).setExperience(experience) - ); - } - - @Override - public Long getUserCountByGroupId(Long groupId) { - return memberUserMapper.selectCountByGroupId(groupId); - } - - @Override - public Long getUserCountByLevelId(Long levelId) { - return memberUserMapper.selectCountByLevelId(levelId); - } - - @Override - public Long getUserCountByTagId(Long tagId) { - return memberUserMapper.selectCountByTagId(tagId); - } - - @Override - public void updateUserPoint(Long userId, Integer point) { - memberUserMapper.updateById(new MemberUserDO().setId(userId).setPoint(point)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/address/AddressServiceImplTest.java b/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/address/AddressServiceImplTest.java deleted file mode 100644 index 8be8f295..00000000 --- a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/address/AddressServiceImplTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.win.module.member.service.address; - -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.member.controller.app.address.vo.AppAddressCreateReqVO; -import com.win.module.member.controller.app.address.vo.AppAddressUpdateReqVO; -import com.win.module.member.dal.dataobject.address.MemberAddressDO; -import com.win.module.member.dal.mysql.address.MemberAddressMapper; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.member.enums.ErrorCodeConstants.ADDRESS_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -/** - * {@link AddressServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(AddressServiceImpl.class) -public class AddressServiceImplTest extends BaseDbUnitTest { - - @Resource - private AddressServiceImpl addressService; - - @Resource - private MemberAddressMapper addressMapper; - - @Test - public void testCreateAddress_success() { - // 准备参数 - AppAddressCreateReqVO reqVO = randomPojo(AppAddressCreateReqVO.class); - - // 调用 - Long addressId = addressService.createAddress(randomLongId(), reqVO); - // 断言 - assertNotNull(addressId); - // 校验记录的属性是否正确 - MemberAddressDO address = addressMapper.selectById(addressId); - assertPojoEquals(reqVO, address); - } - - @Test - public void testUpdateAddress_success() { - // mock 数据 - MemberAddressDO dbAddress = randomPojo(MemberAddressDO.class); - addressMapper.insert(dbAddress);// @Sql: 先插入出一条存在的数据 - // 准备参数 - AppAddressUpdateReqVO reqVO = randomPojo(AppAddressUpdateReqVO.class, o -> { - o.setId(dbAddress.getId()); // 设置更新的 ID - }); - - // 调用 - addressService.updateAddress(dbAddress.getUserId(), reqVO); - // 校验是否更新正确 - MemberAddressDO address = addressMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, address); - } - - @Test - public void testUpdateAddress_notExists() { - // 准备参数 - AppAddressUpdateReqVO reqVO = randomPojo(AppAddressUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> addressService.updateAddress(randomLongId(), reqVO), ADDRESS_NOT_EXISTS); - } - - @Test - public void testDeleteAddress_success() { - // mock 数据 - MemberAddressDO dbAddress = randomPojo(MemberAddressDO.class); - addressMapper.insert(dbAddress);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbAddress.getId(); - - // 调用 - addressService.deleteAddress(dbAddress.getUserId(), id); - // 校验数据不存在了 - assertNull(addressMapper.selectById(id)); - } - - @Test - public void testDeleteAddress_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> addressService.deleteAddress(randomLongId(), id), ADDRESS_NOT_EXISTS); - } - -} diff --git a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/auth/MemberAuthServiceTest.java b/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/auth/MemberAuthServiceTest.java deleted file mode 100644 index 0394bbdc..00000000 --- a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/auth/MemberAuthServiceTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.win.module.member.service.auth; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.util.collection.ArrayUtils; -import com.win.framework.redis.config.WinRedisAutoConfiguration; -import com.win.framework.test.core.ut.BaseDbAndRedisUnitTest; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.dal.mysql.user.MemberUserMapper; -import com.win.module.member.service.user.MemberUserService; -import com.win.module.system.api.logger.LoginLogApi; -import com.win.module.system.api.oauth2.OAuth2TokenApi; -import com.win.module.system.api.sms.SmsCodeApi; -import com.win.module.system.api.social.SocialUserApi; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.security.crypto.password.PasswordEncoder; - -import javax.annotation.Resource; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.framework.test.core.util.RandomUtils.randomString; - -// TODO @芋艿:单测的 review,等逻辑都达成一致后 -/** - * {@link MemberAuthService} 的单元测试类 - * - * @author 宋天 - */ -@Import({MemberAuthServiceImpl.class, WinRedisAutoConfiguration.class}) -public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { - - // TODO @芋艿:登录相关的单测,待补全 - - @Resource - private MemberAuthServiceImpl authService; - - @MockBean - private MemberUserService userService; - @MockBean - private SmsCodeApi smsCodeApi; - @MockBean - private LoginLogApi loginLogApi; - @MockBean - private OAuth2TokenApi oauth2TokenApi; - @MockBean - private SocialUserApi socialUserApi; - @MockBean - private WxMaService wxMaService; - @MockBean - private PasswordEncoder passwordEncoder; - - @Resource - private MemberUserMapper memberUserMapper; - - // TODO 芋艿:后续重构这个单测 -// @Test -// public void testUpdatePassword_success(){ -// // 准备参数 -// MemberUserDO userDO = randomUserDO(); -// memberUserMapper.insert(userDO); -// -// // 新密码 -// String newPassword = randomString(); -// -// // 请求实体 -// AppMemberUserUpdatePasswordReqVO reqVO = AppMemberUserUpdatePasswordReqVO.builder() -// .oldPassword(userDO.getPassword()) -// .password(newPassword) -// .build(); -// -// // 测试桩 -// // 这两个相等是为了返回ture这个结果 -// when(passwordEncoder.matches(reqVO.getOldPassword(),reqVO.getOldPassword())).thenReturn(true); -// when(passwordEncoder.encode(newPassword)).thenReturn(newPassword); -// -// // 更新用户密码 -// authService.updatePassword(userDO.getId(), reqVO); -// assertEquals(memberUserMapper.selectById(userDO.getId()).getPassword(),newPassword); -// } - - // TODO 芋艿:后续重构这个单测 -// @Test -// public void testResetPassword_success(){ -// // 准备参数 -// MemberUserDO userDO = randomUserDO(); -// memberUserMapper.insert(userDO); -// -// // 随机密码 -// String password = randomNumbers(11); -// // 随机验证码 -// String code = randomNumbers(4); -// -// // mock -// when(passwordEncoder.encode(password)).thenReturn(password); -// -// // 更新用户密码 -// AppMemberUserResetPasswordReqVO reqVO = new AppMemberUserResetPasswordReqVO(); -// reqVO.setMobile(userDO.getMobile()); -// reqVO.setPassword(password); -// reqVO.setCode(code); -// -// authService.resetPassword(reqVO); -// assertEquals(memberUserMapper.selectById(userDO.getId()).getPassword(),password); -// } - - // ========== 随机对象 ========== - - @SafeVarargs - private static MemberUserDO randomUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setPassword(randomString()); - }; - return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers)); - } - - -} diff --git a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/group/MemberGroupServiceImplTest.java b/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/group/MemberGroupServiceImplTest.java deleted file mode 100644 index 80b67c63..00000000 --- a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/group/MemberGroupServiceImplTest.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.win.module.member.service.group; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.member.controller.admin.group.vo.MemberGroupCreateReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupPageReqVO; -import com.win.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO; -import com.win.module.member.dal.dataobject.group.MemberGroupDO; -import com.win.module.member.dal.mysql.group.MemberGroupMapper; -import com.win.module.member.service.user.MemberUserService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.*; -import static com.win.module.member.enums.ErrorCodeConstants.GROUP_HAS_USER; -import static com.win.module.member.enums.ErrorCodeConstants.GROUP_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -// TODO 芋艿:完全 review 完,在去 review 单测 -/** - * {@link MemberGroupServiceImpl} 的单元测试类 - * - * @author owen - */ -@Import(MemberGroupServiceImpl.class) -public class MemberGroupServiceImplTest extends BaseDbUnitTest { - - @Resource - private MemberGroupServiceImpl groupService; - - @Resource - private MemberGroupMapper groupMapper; - - @MockBean - private MemberUserService memberUserService; - - @Test - public void testCreateGroup_success() { - // 准备参数 - MemberGroupCreateReqVO reqVO = randomPojo(MemberGroupCreateReqVO.class, - o -> o.setStatus(randomCommonStatus())); - - // 调用 - Long groupId = groupService.createGroup(reqVO); - // 断言 - assertNotNull(groupId); - // 校验记录的属性是否正确 - MemberGroupDO group = groupMapper.selectById(groupId); - assertPojoEquals(reqVO, group); - } - - @Test - public void testUpdateGroup_success() { - // mock 数据 - MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class); - groupMapper.insert(dbGroup);// @Sql: 先插入出一条存在的数据 - // 准备参数 - MemberGroupUpdateReqVO reqVO = randomPojo(MemberGroupUpdateReqVO.class, o -> { - o.setId(dbGroup.getId()); // 设置更新的 ID - o.setStatus(randomCommonStatus()); - }); - - // 调用 - groupService.updateGroup(reqVO); - // 校验是否更新正确 - MemberGroupDO group = groupMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, group); - } - - @Test - public void testUpdateGroup_notExists() { - // 准备参数 - MemberGroupUpdateReqVO reqVO = randomPojo(MemberGroupUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> groupService.updateGroup(reqVO), GROUP_NOT_EXISTS); - } - - @Test - public void testDeleteGroup_success() { - // mock 数据 - MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class); - groupMapper.insert(dbGroup);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbGroup.getId(); - - // 调用 - groupService.deleteGroup(id); - // 校验数据不存在了 - assertNull(groupMapper.selectById(id)); - } - - @Test - public void testDeleteGroup_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> groupService.deleteGroup(id), GROUP_NOT_EXISTS); - } - - @Test - public void testDeleteGroup_hasUser() { - // mock 数据 - MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class); - groupMapper.insert(dbGroup);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbGroup.getId(); - - // mock 会员数据 - when(memberUserService.getUserCountByGroupId(eq(id))).thenReturn(1L); - - // 调用, 并断言异常 - assertServiceException(() -> groupService.deleteGroup(id), GROUP_HAS_USER); - } - - @Test - public void testGetGroupPage() { - String name = randomString(); - int status = CommonStatusEnum.ENABLE.getStatus(); - - // mock 数据 - MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class, o -> { // 等会查询到 - o.setName(name); - o.setStatus(status); - o.setCreateTime(buildTime(2023, 2, 18)); - }); - groupMapper.insert(dbGroup); - // 测试 name 不匹配 - groupMapper.insert(cloneIgnoreId(dbGroup, o -> o.setName(""))); - // 测试 status 不匹配 - groupMapper.insert(cloneIgnoreId(dbGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - groupMapper.insert(cloneIgnoreId(dbGroup, o -> o.setCreateTime(null))); - // 准备参数 - MemberGroupPageReqVO reqVO = new MemberGroupPageReqVO(); - reqVO.setName(name); - reqVO.setStatus(status); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = groupService.getGroupPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbGroup, pageResult.getList().get(0)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/level/MemberLevelServiceImplTest.java b/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/level/MemberLevelServiceImplTest.java deleted file mode 100644 index a0a03b23..00000000 --- a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/level/MemberLevelServiceImplTest.java +++ /dev/null @@ -1,268 +0,0 @@ -package com.win.module.member.service.level; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.util.collection.ArrayUtils; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelListReqVO; -import com.win.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; -import com.win.module.member.dal.dataobject.level.MemberLevelDO; -import com.win.module.member.dal.mysql.level.MemberLevelMapper; -import com.win.module.member.service.user.MemberUserService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomInt; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.*; -import static com.win.module.member.enums.ErrorCodeConstants.*; -import static org.junit.jupiter.api.Assertions.*; - -// TODO 芋艿:完全 review 完,在去 review 单测 -/** - * {@link MemberLevelServiceImpl} 的单元测试类 - * - * @author owen - */ -@Import(MemberLevelServiceImpl.class) -public class MemberLevelServiceImplTest extends BaseDbUnitTest { - - @Resource - private MemberLevelServiceImpl levelService; - - @Resource - private MemberLevelMapper memberlevelMapper; - - @MockBean - private MemberLevelRecordService memberLevelRecordService; - @MockBean - private MemberExperienceRecordService memberExperienceRecordService; - @MockBean - private MemberUserService memberUserService; - - @Test - public void testCreateLevel_success() { - // 准备参数 - MemberLevelCreateReqVO reqVO = randomPojo(MemberLevelCreateReqVO.class, o -> { - o.setDiscountPercent(randomInt()); - o.setIcon(randomURL()); - o.setBackgroundUrl(randomURL()); - o.setStatus(randomCommonStatus()); - }); - - // 调用 - Long levelId = levelService.createLevel(reqVO); - // 断言 - assertNotNull(levelId); - // 校验记录的属性是否正确 - MemberLevelDO level = memberlevelMapper.selectById(levelId); - assertPojoEquals(reqVO, level); - } - - @Test - public void testUpdateLevel_success() { - // mock 数据 - MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class); - memberlevelMapper.insert(dbLevel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - MemberLevelUpdateReqVO reqVO = randomPojo(MemberLevelUpdateReqVO.class, o -> { - o.setId(dbLevel.getId()); // 设置更新的 ID - //以下要保持一致 - o.setName(dbLevel.getName()); - o.setLevel(dbLevel.getLevel()); - o.setExperience(dbLevel.getExperience()); - //以下是要修改的字段 - o.setDiscountPercent(randomInt()); - o.setIcon(randomURL()); - o.setBackgroundUrl(randomURL()); - o.setStatus(randomCommonStatus()); - }); - - // 调用 - levelService.updateLevel(reqVO); - // 校验是否更新正确 - MemberLevelDO level = memberlevelMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, level); - } - - @Test - public void testUpdateLevel_notExists() { - // 准备参数 - MemberLevelUpdateReqVO reqVO = randomPojo(MemberLevelUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> levelService.updateLevel(reqVO), LEVEL_NOT_EXISTS); - } - - @Test - public void testDeleteLevel_success() { - // mock 数据 - MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class); - memberlevelMapper.insert(dbLevel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbLevel.getId(); - - // 调用 - levelService.deleteLevel(id); - // 校验数据不存在了 - assertNull(memberlevelMapper.selectById(id)); - } - - @Test - public void testDeleteLevel_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> levelService.deleteLevel(id), LEVEL_NOT_EXISTS); - } - - @Test - public void testGetLevelList() { - // mock 数据 - MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class, o -> { // 等会查询到 - o.setName("黄金会员"); - o.setStatus(1); - }); - memberlevelMapper.insert(dbLevel); - // 测试 name 不匹配 - memberlevelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setName(""))); - // 测试 status 不匹配 - memberlevelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setStatus(0))); - // 准备参数 - MemberLevelListReqVO reqVO = new MemberLevelListReqVO(); - reqVO.setName("黄金会员"); - reqVO.setStatus(1); - - // 调用 - List list = levelService.getLevelList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbLevel, list.get(0)); - } - - @Test - public void testCreateLevel_nameUnique() { - // 准备参数 - String name = randomString(); - - // mock 数据 - memberlevelMapper.insert(randomLevelDO(o -> o.setName(name))); - - // 调用,校验异常 - List list = memberlevelMapper.selectList(); - assertServiceException(() -> levelService.validateNameUnique(list, null, name), LEVEL_NAME_EXISTS, name); - } - - @Test - public void testUpdateLevel_nameUnique() { - // 准备参数 - Long id = randomLongId(); - String name = randomString(); - - // mock 数据 - memberlevelMapper.insert(randomLevelDO(o -> o.setName(name))); - - // 调用,校验异常 - List list = memberlevelMapper.selectList(); - assertServiceException(() -> levelService.validateNameUnique(list, id, name), LEVEL_NAME_EXISTS, name); - } - - @Test - public void testCreateLevel_levelUnique() { - // 准备参数 - Integer level = randomInteger(); - String name = randomString(); - - // mock 数据 - memberlevelMapper.insert(randomLevelDO(o -> { - o.setLevel(level); - o.setName(name); - })); - - // 调用,校验异常 - List list = memberlevelMapper.selectList(); - assertServiceException(() -> levelService.validateLevelUnique(list, null, level), LEVEL_VALUE_EXISTS, level, name); - } - - @Test - public void testUpdateLevel_levelUnique() { - // 准备参数 - Long id = randomLongId(); - Integer level = randomInteger(); - String name = randomString(); - - // mock 数据 - memberlevelMapper.insert(randomLevelDO(o -> { - o.setLevel(level); - o.setName(name); - })); - - // 调用,校验异常 - List list = memberlevelMapper.selectList(); - assertServiceException(() -> levelService.validateLevelUnique(list, id, level), LEVEL_VALUE_EXISTS, level, name); - } - - @Test - public void testCreateLevel_experienceOutRange() { - // 准备参数 - int level = 10; - int experience = 10; - String name = randomString(); - - // mock 数据 - memberlevelMapper.insert(randomLevelDO(o -> { - o.setLevel(level); - o.setExperience(experience); - o.setName(name); - })); - List list = memberlevelMapper.selectList(); - - // 调用,校验异常 - assertServiceException(() -> levelService.validateExperienceOutRange(list, null, level + 1, experience - 1), LEVEL_EXPERIENCE_MIN, name, level); - // 调用,校验异常 - assertServiceException(() -> levelService.validateExperienceOutRange(list, null, level - 1, experience + 1), LEVEL_EXPERIENCE_MAX, name, level); - } - - @Test - public void testUpdateLevel_experienceOutRange() { - // 准备参数 - int level = 10; - int experience = 10; - Long id = randomLongId(); - String name = randomString(); - - // mock 数据 - memberlevelMapper.insert(randomLevelDO(o -> { - o.setLevel(level); - o.setExperience(experience); - o.setName(name); - })); - List list = memberlevelMapper.selectList(); - - // 调用,校验异常 - assertServiceException(() -> levelService.validateExperienceOutRange(list, id, level + 1, experience - 1), LEVEL_EXPERIENCE_MIN, name, level); - // 调用,校验异常 - assertServiceException(() -> levelService.validateExperienceOutRange(list, id, level - 1, experience + 1), LEVEL_EXPERIENCE_MAX, name, level); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static MemberLevelDO randomLevelDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setDiscountPercent(randomInt(0, 100)); - o.setIcon(randomURL()); - o.setBackgroundUrl(randomURL()); - }; - return randomPojo(MemberLevelDO.class, ArrayUtils.append(consumer, consumers)); - } -} diff --git a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/tag/MemberTagServiceImplTest.java b/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/tag/MemberTagServiceImplTest.java deleted file mode 100644 index 5a5a0e41..00000000 --- a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/tag/MemberTagServiceImplTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.win.module.member.service.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagPageReqVO; -import com.win.module.member.controller.admin.tag.vo.MemberTagUpdateReqVO; -import com.win.module.member.dal.dataobject.tag.MemberTagDO; -import com.win.module.member.dal.mysql.tag.MemberTagMapper; -import com.win.module.member.service.user.MemberUserService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomLongId; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.module.member.enums.ErrorCodeConstants.TAG_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -// TODO 芋艿:完全 review 完,在去 review 单测 -/** - * {@link MemberTagServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(MemberTagServiceImpl.class) -public class MemberTagServiceImplTest extends BaseDbUnitTest { - - @Resource - private MemberTagServiceImpl tagService; - - @Resource - private MemberTagMapper tagMapper; - - @MockBean - private MemberUserService memberUserService; - - @Test - public void testCreateTag_success() { - // 准备参数 - MemberTagCreateReqVO reqVO = randomPojo(MemberTagCreateReqVO.class); - - // 调用 - Long tagId = tagService.createTag(reqVO); - // 断言 - assertNotNull(tagId); - // 校验记录的属性是否正确 - MemberTagDO tag = tagMapper.selectById(tagId); - assertPojoEquals(reqVO, tag); - } - - @Test - public void testUpdateTag_success() { - // mock 数据 - MemberTagDO dbTag = randomPojo(MemberTagDO.class); - tagMapper.insert(dbTag);// @Sql: 先插入出一条存在的数据 - // 准备参数 - MemberTagUpdateReqVO reqVO = randomPojo(MemberTagUpdateReqVO.class, o -> { - o.setId(dbTag.getId()); // 设置更新的 ID - }); - - // 调用 - tagService.updateTag(reqVO); - // 校验是否更新正确 - MemberTagDO tag = tagMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, tag); - } - - @Test - public void testUpdateTag_notExists() { - // 准备参数 - MemberTagUpdateReqVO reqVO = randomPojo(MemberTagUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> tagService.updateTag(reqVO), TAG_NOT_EXISTS); - } - - @Test - public void testDeleteTag_success() { - // mock 数据 - MemberTagDO dbTag = randomPojo(MemberTagDO.class); - tagMapper.insert(dbTag);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbTag.getId(); - - // 调用 - tagService.deleteTag(id); - // 校验数据不存在了 - assertNull(tagMapper.selectById(id)); - } - - @Test - public void testDeleteTag_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> tagService.deleteTag(id), TAG_NOT_EXISTS); - } - - @Test - public void testGetTagPage() { - // mock 数据 - MemberTagDO dbTag = randomPojo(MemberTagDO.class, o -> { // 等会查询到 - o.setName("test"); - o.setCreateTime(buildTime(2023, 2, 18)); - }); - tagMapper.insert(dbTag); - // 测试 name 不匹配 - tagMapper.insert(cloneIgnoreId(dbTag, o -> o.setName("ne"))); - // 测试 createTime 不匹配 - tagMapper.insert(cloneIgnoreId(dbTag, o -> o.setCreateTime(null))); - // 准备参数 - MemberTagPageReqVO reqVO = new MemberTagPageReqVO(); - reqVO.setName("test"); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = tagService.getTagPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbTag, pageResult.getList().get(0)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/user/MemberUserServiceImplTest.java b/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/user/MemberUserServiceImplTest.java deleted file mode 100644 index edc0ab26..00000000 --- a/win-module-member/win-module-member-biz/src/test/java/com/win/module/member/service/user/MemberUserServiceImplTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.win.module.member.service.user; - -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.util.collection.ArrayUtils; -import com.win.framework.redis.config.WinRedisAutoConfiguration; -import com.win.framework.test.core.ut.BaseDbAndRedisUnitTest; -import com.win.module.infra.api.file.FileApi; -import com.win.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; -import com.win.module.member.dal.dataobject.user.MemberUserDO; -import com.win.module.member.dal.mysql.user.MemberUserMapper; -import com.win.module.member.service.auth.MemberAuthServiceImpl; -import com.win.module.system.api.sms.SmsCodeApi; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.security.crypto.password.PasswordEncoder; - -import javax.annotation.Resource; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.hutool.core.util.RandomUtil.randomNumbers; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; - -// TODO @芋艿:单测的 review,等逻辑都达成一致后 -/** - * {@link MemberUserServiceImpl} 的单元测试类 - * - * @author 宋天 - */ -@Import({MemberUserServiceImpl.class, WinRedisAutoConfiguration.class}) -public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { - - @Resource - private MemberUserServiceImpl memberUserService; - - @Resource - private StringRedisTemplate stringRedisTemplate; - - @Resource - private MemberUserMapper userMapper; - - @MockBean - private MemberAuthServiceImpl authService; - - @MockBean - private PasswordEncoder passwordEncoder; - - @MockBean - private SmsCodeApi smsCodeApi; - @MockBean - private FileApi fileApi; - - // TODO 芋艿:后续重构这个单测 -// @Test -// public void testUpdateNickName_success(){ -// // mock 数据 -// MemberUserDO userDO = randomUserDO(); -// userMapper.insert(userDO); -// -// // 随机昵称 -// String newNickName = randomString(); -// -// // 调用接口修改昵称 -// memberUserService.updateUser(userDO.getId(),newNickName); -// // 查询新修改后的昵称 -// String nickname = memberUserService.getUser(userDO.getId()).getNickname(); -// // 断言 -// assertEquals(newNickName,nickname); -// } -// -// @Test -// public void testUpdateAvatar_success() throws Exception { -// // mock 数据 -// MemberUserDO dbUser = randomUserDO(); -// userMapper.insert(dbUser); -// -// // 准备参数 -// Long userId = dbUser.getId(); -// byte[] avatarFileBytes = randomBytes(10); -// ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); -// // mock 方法 -// String avatar = randomString(); -// when(fileApi.createFile(eq(avatarFileBytes))).thenReturn(avatar); -// // 调用 -// String str = memberUserService.updateUserAvatar(userId, avatarFile); -// // 断言 -// assertEquals(avatar, str); -// } - - @Test - @Disabled // TODO 芋艿:后续再修复 - public void updateMobile_success(){ - // mock数据 - String oldMobile = randomNumbers(11); - MemberUserDO userDO = randomUserDO(); - userDO.setMobile(oldMobile); - userMapper.insert(userDO); - - // TODO 芋艿:需要修复该单元测试,重构多模块带来的 - // 旧手机和旧验证码 -// SmsCodeDO codeDO = new SmsCodeDO(); - String oldCode = RandomUtil.randomString(4); -// codeDO.setMobile(userDO.getMobile()); -// codeDO.setCode(oldCode); -// codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); -// codeDO.setUsed(Boolean.FALSE); -// when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); - - // 更新手机号 - String newMobile = randomNumbers(11); - String newCode = randomNumbers(4); - AppMemberUserUpdateMobileReqVO reqVO = new AppMemberUserUpdateMobileReqVO(); - reqVO.setMobile(newMobile); - reqVO.setCode(newCode); - reqVO.setOldCode(oldCode); - memberUserService.updateUserMobile(userDO.getId(),reqVO); - - assertEquals(memberUserService.getUser(userDO.getId()).getMobile(),newMobile); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static MemberUserDO randomUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - }; - return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/win-module-member/win-module-member-biz/src/test/resources/application-unit-test.yaml b/win-module-member/win-module-member-biz/src/test/resources/application-unit-test.yaml deleted file mode 100644 index aa9fd1ce..00000000 --- a/win-module-member/win-module-member-biz/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: - # 数据源配置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口(单元测试,使用 16379 端口) - database: 0 # 数据库索引 - -mybatis: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -# 芋道配置项,设置当前项目所有自定义的配置 -win: - info: - base-package: com.win.module diff --git a/win-module-member/win-module-member-biz/src/test/resources/logback.xml b/win-module-member/win-module-member-biz/src/test/resources/logback.xml deleted file mode 100644 index daf756bf..00000000 --- a/win-module-member/win-module-member-biz/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/win-module-member/win-module-member-biz/src/test/resources/sql/clean.sql b/win-module-member/win-module-member-biz/src/test/resources/sql/clean.sql deleted file mode 100644 index f972e048..00000000 --- a/win-module-member/win-module-member-biz/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,5 +0,0 @@ -DELETE FROM "member_user"; -DELETE FROM "member_address"; -DELETE FROM "member_tag"; -DELETE FROM "member_level"; -DELETE FROM "member_group"; \ No newline at end of file diff --git a/win-module-member/win-module-member-biz/src/test/resources/sql/create_tables.sql b/win-module-member/win-module-member-biz/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 782a8181..00000000 --- a/win-module-member/win-module-member-biz/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,113 +0,0 @@ -CREATE TABLE IF NOT EXISTS "member_user" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号', - "nickname" varchar(30) NOT NULL DEFAULT '' COMMENT '用户昵称', - "name" varchar(30) NULL COMMENT '真实名字', - sex tinyint null comment '性别', - birthday datetime null comment '出生日期', - area_id int null comment '所在地', - mark varchar(255) null comment '用户备注', - point int default 0 null comment '积分', - "avatar" varchar(255) NOT NULL DEFAULT '' COMMENT '头像', - "status" tinyint NOT NULL COMMENT '状态', - "mobile" varchar(11) NOT NULL COMMENT '手机号', - "password" varchar(100) NOT NULL DEFAULT '' COMMENT '密码', - "register_ip" varchar(32) NOT NULL COMMENT '注册 IP', - "login_ip" varchar(50) NULL DEFAULT '' COMMENT '最后登录IP', - "login_date" datetime NULL DEFAULT NULL COMMENT '最后登录时间', - "tag_ids" varchar(255) NULL DEFAULT NULL COMMENT '用户标签编号列表,以逗号分隔', - "level_id" bigint NULL DEFAULT NULL COMMENT '等级编号', - "experience" bigint NULL DEFAULT NULL COMMENT '经验', - "group_id" bigint NULL DEFAULT NULL COMMENT '用户分组编号', - "creator" varchar(64) NULL DEFAULT '' COMMENT '创建者', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - "updater" varchar(64) NULL DEFAULT '' COMMENT '更新者', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - "deleted" bit(1) NOT NULL DEFAULT '0' COMMENT '是否删除', - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '会员表'; - -CREATE TABLE IF NOT EXISTS "member_address" ( - "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint(20) NOT NULL, - "name" varchar(10) NOT NULL, - "mobile" varchar(20) NOT NULL, - "area_id" bigint(20) NOT NULL, - "detail_address" varchar(250) NOT NULL, - "default_status" bit NOT NULL, - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "creator" varchar(64) DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "updater" varchar(64) DEFAULT '', - PRIMARY KEY ("id") -) COMMENT '用户收件地址'; - -CREATE TABLE IF NOT EXISTS "member_tag" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint NOT NULL default '0', - PRIMARY KEY ("id") -) COMMENT '会员标签'; - -CREATE TABLE IF NOT EXISTS "member_level" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "experience" int NOT NULL, - "level" int NOT NULL, - "discount_percent" int NOT NULL, - "icon" varchar NOT NULL, - "background_url" varchar NOT NULL, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - "status" tinyint NOT NULL DEFAULT '0', - PRIMARY KEY ("id") -) COMMENT '会员等级'; - -CREATE TABLE IF NOT EXISTS "member_group" -( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar NOT NULL, - "remark" varchar NOT NULL, - "status" tinyint NOT NULL DEFAULT '0', - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '用户分组'; -CREATE TABLE IF NOT EXISTS "member_brokerage_record" -( - "id" int NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "user_id" bigint NOT NULL, - "biz_id" varchar NOT NULL, - "biz_type" varchar NOT NULL, - "title" varchar NOT NULL, - "price" int NOT NULL, - "total_price" int NOT NULL, - "description" varchar NOT NULL, - "status" varchar NOT NULL, - "frozen_days" int NOT NULL, - "unfreeze_time" varchar, - "creator" varchar DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT '佣金记录'; diff --git a/win-module-mp/pom.xml b/win-module-mp/pom.xml deleted file mode 100644 index 22a2ea29..00000000 --- a/win-module-mp/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - win - com.win - ${revision} - - 4.0.0 - - win-module-mp - pom - - - wechat 模块,主要实现微信平台的相关业务。 - 例如:微信公众号、企业微信 SCRM 等 - - - win-module-mp-api - win-module-mp-biz - - - diff --git a/win-module-mp/win-module-mp-api/pom.xml b/win-module-mp/win-module-mp-api/pom.xml deleted file mode 100644 index d834a004..00000000 --- a/win-module-mp/win-module-mp-api/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - win-module-mp - com.win - ${revision} - - 4.0.0 - win-module-mp-api - jar - - ${project.artifactId} - - mp 模块 API,暴露给其它模块调用 - - - - - com.win - win-common - - - - diff --git a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/ErrorCodeConstants.java b/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/ErrorCodeConstants.java deleted file mode 100644 index 2d118835..00000000 --- a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.win.module.mp.enums; - -import com.win.framework.common.exception.ErrorCode; - -/** - * Mp 错误码枚举类 - * - * mp 系统,使用 1-006-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== 公众号账号 1-006-000-000 ============ - ErrorCode ACCOUNT_NOT_EXISTS = new ErrorCode(1_006_000_000, "公众号账号不存在"); - ErrorCode ACCOUNT_GENERATE_QR_CODE_FAIL = new ErrorCode(1_006_000_001, "生成公众号二维码失败,原因:{}"); - ErrorCode ACCOUNT_CLEAR_QUOTA_FAIL = new ErrorCode(1_006_000_002, "清空公众号的 API 配额失败,原因:{}"); - - // ========== 公众号统计 1-006-001-000 ============ - ErrorCode STATISTICS_GET_USER_SUMMARY_FAIL = new ErrorCode(1_006_001_000, "获取粉丝增减数据失败,原因:{}"); - ErrorCode STATISTICS_GET_USER_CUMULATE_FAIL = new ErrorCode(1_006_001_001, "获得粉丝累计数据失败,原因:{}"); - ErrorCode STATISTICS_GET_UPSTREAM_MESSAGE_FAIL = new ErrorCode(1_006_001_002, "获得消息发送概况数据失败,原因:{}"); - ErrorCode STATISTICS_GET_INTERFACE_SUMMARY_FAIL = new ErrorCode(1_006_001_003, "获得接口分析数据失败,原因:{}"); - - // ========== 公众号标签 1-006-002-000 ============ - ErrorCode TAG_NOT_EXISTS = new ErrorCode(1_006_002_000, "标签不存在"); - ErrorCode TAG_CREATE_FAIL = new ErrorCode(1_006_002_001, "创建标签失败,原因:{}"); - ErrorCode TAG_UPDATE_FAIL = new ErrorCode(1_006_002_002, "更新标签失败,原因:{}"); - ErrorCode TAG_DELETE_FAIL = new ErrorCode(1_006_002_003, "删除标签失败,原因:{}"); - ErrorCode TAG_GET_FAIL = new ErrorCode(1_006_002_004, "获得标签失败,原因:{}"); - - // ========== 公众号粉丝 1-006-003-000 ============ - ErrorCode USER_NOT_EXISTS = new ErrorCode(1_006_003_000, "粉丝不存在"); - ErrorCode USER_UPDATE_TAG_FAIL = new ErrorCode(1_006_003_001, "更新粉丝标签失败,原因:{}"); - - // ========== 公众号素材 1-006-004-000 ============ - ErrorCode MATERIAL_NOT_EXISTS = new ErrorCode(1_006_004_000, "素材不存在"); - ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1_006_004_001, "上传素材失败,原因:{}"); - ErrorCode MATERIAL_IMAGE_UPLOAD_FAIL = new ErrorCode(1_006_004_002, "上传图片失败,原因:{}"); - ErrorCode MATERIAL_DELETE_FAIL = new ErrorCode(1_006_004_003, "删除素材失败,原因:{}"); - - // ========== 公众号消息 1-006-005-000 ============ - ErrorCode MESSAGE_SEND_FAIL = new ErrorCode(1_006_005_000, "发送消息失败,原因:{}"); - - // ========== 公众号发布能力 1-006-006-000 ============ - ErrorCode FREE_PUBLISH_LIST_FAIL = new ErrorCode(1_006_006_000, "获得已成功发布列表失败,原因:{}"); - ErrorCode FREE_PUBLISH_SUBMIT_FAIL = new ErrorCode(1_006_006_001, "提交发布失败,原因:{}"); - ErrorCode FREE_PUBLISH_DELETE_FAIL = new ErrorCode(1_006_006_002, "删除发布失败,原因:{}"); - - // ========== 公众号草稿 1-006-007-000 ============ - ErrorCode DRAFT_LIST_FAIL = new ErrorCode(1_006_007_000, "获得草稿列表失败,原因:{}"); - ErrorCode DRAFT_CREATE_FAIL = new ErrorCode(1_006_007_001, "创建草稿失败,原因:{}"); - ErrorCode DRAFT_UPDATE_FAIL = new ErrorCode(1_006_007_002, "更新草稿失败,原因:{}"); - ErrorCode DRAFT_DELETE_FAIL = new ErrorCode(1_006_007_003, "删除草稿失败,原因:{}"); - - // ========== 公众号菜单 1-006-008-000 ============ - ErrorCode MENU_SAVE_FAIL = new ErrorCode(1_006_008_000, "创建菜单失败,原因:{}"); - ErrorCode MENU_DELETE_FAIL = new ErrorCode(1_006_008_001, "删除菜单失败,原因:{}"); - - // ========== 公众号自动回复 1-006-009-000 ============ - ErrorCode AUTO_REPLY_NOT_EXISTS = new ErrorCode(1_006_009_000, "自动回复不存在"); - ErrorCode AUTO_REPLY_ADD_SUBSCRIBE_FAIL_EXISTS = new ErrorCode(1_006_009_001, "操作失败,原因:已存在关注时的回复"); - ErrorCode AUTO_REPLY_ADD_MESSAGE_FAIL_EXISTS = new ErrorCode(1_006_009_002, "操作失败,原因:已存在该消息类型的回复"); - ErrorCode AUTO_REPLY_ADD_KEYWORD_FAIL_EXISTS = new ErrorCode(1_006_009_003, "操作失败,原因:已关在该关键字的回复"); - -} diff --git a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyMatchEnum.java b/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyMatchEnum.java deleted file mode 100644 index 7b068f26..00000000 --- a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyMatchEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.mp.enums.message; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 公众号消息自动回复的匹配模式 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum MpAutoReplyMatchEnum { - - ALL(1, "完全匹配"), - LIKE(2, "半匹配"), - ; - - /** - * 匹配 - */ - private final Integer match; - /** - * 匹配的名字 - */ - private final String name; - -} diff --git a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyTypeEnum.java b/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyTypeEnum.java deleted file mode 100644 index eea4134f..00000000 --- a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpAutoReplyTypeEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.mp.enums.message; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 公众号消息自动回复的类型 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum MpAutoReplyTypeEnum { - - SUBSCRIBE(1, "关注时回复"), - MESSAGE(2, "收到消息回复"), - KEYWORD(3, "关键词回复"), - ; - - /** - * 来源 - */ - private final Integer type; - /** - * 类型的名字 - */ - private final String name; - -} diff --git a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpMessageSendFromEnum.java b/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpMessageSendFromEnum.java deleted file mode 100644 index 6c505da8..00000000 --- a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/enums/message/MpMessageSendFromEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.mp.enums.message; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 微信公众号消息的发送来源 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum MpMessageSendFromEnum { - - USER_TO_MP(1, "粉丝发送给公众号"), - MP_TO_USER(2, "公众号发给粉丝"), - ; - - /** - * 来源 - */ - private final Integer from; - /** - * 来源的名字 - */ - private final String name; - -} diff --git a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/package-info.java b/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/package-info.java deleted file mode 100644 index 2dac081b..00000000 --- a/win-module-mp/win-module-mp-api/src/main/java/com/win/module/mp/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * mp 模块,我们放微信微信公众号。 - * 例如说:提供微信公众号的账号、菜单、粉丝、标签、消息、自动回复、素材、模板通知、运营数据等功能 - * - * 1. Controller URL:以 /mp/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 mp_ 开头,方便在数据库中区分 - */ -package com.win.module.mp; diff --git a/win-module-mp/win-module-mp-biz/pom.xml b/win-module-mp/win-module-mp-biz/pom.xml deleted file mode 100644 index dcc8dac1..00000000 --- a/win-module-mp/win-module-mp-biz/pom.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - win-module-mp - com.win - ${revision} - - 4.0.0 - win-module-mp-biz - jar - - ${project.artifactId} - - mp 模块,我们放微信微信公众号。 - 例如说:提供微信公众号的账号、菜单、粉丝、标签、消息、自动回复、素材、模板通知、运营数据等功能 - - - - - com.win - win-module-mp-api - ${revision} - - - com.win - win-module-system-api - ${revision} - - - com.win - win-module-infra-api - ${revision} - - - - - com.win - win-spring-boot-starter-biz-operatelog - - - com.win - win-spring-boot-starter-biz-weixin - - - com.win - win-spring-boot-starter-biz-tenant - - - - - com.win - win-spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-validation - - - - - com.win - win-spring-boot-starter-mybatis - - - - com.win - win-spring-boot-starter-redis - - - - - com.win - win-spring-boot-starter-mq - - - - - com.win - win-spring-boot-starter-test - test - - - - - com.win - win-spring-boot-starter-excel - - - - - diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/MpAccountController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/MpAccountController.java deleted file mode 100644 index b8f565b6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/MpAccountController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.win.module.mp.controller.admin.account; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.account.vo.*; -import com.win.module.mp.convert.account.MpAccountConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.service.account.MpAccountService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号账号") -@RestController -@RequestMapping("/mp/account") -@Validated -public class MpAccountController { - - @Resource - private MpAccountService mpAccountService; - - @PostMapping("/create") - @Operation(summary = "创建公众号账号") - @PreAuthorize("@ss.hasPermission('mp:account:create')") - public CommonResult createAccount(@Valid @RequestBody MpAccountCreateReqVO createReqVO) { - return success(mpAccountService.createAccount(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新公众号账号") - @PreAuthorize("@ss.hasPermission('mp:account:update')") - public CommonResult updateAccount(@Valid @RequestBody MpAccountUpdateReqVO updateReqVO) { - mpAccountService.updateAccount(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除公众号账号") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:account:delete')") - public CommonResult deleteAccount(@RequestParam("id") Long id) { - mpAccountService.deleteAccount(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得公众号账号") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mp:account:query')") - public CommonResult getAccount(@RequestParam("id") Long id) { - MpAccountDO wxAccount = mpAccountService.getAccount(id); - return success(MpAccountConvert.INSTANCE.convert(wxAccount)); - } - - @GetMapping("/page") - @Operation(summary = "获得公众号账号分页") - @PreAuthorize("@ss.hasPermission('mp:account:query')") - public CommonResult> getAccountPage(@Valid MpAccountPageReqVO pageVO) { - PageResult pageResult = mpAccountService.getAccountPage(pageVO); - return success(MpAccountConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取公众号账号精简信息列表") - @PreAuthorize("@ss.hasPermission('mp:account:query')") - public CommonResult> getSimpleAccounts() { - List list = mpAccountService.getAccountList(); - return success(MpAccountConvert.INSTANCE.convertList02(list)); - } - - @PutMapping("/generate-qr-code") - @Operation(summary = "生成公众号二维码") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:account:qr-code')") - public CommonResult generateAccountQrCode(@RequestParam("id") Long id) { - mpAccountService.generateAccountQrCode(id); - return success(true); - } - - @PutMapping("/clear-quota") - @Operation(summary = "清空公众号 API 配额") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:account:clear-quota')") - public CommonResult clearAccountQuota(@RequestParam("id") Long id) { - mpAccountService.clearAccountQuota(id); - return success(true); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountBaseVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountBaseVO.java deleted file mode 100644 index aa0aaffd..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountBaseVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.mp.controller.admin.account.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -/** - * 公众号账号 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author fengdan - */ -@Data -public class MpAccountBaseVO { - - @Schema(description = "公众号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - @NotEmpty(message = "公众号名称不能为空") - private String name; - - @Schema(description = "公众号微信号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") - @NotEmpty(message = "公众号微信号不能为空") - private String account; - - @Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx5b23ba7a5589ecbb") - @NotEmpty(message = "公众号 appId 不能为空") - private String appId; - - @Schema(description = "公众号密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "3a7b3b20c537e52e74afd395eb85f61f") - @NotEmpty(message = "公众号密钥不能为空") - private String appSecret; - - @Schema(description = "公众号 token", requiredMode = Schema.RequiredMode.REQUIRED, example = "kangdayuzhen") - @NotEmpty(message = "公众号 token 不能为空") - private String token; - - @Schema(description = "加密密钥", example = "gjN+Ksei") - private String aesKey; - - @Schema(description = "备注", example = "请关注芋道源码,学习技术") - private String remark; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountCreateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountCreateReqVO.java deleted file mode 100644 index 2daa46d4..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.mp.controller.admin.account.vo; - -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 MpAccountCreateReqVO extends MpAccountBaseVO { - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountPageReqVO.java deleted file mode 100644 index dcd079e5..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountPageReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.mp.controller.admin.account.vo; - -import com.win.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 MpAccountPageReqVO extends PageParam { - - @Schema(name = "公众号名称", description = "模糊匹配") - private String name; - - @Schema(name = "公众号账号", description = "模糊匹配") - private String account; - - @Schema(name = "公众号 appid", description = "模糊匹配") - private String appId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountRespVO.java deleted file mode 100644 index dec5bd07..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.mp.controller.admin.account.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 MpAccountRespVO extends MpAccountBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "二维码图片URL", example = "https://www.iocoder.cn/1024.png") - private String qrCodeUrl; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java deleted file mode 100644 index 4c63d17a..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.mp.controller.admin.account.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 公众号账号精简信息 Response VO") -@Data -public class MpAccountSimpleRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "公众号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - private String name; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java deleted file mode 100644 index cf86ee26..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.mp.controller.admin.account.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpAccountUpdateReqVO extends MpAccountBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.http deleted file mode 100644 index 74b8f40b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.http +++ /dev/null @@ -1,5 +0,0 @@ -### 请求 /mp/material/page 接口 => 成功 -GET {{baseUrl}}/mp/material/page?permanent=true&pageNo=1&pageSize=10 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.java deleted file mode 100644 index 55205493..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/MpMaterialController.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.mp.controller.admin.material; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.material.vo.*; -import com.win.module.mp.convert.material.MpMaterialConvert; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import com.win.module.mp.service.material.MpMaterialService; -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.io.IOException; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号素材") -@RestController -@RequestMapping("/mp/material") -@Validated -public class MpMaterialController { - - @Resource - private MpMaterialService mpMaterialService; - - @Operation(summary = "上传临时素材") - @PostMapping("/upload-temporary") - @PreAuthorize("@ss.hasPermission('mp:material:upload-temporary')") - public CommonResult uploadTemporaryMaterial( - @Valid MpMaterialUploadTemporaryReqVO reqVO) throws IOException { - MpMaterialDO material = mpMaterialService.uploadTemporaryMaterial(reqVO); - return success(MpMaterialConvert.INSTANCE.convert(material)); - } - - @Operation(summary = "上传永久素材") - @PostMapping("/upload-permanent") - @PreAuthorize("@ss.hasPermission('mp:material:upload-permanent')") - public CommonResult uploadPermanentMaterial( - @Valid MpMaterialUploadPermanentReqVO reqVO) throws IOException { - MpMaterialDO material = mpMaterialService.uploadPermanentMaterial(reqVO); - return success(MpMaterialConvert.INSTANCE.convert(material)); - } - - @Operation(summary = "删除素材") - @DeleteMapping("/delete-permanent") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mp:material:delete')") - public CommonResult deleteMaterial(@RequestParam("id") Long id) { - mpMaterialService.deleteMaterial(id); - return success(true); - } - - @Operation(summary = "上传图文内容中的图片") - @PostMapping("/upload-news-image") - @PreAuthorize("@ss.hasPermission('mp:material:upload-news-image')") - public CommonResult uploadNewsImage(@Valid MpMaterialUploadNewsImageReqVO reqVO) - throws IOException { - return success(mpMaterialService.uploadNewsImage(reqVO)); - } - - @Operation(summary = "获得素材分页") - @GetMapping("/page") - @PreAuthorize("@ss.hasPermission('mp:material:query')") - public CommonResult> getMaterialPage(@Valid MpMaterialPageReqVO pageReqVO) { - PageResult pageResult = mpMaterialService.getMaterialPage(pageReqVO); - return success(MpMaterialConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java deleted file mode 100644 index b4abfa05..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialPageReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.mp.controller.admin.material.vo; - -import com.win.framework.common.pojo.PageParam; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpMaterialPageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "是否永久", example = "true") - private Boolean permanent; - - @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", example = "image") - private String type; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialRespVO.java deleted file mode 100644 index 6b38551a..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialRespVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.mp.controller.admin.material.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 公众号素材 Response VO") -@Data -public class MpMaterialRespVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long accountId; - @Schema(description = "公众号账号的 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") - private String appId; - - @Schema(description = "素材的 media_id", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") - private String mediaId; - - @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "image") - private String type; - - @Schema(description = "是否永久 true - 永久;false - 临时", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean permanent; - - @Schema(description = "素材的 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String url; - - - @Schema(description = "名字", example = "yunai.png") - private String name; - - @Schema(description = "公众号文件 URL 只有【永久素材】使用", example = "https://mmbiz.qpic.cn/xxx.mp3") - private String mpUrl; - - @Schema(description = "视频素材的标题 只有【永久素材】使用", example = "我是标题") - private String title; - @Schema(description = "视频素材的描述 只有【永久素材】使用", example = "我是介绍") - private String introduction; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java deleted file mode 100644 index 972c4d05..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.mp.controller.admin.material.vo; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 公众号素材上传图文内容中的图片 Request VO") -@Data -public class MpMaterialUploadNewsImageReqVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "文件不能为空") - @JsonIgnore // 避免被操作日志,进行序列化,导致报错 - private MultipartFile file; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java deleted file mode 100644 index 455358b6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.mp.controller.admin.material.vo; - -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import me.chanjar.weixin.common.api.WxConsts; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 公众号素材上传永久 Request VO") -@Data -public class MpMaterialUploadPermanentReqVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "image") - @NotEmpty(message = "文件类型不能为空") - private String type; - - @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "文件不能为空") - @JsonIgnore // 避免被操作日志,进行序列化,导致报错 - private MultipartFile file; - - @Schema(description = "名字 如果 name 为空,则使用 file 文件名", example = "wechat.mp") - private String name; - - @Schema(description = "视频素材的标题 文件类型为 video 时,必填", example = "视频素材的标题") - private String title; - @Schema(description = "视频素材的描述 文件类型为 video 时,必填", example = "视频素材的描述") - private String introduction; - - @AssertTrue(message = "标题不能为空") - public boolean isTitleValid() { - // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 - return ObjectUtil.notEqual(type, WxConsts.MediaFileType.VIDEO) - || title != null; - } - - @AssertTrue(message = "描述不能为空") - public boolean isIntroductionValid() { - // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 - return ObjectUtil.notEqual(type, WxConsts.MediaFileType.VIDEO) - || introduction != null; - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java deleted file mode 100644 index 69af74de..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.mp.controller.admin.material.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 公众号素材上传结果 Response VO") -@Data -public class MpMaterialUploadRespVO { - - @Schema(description = "素材的 media_id", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") - private String mediaId; - - @Schema(description = "素材的 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png") - private String url; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java deleted file mode 100644 index 804223b7..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/material/vo/MpMaterialUploadTemporaryReqVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.mp.controller.admin.material.vo; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 公众号素材上传临时 Request VO") -@Data -public class MpMaterialUploadTemporaryReqVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "image") - @NotEmpty(message = "文件类型不能为空") - private String type; - - @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "文件不能为空") - @JsonIgnore // 避免被操作日志,进行序列化,导致报错 - private MultipartFile file; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.http deleted file mode 100644 index 2276b3b4..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.http +++ /dev/null @@ -1,50 +0,0 @@ -### 请求 /mp/menu/save 接口 => 成功 -POST {{baseUrl}}/mp/menu/save -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "accountId": "1", - "menus": [ - { - "type":"click", - "name":"今日歌曲", - "menuKey":"V1001_TODAY_MUSIC" - }, - { - "name":"搜索", - "type":"view", - "url":"https://www.soso.com/" - }, - { - "name": "父按钮", - "children": [ - { - "type":"click", - "name":"归去来兮", - "menuKey":"MUSIC" - }, - { - "name":"不说", - "type":"view", - "url":"https://www.soso.com/" - }] - }] -} - -### 请求 /mp/menu/save 接口 => 成功(清空) -POST {{baseUrl}}/mp/menu/save -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "accountId": "1", - "menus": [] -} - -### 请求 /mp/menu/list 接口 => 成功 -GET {{baseUrl}}/mp/menu/list?accountId=1 -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.java deleted file mode 100644 index 5f0a9b57..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/MpMenuController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.mp.controller.admin.menu; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.mp.controller.admin.menu.vo.MpMenuRespVO; -import com.win.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO; -import com.win.module.mp.convert.menu.MpMenuConvert; -import com.win.module.mp.dal.dataobject.menu.MpMenuDO; -import com.win.module.mp.service.menu.MpMenuService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号菜单") -@RestController -@RequestMapping("/mp/menu") -@Validated -public class MpMenuController { - - @Resource - private MpMenuService mpMenuService; - - @PostMapping("/save") - @Operation(summary = "保存公众号菜单") - @PreAuthorize("@ss.hasPermission('mp:menu:save')") - public CommonResult saveMenu(@Valid @RequestBody MpMenuSaveReqVO createReqVO) { - mpMenuService.saveMenu(createReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除公众号菜单") - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "10") - @PreAuthorize("@ss.hasPermission('mp:menu:delete')") - public CommonResult deleteMenu(@RequestParam("accountId") Long accountId) { - mpMenuService.deleteMenuByAccountId(accountId); - return success(true); - } - - @GetMapping("/list") - @Operation(summary = "获得公众号菜单列表") - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "10") - @PreAuthorize("@ss.hasPermission('mp:menu:query')") - public CommonResult> getMenuList(@RequestParam("accountId") Long accountId) { - List list = mpMenuService.getMenuListByAccountId(accountId); - return success(MpMenuConvert.INSTANCE.convertList(list)); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuBaseVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuBaseVO.java deleted file mode 100644 index a89422ad..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuBaseVO.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.win.module.mp.controller.admin.menu.vo; - -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import me.chanjar.weixin.common.api.WxConsts; -import org.hibernate.validator.constraints.URL; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -import static com.win.module.mp.framework.mp.core.util.MpUtils.*; - -/** - * 公众号菜单 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MpMenuBaseVO { - - /** - * 菜单名称 - */ - private String name; - /** - * 菜单标识 - * - * 支持多 DB 类型时,无法直接使用 key + @TableField("menuKey") 来实现转换,原因是 "menuKey" AS key 而存在报错 - */ - private String menuKey; - /** - * 父菜单编号 - */ - private Long parentId; - - // ========== 按钮操作 ========== - - /** - * 按钮类型 - * - * 枚举 {@link WxConsts.MenuButtonType} - */ - private String type; - - @Schema(description = "网页链接", example = "https://www.iocoder.cn/") - @NotEmpty(message = "网页链接不能为空", groups = {ViewButtonGroup.class, MiniProgramButtonGroup.class}) - @URL(message = "网页链接必须是 URL 格式") - private String url; - - @Schema(description = "小程序的 appId", example = "wx1234567890") - @NotEmpty(message = "小程序的 appId 不能为空", groups = MiniProgramButtonGroup.class) - private String miniProgramAppId; - - @Schema(description = "小程序的页面路径", example = "pages/index/index") - @NotEmpty(message = "小程序的页面路径不能为空", groups = MiniProgramButtonGroup.class) - private String miniProgramPagePath; - - @Schema(description ="跳转图文的媒体编号", example = "jCQk93AIIgp8ixClWcW_NXXqBKInNWNmq2XnPeDZl7IMVqWiNeL4FfELtggRXd83") - @NotEmpty(message = "跳转图文的媒体编号不能为空", groups = ViewLimitedButtonGroup.class) - private String articleId; - - // ========== 消息内容 ========== - - @Schema(description = "回复的消息类型 枚举 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC", example = "text") - @NotEmpty(message = "回复的消息类型不能为空", groups = {ClickButtonGroup.class, ScanCodeWaitMsgButtonGroup.class}) - private String replyMessageType; - - @Schema(description = "回复的消息内容", example = "欢迎关注") - @NotEmpty(message = "回复的消息内容不能为空", groups = TextMessageGroup.class) - private String replyContent; - - @Schema(description = "回复的媒体 id", example = "123456") - @NotEmpty(message = "回复的消息 mediaId 不能为空", - groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) - private String replyMediaId; - @Schema(description = "回复的媒体 URL", example = "https://www.iocoder.cn/xxx.jpg") - @NotEmpty(message = "回复的消息 mediaId 不能为空", - groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) - private String replyMediaUrl; - - @Schema(description = "缩略图的媒体 id", example = "123456") - @NotEmpty(message = "回复的消息 thumbMediaId 不能为空", groups = {MusicMessageGroup.class}) - private String replyThumbMediaId; - @Schema(description = "缩略图的媒体 URL",example = "https://www.iocoder.cn/xxx.jpg") - @NotEmpty(message = "回复的消息 thumbMedia 地址不能为空", groups = {MusicMessageGroup.class}) - private String replyThumbMediaUrl; - - @Schema(description = "回复的标题", example = "视频标题") - @NotEmpty(message = "回复的消息标题不能为空", groups = VideoMessageGroup.class) - private String replyTitle; - @Schema(description = "回复的描述", example = "视频描述") - @NotEmpty(message = "消息描述不能为空", groups = VideoMessageGroup.class) - private String replyDescription; - - /** - * 回复的图文消息数组 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @NotNull(message = "回复的图文消息不能为空", groups = {NewsMessageGroup.class, ViewLimitedButtonGroup.class}) - @Valid - private List replyArticles; - - @Schema(description = "回复的音乐链接", example = "https://www.iocoder.cn/xxx.mp3") - @NotEmpty(message = "回复的音乐链接不能为空", groups = MusicMessageGroup.class) - @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class) - private String replyMusicUrl; - @Schema(description = "高质量音乐链接", example = "https://www.iocoder.cn/xxx.mp3") - @NotEmpty(message = "回复的高质量音乐链接不能为空", groups = MusicMessageGroup.class) - @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class) - private String replyHqMusicUrl; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuRespVO.java deleted file mode 100644 index 3999e004..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.mp.controller.admin.menu.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 MpMenuRespVO extends MpMenuBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long accountId; - - @Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890ox") - private String appId; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java deleted file mode 100644 index a5258bf8..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.mp.controller.admin.menu.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 公众号菜单保存 Request VO") -@Data -public class MpMenuSaveReqVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @NotEmpty(message = "菜单不能为空") - @Valid - private List

menus; - - @Schema(description = "管理后台 - 公众号菜单保存时的每个菜单") - @Data - public static class Menu extends MpMenuBaseVO { - - /** - * 子菜单数组 - */ - private List children; - - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.http deleted file mode 100644 index dbb3a7b2..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.http +++ /dev/null @@ -1,5 +0,0 @@ -### 请求 /mp/message/page 接口 => 成功 -GET {{baseUrl}}/mp/auto-reply/page?accountId=1&pageNo=1&pageSize=10 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.java deleted file mode 100644 index 569f9fbb..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpAutoReplyController.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.mp.controller.admin.message; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.convert.message.MpAutoReplyConvert; -import com.win.module.mp.dal.dataobject.message.MpAutoReplyDO; -import com.win.module.mp.service.message.MpAutoReplyService; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号自动回复") -@RestController -@RequestMapping("/mp/auto-reply") -@Validated -public class MpAutoReplyController { - - @Resource - private MpAutoReplyService mpAutoReplyService; - - @GetMapping("/page") - @Operation(summary = "获得公众号自动回复分页") - @PreAuthorize("@ss.hasPermission('mp:auto-reply:query')") - public CommonResult> getAutoReplyPage(@Valid MpMessagePageReqVO pageVO) { - PageResult pageResult = mpAutoReplyService.getAutoReplyPage(pageVO); - return success(MpAutoReplyConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/get") - @Operation(summary = "获得公众号自动回复") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mp:auto-reply:query')") - public CommonResult getAutoReply(@RequestParam("id") Long id) { - MpAutoReplyDO autoReply = mpAutoReplyService.getAutoReply(id); - return success(MpAutoReplyConvert.INSTANCE.convert(autoReply)); - } - - @PostMapping("/create") - @Operation(summary = "创建公众号自动回复") - @PreAuthorize("@ss.hasPermission('mp:auto-reply:create')") - public CommonResult createAutoReply(@Valid @RequestBody MpAutoReplyCreateReqVO createReqVO) { - return success(mpAutoReplyService.createAutoReply(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新公众号自动回复") - @PreAuthorize("@ss.hasPermission('mp:auto-reply:update')") - public CommonResult updateAutoReply(@Valid @RequestBody MpAutoReplyUpdateReqVO updateReqVO) { - mpAutoReplyService.updateAutoReply(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除公众号自动回复") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:auto-reply:delete')") - public CommonResult deleteAutoReply(@RequestParam("id") Long id) { - mpAutoReplyService.deleteAutoReply(id); - return success(true); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.http deleted file mode 100644 index b9f9721c..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.http +++ /dev/null @@ -1,33 +0,0 @@ -### 请求 /mp/message/page 接口 => 成功 -GET {{baseUrl}}/mp/message/page?accountId=1&pageNo=1&pageSize=10 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 请求 /mp/message/send 接口 => 成功(文本) -POST {{baseUrl}}/mp/message/send -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "userId": 3, - "type": "text", - "content": "测试消息" -} - -### 请求 /mp/message/send 接口 => 成功(音乐) -POST {{baseUrl}}/mp/message/send -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "userId": 3, - "type": "music", - "title": "测试音乐标题", - "description": "测试音乐内容", - "musicUrl": "https://www.iocoder.cn/xx.mp3", - "hqMusicUrl": "https://www.iocoder.cn/xx_high.mp3", - "thumbMediaId": "s98Iveeg9vDVFwa9q0u8-zSfdKe3xIzAm7wCrFE4WKGPIo4d9qAhtC-n6qvnyWyH" -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.java deleted file mode 100644 index 3e8930f3..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/MpMessageController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.mp.controller.admin.message; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessageRespVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO; -import com.win.module.mp.convert.message.MpMessageConvert; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.service.message.MpMessageService; -import io.swagger.v3.oas.annotations.Operation; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号消息") -@RestController -@RequestMapping("/mp/message") -@Validated -public class MpMessageController { - - @Resource - private MpMessageService mpMessageService; - - @GetMapping("/page") - @Operation(summary = "获得公众号消息分页") - @PreAuthorize("@ss.hasPermission('mp:message:query')") - public CommonResult> getMessagePage(@Valid MpMessagePageReqVO pageVO) { - PageResult pageResult = mpMessageService.getMessagePage(pageVO); - return success(MpMessageConvert.INSTANCE.convertPage(pageResult)); - } - - @PostMapping("/send") - @Operation(summary = "给粉丝发送消息") - @PreAuthorize("@ss.hasPermission('mp:message:send')") - public CommonResult sendMessage(@Valid @RequestBody MpMessageSendReqVO reqVO) { - MpMessageDO message = mpMessageService.sendKefuMessage(reqVO); - return success(MpMessageConvert.INSTANCE.convert(message)); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyBaseVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyBaseVO.java deleted file mode 100644 index ed458bed..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyBaseVO.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.autoreply; - -import cn.hutool.core.util.ObjectUtil; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.enums.message.MpAutoReplyTypeEnum; -import com.win.module.mp.framework.mp.core.util.MpUtils.*; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import me.chanjar.weixin.common.api.WxConsts; -import org.hibernate.validator.constraints.URL; - -import javax.validation.Valid; -import javax.validation.constraints.AssertTrue; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 公众号自动回复 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class MpAutoReplyBaseVO { - - @Schema(description = "回复类型 参见 MpAutoReplyTypeEnum 枚举", example = "1") - @NotNull(message = "回复类型不能为空") - private Integer type; - - // ==================== 请求消息 ==================== - - @Schema(description = "请求的关键字 当 type 为 MpAutoReplyTypeEnum#KEYWORD 时,必填", example = "关键字") - private String requestKeyword; - @Schema(description = "请求的匹配方式 当 type 为 MpAutoReplyTypeEnum#KEYWORD 时,必填", example = "1") - private Integer requestMatch; - - @Schema(description = "请求的消息类型 当 type 为 MpAutoReplyTypeEnum#MESSAGE 时,必填", example = "text") - private String requestMessageType; - - // ==================== 响应消息 ==================== - - @Schema(description = "回复的消息类型 枚举 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC", example = "text") - @NotEmpty(message = "回复的消息类型不能为空") - private String responseMessageType; - - @Schema(description = "回复的消息内容", example = "欢迎关注") - @NotEmpty(message = "回复的消息内容不能为空", groups = TextMessageGroup.class) - private String responseContent; - - @Schema(description = "回复的媒体 id", example = "123456") - @NotEmpty(message = "回复的消息 mediaId 不能为空", - groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) - private String responseMediaId; - @Schema(description = "回复的媒体 URL", example = "https://www.iocoder.cn/xxx.jpg") - @NotEmpty(message = "回复的消息 mediaId 不能为空", - groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) - private String responseMediaUrl; - - @Schema(description = "缩略图的媒体 id", example = "123456") - @NotEmpty(message = "回复的消息 thumbMediaId 不能为空", groups = {MusicMessageGroup.class}) - private String responseThumbMediaId; - @Schema(description = "缩略图的媒体 URL",example = "https://www.iocoder.cn/xxx.jpg") - @NotEmpty(message = "回复的消息 thumbMedia 地址不能为空", groups = {MusicMessageGroup.class}) - private String responseThumbMediaUrl; - - @Schema(description = "回复的标题", example = "视频标题") - @NotEmpty(message = "回复的消息标题不能为空", groups = VideoMessageGroup.class) - private String responseTitle; - @Schema(description = "回复的描述", example = "视频描述") - @NotEmpty(message = "消息描述不能为空", groups = VideoMessageGroup.class) - private String responseDescription; - - /** - * 回复的图文消息 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @NotNull(message = "回复的图文消息不能为空", groups = {NewsMessageGroup.class, ViewLimitedButtonGroup.class}) - @Valid - private List responseArticles; - - @Schema(description = "回复的音乐链接", example = "https://www.iocoder.cn/xxx.mp3") - @NotEmpty(message = "回复的音乐链接不能为空", groups = MusicMessageGroup.class) - @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class) - private String responseMusicUrl; - @Schema(description = "高质量音乐链接", example = "https://www.iocoder.cn/xxx.mp3") - @NotEmpty(message = "回复的高质量音乐链接不能为空", groups = MusicMessageGroup.class) - @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class) - private String responseHqMusicUrl; - - @AssertTrue(message = "请求的关键字不能为空") - public boolean isRequestKeywordValid() { - return ObjectUtil.notEqual(type, MpAutoReplyTypeEnum.KEYWORD) - || requestKeyword != null; - } - - @AssertTrue(message = "请求的关键字的匹配不能为空") - public boolean isRequestMatchValid() { - return ObjectUtil.notEqual(type, MpAutoReplyTypeEnum.KEYWORD) - || requestMatch != null; - } - - @AssertTrue(message = "请求的消息类型不能为空") - public boolean isRequestMessageTypeValid() { - return ObjectUtil.notEqual(type, MpAutoReplyTypeEnum.MESSAGE) - || requestMessageType != null; - } - - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java deleted file mode 100644 index 3fddff37..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.autoreply; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpAutoReplyCreateReqVO extends MpAutoReplyBaseVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java deleted file mode 100644 index 1642cac1..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.autoreply; - -import com.win.framework.common.pojo.PageParam; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpAutoReplyPageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java deleted file mode 100644 index 4b11bed6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.autoreply; - -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 MpAutoReplyRespVO extends MpAutoReplyBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long accountId; - @Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") - private String appId; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java deleted file mode 100644 index c01ac3eb..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.autoreply; - -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpAutoReplyUpdateReqVO extends MpAutoReplyBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "主键不能为空") - private Long id; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java deleted file mode 100644 index 3b834fbd..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.message; - -import com.win.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 javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -import static com.win.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 MpMessagePageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "消息类型 参见 WxConsts.XmlMsgType 枚举", example = "text") - private String type; - - @Schema(description = "公众号粉丝标识", example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") - private String openid; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java deleted file mode 100644 index 0695cec7..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.message; - -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.baomidou.mybatisplus.annotation.TableField; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import me.chanjar.weixin.common.api.WxConsts; - -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; - -@Schema(description = "管理后台 - 公众号消息 Response VO") -@Data -public class MpMessageRespVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer id; - - @Schema(description = "微信公众号消息 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23953173569869169") - private Long msgId; - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long accountId; - @Schema(description = "公众号账号的 appid", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") - private String appId; - - @Schema(description = "公众号粉丝编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long userId; - @Schema(description = "公众号粉丝标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") - private String openid; - - @Schema(description = "消息类型 参见 WxConsts.XmlMsgType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "text") - private String type; - @Schema(description = "消息来源 参见 MpMessageSendFromEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer sendFrom; - - // ========= 普通消息内容 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html - - @Schema(description = "消息内容 消息类型为 text 时,才有值", example = "你好呀") - private String content; - - @Schema(description = "媒体素材的编号 消息类型为 image、voice、video 时,才有值", example = "1234567890") - private String mediaId; - @Schema(description = "媒体文件的 URL 消息类型为 image、voice、video 时,才有值", example = "https://www.iocoder.cn/xxx.png") - private String mediaUrl; - - @Schema(description = "语音识别后文本 消息类型为 voice 时,才有值", example = "语音识别后文本") - private String recognition; - @Schema(description = "语音格式 消息类型为 voice 时,才有值", example = "amr") - private String format; - - @Schema(description = "标题 消息类型为 video、music、link 时,才有值", example = "我是标题") - private String title; - - @Schema(description = "描述 消息类型为 video、music 时,才有值", example = "我是描述") - private String description; - - @Schema(description = "缩略图的媒体 id 消息类型为 video、music 时,才有值", example = "1234567890") - private String thumbMediaId; - @Schema(description = "缩略图的媒体 URL 消息类型为 video、music 时,才有值", example = "https://www.iocoder.cn/xxx.png") - private String thumbMediaUrl; - - @Schema(description = "点击图文消息跳转链接 消息类型为 link 时,才有值", example = "https://www.iocoder.cn") - private String url; - - @Schema(description = "地理位置维度 消息类型为 location 时,才有值", example = "23.137466") - private Double locationX; - - @Schema(description = "地理位置经度 消息类型为 location 时,才有值", example = "113.352425") - private Double locationY; - - @Schema(description = "地图缩放大小 消息类型为 location 时,才有值", example = "13") - private Double scale; - - @Schema(description = "详细地址 消息类型为 location 时,才有值", example = "杨浦区黄兴路 221-4 号临") - private String label; - - /** - * 图文消息数组 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class) - private List articles; - - @Schema(description = "音乐链接 消息类型为 music 时,才有值", example = "https://www.iocoder.cn/xxx.mp3") - private String musicUrl; - @Schema(description = "高质量音乐链接 消息类型为 music 时,才有值", example = "https://www.iocoder.cn/xxx.mp3") - private String hqMusicUrl; - - // ========= 事件推送 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html - - @Schema(description = "事件类型 参见 WxConsts.EventType 枚举", example = "subscribe") - private String event; - @Schema(description = "事件 Key 参见 WxConsts.EventType 枚举", example = "qrscene_123456") - private String eventKey; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java deleted file mode 100644 index 9480d7de..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.mp.controller.admin.message.vo.message; - -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.framework.mp.core.util.MpUtils.*; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 公众号消息发送 Request VO") -@Data -public class MpMessageSendReqVO { - - @Schema(description = "公众号粉丝的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "公众号粉丝的编号不能为空") - private Long userId; - - // ========== 消息内容 ========== - - @Schema(description = "消息类型 TEXT/IMAGE/VOICE/VIDEO/NEWS", requiredMode = Schema.RequiredMode.REQUIRED, example = "text") - @NotEmpty(message = "消息类型不能为空") - public String type; - - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好呀") - @NotEmpty(message = "消息内容不能为空", groups = TextMessageGroup.class) - private String content; - - @Schema(description = "媒体 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP") - @NotEmpty(message = "消息内容不能为空", groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) - private String mediaId; - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "没有标题") - @NotEmpty(message = "消息内容不能为空", groups = VideoMessageGroup.class) - private String title; - - @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - @NotEmpty(message = "消息描述不能为空", groups = VideoMessageGroup.class) - private String description; - - @Schema(description = "缩略图的媒体 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP") - @NotEmpty(message = "缩略图的媒体 id 不能为空", groups = MusicMessageGroup.class) - private String thumbMediaId; - - @Schema(description = "图文消息", requiredMode = Schema.RequiredMode.REQUIRED) - @Valid - @NotNull(message = "图文消息不能为空", groups = NewsMessageGroup.class) - private List articles; - - @Schema(description = "音乐链接 消息类型为 MUSIC 时", example = "https://www.iocoder.cn/music.mp3") - private String musicUrl; - - @Schema(description = "高质量音乐链接 消息类型为 MUSIC 时", example = "https://www.iocoder.cn/music.mp3") - private String hqMusicUrl; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.http deleted file mode 100644 index 87f9d432..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.http +++ /dev/null @@ -1,54 +0,0 @@ -### 请求 /mp/draft/page 接口 => 成功 -GET {{baseUrl}}/mp/draft/page?accountId=1&pageNo=1&pageSize=10 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 请求 /mp/draft/create 接口 => 成功 -POST {{baseUrl}}/mp/draft/create?accountId=1 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "articles": [ - { - "title": "我是标题", - "author": "我是作者", - "digest": "我是摘要", - "content": "我是内容", - "contentSourceUrl": "https://www.iocoder.cn", - "thumbMediaId": "r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn" - }, - { - "title": "我是标题 2", - "author": "我是作者 2", - "digest": "我是摘要 2", - "content": "我是内容 2", - "contentSourceUrl": "https://www.iocoder.cn", - "thumbMediaId": "r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn" - } - ] -} - -### 请求 /mp/draft/create 接口 => 成功 -PUT {{baseUrl}}/mp/draft/update?accountId=1&mediaId=r6ryvl6LrxBU0miaST4Y-q-G9pdsmZw0OYG4FzHQkKfpLfEwIH51wy2bxisx8PvW -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -[{ - "title": "我是标题(OOO)", - "author": "我是作者", - "digest": "我是摘要", - "content": "我是内容", - "contentSourceUrl": "https://www.iocoder.cn", - "thumbMediaId": "r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn" -}, { - "title": "我是标题(XXX)", - "author": "我是作者", - "digest": "我是摘要", - "content": "我是内容", - "contentSourceUrl": "https://www.iocoder.cn", - "thumbMediaId": "r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn" -}] diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.java deleted file mode 100644 index 12be74b5..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpDraftController.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.win.module.mp.controller.admin.news; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.object.PageUtils; -import com.win.module.mp.controller.admin.news.vo.MpDraftPageReqVO; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.service.material.MpMaterialService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.draft.*; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.MapUtils.findAndThen; -import static com.win.module.mp.enums.ErrorCodeConstants.*; - -@Tag(name = "管理后台 - 公众号草稿") -@RestController -@RequestMapping("/mp/draft") -@Validated -public class MpDraftController { - - @Resource - private MpServiceFactory mpServiceFactory; - - @Resource - private MpMaterialService mpMaterialService; - - @GetMapping("/page") - @Operation(summary = "获得草稿分页") - @PreAuthorize("@ss.hasPermission('mp:draft:query')") - public CommonResult> getDraftPage(MpDraftPageReqVO reqVO) { - // 从公众号查询草稿箱 - WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId()); - WxMpDraftList draftList; - try { - draftList = mpService.getDraftService().listDraft(PageUtils.getStart(reqVO), reqVO.getPageSize()); - } catch (WxErrorException e) { - throw exception(DRAFT_LIST_FAIL, e.getError().getErrorMsg()); - } - // 查询对应的图片地址。目的:解决公众号的图片链接无法在我们后台展示 - setDraftThumbUrl(draftList.getItems()); - - // 返回分页 - return success(new PageResult<>(draftList.getItems(), draftList.getTotalCount().longValue())); - } - - private void setDraftThumbUrl(List items) { - // 1.1 获得 mediaId 数组 - Set mediaIds = new HashSet<>(); - items.forEach(item -> item.getContent().getNewsItem().forEach(newsItem -> mediaIds.add(newsItem.getThumbMediaId()))); - if (CollUtil.isEmpty(mediaIds)) { - return; - } - // 1.2 批量查询对应的 Media 素材 - Map materials = CollectionUtils.convertMap(mpMaterialService.getMaterialListByMediaId(mediaIds), - MpMaterialDO::getMediaId); - - // 2. 设置回 WxMpDraftItem 记录 - items.forEach(item -> item.getContent().getNewsItem().forEach(newsItem -> - findAndThen(materials, newsItem.getThumbMediaId(), material -> newsItem.setThumbUrl(material.getUrl())))); - } - - @PostMapping("/create") - @Operation(summary = "创建草稿") - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mp:draft:create')") - public CommonResult deleteDraft(@RequestParam("accountId") Long accountId, - @RequestBody WxMpAddDraft draft) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - String mediaId = mpService.getDraftService().addDraft(draft); - return success(mediaId); - } catch (WxErrorException e) { - throw exception(DRAFT_CREATE_FAIL, e.getError().getErrorMsg()); - } - } - - @PutMapping("/update") - @Operation(summary = "更新草稿") - @Parameters({ - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "1024"), - @Parameter(name = "mediaId", description = "草稿素材的编号", required = true, example = "xxx") - }) - @PreAuthorize("@ss.hasPermission('mp:draft:update')") - public CommonResult deleteDraft(@RequestParam("accountId") Long accountId, - @RequestParam("mediaId") String mediaId, - @RequestBody List articles) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - for (int i = 0; i < articles.size(); i++) { - WxMpDraftArticles article = articles.get(i); - mpService.getDraftService().updateDraft(new WxMpUpdateDraft(mediaId, i, article)); - } - return success(true); - } catch (WxErrorException e) { - throw exception(DRAFT_UPDATE_FAIL, e.getError().getErrorMsg()); - } - } - - @DeleteMapping("/delete") - @Operation(summary = "删除草稿") - @Parameters({ - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "1024"), - @Parameter(name = "mediaId", description = "草稿素材的编号", required = true, example = "xxx") - }) - @PreAuthorize("@ss.hasPermission('mp:draft:delete')") - public CommonResult deleteDraft(@RequestParam("accountId") Long accountId, - @RequestParam("mediaId") String mediaId) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - mpService.getDraftService().delDraft(mediaId); - return success(true); - } catch (WxErrorException e) { - throw exception(DRAFT_DELETE_FAIL, e.getError().getErrorMsg()); - } - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.http deleted file mode 100644 index 12241320..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.http +++ /dev/null @@ -1,13 +0,0 @@ -### 请求 /mp/free-publish/page 接口 => 成功 -GET {{baseUrl}}/mp/free-publish/page?accountId=1&pageNo=1&pageSize=10 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 请求 /mp/free-publish/submit 接口 => 成功 -POST {{baseUrl}}/mp/free-publish/submit?accountId=1&mediaId=r6ryvl6LrxBU0miaST4Y-vilmd7iS51D8IPddxflWrau0hIQ2ovY8YanO5jlgUcM -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.java deleted file mode 100644 index e46c5b9e..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/MpFreePublishController.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.win.module.mp.controller.admin.news; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.object.PageUtils; -import com.win.module.mp.controller.admin.news.vo.MpFreePublishPageReqVO; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.service.material.MpMaterialService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishItem; -import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.MapUtils.findAndThen; -import static com.win.module.mp.enums.ErrorCodeConstants.*; - -@Tag(name = "管理后台 - 公众号发布能力") -@RestController -@RequestMapping("/mp/free-publish") -@Validated -public class MpFreePublishController { - - @Resource - private MpServiceFactory mpServiceFactory; - - @Resource - private MpMaterialService mpMaterialService; - - @GetMapping("/page") - @Operation(summary = "获得已发布的图文分页") - @PreAuthorize("@ss.hasPermission('mp:free-publish:query')") - public CommonResult> getFreePublishPage(MpFreePublishPageReqVO reqVO) { - // 从公众号查询已发布的图文列表 - WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId()); - WxMpFreePublishList publicationRecords; - try { - publicationRecords = mpService.getFreePublishService().getPublicationRecords( - PageUtils.getStart(reqVO), reqVO.getPageSize()); - } catch (WxErrorException e) { - throw exception(FREE_PUBLISH_LIST_FAIL, e.getError().getErrorMsg()); - } - // 查询对应的图片地址。目的:解决公众号的图片链接无法在我们后台展示 - setFreePublishThumbUrl(publicationRecords.getItems()); - - // 返回分页 - return success(new PageResult<>(publicationRecords.getItems(), publicationRecords.getTotalCount().longValue())); - } - - private void setFreePublishThumbUrl(List items) { - // 1.1 获得 mediaId 数组 - Set mediaIds = new HashSet<>(); - items.forEach(item -> item.getContent().getNewsItem().forEach(newsItem -> mediaIds.add(newsItem.getThumbMediaId()))); - if (CollUtil.isEmpty(mediaIds)) { - return; - } - // 1.2 批量查询对应的 Media 素材 - Map materials = CollectionUtils.convertMap(mpMaterialService.getMaterialListByMediaId(mediaIds), - MpMaterialDO::getMediaId); - - // 2. 设置回 WxMpFreePublishItem 记录 - items.forEach(item -> item.getContent().getNewsItem().forEach(newsItem -> - findAndThen(materials, newsItem.getThumbMediaId(), material -> newsItem.setThumbUrl(material.getUrl())))); - } - - @PostMapping("/submit") - @Operation(summary = "发布草稿") - @Parameters({ - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "1024"), - @Parameter(name = "mediaId", description = "要发布的草稿的 media_id", required = true, example = "2048") - }) - @PreAuthorize("@ss.hasPermission('mp:free-publish:submit')") - public CommonResult submitFreePublish(@RequestParam("accountId") Long accountId, - @RequestParam("mediaId") String mediaId) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - String publishId = mpService.getFreePublishService().submit(mediaId); - return success(publishId); - } catch (WxErrorException e) { - throw exception(FREE_PUBLISH_SUBMIT_FAIL, e.getError().getErrorMsg()); - } - } - - @DeleteMapping("/delete") - @Operation(summary = "删除草稿") - @Parameters({ - @Parameter(name = "accountId", description = "公众号账号的编号", required = true, example = "1024"), - @Parameter(name = "articleId", description = "发布记录的编号", required = true, example = "2048") - }) - @PreAuthorize("@ss.hasPermission('mp:free-publish:delete')") - public CommonResult deleteFreePublish(@RequestParam("accountId") Long accountId, - @RequestParam("articleId") String articleId) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - mpService.getFreePublishService().deletePushAllArticle(articleId); - return success(true); - } catch (WxErrorException e) { - throw exception(FREE_PUBLISH_DELETE_FAIL, e.getError().getErrorMsg()); - } - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java deleted file mode 100644 index 929f0df0..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.mp.controller.admin.news.vo; - -import com.win.framework.common.pojo.PageParam; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpDraftPageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java deleted file mode 100644 index cc9b12c9..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.mp.controller.admin.news.vo; - -import com.win.framework.common.pojo.PageParam; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpFreePublishPageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/MpOpenController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/MpOpenController.java deleted file mode 100644 index 8515d39c..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/MpOpenController.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.win.module.mp.controller.admin.open; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.framework.tenant.core.util.TenantUtils; -import com.win.module.mp.controller.admin.open.vo.MpOpenCheckSignatureReqVO; -import com.win.module.mp.controller.admin.open.vo.MpOpenHandleMessageReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.module.mp.service.account.MpAccountService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpMessageRouter; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.Objects; - -@Tag(name = "管理后台 - 公众号回调") -@RestController -@RequestMapping("/mp/open") -@Validated -@Slf4j -public class MpOpenController { - - @Resource - private MpServiceFactory mpServiceFactory; - - @Resource - private MpAccountService mpAccountService; - - /** - * 接收微信公众号的校验签名 - * - * 对应 文档 - */ - @Operation(summary = "校验签名") // 参见 - @GetMapping(value = "/{appId}", produces = "text/plain;charset=utf-8") - public String checkSignature(@PathVariable("appId") String appId, - MpOpenCheckSignatureReqVO reqVO) { - log.info("[checkSignature][appId({}) 接收到来自微信服务器的认证消息({})]", appId, reqVO); - // 校验请求签名 - WxMpService wxMpService = mpServiceFactory.getRequiredMpService(appId); - // 校验通过 - if (wxMpService.checkSignature(reqVO.getTimestamp(), reqVO.getNonce(), reqVO.getSignature())) { - return reqVO.getEchostr(); - } - // 校验不通过 - return "非法请求"; - } - - /** - * 接收微信公众号的消息推送 - * - * 文档 - */ - @Operation(summary = "处理消息") - @PostMapping(value = "/{appId}", produces = "application/xml; charset=UTF-8") - @OperateLog(enable = false) // 回调地址,无需记录操作日志 - public String handleMessage(@PathVariable("appId") String appId, - @RequestBody String content, - MpOpenHandleMessageReqVO reqVO) { - log.info("[handleMessage][appId({}) 推送消息,参数({}) 内容({})]", appId, reqVO, content); - - // 处理 appId + 多租户的上下文 - MpAccountDO account = mpAccountService.getAccountFromCache(appId); - Assert.notNull(account, "公众号 appId({}) 不存在", appId); - try { - MpContextHolder.setAppId(appId); - return TenantUtils.execute(account.getTenantId(), - () -> handleMessage0(appId, content, reqVO)); - } finally { - MpContextHolder.clear(); - } - } - - private String handleMessage0(String appId, String content, MpOpenHandleMessageReqVO reqVO) { - // 校验请求签名 - WxMpService mppService = mpServiceFactory.getRequiredMpService(appId); - Assert.isTrue(mppService.checkSignature(reqVO.getTimestamp(), reqVO.getNonce(), reqVO.getSignature()), - "非法请求"); - - // 第一步,解析消息 - WxMpXmlMessage inMessage = null; - if (StrUtil.isBlank(reqVO.getEncrypt_type())) { // 明文模式 - inMessage = WxMpXmlMessage.fromXml(content); - } else if (Objects.equals(reqVO.getEncrypt_type(), MpOpenHandleMessageReqVO.ENCRYPT_TYPE_AES)) { // AES 加密模式 - inMessage = WxMpXmlMessage.fromEncryptedXml(content, mppService.getWxMpConfigStorage(), - reqVO.getTimestamp(), reqVO.getNonce(), reqVO.getMsg_signature()); - } - Assert.notNull(inMessage, "消息解析失败,原因:消息为空"); - - // 第二步,处理消息 - WxMpMessageRouter mpMessageRouter = mpServiceFactory.getRequiredMpMessageRouter(appId); - WxMpXmlOutMessage outMessage = mpMessageRouter.route(inMessage); - if (outMessage == null) { - return ""; - } - - // 第三步,返回消息 - if (StrUtil.isBlank(reqVO.getEncrypt_type())) { // 明文模式 - return outMessage.toXml(); - } else if (Objects.equals(reqVO.getEncrypt_type(), MpOpenHandleMessageReqVO.ENCRYPT_TYPE_AES)) { // AES 加密模式 - return outMessage.toEncryptedXml(mppService.getWxMpConfigStorage()); - } - return ""; - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java deleted file mode 100644 index 8f177ac6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.mp.controller.admin.open.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -@Schema(description = "管理后台 - 公众号校验签名 Request VO") -@Data -public class MpOpenCheckSignatureReqVO { - - @Schema(description = "微信加密签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "490eb57f448b87bd5f20ccef58aa4de46aa1908e") - @NotEmpty(message = "微信加密签名不能为空") - private String signature; - - @Schema(description = "时间戳", requiredMode = Schema.RequiredMode.REQUIRED, example = "1672587863") - @NotEmpty(message = "时间戳不能为空") - private String timestamp; - - @Schema(description = "随机数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1827365808") - @NotEmpty(message = "随机数不能为空") - private String nonce; - - @Schema(description = "随机字符串", requiredMode = Schema.RequiredMode.REQUIRED, example = "2721154047828672511") - @NotEmpty(message = "随机字符串不能为空") - @SuppressWarnings("SpellCheckingInspection") - private String echostr; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java deleted file mode 100644 index 3f25cfb2..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.mp.controller.admin.open.vo; - - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -@Schema(description = "管理后台 - 公众号处理消息 Request VO") -@Data -public class MpOpenHandleMessageReqVO { - - public static final String ENCRYPT_TYPE_AES = "aes"; - - @Schema(description = "微信加密签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "490eb57f448b87bd5f20ccef58aa4de46aa1908e") - @NotEmpty(message = "微信加密签名不能为空") - private String signature; - - @Schema(description = "时间戳", requiredMode = Schema.RequiredMode.REQUIRED, example = "1672587863") - @NotEmpty(message = "时间戳不能为空") - private String timestamp; - - @Schema(description = "随机数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1827365808") - @NotEmpty(message = "随机数不能为空") - private String nonce; - - @Schema(description = "粉丝 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "oz-Jdtyn-WGm4C4I5Z-nvBMO_ZfY") - @NotEmpty(message = "粉丝 openid 不能为空") - private String openid; - - @Schema(description = "消息加密类型", example = "aes") - private String encrypt_type; - - @Schema(description = "微信签名", example = "QW5kcm9pZCBUaGUgQmFzZTY0IGlzIGEgZ2VuZXJhdGVkIHN0cmluZw==") - private String msg_signature; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/MpStatisticsController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/MpStatisticsController.java deleted file mode 100644 index 4918a78a..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/MpStatisticsController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.win.module.mp.controller.admin.statistics; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.mp.controller.admin.statistics.vo.*; -import com.win.module.mp.convert.statistics.MpStatisticsConvert; -import com.win.module.mp.service.statistics.MpStatisticsService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; -import org.springframework.security.access.prepost.PreAuthorize; -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; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号统计") -@RestController -@RequestMapping("/mp/statistics") -@Validated -public class MpStatisticsController { - - @Resource - private MpStatisticsService mpStatisticsService; - - @GetMapping("/user-summary") - @Operation(summary = "获得粉丝增减数据") - @PreAuthorize("@ss.hasPermission('mp:statistics:query')") - public CommonResult> getUserSummary(MpStatisticsGetReqVO getReqVO) { - List list = mpStatisticsService.getUserSummary( - getReqVO.getAccountId(), getReqVO.getDate()); - return success(MpStatisticsConvert.INSTANCE.convertList01(list)); - } - - @GetMapping("/user-cumulate") - @Operation(summary = "获得粉丝累计数据") - @PreAuthorize("@ss.hasPermission('mp:statistics:query')") - public CommonResult> getUserCumulate(MpStatisticsGetReqVO getReqVO) { - List list = mpStatisticsService.getUserCumulate( - getReqVO.getAccountId(), getReqVO.getDate()); - return success(MpStatisticsConvert.INSTANCE.convertList02(list)); - } - - @GetMapping("/upstream-message") - @Operation(summary = "获取消息发送概况数据") - @PreAuthorize("@ss.hasPermission('mp:statistics:query')") - public CommonResult> getUpstreamMessage(MpStatisticsGetReqVO getReqVO) { - List list = mpStatisticsService.getUpstreamMessage( - getReqVO.getAccountId(), getReqVO.getDate()); - return success(MpStatisticsConvert.INSTANCE.convertList03(list)); - } - - @GetMapping("/interface-summary") - @Operation(summary = "获取消息发送概况数据") - @PreAuthorize("@ss.hasPermission('mp:statistics:query')") - public CommonResult> getInterfaceSummary(MpStatisticsGetReqVO getReqVO) { - List list = mpStatisticsService.getInterfaceSummary( - getReqVO.getAccountId(), getReqVO.getDate()); - return success(MpStatisticsConvert.INSTANCE.convertList04(list)); - } -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java deleted file mode 100644 index cc9dd7e5..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsGetReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.mp.controller.admin.statistics.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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 获得统计数据 Request VO") -@Data -public class MpStatisticsGetReqVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "查询时间范围") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @NotNull(message = "查询时间范围不能为空") - private LocalDateTime[] date; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java deleted file mode 100644 index 88706e2d..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsInterfaceSummaryRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.mp.controller.admin.statistics.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 某一天的接口分析数据 Response VO") -@Data -public class MpStatisticsInterfaceSummaryRespVO { - - @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime refDate; - - @Schema(description = "通过服务器配置地址获得消息后,被动回复粉丝消息的次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer callbackCount; - - @Schema(description = "上述动作的失败次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer failCount; - - @Schema(description = "总耗时,除以 callback_count 即为平均耗时", requiredMode = Schema.RequiredMode.REQUIRED, example = "30") - private Integer totalTimeCost; - - @Schema(description = "最大耗时", requiredMode = Schema.RequiredMode.REQUIRED, example = "40") - private Integer maxTimeCost; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java deleted file mode 100644 index d7bd247d..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUpstreamMessageRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.mp.controller.admin.statistics.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 某一天的粉丝增减数据 Response VO") -@Data -public class MpStatisticsUpstreamMessageRespVO { - - @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime refDate; - - @Schema(description = "上行发送了(向公众号发送了)消息的粉丝数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer messageUser; - - @Schema(description = "上行发送了消息的消息总数", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer messageCount; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java deleted file mode 100644 index 81435480..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserCumulateRespVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.mp.controller.admin.statistics.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 某一天的消息发送概况数据 Response VO") -@Data -public class MpStatisticsUserCumulateRespVO { - - @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime refDate; - - @Schema(description = "累计粉丝量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer cumulateUser; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java deleted file mode 100644 index 0666ef51..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/statistics/vo/MpStatisticsUserSummaryRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.mp.controller.admin.statistics.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 某一天的粉丝增减数据 Response VO") -@Data -public class MpStatisticsUserSummaryRespVO { - - @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime refDate; - - @Schema(description = "粉丝来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer userSource; - - @Schema(description = "新关注的粉丝数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer newUser; - - @Schema(description = "取消关注的粉丝数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer cancelUser; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.http deleted file mode 100644 index fe79105b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.http +++ /dev/null @@ -1,39 +0,0 @@ -### 请求 /mp/tag/create 接口 => 成功 -POST {{baseUrl}}/mp/tag/create -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "accountId": "1", - "name": "测试" -} - -### 请求 /mp/tag/update 接口 => 成功 -PUT {{baseUrl}}/mp/tag/update -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "id": "3", - "name": "测试标签啦" -} - -### 请求 /mp/tag/delete 接口 => 成功 -DELETE {{baseUrl}}/mp/tag/delete?id=3 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 请求 /mp/tag/page 接口 => 成功 -GET {{baseUrl}}/mp/tag/page?accountId=1&pageNo=1&pageSize=10 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 请求 /mp/tag/sync 接口 => 成功 -POST {{baseUrl}}/mp/tag/sync?accountId=1 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.java deleted file mode 100644 index 421a2f9e..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/MpTagController.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.win.module.mp.controller.admin.tag; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.tag.vo.*; -import com.win.module.mp.convert.tag.MpTagConvert; -import com.win.module.mp.dal.dataobject.tag.MpTagDO; -import com.win.module.mp.service.tag.MpTagService; -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.List; - -import static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号标签") -@RestController -@RequestMapping("/mp/tag") -@Validated -public class MpTagController { - - @Resource - private MpTagService mpTagService; - - @PostMapping("/create") - @Operation(summary = "创建公众号标签") - @PreAuthorize("@ss.hasPermission('mp:tag:create')") - public CommonResult createTag(@Valid @RequestBody MpTagCreateReqVO createReqVO) { - return success(mpTagService.createTag(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新公众号标签") - @PreAuthorize("@ss.hasPermission('mp:tag:update')") - public CommonResult updateTag(@Valid @RequestBody MpTagUpdateReqVO updateReqVO) { - mpTagService.updateTag(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除公众号标签") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:tag:delete')") - public CommonResult deleteTag(@RequestParam("id") Long id) { - mpTagService.deleteTag(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获取公众号标签详情") - @PreAuthorize("@ss.hasPermission('mp:tag:query')") - public CommonResult get(@RequestParam("id") Long id) { - MpTagDO mpTagDO = mpTagService.get(id); - return success(MpTagConvert.INSTANCE.convert(mpTagDO)); - } - - @GetMapping("/page") - @Operation(summary = "获取公众号标签分页") - @PreAuthorize("@ss.hasPermission('mp:tag:query')") - public CommonResult> getTagPage(MpTagPageReqVO pageReqVO) { - PageResult pageResult = mpTagService.getTagPage(pageReqVO); - return success(MpTagConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/list-all-simple") - @Operation(summary = "获取公众号账号精简信息列表") - @PreAuthorize("@ss.hasPermission('mp:account:query')") - public CommonResult> getSimpleTags() { - List list = mpTagService.getTagList(); - return success(MpTagConvert.INSTANCE.convertList02(list)); - } - - @PostMapping("/sync") - @Operation(summary = "同步公众号标签") - @Parameter(name = "accountId", description = "公众号账号的编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:tag:sync')") - public CommonResult syncTag(@RequestParam("accountId") Long accountId) { - mpTagService.syncTag(accountId); - return success(true); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagBaseVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagBaseVO.java deleted file mode 100644 index 001c3bd6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagBaseVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.win.module.mp.controller.admin.tag.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -/** - * 公众号标签 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author fengdan - */ -@Data -public class MpTagBaseVO { - - @Schema(description = "标签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") - @NotEmpty(message = "标签名不能为空") - private String name; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java deleted file mode 100644 index b04f7014..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.mp.controller.admin.tag.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpTagCreateReqVO extends MpTagBaseVO { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java deleted file mode 100644 index 4c2fb70b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.mp.controller.admin.tag.vo; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotEmpty; - -@Schema(description = "管理后台 - 公众号标签分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpTagPageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotEmpty(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "标签名,模糊匹配", example = "哈哈") - private String name; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagRespVO.java deleted file mode 100644 index 11c0cbfe..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.mp.controller.admin.tag.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 MpTagRespVO extends MpTagBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "此标签下粉丝数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer count; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java deleted file mode 100644 index 5bbd9a85..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.mp.controller.admin.tag.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 公众号标签精简信息 Response VO") -@Data -public class MpTagSimpleRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "公众号的标签编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long tagId; - - @Schema(description = "标签名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "快乐") - private String name; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java deleted file mode 100644 index 172c3934..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.mp.controller.admin.tag.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpTagUpdateReqVO extends MpTagBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.http b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.http deleted file mode 100644 index 7c615810..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.http +++ /dev/null @@ -1,18 +0,0 @@ -### 请求 /mp/user/sync 接口 => 成功 -POST {{baseUrl}}/mp/user/sync?accountId=1 -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -### 请求 /mp/user/update 接口 => 成功 -PUT {{baseUrl}}/mp/user/update -Content-Type: application/json -Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} - -{ - "id": "3", - "nickname": "test", - "remark": "测试备注", - "tagIds": [103, 104] -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.java deleted file mode 100644 index 9f189802..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/MpUserController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.mp.controller.admin.user; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.user.vo.MpUserPageReqVO; -import com.win.module.mp.controller.admin.user.vo.MpUserRespVO; -import com.win.module.mp.controller.admin.user.vo.MpUserUpdateReqVO; -import com.win.module.mp.convert.user.MpUserConvert; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import com.win.module.mp.service.user.MpUserService; -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 static com.win.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 公众号粉丝") -@RestController -@RequestMapping("/mp/user") -@Validated -public class MpUserController { - - @Resource - private MpUserService mpUserService; - - @GetMapping("/page") - @Operation(summary = "获得公众号粉丝分页") - @PreAuthorize("@ss.hasPermission('mp:user:query')") - public CommonResult> getUserPage(@Valid MpUserPageReqVO pageVO) { - PageResult pageResult = mpUserService.getUserPage(pageVO); - return success(MpUserConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/get") - @Operation(summary = "获得公众号粉丝") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mp:user:query')") - public CommonResult getUser(@RequestParam("id") Long id) { - return success(MpUserConvert.INSTANCE.convert(mpUserService.getUser(id))); - } - - @PutMapping("/update") - @Operation(summary = "更新公众号粉丝") - @PreAuthorize("@ss.hasPermission('mp:user:update')") - public CommonResult updateUser(@Valid @RequestBody MpUserUpdateReqVO updateReqVO) { - mpUserService.updateUser(updateReqVO); - return success(true); - } - - @PostMapping("/sync") - @Operation(summary = "同步公众号粉丝") - @Parameter(name = "accountId", description = "公众号账号的编号", required = true) - @PreAuthorize("@ss.hasPermission('mp:user:sync')") - public CommonResult syncUser(@RequestParam("accountId") Long accountId) { - mpUserService.syncUser(accountId); - return success(true); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserPageReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserPageReqVO.java deleted file mode 100644 index 21eee38e..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserPageReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.mp.controller.admin.user.vo; - -import com.win.framework.common.pojo.PageParam; -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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpUserPageReqVO extends PageParam { - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - @NotNull(message = "公众号账号的编号不能为空") - private Long accountId; - - @Schema(description = "公众号粉丝标识,模糊匹配", example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") - private String openid; - - @Schema(description = "公众号粉丝昵称,模糊匹配", example = "芋艿") - private String nickname; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserRespVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserRespVO.java deleted file mode 100644 index 95d3d258..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserRespVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.mp.controller.admin.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; - -@Schema(description = "管理后台 - 公众号粉丝 Response VO") -@Data -public class MpUserRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "公众号粉丝标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") - private String openid; - - @Schema(description = "关注状态 参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer subscribeStatus; - @Schema(description = "关注时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime subscribeTime; - @Schema(description = "取消关注时间") - private LocalDateTime unsubscribeTime; - - @Schema(description = "昵称", example = "芋道") - private String nickname; - @Schema(description = "头像地址", example = "https://www.iocoder.cn/1.png") - private String headImageUrl; - @Schema(description = "语言", example = "zh_CN") - private String language; - @Schema(description = "国家", example = "中国") - private String country; - @Schema(description = "省份", example = "广东省") - private String province; - @Schema(description = "城市", example = "广州市") - private String city; - @Schema(description = "备注", example = "你是一个芋头嘛") - private String remark; - - @Schema(description = "标签编号数组", example = "1,2,3") - private List tagIds; - - @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long accountId; - @Schema(description = "公众号账号的 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") - private String appId; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java deleted file mode 100644 index 0d633492..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.mp.controller.admin.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 公众号粉丝更新 Request VO") -@Data -public class MpUserUpdateReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - - @Schema(description = "昵称", example = "芋道") - private String nickname; - - @Schema(description = "备注", example = "你是一个芋头嘛") - private String remark; - - @Schema(description = "标签编号数组", example = "1,2,3") - private List tagIds; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/package-info.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/package-info.java deleted file mode 100644 index 6d154747..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 RESTful API 给前端: - * 1. admin 包:提供给管理后台 win-ui-admin 前端项目 - * 2. app 包:提供给用户 APP win-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 - */ -package com.win.module.mp.controller; diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/account/MpAccountConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/account/MpAccountConvert.java deleted file mode 100644 index b387525e..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/account/MpAccountConvert.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.mp.convert.account; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.account.vo.MpAccountCreateReqVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountRespVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountSimpleRespVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountUpdateReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface MpAccountConvert { - - MpAccountConvert INSTANCE = Mappers.getMapper(MpAccountConvert.class); - - MpAccountDO convert(MpAccountCreateReqVO bean); - - MpAccountDO convert(MpAccountUpdateReqVO bean); - - MpAccountRespVO convert(MpAccountDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/material/MpMaterialConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/material/MpMaterialConvert.java deleted file mode 100644 index c02e5869..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/material/MpMaterialConvert.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.mp.convert.material; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.material.vo.MpMaterialRespVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadRespVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import me.chanjar.weixin.mp.bean.material.WxMpMaterial; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.io.File; - -@Mapper -public interface MpMaterialConvert { - - MpMaterialConvert INSTANCE = Mappers.getMapper(MpMaterialConvert.class); - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(source = "account.id", target = "accountId"), - @Mapping(source = "account.appId", target = "appId"), - @Mapping(source = "name", target = "name") - }) - MpMaterialDO convert(String mediaId, String type, String url, MpAccountDO account, - String name); - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(source = "account.id", target = "accountId"), - @Mapping(source = "account.appId", target = "appId"), - @Mapping(source = "name", target = "name") - }) - MpMaterialDO convert(String mediaId, String type, String url, MpAccountDO account, - String name, String title, String introduction, String mpUrl); - - MpMaterialUploadRespVO convert(MpMaterialDO bean); - - default WxMpMaterial convert(String name, File file, String title, String introduction) { - return new WxMpMaterial(name, file, title, introduction); - } - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/menu/MpMenuConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/menu/MpMenuConvert.java deleted file mode 100644 index e05c517f..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/menu/MpMenuConvert.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.mp.convert.menu; - -import com.win.module.mp.controller.admin.menu.vo.MpMenuRespVO; -import com.win.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO; -import com.win.module.mp.dal.dataobject.menu.MpMenuDO; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import me.chanjar.weixin.common.bean.menu.WxMenuButton; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface MpMenuConvert { - - MpMenuConvert INSTANCE = Mappers.getMapper(MpMenuConvert.class); - - MpMenuRespVO convert(MpMenuDO bean); - - List convertList(List list); - - @Mappings({ - @Mapping(source = "menu.appId", target = "appId"), - @Mapping(source = "menu.replyMessageType", target = "type"), - @Mapping(source = "menu.replyContent", target = "content"), - @Mapping(source = "menu.replyMediaId", target = "mediaId"), - @Mapping(source = "menu.replyThumbMediaId", target = "thumbMediaId"), - @Mapping(source = "menu.replyTitle", target = "title"), - @Mapping(source = "menu.replyDescription", target = "description"), - @Mapping(source = "menu.replyArticles", target = "articles"), - @Mapping(source = "menu.replyMusicUrl", target = "musicUrl"), - @Mapping(source = "menu.replyHqMusicUrl", target = "hqMusicUrl"), - }) - MpMessageSendOutReqBO convert(String openid, MpMenuDO menu); - - List convert(List list); - - @Mappings({ - @Mapping(source = "menuKey", target = "key"), - @Mapping(source = "children", target = "subButtons"), - @Mapping(source = "miniProgramAppId", target = "appId"), - @Mapping(source = "miniProgramPagePath", target = "pagePath"), - }) - WxMenuButton convert(MpMenuSaveReqVO.Menu bean); - - MpMenuDO convert02(MpMenuSaveReqVO.Menu menu); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpAutoReplyConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpAutoReplyConvert.java deleted file mode 100644 index 26471e37..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpAutoReplyConvert.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.mp.convert.message; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO; -import com.win.module.mp.dal.dataobject.message.MpAutoReplyDO; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface MpAutoReplyConvert { - - MpAutoReplyConvert INSTANCE = Mappers.getMapper(MpAutoReplyConvert.class); - - @Mappings({ - @Mapping(source = "reply.appId", target = "appId"), - @Mapping(source = "reply.responseMessageType", target = "type"), - @Mapping(source = "reply.responseContent", target = "content"), - @Mapping(source = "reply.responseMediaId", target = "mediaId"), - @Mapping(source = "reply.responseTitle", target = "title"), - @Mapping(source = "reply.responseDescription", target = "description"), - @Mapping(source = "reply.responseArticles", target = "articles"), - }) - MpMessageSendOutReqBO convert(String openid, MpAutoReplyDO reply); - - PageResult convertPage(PageResult page); - - MpAutoReplyRespVO convert(MpAutoReplyDO bean); - - MpAutoReplyDO convert(MpAutoReplyCreateReqVO bean); - - MpAutoReplyDO convert(MpAutoReplyUpdateReqVO bean); -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpMessageConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpMessageConvert.java deleted file mode 100644 index 2f1814fa..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/message/MpMessageConvert.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.win.module.mp.convert.message; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.message.MpMessageRespVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage; -import me.chanjar.weixin.mp.builder.outxml.BaseBuilder; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface MpMessageConvert { - - MpMessageConvert INSTANCE = Mappers.getMapper(MpMessageConvert.class); - - MpMessageRespVO convert(MpMessageDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default MpMessageDO convert(WxMpXmlMessage wxMessage, MpAccountDO account, MpUserDO user) { - MpMessageDO message = convert(wxMessage); - if (account != null) { - message.setAccountId(account.getId()).setAppId(account.getAppId()); - } - if (user != null) { - message.setUserId(user.getId()).setOpenid(user.getOpenid()); - } - return message; - } - @Mappings(value = { - @Mapping(source = "msgType", target = "type"), - @Mapping(target = "createTime", ignore = true), - }) - MpMessageDO convert(WxMpXmlMessage bean); - - default MpMessageDO convert(MpMessageSendOutReqBO sendReqBO, MpAccountDO account, MpUserDO user) { - // 构建消息 - MpMessageDO message = new MpMessageDO(); - message.setType(sendReqBO.getType()); - switch (sendReqBO.getType()) { - case WxConsts.XmlMsgType.TEXT: // 1. 文本 - message.setContent(sendReqBO.getContent()); - break; - case WxConsts.XmlMsgType.IMAGE: // 2. 图片 - case WxConsts.XmlMsgType.VOICE: // 3. 语音 - message.setMediaId(sendReqBO.getMediaId()); - break; - case WxConsts.XmlMsgType.VIDEO: // 4. 视频 - message.setMediaId(sendReqBO.getMediaId()) - .setTitle(sendReqBO.getTitle()).setDescription(sendReqBO.getDescription()); - break; - case WxConsts.XmlMsgType.NEWS: // 5. 图文 - message.setArticles(sendReqBO.getArticles()); - case WxConsts.XmlMsgType.MUSIC: // 6. 音乐 - message.setTitle(sendReqBO.getTitle()).setDescription(sendReqBO.getDescription()) - .setMusicUrl(sendReqBO.getMusicUrl()).setHqMusicUrl(sendReqBO.getHqMusicUrl()) - .setThumbMediaId(sendReqBO.getThumbMediaId()); - break; - default: - throw new IllegalArgumentException("不支持的消息类型:" + message.getType()); - } - - // 其它字段 - if (account != null) { - message.setAccountId(account.getId()).setAppId(account.getAppId()); - } - if (user != null) { - message.setUserId(user.getId()).setOpenid(user.getOpenid()); - } - return message; - } - - default WxMpXmlOutMessage convert02(MpMessageDO message, MpAccountDO account) { - BaseBuilder builder; - // 个性化字段 - switch (message.getType()) { - case WxConsts.XmlMsgType.TEXT: - builder = WxMpXmlOutMessage.TEXT().content(message.getContent()); - break; - case WxConsts.XmlMsgType.IMAGE: - builder = WxMpXmlOutMessage.IMAGE().mediaId(message.getMediaId()); - break; - case WxConsts.XmlMsgType.VOICE: - builder = WxMpXmlOutMessage.VOICE().mediaId(message.getMediaId()); - break; - case WxConsts.XmlMsgType.VIDEO: - builder = WxMpXmlOutMessage.VIDEO().mediaId(message.getMediaId()) - .title(message.getTitle()).description(message.getDescription()); - break; - case WxConsts.XmlMsgType.NEWS: - builder = WxMpXmlOutMessage.NEWS().articles(convertList02(message.getArticles())); - break; - case WxConsts.XmlMsgType.MUSIC: - builder = WxMpXmlOutMessage.MUSIC().title(message.getTitle()).description(message.getDescription()) - .musicUrl(message.getMusicUrl()).hqMusicUrl(message.getHqMusicUrl()) - .thumbMediaId(message.getThumbMediaId()); - break; - default: - throw new IllegalArgumentException("不支持的消息类型:" + message.getType()); - } - // 通用字段 - builder.fromUser(account.getAccount()); - builder.toUser(message.getOpenid()); - return builder.build(); - } - List convertList02(List list); - - default WxMpKefuMessage convert(MpMessageSendReqVO sendReqVO, MpUserDO user) { - me.chanjar.weixin.mp.builder.kefu.BaseBuilder builder; - // 个性化字段 - switch (sendReqVO.getType()) { - case WxConsts.KefuMsgType.TEXT: - builder = WxMpKefuMessage.TEXT().content(sendReqVO.getContent()); - break; - case WxConsts.KefuMsgType.IMAGE: - builder = WxMpKefuMessage.IMAGE().mediaId(sendReqVO.getMediaId()); - break; - case WxConsts.KefuMsgType.VOICE: - builder = WxMpKefuMessage.VOICE().mediaId(sendReqVO.getMediaId()); - break; - case WxConsts.KefuMsgType.VIDEO: - builder = WxMpKefuMessage.VIDEO().mediaId(sendReqVO.getMediaId()) - .title(sendReqVO.getTitle()).description(sendReqVO.getDescription()); - break; - case WxConsts.KefuMsgType.NEWS: - builder = WxMpKefuMessage.NEWS().articles(convertList03(sendReqVO.getArticles())); - break; - case WxConsts.KefuMsgType.MUSIC: - builder = WxMpKefuMessage.MUSIC().title(sendReqVO.getTitle()).description(sendReqVO.getDescription()) - .thumbMediaId(sendReqVO.getThumbMediaId()) - .musicUrl(sendReqVO.getMusicUrl()).hqMusicUrl(sendReqVO.getHqMusicUrl()); - break; - default: - throw new IllegalArgumentException("不支持的消息类型:" + sendReqVO.getType()); - } - // 通用字段 - builder.toUser(user.getOpenid()); - return builder.build(); - } - List convertList03(List list); - - default MpMessageDO convert(WxMpKefuMessage wxMessage, MpAccountDO account, MpUserDO user) { - MpMessageDO message = convert(wxMessage); - if (account != null) { - message.setAccountId(account.getId()).setAppId(account.getAppId()); - } - if (user != null) { - message.setUserId(user.getId()).setOpenid(user.getOpenid()); - } - return message; - } - @Mappings(value = { - @Mapping(source = "msgType", target = "type"), - @Mapping(target = "createTime", ignore = true), - }) - MpMessageDO convert(WxMpKefuMessage bean); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/statistics/MpStatisticsConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/statistics/MpStatisticsConvert.java deleted file mode 100644 index a2585d63..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/statistics/MpStatisticsConvert.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.mp.convert.statistics; - -import com.win.module.mp.controller.admin.statistics.vo.MpStatisticsInterfaceSummaryRespVO; -import com.win.module.mp.controller.admin.statistics.vo.MpStatisticsUpstreamMessageRespVO; -import com.win.module.mp.controller.admin.statistics.vo.MpStatisticsUserCumulateRespVO; -import com.win.module.mp.controller.admin.statistics.vo.MpStatisticsUserSummaryRespVO; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface MpStatisticsConvert { - - MpStatisticsConvert INSTANCE = Mappers.getMapper(MpStatisticsConvert.class); - - List convertList01(List list); - - List convertList02(List list); - - List convertList03(List list); - - @Mappings({ - @Mapping(source = "refDate", target = "refDate", dateFormat = "yyyy-MM-dd"), - @Mapping(source = "msgUser", target = "messageUser"), - @Mapping(source = "msgCount", target = "messageCount"), - }) - MpStatisticsUpstreamMessageRespVO convert(WxDataCubeMsgResult bean); - - List convertList04(List list); - - @Mapping(source = "refDate", target = "refDate", dateFormat = "yyyy-MM-dd") - MpStatisticsInterfaceSummaryRespVO convert(WxDataCubeInterfaceResult bean); -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/tag/MpTagConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/tag/MpTagConvert.java deleted file mode 100644 index 95902b4c..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/tag/MpTagConvert.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.mp.convert.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.tag.vo.MpTagRespVO; -import com.win.module.mp.controller.admin.tag.vo.MpTagSimpleRespVO; -import com.win.module.mp.controller.admin.tag.vo.MpTagUpdateReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.tag.MpTagDO; -import me.chanjar.weixin.mp.bean.tag.WxUserTag; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface MpTagConvert { - - MpTagConvert INSTANCE = Mappers.getMapper(MpTagConvert.class); - - WxUserTag convert(MpTagUpdateReqVO bean); - - MpTagRespVO convert(WxUserTag bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(source = "tag.id", target = "tagId"), - @Mapping(source = "tag.name", target = "name"), - @Mapping(source = "tag.count", target = "count"), - @Mapping(source = "account.id", target = "accountId"), - @Mapping(source = "account.appId", target = "appId"), - }) - MpTagDO convert(WxUserTag tag, MpAccountDO account); - - MpTagRespVO convert(MpTagDO mpTagDO); - - List convertList02(List list); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/user/MpUserConvert.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/user/MpUserConvert.java deleted file mode 100644 index 1b22208b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/convert/user/MpUserConvert.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.win.module.mp.convert.user; - -import cn.hutool.core.date.LocalDateTimeUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.mp.controller.admin.user.vo.MpUserRespVO; -import com.win.module.mp.controller.admin.user.vo.MpUserUpdateReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import me.chanjar.weixin.mp.bean.result.WxMpUser; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface MpUserConvert { - - MpUserConvert INSTANCE = Mappers.getMapper(MpUserConvert.class); - - MpUserRespVO convert(MpUserDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - @Mappings(value = { - @Mapping(source = "openId", target = "openid"), - @Mapping(source = "headImgUrl", target = "headImageUrl"), - @Mapping(target = "subscribeTime", ignore = true), // 单独转换 - }) - MpUserDO convert(WxMpUser wxMpUser); - - default MpUserDO convert(MpAccountDO account, WxMpUser wxMpUser) { - MpUserDO user = convert(wxMpUser); - user.setSubscribeStatus(wxMpUser.getSubscribe() ? CommonStatusEnum.ENABLE.getStatus() - : CommonStatusEnum.DISABLE.getStatus()); - user.setSubscribeTime(LocalDateTimeUtil.of(wxMpUser.getSubscribeTime() * 1000L)); - if (account != null) { - user.setAccountId(account.getId()); - user.setAppId(account.getAppId()); - } - return user; - } - - default List convertList(MpAccountDO account, List wxUsers) { - return CollectionUtils.convertList(wxUsers, wxUser -> convert(account, wxUser)); - } - - MpUserDO convert(MpUserUpdateReqVO bean); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/account/MpAccountDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/account/MpAccountDO.java deleted file mode 100644 index cce736e4..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/account/MpAccountDO.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.mp.dal.dataobject.account; - -import com.win.framework.tenant.core.db.TenantBaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 公众号账号 DO - * - * @author 芋道源码 - */ -@TableName("mp_account") -@KeySequence("mp_account_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MpAccountDO extends TenantBaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 公众号名称 - */ - private String name; - /** - * 公众号账号 - */ - private String account; - /** - * 公众号 appid - */ - private String appId; - /** - * 公众号密钥 - */ - private String appSecret; - /** - * 公众号token - */ - private String token; - /** - * 消息加解密密钥 - */ - private String aesKey; - /** - * 二维码图片 URL - */ - private String qrCodeUrl; - /** - * 备注 - */ - private String remark; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/material/MpMaterialDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/material/MpMaterialDO.java deleted file mode 100644 index 9644a753..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/material/MpMaterialDO.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.win.module.mp.dal.dataobject.material; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; -import me.chanjar.weixin.common.api.WxConsts; - -/** - * 公众号素材 DO - * - * 1. 临时素材 - * 2. 永久素材 - * - * @author 芋道源码 - */ -@TableName("mp_material") -@KeySequence("mp_material_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MpMaterialDO extends BaseDO { - - /** - * 主键 - */ - @TableId - private Long id; - /** - * 公众号账号的编号 - * - * 关联 {@link MpAccountDO#getId()} - */ - private Long accountId; - /** - * 公众号 appId - * - * 冗余 {@link MpAccountDO#getAppId()} - */ - private String appId; - - /** - * 公众号素材 id - */ - private String mediaId; - /** - * 文件类型 - * - * 枚举 {@link WxConsts.MediaFileType} - */ - private String type; - /** - * 是否永久 - * - * true - 永久素材 - * false - 临时素材 - */ - private Boolean permanent; - /** - * 文件服务器的 URL - */ - private String url; - - /** - * 名字 - * - * 永久素材:非空 - * 临时素材:可能为空。 - * 1. 为空的情况:粉丝主动发送的图片、语音等 - * 2. 非空的情况:主动发送给粉丝的图片、语音等 - */ - private String name; - - /** - * 公众号文件 URL - * - * 只有【永久素材】使用 - */ - private String mpUrl; - - /** - * 视频素材的标题 - * - * 只有【永久素材】使用 - */ - private String title; - /** - * 视频素材的描述 - * - * 只有【永久素材】使用 - */ - private String introduction; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/menu/MpMenuDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/menu/MpMenuDO.java deleted file mode 100644 index e21fb7bd..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/menu/MpMenuDO.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.win.module.mp.dal.dataobject.menu; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -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.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.api.WxConsts.MenuButtonType; - -import java.util.List; - -/** - * 公众号菜单 DO - * - * @author 芋道源码 - */ -@TableName(value = "mp_menu", autoResultMap = true) -@KeySequence("mp_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpMenuDO extends BaseDO { - - /** - * 编号 - 顶级菜单 - */ - public static final Long ID_ROOT = 0L; - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 公众号账号的编号 - * - * 关联 {@link MpAccountDO#getId()} - */ - private Long accountId; - /** - * 公众号 appId - * - * 冗余 {@link MpAccountDO#getAppId()} - */ - private String appId; - - /** - * 菜单名称 - */ - private String name; - /** - * 菜单标识 - * - * 支持多 DB 类型时,无法直接使用 key + @TableField("menuKey") 来实现转换,原因是 "menuKey" AS key 而存在报错 - */ - private String menuKey; - /** - * 父菜单编号 - */ - private Long parentId; - - // ========== 按钮操作 ========== - - /** - * 按钮类型 - * - * 枚举 {@link MenuButtonType} - */ - private String type; - - /** - * 网页链接 - * - * 粉丝点击菜单可打开链接,不超过 1024 字节 - * - * 类型为 {@link WxConsts.XmlMsgType} 的 VIEW、MINIPROGRAM - */ - private String url; - - /** - * 小程序的 appId - * - * 类型为 {@link MenuButtonType} 的 MINIPROGRAM - */ - private String miniProgramAppId; - /** - * 小程序的页面路径 - * - * 类型为 {@link MenuButtonType} 的 MINIPROGRAM - */ - private String miniProgramPagePath; - - /** - * 跳转图文的媒体编号 - */ - private String articleId; - - // ========== 消息内容 ========== - - /** - * 消息类型 - * - * 当 {@link #type} 为 CLICK、SCANCODE_WAITMSG - * - * 枚举 {@link WxConsts.XmlMsgType} 中的 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC - */ - private String replyMessageType; - - /** - * 回复的消息内容 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT - */ - private String replyContent; - - /** - * 回复的媒体 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO - */ - private String replyMediaId; - /** - * 回复的媒体 URL - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO - */ - private String replyMediaUrl; - - /** - * 回复的标题 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO - */ - private String replyTitle; - /** - * 回复的描述 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO - */ - private String replyDescription; - - /** - * 回复的缩略图的媒体 id,通过素材管理中的接口上传多媒体文件,得到的 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO - */ - private String replyThumbMediaId; - /** - * 回复的缩略图的媒体 URL - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO - */ - private String replyThumbMediaUrl; - - /** - * 回复的图文消息数组 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class) - private List replyArticles; - - /** - * 回复的音乐链接 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - private String replyMusicUrl; - /** - * 回复的高质量音乐链接 - * - * WIFI 环境优先使用该链接播放音乐 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - private String replyHqMusicUrl; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpAutoReplyDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpAutoReplyDO.java deleted file mode 100644 index d2609e9b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpAutoReplyDO.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.win.module.mp.dal.dataobject.message; - -import com.win.framework.common.util.collection.SetUtils; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.enums.message.MpAutoReplyMatchEnum; -import com.win.module.mp.enums.message.MpAutoReplyTypeEnum; -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.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.api.WxConsts.XmlMsgType; - -import java.util.List; -import java.util.Set; - -/** - * 公众号消息自动回复 DO - * - * @author 芋道源码 - */ -@TableName(value = "mp_auto_reply", autoResultMap = true) -@KeySequence("mp_auto_reply_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpAutoReplyDO extends BaseDO { - - 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); - - /** - * 主键 - */ - @TableId - private Long id; - /** - * 公众号账号的编号 - * - * 关联 {@link MpAccountDO#getId()} - */ - private Long accountId; - /** - * 公众号 appId - * - * 冗余 {@link MpAccountDO#getAppId()} - */ - private String appId; - - /** - * 回复类型 - * - * 枚举 {@link MpAutoReplyTypeEnum} - */ - private Integer type; - - // ==================== 请求消息 ==================== - - /** - * 请求的关键字 - * - * 当 {@link #type} 为 {@link MpAutoReplyTypeEnum#KEYWORD} - */ - private String requestKeyword; - /** - * 请求的关键字的匹配 - * - * 当 {@link #type} 为 {@link MpAutoReplyTypeEnum#KEYWORD} - * - * 枚举 {@link MpAutoReplyMatchEnum} - */ - private Integer requestMatch; - - /** - * 请求的消息类型 - * - * 当 {@link #type} 为 {@link MpAutoReplyTypeEnum#MESSAGE} - * - * 枚举 {@link XmlMsgType} 中的 {@link #REQUEST_MESSAGE_TYPE} - */ - private String requestMessageType; - - // ==================== 响应消息 ==================== - - /** - * 回复的消息类型 - * - * 枚举 {@link XmlMsgType} 中的 TEXT、IMAGE、VOICE、VIDEO、NEWS - */ - private String responseMessageType; - - /** - * 回复的消息内容 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT - */ - private String responseContent; - - /** - * 回复的媒体 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO - */ - private String responseMediaId; - /** - * 回复的媒体 URL - */ - private String responseMediaUrl; - - /** - * 回复的标题 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO - */ - private String responseTitle; - /** - * 回复的描述 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO - */ - private String responseDescription; - - /** - * 回复的缩略图的媒体 id,通过素材管理中的接口上传多媒体文件,得到的 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO - */ - private String responseThumbMediaId; - /** - * 回复的缩略图的媒体 URL - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO - */ - private String responseThumbMediaUrl; - - /** - * 回复的图文消息 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class) - private List responseArticles; - - /** - * 回复的音乐链接 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - private String responseMusicUrl; - /** - * 回复的高质量音乐链接 - * - * WIFI 环境优先使用该链接播放音乐 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - private String responseHqMusicUrl; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpMessageDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpMessageDO.java deleted file mode 100644 index da598482..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/message/MpMessageDO.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.win.module.mp.dal.dataobject.message; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import com.win.module.mp.enums.message.MpMessageSendFromEnum; -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 com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; -import lombok.*; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.builder.kefu.NewsBuilder; - -import javax.validation.constraints.NotEmpty; -import java.io.Serializable; -import java.util.List; - -/** - * 公众号消息 DO - * - * @author 芋道源码 - */ -@TableName(value = "mp_message", autoResultMap = true) -@KeySequence("mp_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MpMessageDO extends BaseDO { - - /** - * 主键 - */ - @TableId - private Long id; - /** - * 微信公众号消息 id - */ - private Long msgId; - /** - * 公众号账号的 ID - * - * 关联 {@link MpAccountDO#getId()} - */ - private Long accountId; - /** - * 公众号 appid - * - * 冗余 {@link MpAccountDO#getAppId()} - */ - private String appId; - /** - * 公众号粉丝的编号 - * - * 关联 {@link MpUserDO#getId()} - */ - private Long userId; - /** - * 公众号粉丝标志 - * - * 冗余 {@link MpUserDO#getOpenid()} - */ - private String openid; - - /** - * 消息类型 - * - * 枚举 {@link WxConsts.XmlMsgType} - */ - private String type; - /** - * 消息来源 - * - * 枚举 {@link MpMessageSendFromEnum} - */ - private Integer sendFrom; - - // ========= 普通消息内容 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html - - /** - * 消息内容 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT - */ - private String content; - - /** - * 媒体文件的编号 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO - */ - private String mediaId; - /** - * 媒体文件的 URL - */ - private String mediaUrl; - /** - * 语音识别后文本 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VOICE - */ - private String recognition; - /** - * 语音格式,如 amr,speex 等 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VOICE - */ - private String format; - /** - * 标题 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO、MUSIC、LINK - */ - private String title; - /** - * 描述 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO、MUSIC - */ - private String description; - - /** - * 缩略图的媒体 id,通过素材管理中的接口上传多媒体文件,得到的 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO - */ - private String thumbMediaId; - /** - * 缩略图的媒体 URL - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO - */ - private String thumbMediaUrl; - - /** - * 点击图文消息跳转链接 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 LINK - */ - private String url; - - /** - * 地理位置维度 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 LOCATION - */ - private Double locationX; - /** - * 地理位置经度 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 LOCATION - */ - private Double locationY; - /** - * 地图缩放大小 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 LOCATION - */ - private Double scale; - /** - * 详细地址 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 LOCATION - * - * 例如说杨浦区黄兴路 221-4 号临 - */ - private String label; - - /** - * 图文消息数组 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @TableField(typeHandler = ArticleTypeHandler.class) - private List
articles; - - /** - * 音乐链接 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - private String musicUrl; - /** - * 高质量音乐链接 - * - * WIFI 环境优先使用该链接播放音乐 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - private String hqMusicUrl; - - // ========= 事件推送 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html - - /** - * 事件类型 - * - * 枚举 {@link WxConsts.EventType} - */ - private String event; - /** - * 事件 Key - * - * 1. {@link WxConsts.EventType} 的 SCAN:qrscene_ 为前缀,后面为二维码的参数值 - * 2. {@link WxConsts.EventType} 的 CLICK:与自定义菜单接口中 KEY 值对应 - */ - private String eventKey; - - /** - * 文章 - */ - @Data - public static class Article implements Serializable { - - /** - * 图文消息标题 - */ - @NotEmpty(message = "图文消息标题不能为空", groups = NewsBuilder.class) - private String title; - /** - * 图文消息描述 - */ - @NotEmpty(message = "图文消息描述不能为空", groups = NewsBuilder.class) - private String description; - /** - * 图片链接 - * - * 支持 JPG、PNG 格式,较好的效果为大图 360*200,小图 200*200 - */ - @NotEmpty(message = "图片链接不能为空", groups = NewsBuilder.class) - private String picUrl; - /** - * 点击图文消息跳转链接 - */ - @NotEmpty(message = "点击图文消息跳转链接不能为空", groups = NewsBuilder.class) - private String url; - - } - - // TODO @芋艿:可以找一些新的思路 - public static class ArticleTypeHandler extends AbstractJsonTypeHandler> { - - @Override - protected List
parse(String json) { - return JsonUtils.parseArray(json, Article.class); - } - - @Override - protected String toJson(List
obj) { - return JsonUtils.toJsonString(obj); - } - - } -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/tag/MpTagDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/tag/MpTagDO.java deleted file mode 100644 index 1a1058e6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/tag/MpTagDO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.mp.dal.dataobject.tag; - -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import lombok.*; - -import com.baomidou.mybatisplus.annotation.*; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import me.chanjar.weixin.mp.bean.tag.WxUserTag; - -/** - * 公众号标签 DO - * - * @author 芋道源码 - */ -@TableName("mp_tag") -@KeySequence("mp_tag_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MpTagDO extends BaseDO { - - /** - * 主键 - */ - @TableId(type = IdType.INPUT) - private Long id; - /** - * 公众号标签 id - */ - private Long tagId; - /** - * 标签名 - */ - private String name; - /** - * 此标签下粉丝数 - * - * 冗余:{@link WxUserTag#getCount()} 字段,需要管理员点击【同步】后,更新该字段 - */ - private Integer count; - - /** - * 公众号账号的编号 - * - * 关联 {@link MpAccountDO#getId()} - */ - private Long accountId; - /** - * 公众号 appId - * - * 冗余 {@link MpAccountDO#getAppId()} - */ - private String appId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/user/MpUserDO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/user/MpUserDO.java deleted file mode 100644 index 5781a380..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/dataobject/user/MpUserDO.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.win.module.mp.dal.dataobject.user; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.mybatis.core.type.LongListTypeHandler; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.tag.MpTagDO; -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.*; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 微信公众号粉丝 DO - * - * @author 芋道源码 - */ -@TableName(value = "mp_user", autoResultMap = true) -@KeySequence("mp_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MpUserDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 粉丝标识 - */ - private String openid; - /** - * 关注状态 - * - * 枚举 {@link CommonStatusEnum} - * 1. 开启 - 已关注 - * 2. 禁用 - 取消关注 - */ - private Integer subscribeStatus; - /** - * 关注时间 - */ - private LocalDateTime subscribeTime; - /** - * 取消关注时间 - */ - private LocalDateTime unsubscribeTime; - /** - * 昵称 - * - * 注意,2021-12-27 公众号接口不再返回头像和昵称,只能通过微信公众号的网页登录获取 - */ - private String nickname; - /** - * 头像地址 - * - * 注意,2021-12-27 公众号接口不再返回头像和昵称,只能通过微信公众号的网页登录获取 - */ - private String headImageUrl; - /** - * 语言 - */ - private String language; - /** - * 国家 - */ - private String country; - /** - * 省份 - */ - private String province; - /** - * 城市 - */ - private String city; - /** - * 备注 - */ - private String remark; - /** - * 标签编号数组 - * - * 注意,对应的是 {@link MpTagDO#getTagId()} 字段 - */ - @TableField(typeHandler = LongListTypeHandler.class) - private List tagIds; - - /** - * 公众号账号的编号 - * - * 关联 {@link MpAccountDO#getId()} - */ - private Long accountId; - /** - * 公众号 appId - * - * 冗余 {@link MpAccountDO#getAppId()} - */ - private String appId; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/account/MpAccountMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/account/MpAccountMapper.java deleted file mode 100644 index efa33e29..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/account/MpAccountMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.mp.dal.mysql.account; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.controller.admin.account.vo.MpAccountPageReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.time.LocalDateTime; - -@Mapper -public interface MpAccountMapper extends BaseMapperX { - - default PageResult selectPage(MpAccountPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MpAccountDO::getName, reqVO.getName()) - .likeIfPresent(MpAccountDO::getAccount, reqVO.getAccount()) - .likeIfPresent(MpAccountDO::getAppId, reqVO.getAppId()) - .orderByDesc(MpAccountDO::getId)); - } - - default MpAccountDO selectByAppId(String appId) { - return selectOne(MpAccountDO::getAppId, appId); - } - - @Select("SELECT COUNT(*) FROM mp_account WHERE update_time > #{maxUpdateTime}") - Long selectCountByUpdateTimeGt(LocalDateTime maxUpdateTime); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/material/MpMaterialMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/material/MpMaterialMapper.java deleted file mode 100644 index a5ab2d22..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/material/MpMaterialMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.mp.dal.mysql.material; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.controller.admin.material.vo.MpMaterialPageReqVO; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface MpMaterialMapper extends BaseMapperX { - - default MpMaterialDO selectByAccountIdAndMediaId(Long accountId, String mediaId) { - return selectOne(MpMaterialDO::getAccountId, accountId, - MpMaterialDO::getMediaId, mediaId); - } - - default PageResult selectPage(MpMaterialPageReqVO pageReqVO) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .eq(MpMaterialDO::getAccountId, pageReqVO.getAccountId()) - .eqIfPresent(MpMaterialDO::getPermanent, pageReqVO.getPermanent()) - .eqIfPresent(MpMaterialDO::getType, pageReqVO.getType()) - .orderByDesc(MpMaterialDO::getId)); - } - - default List selectListByMediaId(Collection mediaIds) { - return selectList(MpMaterialDO::getMediaId, mediaIds); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/menu/MpMenuMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/menu/MpMenuMapper.java deleted file mode 100644 index ba7aed2d..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/menu/MpMenuMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.mp.dal.mysql.menu; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.dal.dataobject.menu.MpMenuDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface MpMenuMapper extends BaseMapperX { - - default MpMenuDO selectByAppIdAndMenuKey(String appId, String menuKey) { - return selectOne(MpMenuDO::getAppId, appId, - MpMenuDO::getMenuKey, menuKey); - } - - default List selectListByAccountId(Long accountId) { - return selectList(MpMenuDO::getAccountId, accountId); - } - - default void deleteByAccountId(Long accountId) { - delete(new LambdaQueryWrapperX().eq(MpMenuDO::getAccountId, accountId)); - } -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpAutoReplyMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpAutoReplyMapper.java deleted file mode 100644 index 8052e8b6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpAutoReplyMapper.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.win.module.mp.dal.mysql.message; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.dal.dataobject.message.MpAutoReplyDO; -import com.win.module.mp.enums.message.MpAutoReplyMatchEnum; -import com.win.module.mp.enums.message.MpAutoReplyTypeEnum; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface MpAutoReplyMapper extends BaseMapperX { - - default PageResult selectPage(MpMessagePageReqVO pageVO) { - return selectPage(pageVO, new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAccountId, pageVO.getAccountId()) - .eqIfPresent(MpAutoReplyDO::getType, pageVO.getType())); - } - - default List selectListByAppIdAndKeywordAll(String appId, String requestKeyword) { - return selectList(new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAppId, appId) - .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.KEYWORD.getType()) - .eq(MpAutoReplyDO::getRequestMatch, MpAutoReplyMatchEnum.ALL.getMatch()) - .eq(MpAutoReplyDO::getRequestKeyword, requestKeyword)); - } - - default List selectListByAppIdAndKeywordLike(String appId, String requestKeyword) { - return selectList(new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAppId, appId) - .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.KEYWORD.getType()) - .eq(MpAutoReplyDO::getRequestMatch, MpAutoReplyMatchEnum.LIKE.getMatch()) - .like(MpAutoReplyDO::getRequestKeyword, requestKeyword)); - } - - default List selectListByAppIdAndMessage(String appId, String requestMessageType) { - return selectList(new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAppId, appId) - .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.MESSAGE.getType()) - .eq(MpAutoReplyDO::getRequestMessageType, requestMessageType)); - } - - default List selectListByAppIdAndSubscribe(String appId) { - return selectList(new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAppId, appId) - .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.SUBSCRIBE.getType())); - } - - default MpAutoReplyDO selectByAccountIdAndSubscribe(Long accountId) { - return selectOne(MpAutoReplyDO::getAccountId, accountId, - MpAutoReplyDO::getType, MpAutoReplyTypeEnum.SUBSCRIBE.getType()); - } - - default MpAutoReplyDO selectByAccountIdAndMessage(Long accountId, String requestMessageType) { - return selectOne(new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAccountId, accountId) - .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.MESSAGE.getType()) - .eq(MpAutoReplyDO::getRequestMessageType, requestMessageType)); - } - - default MpAutoReplyDO selectByAccountIdAndKeyword(Long accountId, String requestKeyword) { - return selectOne(new LambdaQueryWrapperX() - .eq(MpAutoReplyDO::getAccountId, accountId) - .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.KEYWORD.getType()) - .eq(MpAutoReplyDO::getRequestKeyword, requestKeyword)); - } -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpMessageMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpMessageMapper.java deleted file mode 100644 index 88e63c1b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/message/MpMessageMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.mp.dal.mysql.message; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface MpMessageMapper extends BaseMapperX { - - default PageResult selectPage(MpMessagePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MpMessageDO::getAccountId, reqVO.getAccountId()) - .eqIfPresent(MpMessageDO::getType, reqVO.getType()) - .eqIfPresent(MpMessageDO::getOpenid, reqVO.getOpenid()) - .betweenIfPresent(MpMessageDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MpMessageDO::getId)); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/tag/MpTagMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/tag/MpTagMapper.java deleted file mode 100644 index 4ced096e..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/tag/MpTagMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.mp.dal.mysql.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.controller.admin.tag.vo.MpTagPageReqVO; -import com.win.module.mp.dal.dataobject.tag.MpTagDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface MpTagMapper extends BaseMapperX { - - default PageResult selectPage(MpTagPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MpTagDO::getAccountId, reqVO.getAccountId()) - .likeIfPresent(MpTagDO::getName, reqVO.getName()) - .orderByDesc(MpTagDO::getId)); - } - - default List selectListByAccountId(Long accountId) { - return selectList(MpTagDO::getAccountId, accountId); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/user/MpUserMapper.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/user/MpUserMapper.java deleted file mode 100644 index 2c6323e5..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/dal/mysql/user/MpUserMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.mp.dal.mysql.user; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.mp.controller.admin.user.vo.MpUserPageReqVO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface MpUserMapper extends BaseMapperX { - - default PageResult selectPage(MpUserPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MpUserDO::getOpenid, reqVO.getOpenid()) - .likeIfPresent(MpUserDO::getNickname, reqVO.getNickname()) - .eqIfPresent(MpUserDO::getAccountId, reqVO.getAccountId()) - .orderByDesc(MpUserDO::getId)); - } - - default MpUserDO selectByAppIdAndOpenid(String appId, String openid) { - return selectOne(MpUserDO::getAppId, appId, - MpUserDO::getOpenid, openid); - } - - default List selectListByAppIdAndOpenid(String appId, List openids) { - return selectList(new LambdaQueryWrapperX() - .eq(MpUserDO::getAppId, appId) - .in(MpUserDO::getOpenid, openids)); - - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/config/MpConfiguration.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/config/MpConfiguration.java deleted file mode 100644 index c2f4eb58..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/config/MpConfiguration.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.mp.framework.mp.config; - -import com.win.module.mp.framework.mp.core.DefaultMpServiceFactory; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.service.handler.menu.MenuHandler; -import com.win.module.mp.service.handler.message.MessageReceiveHandler; -import com.win.module.mp.service.handler.message.MessageAutoReplyHandler; -import com.win.module.mp.service.handler.other.KfSessionHandler; -import com.win.module.mp.service.handler.other.NullHandler; -import com.win.module.mp.service.handler.other.ScanHandler; -import com.win.module.mp.service.handler.other.StoreCheckNotifyHandler; -import com.win.module.mp.service.handler.user.LocationHandler; -import com.win.module.mp.service.handler.user.SubscribeHandler; -import com.win.module.mp.service.handler.user.UnsubscribeHandler; -import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; -import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.core.StringRedisTemplate; - -/** - * 微信公众号的配置类 - * - * @author 芋道源码 - */ -@Configuration -public class MpConfiguration { - - @Bean - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - public RedisTemplateWxRedisOps redisTemplateWxRedisOps(StringRedisTemplate stringRedisTemplate) { - return new RedisTemplateWxRedisOps(stringRedisTemplate); - } - - @Bean - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - public MpServiceFactory mpServiceFactory(RedisTemplateWxRedisOps redisTemplateWxRedisOps, - WxMpProperties wxMpProperties, - MessageReceiveHandler messageReceiveHandler, - KfSessionHandler kfSessionHandler, - StoreCheckNotifyHandler storeCheckNotifyHandler, - MenuHandler menuHandler, - NullHandler nullHandler, - SubscribeHandler subscribeHandler, - UnsubscribeHandler unsubscribeHandler, - LocationHandler locationHandler, - ScanHandler scanHandler, - MessageAutoReplyHandler messageAutoReplyHandler) { - return new DefaultMpServiceFactory(redisTemplateWxRedisOps, wxMpProperties, - messageReceiveHandler, kfSessionHandler, storeCheckNotifyHandler, menuHandler, - nullHandler, subscribeHandler, unsubscribeHandler, locationHandler, scanHandler, messageAutoReplyHandler); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/DefaultMpServiceFactory.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/DefaultMpServiceFactory.java deleted file mode 100644 index b3ea3f6e..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/DefaultMpServiceFactory.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.win.module.mp.framework.mp.core; - -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.service.handler.menu.MenuHandler; -import com.win.module.mp.service.handler.message.MessageReceiveHandler; -import com.win.module.mp.service.handler.message.MessageAutoReplyHandler; -import com.win.module.mp.service.handler.other.KfSessionHandler; -import com.win.module.mp.service.handler.other.NullHandler; -import com.win.module.mp.service.handler.other.ScanHandler; -import com.win.module.mp.service.handler.other.StoreCheckNotifyHandler; -import com.win.module.mp.service.handler.user.LocationHandler; -import com.win.module.mp.service.handler.user.SubscribeHandler; -import com.win.module.mp.service.handler.user.UnsubscribeHandler; -import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; -import com.google.common.collect.Maps; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; -import me.chanjar.weixin.mp.api.WxMpMessageRouter; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; -import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; -import me.chanjar.weixin.mp.constant.WxMpEventConstants; - -import java.util.List; -import java.util.Map; - -/** - * 默认的 {@link MpServiceFactory} 实现类 - * - * @author 芋道源码 - */ -@Slf4j -@RequiredArgsConstructor -public class DefaultMpServiceFactory implements MpServiceFactory { - - /** - * 微信 appId 与 WxMpService 的映射 - */ - private volatile Map appId2MpServices; - /** - * 公众号账号 id 与 WxMpService 的映射 - */ - private volatile Map id2MpServices; - /** - * 微信 appId 与 WxMpMessageRouter 的映射 - */ - private volatile Map mpMessageRouters; - - private final RedisTemplateWxRedisOps redisTemplateWxRedisOps; - private final WxMpProperties mpProperties; - - // ========== 各种 Handler ========== - - private final MessageReceiveHandler messageReceiveHandler; - private final KfSessionHandler kfSessionHandler; - private final StoreCheckNotifyHandler storeCheckNotifyHandler; - private final MenuHandler menuHandler; - private final NullHandler nullHandler; - private final SubscribeHandler subscribeHandler; - private final UnsubscribeHandler unsubscribeHandler; - private final LocationHandler locationHandler; - private final ScanHandler scanHandler; - private final MessageAutoReplyHandler messageAutoReplyHandler; - - @Override - public void init(List list) { - Map appId2MpServices = Maps.newHashMap(); - Map id2MpServices = Maps.newHashMap(); - Map mpMessageRouters = Maps.newHashMap(); - // 处理 list - list.forEach(account -> { - // 构建 WxMpService 对象 - WxMpService mpService = buildMpService(account); - appId2MpServices.put(account.getAppId(), mpService); - id2MpServices.put(account.getId(), mpService); - // 构建 WxMpMessageRouter 对象 - WxMpMessageRouter mpMessageRouter = buildMpMessageRouter(mpService); - mpMessageRouters.put(account.getAppId(), mpMessageRouter); - }); - - // 设置到缓存 - this.appId2MpServices = appId2MpServices; - this.id2MpServices = id2MpServices; - this.mpMessageRouters = mpMessageRouters; - } - - @Override - public WxMpService getMpService(Long id) { - return id2MpServices.get(id); - } - - @Override - public WxMpService getMpService(String appId) { - return appId2MpServices.get(appId); - } - - @Override - public WxMpMessageRouter getMpMessageRouter(String appId) { - return mpMessageRouters.get(appId); - } - - private WxMpService buildMpService(MpAccountDO account) { - // 第一步,创建 WxMpRedisConfigImpl 对象 - WxMpRedisConfigImpl configStorage = new WxMpRedisConfigImpl( - redisTemplateWxRedisOps, mpProperties.getConfigStorage().getKeyPrefix()); - configStorage.setAppId(account.getAppId()); - configStorage.setSecret(account.getAppSecret()); - configStorage.setToken(account.getToken()); - configStorage.setAesKey(account.getAesKey()); - - // 第二步,创建 WxMpService 对象 - WxMpService service = new WxMpServiceImpl(); - service.setWxMpConfigStorage(configStorage); - return service; - } - - private WxMpMessageRouter buildMpMessageRouter(WxMpService mpService) { - WxMpMessageRouter router = new WxMpMessageRouter(mpService); - // 记录所有事件的日志(异步执行) - router.rule().handler(messageReceiveHandler).next(); - - // 接收客服会话管理事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxMpEventConstants.CustomerService.KF_CREATE_SESSION) - .handler(kfSessionHandler).end(); - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxMpEventConstants.CustomerService.KF_CLOSE_SESSION) - .handler(kfSessionHandler) - .end(); - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxMpEventConstants.CustomerService.KF_SWITCH_SESSION) - .handler(kfSessionHandler).end(); - - // 门店审核事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxMpEventConstants.POI_CHECK_NOTIFY) - .handler(storeCheckNotifyHandler).end(); - - // 自定义菜单事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxConsts.MenuButtonType.CLICK).handler(menuHandler).end(); - - // 点击菜单连接事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxConsts.MenuButtonType.VIEW).handler(nullHandler).end(); - - // 关注事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxConsts.EventType.SUBSCRIBE).handler(subscribeHandler) - .end(); - - // 取消关注事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxConsts.EventType.UNSUBSCRIBE) - .handler(unsubscribeHandler).end(); - - // 上报地理位置事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxConsts.EventType.LOCATION).handler(locationHandler) - .end(); - - // 接收地理位置消息 - router.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION) - .handler(locationHandler).end(); - - // 扫码事件 - router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT) - .event(WxConsts.EventType.SCAN).handler(scanHandler).end(); - - // 默认 - router.rule().async(false).handler(messageAutoReplyHandler).end(); - return router; - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/MpServiceFactory.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/MpServiceFactory.java deleted file mode 100644 index 16976192..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/MpServiceFactory.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.win.module.mp.framework.mp.core; - -import cn.hutool.core.lang.Assert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import me.chanjar.weixin.mp.api.WxMpMessageRouter; -import me.chanjar.weixin.mp.api.WxMpService; - -import java.util.List; - -/** - * {@link WxMpService} 工厂接口 - * - * @author 芋道源码 - */ -public interface MpServiceFactory { - - /** - * 基于微信公众号的账号,初始化对应的 WxMpService 与 WxMpMessageRouter 实例 - * - * @param list 公众号的账号列表 - */ - void init(List list); - - /** - * 获得 id 对应的 WxMpService 实例 - * - * @param id 微信公众号的编号 - * @return WxMpService 实例 - */ - WxMpService getMpService(Long id); - - default WxMpService getRequiredMpService(Long id) { - WxMpService wxMpService = getMpService(id); - Assert.notNull(wxMpService, "找到对应 id({}) 的 WxMpService,请核实!", id); - return wxMpService; - } - - /** - * 获得 appId 对应的 WxMpService 实例 - * - * @param appId 微信公众号 appId - * @return WxMpService 实例 - */ - WxMpService getMpService(String appId); - - default WxMpService getRequiredMpService(String appId) { - WxMpService wxMpService = getMpService(appId); - Assert.notNull(wxMpService, "找到对应 appId({}) 的 WxMpService,请核实!", appId); - return wxMpService; - } - - /** - * 获得 appId 对应的 WxMpMessageRouter 实例 - * - * @param appId 微信公众号 appId - * @return WxMpMessageRouter 实例 - */ - WxMpMessageRouter getMpMessageRouter(String appId); - - default WxMpMessageRouter getRequiredMpMessageRouter(String appId) { - WxMpMessageRouter wxMpMessageRouter = getMpMessageRouter(appId); - Assert.notNull(wxMpMessageRouter, "找到对应 appId({}) 的 WxMpMessageRouter,请核实!", appId); - return wxMpMessageRouter; - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/context/MpContextHolder.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/context/MpContextHolder.java deleted file mode 100644 index 3cfe8ca4..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/context/MpContextHolder.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.win.module.mp.framework.mp.core.context; - -import com.win.module.mp.controller.admin.open.vo.MpOpenHandleMessageReqVO; -import com.alibaba.ttl.TransmittableThreadLocal; -import lombok.experimental.UtilityClass; -import me.chanjar.weixin.mp.api.WxMpMessageHandler; - -/** - * 微信上下文 Context - * - * 目的:解决微信多公众号的问题,在 {@link WxMpMessageHandler} 实现类中,可以通过 {@link #getAppId()} 获取到当前的 appId - * - * @see com.win.module.mp.controller.admin.open.MpOpenController#handleMessage(String, String, MpOpenHandleMessageReqVO) - * - * @author 芋道源码 - */ -public class MpContextHolder { - - /** - * 微信公众号的 appId 上下文 - */ - private static final ThreadLocal APPID = new TransmittableThreadLocal<>(); - - public static void setAppId(String appId) { - APPID.set(appId); - } - - public static String getAppId() { - return APPID.get(); - } - - public static void clear() { - APPID.remove(); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/util/MpUtils.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/util/MpUtils.java deleted file mode 100644 index 4bf0ae75..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/mp/core/util/MpUtils.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.win.module.mp.framework.mp.core.util; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.util.validation.ValidationUtils; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; - -import javax.validation.Validator; - -/** - * 公众号工具类 - * - * @author 芋道源码 - */ -@Slf4j -public class MpUtils { - - /** - * 校验消息的格式是否符合要求 - * - * @param type 类型 - * @param message 消息 - */ - public static void validateMessage(Validator validator, String type, Object message) { - // 获得对应的校验 group - Class group; - switch (type) { - case WxConsts.XmlMsgType.TEXT: - group = TextMessageGroup.class; - break; - case WxConsts.XmlMsgType.IMAGE: - group = ImageMessageGroup.class; - break; - case WxConsts.XmlMsgType.VOICE: - group = VoiceMessageGroup.class; - break; - case WxConsts.XmlMsgType.VIDEO: - group = VideoMessageGroup.class; - break; - case WxConsts.XmlMsgType.NEWS: - group = NewsMessageGroup.class; - break; - case WxConsts.XmlMsgType.MUSIC: - group = MusicMessageGroup.class; - break; - default: - log.error("[validateMessage][未知的消息类型({})]", message); - throw new IllegalArgumentException("不支持的消息类型:" + type); - } - // 执行校验 - ValidationUtils.validate(validator, message, group); - } - - public static void validateButton(Validator validator, String type, String messageType, Object button) { - if (StrUtil.isBlank(type)) { - return; - } - // 获得对应的校验 group - Class group; - switch (type) { - case WxConsts.MenuButtonType.CLICK: - group = ClickButtonGroup.class; - validateMessage(validator, messageType, button); // 需要额外校验回复的消息格式 - break; - case WxConsts.MenuButtonType.VIEW: - group = ViewButtonGroup.class; - break; - case WxConsts.MenuButtonType.MINIPROGRAM: - group = MiniProgramButtonGroup.class; - break; - case WxConsts.MenuButtonType.SCANCODE_WAITMSG: - group = ScanCodeWaitMsgButtonGroup.class; - validateMessage(validator, messageType, button); // 需要额外校验回复的消息格式 - break; - case "article_" + WxConsts.MenuButtonType.VIEW_LIMITED: - group = ViewLimitedButtonGroup.class; - break; - case WxConsts.MenuButtonType.SCANCODE_PUSH: // 不用校验,直接 return 即可 - case WxConsts.MenuButtonType.PIC_SYSPHOTO: - case WxConsts.MenuButtonType.PIC_PHOTO_OR_ALBUM: - case WxConsts.MenuButtonType.PIC_WEIXIN: - case WxConsts.MenuButtonType.LOCATION_SELECT: - return; - default: - log.error("[validateButton][未知的按钮({})]", button); - throw new IllegalArgumentException("不支持的按钮类型:" + type); - } - // 执行校验 - ValidationUtils.validate(validator, button, group); - } - - /** - * 根据消息类型,获得对应的媒体文件类型 - * - * 注意,不会返回 WxConsts.MediaFileType.THUMB,因为该类型会有明确标注 - * - * @param messageType 消息类型 {@link WxConsts.XmlMsgType} - * @return 媒体文件类型 {@link WxConsts.MediaFileType} - */ - public static String getMediaFileType(String messageType) { - switch (messageType) { - case WxConsts.XmlMsgType.IMAGE: - return WxConsts.MediaFileType.IMAGE; - case WxConsts.XmlMsgType.VOICE: - return WxConsts.MediaFileType.VOICE; - case WxConsts.XmlMsgType.VIDEO: - return WxConsts.MediaFileType.VIDEO; - default: - return WxConsts.MediaFileType.FILE; - } - } - - /** - * Text 类型的消息,参数校验 Group - */ - public interface TextMessageGroup {} - - /** - * Image 类型的消息,参数校验 Group - */ - public interface ImageMessageGroup {} - - /** - * Voice 类型的消息,参数校验 Group - */ - public interface VoiceMessageGroup {} - - /** - * Video 类型的消息,参数校验 Group - */ - public interface VideoMessageGroup {} - - /** - * News 类型的消息,参数校验 Group - */ - public interface NewsMessageGroup {} - - /** - * Music 类型的消息,参数校验 Group - */ - public interface MusicMessageGroup {} - - /** - * Click 类型的按钮,参数校验 Group - */ - public interface ClickButtonGroup {} - - /** - * View 类型的按钮,参数校验 Group - */ - public interface ViewButtonGroup {} - - /** - * MiniProgram 类型的按钮,参数校验 Group - */ - public interface MiniProgramButtonGroup {} - - /** - * SCANCODE_WAITMSG 类型的按钮,参数校验 Group - */ - public interface ScanCodeWaitMsgButtonGroup {} - - /** - * VIEW_LIMITED 类型的按钮,参数校验 Group - */ - public interface ViewLimitedButtonGroup {} -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/package-info.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/package-info.java deleted file mode 100644 index da247d94..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 mp 模块的 framework 封装 - * - * @author 芋道源码 - */ -package com.win.module.mp.framework; diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/config/MpWebConfiguration.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/config/MpWebConfiguration.java deleted file mode 100644 index b2256dce..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/config/MpWebConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.mp.framework.web.config; - -import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; -import org.springdoc.core.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * mp 模块的 web 组件的 Configuration - * - * @author 芋道源码 - */ -@Configuration(proxyBeanMethods = false) -public class MpWebConfiguration { - - /** - * mp 模块的 API 分组 - */ - @Bean - public GroupedOpenApi mpGroupedOpenApi() { - return WinSwaggerAutoConfiguration.buildGroupedOpenApi("mp"); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/package-info.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/package-info.java deleted file mode 100644 index b94f9190..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * mp 模块的 web 配置 - */ -package com.win.module.mp.framework.web; diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/package-info.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/package-info.java deleted file mode 100644 index 2dac081b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * mp 模块,我们放微信微信公众号。 - * 例如说:提供微信公众号的账号、菜单、粉丝、标签、消息、自动回复、素材、模板通知、运营数据等功能 - * - * 1. Controller URL:以 /mp/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 mp_ 开头,方便在数据库中区分 - */ -package com.win.module.mp; diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountService.java deleted file mode 100644 index bc041722..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountService.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.win.module.mp.service.account; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.account.vo.MpAccountCreateReqVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountPageReqVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountUpdateReqVO; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; - -import javax.validation.Valid; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.ACCOUNT_NOT_EXISTS; - -/** - * 公众号账号 Service 接口 - * - * @author 芋道源码 - */ -public interface MpAccountService { - - /** - * 初始化缓存 - */ - void initLocalCache(); - - /** - * 创建公众号账号 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createAccount(@Valid MpAccountCreateReqVO createReqVO); - - /** - * 更新公众号账号 - * - * @param updateReqVO 更新信息 - */ - void updateAccount(@Valid MpAccountUpdateReqVO updateReqVO); - - /** - * 删除公众号账号 - * - * @param id 编号 - */ - void deleteAccount(Long id); - - /** - * 获得公众号账号 - * - * @param id 编号 - * @return 公众号账号 - */ - MpAccountDO getAccount(Long id); - - /** - * 获得公众号账号。若不存在,则抛出业务异常 - * - * @param id 编号 - * @return 公众号账号 - */ - default MpAccountDO getRequiredAccount(Long id) { - MpAccountDO account = getAccount(id); - if (account == null) { - throw exception(ACCOUNT_NOT_EXISTS); - } - return account; - } - - /** - * 从缓存中,获得公众号账号 - * - * @param appId 微信公众号 appId - * @return 公众号账号 - */ - MpAccountDO getAccountFromCache(String appId); - - /** - * 获得公众号账号分页 - * - * @param pageReqVO 分页查询 - * @return 公众号账号分页 - */ - PageResult getAccountPage(MpAccountPageReqVO pageReqVO); - - /** - * 获得公众号账号列表 - * - * @return 公众号账号列表 - */ - List getAccountList(); - - /** - * 生成公众号账号的二维码 - * - * @param id 编号 - */ - void generateAccountQrCode(Long id); - - /** - * 清空公众号账号的 API 配额 - * - * 参考文档:接口调用频次限制说明 - * - * @param id 编号 - */ - void clearAccountQuota(Long id); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountServiceImpl.java deleted file mode 100644 index b0d9e3a8..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/account/MpAccountServiceImpl.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.win.module.mp.service.account; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjUtil; -import com.win.framework.common.exception.util.ServiceExceptionUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.tenant.core.util.TenantUtils; -import com.win.module.mp.controller.admin.account.vo.MpAccountCreateReqVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountPageReqVO; -import com.win.module.mp.controller.admin.account.vo.MpAccountUpdateReqVO; -import com.win.module.mp.convert.account.MpAccountConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.mysql.account.MpAccountMapper; -import com.win.module.mp.enums.ErrorCodeConstants; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.google.common.annotations.VisibleForTesting; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; -import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.framework.common.util.collection.CollectionUtils.getMaxValue; -import static com.win.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; - -/** - * 公众号账号 Service 实现类 - * - * @author fengdan - */ -@Slf4j -@Service -@Validated -public class MpAccountServiceImpl implements MpAccountService { - - /** - * 账号缓存 - * key:账号编号 {@link MpAccountDO#getAppId()} - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - @Getter - private volatile Map accountCache; - - @Resource - private MpAccountMapper mpAccountMapper; - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpServiceFactory mpServiceFactory; - - @Override - @PostConstruct - public void initLocalCache() { - // 注意:忽略自动多租户,因为要全局初始化缓存 - TenantUtils.executeIgnore(() -> { - // 第一步:查询数据 - List accounts = Collections.emptyList(); - try { - accounts = mpAccountMapper.selectList(); - } catch (Throwable ex) { - if (!ex.getMessage().contains("doesn't exist")) { - throw ex; - } - log.error("[微信公众号 win-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); - } - log.info("[initLocalCacheIfUpdate][缓存公众号账号,数量为:{}]", accounts.size()); - - // 第二步:构建缓存。创建或更新支付 Client - mpServiceFactory.init(accounts); - accountCache = convertMap(accounts, MpAccountDO::getAppId); - }); - } - - /** - * 通过定时任务轮询,刷新缓存 - * - * 目的:多节点部署时,通过轮询”通知“所有节点,进行刷新 - */ - @Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS) - public void refreshLocalCache() { - // 注意:忽略自动多租户,因为要全局初始化缓存 - TenantUtils.executeIgnore(() -> { - // 情况一:如果缓存里没有数据,则直接刷新缓存 - if (CollUtil.isEmpty(accountCache)) { - initLocalCache(); - return; - } - - // 情况二,如果缓存里数据,则通过 updateTime 判断是否有数据变更,有变更则刷新缓存 - LocalDateTime maxTime = getMaxValue(accountCache.values(), MpAccountDO::getUpdateTime); - if (mpAccountMapper.selectCountByUpdateTimeGt(maxTime) > 0) { - initLocalCache(); - } - }); - } - - @Override - public Long createAccount(MpAccountCreateReqVO createReqVO) { - // 校验 appId 唯一 - validateAppIdUnique(null, createReqVO.getAppId()); - - // 插入 - MpAccountDO account = MpAccountConvert.INSTANCE.convert(createReqVO); - mpAccountMapper.insert(account); - - // 刷新缓存 - initLocalCache(); - return account.getId(); - } - - @Override - public void updateAccount(MpAccountUpdateReqVO updateReqVO) { - // 校验存在 - validateAccountExists(updateReqVO.getId()); - // 校验 appId 唯一 - validateAppIdUnique(updateReqVO.getId(), updateReqVO.getAppId()); - - // 更新 - MpAccountDO updateObj = MpAccountConvert.INSTANCE.convert(updateReqVO); - mpAccountMapper.updateById(updateObj); - - // 刷新缓存 - initLocalCache(); - } - - @Override - public void deleteAccount(Long id) { - // 校验存在 - validateAccountExists(id); - // 删除 - mpAccountMapper.deleteById(id); - - // 刷新缓存 - initLocalCache(); - } - - private MpAccountDO validateAccountExists(Long id) { - MpAccountDO account = mpAccountMapper.selectById(id); - if (account == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.ACCOUNT_NOT_EXISTS); - } - return account; - } - - @VisibleForTesting - public void validateAppIdUnique(Long id, String appId) { - // 多个租户,appId 是不能重复,否则公众号回调会无法识别 - TenantUtils.executeIgnore(() -> { - MpAccountDO account = mpAccountMapper.selectByAppId(appId); - if (account == null) { - return; - } - // 存在 account 记录的情况下 - if (id == null // 新增时,说明重复 - || ObjUtil.notEqual(id, account.getId())) { // 更新时,如果 id 不一致,说明重复 - throw exception(USER_USERNAME_EXISTS); - } - }); - } - - @Override - public MpAccountDO getAccount(Long id) { - return mpAccountMapper.selectById(id); - } - - @Override - public MpAccountDO getAccountFromCache(String appId) { - return accountCache.get(appId); - } - - @Override - public PageResult getAccountPage(MpAccountPageReqVO pageReqVO) { - return mpAccountMapper.selectPage(pageReqVO); - } - - @Override - public List getAccountList() { - return mpAccountMapper.selectList(); - } - - @Override - public void generateAccountQrCode(Long id) { - // 校验存在 - MpAccountDO account = validateAccountExists(id); - - // 生成二维码 - WxMpService mpService = mpServiceFactory.getRequiredMpService(account.getAppId()); - String qrCodeUrl; - try { - WxMpQrCodeTicket qrCodeTicket = mpService.getQrcodeService().qrCodeCreateLastTicket("default"); - qrCodeUrl = mpService.getQrcodeService().qrCodePictureUrl(qrCodeTicket.getTicket()); - } catch (WxErrorException e) { - throw exception(ErrorCodeConstants.ACCOUNT_GENERATE_QR_CODE_FAIL, e.getError().getErrorMsg()); - } - - // 保存二维码 - mpAccountMapper.updateById(new MpAccountDO().setId(id).setQrCodeUrl(qrCodeUrl)); - } - - @Override - public void clearAccountQuota(Long id) { - // 校验存在 - MpAccountDO account = validateAccountExists(id); - - // 生成二维码 - WxMpService mpService = mpServiceFactory.getRequiredMpService(account.getAppId()); - try { - mpService.clearQuota(account.getAppId()); - } catch (WxErrorException e) { - throw exception(ErrorCodeConstants.ACCOUNT_CLEAR_QUOTA_FAIL, e.getError().getErrorMsg()); - } - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/menu/MenuHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/menu/MenuHandler.java deleted file mode 100644 index 83f0c49d..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/menu/MenuHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.mp.service.handler.menu; - -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.module.mp.service.menu.MpMenuService; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpMenuService; -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; - -import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; - -/** - * 自定义菜单的事件处理器 - * - * 逻辑:粉丝点击菜单时,触发对应的回复 - * - * @author 芋道源码 - */ -@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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageAutoReplyHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageAutoReplyHandler.java deleted file mode 100644 index 88816572..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageAutoReplyHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.mp.service.handler.message; - -import com.win.module.mp.dal.dataobject.message.MpAutoReplyDO; -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.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 芋道源码 - */ -@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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageReceiveHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageReceiveHandler.java deleted file mode 100644 index 3379bfc3..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/message/MessageReceiveHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.win.module.mp.service.handler.message; - -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.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 芋道源码 - */ -@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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/KfSessionHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/KfSessionHandler.java deleted file mode 100644 index 234cb8a6..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/KfSessionHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.mp.service.handler.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 芋道源码 - */ -@Component -public class KfSessionHandler implements WxMpMessageHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, - WxMpService wxMpService, WxSessionManager sessionManager) { - throw new UnsupportedOperationException("未实现该处理,请自行重写"); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/NullHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/NullHandler.java deleted file mode 100644 index e89d4bda..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/NullHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.mp.service.handler.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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/ScanHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/ScanHandler.java deleted file mode 100644 index c8c0b509..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/ScanHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.mp.service.handler.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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/StoreCheckNotifyHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/StoreCheckNotifyHandler.java deleted file mode 100644 index fe01968b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/StoreCheckNotifyHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.mp.service.handler.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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/package-info.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/package-info.java deleted file mode 100644 index 0bf007c0..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/other/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 本包内的 handler 都是一些不重要的,所以放在 other 其它里 - */ -package com.win.module.mp.service.handler.other; diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/LocationHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/LocationHandler.java deleted file mode 100644 index 6c2c644f..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/LocationHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.mp.service.handler.user; - -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.util.object.ObjectUtils; -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.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 芋道源码 - */ -@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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/SubscribeHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/SubscribeHandler.java deleted file mode 100644 index a9b43c4d..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/SubscribeHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.mp.service.handler.user; - -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.module.mp.service.message.MpAutoReplyService; -import com.win.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 芋道源码 - */ -@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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/UnsubscribeHandler.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/UnsubscribeHandler.java deleted file mode 100644 index c9f97bfe..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/handler/user/UnsubscribeHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.mp.service.handler.user; - -import com.win.module.mp.framework.mp.core.context.MpContextHolder; -import com.win.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 芋道源码 - */ -@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/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialService.java deleted file mode 100644 index 4e90ba94..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.win.module.mp.service.material; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.material.vo.MpMaterialPageReqVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadNewsImageReqVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import me.chanjar.weixin.common.api.WxConsts; - -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -/** - * 公众号素材 Service 接口 - * - * @author 芋道源码 - */ -public interface MpMaterialService { - - /** - * 获得素材的 URL - * - * 该 URL 来自我们自己的文件服务器存储的 URL,不是公众号存储的 URL - * - * @param accountId 公众号账号编号 - * @param mediaId 公众号素材 id - * @param type 文件类型 {@link WxConsts.MediaFileType} - * @return 素材的 URL - */ - String downloadMaterialUrl(Long accountId, String mediaId, String type); - - /** - * 上传临时素材 - * - * @param reqVO 请求 - * @return 素材 - * @throws IOException 文件操作发生异常 - */ - MpMaterialDO uploadTemporaryMaterial(@Valid MpMaterialUploadTemporaryReqVO reqVO) throws IOException; - - /** - * 上传永久素材 - * - * @param reqVO 请求 - * @return 素材 - * @throws IOException 文件操作发生异常 - */ - MpMaterialDO uploadPermanentMaterial(@Valid MpMaterialUploadPermanentReqVO reqVO) throws IOException; - - /** - * 上传图文内容中的图片 - * - * @param reqVO 上传请求 - * @return 图片地址 - */ - String uploadNewsImage(MpMaterialUploadNewsImageReqVO reqVO) throws IOException; - - /** - * 获得素材分页 - * - * @param pageReqVO 分页请求 - * @return 素材分页 - */ - PageResult getMaterialPage(MpMaterialPageReqVO pageReqVO); - - /** - * 获得素材列表 - * - * @param mediaIds 素材 mediaId 列表 - * @return 素材列表 - */ - List getMaterialListByMediaId(Collection mediaIds); - - /** - * 删除素材 - * - * @param id 编号 - */ - void deleteMaterial(Long id); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialServiceImpl.java deleted file mode 100644 index 302d6703..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/material/MpMaterialServiceImpl.java +++ /dev/null @@ -1,224 +0,0 @@ -package com.win.module.mp.service.material; - -import cn.hutool.core.io.FileTypeUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.infra.api.file.FileApi; -import com.win.module.mp.controller.admin.material.vo.MpMaterialPageReqVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadNewsImageReqVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; -import com.win.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; -import com.win.module.mp.convert.material.MpMaterialConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.material.MpMaterialDO; -import com.win.module.mp.dal.mysql.material.MpMaterialMapper; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.service.account.MpAccountService; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.*; - -/** - * 公众号素材 Service 接口 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class MpMaterialServiceImpl implements MpMaterialService { - - @Resource - private MpMaterialMapper mpMaterialMapper; - - @Resource - private FileApi fileApi; - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpAccountService mpAccountService; - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpServiceFactory mpServiceFactory; - - @Override - public String downloadMaterialUrl(Long accountId, String mediaId, String type) { - // 第一步,直接从数据库查询。如果已经下载,直接返回 - MpMaterialDO material = mpMaterialMapper.selectByAccountIdAndMediaId(accountId, mediaId); - if (material != null) { - return material.getUrl(); - } - - // 第二步,尝试从临时素材中下载 - String url = downloadMedia(accountId, mediaId); - if (url == null) { - return null; - } - MpAccountDO account = mpAccountService.getRequiredAccount(accountId); - material = MpMaterialConvert.INSTANCE.convert(mediaId, type, url, account, null) - .setPermanent(false); - mpMaterialMapper.insert(material); - - // 不考虑下载永久素材,因为上传的时候已经保存 - return url; - } - - @Override - public MpMaterialDO uploadTemporaryMaterial(MpMaterialUploadTemporaryReqVO reqVO) throws IOException { - WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId()); - // 第一步,上传到公众号 - File file = null; - WxMediaUploadResult result; - String mediaId; - String url; - try { - // 写入到临时文件 - file = FileUtil.newFile(FileUtil.getTmpDirPath() + reqVO.getFile().getOriginalFilename()); - reqVO.getFile().transferTo(file); - // 上传到公众号 - result = mpService.getMaterialService().mediaUpload(reqVO.getType(), file); - // 上传到文件服务 - mediaId = ObjUtil.defaultIfNull(result.getMediaId(), result.getThumbMediaId()); - url = uploadFile(mediaId, file); - } catch (WxErrorException e) { - throw exception(MATERIAL_UPLOAD_FAIL, e.getError().getErrorMsg()); - } finally { - FileUtil.del(file); - } - - // 第二步,存储到数据库 - MpAccountDO account = mpAccountService.getRequiredAccount(reqVO.getAccountId()); - MpMaterialDO material = MpMaterialConvert.INSTANCE.convert(mediaId, reqVO.getType(), url, account, - reqVO.getFile().getName()).setPermanent(false); - mpMaterialMapper.insert(material); - return material; - } - - @Override - public MpMaterialDO uploadPermanentMaterial(MpMaterialUploadPermanentReqVO reqVO) throws IOException { - WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId()); - // 第一步,上传到公众号 - String name = StrUtil.blankToDefault(reqVO.getName(), reqVO.getFile().getName()); - File file = null; - WxMpMaterialUploadResult result; - String mediaId; - String url; - try { - // 写入到临时文件 - file = FileUtil.newFile(FileUtil.getTmpDirPath() + reqVO.getFile().getOriginalFilename()); - reqVO.getFile().transferTo(file); - // 上传到公众号 - result = mpService.getMaterialService().materialFileUpload(reqVO.getType(), - MpMaterialConvert.INSTANCE.convert(name, file, reqVO.getTitle(), reqVO.getIntroduction())); - // 上传到文件服务 - mediaId = ObjUtil.defaultIfNull(result.getMediaId(), result.getMediaId()); - url = uploadFile(mediaId, file); - } catch (WxErrorException e) { - throw exception(MATERIAL_UPLOAD_FAIL, e.getError().getErrorMsg()); - } finally { - FileUtil.del(file); - } - - // 第二步,存储到数据库 - MpAccountDO account = mpAccountService.getRequiredAccount(reqVO.getAccountId()); - MpMaterialDO material = MpMaterialConvert.INSTANCE.convert(mediaId, reqVO.getType(), url, account, - name, reqVO.getTitle(), reqVO.getIntroduction(), result.getUrl()).setPermanent(true); - mpMaterialMapper.insert(material); - return material; - } - - @Override - public String uploadNewsImage(MpMaterialUploadNewsImageReqVO reqVO) throws IOException { - WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId()); - File file = null; - try { - // 写入到临时文件 - file = FileUtil.newFile(FileUtil.getTmpDirPath() + reqVO.getFile().getOriginalFilename()); - reqVO.getFile().transferTo(file); - // 上传到公众号 - return mpService.getMaterialService().mediaImgUpload(file).getUrl(); - } catch (WxErrorException e) { - throw exception(MATERIAL_IMAGE_UPLOAD_FAIL, e.getError().getErrorMsg()); - } finally { - FileUtil.del(file); - } - } - - @Override - public PageResult getMaterialPage(MpMaterialPageReqVO pageReqVO) { - return mpMaterialMapper.selectPage(pageReqVO); - } - - @Override - public List getMaterialListByMediaId(Collection mediaIds) { - return mpMaterialMapper.selectListByMediaId(mediaIds); - } - - @Override - public void deleteMaterial(Long id) { - MpMaterialDO material = mpMaterialMapper.selectById(id); - if (material == null) { - throw exception(MATERIAL_NOT_EXISTS); - } - - // 第一步,从公众号删除 - if (material.getPermanent()) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(material.getAppId()); - try { - mpService.getMaterialService().materialDelete(material.getMediaId()); - } catch (WxErrorException e) { - throw exception(MATERIAL_DELETE_FAIL, e.getError().getErrorMsg()); - } - } - - // 第二步,从数据库中删除 - mpMaterialMapper.deleteById(id); - } - - /** - * 下载微信媒体文件的内容,并上传到文件服务 - * - * 为什么要下载?媒体文件在微信后台保存时间为 3 天,即 3 天后 media_id 失效。 - * - * @param accountId 公众号账号的编号 - * @param mediaId 媒体文件编号 - * @return 上传后的 URL - */ - public String downloadMedia(Long accountId, String mediaId) { - WxMpService mpService = mpServiceFactory.getMpService(accountId); - for (int i = 0; i < 3; i++) { - try { - // 第一步,从公众号下载媒体文件 - File file = mpService.getMaterialService().mediaDownload(mediaId); - // 第二步,上传到文件服务 - return uploadFile(mediaId, file); - } catch (WxErrorException e) { - log.error("[mediaDownload][media({}) 第 ({}) 次下载失败]", mediaId, i); - } - } - return null; - } - - private String uploadFile(String mediaId, File file) { - String path = mediaId + "." + FileTypeUtil.getType(file); - return fileApi.createFile(path, FileUtil.readBytes(file)); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuService.java deleted file mode 100644 index ae5b3e3c..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuService.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.mp.service.menu; - -import com.win.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO; -import com.win.module.mp.dal.dataobject.menu.MpMenuDO; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; - -import javax.validation.Valid; -import java.util.List; - -/** - * 公众号菜单 Service 接口 - * - * @author 芋道源码 - */ -public interface MpMenuService { - - /** - * 保存公众号菜单 - * - * @param createReqVO 创建信息 - */ - void saveMenu(@Valid MpMenuSaveReqVO createReqVO); - - /** - * 删除公众号菜单 - * - * @param accountId 公众号账号的编号 - */ - void deleteMenuByAccountId(Long accountId); - - /** - * 粉丝点击菜单按钮时,回复对应的消息 - * - * @param appId 公众号 AppId - * @param key 菜单按钮的标识 - * @param openid 粉丝的 openid - * @return 消息 - */ - WxMpXmlOutMessage reply(String appId, String key, String openid); - - /** - * 获得公众号菜单列表 - * - * @param accountId 公众号账号的编号 - * @return 公众号菜单列表 - */ - List getMenuListByAccountId(Long accountId); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuServiceImpl.java deleted file mode 100644 index 8244cacf..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/menu/MpMenuServiceImpl.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.win.module.mp.service.menu; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.win.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO; -import com.win.module.mp.convert.menu.MpMenuConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.menu.MpMenuDO; -import com.win.module.mp.dal.mysql.menu.MpMenuMapper; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.framework.mp.core.util.MpUtils; -import com.win.module.mp.service.account.MpAccountService; -import com.win.module.mp.service.message.MpMessageService; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.bean.menu.WxMenu; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -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 javax.validation.Validator; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.MENU_DELETE_FAIL; -import static com.win.module.mp.enums.ErrorCodeConstants.MENU_SAVE_FAIL; - -/** - * 公众号菜单 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class MpMenuServiceImpl implements MpMenuService { - - @Resource - private MpMessageService mpMessageService; - @Resource - @Lazy // 延迟加载,避免循环引用报错 - private MpAccountService mpAccountService; - - @Resource - @Lazy // 延迟加载,避免循环引用报错 - private MpServiceFactory mpServiceFactory; - - @Resource - private Validator validator; - - @Resource - private MpMenuMapper mpMenuMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveMenu(MpMenuSaveReqVO createReqVO) { - MpAccountDO account = mpAccountService.getRequiredAccount(createReqVO.getAccountId()); - WxMpService mpService = mpServiceFactory.getRequiredMpService(createReqVO.getAccountId()); - - // 参数校验 - createReqVO.getMenus().forEach(this::validateMenu); - - // 第一步,同步公众号 - WxMenu wxMenu = new WxMenu(); - wxMenu.setButtons(MpMenuConvert.INSTANCE.convert(createReqVO.getMenus())); - try { - mpService.getMenuService().menuCreate(wxMenu); - } catch (WxErrorException e) { - throw exception(MENU_SAVE_FAIL, e.getError().getErrorMsg()); - } - - // 第二步,存储到数据库 - mpMenuMapper.deleteByAccountId(createReqVO.getAccountId()); - createReqVO.getMenus().forEach(menu -> { - // 先保存顶级菜单 - MpMenuDO menuDO = createMenu(menu, null, account); - // 再保存子菜单 - if (CollUtil.isEmpty(menu.getChildren())) { - return; - } - menu.getChildren().forEach(childMenu -> createMenu(childMenu, menuDO, account)); - }); - } - - /** - * 校验菜单的格式是否正确 - * - * @param menu 菜单 - */ - private void validateMenu(MpMenuSaveReqVO.Menu menu) { - MpUtils.validateButton(validator, menu.getType(), menu.getReplyMessageType(), menu); - // 子菜单 - if (CollUtil.isEmpty(menu.getChildren())) { - return; - } - menu.getChildren().forEach(this::validateMenu); - } - - /** - * 创建菜单,并存储到数据库 - * - * @param wxMenu 菜单信息 - * @param parentMenu 父菜单 - * @param account 公众号账号 - * @return 创建后的菜单 - */ - private MpMenuDO createMenu(MpMenuSaveReqVO.Menu wxMenu, MpMenuDO parentMenu, MpAccountDO account) { - // 创建菜单 - MpMenuDO menu = CollUtil.isNotEmpty(wxMenu.getChildren()) - ? new MpMenuDO().setName(wxMenu.getName()) - : MpMenuConvert.INSTANCE.convert02(wxMenu); - // 设置菜单的公众号账号信息 - if (account != null) { - menu.setAccountId(account.getId()).setAppId(account.getAppId()); - } - // 设置父编号 - if (parentMenu != null) { - menu.setParentId(parentMenu.getId()); - } else { - menu.setParentId(MpMenuDO.ID_ROOT); - } - - // 插入到数据库 - mpMenuMapper.insert(menu); - return menu; - } - - @Override - public void deleteMenuByAccountId(Long accountId) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - // 第一步,同步公众号 - try { - mpService.getMenuService().menuDelete(); - } catch (WxErrorException e) { - throw exception(MENU_DELETE_FAIL, e.getError().getErrorMsg()); - } - - // 第二步,存储到数据库 - mpMenuMapper.deleteByAccountId(accountId); - } - - @Override - public WxMpXmlOutMessage reply(String appId, String key, String openid) { - // 第一步,获得菜单 - MpMenuDO menu = mpMenuMapper.selectByAppIdAndMenuKey(appId, key); - if (menu == null) { - log.error("[reply][appId({}) key({}) 找不到对应的菜单]", appId, key); - return null; - } - // 按钮必须要有消息类型,不然后续无法回复消息 - if (StrUtil.isEmpty(menu.getReplyMessageType())) { - log.error("[reply][menu({}) 不存在对应的消息类型]", menu); - return null; - } - - // 第二步,回复消息 - MpMessageSendOutReqBO sendReqBO = MpMenuConvert.INSTANCE.convert(openid, menu); - return mpMessageService.sendOutMessage(sendReqBO); - } - - @Override - public List getMenuListByAccountId(Long accountId) { - return mpMenuMapper.selectListByAccountId(accountId); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyService.java deleted file mode 100644 index 88bb2ec7..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyService.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.win.module.mp.service.message; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.dal.dataobject.message.MpAutoReplyDO; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; - -/** - * 公众号的自动回复 Service 接口 - * - * @author 芋道源码 - */ -public interface MpAutoReplyService { - - /** - * 获得公众号自动回复分页 - * - * @param pageVO 分页请求 - * @return 自动回复分页结果 - */ - PageResult getAutoReplyPage(MpMessagePageReqVO pageVO); - - /** - * 获得公众号自动回复 - * - * @param id 编号 - * @return 自动回复 - */ - MpAutoReplyDO getAutoReply(Long id); - - - /** - * 创建公众号自动回复 - * - * @param createReqVO 创建请求 - * @return 自动回复的编号 - */ - Long createAutoReply(MpAutoReplyCreateReqVO createReqVO); - - /** - * 更新公众号自动回复 - * - * @param updateReqVO 更新请求 - */ - void updateAutoReply(MpAutoReplyUpdateReqVO updateReqVO); - - /** - * 删除公众号自动回复 - * - * @param id 自动回复的编号 - */ - void deleteAutoReply(Long id); - - /** - * 当收到消息时,自动回复 - * - * @param appId 微信公众号 appId - * @param wxMessage 消息 - * @return 回复的消息 - */ - WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage); - - /** - * 当粉丝关注时,自动回复 - * - * @param appId 微信公众号 appId - * @param wxMessage 消息 - * @return 回复的消息 - */ - WxMpXmlOutMessage replyForSubscribe(String appId, WxMpXmlMessage wxMessage); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyServiceImpl.java deleted file mode 100644 index b540095d..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpAutoReplyServiceImpl.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.win.module.mp.service.message; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjUtil; -import com.win.framework.common.exception.ErrorCode; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO; -import com.win.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.convert.message.MpAutoReplyConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.message.MpAutoReplyDO; -import com.win.module.mp.dal.mysql.message.MpAutoReplyMapper; -import com.win.module.mp.enums.message.MpAutoReplyTypeEnum; -import com.win.module.mp.framework.mp.core.util.MpUtils; -import com.win.module.mp.service.account.MpAccountService; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import me.chanjar.weixin.common.api.WxConsts; -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.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Validator; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.*; - -/** - * 公众号的自动回复 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class MpAutoReplyServiceImpl implements MpAutoReplyService { - - @Resource - private MpMessageService mpMessageService; - @Resource - @Lazy // 延迟加载,避免循环依赖 - private MpAccountService mpAccountService; - - @Resource - private Validator validator; - - @Resource - private MpAutoReplyMapper mpAutoReplyMapper; - - @Override - public PageResult getAutoReplyPage(MpMessagePageReqVO pageVO) { - return mpAutoReplyMapper.selectPage(pageVO); - } - - @Override - public MpAutoReplyDO getAutoReply(Long id) { - return mpAutoReplyMapper.selectById(id); - } - - @Override - public Long createAutoReply(MpAutoReplyCreateReqVO createReqVO) { - // 第一步,校验数据 - if (createReqVO.getResponseMessageType() != null) { - MpUtils.validateMessage(validator, createReqVO.getResponseMessageType(), createReqVO); - } - validateAutoReplyConflict(null, createReqVO.getAccountId(), createReqVO.getType(), - createReqVO.getRequestKeyword(), createReqVO.getRequestMessageType()); - - // 第二步,插入数据 - MpAccountDO account = mpAccountService.getRequiredAccount(createReqVO.getAccountId()); - MpAutoReplyDO autoReply = MpAutoReplyConvert.INSTANCE.convert(createReqVO) - .setAppId(account.getAppId()); - mpAutoReplyMapper.insert(autoReply); - return autoReply.getId(); - } - - @Override - public void updateAutoReply(MpAutoReplyUpdateReqVO updateReqVO) { - // 第一步,校验数据 - if (updateReqVO.getResponseMessageType() != null) { - MpUtils.validateMessage(validator, updateReqVO.getResponseMessageType(), updateReqVO); - } - MpAutoReplyDO autoReply = validateAutoReplyExists(updateReqVO.getId()); - validateAutoReplyConflict(updateReqVO.getId(), autoReply.getAccountId(), updateReqVO.getType(), - updateReqVO.getRequestKeyword(), updateReqVO.getRequestMessageType()); - - // 第二步,更新数据 - MpAutoReplyDO updateObj = MpAutoReplyConvert.INSTANCE.convert(updateReqVO) - .setAccountId(null).setAppId(null); // 避免前端传递,更新着两个字段 - mpAutoReplyMapper.updateById(updateObj); - } - - /** - * 校验自动回复是否冲突 - * - * 不同的 type,会有不同的逻辑: - * 1. type = SUBSCRIBE 时,不允许有其他的自动回复 - * 2. type = MESSAGE 时,校验 requestMessageType 已经存在自动回复 - * 3. type = KEYWORD 时,校验 keyword 已经存在自动回复 - * - * @param id 自动回复编号 - * @param accountId 公众号账号的编号 - * @param type 类型 - * @param requestKeyword 请求关键词 - * @param requestMessageType 请求消息类型 - */ - private void validateAutoReplyConflict(Long id, Long accountId, Integer type, - String requestKeyword, String requestMessageType) { - // 获得已经存在的自动回复 - MpAutoReplyDO autoReply = null; - ErrorCode errorCode = null; - if (MpAutoReplyTypeEnum.SUBSCRIBE.getType().equals(type)) { - autoReply = mpAutoReplyMapper.selectByAccountIdAndSubscribe(accountId); - errorCode = AUTO_REPLY_ADD_SUBSCRIBE_FAIL_EXISTS; - } else if (MpAutoReplyTypeEnum.MESSAGE.getType().equals(type)) { - autoReply = mpAutoReplyMapper.selectByAccountIdAndMessage(accountId, requestMessageType); - errorCode = AUTO_REPLY_ADD_MESSAGE_FAIL_EXISTS; - } else if (MpAutoReplyTypeEnum.KEYWORD.getType().equals(type)) { - autoReply = mpAutoReplyMapper.selectByAccountIdAndKeyword(accountId, requestKeyword); - errorCode = AUTO_REPLY_ADD_KEYWORD_FAIL_EXISTS; - } - if (autoReply == null) { - return; - } - - // 存在冲突,抛出业务异常 - if (id == null // 情况一,新增(id == null),存在记录,说明冲突 - || ObjUtil.notEqual(id, autoReply.getId())) { // 情况二,修改(id != null),id 不匹配,说明冲突 - throw exception(errorCode); - } - } - - @Override - public void deleteAutoReply(Long id) { - // 校验粉丝存在 - validateAutoReplyExists(id); - - // 删除自动回复 - mpAutoReplyMapper.deleteById(id); - } - - private MpAutoReplyDO validateAutoReplyExists(Long id) { - MpAutoReplyDO autoReply = mpAutoReplyMapper.selectById(id); - if (autoReply == null) { - throw exception(AUTO_REPLY_NOT_EXISTS); - } - return autoReply; - } - - @Override - public WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage) { - // 第一步,匹配自动回复 - List replies = null; - // 1.1 关键字 - if (wxMessage.getMsgType().equals(WxConsts.XmlMsgType.TEXT)) { - // 完全匹配 - replies = mpAutoReplyMapper.selectListByAppIdAndKeywordAll(appId, wxMessage.getContent()); - if (CollUtil.isEmpty(replies)) { - // 模糊匹配 - replies = mpAutoReplyMapper.selectListByAppIdAndKeywordLike(appId, wxMessage.getContent()); - } - } - // 1.2 消息类型 - if (CollUtil.isEmpty(replies)) { - replies = mpAutoReplyMapper.selectListByAppIdAndMessage(appId, wxMessage.getMsgType()); - } - if (CollUtil.isEmpty(replies)) { - return null; - } - MpAutoReplyDO reply = CollUtil.getFirst(replies); - - // 第二步,基于自动回复,创建消息 - MpMessageSendOutReqBO sendReqBO = MpAutoReplyConvert.INSTANCE.convert(wxMessage.getFromUser(), reply); - return mpMessageService.sendOutMessage(sendReqBO); - } - - @Override - public WxMpXmlOutMessage replyForSubscribe(String appId, WxMpXmlMessage wxMessage) { - // 第一步,匹配自动回复 - List replies = mpAutoReplyMapper.selectListByAppIdAndSubscribe(appId); - MpAutoReplyDO reply = CollUtil.isNotEmpty(replies) ? CollUtil.getFirst(replies) - : buildDefaultSubscribeAutoReply(appId); // 如果不存在,提供一个默认末班 - - // 第二步,基于自动回复,创建消息 - MpMessageSendOutReqBO sendReqBO = MpAutoReplyConvert.INSTANCE.convert(wxMessage.getFromUser(), reply); - return mpMessageService.sendOutMessage(sendReqBO); - } - - private MpAutoReplyDO buildDefaultSubscribeAutoReply(String appId) { - MpAccountDO account = mpAccountService.getAccountFromCache(appId); - Assert.notNull(account, "公众号账号({}) 不存在", appId); - // 构建默认的【关注】自动回复 - return new MpAutoReplyDO().setAppId(appId).setAccountId(account.getId()) - .setType(MpAutoReplyTypeEnum.SUBSCRIBE.getType()) - .setResponseMessageType(WxConsts.XmlMsgType.TEXT).setResponseContent("感谢关注"); - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageService.java deleted file mode 100644 index ac86c68b..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageService.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.mp.service.message; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; - -import javax.validation.Valid; - -/** - * 公众号消息 Service 接口 - * - * @author 芋道源码 - */ -public interface MpMessageService { - - /** - * 获得公众号消息分页 - * - * @param pageReqVO 分页查询 - * @return 公众号消息分页 - */ - PageResult getMessagePage(MpMessagePageReqVO pageReqVO); - - /** - * 从公众号,接收到粉丝消息 - * - * @param appId 微信公众号 appId - * @param wxMessage 消息 - */ - void receiveMessage(String appId, WxMpXmlMessage wxMessage); - - /** - * 使用公众号,给粉丝回复消息 - * - * 例如说:自动回复、客服消息、菜单回复消息等场景 - * - * 注意,该方法只是返回 WxMpXmlOutMessage 对象,不会真的发送消息 - * - * @param sendReqBO 消息内容 - * @return 微信回复消息 XML - */ - WxMpXmlOutMessage sendOutMessage(@Valid MpMessageSendOutReqBO sendReqBO); - - /** - * 使用公众号,给粉丝发送【客服】消息 - * - * 注意,该方法会真实发送消息 - * - * @param sendReqVO 消息内容 - * @return 消息 - */ - MpMessageDO sendKefuMessage(MpMessageSendReqVO sendReqVO); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageServiceImpl.java deleted file mode 100644 index 27ae5f60..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/MpMessageServiceImpl.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.win.module.mp.service.message; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; -import com.win.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO; -import com.win.module.mp.convert.message.MpMessageConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import com.win.module.mp.dal.mysql.message.MpMessageMapper; -import com.win.module.mp.enums.message.MpMessageSendFromEnum; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.framework.mp.core.util.MpUtils; -import com.win.module.mp.service.account.MpAccountService; -import com.win.module.mp.service.material.MpMaterialService; -import com.win.module.mp.service.message.bo.MpMessageSendOutReqBO; -import com.win.module.mp.service.user.MpUserService; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; -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.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Validator; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.MESSAGE_SEND_FAIL; - -/** - * 粉丝消息 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class MpMessageServiceImpl implements MpMessageService { - - @Resource - @Lazy // 延迟加载,避免循环依赖 - private MpAccountService mpAccountService; - @Resource - private MpUserService mpUserService; - @Resource - private MpMaterialService mpMaterialService; - - @Resource - private MpMessageMapper mpMessageMapper; - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpServiceFactory mpServiceFactory; - - @Resource - private Validator validator; - - @Override - public PageResult getMessagePage(MpMessagePageReqVO pageReqVO) { - return mpMessageMapper.selectPage(pageReqVO); - } - - @Override - public void receiveMessage(String appId, WxMpXmlMessage wxMessage) { - // 获得关联信息 - MpAccountDO account = mpAccountService.getAccountFromCache(appId); - Assert.notNull(account, "公众号账号({}) 不存在", appId); - MpUserDO user = mpUserService.getUser(appId, wxMessage.getFromUser()); - Assert.notNull(user, "公众号粉丝({}/{}) 不存在", appId, wxMessage.getFromUser()); - - // 记录消息 - MpMessageDO message = MpMessageConvert.INSTANCE.convert(wxMessage, account, user) - .setSendFrom(MpMessageSendFromEnum.USER_TO_MP.getFrom()); - downloadMessageMedia(message); - mpMessageMapper.insert(message); - } - - @Override - public WxMpXmlOutMessage sendOutMessage(MpMessageSendOutReqBO sendReqBO) { - // 校验消息格式 - MpUtils.validateMessage(validator, sendReqBO.getType(), sendReqBO); - - // 获得关联信息 - MpAccountDO account = mpAccountService.getAccountFromCache(sendReqBO.getAppId()); - Assert.notNull(account, "公众号账号({}) 不存在", sendReqBO.getAppId()); - MpUserDO user = mpUserService.getUser(sendReqBO.getAppId(), sendReqBO.getOpenid()); - Assert.notNull(user, "公众号粉丝({}/{}) 不存在", sendReqBO.getAppId(), sendReqBO.getOpenid()); - - // 记录消息 - MpMessageDO message = MpMessageConvert.INSTANCE.convert(sendReqBO, account, user). - setSendFrom(MpMessageSendFromEnum.MP_TO_USER.getFrom()); - downloadMessageMedia(message); - mpMessageMapper.insert(message); - - // 转换返回 WxMpXmlOutMessage 对象 - return MpMessageConvert.INSTANCE.convert02(message, account); - } - - @Override - public MpMessageDO sendKefuMessage(MpMessageSendReqVO sendReqVO) { - // 校验消息格式 - MpUtils.validateMessage(validator, sendReqVO.getType(), sendReqVO); - - // 获得关联信息 - MpUserDO user = mpUserService.getRequiredUser(sendReqVO.getUserId()); - MpAccountDO account = mpAccountService.getRequiredAccount(user.getAccountId()); - - // 发送客服消息 - WxMpKefuMessage wxMessage = MpMessageConvert.INSTANCE.convert(sendReqVO, user); - WxMpService mpService = mpServiceFactory.getRequiredMpService(user.getAppId()); - try { - mpService.getKefuService().sendKefuMessageWithResponse(wxMessage); - } catch (WxErrorException e) { - throw exception(MESSAGE_SEND_FAIL, e.getError().getErrorMsg()); - } - - // 记录消息 - MpMessageDO message = MpMessageConvert.INSTANCE.convert(wxMessage, account, user) - .setSendFrom(MpMessageSendFromEnum.MP_TO_USER.getFrom()); - downloadMessageMedia(message); - mpMessageMapper.insert(message); - return message; - } - - /** - * 下载消息使用到的媒体文件,并上传到文件服务 - * - * @param message 消息 - */ - private void downloadMessageMedia(MpMessageDO message) { - if (StrUtil.isNotEmpty(message.getMediaId())) { - message.setMediaUrl(mpMaterialService.downloadMaterialUrl(message.getAccountId(), - message.getMediaId(), MpUtils.getMediaFileType(message.getType()))); - } - if (StrUtil.isNotEmpty(message.getThumbMediaId())) { - message.setThumbMediaUrl(mpMaterialService.downloadMaterialUrl(message.getAccountId(), - message.getThumbMediaId(), WxConsts.MediaFileType.THUMB)); - } - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/bo/MpMessageSendOutReqBO.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/bo/MpMessageSendOutReqBO.java deleted file mode 100644 index c3e1f300..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/message/bo/MpMessageSendOutReqBO.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.win.module.mp.service.message.bo; - -import com.win.module.mp.dal.dataobject.message.MpMessageDO; -import com.win.module.mp.framework.mp.core.util.MpUtils.*; -import lombok.Data; -import me.chanjar.weixin.common.api.WxConsts; -import org.hibernate.validator.constraints.URL; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 公众号消息发送 Request BO - * - * 为什么要有该 BO 呢?在自动回复、客服消息、菜单回复消息等场景,都涉及到 MP 给粉丝发送消息,所以使用该 BO 统一承接 - * - * @author 芋道源码 - */ -@Data -public class MpMessageSendOutReqBO { - - /** - * 公众号 appId - */ - @NotEmpty(message = "公众号 appId 不能为空") - private String appId; - /** - * 公众号粉丝 openid - */ - @NotEmpty(message = "公众号粉丝 openid 不能为空") - private String openid; - - // ========== 消息内容 ========== - /** - * 消息类型 - * - * 枚举 {@link WxConsts.XmlMsgType} 中的 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC - */ - @NotEmpty(message = "消息类型不能为空") - public String type; - - /** - * 消息内容 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT - */ - @NotEmpty(message = "消息内容不能为空", groups = TextMessageGroup.class) - private String content; - - /** - * 媒体 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO - */ - @NotEmpty(message = "消息 mediaId 不能为空", groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) - private String mediaId; - - /** - * 缩略图的媒体 id - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO、MUSIC - */ - @NotEmpty(message = "消息 thumbMediaId 不能为空", groups = {MusicMessageGroup.class}) - private String thumbMediaId; - - /** - * 标题 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO - */ - @NotEmpty(message = "消息标题不能为空", groups = VideoMessageGroup.class) - private String title; - /** - * 描述 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO - */ - @NotEmpty(message = "消息描述不能为空", groups = VideoMessageGroup.class) - private String description; - - /** - * 图文消息 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS - */ - @Valid - @NotNull(message = "图文消息不能为空", groups = NewsMessageGroup.class) - private List articles; - - /** - * 音乐链接 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - @NotEmpty(message = "音乐链接不能为空", groups = MusicMessageGroup.class) - @URL(message = "高质量音乐链接格式不正确", groups = MusicMessageGroup.class) - private String musicUrl; - - /** - * 高质量音乐链接 - * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC - */ - @NotEmpty(message = "高质量音乐链接不能为空", groups = MusicMessageGroup.class) - @URL(message = "高质量音乐链接格式不正确", groups = MusicMessageGroup.class) - private String hqMusicUrl; - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsService.java deleted file mode 100644 index f8a90ab5..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.mp.service.statistics; - -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 公众号统计 Service 接口 - * - * @author 芋道源码 - */ -public interface MpStatisticsService { - - /** - * 获取粉丝增减数据 - * - * @param accountId 公众号账号编号 - * @param date 时间区间 - * @return 粉丝增减数据 - */ - List getUserSummary(Long accountId, LocalDateTime[] date); - - /** - * 获取粉丝累计数据 - * - * @param accountId 公众号账号编号 - * @param date 时间区间 - * @return 粉丝累计数据 - */ - List getUserCumulate(Long accountId, LocalDateTime[] date); - - /** - * 获取消息发送概况数据 - * - * @param accountId 公众号账号编号 - * @param date 时间区间 - * @return 消息发送概况数据 - */ - List getUpstreamMessage(Long accountId, LocalDateTime[] date); - - /** - * 获取接口分析数据 - * - * @param accountId 公众号账号编号 - * @param date 时间区间 - * @return 接口分析数据 - */ - List getInterfaceSummary(Long accountId, LocalDateTime[] date); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsServiceImpl.java deleted file mode 100644 index d9f3944c..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/statistics/MpStatisticsServiceImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.win.module.mp.service.statistics; - -import cn.hutool.core.date.DateUtil; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.*; - -/** - * 公众号统计 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class MpStatisticsServiceImpl implements MpStatisticsService { - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpServiceFactory mpServiceFactory; - - @Override - public List getUserSummary(Long accountId, LocalDateTime[] date) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - return mpService.getDataCubeService().getUserSummary( - DateUtil.date(date[0]), DateUtil.date(date[1])); - } catch (WxErrorException e) { - throw exception(STATISTICS_GET_USER_SUMMARY_FAIL, e.getError().getErrorMsg()); - } - } - - @Override - public List getUserCumulate(Long accountId, LocalDateTime[] date) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - return mpService.getDataCubeService().getUserCumulate( - DateUtil.date(date[0]), DateUtil.date(date[1])); - } catch (WxErrorException e) { - throw exception(STATISTICS_GET_USER_CUMULATE_FAIL, e.getError().getErrorMsg()); - } - } - - @Override - public List getUpstreamMessage(Long accountId, LocalDateTime[] date) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - return mpService.getDataCubeService().getUpstreamMsg( - DateUtil.date(date[0]), DateUtil.date(date[1])); - } catch (WxErrorException e) { - throw exception(STATISTICS_GET_UPSTREAM_MESSAGE_FAIL, e.getError().getErrorMsg()); - } - } - - @Override - public List getInterfaceSummary(Long accountId, LocalDateTime[] date) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - try { - return mpService.getDataCubeService().getInterfaceSummary( - DateUtil.date(date[0]), DateUtil.date(date[1])); - } catch (WxErrorException e) { - throw exception(STATISTICS_GET_INTERFACE_SUMMARY_FAIL, e.getError().getErrorMsg()); - } - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagService.java deleted file mode 100644 index cb5bdf42..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagService.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.mp.service.tag; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.tag.vo.MpTagCreateReqVO; -import com.win.module.mp.controller.admin.tag.vo.MpTagPageReqVO; -import com.win.module.mp.controller.admin.tag.vo.MpTagUpdateReqVO; -import com.win.module.mp.dal.dataobject.tag.MpTagDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 公众号标签 Service 接口 - * - * @author fengdan - */ -public interface MpTagService { - - /** - * 创建公众号标签 - * - * @param createReqVO 创建标签信息 - * @return 标签编号 - */ - Long createTag(@Valid MpTagCreateReqVO createReqVO); - - /** - * 更新公众号标签 - * - * @param updateReqVO 更新标签信息 - */ - void updateTag(@Valid MpTagUpdateReqVO updateReqVO); - - /** - * 删除公众号标签 - * - * @param id 编号 - */ - void deleteTag(Long id); - - /** - * 获得公众号标签分页 - * - * @param pageReqVO 分页查询 - * @return 公众号标签分页 - */ - PageResult getTagPage(MpTagPageReqVO pageReqVO); - - /** - * 获得公众号标签详情 - * @param id id查询 - * @return 公众号标签详情 - */ - MpTagDO get(Long id); - - List getTagList(); - - /** - * 同步公众号标签 - * - * @param accountId 公众号账号的编号 - */ - void syncTag(Long accountId); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagServiceImpl.java deleted file mode 100644 index 8d082347..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/tag/MpTagServiceImpl.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.win.module.mp.service.tag; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.tag.vo.MpTagCreateReqVO; -import com.win.module.mp.controller.admin.tag.vo.MpTagPageReqVO; -import com.win.module.mp.controller.admin.tag.vo.MpTagUpdateReqVO; -import com.win.module.mp.convert.tag.MpTagConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.tag.MpTagDO; -import com.win.module.mp.dal.mysql.tag.MpTagMapper; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.service.account.MpAccountService; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.tag.WxUserTag; -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.util.List; -import java.util.Map; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.framework.common.util.collection.CollectionUtils.convertMap; -import static com.win.module.mp.enums.ErrorCodeConstants.*; - -/** - * 公众号标签 Service 实现类 - * - * @author fengdan - */ -@Slf4j -@Service -@Validated -public class MpTagServiceImpl implements MpTagService { - - @Resource - private MpTagMapper mpTagMapper; - - @Resource - private MpAccountService mpAccountService; - - @Resource - @Lazy // 延迟加载,为了解决延迟加载 - private MpServiceFactory mpServiceFactory; - - @Override - public Long createTag(MpTagCreateReqVO createReqVO) { - // 获得公众号账号 - MpAccountDO account = mpAccountService.getRequiredAccount(createReqVO.getAccountId()); - - // 第一步,新增标签到公众号平台。标签名的唯一,交给公众号平台 - WxMpService mpService = mpServiceFactory.getRequiredMpService(createReqVO.getAccountId()); - WxUserTag wxTag; - try { - wxTag = mpService.getUserTagService().tagCreate(createReqVO.getName()); - } catch (WxErrorException e) { - throw exception(TAG_CREATE_FAIL, e.getError().getErrorMsg()); - } - - // 第二步,新增标签到数据库 - MpTagDO tag = MpTagConvert.INSTANCE.convert(wxTag, account); - mpTagMapper.insert(tag); - return tag.getId(); - } - - @Override - public void updateTag(MpTagUpdateReqVO updateReqVO) { - // 校验标签存在 - MpTagDO tag = validateTagExists(updateReqVO.getId()); - - // 第一步,更新标签到公众号平台。标签名的唯一,交给公众号平台 - WxMpService mpService = mpServiceFactory.getRequiredMpService(tag.getAccountId()); - try { - mpService.getUserTagService().tagUpdate(tag.getTagId(), updateReqVO.getName()); - } catch (WxErrorException e) { - throw exception(TAG_UPDATE_FAIL, e.getError().getErrorMsg()); - } - - // 第二步,更新标签到数据库 - mpTagMapper.updateById(new MpTagDO().setId(tag.getId()).setName(updateReqVO.getName())); - } - - @Override - public void deleteTag(Long id) { - // 校验标签存在 - MpTagDO tag = validateTagExists(id); - - // 第一步,删除标签到公众号平台。 - WxMpService mpService = mpServiceFactory.getRequiredMpService(tag.getAccountId()); - try { - mpService.getUserTagService().tagDelete(tag.getTagId()); - } catch (WxErrorException e) { - throw exception(TAG_DELETE_FAIL, e.getError().getErrorMsg()); - } - - // 第二步,删除标签到数据库 - mpTagMapper.deleteById(tag.getId()); - } - - private MpTagDO validateTagExists(Long id) { - MpTagDO tag = mpTagMapper.selectById(id); - if (tag == null) { - throw exception(TAG_NOT_EXISTS); - } - return tag; - } - - @Override - public PageResult getTagPage(MpTagPageReqVO pageReqVO) { - return mpTagMapper.selectPage(pageReqVO); - } - - @Override - public MpTagDO get(Long id) { - return mpTagMapper.selectById(id); - } - - @Override - public List getTagList() { - return mpTagMapper.selectList(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void syncTag(Long accountId) { - MpAccountDO account = mpAccountService.getRequiredAccount(accountId); - - // 第一步,从公众号平台获取最新的标签列表 - WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); - List wxTags; - try { - wxTags = mpService.getUserTagService().tagGet(); - } catch (WxErrorException e) { - throw exception(TAG_GET_FAIL, e.getError().getErrorMsg()); - } - - // 第二步,合并更新回自己的数据库;由于标签只有 100 个,所以直接 for 循环操作 - Map tagMap = convertMap(mpTagMapper.selectListByAccountId(accountId), - MpTagDO::getTagId); - wxTags.forEach(wxTag -> { - MpTagDO tag = tagMap.remove(wxTag.getId()); - // 情况一,不存在,新增 - if (tag == null) { - tag = MpTagConvert.INSTANCE.convert(wxTag, account); - mpTagMapper.insert(tag); - return; - } - // 情况二,存在,则更新 - mpTagMapper.updateById(new MpTagDO().setId(tag.getId()) - .setName(wxTag.getName()).setCount(wxTag.getCount())); - }); - // 情况三,部分标签已经不存在了,删除 - if (CollUtil.isNotEmpty(tagMap)) { - mpTagMapper.deleteBatchIds(convertList(tagMap.values(), MpTagDO::getId)); - } - } - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserService.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserService.java deleted file mode 100644 index 5233758a..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserService.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.win.module.mp.service.user; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.mp.controller.admin.user.vo.MpUserPageReqVO; -import com.win.module.mp.controller.admin.user.vo.MpUserUpdateReqVO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import me.chanjar.weixin.mp.bean.result.WxMpUser; - -import java.util.Collection; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.USER_NOT_EXISTS; - -/** - * 公众号粉丝 Service 接口 - * - * @author 芋道源码 - */ -public interface MpUserService { - - /** - * 获得公众号粉丝 - * - * @param id 编号 - * @return 公众号粉丝 - */ - MpUserDO getUser(Long id); - - /** - * 使用 appId + openId,获得公众号粉丝 - * - * @param appId 公众号 appId - * @param openId 公众号 openId - * @return 公众号粉丝 - */ - MpUserDO getUser(String appId, String openId); - - /** - * 获得公众号粉丝 - * - * @param id 编号 - * @return 公众号粉丝 - */ - default MpUserDO getRequiredUser(Long id) { - MpUserDO user = getUser(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - return user; - } - - /** - * 获得公众号粉丝列表 - * - * @param ids 编号 - * @return 公众号粉丝列表 - */ - List getUserList(Collection ids); - - /** - * 获得公众号粉丝分页 - * - * @param pageReqVO 分页查询 - * @return 公众号粉丝分页 - */ - PageResult getUserPage(MpUserPageReqVO pageReqVO); - - /** - * 保存公众号粉丝 - * - * 新增或更新,根据是否存在数据库中 - * - * @param appId 公众号 appId - * @param wxMpUser 公众号粉丝的信息 - * @return 公众号粉丝 - */ - MpUserDO saveUser(String appId, WxMpUser wxMpUser); - - /** - * 同步一个公众号粉丝 - * - * @param accountId 公众号账号的编号 - */ - void syncUser(Long accountId); - - /** - * 更新公众号粉丝,取消关注 - * - * @param appId 公众号 appId - * @param openId 公众号粉丝的 openid - */ - void updateUserUnsubscribe(String appId, String openId); - - /** - * 更新公众号粉丝 - * - * @param updateReqVO 更新信息 - */ - void updateUser(MpUserUpdateReqVO updateReqVO); - -} diff --git a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserServiceImpl.java b/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserServiceImpl.java deleted file mode 100644 index 815ea6a0..00000000 --- a/win-module-mp/win-module-mp-biz/src/main/java/com/win/module/mp/service/user/MpUserServiceImpl.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.win.module.mp.service.user; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.mp.controller.admin.user.vo.MpUserPageReqVO; -import com.win.module.mp.controller.admin.user.vo.MpUserUpdateReqVO; -import com.win.module.mp.convert.user.MpUserConvert; -import com.win.module.mp.dal.dataobject.account.MpAccountDO; -import com.win.module.mp.dal.dataobject.user.MpUserDO; -import com.win.module.mp.dal.mysql.user.MpUserMapper; -import com.win.module.mp.framework.mp.core.MpServiceFactory; -import com.win.module.mp.service.account.MpAccountService; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.bean.result.WxMpUserList; -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.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.mp.enums.ErrorCodeConstants.USER_NOT_EXISTS; -import static com.win.module.mp.enums.ErrorCodeConstants.USER_UPDATE_TAG_FAIL; - -/** - * 微信公众号粉丝 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class MpUserServiceImpl implements MpUserService { - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpAccountService mpAccountService; - - @Resource - @Lazy // 延迟加载,解决循环依赖的问题 - private MpServiceFactory mpServiceFactory; - - @Resource - private MpUserMapper mpUserMapper; - - @Override - public MpUserDO getUser(Long id) { - return mpUserMapper.selectById(id); - } - - @Override - public MpUserDO getUser(String appId, String openId) { - return mpUserMapper.selectByAppIdAndOpenid(appId, openId); - } - - @Override - public List getUserList(Collection ids) { - return mpUserMapper.selectBatchIds(ids); - } - - @Override - public PageResult getUserPage(MpUserPageReqVO pageReqVO) { - return mpUserMapper.selectPage(pageReqVO); - } - - @Override - public MpUserDO saveUser(String appId, WxMpUser wxMpUser) { - // 构建保存的 MpUserDO 对象 - MpAccountDO account = mpAccountService.getAccountFromCache(appId); - MpUserDO user = MpUserConvert.INSTANCE.convert(account, wxMpUser); - - // 根据情况,插入或更新 - MpUserDO dbUser = mpUserMapper.selectByAppIdAndOpenid(appId, wxMpUser.getOpenId()); - if (dbUser == null) { - mpUserMapper.insert(user); - } else { - user.setId(dbUser.getId()); - mpUserMapper.updateById(user); - } - return user; - } - - @Override - @Async - public void syncUser(Long accountId) { - MpAccountDO account = mpAccountService.getRequiredAccount(accountId); - // for 循环,避免递归出意外问题,导致死循环 - String nextOpenid = null; - for (int i = 0; i < Short.MAX_VALUE; i++) { - log.info("[syncUser][第({}) 次加载公众号粉丝列表,nextOpenid({})]", i, nextOpenid); - try { - nextOpenid = syncUser0(account, nextOpenid); - } catch (WxErrorException e) { - log.error("[syncUser][第({}) 次同步粉丝异常]", i, e); - break; - } - // 如果 nextOpenid 为空,表示已经同步完毕 - if (StrUtil.isEmpty(nextOpenid)) { - break; - } - } - } - - private String syncUser0(MpAccountDO account, String nextOpenid) throws WxErrorException { - // 第一步,从公众号流式加载粉丝 - WxMpService mpService = mpServiceFactory.getRequiredMpService(account.getId()); - WxMpUserList wxUserList = mpService.getUserService().userList(nextOpenid); - if (CollUtil.isEmpty(wxUserList.getOpenids())) { - return null; - } - - // 第二步,分批加载粉丝信息 - List> openidsList = CollUtil.split(wxUserList.getOpenids(), 100); - for (List openids : openidsList) { - log.info("[syncUser][批量加载粉丝信息,openids({})]", openids); - List wxUsers = mpService.getUserService().userInfoList(openids); - batchSaveUser(account, wxUsers); - } - - // 返回下一次的 nextOpenId - return wxUserList.getNextOpenid(); - } - - private void batchSaveUser(MpAccountDO account, List wxUsers) { - if (CollUtil.isEmpty(wxUsers)) { - return; - } - // 1. 获得数据库已保存的粉丝列表 - List dbUsers = mpUserMapper.selectListByAppIdAndOpenid(account.getAppId(), - CollectionUtils.convertList(wxUsers, WxMpUser::getOpenId)); - Map openId2Users = CollectionUtils.convertMap(dbUsers, MpUserDO::getOpenid); - - // 2.1 根据情况,插入或更新 - List users = MpUserConvert.INSTANCE.convertList(account, wxUsers); - List newUsers = new ArrayList<>(); - for (MpUserDO user : users) { - MpUserDO dbUser = openId2Users.get(user.getOpenid()); - if (dbUser == null) { // 新增:稍后批量插入 - newUsers.add(user); - } else { // 更新:直接执行更新 - user.setId(dbUser.getId()); - mpUserMapper.updateById(user); - } - } - // 2.2 批量插入 - if (CollUtil.isNotEmpty(newUsers)) { - mpUserMapper.insertBatch(newUsers); - } - } - - @Override - public void updateUserUnsubscribe(String appId, String openid) { - MpUserDO dbUser = mpUserMapper.selectByAppIdAndOpenid(appId, openid); - if (dbUser == null) { - log.error("[updateUserUnsubscribe][微信公众号粉丝 appId({}) openid({}) 不存在]", appId, openid); - return; - } - mpUserMapper.updateById(new MpUserDO().setId(dbUser.getId()).setSubscribeStatus(CommonStatusEnum.DISABLE.getStatus()) - .setUnsubscribeTime(LocalDateTime.now())); - } - - @Override - public void updateUser(MpUserUpdateReqVO updateReqVO) { - // 校验存在 - MpUserDO user = validateUserExists(updateReqVO.getId()); - - // 第一步,更新标签到公众号 - updateUserTag(user.getAppId(), user.getOpenid(), updateReqVO.getTagIds()); - - // 第二步,更新基本信息到数据库 - MpUserDO updateObj = MpUserConvert.INSTANCE.convert(updateReqVO).setId(user.getId()); - mpUserMapper.updateById(updateObj); - } - - private MpUserDO validateUserExists(Long id) { - MpUserDO user = mpUserMapper.selectById(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - return user; - } - - private void updateUserTag(String appId, String openid, List tagIds) { - WxMpService mpService = mpServiceFactory.getRequiredMpService(appId); - try { - // 第一步,先取消原来的标签 - List oldTagIds = mpService.getUserTagService().userTagList(openid); - for (Long tagId : oldTagIds) { - mpService.getUserTagService().batchUntagging(tagId, new String[]{openid}); - } - // 第二步,再设置新的标签 - if (CollUtil.isEmpty(tagIds)) { - return; - } - for (Long tagId: tagIds) { - mpService.getUserTagService().batchTagging(tagId, new String[]{openid}); - } - } catch (WxErrorException e) { - throw exception(USER_UPDATE_TAG_FAIL, e.getError().getErrorMsg()); - } - } - -} diff --git a/win-module-pay/pom.xml b/win-module-pay/pom.xml deleted file mode 100644 index 87940dfc..00000000 --- a/win-module-pay/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - com.win - win - ${revision} - - 4.0.0 - win-module-pay - pom - - win-module-pay-api - win-module-pay-biz - - - ${project.artifactId} - - pay 模块,我们放支付业务,提供业务的支付能力。 - 例如说:商户、应用、支付、退款等等 - - - - diff --git a/win-module-pay/win-module-pay-api/pom.xml b/win-module-pay/win-module-pay-api/pom.xml deleted file mode 100644 index fd98f319..00000000 --- a/win-module-pay/win-module-pay-api/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - win-module-pay - com.win - ${revision} - - 4.0.0 - win-module-pay-api - jar - - ${project.artifactId} - - pay 模块 API,暴露给其它模块调用 - - - - - com.win - win-common - - - - - org.springframework.boot - spring-boot-starter-validation - true - - - - diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayOrderNotifyReqDTO.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayOrderNotifyReqDTO.java deleted file mode 100644 index 68b43b4f..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayOrderNotifyReqDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.pay.api.notify.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 支付单的通知 Request DTO - * - * @author 芋道源码 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayOrderNotifyReqDTO { - - /** - * 商户订单编号 - */ - @NotEmpty(message = "商户订单号不能为空") - private String merchantOrderId; - - /** - * 支付订单编号 - */ - @NotNull(message = "支付订单编号不能为空") - private Long payOrderId; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayRefundNotifyReqDTO.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayRefundNotifyReqDTO.java deleted file mode 100644 index 5b131468..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/dto/PayRefundNotifyReqDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.win.module.pay.api.notify.dto; - -import com.win.module.pay.enums.refund.PayRefundStatusEnum; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 退款单的通知 Request DTO - * - * @author 芋道源码 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayRefundNotifyReqDTO { - - /** - * 商户退款单编号 - */ - @NotEmpty(message = "商户退款单编号不能为空") - private String merchantOrderId; - - /** - * 支付退款编号 - */ - @NotNull(message = "支付退款编号不能为空") - private Long payRefundId; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/package-info.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/package-info.java deleted file mode 100644 index ea2ec5f5..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/notify/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位符,无特殊作用 - */ -package com.win.module.pay.api.notify; diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/PayOrderApi.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/PayOrderApi.java deleted file mode 100644 index cbb74c17..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/PayOrderApi.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.win.module.pay.api.order; - -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.api.order.dto.PayOrderRespDTO; - -import javax.validation.Valid; - -/** - * 支付单 API 接口 - * - * @author LeeYan9 - * @since 2022-08-26 - */ -public interface PayOrderApi { - - /** - * 创建支付单 - * - * @param reqDTO 创建请求 - * @return 支付单编号 - */ - Long createOrder(@Valid PayOrderCreateReqDTO reqDTO); - - /** - * 获得支付单 - * - * @param id 支付单编号 - * @return 支付单 - */ - PayOrderRespDTO getOrder(Long id); - - // TODO @puhui999:可以去掉 byId;然后 payOrderId 参数改成 id; - /** - * 更新支付订单价格 - * - * @param payOrderId 支付单编号 - * @param payPrice 支付单价格 - */ - void updatePayOrderPriceById(Long payOrderId, Integer payPrice); - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderCreateReqDTO.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderCreateReqDTO.java deleted file mode 100644 index 0bb2ac80..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderCreateReqDTO.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.pay.api.order.dto; - -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.DecimalMin; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 支付单创建 Request DTO - */ -@Data -public class PayOrderCreateReqDTO implements Serializable { - - public static final int SUBJECT_MAX_LENGTH = 32; - - /** - * 应用编号 - */ - @NotNull(message = "应用编号不能为空") - private Long appId; - /** - * 用户 IP - */ - @NotEmpty(message = "用户 IP 不能为空") - private String userIp; - - // ========== 商户相关字段 ========== - - /** - * 商户订单编号 - */ - @NotEmpty(message = "商户订单编号不能为空") - private String merchantOrderId; - /** - * 商品标题 - */ - @NotEmpty(message = "商品标题不能为空") - @Length(max = SUBJECT_MAX_LENGTH, message = "商品标题不能超过 32") - private String subject; - /** - * 商品描述 - */ - @Length(max = 128, message = "商品描述信息长度不能超过128") - private String body; - - // ========== 订单相关字段 ========== - - /** - * 支付金额,单位:分 - */ - @NotNull(message = "支付金额不能为空") - @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") - private Integer price; - - /** - * 支付过期时间 - */ - @NotNull(message = "支付过期时间不能为空") - private LocalDateTime expireTime; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderRespDTO.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderRespDTO.java deleted file mode 100644 index d7349cd8..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/order/dto/PayOrderRespDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.win.module.pay.api.order.dto; - -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import lombok.Data; - -/** - * 支付单信息 Response DTO - * - * @author 芋道源码 - */ -@Data -public class PayOrderRespDTO { - - /** - * 订单编号,数据库自增 - */ - private Long id; - /** - * 渠道编码 - * - * 枚举 PayChannelEnum - */ - private String channelCode; - - // ========== 商户相关字段 ========== - /** - * 商户订单编号 - * 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一 - */ - private String merchantOrderId; - - // ========== 订单相关字段 ========== - /** - * 支付金额,单位:分 - */ - private Integer price; - /** - * 支付状态 - * - * 枚举 {@link PayOrderStatusEnum} - */ - private Integer status; - - // ========== 渠道相关字段 ========== - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/PayRefundApi.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/PayRefundApi.java deleted file mode 100644 index f5f5eaf3..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/PayRefundApi.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.api.refund; - -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.api.refund.dto.PayRefundRespDTO; - -import javax.validation.Valid; - -/** - * 退款单 API 接口 - * - * @author 芋道源码 - */ -public interface PayRefundApi { - - /** - * 创建退款单 - * - * @param reqDTO 创建请求 - * @return 退款单编号 - */ - Long createRefund(@Valid PayRefundCreateReqDTO reqDTO); - - /** - * 获得退款单 - * - * @param id 退款单编号 - * @return 退款单 - */ - PayRefundRespDTO getRefund(Long id); - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundCreateReqDTO.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundCreateReqDTO.java deleted file mode 100644 index 8b7280cd..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundCreateReqDTO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.win.module.pay.api.refund.dto; - -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 退款单创建 Request DTO - * - * @author 芋道源码 - */ -@Data -public class PayRefundCreateReqDTO { - - /** - * 应用编号 - */ - @NotNull(message = "应用编号不能为空") - private Long appId; - /** - * 用户 IP - */ - @NotEmpty(message = "用户 IP 不能为空") - private String userIp; - - // ========== 商户相关字段 ========== - /** - * 商户订单编号 - */ - @NotEmpty(message = "商户订单编号不能为空") - private String merchantOrderId; - - /** - * 商户退款编号 - */ - @NotEmpty(message = "商户退款编号不能为空") - private String merchantRefundId; - - /** - * 退款描述 - */ - @NotEmpty(message = "退款描述不能为空") - @Length(max = 128, message = "退款描述长度不能超过 128") - private String reason; - - // ========== 订单相关字段 ========== - - /** - * 退款金额,单位:分 - */ - @NotNull(message = "退款金额不能为空") - @Min(value = 1, message = "退款金额必须大于零") - private Integer price; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundRespDTO.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundRespDTO.java deleted file mode 100644 index cbfe143f..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/api/refund/dto/PayRefundRespDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.pay.api.refund.dto; - -import com.win.module.pay.enums.refund.PayRefundStatusEnum; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 退款单信息 Response DTO - * - * @author 芋道源码 - */ -@Data -public class PayRefundRespDTO { - - /** - * 退款单编号 - */ - private Long id; - - // ========== 退款相关字段 ========== - /** - * 退款状态 - * - * 枚举 {@link PayRefundStatusEnum} - */ - private Integer status; - /** - * 退款金额,单位:分 - */ - private Integer refundPrice; - - // ========== 商户相关字段 ========== - /** - * 商户订单编号 - */ - private String merchantOrderId; - /** - * 退款成功时间 - */ - private LocalDateTime successTime; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/DictTypeConstants.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/DictTypeConstants.java deleted file mode 100644 index a44c2af9..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/DictTypeConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.pay.enums; - -/** - * Pay 字典类型的枚举类 - * - * @author 芋道源码 - */ -public interface DictTypeConstants { - - String CHANNEL_CODE = "pay_channel_code"; // 支付渠道编码 - - String ORDER_STATUS = "pay_order_status"; // 支付渠道 - - String REFUND_STATUS = "pay_order_status"; // 退款状态 - - String NOTIFY_STATUS = "pay_notify_status"; // 回调状态 - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/ErrorCodeConstants.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/ErrorCodeConstants.java deleted file mode 100644 index 4946aa7c..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.win.module.pay.enums; - -import com.win.framework.common.exception.ErrorCode; - -/** - * Pay 错误码 Core 枚举类 - * - * pay 系统,使用 1-007-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== APP 模块 1-007-000-000 ========== - ErrorCode APP_NOT_FOUND = new ErrorCode(1_007_000_000, "App 不存在"); - ErrorCode APP_IS_DISABLE = new ErrorCode(1_007_000_002, "App 已经被禁用"); - ErrorCode APP_EXIST_ORDER_CANT_DELETE = new ErrorCode(1_007_000_003, "支付应用存在支付订单,无法删除"); - ErrorCode APP_EXIST_REFUND_CANT_DELETE = new ErrorCode(1_007_000_004, "支付应用存在退款订单,无法删除"); - - // ========== CHANNEL 模块 1-007-001-000 ========== - ErrorCode CHANNEL_NOT_FOUND = new ErrorCode(1_007_001_000, "支付渠道的配置不存在"); - ErrorCode CHANNEL_IS_DISABLE = new ErrorCode(1_007_001_001, "支付渠道已经禁用"); - ErrorCode CHANNEL_EXIST_SAME_CHANNEL_ERROR = new ErrorCode(1_007_001_004, "已存在相同的渠道"); - - // ========== ORDER 模块 1-007-002-000 ========== - ErrorCode ORDER_NOT_FOUND = new ErrorCode(1_007_002_000, "支付订单不存在"); - ErrorCode ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1_007_002_001, "支付订单不处于待支付"); - ErrorCode ORDER_STATUS_IS_SUCCESS = new ErrorCode(1_007_002_002, "订单已支付,请刷新页面"); - ErrorCode ORDER_IS_EXPIRED = new ErrorCode(1_007_002_003, "支付订单已经过期"); - ErrorCode ORDER_SUBMIT_CHANNEL_ERROR = new ErrorCode(1_007_002_004, "发起支付报错,错误码:{},错误提示:{}"); - ErrorCode ORDER_REFUND_FAIL_STATUS_ERROR = new ErrorCode(1_007_002_005, "支付订单退款失败,原因:状态不是已支付或已退款"); - ErrorCode ORDER_UPDATE_PRICE_FAIL_PAID = new ErrorCode(1_007_002_006, "支付订单调价失败,原因:支付订单已付款,不能调价"); - ErrorCode ORDER_UPDATE_PRICE_FAIL_EQUAL = new ErrorCode(1007002007, "支付订单调价失败,原因:价格没有变化"); - - // ========== ORDER 模块(拓展单) 1-007-003-000 ========== - ErrorCode ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1_007_003_000, "支付交易拓展单不存在"); - ErrorCode ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1_007_003_001, "支付交易拓展单不处于待支付"); - ErrorCode ORDER_EXTENSION_IS_PAID = new ErrorCode(1_007_003_002, "订单已支付,请等待支付结果"); - - // ========== 支付模块(退款) 1-007-006-000 ========== - ErrorCode REFUND_PRICE_EXCEED = new ErrorCode(1_007_006_000, "退款金额超过订单可退款金额"); - ErrorCode REFUND_HAS_REFUNDING = new ErrorCode(1_007_006_002, "已经有退款在处理中"); - ErrorCode REFUND_EXISTS = new ErrorCode(1_007_006_003, "已经存在退款单"); - ErrorCode REFUND_NOT_FOUND = new ErrorCode(1_007_006_004, "支付退款单不存在"); - ErrorCode REFUND_STATUS_IS_NOT_WAITING = new ErrorCode(1_007_006_005, "支付退款单不处于待退款"); - - // ========== 钱包模块 1-007-007-000 ========== - ErrorCode WALLET_NOT_FOUND = new ErrorCode(1_007_007_000, "用户钱包不存在"); - ErrorCode WALLET_BALANCE_NOT_ENOUGH = new ErrorCode(1_007_007_001, "钱包余额不足"); - ErrorCode WALLET_TRANSACTION_NOT_FOUND = new ErrorCode(1_007_007_002, "未找到对应的钱包交易"); - ErrorCode WALLET_REFUND_AMOUNT_ERROR = new ErrorCode(1_007_007_003, "钱包退款金额不对"); - ErrorCode WALLET_REFUND_EXIST = new ErrorCode(1_007_007_004, "已经存在钱包退款"); - - // ========== 示例订单 1-007-900-000 ========== - ErrorCode DEMO_ORDER_NOT_FOUND = new ErrorCode(1_007_900_000, "示例订单不存在"); - ErrorCode DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID = new ErrorCode(1_007_900_001, "示例订单更新支付状态失败,订单不是【未支付】状态"); - ErrorCode DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR = new ErrorCode(1_007_900_002, "示例订单更新支付状态失败,支付单编号不匹配"); - ErrorCode DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS = new ErrorCode(1_007_900_003, "示例订单更新支付状态失败,支付单状态不是【支付成功】状态"); - ErrorCode DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH = new ErrorCode(1_007_900_004, "示例订单更新支付状态失败,支付单金额不匹配"); - ErrorCode DEMO_ORDER_REFUND_FAIL_NOT_PAID = new ErrorCode(1_007_900_005, "发起退款失败,示例订单未支付"); - ErrorCode DEMO_ORDER_REFUND_FAIL_REFUNDED = new ErrorCode(1_007_900_006, "发起退款失败,示例订单已退款"); - ErrorCode DEMO_ORDER_REFUND_FAIL_REFUND_NOT_FOUND = new ErrorCode(1_007_900_007, "发起退款失败,退款订单不存在"); - ErrorCode DEMO_ORDER_REFUND_FAIL_REFUND_NOT_SUCCESS = new ErrorCode(1_007_900_008, "发起退款失败,退款订单未退款成功"); - ErrorCode DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR = new ErrorCode(1_007_900_009, "发起退款失败,退款单编号不匹配"); - ErrorCode DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH = new ErrorCode(1_007_900_010, "发起退款失败,退款单金额不匹配"); - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/member/PayWalletBizTypeEnum.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/member/PayWalletBizTypeEnum.java deleted file mode 100644 index a807fe34..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/member/PayWalletBizTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.enums.member; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 钱包交易业务分类 - * - * @author jason - */ -@AllArgsConstructor -@Getter -public enum PayWalletBizTypeEnum { - - RECHARGE(1, "充值"), - RECHARGE_REFUND(2, "充值退款"), - PAYMENT(3, "支付"), - PAYMENT_REFUND(4, "支付退款"); - - // TODO 后续增加 - - /** - * 业务分类 - */ - private final Integer type; - /** - * 说明 - */ - private final String description; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyStatusEnum.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyStatusEnum.java deleted file mode 100644 index bada05a0..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyStatusEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.pay.enums.notify; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 支付通知状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayNotifyStatusEnum { - - WAITING(0, "等待通知"), - SUCCESS(10, "通知成功"), - FAILURE(20, "通知失败"), // 多次尝试,彻底失败 - REQUEST_SUCCESS(21, "请求成功,但是结果失败"), - REQUEST_FAILURE(22, "请求失败"), - - ; - - /** - * 状态 - */ - private final Integer status; - /** - * 名字 - */ - private final String name; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyTypeEnum.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyTypeEnum.java deleted file mode 100644 index 832ccb27..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/notify/PayNotifyTypeEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.pay.enums.notify; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 支付通知类型 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayNotifyTypeEnum { - - ORDER(1, "支付单"), - REFUND(2, "退款单"), - ; - - /** - * 类型 - */ - private final Integer type; - /** - * 名字 - */ - private final String name; - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/order/PayOrderStatusEnum.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/order/PayOrderStatusEnum.java deleted file mode 100644 index 38a532da..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/order/PayOrderStatusEnum.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.win.module.pay.enums.order; - -import com.win.framework.common.core.IntArrayValuable; -import com.win.framework.common.util.object.ObjectUtils; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 支付订单的状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayOrderStatusEnum implements IntArrayValuable { - - WAITING(0, "未支付"), - SUCCESS(10, "支付成功"), - REFUND(20, "已退款"), - CLOSED(30, "支付关闭"), // 注意:全部退款后,还是 REFUND 状态 - ; - - private final Integer status; - private final String name; - - @Override - public int[] array() { - return new int[0]; - } - - /** - * 判断是否支付成功 - * - * @param status 状态 - * @return 是否支付成功 - */ - public static boolean isSuccess(Integer status) { - return Objects.equals(status, SUCCESS.getStatus()); - } - - /** - * 判断是否支付成功或者已退款 - * - * @param status 状态 - * @return 是否支付成功或者已退款 - */ - public static boolean isSuccessOrRefund(Integer status) { - return ObjectUtils.equalsAny(status, - SUCCESS.getStatus(), REFUND.getStatus()); - } - - /** - * 判断是否支付关闭 - * - * @param status 状态 - * @return 是否支付关闭 - */ - public static boolean isClosed(Integer status) { - return Objects.equals(status, CLOSED.getStatus()); - } - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/refund/PayRefundStatusEnum.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/refund/PayRefundStatusEnum.java deleted file mode 100644 index 1fd066c9..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/enums/refund/PayRefundStatusEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.win.module.pay.enums.refund; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 渠道的退款状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum PayRefundStatusEnum { - - WAITING(0, "未退款"), - SUCCESS(10, "退款成功"), - FAILURE(20, "退款失败"); - - private final Integer status; - private final String name; - - public static boolean isSuccess(Integer status) { - return Objects.equals(status, SUCCESS.getStatus()); - } - - public static boolean isFailure(Integer status) { - return Objects.equals(status, FAILURE.getStatus()); - } - -} diff --git a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/package-info.java b/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/package-info.java deleted file mode 100644 index 20acba0a..00000000 --- a/win-module-pay/win-module-pay-api/src/main/java/com/win/module/pay/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.pay; diff --git a/win-module-pay/win-module-pay-biz/pom.xml b/win-module-pay/win-module-pay-biz/pom.xml deleted file mode 100644 index ddea35f8..00000000 --- a/win-module-pay/win-module-pay-biz/pom.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - win-module-pay - com.win - ${revision} - - 4.0.0 - win-module-pay-biz - jar - - ${project.artifactId} - - pay 模块,我们放支付业务,提供业务的支付能力。 - 例如说:商户、应用、支付、退款等等 - - - - - com.win - win-module-pay-api - ${revision} - - - - - com.win - win-spring-boot-starter-biz-operatelog - - - com.win - win-spring-boot-starter-biz-pay - - - com.win - win-spring-boot-starter-biz-tenant - - - - - com.win - win-spring-boot-starter-security - - - - - com.win - win-spring-boot-starter-mybatis - - - - com.win - win-spring-boot-starter-redis - - - - - com.win - win-spring-boot-starter-job - - - - - com.win - win-spring-boot-starter-test - test - - - - - com.win - win-spring-boot-starter-excel - - - - - diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/order/PayOrderApiImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/order/PayOrderApiImpl.java deleted file mode 100644 index a8af32dbd..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/order/PayOrderApiImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.pay.api.order; - -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.api.order.dto.PayOrderRespDTO; -import com.win.module.pay.convert.order.PayOrderConvert; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.service.order.PayOrderService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 支付单 API 实现类 - * - * @author 芋道源码 - */ -@Service -public class PayOrderApiImpl implements PayOrderApi { - - @Resource - private PayOrderService payOrderService; - - @Override - public Long createOrder(PayOrderCreateReqDTO reqDTO) { - return payOrderService.createOrder(reqDTO); - } - - @Override - public PayOrderRespDTO getOrder(Long id) { - PayOrderDO order = payOrderService.getOrder(id); - return PayOrderConvert.INSTANCE.convert2(order); - } - - @Override - public void updatePayOrderPriceById(Long payOrderId, Integer payPrice) { - payOrderService.updatePayOrderPriceById(payOrderId, payPrice); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/refund/PayRefundApiImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/refund/PayRefundApiImpl.java deleted file mode 100644 index 5af274f2..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/api/refund/PayRefundApiImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.win.module.pay.api.refund; - -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.api.refund.dto.PayRefundRespDTO; -import com.win.module.pay.convert.refund.PayRefundConvert; -import com.win.module.pay.service.refund.PayRefundService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -/** - * 退款单 API 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class PayRefundApiImpl implements PayRefundApi { - - @Resource - private PayRefundService payRefundService; - - @Override - public Long createRefund(PayRefundCreateReqDTO reqDTO) { - return payRefundService.createPayRefund(reqDTO); - } - - @Override - public PayRefundRespDTO getRefund(Long id) { - return PayRefundConvert.INSTANCE.convert02(payRefundService.getRefund(id)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/PayAppController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/PayAppController.java deleted file mode 100644 index 1ed91d66..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/PayAppController.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.win.module.pay.controller.admin.app; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.module.pay.controller.admin.app.vo.*; -import com.win.module.pay.convert.app.PayAppConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.channel.PayChannelService; -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.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.*; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; - -@Slf4j -@Tag(name = "管理后台 - 支付应用信息") -@RestController -@RequestMapping("/pay/app") -@Validated -public class PayAppController { - - @Resource - private PayAppService appService; - @Resource - private PayChannelService channelService; - - @PostMapping("/create") - @Operation(summary = "创建支付应用信息") - @PreAuthorize("@ss.hasPermission('pay:app:create')") - public CommonResult createApp(@Valid @RequestBody PayAppCreateReqVO createReqVO) { - return success(appService.createApp(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新支付应用信息") - @PreAuthorize("@ss.hasPermission('pay:app:update')") - public CommonResult updateApp(@Valid @RequestBody PayAppUpdateReqVO updateReqVO) { - appService.updateApp(updateReqVO); - return success(true); - } - - @PutMapping("/update-status") - @Operation(summary = "更新支付应用状态") - @PreAuthorize("@ss.hasPermission('pay:app:update')") - public CommonResult updateAppStatus(@Valid @RequestBody PayAppUpdateStatusReqVO updateReqVO) { - appService.updateAppStatus(updateReqVO.getId(), updateReqVO.getStatus()); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除支付应用信息") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('pay:app:delete')") - public CommonResult deleteApp(@RequestParam("id") Long id) { - appService.deleteApp(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得支付应用信息") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('pay:app:query')") - public CommonResult getApp(@RequestParam("id") Long id) { - PayAppDO app = appService.getApp(id); - return success(PayAppConvert.INSTANCE.convert(app)); - } - - @GetMapping("/page") - @Operation(summary = "获得支付应用信息分页") - @PreAuthorize("@ss.hasPermission('pay:app:query')") - public CommonResult> getAppPage(@Valid PayAppPageReqVO pageVO) { - // 得到应用分页列表 - PageResult pageResult = appService.getAppPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - - // 得到所有的应用编号,查出所有的渠道 - Collection appIds = convertList(pageResult.getList(), PayAppDO::getId); - List channels = channelService.getChannelListByAppIds(appIds); - - // 拼接后返回 - return success(PayAppConvert.INSTANCE.convertPage(pageResult, channels)); - } - - @GetMapping("/list") - @Operation(summary = "获得应用列表") - @PreAuthorize("@ss.hasPermission('pay:merchant:query')") - public CommonResult> getAppList() { - List appListDO = appService.getAppList(); - return success(PayAppConvert.INSTANCE.convertList(appListDO)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppBaseVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppBaseVO.java deleted file mode 100644 index abe5392c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppBaseVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.pay.controller.admin.app.vo; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import org.hibernate.validator.constraints.URL; - -import javax.validation.constraints.*; - -/** -* 支付应用信息 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class PayAppBaseVO { - - @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "小豆") - @NotNull(message = "应用名不能为空") - private String name; - - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "开启状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "备注", example = "我是一个测试应用") - private String remark; - - @Schema(description = "支付结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/pay-callback") - @NotNull(message = "支付结果的回调地址不能为空") - @URL(message = "支付结果的回调地址必须为 URL 格式") - private String orderNotifyUrl; - - @Schema(description = "退款结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/refund-callback") - @NotNull(message = "退款结果的回调地址不能为空") - @URL(message = "退款结果的回调地址必须为 URL 格式") - private String refundNotifyUrl; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppCreateReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppCreateReqVO.java deleted file mode 100644 index 020f078a..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppCreateReqVO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.win.module.pay.controller.admin.app.vo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -@Schema(description = "管理后台 - 支付应用信息创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayAppCreateReqVO extends PayAppBaseVO { - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageItemRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageItemRespVO.java deleted file mode 100644 index 66b2be84..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageItemRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.pay.controller.admin.app.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.Set; - -@Schema(description = "管理后台 - 支付应用信息分页查询 Response VO,相比于支付信息,还会多出应用渠道的开关信息") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayAppPageItemRespVO extends PayAppBaseVO { - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "已配置的支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "[alipay_pc, alipay_wap]") - private Set channelCodes; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageReqVO.java deleted file mode 100644 index 96bc5344..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.pay.controller.admin.app.vo; - -import com.win.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 com.win.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 PayAppPageReqVO extends PageParam { - - @Schema(description = "应用名", example = "小豆") - private String name; - - @Schema(description = "开启状态", example = "0") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppRespVO.java deleted file mode 100644 index be9bf8a2..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.pay.controller.admin.app.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 PayAppRespVO extends PayAppBaseVO { - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java deleted file mode 100644 index 67d144c3..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.pay.controller.admin.app.vo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import javax.validation.constraints.*; - -@Schema(description = "管理后台 - 支付应用信息更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayAppUpdateReqVO extends PayAppBaseVO { - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "应用编号不能为空") - private Long id; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateStatusReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateStatusReqVO.java deleted file mode 100644 index aecd87de..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/app/vo/PayAppUpdateStatusReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.pay.controller.admin.app.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 应用更新状态 Request VO") -@Data -public class PayAppUpdateStatusReqVO { - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "应用编号不能为空") - private Long id; - - @Schema(description = "状态,见 SysCommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - private Integer status; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/PayChannelController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/PayChannelController.java deleted file mode 100644 index b4a75ad1..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/PayChannelController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.pay.controller.admin.channel; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelRespVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; -import com.win.module.pay.convert.channel.PayChannelConvert; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.service.channel.PayChannelService; -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.List; -import java.util.Set; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - 支付渠道") -@RestController -@RequestMapping("/pay/channel") -@Validated -public class PayChannelController { - - @Resource - private PayChannelService channelService; - - @PostMapping("/create") - @Operation(summary = "创建支付渠道 ") - @PreAuthorize("@ss.hasPermission('pay:channel:create')") - public CommonResult createChannel(@Valid @RequestBody PayChannelCreateReqVO createReqVO) { - return success(channelService.createChannel(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新支付渠道 ") - @PreAuthorize("@ss.hasPermission('pay:channel:update')") - public CommonResult updateChannel(@Valid @RequestBody PayChannelUpdateReqVO updateReqVO) { - channelService.updateChannel(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除支付渠道 ") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('pay:channel:delete')") - public CommonResult deleteChannel(@RequestParam("id") Long id) { - channelService.deleteChannel(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得支付渠道") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('pay:channel:query')") - public CommonResult getChannel(@RequestParam(value = "id", required = false) Long id, - @RequestParam(value = "appId", required = false) Long appId, - @RequestParam(value = "code", required = false) String code) { - PayChannelDO channel = null; - if (id != null) { - channel = channelService.getChannel(id); - } else if (appId != null && code != null) { - channel = channelService.getChannelByAppIdAndCode(appId, code); - } - return success(PayChannelConvert.INSTANCE.convert(channel)); - } - - @GetMapping("/get-enable-code-list") - @Operation(summary = "获得指定应用的开启的支付渠道编码列表") - @Parameter(name = "appId", description = "应用编号", required = true, example = "1") - public CommonResult> getEnableChannelCodeList(@RequestParam("appId") Long appId) { - List channels = channelService.getEnableChannelList(appId); - return success(convertSet(channels, PayChannelDO::getCode)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java deleted file mode 100644 index 5ad5ee80..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.controller.admin.channel.vo; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import javax.validation.constraints.*; - -/** -* 支付渠道 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class PayChannelBaseVO { - - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "开启状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - - @Schema(description = "备注", example = "我是小备注") - private String remark; - - @Schema(description = "渠道费率,单位:百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "渠道费率,单位:百分比不能为空") - private Double feeRate; - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "应用编号不能为空") - private Long appId; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelCreateReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelCreateReqVO.java deleted file mode 100644 index 4b856fea..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelCreateReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.pay.controller.admin.channel.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 支付渠道 创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayChannelCreateReqVO extends PayChannelBaseVO { - - @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc") - @NotNull(message = "渠道编码不能为空") - private String code; - - @Schema(description = "渠道配置的 json 字符串") - @NotBlank(message = "渠道配置不能为空") - private String config; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelRespVO.java deleted file mode 100644 index be8e7e99..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.pay.controller.admin.channel.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 PayChannelRespVO extends PayChannelBaseVO { - - @Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private LocalDateTime createTime; - - @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc") - private String code; - - @Schema(description = "配置", requiredMode = Schema.RequiredMode.REQUIRED) - private String config; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java deleted file mode 100644 index 9be87107..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.module.pay.controller.admin.channel.vo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import javax.validation.constraints.*; - -@Schema(description = "管理后台 - 支付渠道 更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayChannelUpdateReqVO extends PayChannelBaseVO { - - @Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "商户编号不能为空") - private Long id; - - @Schema(description = "渠道配置的json字符串") - @NotBlank(message = "渠道配置不能为空") - private String config; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/PayDemoOrderController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/PayDemoOrderController.java deleted file mode 100644 index 81c9d981..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/PayDemoOrderController.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.pay.controller.admin.demo; - -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.module.pay.api.notify.dto.PayOrderNotifyReqDTO; -import com.win.module.pay.api.notify.dto.PayRefundNotifyReqDTO; -import com.win.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO; -import com.win.module.pay.controller.admin.demo.vo.PayDemoOrderRespVO; -import com.win.module.pay.convert.demo.PayDemoOrderConvert; -import com.win.module.pay.dal.dataobject.demo.PayDemoOrderDO; -import com.win.module.pay.service.demo.PayDemoOrderService; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.annotation.security.PermitAll; -import javax.validation.Valid; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 示例订单") -@RestController -@RequestMapping("/pay/demo-order") -@Validated -public class PayDemoOrderController { - - @Resource - private PayDemoOrderService payDemoOrderService; - - @PostMapping("/create") - @Operation(summary = "创建示例订单") - public CommonResult createDemoOrder(@Valid @RequestBody PayDemoOrderCreateReqVO createReqVO) { - return success(payDemoOrderService.createDemoOrder(getLoginUserId(), createReqVO)); - } - - @GetMapping("/page") - @Operation(summary = "获得示例订单分页") - public CommonResult> getDemoOrderPage(@Valid PageParam pageVO) { - PageResult pageResult = payDemoOrderService.getDemoOrderPage(pageVO); - return success(PayDemoOrderConvert.INSTANCE.convertPage(pageResult)); - } - - @PostMapping("/update-paid") - @Operation(summary = "更新示例订单为已支付") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob - @PermitAll // 无需登录,安全由 PayDemoOrderService 内部校验实现 - @OperateLog(enable = false) // 禁用操作日志,因为没有操作人 - public CommonResult updateDemoOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) { - payDemoOrderService.updateDemoOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()), - notifyReqDTO.getPayOrderId()); - return success(true); - } - - @PutMapping("/refund") - @Operation(summary = "发起示例订单的退款") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - public CommonResult refundDemoOrder(@RequestParam("id") Long id) { - payDemoOrderService.refundDemoOrder(id, getClientIP()); - return success(true); - } - - @PostMapping("/update-refunded") - @Operation(summary = "更新示例订单为已退款") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob - @PermitAll // 无需登录,安全由 PayDemoOrderService 内部校验实现 - @OperateLog(enable = false) // 禁用操作日志,因为没有操作人 - public CommonResult updateDemoOrderRefunded(@RequestBody PayRefundNotifyReqDTO notifyReqDTO) { - payDemoOrderService.updateDemoOrderRefunded(Long.valueOf(notifyReqDTO.getMerchantOrderId()), - notifyReqDTO.getPayRefundId()); - return success(true); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderCreateReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderCreateReqVO.java deleted file mode 100644 index ec0c8b75..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderCreateReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.win.module.pay.controller.admin.demo.vo; - -import lombok.*; -import io.swagger.v3.oas.annotations.media.Schema; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 示例订单创建 Request VO") -@Data -public class PayDemoOrderCreateReqVO { - - @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682") - @NotNull(message = "商品编号不能为空") - private Long spuId; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderRespVO.java deleted file mode 100644 index ba508807..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/demo/vo/PayDemoOrderRespVO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.pay.controller.admin.demo.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -import java.time.LocalDateTime; - -/** -* 示例订单 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class PayDemoOrderRespVO { - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23199") - private Long userId; - - @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682") - private Long spuId; - - @Schema(description = "商家备注", example = "李四") - private String spuName; - - @Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381") - private Integer price; - - @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED) - private Boolean payStatus; - - @Schema(description = "支付订单编号", example = "16863") - private Long payOrderId; - - @Schema(description = "订单支付时间") - private LocalDateTime payTime; - - @Schema(description = "支付渠道", example = "alipay_qr") - private String payChannelCode; - - @Schema(description = "支付退款编号", example = "23366") - private Long payRefundId; - - @Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "14039") - private Integer refundPrice; - - @Schema(description = "退款时间") - private LocalDateTime refundTime; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/PayNotifyController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/PayNotifyController.java deleted file mode 100644 index 0c5a1087..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/PayNotifyController.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.win.module.pay.controller.admin.notify; - -import cn.hutool.core.collection.CollUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskDetailRespVO; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskRespVO; -import com.win.module.pay.convert.notify.PayNotifyTaskConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyLogDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyTaskDO; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.channel.PayChannelService; -import com.win.module.pay.service.notify.PayNotifyService; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -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.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.annotation.security.PermitAll; -import javax.validation.Valid; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_FOUND; - -@Tag(name = "管理后台 - 回调通知") -@RestController -@RequestMapping("/pay/notify") -@Validated -@Slf4j -public class PayNotifyController { - - @Resource - private PayOrderService orderService; - @Resource - private PayRefundService refundService; - @Resource - private PayNotifyService notifyService; - @Resource - private PayAppService appService; - @Resource - private PayChannelService channelService; - - @PostMapping(value = "/order/{channelId}") - @Operation(summary = "支付渠道的统一【支付】回调") - @PermitAll - @OperateLog(enable = false) // 回调地址,无需记录操作日志 - public String notifyOrder(@PathVariable("channelId") Long channelId, - @RequestParam(required = false) Map params, - @RequestBody(required = false) String body) { - log.info("[notifyOrder][channelId({}) 回调数据({}/{})]", channelId, params, body); - // 1. 校验支付渠道是否存在 - PayClient payClient = channelService.getPayClient(channelId); - if (payClient == null) { - log.error("[notifyCallback][渠道编号({}) 找不到对应的支付客户端]", channelId); - throw exception(CHANNEL_NOT_FOUND); - } - - // 2. 解析通知数据 - PayOrderRespDTO notify = payClient.parseOrderNotify(params, body); - orderService.notifyOrder(channelId, notify); - return "success"; - } - - @PostMapping(value = "/refund/{channelId}") - @Operation(summary = "支付渠道的统一【退款】回调") - @PermitAll - @OperateLog(enable = false) // 回调地址,无需记录操作日志 - public String notifyRefund(@PathVariable("channelId") Long channelId, - @RequestParam(required = false) Map params, - @RequestBody(required = false) String body) { - log.info("[notifyRefund][channelId({}) 回调数据({}/{})]", channelId, params, body); - // 1. 校验支付渠道是否存在 - PayClient payClient = channelService.getPayClient(channelId); - if (payClient == null) { - log.error("[notifyCallback][渠道编号({}) 找不到对应的支付客户端]", channelId); - throw exception(CHANNEL_NOT_FOUND); - } - - // 2. 解析通知数据 - PayRefundRespDTO notify = payClient.parseRefundNotify(params, body); - refundService.notifyRefund(channelId, notify); - return "success"; - } - - @GetMapping("/get-detail") - @Operation(summary = "获得回调通知的明细") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('pay:notify:query')") - public CommonResult getNotifyTaskDetail(@RequestParam("id") Long id) { - PayNotifyTaskDO task = notifyService.getNotifyTask(id); - if (task == null) { - return success(null); - } - // 拼接返回 - PayAppDO app = appService.getApp(task.getAppId()); - List logs = notifyService.getNotifyLogList(id); - return success(PayNotifyTaskConvert.INSTANCE.convert(task, app, logs)); - } - - @GetMapping("/page") - @Operation(summary = "获得回调通知分页") - @PreAuthorize("@ss.hasPermission('pay:notify:query')") - public CommonResult> getNotifyTaskPage(@Valid PayNotifyTaskPageReqVO pageVO) { - PageResult pageResult = notifyService.getNotifyTaskPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty()); - } - // 拼接返回 - Map appMap = appService.getAppMap(convertList(pageResult.getList(), PayNotifyTaskDO::getAppId)); - return success(PayNotifyTaskConvert.INSTANCE.convertPage(pageResult, appMap)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskBaseVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskBaseVO.java deleted file mode 100644 index 5abb5428..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskBaseVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.pay.controller.admin.notify.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 回调通知 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class PayNotifyTaskBaseVO { - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10636") - private Long appId; - - @Schema(description = "通知类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private Byte type; - - @Schema(description = "数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6722") - private Long dataId; - - @Schema(description = "通知状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Byte status; - - @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "26697") - private String merchantOrderId; - - @Schema(description = "下一次通知时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime nextNotifyTime; - - @Schema(description = "最后一次执行时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime lastExecuteTime; - - @Schema(description = "当前通知次数", requiredMode = Schema.RequiredMode.REQUIRED) - private Byte notifyTimes; - - @Schema(description = "最大可通知次数", requiredMode = Schema.RequiredMode.REQUIRED) - private Byte maxNotifyTimes; - - @Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") - private String notifyUrl; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskDetailRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskDetailRespVO.java deleted file mode 100644 index d94ae9c9..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskDetailRespVO.java +++ /dev/null @@ -1,54 +0,0 @@ - -package com.win.module.pay.controller.admin.notify.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 -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayNotifyTaskDetailRespVO extends PayNotifyTaskBaseVO { - - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime updateTime; - - @Schema(description = "应用名称", example = "wx_pay") - private String appName; - - @Schema(description = "回调日志列表") - private List logs; - - @Schema(description = "管理后台 - 回调日志") - @Data - public static class Log { - - @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8848") - private Long id; - - @Schema(description = "通知状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Byte status; - - @Schema(description = "当前通知次数", requiredMode = Schema.RequiredMode.REQUIRED) - private Byte notifyTimes; - - @Schema(description = "HTTP 响应结果", requiredMode = Schema.RequiredMode.REQUIRED) - private String response; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskPageReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskPageReqVO.java deleted file mode 100644 index f0b86370..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskPageReqVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.pay.controller.admin.notify.vo; - -import com.win.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 com.win.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 PayNotifyTaskPageReqVO extends PageParam { - - @Schema(description = "应用编号", example = "10636") - private Long appId; - - @Schema(description = "通知类型", example = "2") - private Integer type; - - @Schema(description = "数据编号", example = "6722") - private Long dataId; - - @Schema(description = "通知状态", example = "1") - private Integer status; - - @Schema(description = "商户订单编号", example = "26697") - private String merchantOrderId; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskRespVO.java deleted file mode 100644 index 4cea044f..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/notify/vo/PayNotifyTaskRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.pay.controller.admin.notify.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 PayNotifyTaskRespVO extends PayNotifyTaskBaseVO { - - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "应用名称", example = "wx_pay") - private String appName; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/PayOrderController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/PayOrderController.java deleted file mode 100644 index 11cf5b64..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/PayOrderController.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.win.module.pay.controller.admin.order; - -import cn.hutool.core.collection.CollectionUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.excel.core.util.ExcelUtils; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.module.pay.controller.admin.order.vo.*; -import com.win.module.pay.convert.order.PayOrderConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import com.win.module.pay.framework.pay.wallet.WalletPayClient; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.order.PayOrderService; -import com.google.common.collect.Maps; -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.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -import static com.win.framework.web.core.util.WebFrameworkUtils.getLoginUserId; -import static com.win.framework.web.core.util.WebFrameworkUtils.getLoginUserType; - -@Tag(name = "管理后台 - 支付订单") -@RestController -@RequestMapping("/pay/order") -@Validated -public class PayOrderController { - - @Resource - private PayOrderService orderService; - @Resource - private PayAppService appService; - - @GetMapping("/get") - @Operation(summary = "获得支付订单") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('pay:order:query')") - public CommonResult getOrder(@RequestParam("id") Long id) { - return success(PayOrderConvert.INSTANCE.convert(orderService.getOrder(id))); - } - - @GetMapping("/get-detail") - @Operation(summary = "获得支付订单详情") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('pay:order:query')") - public CommonResult getOrderDetail(@RequestParam("id") Long id) { - PayOrderDO order = orderService.getOrder(id); - if (order == null) { - return success(null); - } - - // 拼接返回 - PayAppDO app = appService.getApp(order.getAppId()); - PayOrderExtensionDO orderExtension = orderService.getOrderExtension(order.getExtensionId()); - return success(PayOrderConvert.INSTANCE.convert(order, orderExtension, app)); - } - - @PostMapping("/submit") - @Operation(summary = "提交支付订单") - public CommonResult submitPayOrder(@RequestBody PayOrderSubmitReqVO reqVO) { - // 1. 钱包支付事,需要额外传 user_id 和 user_type - if (Objects.equals(reqVO.getChannelCode(), PayChannelEnum.WALLET.getCode())) { - Map channelExtras = reqVO.getChannelExtras() == null ? - Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras(); - channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(getLoginUserId())); - channelExtras.put(WalletPayClient.USER_TYPE_KEY, String.valueOf(getLoginUserType())); - reqVO.setChannelExtras(channelExtras); - } - - // 2. 提交支付 - PayOrderSubmitRespVO respVO = orderService.submitOrder(reqVO, getClientIP()); - return success(respVO); - } - - @GetMapping("/page") - @Operation(summary = "获得支付订单分页") - @PreAuthorize("@ss.hasPermission('pay:order:query')") - public CommonResult> getOrderPage(@Valid PayOrderPageReqVO pageVO) { - PageResult pageResult = orderService.getOrderPage(pageVO); - if (CollectionUtil.isEmpty(pageResult.getList())) { - return success(new PageResult<>(pageResult.getTotal())); - } - - // 拼接返回 - Map appMap = appService.getAppMap(convertList(pageResult.getList(), PayOrderDO::getAppId)); - return success(PayOrderConvert.INSTANCE.convertPage(pageResult, appMap)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出支付订单 Excel") - @PreAuthorize("@ss.hasPermission('pay:order:export')") - @OperateLog(type = EXPORT) - public void exportOrderExcel(@Valid PayOrderExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = orderService.getOrderList(exportReqVO); - if (CollectionUtil.isEmpty(list)) { - ExcelUtils.write(response, "支付订单.xls", "数据", - PayOrderExcelVO.class, new ArrayList<>()); - return; - } - - // 拼接返回 - Map appMap = appService.getAppMap(convertList(list, PayOrderDO::getAppId)); - List excelList = PayOrderConvert.INSTANCE.convertList(list, appMap); - // 导出 Excel - ExcelUtils.write(response, "支付订单.xls", "数据", PayOrderExcelVO.class, excelList); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderBaseVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderBaseVO.java deleted file mode 100644 index fae51c87..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderBaseVO.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.win.module.pay.controller.admin.order.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 com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** - * 支付订单 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - * - * @author aquan - */ -@Data -public class PayOrderBaseVO { - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "应用编号不能为空") - private Long appId; - - @Schema(description = "渠道编号", example = "2048") - private Long channelId; - - @Schema(description = "渠道编码", example = "wx_app") - private String channelCode; - - @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") - @NotNull(message = "商户订单编号不能为空") - private String merchantOrderId; - - @Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") - @NotNull(message = "商品标题不能为空") - private String subject; - - @Schema(description = "商品描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是土豆") - @NotNull(message = "商品描述不能为空") - private String body; - - @Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/pay/notify") - @NotNull(message = "异步通知地址不能为空") - private String notifyUrl; - - @Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "支付金额,单位:分不能为空") - private Long price; - - @Schema(description = "渠道手续费,单位:百分比", example = "10") - private Double channelFeeRate; - - @Schema(description = "渠道手续金额,单位:分", example = "100") - private Integer channelFeePrice; - - @Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "支付状态不能为空") - private Integer status; - - @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") - @NotNull(message = "用户 IP不能为空") - private String userIp; - - @Schema(description = "订单失效时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "订单失效时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expireTime; - - @Schema(description = "订单支付成功时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime successTime; - - @Schema(description = "支付成功的订单拓展单编号", example = "50") - private Long extensionId; - - @Schema(description = "支付订单号", example = "2048888") - private String no; - - @Schema(description = "退款总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "退款总金额,单位:分不能为空") - private Long refundPrice; - - @Schema(description = "渠道用户编号", example = "2048") - private String channelUserId; - - @Schema(description = "渠道订单号", example = "4096") - private String channelOrderNo; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java deleted file mode 100644 index 9faae8c3..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.pay.controller.admin.order.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 PayOrderDetailsRespVO extends PayOrderBaseVO { - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") - private String appName; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime updateTime; - - /** - * 支付订单扩展 - */ - private PayOrderExtension extension; - - @Data - @Schema(description = "支付订单扩展") - public static class PayOrderExtension { - - @Schema(description = "支付订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private String no; - - @Schema(description = "支付异步通知的内容") - private String channelNotifyData; - - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExcelVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExcelVO.java deleted file mode 100644 index 970ff4dd..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExcelVO.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.win.module.pay.controller.admin.order.vo; - -import com.win.framework.excel.core.annotations.DictFormat; -import com.win.framework.excel.core.convert.DictConvert; -import com.win.framework.excel.core.convert.MoneyConvert; -import com.win.module.pay.enums.DictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 支付订单 Excel VO - * - * @author aquan - */ -@Data -public class PayOrderExcelVO { - - @ExcelProperty("编号") - private Long id; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - - @ExcelProperty(value = "支付金额", converter = MoneyConvert.class) - private Integer price; - - @ExcelProperty(value = "退款金额", converter = MoneyConvert.class) - private Integer refundPrice; - - @ExcelProperty(value = "手续金额", converter = MoneyConvert.class) - private Integer channelFeePrice; - - @ExcelProperty("商户单号") - private String merchantOrderId; - - @ExcelProperty(value = "支付单号") - private String no; - - @ExcelProperty("渠道单号") - private String channelOrderNo; - - @ExcelProperty(value = "支付状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.ORDER_STATUS) - private Integer status; - - @ExcelProperty(value = "渠道编号名称", converter = DictConvert.class) - @DictFormat(DictTypeConstants.CHANNEL_CODE) - private String channelCode; - - @ExcelProperty("订单支付成功时间") - private LocalDateTime successTime; - - @ExcelProperty("订单失效时间") - private LocalDateTime expireTime; - - @ExcelProperty(value = "应用名称") - private String appName; - - @ExcelProperty("商品标题") - private String subject; - - @ExcelProperty("商品描述") - private String body; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java deleted file mode 100644 index 86eda9ff..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.win.module.pay.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 支付订单 Excel 导出 Request VO,参数和 PayOrderPageReqVO 是一致的") -@Data -public class PayOrderExportReqVO { - - @Schema(description = "应用编号", example = "1024") - private Long appId; - - @Schema(description = "渠道编码", example = "wx_app") - private String channelCode; - - @Schema(description = "商户订单编号", example = "4096") - private String merchantOrderId; - - @Schema(description = "渠道编号", example = "1888") - private String channelOrderNo; - - @Schema(description = "支付单号", example = "2014888") - private String no; - - @Schema(description = "支付状态", example = "0") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java deleted file mode 100644 index 1572194f..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.pay.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 支付订单分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class PayOrderPageItemRespVO extends PayOrderBaseVO { - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "应用名称", example = "wx_pay") - private String appName; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java deleted file mode 100644 index 68354062..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.pay.controller.admin.order.vo; - -import com.win.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 com.win.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 PayOrderPageReqVO extends PageParam { - - @Schema(description = "应用编号", example = "1024") - private Long appId; - - @Schema(description = "渠道编码", example = "wx_app") - private String channelCode; - - @Schema(description = "商户订单编号", example = "4096") - private String merchantOrderId; - - @Schema(description = "渠道编号", example = "1888") - private String channelOrderNo; - - @Schema(description = "支付单号", example = "2014888") - private String no; - - @Schema(description = "支付状态", example = "0") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderRespVO.java deleted file mode 100644 index 83124d78..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.pay.controller.admin.order.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 PayOrderRespVO extends PayOrderBaseVO { - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED) - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitReqVO.java deleted file mode 100644 index eebe5f0a..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.pay.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.URL; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Map; - -@Schema(description = "管理后台 - 支付订单提交 Request VO") -@Data -public class PayOrderSubmitReqVO { - - @Schema(description = "支付单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "支付单编号不能为空") - private Long id; - - @Schema(description = "支付渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_pub") - @NotEmpty(message = "支付渠道不能为空") - private String channelCode; - - @Schema(description = "支付渠道的额外参数,例如说,微信公众号需要传递 openid 参数") - private Map channelExtras; - - @Schema(description = "展示模式", example = "url") // 参见 {@link PayDisplayModeEnum} 枚举。如果不传递,则每个支付渠道使用默认的方式 - private String displayMode; - - @Schema(description = "回跳地址") - @URL(message = "回跳地址的格式必须是 URL") - private String returnUrl; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitRespVO.java deleted file mode 100644 index 84bf2290..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/order/vo/PayOrderSubmitRespVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.win.module.pay.controller.admin.order.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 支付订单提交 Response VO") -@Data -public class PayOrderSubmitRespVO { - - @Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") // 参见 PayOrderStatusEnum 枚举 - private Integer status; - - @Schema(description = "展示模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "url") // 参见 PayDisplayModeEnum 枚举 - private String displayMode; - @Schema(description = "展示内容", requiredMode = Schema.RequiredMode.REQUIRED) - private String displayContent; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/PayRefundController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/PayRefundController.java deleted file mode 100644 index 872a8882..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/PayRefundController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.pay.controller.admin.refund; - -import cn.hutool.core.collection.CollectionUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.excel.core.util.ExcelUtils; -import com.win.framework.operatelog.core.annotations.OperateLog; -import com.win.module.pay.controller.admin.refund.vo.*; -import com.win.module.pay.convert.refund.PayRefundConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.refund.PayRefundService; -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.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 javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertList; -import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 退款订单") -@RestController -@RequestMapping("/pay/refund") -@Validated -public class PayRefundController { - - @Resource - private PayRefundService refundService; - @Resource - private PayAppService appService; - - @GetMapping("/get") - @Operation(summary = "获得退款订单") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('pay:refund:query')") - public CommonResult getRefund(@RequestParam("id") Long id) { - PayRefundDO refund = refundService.getRefund(id); - if (refund == null) { - return success(new PayRefundDetailsRespVO()); - } - - // 拼接数据 - PayAppDO app = appService.getApp(refund.getAppId()); - return success(PayRefundConvert.INSTANCE.convert(refund, app)); - } - - @GetMapping("/page") - @Operation(summary = "获得退款订单分页") - @PreAuthorize("@ss.hasPermission('pay:refund:query')") - public CommonResult> getRefundPage(@Valid PayRefundPageReqVO pageVO) { - PageResult pageResult = refundService.getRefundPage(pageVO); - if (CollectionUtil.isEmpty(pageResult.getList())) { - return success(new PageResult<>(pageResult.getTotal())); - } - - // 处理应用ID数据 - Map appMap = appService.getAppMap(convertList(pageResult.getList(), PayRefundDO::getAppId)); - return success(PayRefundConvert.INSTANCE.convertPage(pageResult, appMap)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出退款订单 Excel") - @PreAuthorize("@ss.hasPermission('pay:refund:export')") - @OperateLog(type = EXPORT) - public void exportRefundExcel(@Valid PayRefundExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = refundService.getRefundList(exportReqVO); - if (CollectionUtil.isEmpty(list)) { - ExcelUtils.write(response, "退款订单.xls", "数据", - PayRefundExcelVO.class, new ArrayList<>()); - return; - } - - // 拼接返回 - Map appMap = appService.getAppMap(convertList(list, PayRefundDO::getAppId)); - List excelList = PayRefundConvert.INSTANCE.convertList(list, appMap); - // 导出 Excel - ExcelUtils.write(response, "退款订单.xls", "数据", PayRefundExcelVO.class, excelList); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java deleted file mode 100644 index ea752bd9..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.pay.controller.admin.refund.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -/** -* 退款订单 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class PayRefundBaseVO { - - @Schema(description = "外部退款号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110") - private String no; - - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long appId; - - @Schema(description = "渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long channelId; - - @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_app") - private String channelCode; - - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long orderId; - - // ========== 商户相关字段 ========== - - @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "225") - private String merchantOrderId; - - @Schema(description = "商户退款订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "512") - private String merchantRefundId; - - @Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED) - private String notifyUrl; - - // ========== 退款相关字段 ========== - - @Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; - - @Schema(description = "支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Long payPrice; - - @Schema(description = "退款金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Long refundPrice; - - @Schema(description = "退款原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "我要退了") - private String reason; - - @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") - private String userIp; - - // ========== 渠道相关字段 ========== - - @Schema(description = "渠道订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "233") - private String channelOrderNo; - - @Schema(description = "渠道退款单号", example = "2022") - private String channelRefundNo; - - @Schema(description = "退款成功时间") - private LocalDateTime successTime; - - @Schema(description = "调用渠道的错误码") - private String channelErrorCode; - - @Schema(description = "调用渠道的错误提示") - private String channelErrorMsg; - - @Schema(description = "支付渠道的额外参数") - private String channelNotifyData; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java deleted file mode 100644 index 55edc772..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.pay.controller.admin.refund.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 PayRefundDetailsRespVO extends PayRefundBaseVO { - - @Schema(description = "支付退款编号", requiredMode = Schema.RequiredMode.REQUIRED) - private Long id; - - @Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是芋艿") - private String appName; - - @Schema(description = "支付订单", requiredMode = Schema.RequiredMode.REQUIRED) - private Order order; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - - @Schema(description = "更新时间") - private LocalDateTime updateTime; - - @Schema(description = "管理后台 - 支付订单") - @Data - public static class Order { - - @Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") - private String subject; - - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java deleted file mode 100644 index baff8ae4..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.win.module.pay.controller.admin.refund.vo; - -import com.win.framework.excel.core.annotations.DictFormat; -import com.win.framework.excel.core.convert.DictConvert; -import com.win.framework.excel.core.convert.MoneyConvert; -import com.win.module.pay.enums.DictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 退款订单 Excel VO - * - * @author aquan - */ -@Data -public class PayRefundExcelVO { - - @ExcelProperty("支付退款编号") - private Long id; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - - @ExcelProperty(value = "支付金额", converter = MoneyConvert.class) - private Integer payPrice; - - @ExcelProperty(value = "退款金额", converter = MoneyConvert.class) - private Integer refundPrice; - - @ExcelProperty("商户退款单号") - private String merchantRefundId; - @ExcelProperty("退款单号") - private String no; - @ExcelProperty("渠道退款单号") - private String channelRefundNo; - - @ExcelProperty("商户支付单号") - private String merchantOrderId; - @ExcelProperty("渠道支付单号") - private String channelOrderNo; - - @ExcelProperty(value = "退款状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.REFUND_STATUS) - private Integer status; - - @ExcelProperty(value = "退款渠道", converter = DictConvert.class) - @DictFormat(DictTypeConstants.CHANNEL_CODE) - private String channelCode; - - @ExcelProperty("成功时间") - private LocalDateTime successTime; - - @ExcelProperty(value = "支付应用") - private String appName; - - @ExcelProperty("退款原因") - private String reason; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java deleted file mode 100644 index bbcf84a3..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.win.module.pay.controller.admin.refund.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 退款订单 Excel 导出 Request VO,参数和 PayRefundPageReqVO 是一致的") -@Data -public class PayRefundExportReqVO { - - @Schema(description = "应用编号", example = "1024") - private Long appId; - - @Schema(description = "渠道编码", example = "wx_app") - private String channelCode; - - @Schema(description = "商户支付单号", example = "10") - private String merchantOrderId; - - @Schema(description = "商户退款单号", example = "20") - private String merchantRefundId; - - @Schema(description = "渠道支付单号", example = "30") - private String channelOrderNo; - - @Schema(description = "渠道退款单号", example = "40") - private String channelRefundNo; - - @Schema(description = "退款状态", example = "0") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java deleted file mode 100644 index 775d28ce..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.win.module.pay.controller.admin.refund.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 PayRefundPageItemRespVO extends PayRefundBaseVO { - - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是芋艿") - private String appName; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java deleted file mode 100644 index e4d0d24c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.win.module.pay.controller.admin.refund.vo; - -import com.win.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 com.win.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 PayRefundPageReqVO extends PageParam { - - @Schema(description = "应用编号", example = "1024") - private Long appId; - - @Schema(description = "渠道编码", example = "wx_app") - private String channelCode; - - @Schema(description = "商户支付单号", example = "10") - private String merchantOrderId; - - @Schema(description = "商户退款单号", example = "20") - private String merchantRefundId; - - @Schema(description = "渠道支付单号", example = "30") - private String channelOrderNo; - - @Schema(description = "渠道退款单号", example = "40") - private String channelRefundNo; - - @Schema(description = "退款状态", example = "0") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @Schema(description = "创建时间") - private LocalDateTime[] createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/channel/AppPayChannelController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/channel/AppPayChannelController.java deleted file mode 100644 index e1f1522d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/channel/AppPayChannelController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.pay.controller.app.channel; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.service.channel.PayChannelService; -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.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; -import java.util.List; -import java.util.Set; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "用户 App - 支付渠道") -@RestController -@RequestMapping("/pay/channel") -@Validated -public class AppPayChannelController { - - @Resource - private PayChannelService channelService; - - @GetMapping("/get-enable-code-list") - @Operation(summary = "获得指定应用的开启的支付渠道编码列表") - @Parameter(name = "appId", description = "应用编号", required = true, example = "1") - public CommonResult> getEnableChannelCodeList(@RequestParam("appId") Long appId) { - List channels = channelService.getEnableChannelList(appId); - return success(convertSet(channels, PayChannelDO::getCode)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.http b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.http deleted file mode 100644 index 14ce54ef..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.http +++ /dev/null @@ -1,63 +0,0 @@ -### /pay/create 提交支付订单【alipay_pc】 -POST {{appApi}}/pay/order/submit -Content-Type: application/json -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -{ - "id": 174, - "channelCode": "alipay_pc" -} - -### /pay/create 提交支付订单【wx_bar】 -POST {{appApi}}/pay/order/submit -Content-Type: application/json -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -{ - "id": 202, - "channelCode": "wx_bar", - "channelExtras": { - "authCode": "134042110834344848" - } -} - -### /pay/create 提交支付订单【wx_pub】 -POST {{appApi}}/pay/order/submit -Content-Type: application/json -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -{ - "id": 202, - "channelCode": "wx_pub", - "channelExtras": { - "openid": "ockUAwIZ-0OeMZl9ogcZ4ILrGba0" - } -} - -### /pay/create 提交支付订单【wx_lite】 -POST {{appApi}}/pay/order/submit -Content-Type: application/json -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -{ - "id": 202, - "channelCode": "wx_lite", - "channelExtras": { - "openid": "oLefc4g5GjKWHJjLjMSXB3wX0fD0" - } -} - -### /pay/create 提交支付订单【wx_native】 -POST {{appApi}}/pay/order/submit -Content-Type: application/json -Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} - -{ - "id": 202, - "channelCode": "wx_native" -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.java deleted file mode 100644 index 1e4de30e..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/AppPayOrderController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.win.module.pay.controller.app.order; - -import com.win.framework.common.pojo.CommonResult; -import com.win.module.pay.controller.admin.order.vo.PayOrderRespVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO; -import com.win.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO; -import com.win.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO; -import com.win.module.pay.convert.order.PayOrderConvert; -import com.win.module.pay.service.order.PayOrderService; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; - -@Tag(name = "用户 APP - 支付订单") -@RestController -@RequestMapping("/pay/order") -@Validated -@Slf4j -public class AppPayOrderController { - - @Resource - private PayOrderService payOrderService; - - // TODO 芋艿:临时 demo,技术打样。 - @GetMapping("/get") - @Operation(summary = "获得支付订单") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - public CommonResult getOrder(@RequestParam("id") Long id) { - return success(PayOrderConvert.INSTANCE.convert(payOrderService.getOrder(id))); - } - - @PostMapping("/submit") - @Operation(summary = "提交支付订单") - public CommonResult submitPayOrder(@RequestBody AppPayOrderSubmitReqVO reqVO) { - PayOrderSubmitRespVO respVO = payOrderService.submitOrder(reqVO, getClientIP()); - return success(PayOrderConvert.INSTANCE.convert3(respVO)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java deleted file mode 100644 index 20ad2336..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.pay.controller.app.order.vo; - -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Map; - -@Schema(description = "用户 APP - 支付订单提交 Request VO") -@Data -public class AppPayOrderSubmitReqVO extends PayOrderSubmitReqVO { -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java deleted file mode 100644 index 73a2ec40..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.win.module.pay.controller.app.order.vo; - -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -@Schema(description = "用户 APP - 支付订单提交 Response VO") -@Data -public class AppPayOrderSubmitRespVO extends PayOrderSubmitRespVO { - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/refund/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/refund/package-info.java deleted file mode 100644 index dc3dd790..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/refund/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * TODO 芋艿:占个位置,没啥用 - */ -package com.win.module.pay.controller.app.refund; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletController.java deleted file mode 100644 index 4a65acb4..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.pay.controller.app.wallet; - -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.security.core.annotations.PreAuthenticated; -import com.win.module.pay.controller.app.wallet.vo.wallet.AppPayWalletRespVO; -import com.win.module.pay.convert.wallet.PayWalletConvert; -import com.win.module.pay.dal.dataobject.wallet.PayWalletDO; -import com.win.module.pay.service.wallet.PayWalletService; -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.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -/** - * @author jason - */ -@Tag(name = "用户 APP - 钱包") -@RestController -@RequestMapping("/pay/wallet") -@Validated -@Slf4j -public class AppPayWalletController { - - @Resource - private PayWalletService payWalletService; - - @GetMapping("/get") - @Operation(summary = "获取钱包") - @PreAuthenticated - public CommonResult getPayWallet() { - PayWalletDO wallet = payWalletService.getOrCreateWallet(getLoginUserId(), UserTypeEnum.MEMBER.getValue()); - return success(PayWalletConvert.INSTANCE.convert(wallet)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletTransactionController.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletTransactionController.java deleted file mode 100644 index 3280ebf8..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/AppPayWalletTransactionController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.win.module.pay.controller.app.wallet; - -import com.win.framework.common.enums.UserTypeEnum; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO; -import com.win.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionRespVO; -import com.win.module.pay.convert.wallet.PayWalletTransactionConvert; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.service.wallet.PayWalletTransactionService; -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.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.time.LocalDateTime; - -import static com.win.framework.common.pojo.CommonResult.success; -import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "用户 APP - 钱包余额明细") -@RestController -@RequestMapping("/pay/wallet-transaction") -@Validated -@Slf4j -public class AppPayWalletTransactionController { - - @Resource - private PayWalletTransactionService payWalletTransactionService; - - @GetMapping("/page") - @Operation(summary = "获得钱包流水分页") - public CommonResult> getWalletTransactionPage( - @Valid AppPayWalletTransactionPageReqVO pageReqVO) { - if (true) { - PageResult result = new PageResult<>(10L); - result.getList().add(new AppPayWalletTransactionRespVO().setPrice(1L) - .setTitle("测试").setCreateTime(LocalDateTime.now())); - result.getList().add(new AppPayWalletTransactionRespVO().setPrice(-1L) - .setTitle("测试2").setCreateTime(LocalDateTime.now())); - return success(result); - } - PageResult result = payWalletTransactionService.getWalletTransactionPage(getLoginUserId(), - UserTypeEnum.MEMBER.getValue(), pageReqVO); - return success(PayWalletTransactionConvert.INSTANCE.convertPage(result)); - } -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionPageReqVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionPageReqVO.java deleted file mode 100644 index f8b384b2..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionPageReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.pay.controller.app.wallet.vo.transaction; - -import com.win.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 APP - 钱包流水分页 Request VO") -@Data -public class AppPayWalletTransactionPageReqVO extends PageParam { - - /** - * 类型 - 收入 - */ - public static final Integer TYPE_INCOME = 1; - /** - * 类型 - 支出 - */ - public static final Integer TYPE_EXPENSE = 2; - - @Schema(description = "类型", example = "1") - private Integer type; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionRespVO.java deleted file mode 100644 index 945d97c5..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.pay.controller.app.wallet.vo.transaction; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "用户 APP - 钱包流水分页 Response VO") -@Data -public class AppPayWalletTransactionRespVO { - - @Schema(description = "交易金额, 单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer amount; - - @Schema(description = "业务分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer bizType; - - @Schema(description = "交易金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Long price; - - @Schema(description = "流水标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆土豆") - private String title; - - @Schema(description = "交易时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java deleted file mode 100644 index 3412054d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.pay.controller.app.wallet.vo.wallet; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "用户 APP - 获取用户钱包 Response VO") -@Data -public class AppPayWalletRespVO { - - @Schema(description = "钱包余额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Integer balance; - - @Schema(description = "累计支出, 单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") - private Integer totalExpense; - - @Schema(description = "累计充值, 单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") - private Integer totalRecharge; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/package-info.java deleted file mode 100644 index 9ed093ca..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 RESTful API 给前端: - * 1. admin 包:提供给管理后台 win-ui-admin 前端项目 - * 2. app 包:提供给用户 APP win-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 - */ -package com.win.module.pay.controller; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/app/PayAppConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/app/PayAppConvert.java deleted file mode 100644 index 534f4849..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/app/PayAppConvert.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.pay.convert.app; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.pay.controller.admin.app.vo.PayAppCreateReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppPageItemRespVO; -import com.win.module.pay.controller.admin.app.vo.PayAppRespVO; -import com.win.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; - -/** - * 支付应用信息 Convert - * - * @author 芋艿 - */ -@Mapper -public interface PayAppConvert { - - PayAppConvert INSTANCE = Mappers.getMapper(PayAppConvert.class); - - PayAppPageItemRespVO pageConvert (PayAppDO bean); - - PayAppDO convert(PayAppCreateReqVO bean); - - PayAppDO convert(PayAppUpdateReqVO bean); - - PayAppRespVO convert(PayAppDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - default PageResult convertPage(PageResult pageResult, List channels) { - PageResult voPageResult = convertPage(pageResult); - // 处理 channel 关系 - Map> appIdChannelMap = CollectionUtils.convertMultiMap2(channels, PayChannelDO::getAppId, PayChannelDO::getCode); - voPageResult.getList().forEach(app -> app.setChannelCodes(appIdChannelMap.get(app.getId()))); - return voPageResult; - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/channel/PayChannelConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/channel/PayChannelConvert.java deleted file mode 100644 index 4eec3df8..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/channel/PayChannelConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.pay.convert.channel; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelRespVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface PayChannelConvert { - - PayChannelConvert INSTANCE = Mappers.getMapper(PayChannelConvert.class); - - @Mapping(target = "config",ignore = true) - PayChannelDO convert(PayChannelCreateReqVO bean); - - @Mapping(target = "config",ignore = true) - PayChannelDO convert(PayChannelUpdateReqVO bean); - - @Mapping(target = "config",expression = "java(com.win.framework.common.util.json.JsonUtils.toJsonString(bean.getConfig()))") - PayChannelRespVO convert(PayChannelDO bean); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/demo/PayDemoOrderConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/demo/PayDemoOrderConvert.java deleted file mode 100644 index b613df1d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/demo/PayDemoOrderConvert.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.win.module.pay.convert.demo; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO; -import com.win.module.pay.controller.admin.demo.vo.PayDemoOrderRespVO; -import com.win.module.pay.dal.dataobject.demo.PayDemoOrderDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 示例订单 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface PayDemoOrderConvert { - - PayDemoOrderConvert INSTANCE = Mappers.getMapper(PayDemoOrderConvert.class); - - PayDemoOrderDO convert(PayDemoOrderCreateReqVO bean); - - PayDemoOrderRespVO convert(PayDemoOrderDO bean); - - PageResult convertPage(PageResult page); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/notify/PayNotifyTaskConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/notify/PayNotifyTaskConvert.java deleted file mode 100644 index 1e633d2c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/notify/PayNotifyTaskConvert.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.pay.convert.notify; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskDetailRespVO; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskRespVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyLogDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyTaskDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * 支付通知 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface PayNotifyTaskConvert { - - PayNotifyTaskConvert INSTANCE = Mappers.getMapper(PayNotifyTaskConvert.class); - - PayNotifyTaskRespVO convert(PayNotifyTaskDO bean); - - default PageResult convertPage(PageResult page, Map appMap){ - PageResult result = convertPage(page); - result.getList().forEach(order -> MapUtils.findAndThen(appMap, order.getAppId(), app -> order.setAppName(app.getName()))); - return result; - } - PageResult convertPage(PageResult page); - - default PayNotifyTaskDetailRespVO convert(PayNotifyTaskDO task, PayAppDO app, List logs) { - PayNotifyTaskDetailRespVO respVO = convert(task, logs); - if (app != null) { - respVO.setAppName(app.getName()); - } - return respVO; - } - PayNotifyTaskDetailRespVO convert(PayNotifyTaskDO task, List logs); -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/order/PayOrderConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/order/PayOrderConvert.java deleted file mode 100644 index f9f53512..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/order/PayOrderConvert.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.win.module.pay.convert.order; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.collection.MapUtils; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.api.order.dto.PayOrderRespDTO; -import com.win.module.pay.controller.admin.order.vo.*; -import com.win.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -/** - * 支付订单 Convert - * - * @author aquan - */ -@Mapper -public interface PayOrderConvert { - - PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class); - - PayOrderRespVO convert(PayOrderDO bean); - - PayOrderRespDTO convert2(PayOrderDO order); - - default PayOrderDetailsRespVO convert(PayOrderDO order, PayOrderExtensionDO orderExtension, PayAppDO app) { - PayOrderDetailsRespVO respVO = convertDetail(order); - respVO.setExtension(convert(orderExtension)); - if (app != null) { - respVO.setAppName(app.getName()); - } - return respVO; - } - PayOrderDetailsRespVO convertDetail(PayOrderDO bean); - PayOrderDetailsRespVO.PayOrderExtension convert(PayOrderExtensionDO bean); - - default PageResult convertPage(PageResult page, Map appMap) { - PageResult result = convertPage(page); - result.getList().forEach(order -> MapUtils.findAndThen(appMap, order.getAppId(), app -> order.setAppName(app.getName()))); - return result; - } - PageResult convertPage(PageResult page); - - default List convertList(List list, Map appMap) { - return CollectionUtils.convertList(list, order -> { - PayOrderExcelVO excelVO = convertExcel(order); - MapUtils.findAndThen(appMap, order.getAppId(), app -> excelVO.setAppName(app.getName())); - return excelVO; - }); - } - PayOrderExcelVO convertExcel(PayOrderDO bean); - - PayOrderDO convert(PayOrderCreateReqDTO bean); - - @Mapping(target = "id", ignore = true) - PayOrderExtensionDO convert(PayOrderSubmitReqVO bean, String userIp); - - PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqVO reqVO, String userIp); - - @Mapping(source = "order.status", target = "status") - PayOrderSubmitRespVO convert(PayOrderDO order, com.win.framework.pay.core.client.dto.order.PayOrderRespDTO respDTO); - - AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/package-info.java deleted file mode 100644 index 70fa5553..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package com.win.module.pay.convert; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/refund/PayRefundConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/refund/PayRefundConvert.java deleted file mode 100644 index d169d98e..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/refund/PayRefundConvert.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.module.pay.convert.refund; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.framework.common.util.collection.MapUtils; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.api.refund.dto.PayRefundRespDTO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundDetailsRespVO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundExcelVO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundPageItemRespVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface PayRefundConvert { - - PayRefundConvert INSTANCE = Mappers.getMapper(PayRefundConvert.class); - - - default PayRefundDetailsRespVO convert(PayRefundDO refund, PayAppDO app) { - PayRefundDetailsRespVO respVO = convert(refund); - if (app != null) { - respVO.setAppName(app.getName()); - } - return respVO; - } - PayRefundDetailsRespVO convert(PayRefundDO bean); - PayRefundDetailsRespVO.Order convert(PayOrderDO bean); - - default PageResult convertPage(PageResult page, Map appMap) { - PageResult result = convertPage(page); - result.getList().forEach(order -> MapUtils.findAndThen(appMap, order.getAppId(), app -> order.setAppName(app.getName()))); - return result; - } - PageResult convertPage(PageResult page); - - PayRefundDO convert(PayRefundCreateReqDTO bean); - - PayRefundRespDTO convert02(PayRefundDO bean); - - default List convertList(List list, Map appMap) { - return CollectionUtils.convertList(list, order -> { - PayRefundExcelVO excelVO = convertExcel(order); - MapUtils.findAndThen(appMap, order.getAppId(), app -> excelVO.setAppName(app.getName())); - return excelVO; - }); - } - PayRefundExcelVO convertExcel(PayRefundDO bean); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletConvert.java deleted file mode 100644 index 509a8497..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletConvert.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.win.module.pay.convert.wallet; - -import com.win.module.pay.controller.app.wallet.vo.wallet.AppPayWalletRespVO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface PayWalletConvert { - - PayWalletConvert INSTANCE = Mappers.getMapper(PayWalletConvert.class); - - AppPayWalletRespVO convert(PayWalletDO bean); -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletTransactionConvert.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletTransactionConvert.java deleted file mode 100644 index 05d3e9fc..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/wallet/PayWalletTransactionConvert.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.win.module.pay.convert.wallet; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionRespVO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.service.wallet.bo.CreateWalletTransactionBO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface PayWalletTransactionConvert { - - PayWalletTransactionConvert INSTANCE = Mappers.getMapper(PayWalletTransactionConvert.class); - - PageResult convertPage(PageResult page); - - PayWalletTransactionDO convert(CreateWalletTransactionBO bean); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 2f05ebd1..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/app/PayAppDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/app/PayAppDO.java deleted file mode 100644 index c4c7e1e8..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/app/PayAppDO.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.pay.dal.dataobject.app; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.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 - * 一个商户下,可能会有多个支付应用。例如说,京东有京东商城、京东到家等等 - * 不过一般来说,一个商户,只有一个应用哈~ - * - * 即 PayMerchantDO : PayAppDO = 1 : n - * - * @author 芋道源码 - */ -@TableName("pay_app") -@KeySequence("pay_app_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayAppDO extends BaseDO { - - /** - * 应用编号,数据库自增 - */ - @TableId - private Long id; - /** - * 应用名 - */ - private String name; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - /** - * 支付结果的回调地址 - */ - private String orderNotifyUrl; - /** - * 退款结果的回调地址 - */ - private String refundNotifyUrl; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/channel/PayChannelDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/channel/PayChannelDO.java deleted file mode 100644 index e147a6b6..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/channel/PayChannelDO.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.win.module.pay.dal.dataobject.channel; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.pay.core.client.PayClientConfig; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.tenant.core.db.TenantBaseDO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -/** - * 支付渠道 DO - * 一个应用下,会有多种支付渠道,例如说微信支付、支付宝支付等等 - * - * 即 PayAppDO : PayChannelDO = 1 : n - * - * @author 芋道源码 - */ -@TableName(value = "pay_channel", autoResultMap = true) -@KeySequence("pay_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayChannelDO extends TenantBaseDO { - - /** - * 渠道编号,数据库自增 - */ - private Long id; - /** - * 渠道编码 - * - * 枚举 {@link PayChannelEnum} - */ - private String code; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 渠道费率,单位:百分比 - */ - private Double feeRate; - /** - * 备注 - */ - private String remark; - - /** - * 应用编号 - * - * 关联 {@link PayAppDO#getId()} - */ - private Long appId; - /** - * 支付渠道配置 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private PayClientConfig config; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/demo/PayDemoOrderDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/demo/PayDemoOrderDO.java deleted file mode 100644 index a1d0d452..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/demo/PayDemoOrderDO.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.win.module.pay.dal.dataobject.demo; - -import com.win.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; - -/** - * 示例订单 - * - * 演示业务系统的订单,如何接入 pay 系统的支付与退款 - * - * @author 芋道源码 - */ -@TableName("pay_demo_order") -@KeySequence("pay_demo_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayDemoOrderDO extends BaseDO { - - /** - * 订单编号,自增 - */ - @TableId - private Long id; - /** - * 用户编号 - */ - private Long userId; - /** - * 商品编号 - */ - private Long spuId; - /** - * 商品名称 - */ - private String spuName; - /** - * 价格,单位:分 - */ - private Integer price; - - // ========== 支付相关字段 ========== - - /** - * 是否支付 - */ - private Boolean payStatus; - /** - * 支付订单编号 - * - * 对接 pay-module-biz 支付服务的支付订单编号,即 PayOrderDO 的 id 编号 - */ - private Long payOrderId; - /** - * 付款时间 - */ - private LocalDateTime payTime; - /** - * 支付渠道 - * - * 对应 PayChannelEnum 枚举 - */ - private String payChannelCode; - - // ========== 退款相关字段 ========== - /** - * 支付退款单号 - */ - private Long payRefundId; - /** - * 退款金额,单位:分 - */ - private Integer refundPrice; - /** - * 退款完成时间 - */ - private LocalDateTime refundTime; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyLogDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyLogDO.java deleted file mode 100644 index 254da28a..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyLogDO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.pay.dal.dataobject.notify; - -import com.win.module.pay.enums.notify.PayNotifyStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 商户支付、退款等的通知 Log - * 每次通知时,都会在该表中,记录一次 Log,方便排查问题 - * - * @author 芋道源码 - */ -@TableName("pay_notify_log") -@KeySequence("pay_notify_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayNotifyLogDO extends BaseDO { - - /** - * 日志编号,自增 - */ - private Long id; - /** - * 通知任务编号 - * - * 关联 {@link PayNotifyTaskDO#getId()} - */ - private Long taskId; - /** - * 第几次被通知 - * - * 对应到 {@link PayNotifyTaskDO#getNotifyTimes()} - */ - private Integer notifyTimes; - /** - * HTTP 响应结果 - */ - private String response; - /** - * 支付通知状态 - * - * 外键 {@link PayNotifyStatusEnum} - */ - private Integer status; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java deleted file mode 100644 index 565429a4..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.pay.dal.dataobject.notify; - -import com.win.framework.tenant.core.db.TenantBaseDO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.enums.notify.PayNotifyStatusEnum; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 支付通知 - * 在支付系统收到支付渠道的支付、退款的结果后,需要不断的通知到业务系统,直到成功。 - * - * @author 芋道源码 - */ -@TableName("pay_notify_task") -@KeySequence("pay_notify_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) -public class PayNotifyTaskDO extends TenantBaseDO { - - /** - * 通知频率,单位为秒。 - * - * 算上首次的通知,实际是一共 1 + 8 = 9 次。 - */ - public static final Integer[] NOTIFY_FREQUENCY = new Integer[]{ - 15, 15, 30, 180, - 1800, 1800, 1800, 3600 - }; - - /** - * 编号,自增 - */ - @TableId - private Long id; - /** - * 应用编号 - * - * 关联 {@link PayAppDO#getId()} - */ - private Long appId; - /** - * 通知类型 - * - * 外键 {@link PayNotifyTypeEnum} - */ - private Integer type; - /** - * 数据编号,根据不同 type 进行关联: - * - * 1. {@link PayNotifyTypeEnum#ORDER} 时,关联 {@link PayOrderDO#getId()} - * 2. {@link PayNotifyTypeEnum#REFUND} 时,关联 {@link PayRefundDO#getId()} - */ - private Long dataId; - /** - * 商户订单编号 - */ - private String merchantOrderId; - /** - * 通知状态 - * - * 外键 {@link PayNotifyStatusEnum} - */ - private Integer status; - /** - * 下一次通知时间 - */ - private LocalDateTime nextNotifyTime; - /** - * 最后一次执行时间 - */ - private LocalDateTime lastExecuteTime; - /** - * 当前通知次数 - */ - private Integer notifyTimes; - /** - * 最大可通知次数 - */ - private Integer maxNotifyTimes; - /** - * 通知地址 - */ - private String notifyUrl; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderDO.java deleted file mode 100644 index 7d662f44..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderDO.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.win.module.pay.dal.dataobject.order; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.time.LocalDateTime; - -/** - * 支付订单 DO - * - * @author 芋道源码 - */ -@TableName("pay_order") -@KeySequence("pay_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayOrderDO extends BaseDO { - - /** - * 订单编号,数据库自增 - */ - private Long id; - /** - * 应用编号 - * - * 关联 {@link PayAppDO#getId()} - */ - private Long appId; - /** - * 渠道编号 - * - * 关联 {@link PayChannelDO#getId()} - */ - private Long channelId; - /** - * 渠道编码 - * - * 枚举 {@link PayChannelEnum} - */ - private String channelCode; - - // ========== 商户相关字段 ========== - - /** - * 商户订单编号 - * - * 例如说,内部系统 A 的订单号,需要保证每个 PayAppDO 唯一 - */ - private String merchantOrderId; - /** - * 商品标题 - */ - private String subject; - /** - * 商品描述信息 - */ - private String body; - /** - * 异步通知地址 - */ - private String notifyUrl; - - // ========== 订单相关字段 ========== - - /** - * 支付金额,单位:分 - */ - private Integer price; - /** - * 渠道手续费,单位:百分比 - * - * 冗余 {@link PayChannelDO#getFeeRate()} - */ - private Double channelFeeRate; - /** - * 渠道手续金额,单位:分 - */ - private Integer channelFeePrice; - /** - * 支付状态 - * - * 枚举 {@link PayOrderStatusEnum} - */ - private Integer status; - /** - * 用户 IP - */ - private String userIp; - /** - * 订单失效时间 - */ - private LocalDateTime expireTime; - /** - * 订单支付成功时间 - */ - private LocalDateTime successTime; - /** - * 支付成功的订单拓展单编号 - * - * 关联 {@link PayOrderExtensionDO#getId()} - */ - private Long extensionId; - /** - * 支付成功的外部订单号 - * - * 关联 {@link PayOrderExtensionDO#getNo()} - */ - private String no; - - // ========== 退款相关字段 ========== - /** - * 退款总金额,单位:分 - */ - private Integer refundPrice; - - // ========== 渠道相关字段 ========== - /** - * 渠道用户编号 - * - * 例如说,微信 openid、支付宝账号 - */ - private String channelUserId; - /** - * 渠道订单号 - */ - private String channelOrderNo; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderExtensionDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderExtensionDO.java deleted file mode 100644 index a3f03965..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/order/PayOrderExtensionDO.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.win.module.pay.dal.dataobject.order; - -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.Map; - -/** - * 支付订单拓展 DO - * - * 每次调用支付渠道,都会生成一条对应记录 - * - * @author 芋道源码 - */ -@TableName(value = "pay_order_extension",autoResultMap = true) -@KeySequence("pay_order_extension_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayOrderExtensionDO extends BaseDO { - - /** - * 订单拓展编号,数据库自增 - */ - private Long id; - /** - * 外部订单号,根据规则生成 - * - * 调用支付渠道时,使用该字段作为对接的订单号: - * 1. 微信支付:对应 JSAPI 支付 的 out_trade_no 字段 - * 2. 支付宝支付:对应 电脑网站支付 的 out_trade_no 字段 - * - * 例如说,P202110132239124200055 - */ - private String no; - /** - * 订单号 - * - * 关联 {@link PayOrderDO#getId()} - */ - private Long orderId; - /** - * 渠道编号 - * - * 关联 {@link PayChannelDO#getId()} - */ - private Long channelId; - /** - * 渠道编码 - */ - private String channelCode; - /** - * 用户 IP - */ - private String userIp; - /** - * 支付状态 - * - * 枚举 {@link PayOrderStatusEnum} - */ - private Integer status; - /** - * 支付渠道的额外参数 - * - * 参见 参数说明 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Map channelExtras; - - /** - * 调用渠道的错误码 - */ - private String channelErrorCode; - /** - * 调用渠道报错时,错误信息 - */ - private String channelErrorMsg; - - /** - * 支付渠道的同步/异步通知的内容 - * - * 对应 {@link PayOrderRespDTO#getRawData()} - */ - private String channelNotifyData; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/refund/PayRefundDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/refund/PayRefundDO.java deleted file mode 100644 index 3a7ea773..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/refund/PayRefundDO.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.win.module.pay.dal.dataobject.refund; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.enums.refund.PayRefundStatusEnum; -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 - * 一个支付订单,可以拥有多个支付退款单 - * - * 即 PayOrderDO : PayRefundDO = 1 : n - * - * @author 芋道源码 - */ -@TableName("pay_refund") -@KeySequence("pay_refund_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PayRefundDO extends BaseDO { - - /** - * 退款单编号,数据库自增 - */ - @TableId - private Long id; - /** - * 外部退款号,根据规则生成 - * - * 调用支付渠道时,使用该字段作为对接的退款号: - * 1. 微信退款:对应 申请退款 的 out_refund_no 字段 - * 2. 支付宝退款:对应 的 out_request_no 字段 - */ - private String no; - - /** - * 应用编号 - * - * 关联 {@link PayAppDO#getId()} - */ - private Long appId; - /** - * 渠道编号 - * - * 关联 {@link PayChannelDO#getId()} - */ - private Long channelId; - /** - * 商户编码 - * - * 枚举 {@link PayChannelEnum} - */ - private String channelCode; - /** - * 订单编号 - * - * 关联 {@link PayOrderDO#getId()} - */ - private Long orderId; - /** - * 支付订单编号 - * - * 冗余 {@link PayOrderDO#getNo()} - */ - private String orderNo; - - // ========== 商户相关字段 ========== - /** - * 商户订单编号 - * - * 例如说,内部系统 A 的订单号,需要保证每个 PayAppDO 唯一 - */ - private String merchantOrderId; - /** - * 商户退款订单号 - * - * 例如说,内部系统 A 的订单号,需要保证每个 PayAppDO 唯一 - */ - private String merchantRefundId; - /** - * 异步通知地址 - */ - private String notifyUrl; - - // ========== 退款相关字段 ========== - /** - * 退款状态 - * - * 枚举 {@link PayRefundStatusEnum} - */ - private Integer status; - - /** - * 支付金额,单位:分 - */ - private Integer payPrice; - /** - * 退款金额,单位:分 - */ - private Integer refundPrice; - - /** - * 退款原因 - */ - private String reason; - - /** - * 用户 IP - */ - private String userIp; - - // ========== 渠道相关字段 ========== - /** - * 渠道订单号 - * - * 冗余 {@link PayOrderDO#getChannelOrderNo()} - */ - private String channelOrderNo; - /** - * 渠道退款单号 - * - * 1. 微信退款:对应 申请退款 的 refund_id 字段 - * 2. 支付宝退款:没有字段 - */ - private String channelRefundNo; - /** - * 退款成功时间 - */ - private LocalDateTime successTime; - - /** - * 调用渠道的错误码 - */ - private String channelErrorCode; - /** - * 调用渠道的错误提示 - */ - private String channelErrorMsg; - - /** - * 支付渠道的同步/异步通知的内容 - * - * 对应 {@link PayRefundRespDTO#getRawData()} - */ - private String channelNotifyData; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletDO.java deleted file mode 100644 index 9d5194de..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletDO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.pay.dal.dataobject.wallet; - -import com.win.framework.common.enums.UserTypeEnum; -import com.win.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.Data; - -/** - * 会员钱包 DO - * - * @author jason - */ -@TableName(value ="pay_wallet") -@KeySequence("pay_wallet_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class PayWalletDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 用户 id - * - * 关联 MemberUserDO 的 id 编号 - * 关联 AdminUserDO 的 id 编号 - */ - private Long userId; - /** - * 用户类型, 预留 多商户转帐可能需要用到 - * - * 关联 {@link UserTypeEnum} - */ - private Integer userType; - - /** - * 余额,单位分 - */ - private Integer balance; - - /** - * 累计支出,单位分 - */ - private Integer totalExpense; - /** - * 累计充值,单位分 - */ - private Integer totalRecharge; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletTransactionDO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletTransactionDO.java deleted file mode 100644 index 0a3d6e7d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/dataobject/wallet/PayWalletTransactionDO.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.win.module.pay.dal.dataobject.wallet; - -import com.win.framework.mybatis.core.dataobject.BaseDO; -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * 会员钱包流水 DO - * - * @author jason - */ -@TableName(value ="pay_wallet_transaction") -@KeySequence("pay_wallet_transaction_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class PayWalletTransactionDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - - /** - * 流水号 - */ - private String no; - - /** - * 钱包编号 - * - * 关联 {@link PayWalletDO#getId()} - */ - private Long walletId; - - /** - * 关联业务分类 - * - * 枚举 {@link PayWalletBizTypeEnum#getType()} - */ - private Integer bizType; - - /** - * 关联业务编号 - */ - private String bizId; - - /** - * 流水说明 - */ - private String title; - - /** - * 交易金额,单位分 - * - * 正值表示余额增加,负值表示余额减少 - */ - private Integer price; - - /** - * 交易后余额,单位分 - */ - private Integer balance; -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/app/PayAppMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/app/PayAppMapper.java deleted file mode 100644 index 4eff0ee3..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/app/PayAppMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.win.module.pay.dal.mysql.app; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.framework.mybatis.core.query.QueryWrapperX; -import com.win.module.pay.controller.admin.app.vo.PayAppPageReqVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PayAppMapper extends BaseMapperX { - - default PageResult selectPage(PayAppPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(PayAppDO::getName, reqVO.getName()) - .eqIfPresent(PayAppDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(PayAppDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PayAppDO::getId)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/channel/PayChannelMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/channel/PayChannelMapper.java deleted file mode 100644 index 65f06c11..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/channel/PayChannelMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.dal.mysql.channel; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.List; - -@Mapper -public interface PayChannelMapper extends BaseMapperX { - - default PayChannelDO selectByAppIdAndCode(Long appId, String code) { - return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code); - } - - default List selectListByAppIds(Collection appIds){ - return selectList(PayChannelDO::getAppId, appIds); - } - - default List selectListByAppId(Long appId, Integer status) { - return selectList(new LambdaQueryWrapperX() - .eq(PayChannelDO::getAppId, appId) - .eq(PayChannelDO::getStatus, status)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/demo/PayDemoOrderMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/demo/PayDemoOrderMapper.java deleted file mode 100644 index a784195e..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/demo/PayDemoOrderMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.pay.dal.mysql.demo; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.pay.dal.dataobject.demo.PayDemoOrderDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 示例订单 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface PayDemoOrderMapper extends BaseMapperX { - - default PageResult selectPage(PageParam reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .orderByDesc(PayDemoOrderDO::getId)); - } - - default int updateByIdAndPayed(Long id, boolean wherePayed, PayDemoOrderDO updateObj) { - return update(updateObj, new LambdaQueryWrapperX() - .eq(PayDemoOrderDO::getId, id).eq(PayDemoOrderDO::getPayStatus, wherePayed)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyLogMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyLogMapper.java deleted file mode 100644 index 97a65e6f..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyLogMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.win.module.pay.dal.mysql.notify; - -import com.win.module.pay.dal.dataobject.notify.PayNotifyLogDO; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface PayNotifyLogMapper extends BaseMapperX { - - default List selectListByTaskId(Long taskId) { - return selectList(PayNotifyLogDO::getTaskId, taskId); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyTaskMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyTaskMapper.java deleted file mode 100644 index 3edbca9d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/notify/PayNotifyTaskMapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.win.module.pay.dal.mysql.notify; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyTaskDO; -import com.win.module.pay.enums.notify.PayNotifyStatusEnum; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.time.LocalDateTime; -import java.util.List; - -@Mapper -public interface PayNotifyTaskMapper extends BaseMapperX { - - /** - * 获得需要通知的 PayNotifyTaskDO 记录。需要满足如下条件: - * - * 1. status 非成功 - * 2. nextNotifyTime 小于当前时间 - * - * @return PayTransactionNotifyTaskDO 数组 - */ - default List selectListByNotify() { - return selectList(new LambdaQueryWrapper() - .in(PayNotifyTaskDO::getStatus, PayNotifyStatusEnum.WAITING.getStatus(), - PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus()) - .le(PayNotifyTaskDO::getNextNotifyTime, LocalDateTime.now())); - } - - default PageResult selectPage(PayNotifyTaskPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(PayNotifyTaskDO::getAppId, reqVO.getAppId()) - .eqIfPresent(PayNotifyTaskDO::getType, reqVO.getType()) - .eqIfPresent(PayNotifyTaskDO::getDataId, reqVO.getDataId()) - .eqIfPresent(PayNotifyTaskDO::getStatus, reqVO.getStatus()) - .eqIfPresent(PayNotifyTaskDO::getMerchantOrderId, reqVO.getMerchantOrderId()) - .betweenIfPresent(PayNotifyTaskDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PayNotifyTaskDO::getId)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderExtensionMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderExtensionMapper.java deleted file mode 100644 index 912603a7..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderExtensionMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.win.module.pay.dal.mysql.order; - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.time.LocalDateTime; -import java.util.List; - -@Mapper -public interface PayOrderExtensionMapper extends BaseMapperX { - - default PayOrderExtensionDO selectByNo(String no) { - return selectOne(PayOrderExtensionDO::getNo, no); - } - - default int updateByIdAndStatus(Long id, Integer status, PayOrderExtensionDO update) { - return update(update, new LambdaQueryWrapper() - .eq(PayOrderExtensionDO::getId, id).eq(PayOrderExtensionDO::getStatus, status)); - } - - default List selectListByOrderId(Long orderId) { - return selectList(PayOrderExtensionDO::getOrderId, orderId); - } - - default List selectListByStatusAndCreateTimeGe(Integer status, LocalDateTime minCreateTime) { - return selectList(new LambdaQueryWrapper() - .eq(PayOrderExtensionDO::getStatus, status) - .ge(PayOrderExtensionDO::getCreateTime, minCreateTime)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderMapper.java deleted file mode 100644 index 26b5f9d8..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/order/PayOrderMapper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.win.module.pay.dal.mysql.order; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.pay.controller.admin.order.vo.PayOrderExportReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderPageReqVO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.time.LocalDateTime; -import java.util.List; - -@Mapper -public interface PayOrderMapper extends BaseMapperX { - - default PageResult selectPage(PayOrderPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(PayOrderDO::getAppId, reqVO.getAppId()) - .eqIfPresent(PayOrderDO::getChannelCode, reqVO.getChannelCode()) - .likeIfPresent(PayOrderDO::getMerchantOrderId, reqVO.getMerchantOrderId()) - .likeIfPresent(PayOrderDO::getChannelOrderNo, reqVO.getChannelOrderNo()) - .likeIfPresent(PayOrderDO::getNo, reqVO.getNo()) - .eqIfPresent(PayOrderDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(PayOrderDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PayOrderDO::getId)); - } - - default List selectList(PayOrderExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(PayOrderDO::getAppId, reqVO.getAppId()) - .eqIfPresent(PayOrderDO::getChannelCode, reqVO.getChannelCode()) - .likeIfPresent(PayOrderDO::getMerchantOrderId, reqVO.getMerchantOrderId()) - .likeIfPresent(PayOrderDO::getChannelOrderNo, reqVO.getChannelOrderNo()) - .likeIfPresent(PayOrderDO::getNo, reqVO.getNo()) - .eqIfPresent(PayOrderDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(PayOrderDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PayOrderDO::getId)); - } - - default Long selectCountByAppId(Long appId) { - return selectCount(PayOrderDO::getAppId, appId); - } - - default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) { - return selectOne(PayOrderDO::getAppId, appId, - PayOrderDO::getMerchantOrderId, merchantOrderId); - } - - default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) { - return update(update, new LambdaQueryWrapper() - .eq(PayOrderDO::getId, id).eq(PayOrderDO::getStatus, status)); - } - - default List selectListByStatusAndExpireTimeLt(Integer status, LocalDateTime expireTime) { - return selectList(new LambdaQueryWrapper() - .eq(PayOrderDO::getStatus, status) - .lt(PayOrderDO::getExpireTime, expireTime)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/refund/PayRefundMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/refund/PayRefundMapper.java deleted file mode 100644 index b3f53176..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/refund/PayRefundMapper.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.win.module.pay.dal.mysql.refund; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface PayRefundMapper extends BaseMapperX { - - default Long selectCountByAppId(Long appId) { - return selectCount(PayRefundDO::getAppId, appId); - } - - default PayRefundDO selectByAppIdAndMerchantRefundId(Long appId, String merchantRefundId) { - return selectOne(new LambdaQueryWrapperX() - .eq(PayRefundDO::getAppId, appId) - .eq(PayRefundDO::getMerchantRefundId, merchantRefundId)); - } - - default Long selectCountByAppIdAndOrderId(Long appId, Long orderId, Integer status) { - return selectCount(new LambdaQueryWrapperX() - .eq(PayRefundDO::getAppId, appId) - .eq(PayRefundDO::getOrderId, orderId) - .eq(PayRefundDO::getStatus, status)); - } - - default PayRefundDO selectByAppIdAndNo(Long appId, String no) { - return selectOne(new LambdaQueryWrapperX() - .eq(PayRefundDO::getAppId, appId) - .eq(PayRefundDO::getNo, no)); - } - - default PayRefundDO selectByNo(String no) { - return selectOne(PayRefundDO::getNo, no); - } - - default int updateByIdAndStatus(Long id, Integer status, PayRefundDO update) { - return update(update, new LambdaQueryWrapper() - .eq(PayRefundDO::getId, id).eq(PayRefundDO::getStatus, status)); - } - - default PageResult selectPage(PayRefundPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(PayRefundDO::getAppId, reqVO.getAppId()) - .eqIfPresent(PayRefundDO::getChannelCode, reqVO.getChannelCode()) - .likeIfPresent(PayRefundDO::getMerchantOrderId, reqVO.getMerchantOrderId()) - .likeIfPresent(PayRefundDO::getMerchantRefundId, reqVO.getMerchantRefundId()) - .likeIfPresent(PayRefundDO::getChannelOrderNo, reqVO.getChannelOrderNo()) - .likeIfPresent(PayRefundDO::getChannelRefundNo, reqVO.getChannelRefundNo()) - .eqIfPresent(PayRefundDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(PayRefundDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PayRefundDO::getId)); - } - - default List selectList(PayRefundExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(PayRefundDO::getAppId, reqVO.getAppId()) - .eqIfPresent(PayRefundDO::getChannelCode, reqVO.getChannelCode()) - .likeIfPresent(PayRefundDO::getMerchantOrderId, reqVO.getMerchantOrderId()) - .likeIfPresent(PayRefundDO::getMerchantRefundId, reqVO.getMerchantRefundId()) - .likeIfPresent(PayRefundDO::getChannelOrderNo, reqVO.getChannelOrderNo()) - .likeIfPresent(PayRefundDO::getChannelRefundNo, reqVO.getChannelRefundNo()) - .eqIfPresent(PayRefundDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(PayRefundDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PayRefundDO::getId)); - } - - default List selectListByStatus(Integer status) { - return selectList(PayRefundDO::getStatus, status); - } -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletMapper.java deleted file mode 100644 index 4ed9d3fc..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletMapper.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.win.module.pay.dal.mysql.wallet; - - -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.module.pay.dal.dataobject.wallet.PayWalletDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PayWalletMapper extends BaseMapperX { - - default PayWalletDO selectByUserIdAndType(Long userId, Integer userType) { - return selectOne(PayWalletDO::getUserId, userId, - PayWalletDO::getUserType, userType); - } - - /** - * 当消费退款时候, 更新钱包 - * - * @param price 消费金额 - * @param id 钱包 id - */ - default int updateWhenConsumptionRefund(Integer price, Long id){ - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" balance = balance + " + price - + ", total_expense = total_expense - " + price) - .eq(PayWalletDO::getId, id); - return update(null, lambdaUpdateWrapper); - } - - /** - * 当消费时候, 更新钱包 - * - * @param price 消费金额 - * @param id 钱包 id - */ - default int updateWhenConsumption(Integer price, Long id){ - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" balance = balance - " + price - + ", total_expense = total_expense + " + price) - .eq(PayWalletDO::getId, id) - .ge(PayWalletDO::getBalance, price); // cas 逻辑 - return update(null, lambdaUpdateWrapper); - } -} - - - - diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletTransactionMapper.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletTransactionMapper.java deleted file mode 100644 index 3615d1e0..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/mysql/wallet/PayWalletTransactionMapper.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.win.module.pay.dal.mysql.wallet; - - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.mapper.BaseMapperX; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.win.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Objects; - -@Mapper -public interface PayWalletTransactionMapper extends BaseMapperX { - - default PageResult selectPage(Long walletId, - AppPayWalletTransactionPageReqVO pageReqVO) { - LambdaQueryWrapperX query = new LambdaQueryWrapperX() - .eq(PayWalletTransactionDO::getWalletId, walletId); - if (Objects.equals(pageReqVO.getType(), AppPayWalletTransactionPageReqVO.TYPE_INCOME)) { - query.gt(PayWalletTransactionDO::getPrice, 0); - } else if (Objects.equals(pageReqVO.getType(), AppPayWalletTransactionPageReqVO.TYPE_EXPENSE)) { - query.lt(PayWalletTransactionDO::getPrice, 0); - } - query.orderByDesc(PayWalletTransactionDO::getId); - return selectPage(pageReqVO, query); - } - - default PayWalletTransactionDO selectByNo(String no) { - return selectOne(PayWalletTransactionDO::getNo, no); - } - - default PayWalletTransactionDO selectByBiz(String bizId, Integer bizType) { - return selectOne(PayWalletTransactionDO::getBizId, bizId, - PayWalletTransactionDO::getBizType, bizType); - } - -} - - - - diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/RedisKeyConstants.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/RedisKeyConstants.java deleted file mode 100644 index f2635f8d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/RedisKeyConstants.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.win.module.pay.dal.redis; - -/** - * 支付 Redis Key 枚举类 - * - * @author 芋道源码 - */ -public interface RedisKeyConstants { - - /** - * 通知任务的分布式锁 - * - * KEY 格式:pay_notify:lock:%d // 参数来自 DefaultLockKeyBuilder 类 - * VALUE 数据格式:HASH // RLock.class:Redisson 的 Lock 锁,使用 Hash 数据结构 - * 过期时间:不固定 - */ - String PAY_NOTIFY_LOCK = "pay_notify:lock:%d"; - - /** - * 支付序号的缓存 - * - * KEY 格式:pay_no:{prefix} - * VALUE 数据格式:编号自增 - */ - String PAY_NO = "pay_no"; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/no/PayNoRedisDAO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/no/PayNoRedisDAO.java deleted file mode 100644 index d7935adb..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/no/PayNoRedisDAO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.dal.redis.no; - -import cn.hutool.core.date.DatePattern;import cn.hutool.core.date.DateUtil;import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Repository; - -import javax.annotation.Resource;import java.time.LocalDateTime; - -/** - * 支付序号的 Redis DAO - * - * @author 芋道源码 - */ -@Repository -public class PayNoRedisDAO { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 生成序号 - * - * @param prefix 前缀 - * @return 序号 - */ - public String generate(String prefix) { - String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN); - Long no = stringRedisTemplate.opsForValue().increment(noPrefix); - return noPrefix + no; - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java deleted file mode 100644 index 5fddae87..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.win.module.pay.dal.redis.notify; - -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.stereotype.Repository; - -import javax.annotation.Resource; -import java.util.concurrent.TimeUnit; - -import static com.win.module.pay.dal.redis.RedisKeyConstants.PAY_NOTIFY_LOCK; - -/** - * 支付通知的锁 Redis DAO - * - * @author 芋道源码 - */ -@Repository -public class PayNotifyLockRedisDAO { - - @Resource - private RedissonClient redissonClient; - - public void lock(Long id, Long timeoutMillis, Runnable runnable) { - String lockKey = formatKey(id); - RLock lock = redissonClient.getLock(lockKey); - try { - lock.lock(timeoutMillis, TimeUnit.MILLISECONDS); - // 执行逻辑 - runnable.run(); - } finally { - lock.unlock(); - } - } - - private static String formatKey(Long id) { - return String.format(PAY_NOTIFY_LOCK, id); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/config/PayJobConfiguration.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/config/PayJobConfiguration.java deleted file mode 100644 index 29554424..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/config/PayJobConfiguration.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.win.module.pay.framework.job.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration(proxyBeanMethods = false) -public class PayJobConfiguration { - - public static final String NOTIFY_THREAD_POOL_TASK_EXECUTOR = "NOTIFY_THREAD_POOL_TASK_EXECUTOR"; - - @Bean(NOTIFY_THREAD_POOL_TASK_EXECUTOR) - public ThreadPoolTaskExecutor notifyThreadPoolTaskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(8); // 设置核心线程数 - executor.setMaxPoolSize(16); // 设置最大线程数 - executor.setKeepAliveSeconds(60); // 设置空闲时间 - executor.setQueueCapacity(100); // 设置队列大小 - executor.setThreadNamePrefix("notify-task-"); // 配置线程池的前缀 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - // 进行加载 - executor.initialize(); - return executor; - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/core/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/core/package-info.java deleted file mode 100644 index 39ebce0c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/job/core/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package com.win.module.pay.framework.job.core; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/package-info.java deleted file mode 100644 index b1e4b951..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 pay 模块的 framework 封装 - * - * @author 芋道源码 - */ -package com.win.module.pay.framework; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayConfiguration.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayConfiguration.java deleted file mode 100644 index 5ad1d17f..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.win.module.pay.framework.pay.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(PayProperties.class) -public class PayConfiguration { -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayProperties.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayProperties.java deleted file mode 100644 index 971c7ba2..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/config/PayProperties.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.pay.framework.pay.config; - -import lombok.Data; -import org.hibernate.validator.constraints.URL; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotEmpty; - -@ConfigurationProperties(prefix = "win.pay") -@Validated -@Data -public class PayProperties { - - private static final String ORDER_NO_PREFIX = "P"; - private static final String REFUND_NO_PREFIX = "R"; - - /** - * 支付回调地址 - * - * 实际上,对应的 PayNotifyController 的 notifyOrder 方法的 URL - * - * 回调顺序:支付渠道(支付宝支付、微信支付) => win-module-pay 的 orderNotifyUrl 地址 => 业务的 PayAppDO.orderNotifyUrl 地址 - */ - @NotEmpty(message = "支付回调地址不能为空") - @URL(message = "支付回调地址的格式必须是 URL") - private String orderNotifyUrl; - - /** - * 退款回调地址 - * - * 实际上,对应的 PayNotifyController 的 notifyRefund 方法的 URL - * - * 回调顺序:支付渠道(支付宝支付、微信支付) => win-module-pay 的 refundNotifyUrl 地址 => 业务的 PayAppDO.notifyRefundUrl 地址 - */ - @NotEmpty(message = "支付回调地址不能为空") - @URL(message = "支付回调地址的格式必须是 URL") - private String refundNotifyUrl; - - /** - * 支付订单 no 的前缀 - */ - @NotEmpty(message = "支付订单 no 的前缀不能为空") - private String orderNoPrefix = ORDER_NO_PREFIX; - - /** - * 退款订单 no 的前缀 - */ - @NotEmpty(message = "退款订单 no 的前缀不能为空") - private String refundNoPrefix = REFUND_NO_PREFIX; - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/core/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/core/package-info.java deleted file mode 100644 index eebdcaae..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/core/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位,无实际作用 - */ -package com.win.module.pay.framework.pay.core; \ No newline at end of file diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/wallet/WalletPayClient.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/wallet/WalletPayClient.java deleted file mode 100644 index 601f4d95..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/pay/wallet/WalletPayClient.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.win.module.pay.framework.pay.wallet; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.map.MapUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.exception.ServiceException; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.client.impl.AbstractPayClient; -import com.win.framework.pay.core.client.impl.NonePayClientConfig; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.refund.PayRefundStatusRespEnum; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -import com.win.module.pay.service.wallet.PayWalletService; -import com.win.module.pay.service.wallet.PayWalletTransactionService; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; - -import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; -import static com.win.module.pay.enums.ErrorCodeConstants.ORDER_EXTENSION_NOT_FOUND; -import static com.win.module.pay.enums.ErrorCodeConstants.REFUND_NOT_FOUND; - -/** - * 钱包支付的 PayClient 实现类 - * - * @author jason - */ -@Slf4j -public class WalletPayClient extends AbstractPayClient { - - public static final String USER_ID_KEY = "user_id"; - public static final String USER_TYPE_KEY = "user_type"; - - private PayWalletService wallService; - private PayWalletTransactionService walletTransactionService; - private PayOrderService orderService; - private PayRefundService refundService; - - public WalletPayClient(Long channelId, NonePayClientConfig config) { - super(channelId, PayChannelEnum.WALLET.getCode(), config); - } - - @Override - protected void doInit() { - if (wallService == null) { - wallService = SpringUtil.getBean(PayWalletService.class); - } - if (walletTransactionService == null) { - walletTransactionService = SpringUtil.getBean(PayWalletTransactionService.class); - } - } - - @Override - protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { - try { - Long userId = MapUtil.getLong(reqDTO.getChannelExtras(), USER_ID_KEY); - Integer userType = MapUtil.getInt(reqDTO.getChannelExtras(), USER_TYPE_KEY); - Assert.notNull(userId, "用户 id 不能为空"); - Assert.notNull(userType, "用户类型不能为空"); - PayWalletTransactionDO transaction = wallService.orderPay(userId, userType, reqDTO.getOutTradeNo(), - reqDTO.getPrice()); - return PayOrderRespDTO.successOf(transaction.getNo(), transaction.getCreator(), - transaction.getCreateTime(), - reqDTO.getOutTradeNo(), transaction); - } catch (Throwable ex) { - log.error("[doUnifiedOrder] 失败", ex); - Integer errorCode = INTERNAL_SERVER_ERROR.getCode(); - String errorMsg = INTERNAL_SERVER_ERROR.getMsg(); - if (ex instanceof ServiceException) { - ServiceException serviceException = (ServiceException) ex; - errorCode = serviceException.getCode(); - errorMsg = serviceException.getMessage(); - } - return PayOrderRespDTO.closedOf(String.valueOf(errorCode), errorMsg, - reqDTO.getOutTradeNo(), ""); - } - } - - @Override - protected PayOrderRespDTO doParseOrderNotify(Map params, String body) { - throw new UnsupportedOperationException("钱包支付无支付回调"); - } - - @Override - protected PayOrderRespDTO doGetOrder(String outTradeNo) { - if (orderService == null) { - orderService = SpringUtil.getBean(PayOrderService.class); - } - PayOrderExtensionDO orderExtension = orderService.getOrderExtensionByNo(outTradeNo); - // 支付交易拓展单不存在, 返回关闭状态 - if (orderExtension == null) { - return PayOrderRespDTO.closedOf(String.valueOf(ORDER_EXTENSION_NOT_FOUND.getCode()), - ORDER_EXTENSION_NOT_FOUND.getMsg(), outTradeNo, ""); - } - // 关闭状态 - if (PayOrderStatusEnum.isClosed(orderExtension.getStatus())) { - return PayOrderRespDTO.closedOf(orderExtension.getChannelErrorCode(), - orderExtension.getChannelErrorMsg(), outTradeNo, ""); - } - // 成功状态 - if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { - PayWalletTransactionDO walletTransaction = walletTransactionService.getWalletTransaction( - String.valueOf(orderExtension.getOrderId()), PayWalletBizTypeEnum.PAYMENT); - Assert.notNull(walletTransaction, "支付单 {} 钱包流水不能为空", outTradeNo); - return PayOrderRespDTO.successOf(walletTransaction.getNo(), walletTransaction.getCreator(), - walletTransaction.getCreateTime(), outTradeNo, walletTransaction); - } - // 其它状态为无效状态 - log.error("[doGetOrder] 支付单 {} 的状态不正确", outTradeNo); - throw new IllegalStateException(String.format("支付单[%s] 状态不正确", outTradeNo)); - } - - @Override - protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) { - try { - PayWalletTransactionDO payWalletTransaction = wallService.orderRefund(reqDTO.getOutRefundNo(), - reqDTO.getRefundPrice(), reqDTO.getReason()); - return PayRefundRespDTO.successOf(payWalletTransaction.getNo(), payWalletTransaction.getCreateTime(), - reqDTO.getOutRefundNo(), payWalletTransaction); - } catch (Throwable ex) { - log.error("[doUnifiedRefund] 失败", ex); - Integer errorCode = INTERNAL_SERVER_ERROR.getCode(); - String errorMsg = INTERNAL_SERVER_ERROR.getMsg(); - if (ex instanceof ServiceException) { - ServiceException serviceException = (ServiceException) ex; - errorCode = serviceException.getCode(); - errorMsg = serviceException.getMessage(); - } - return PayRefundRespDTO.failureOf(String.valueOf(errorCode), errorMsg, - reqDTO.getOutRefundNo(), ""); - } - } - - @Override - protected PayRefundRespDTO doParseRefundNotify(Map params, String body) { - throw new UnsupportedOperationException("钱包支付无退款回调"); - } - - @Override - protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) { - if (refundService == null) { - refundService = SpringUtil.getBean(PayRefundService.class); - } - PayRefundDO payRefund = refundService.getRefundByNo(outRefundNo); - // 支付退款单不存在, 返回退款失败状态 - if (payRefund == null) { - return PayRefundRespDTO.failureOf(String.valueOf(REFUND_NOT_FOUND), REFUND_NOT_FOUND.getMsg(), - outRefundNo, ""); - } - // 退款失败 - if (PayRefundStatusRespEnum.isFailure(payRefund.getStatus())) { - return PayRefundRespDTO.failureOf(payRefund.getChannelErrorCode(), payRefund.getChannelErrorMsg(), - outRefundNo, ""); - } - // 退款成功 - if (PayRefundStatusRespEnum.isSuccess(payRefund.getStatus())) { - PayWalletTransactionDO walletTransaction = walletTransactionService.getWalletTransaction( - String.valueOf(payRefund.getId()), PayWalletBizTypeEnum.PAYMENT_REFUND); - Assert.notNull(walletTransaction, "支付退款单 {} 钱包流水不能为空", outRefundNo); - return PayRefundRespDTO.successOf(walletTransaction.getNo(), walletTransaction.getCreateTime(), - outRefundNo, walletTransaction); - } - // 其它状态为无效状态 - log.error("[doGetRefund] 支付退款单 {} 的状态不正确", outRefundNo); - throw new IllegalStateException(String.format("支付退款单[%s] 状态不正确", outRefundNo)); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/config/PayWebConfiguration.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/config/PayWebConfiguration.java deleted file mode 100644 index c6c2ee90..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/config/PayWebConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.win.module.pay.framework.web.config; - -import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; -import org.springdoc.core.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * pay 模块的 web 组件的 Configuration - * - * @author 芋道源码 - */ -@Configuration(proxyBeanMethods = false) -public class PayWebConfiguration { - - /** - * pay 模块的 API 分组 - */ - @Bean - public GroupedOpenApi payGroupedOpenApi() { - return WinSwaggerAutoConfiguration.buildGroupedOpenApi("pay"); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/package-info.java deleted file mode 100644 index 124e26c3..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/framework/web/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * pay 模块的 web 配置 - */ -package com.win.module.pay.framework.web; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/notify/PayNotifyJob.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/notify/PayNotifyJob.java deleted file mode 100644 index c0b0c1ae..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/notify/PayNotifyJob.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.job.notify; - -import com.win.framework.quartz.core.handler.JobHandler; -import com.win.framework.tenant.core.job.TenantJob; -import com.win.module.pay.service.notify.PayNotifyService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 支付通知 Job - * 通过不断扫描待通知的 PayNotifyTaskDO 记录,回调业务线的回调接口 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class PayNotifyJob implements JobHandler { - - @Resource - private PayNotifyService payNotifyService; - - @Override - @TenantJob - public String execute(String param) throws Exception { - int notifyCount = payNotifyService.executeNotify(); - return String.format("执行支付通知 %s 个", notifyCount); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderExpireJob.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderExpireJob.java deleted file mode 100644 index ad59b670..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderExpireJob.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.job.order; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.quartz.core.handler.JobHandler; -import com.win.framework.tenant.core.job.TenantJob; -import com.win.module.pay.service.order.PayOrderService; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 支付订单的过期 Job - * - * 支付超过过期时间时,支付渠道是不会通知进行过期,所以需要定时进行过期关闭。 - * - * @author 芋道源码 - */ -@Component -public class PayOrderExpireJob implements JobHandler { - - @Resource - private PayOrderService orderService; - - @Override - @TenantJob - public String execute(String param) { - int count = orderService.expireOrder(); - return StrUtil.format("支付过期 {} 个", count); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderSyncJob.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderSyncJob.java deleted file mode 100644 index dd06dcc1..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/order/PayOrderSyncJob.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.win.module.pay.job.order; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.quartz.core.handler.JobHandler; -import com.win.framework.tenant.core.job.TenantJob; -import com.win.module.pay.service.order.PayOrderService; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.time.Duration; -import java.time.LocalDateTime; - -/** - * 支付订单的同步 Job - * - * 由于支付订单的状态,是由支付渠道异步通知进行同步,考虑到异步通知可能会失败(小概率),所以需要定时进行同步。 - * - * @author 芋道源码 - */ -@Component -public class PayOrderSyncJob implements JobHandler { - - /** - * 同步创建时间在 N 分钟之前的订单 - * - * 为什么同步 10 分钟之前的订单? - * 因为一个订单发起支付,到支付成功,大多数在 10 分钟内,需要保证轮询到。 - * 如果设置为 30、60 或者更大时间范围,会导致轮询的订单太多,影响性能。当然,你也可以根据自己的业务情况来处理。 - */ - private static final Duration CREATE_TIME_DURATION_BEFORE = Duration.ofMinutes(10); - - @Resource - private PayOrderService orderService; - - @Override - @TenantJob - public String execute(String param) { - LocalDateTime minCreateTime = LocalDateTime.now().minus(CREATE_TIME_DURATION_BEFORE); - int count = orderService.syncOrder(minCreateTime); - return StrUtil.format("同步支付订单 {} 个", count); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/refund/PayRefundSyncJob.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/refund/PayRefundSyncJob.java deleted file mode 100644 index 5b2eea61..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/job/refund/PayRefundSyncJob.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.win.module.pay.job.refund; - -import cn.hutool.core.util.StrUtil; -import com.win.framework.quartz.core.handler.JobHandler; -import com.win.framework.tenant.core.job.TenantJob; -import com.win.module.pay.service.refund.PayRefundService; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 退款订单的同步 Job - * - * 由于退款订单的状态,是由支付渠道异步通知进行同步,考虑到异步通知可能会失败(小概率),所以需要定时进行同步。 - * - * @author 芋道源码 - */ -@Component -public class PayRefundSyncJob implements JobHandler { - - @Resource - private PayRefundService refundService; - - @Override - @TenantJob - public String execute(String param) { - int count = refundService.syncRefund(); - return StrUtil.format("同步退款订单 {} 个", count); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/package-info.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/package-info.java deleted file mode 100644 index feaf5253..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/package-info.java +++ /dev/null @@ -1,10 +0,0 @@ -/** - * pay 模块,我们放支付业务,提供业务的支付能力。 - * 例如说:商户、应用、支付、退款等等 - * - * 1. Controller URL:以 /pay/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 pay_ 开头,方便在数据库中区分 - * - * 注意,由于 Pay 模块和 Trade 模块,容易重名,所以类名都加载 Pay 的前缀~ - */ -package com.win.module.pay; diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppService.java deleted file mode 100644 index fa4ce1af..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppService.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.win.module.pay.service.app; - -import com.win.framework.common.exception.ServiceException; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.collection.CollectionUtils; -import com.win.module.pay.controller.admin.app.vo.PayAppCreateReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppPageReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 支付应用 Service 接口 - * - * @author 芋艿 - */ -public interface PayAppService { - - /** - * 创建支付应用 - * - * @param createReqVO 创建 - * @return 编号 - */ - Long createApp(@Valid PayAppCreateReqVO createReqVO); - - /** - * 更新支付应用 - * - * @param updateReqVO 更新 - */ - void updateApp(@Valid PayAppUpdateReqVO updateReqVO); - - /** - * 修改应用状态 - * - * @param id 应用编号 - * @param status 状态 - */ - void updateAppStatus(Long id, Integer status); - - /** - * 删除支付应用 - * - * @param id 编号 - */ - void deleteApp(Long id); - - /** - * 获得支付应用 - * - * @param id 编号 - * @return 支付应用 - */ - PayAppDO getApp(Long id); - - /** - * 获得支付应用列表 - * - * @param ids 编号 - * @return 支付应用列表 - */ - List getAppList(Collection ids); - - /** - * 获得支付应用列表 - * - * @return 支付应用列表 - */ - List getAppList(); - - /** - * 获得支付应用分页 - * - * @param pageReqVO 分页查询 - * @return 支付应用分页 - */ - PageResult getAppPage(PayAppPageReqVO pageReqVO); - - /** - * 获得指定编号的商户 Map - * - * @param ids 应用编号集合 - * @return 商户 Map - */ - default Map getAppMap(Collection ids) { - List list = getAppList(ids); - return CollectionUtils.convertMap(list, PayAppDO::getId); - } - - /** - * 支付应用的合法性 - * - * 如果不合法,抛出 {@link ServiceException} 业务异常 - * - * @param id 应用编号 - * @return 应用 - */ - PayAppDO validPayApp(Long id); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppServiceImpl.java deleted file mode 100644 index c094d12d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/app/PayAppServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.win.module.pay.service.app; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.admin.app.vo.PayAppCreateReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppPageReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; -import com.win.module.pay.convert.app.PayAppConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.mysql.app.PayAppMapper; -import com.win.module.pay.enums.ErrorCodeConstants; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -import org.springframework.context.annotation.Lazy; -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 com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.pay.enums.ErrorCodeConstants.*; - -/** - * 支付应用 Service 实现类 - * - * @author aquan - */ -@Service -@Validated -public class PayAppServiceImpl implements PayAppService { - - @Resource - private PayAppMapper appMapper; - - @Resource - @Lazy // 延迟加载,避免循环依赖报错 - private PayOrderService orderService; - @Resource - @Lazy // 延迟加载,避免循环依赖报错 - private PayRefundService refundService; - - @Override - public Long createApp(PayAppCreateReqVO createReqVO) { - // 插入 - PayAppDO app = PayAppConvert.INSTANCE.convert(createReqVO); - appMapper.insert(app); - // 返回 - return app.getId(); - } - - @Override - public void updateApp(PayAppUpdateReqVO updateReqVO) { - // 校验存在 - validateAppExists(updateReqVO.getId()); - // 更新 - PayAppDO updateObj = PayAppConvert.INSTANCE.convert(updateReqVO); - appMapper.updateById(updateObj); - } - - @Override - public void updateAppStatus(Long id, Integer status) { - // 校验商户存在 - validateAppExists(id); - // 更新状态 - appMapper.updateById(new PayAppDO().setId(id).setStatus(status)); - } - - @Override - public void deleteApp(Long id) { - // 校验存在 - validateAppExists(id); - // 校验关联数据是否存在 - if (orderService.getOrderCountByAppId(id) > 0) { - throw exception(APP_EXIST_ORDER_CANT_DELETE); - } - if (refundService.getRefundCountByAppId(id) > 0) { - throw exception(APP_EXIST_REFUND_CANT_DELETE); - } - - // 删除 - appMapper.deleteById(id); - } - - private void validateAppExists(Long id) { - if (appMapper.selectById(id) == null) { - throw exception(APP_NOT_FOUND); - } - } - - @Override - public PayAppDO getApp(Long id) { - return appMapper.selectById(id); - } - - @Override - public List getAppList(Collection ids) { - return appMapper.selectBatchIds(ids); - } - - @Override - public List getAppList() { - return appMapper.selectList(); - } - - @Override - public PageResult getAppPage(PayAppPageReqVO pageReqVO) { - return appMapper.selectPage(pageReqVO); - } - - @Override - public PayAppDO validPayApp(Long id) { - PayAppDO app = appMapper.selectById(id); - // 校验是否存在 - if (app == null) { - throw exception(ErrorCodeConstants.APP_NOT_FOUND); - } - // 校验是否禁用 - if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) { - throw exception(ErrorCodeConstants.APP_IS_DISABLE); - } - return app; - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelService.java deleted file mode 100644 index 89250d0c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelService.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.win.module.pay.service.channel; - -import com.win.framework.common.exception.ServiceException; -import com.win.framework.pay.core.client.PayClient; -import com.win.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 支付渠道 Service 接口 - * - * @author aquan - */ -public interface PayChannelService { - - /** - * 创建支付渠道 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createChannel(@Valid PayChannelCreateReqVO createReqVO); - - /** - * 更新支付渠道 - * - * @param updateReqVO 更新信息 - */ - void updateChannel(@Valid PayChannelUpdateReqVO updateReqVO); - - /** - * 删除支付渠道 - * - * @param id 编号 - */ - void deleteChannel(Long id); - - /** - * 获得支付渠道 - * - * @param id 编号 - * @return 支付渠道 - */ - PayChannelDO getChannel(Long id); - - /** - * 根据支付应用 ID 集合,获得支付渠道列表 - * - * @param appIds 应用编号集合 - * @return 支付渠道列表 - */ - List getChannelListByAppIds(Collection appIds); - - /** - * 根据条件获取渠道 - * - * @param appId 应用编号 - * @param code 渠道编码 - * @return 数量 - */ - PayChannelDO getChannelByAppIdAndCode(Long appId, String code); - - /** - * 支付渠道的合法性 - * - * 如果不合法,抛出 {@link ServiceException} 业务异常 - * - * @param id 渠道编号 - * @return 渠道信息 - */ - PayChannelDO validPayChannel(Long id); - - /** - * 支付渠道的合法性 - * - * 如果不合法,抛出 {@link ServiceException} 业务异常 - * - * @param appId 应用编号 - * @param code 支付渠道 - * @return 渠道信息 - */ - PayChannelDO validPayChannel(Long appId, String code); - - /** - * 获得指定应用的开启的渠道列表 - * - * @param appId 应用编号 - * @return 渠道列表 - */ - List getEnableChannelList(Long appId); - - /** - * 获得指定编号的支付客户端 - * - * @param id 编号 - * @return 支付客户端 - */ - PayClient getPayClient(Long id); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelServiceImpl.java deleted file mode 100644 index 40b3631d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/channel/PayChannelServiceImpl.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.win.module.pay.service.channel; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjectUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.PayClientConfig; -import com.win.framework.pay.core.client.PayClientFactory; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; -import com.win.module.pay.convert.channel.PayChannelConvert; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.mysql.channel.PayChannelMapper; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import javax.validation.Validator; -import java.time.Duration; -import java.util.Collection; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; -import static com.win.module.pay.enums.ErrorCodeConstants.*; - -/** - * 支付渠道 Service 实现类 - * - * @author aquan - */ -@Service -@Slf4j -@Validated -public class PayChannelServiceImpl implements PayChannelService { - - /** - * {@link PayClient} 缓存,通过它异步清空 smsClientFactory - */ - @Getter - private final LoadingCache clientCache = buildAsyncReloadingCache(Duration.ofSeconds(10L), - new CacheLoader() { - - @Override - public PayClient load(Long id) { - // 查询,然后尝试清空 - PayChannelDO channel = payChannelMapper.selectById(id); - if (channel != null) { - payClientFactory.createOrUpdatePayClient(channel.getId(), channel.getCode(), channel.getConfig()); - } - return payClientFactory.getPayClient(id); - } - - }); - - @Resource - private PayClientFactory payClientFactory; - - @Resource - private PayChannelMapper payChannelMapper; - - @Resource - private Validator validator; - - @Override - public Long createChannel(PayChannelCreateReqVO reqVO) { - // 断言是否有重复的 - PayChannelDO dbChannel = getChannelByAppIdAndCode(reqVO.getAppId(), reqVO.getCode()); - if (dbChannel != null) { - throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR); - } - - // 新增渠道 - PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO) - .setConfig(parseConfig(reqVO.getCode(), reqVO.getConfig())); - payChannelMapper.insert(channel); - return channel.getId(); - } - - @Override - public void updateChannel(PayChannelUpdateReqVO updateReqVO) { - // 校验存在 - PayChannelDO dbChannel = validateChannelExists(updateReqVO.getId()); - - // 更新 - PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO) - .setConfig(parseConfig(dbChannel.getCode(), updateReqVO.getConfig())); - payChannelMapper.updateById(channel); - - // 清空缓存 - clearCache(channel.getId()); - } - - /** - * 解析并校验配置 - * - * @param code 渠道编码 - * @param configStr 配置 - * @return 支付配置 - */ - private PayClientConfig parseConfig(String code, String configStr) { - // 解析配置 - Class payClass = PayChannelEnum.getByCode(code).getConfigClass(); - if (ObjectUtil.isNull(payClass)) { - throw exception(CHANNEL_NOT_FOUND); - } - PayClientConfig config = JsonUtils.parseObject2(configStr, payClass); - Assert.notNull(config); - - // 验证参数 - config.validate(validator); - return config; - } - - @Override - public void deleteChannel(Long id) { - // 校验存在 - validateChannelExists(id); - - // 删除 - payChannelMapper.deleteById(id); - - // 清空缓存 - clearCache(id); - } - - /** - * 删除缓存 - * - * @param id 渠道编号 - */ - private void clearCache(Long id) { - clientCache.invalidate(id); - } - - private PayChannelDO validateChannelExists(Long id) { - PayChannelDO channel = payChannelMapper.selectById(id); - if (channel == null) { - throw exception(CHANNEL_NOT_FOUND); - } - return channel; - } - - @Override - public PayChannelDO getChannel(Long id) { - return payChannelMapper.selectById(id); - } - - @Override - public List getChannelListByAppIds(Collection appIds) { - return payChannelMapper.selectListByAppIds(appIds); - } - - @Override - public PayChannelDO getChannelByAppIdAndCode(Long appId, String code) { - return payChannelMapper.selectByAppIdAndCode(appId, code); - } - - @Override - public PayChannelDO validPayChannel(Long id) { - PayChannelDO channel = payChannelMapper.selectById(id); - validPayChannel(channel); - return channel; - } - - @Override - public PayChannelDO validPayChannel(Long appId, String code) { - PayChannelDO channel = payChannelMapper.selectByAppIdAndCode(appId, code); - validPayChannel(channel); - return channel; - } - - private void validPayChannel(PayChannelDO channel) { - if (channel == null) { - throw exception(CHANNEL_NOT_FOUND); - } - if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) { - throw exception(CHANNEL_IS_DISABLE); - } - } - - @Override - public List getEnableChannelList(Long appId) { - return payChannelMapper.selectListByAppId(appId, CommonStatusEnum.ENABLE.getStatus()); - } - - @Override - public PayClient getPayClient(Long id) { - return clientCache.getUnchecked(id); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderService.java deleted file mode 100644 index 19c8522f..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderService.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.win.module.pay.service.demo; - -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO; -import com.win.module.pay.dal.dataobject.demo.PayDemoOrderDO; - -import javax.validation.Valid; - -/** - * 示例订单 Service 接口 - * - * @author 芋道源码 - */ -public interface PayDemoOrderService { - - /** - * 创建示例订单 - * - * @param userId 用户编号 - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDemoOrder(Long userId, @Valid PayDemoOrderCreateReqVO createReqVO); - - /** - * 获得示例订单 - * - * @param id 编号 - * @return 示例订单 - */ - PayDemoOrderDO getDemoOrder(Long id); - - /** - * 获得示例订单分页 - * - * @param pageReqVO 分页查询 - * @return 示例订单分页 - */ - PageResult getDemoOrderPage(PageParam pageReqVO); - - /** - * 更新示例订单为已支付 - * - * @param id 编号 - * @param payOrderId 支付订单号 - */ - void updateDemoOrderPaid(Long id, Long payOrderId); - - /** - * 发起示例订单的退款 - * - * @param id 编号 - * @param userIp 用户编号 - */ - void refundDemoOrder(Long id, String userIp); - - /** - * 更新示例订单为已退款 - * - * @param id 编号 - * @param payRefundId 退款订单号 - */ - void updateDemoOrderRefunded(Long id, Long payRefundId); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderServiceImpl.java deleted file mode 100644 index e00e8e87..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/demo/PayDemoOrderServiceImpl.java +++ /dev/null @@ -1,265 +0,0 @@ -package com.win.module.pay.service.demo; - -import cn.hutool.core.lang.Assert; -import com.win.framework.common.pojo.PageParam; -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.api.order.PayOrderApi; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.api.order.dto.PayOrderRespDTO; -import com.win.module.pay.api.refund.PayRefundApi; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.api.refund.dto.PayRefundRespDTO; -import com.win.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO; -import com.win.module.pay.dal.dataobject.demo.PayDemoOrderDO; -import com.win.module.pay.dal.mysql.demo.PayDemoOrderMapper; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.pay.enums.refund.PayRefundStatusEnum; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import static cn.hutool.core.util.ObjectUtil.*; -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.date.LocalDateTimeUtils.addTime; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.win.module.pay.enums.ErrorCodeConstants.*; - -/** - * 示例订单 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class PayDemoOrderServiceImpl implements PayDemoOrderService { - - /** - * 接入的实力应用编号 - * - * 从 [支付管理 -> 应用信息] 里添加 - */ - private static final Long PAY_APP_ID = 7L; - - /** - * 商品信息 Map - * - * key:商品编号 - * value:[商品名、商品价格] - */ - private final Map spuNames = new HashMap<>(); - - @Resource - private PayOrderApi payOrderApi; - @Resource - private PayRefundApi payRefundApi; - - @Resource - private PayDemoOrderMapper payDemoOrderMapper; - - public PayDemoOrderServiceImpl() { - spuNames.put(1L, new Object[]{"华为手机", 1}); - spuNames.put(2L, new Object[]{"小米电视", 10}); - spuNames.put(3L, new Object[]{"苹果手表", 100}); - spuNames.put(4L, new Object[]{"华硕笔记本", 1000}); - spuNames.put(5L, new Object[]{"蔚来汽车", 200000}); - } - - @Override - public Long createDemoOrder(Long userId, PayDemoOrderCreateReqVO createReqVO) { - // 1.1 获得商品 - Object[] spu = spuNames.get(createReqVO.getSpuId()); - Assert.notNull(spu, "商品({}) 不存在", createReqVO.getSpuId()); - String spuName = (String) spu[0]; - Integer price = (Integer) spu[1]; - // 1.2 插入 demo 订单 - PayDemoOrderDO demoOrder = new PayDemoOrderDO().setUserId(userId) - .setSpuId(createReqVO.getSpuId()).setSpuName(spuName) - .setPrice(price).setPayStatus(false).setRefundPrice(0); - payDemoOrderMapper.insert(demoOrder); - - // 2.1 创建支付单 - Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO() - .setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用 - .setMerchantOrderId(demoOrder.getId().toString()) // 业务的订单编号 - .setSubject(spuName).setBody("").setPrice(price) // 价格信息 - .setExpireTime(addTime(Duration.ofHours(2L)))); // 支付的过期时间 - // 2.2 更新支付单到 demo 订单 - payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(demoOrder.getId()) - .setPayOrderId(payOrderId)); - // 返回 - return demoOrder.getId(); - } - - @Override - public PayDemoOrderDO getDemoOrder(Long id) { - return payDemoOrderMapper.selectById(id); - } - - @Override - public PageResult getDemoOrderPage(PageParam pageReqVO) { - return payDemoOrderMapper.selectPage(pageReqVO); - } - - @Override - public void updateDemoOrderPaid(Long id, Long payOrderId) { - // 校验并获得支付订单(可支付) - PayOrderRespDTO payOrder = validateDemoOrderCanPaid(id, payOrderId); - - // 更新 PayDemoOrderDO 状态为已支付 - int updateCount = payDemoOrderMapper.updateByIdAndPayed(id, false, - new PayDemoOrderDO().setPayStatus(true).setPayTime(LocalDateTime.now()) - .setPayChannelCode(payOrder.getChannelCode())); - if (updateCount == 0) { - throw exception(DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); - } - } - - /** - * 校验交易订单满足被支付的条件 - * - * 1. 交易订单未支付 - * 2. 支付单已支付 - * - * @param id 交易订单编号 - * @param payOrderId 支付订单编号 - * @return 交易订单 - */ - private PayOrderRespDTO validateDemoOrderCanPaid(Long id, Long payOrderId) { - // 1.1 校验订单是否存在 - PayDemoOrderDO order = payDemoOrderMapper.selectById(id); - if (order == null) { - throw exception(DEMO_ORDER_NOT_FOUND); - } - // 1.2 校验订单未支付 - if (order.getPayStatus()) { - log.error("[validateDemoOrderCanPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]", - id, toJsonString(order)); - throw exception(DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); - } - // 1.3 校验支付订单匹配 - if (notEqual(order.getPayOrderId(), payOrderId)) { // 支付单号 - log.error("[validateDemoOrderCanPaid][order({}) 支付单不匹配({}),请进行处理!order 数据是:{}]", - id, payOrderId, toJsonString(order)); - throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); - } - - // 2.1 校验支付单是否存在 - PayOrderRespDTO payOrder = payOrderApi.getOrder(payOrderId); - if (payOrder == null) { - log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 不存在,请进行处理!]", id, payOrderId); - throw exception(ORDER_NOT_FOUND); - } - // 2.2 校验支付单已支付 - if (!PayOrderStatusEnum.isSuccess(payOrder.getStatus())) { - log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 未支付,请进行处理!payOrder 数据是:{}]", - id, payOrderId, toJsonString(payOrder)); - throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS); - } - // 2.3 校验支付金额一致 - if (notEqual(payOrder.getPrice(), order.getPrice())) { - log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]", - id, payOrderId, toJsonString(order), toJsonString(payOrder)); - throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH); - } - // 2.4 校验支付订单匹配(二次) - if (notEqual(payOrder.getMerchantOrderId(), id.toString())) { - log.error("[validateDemoOrderCanPaid][order({}) 支付单不匹配({}),请进行处理!payOrder 数据是:{}]", - id, payOrderId, toJsonString(payOrder)); - throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); - } - return payOrder; - } - - @Override - public void refundDemoOrder(Long id, String userIp) { - // 1. 校验订单是否可以退款 - PayDemoOrderDO order = validateDemoOrderCanRefund(id); - - // 2.1 生成退款单号 - // 一般来说,用户发起退款的时候,都会单独插入一个售后维权表,然后使用该表的 id 作为 refundId - // 这里我们是个简单的 demo,所以没有售后维权表,直接使用订单 id + "-refund" 来演示 - String refundId = order.getId() + "-refund"; - // 2.2 创建退款单 - Long payRefundId = payRefundApi.createRefund(new PayRefundCreateReqDTO() - .setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用 - .setMerchantOrderId(String.valueOf(order.getId())) // 支付单号 - .setMerchantRefundId(refundId) - .setReason("想退钱").setPrice(order.getPrice()));// 价格信息 - // 2.3 更新退款单到 demo 订单 - payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(id) - .setPayRefundId(payRefundId).setRefundPrice(order.getPrice())); - } - - private PayDemoOrderDO validateDemoOrderCanRefund(Long id) { - // 校验订单是否存在 - PayDemoOrderDO order = payDemoOrderMapper.selectById(id); - if (order == null) { - throw exception(DEMO_ORDER_NOT_FOUND); - } - // 校验订单是否支付 - if (!order.getPayStatus()) { - throw exception(DEMO_ORDER_REFUND_FAIL_NOT_PAID); - } - // 校验订单是否已退款 - if (order.getPayRefundId() != null) { - throw exception(DEMO_ORDER_REFUND_FAIL_REFUNDED); - } - return order; - } - - @Override - public void updateDemoOrderRefunded(Long id, Long payRefundId) { - // 1. 校验并获得退款订单(可退款) - PayRefundRespDTO payRefund = validateDemoOrderCanRefunded(id, payRefundId); - // 2.2 更新退款单到 demo 订单 - payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(id) - .setRefundTime(payRefund.getSuccessTime())); - } - - private PayRefundRespDTO validateDemoOrderCanRefunded(Long id, Long payRefundId) { - // 1.1 校验示例订单 - PayDemoOrderDO order = payDemoOrderMapper.selectById(id); - if (order == null) { - throw exception(DEMO_ORDER_NOT_FOUND); - } - // 1.2 校验退款订单匹配 - if (Objects.equals(order.getPayOrderId(), payRefundId)) { - log.error("[validateDemoOrderCanRefunded][order({}) 退款单不匹配({}),请进行处理!order 数据是:{}]", - id, payRefundId, toJsonString(order)); - throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR); - } - - // 2.1 校验退款订单 - PayRefundRespDTO payRefund = payRefundApi.getRefund(payRefundId); - if (payRefund == null) { - throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_NOT_FOUND); - } - // 2.2 - if (!PayRefundStatusEnum.isSuccess(payRefund.getStatus())) { - throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_NOT_SUCCESS); - } - // 2.3 校验退款金额一致 - if (notEqual(payRefund.getRefundPrice(), order.getPrice())) { - log.error("[validateDemoOrderCanRefunded][order({}) payRefund({}) 退款金额不匹配,请进行处理!order 数据是:{},payRefund 数据是:{}]", - id, payRefundId, toJsonString(order), toJsonString(payRefund)); - throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH); - } - // 2.4 校验退款订单匹配(二次) - if (notEqual(payRefund.getMerchantOrderId(), id.toString())) { - log.error("[validateDemoOrderCanRefunded][order({}) 退款单不匹配({}),请进行处理!payRefund 数据是:{}]", - id, payRefundId, toJsonString(payRefund)); - throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR); - } - return payRefund; - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyService.java deleted file mode 100644 index c97a197e..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyService.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.win.module.pay.service.notify; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyLogDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyTaskDO; - -import java.util.List; - -/** - * 回调通知 Service 接口 - * - * @author 芋道源码 - */ -public interface PayNotifyService { - - /** - * 创建回调通知任务 - * - * @param type 类型 - * @param dataId 数据编号 - */ - void createPayNotifyTask(Integer type, Long dataId); - - /** - * 执行回调通知 - * - * 注意,该方法提供给定时任务调用。目前是 win-server 进行调用 - * @return 通知数量 - */ - int executeNotify() throws InterruptedException; - - /** - * 获得回调通知 - * - * @param id 编号 - * @return 回调通知 - */ - PayNotifyTaskDO getNotifyTask(Long id); - - /** - * 获得回调通知分页 - * - * @param pageReqVO 分页查询 - * @return 回调通知分页 - */ - PageResult getNotifyTaskPage(PayNotifyTaskPageReqVO pageReqVO); - - /** - * 获得回调日志列表 - * - * @param taskId 任务编号 - * @return 日志列表 - */ - List getNotifyLogList(Long taskId); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyServiceImpl.java deleted file mode 100644 index 92323318..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/notify/PayNotifyServiceImpl.java +++ /dev/null @@ -1,295 +0,0 @@ -package com.win.module.pay.service.notify; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.exceptions.ExceptionUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.extra.spring.SpringUtil; -import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.date.DateUtils; -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.tenant.core.util.TenantUtils; -import com.win.module.pay.api.notify.dto.PayOrderNotifyReqDTO; -import com.win.module.pay.api.notify.dto.PayRefundNotifyReqDTO; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyLogDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyTaskDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.dal.mysql.notify.PayNotifyLogMapper; -import com.win.module.pay.dal.mysql.notify.PayNotifyTaskMapper; -import com.win.module.pay.dal.redis.notify.PayNotifyLockRedisDAO; -import com.win.module.pay.enums.notify.PayNotifyStatusEnum; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.addTime; -import static com.win.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR; - -/** - * 支付通知 Core Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Valid -@Slf4j -public class PayNotifyServiceImpl implements PayNotifyService { - - /** - * 通知超时时间,单位:秒 - */ - public static final int NOTIFY_TIMEOUT = 120; - /** - * {@link #NOTIFY_TIMEOUT} 的毫秒 - */ - public static final long NOTIFY_TIMEOUT_MILLIS = 120 * DateUtils.SECOND_MILLIS; - - @Resource - @Lazy // 循环依赖,避免报错 - private PayOrderService orderService; - @Resource - @Lazy // 循环依赖,避免报错 - private PayRefundService refundService; - - @Resource - private PayNotifyTaskMapper notifyTaskMapper; - @Resource - private PayNotifyLogMapper notifyLogMapper; - - @Resource(name = NOTIFY_THREAD_POOL_TASK_EXECUTOR) - private ThreadPoolTaskExecutor threadPoolTaskExecutor; - - @Resource - private PayNotifyLockRedisDAO notifyLockCoreRedisDAO; - - @Override - @Transactional(rollbackFor = Exception.class) - public void createPayNotifyTask(Integer type, Long dataId) { - PayNotifyTaskDO task = new PayNotifyTaskDO().setType(type).setDataId(dataId); - task.setStatus(PayNotifyStatusEnum.WAITING.getStatus()).setNextNotifyTime(LocalDateTime.now()) - .setNotifyTimes(0).setMaxNotifyTimes(PayNotifyTaskDO.NOTIFY_FREQUENCY.length + 1); - // 补充 appId + notifyUrl 字段 - if (Objects.equals(task.getType(), PayNotifyTypeEnum.ORDER.getType())) { - PayOrderDO order = orderService.getOrder(task.getDataId()); // 不进行非空判断,有问题直接异常 - task.setAppId(order.getAppId()). - setMerchantOrderId(order.getMerchantOrderId()).setNotifyUrl(order.getNotifyUrl()); - } else if (Objects.equals(task.getType(), PayNotifyTypeEnum.REFUND.getType())) { - PayRefundDO refundDO = refundService.getRefund(task.getDataId()); - task.setAppId(refundDO.getAppId()) - .setMerchantOrderId(refundDO.getMerchantOrderId()).setNotifyUrl(refundDO.getNotifyUrl()); - } - - // 执行插入 - notifyTaskMapper.insert(task); - - // 必须在事务提交后,在发起任务,否则 PayNotifyTaskDO 还没入库,就提前回调接入的业务 - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - @Override - public void afterCommit() { - executeNotify(task); - } - }); - } - - @Override - public int executeNotify() throws InterruptedException { - // 获得需要通知的任务 - List tasks = notifyTaskMapper.selectListByNotify(); - if (CollUtil.isEmpty(tasks)) { - return 0; - } - - // 遍历,逐个通知 - CountDownLatch latch = new CountDownLatch(tasks.size()); - tasks.forEach(task -> threadPoolTaskExecutor.execute(() -> { - try { - executeNotify(task); - } finally { - latch.countDown(); - } - })); - // 等待完成 - awaitExecuteNotify(latch); - // 返回执行完成的任务数(成功 + 失败) - return tasks.size(); - } - - /** - * 等待全部支付通知的完成 - * 每 1 秒会打印一次剩余任务数量 - * - * @param latch Latch - * @throws InterruptedException 如果被打断 - */ - private void awaitExecuteNotify(CountDownLatch latch) throws InterruptedException { - long size = latch.getCount(); - for (int i = 0; i < NOTIFY_TIMEOUT; i++) { - if (latch.await(1L, TimeUnit.SECONDS)) { - return; - } - log.info("[awaitExecuteNotify][任务处理中, 总任务数({}) 剩余任务数({})]", size, latch.getCount()); - } - log.error("[awaitExecuteNotify][任务未处理完,总任务数({}) 剩余任务数({})]", size, latch.getCount()); - } - - /** - * 同步执行单个支付通知 - * - * @param task 通知任务 - */ - public void executeNotify(PayNotifyTaskDO task) { - // 分布式锁,避免并发问题 - notifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> { - // 校验,当前任务是否已经被通知过 - // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。 - // 因此,此处我们通过第 notifyTimes 通知次数是否匹配来判断 - PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId()); - if (ObjectUtil.notEqual(task.getNotifyTimes(), dbTask.getNotifyTimes())) { - log.warn("[executeNotifySync][task({}) 任务被忽略,原因是它的通知不是第 ({}) 次,可能是因为并发执行了]", - JsonUtils.toJsonString(task), dbTask.getNotifyTimes()); - return; - } - - // 执行通知 - getSelf().executeNotify0(dbTask); - }); - } - - @Transactional(rollbackFor = Exception.class) - public void executeNotify0(PayNotifyTaskDO task) { - // 发起回调 - CommonResult invokeResult = null; - Throwable invokeException = null; - try { - invokeResult = executeNotifyInvoke(task); - } catch (Throwable e) { - invokeException = e; - } - - // 处理结果 - Integer newStatus = processNotifyResult(task, invokeResult, invokeException); - - // 记录 PayNotifyLog 日志 - String response = invokeException != null ? ExceptionUtil.getRootCauseMessage(invokeException) : - JsonUtils.toJsonString(invokeResult); - notifyLogMapper.insert(PayNotifyLogDO.builder().taskId(task.getId()) - .notifyTimes(task.getNotifyTimes() + 1).status(newStatus).response(response).build()); - } - - /** - * 执行单个支付任务的 HTTP 调用 - * - * @param task 通知任务 - * @return HTTP 响应 - */ - private CommonResult executeNotifyInvoke(PayNotifyTaskDO task) { - // 拼接 body 参数 - Object request; - if (Objects.equals(task.getType(), PayNotifyTypeEnum.ORDER.getType())) { - request = PayOrderNotifyReqDTO.builder().merchantOrderId(task.getMerchantOrderId()) - .payOrderId(task.getDataId()).build(); - } else if (Objects.equals(task.getType(), PayNotifyTypeEnum.REFUND.getType())) { - request = PayRefundNotifyReqDTO.builder().merchantOrderId(task.getMerchantOrderId()) - .payRefundId(task.getDataId()).build(); - } else { - throw new RuntimeException("未知的通知任务类型:" + JsonUtils.toJsonString(task)); - } - // 拼接 header 参数 - Map headers = new HashMap<>(); - TenantUtils.addTenantHeader(headers, task.getTenantId()); - - // 发起请求 - try (HttpResponse response = HttpUtil.createPost(task.getNotifyUrl()) - .body(JsonUtils.toJsonString(request)).addHeaders(headers) - .timeout((int) NOTIFY_TIMEOUT_MILLIS).execute()) { - // 解析结果 - return JsonUtils.parseObject(response.body(), CommonResult.class); - } - } - - /** - * 处理并更新通知结果 - * - * @param task 通知任务 - * @param invokeResult 通知结果 - * @param invokeException 通知异常 - * @return 最终任务的状态 - */ - @VisibleForTesting - Integer processNotifyResult(PayNotifyTaskDO task, CommonResult invokeResult, Throwable invokeException) { - // 设置通用的更新 PayNotifyTaskDO 的字段 - PayNotifyTaskDO updateTask = new PayNotifyTaskDO() - .setId(task.getId()) - .setLastExecuteTime(LocalDateTime.now()) - .setNotifyTimes(task.getNotifyTimes() + 1); - - // 情况一:调用成功 - if (invokeResult != null && invokeResult.isSuccess()) { - updateTask.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus()); - notifyTaskMapper.updateById(updateTask); - return updateTask.getStatus(); - } - - // 情况二:调用失败、调用异常 - // 2.1 超过最大回调次数 - if (updateTask.getNotifyTimes() >= PayNotifyTaskDO.NOTIFY_FREQUENCY.length) { - updateTask.setStatus(PayNotifyStatusEnum.FAILURE.getStatus()); - notifyTaskMapper.updateById(updateTask); - return updateTask.getStatus(); - } - // 2.2 未超过最大回调次数 - updateTask.setNextNotifyTime(addTime(Duration.ofSeconds(PayNotifyTaskDO.NOTIFY_FREQUENCY[updateTask.getNotifyTimes()]))); - updateTask.setStatus(invokeException != null ? PayNotifyStatusEnum.REQUEST_FAILURE.getStatus() - : PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus()); - notifyTaskMapper.updateById(updateTask); - return updateTask.getStatus(); - } - - @Override - public PayNotifyTaskDO getNotifyTask(Long id) { - return notifyTaskMapper.selectById(id); - } - - @Override - public PageResult getNotifyTaskPage(PayNotifyTaskPageReqVO pageReqVO) { - return notifyTaskMapper.selectPage(pageReqVO); - } - - @Override - public List getNotifyLogList(Long taskId) { - return notifyLogMapper.selectListByTaskId(taskId); - } - - /** - * 获得自身的代理对象,解决 AOP 生效问题 - * - * @return 自己 - */ - private PayNotifyServiceImpl getSelf() { - return SpringUtil.getBean(getClass()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderService.java deleted file mode 100644 index 6f26fe51..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderService.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.win.module.pay.service.order; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.controller.admin.order.vo.PayOrderExportReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderPageReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 支付订单 Service 接口 - * - * @author aquan - */ -public interface PayOrderService { - - /** - * 获得支付订单 - * - * @param id 编号 - * @return 支付订单 - */ - PayOrderDO getOrder(Long id); - - /** - * 获得支付订单 - * - * @param appId 应用编号 - * @param merchantOrderId 商户订单编号 - * @return 支付订单 - */ - PayOrderDO getOrder(Long appId, String merchantOrderId); - - /** - * 获得指定应用的订单数量 - * - * @param appId 应用编号 - * @return 订单数量 - */ - Long getOrderCountByAppId(Long appId); - - /** - * 获得支付订单分页 - * - * @param pageReqVO 分页查询 - * @return 支付订单分页 - */ - PageResult getOrderPage(PayOrderPageReqVO pageReqVO); - - /** - * 获得支付订单列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 支付订单列表 - */ - List getOrderList(PayOrderExportReqVO exportReqVO); - - /** - * 创建支付单 - * - * @param reqDTO 创建请求 - * @return 支付单编号 - */ - Long createOrder(@Valid PayOrderCreateReqDTO reqDTO); - - /** - * 提交支付 - * 此时,会发起支付渠道的调用 - * - * @param reqVO 提交请求 - * @param userIp 提交 IP - * @return 提交结果 - */ - PayOrderSubmitRespVO submitOrder(@Valid PayOrderSubmitReqVO reqVO, - @NotEmpty(message = "提交 IP 不能为空") String userIp); - - /** - * 通知支付单成功 - * - * @param channelId 渠道编号 - * @param notify 通知 - */ - void notifyOrder(Long channelId, PayOrderRespDTO notify); - - /** - * 更新支付订单的退款金额 - * - * @param id 编号 - * @param incrRefundPrice 增加的退款金额 - */ - void updateOrderRefundPrice(Long id, Integer incrRefundPrice); - - /** - * 更新支付订单价格 - * - * @param payOrderId 支付单编号 - * @param payPrice 支付单价格 - */ - void updatePayOrderPriceById(Long payOrderId, Integer payPrice); - - /** - * 获得支付订单 - * - * @param id 编号 - * @return 支付订单 - */ - PayOrderExtensionDO getOrderExtension(Long id); - - /** - * 获得支付订单 - * - * @param no 支付订单 no - * @return 支付订单 - */ - PayOrderExtensionDO getOrderExtensionByNo(String no); - - /** - * 同步订单的支付状态 - * - * @param minCreateTime 最小创建时间 - * @return 同步到已支付的订单数量 - */ - int syncOrder(LocalDateTime minCreateTime); - - /** - * 将已过期的订单,状态修改为已关闭 - * - * @return 过期的订单数量 - */ - int expireOrder(); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderServiceImpl.java deleted file mode 100644 index 607ac05e..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/order/PayOrderServiceImpl.java +++ /dev/null @@ -1,563 +0,0 @@ -package com.win.module.pay.service.order; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.common.util.date.LocalDateTimeUtils; -import com.win.framework.common.util.number.MoneyUtils; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; -import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum; -import com.win.framework.tenant.core.util.TenantUtils; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.controller.admin.order.vo.PayOrderExportReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderPageReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO; -import com.win.module.pay.convert.order.PayOrderConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import com.win.module.pay.dal.mysql.order.PayOrderExtensionMapper; -import com.win.module.pay.dal.mysql.order.PayOrderMapper; -import com.win.module.pay.dal.redis.no.PayNoRedisDAO; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.pay.framework.pay.config.PayProperties; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.channel.PayChannelService; -import com.win.module.pay.service.notify.PayNotifyService; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static com.win.module.pay.enums.ErrorCodeConstants.*; - -/** - * 支付订单 Service 实现类 - * - * @author aquan - */ -@Service -@Validated -@Slf4j -public class PayOrderServiceImpl implements PayOrderService { - - @Resource - private PayProperties payProperties; - - @Resource - private PayOrderMapper orderMapper; - @Resource - private PayOrderExtensionMapper orderExtensionMapper; - @Resource - private PayNoRedisDAO noRedisDAO; - - @Resource - private PayAppService appService; - @Resource - private PayChannelService channelService; - @Resource - private PayNotifyService notifyService; - - @Override - public PayOrderDO getOrder(Long id) { - return orderMapper.selectById(id); - } - - @Override - public PayOrderDO getOrder(Long appId, String merchantOrderId) { - return orderMapper.selectByAppIdAndMerchantOrderId(appId, merchantOrderId); - } - - @Override - public Long getOrderCountByAppId(Long appId) { - return orderMapper.selectCountByAppId(appId); - } - - @Override - public PageResult getOrderPage(PayOrderPageReqVO pageReqVO) { - return orderMapper.selectPage(pageReqVO); - } - - @Override - public List getOrderList(PayOrderExportReqVO exportReqVO) { - return orderMapper.selectList(exportReqVO); - } - - @Override - public Long createOrder(PayOrderCreateReqDTO reqDTO) { - // 校验 App - PayAppDO app = appService.validPayApp(reqDTO.getAppId()); - - // 查询对应的支付交易单是否已经存在。如果是,则直接返回 - PayOrderDO order = orderMapper.selectByAppIdAndMerchantOrderId( - reqDTO.getAppId(), reqDTO.getMerchantOrderId()); - if (order != null) { - log.warn("[createOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(), - order.getMerchantOrderId(), toJsonString(order)); // 理论来说,不会出现这个情况 - return order.getId(); - } - - // 创建支付交易单 - order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId()) - // 商户相关字段 - .setNotifyUrl(app.getOrderNotifyUrl()) - // 订单相关字段 - .setStatus(PayOrderStatusEnum.WAITING.getStatus()) - // 退款相关字段 - .setRefundPrice(0); - orderMapper.insert(order); - return order.getId(); - } - - @Override // 注意,这里不能添加事务注解,避免调用支付渠道失败时,将 PayOrderExtensionDO 回滚了 - public PayOrderSubmitRespVO submitOrder(PayOrderSubmitReqVO reqVO, String userIp) { - // 1.1 获得 PayOrderDO ,并校验其是否存在 - PayOrderDO order = validateOrderCanSubmit(reqVO.getId()); - // 1.32 校验支付渠道是否有效 - PayChannelDO channel = validateChannelCanSubmit(order.getAppId(), reqVO.getChannelCode()); - PayClient client = channelService.getPayClient(channel.getId()); - - // 2. 插入 PayOrderExtensionDO - String no = noRedisDAO.generate(payProperties.getOrderNoPrefix()); - PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(reqVO, userIp) - .setOrderId(order.getId()).setNo(no) - .setChannelId(channel.getId()).setChannelCode(channel.getCode()) - .setStatus(PayOrderStatusEnum.WAITING.getStatus()); - orderExtensionMapper.insert(orderExtension); - - // 3. 调用三方接口 - PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderConvert.INSTANCE.convert2(reqVO, userIp) - // 商户相关的字段 - .setOutTradeNo(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性! - .setSubject(order.getSubject()).setBody(order.getBody()) - .setNotifyUrl(genChannelOrderNotifyUrl(channel)) - .setReturnUrl(reqVO.getReturnUrl()) - // 订单相关字段 - .setPrice(order.getPrice()).setExpireTime(order.getExpireTime()); - PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO); - - // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功 - if (unifiedOrderResp != null) { - getSelf().notifyOrder(channel, unifiedOrderResp); - // 如有渠道错误码,则抛出业务异常,提示用户 - if (StrUtil.isNotEmpty(unifiedOrderResp.getChannelErrorCode())) { - throw exception(ORDER_SUBMIT_CHANNEL_ERROR, unifiedOrderResp.getChannelErrorCode(), - unifiedOrderResp.getChannelErrorMsg()); - } - // 此处需要读取最新的状态 - order = orderMapper.selectById(order.getId()); - } - return PayOrderConvert.INSTANCE.convert(order, unifiedOrderResp); - } - - private PayOrderDO validateOrderCanSubmit(Long id) { - PayOrderDO order = orderMapper.selectById(id); - if (order == null) { // 是否存在 - throw exception(ORDER_NOT_FOUND); - } - if (PayOrderStatusEnum.isSuccess(order.getStatus())) { // 校验状态,发现已支付 - throw exception(ORDER_STATUS_IS_SUCCESS); - } - if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 - throw exception(ORDER_STATUS_IS_NOT_WAITING); - } - if (LocalDateTimeUtils.beforeNow(order.getExpireTime())) { // 校验是否过期 - throw exception(ORDER_IS_EXPIRED); - } - - // 【重要】校验是否支付拓展单已支付,只是没有回调、或者数据不正常 - validateOrderActuallyPaid(id); - return order; - } - - /** - * 校验支付订单实际已支付 - * - * @param id 支付编号 - */ - @VisibleForTesting - void validateOrderActuallyPaid(Long id) { - List orderExtensions = orderExtensionMapper.selectListByOrderId(id); - orderExtensions.forEach(orderExtension -> { - // 情况一:校验数据库中的 orderExtension 是不是已支付 - if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { - log.warn("[validateOrderCanSubmit][order({}) 的 extension({}) 已支付,可能是数据不一致]", - id, orderExtension.getId()); - throw exception(ORDER_EXTENSION_IS_PAID); - } - // 情况二:调用三方接口,查询支付单状态,是不是已支付 - PayClient payClient = channelService.getPayClient(orderExtension.getChannelId()); - if (payClient == null) { - log.error("[validateOrderCanSubmit][渠道编号({}) 找不到对应的支付客户端]", orderExtension.getChannelId()); - return; - } - PayOrderRespDTO respDTO = payClient.getOrder(orderExtension.getNo()); - if (respDTO != null && PayOrderStatusRespEnum.isSuccess(respDTO.getStatus())) { - log.warn("[validateOrderCanSubmit][order({}) 的 PayOrderRespDTO({}) 已支付,可能是回调延迟]", - id, toJsonString(respDTO)); - throw exception(ORDER_EXTENSION_IS_PAID); - } - }); - } - - private PayChannelDO validateChannelCanSubmit(Long appId, String channelCode) { - // 校验 App - appService.validPayApp(appId); - // 校验支付渠道是否有效 - PayChannelDO channel = channelService.validPayChannel(appId, channelCode); - PayClient client = channelService.getPayClient(channel.getId()); - if (client == null) { - log.error("[validatePayChannelCanSubmit][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); - throw exception(CHANNEL_NOT_FOUND); - } - return channel; - } - - /** - * 根据支付渠道的编码,生成支付渠道的回调地址 - * - * @param channel 支付渠道 - * @return 支付渠道的回调地址 配置地址 + "/" + channel id - */ - private String genChannelOrderNotifyUrl(PayChannelDO channel) { - return payProperties.getOrderNotifyUrl() + "/" + channel.getId(); - } - - @Override - public void notifyOrder(Long channelId, PayOrderRespDTO notify) { - // 校验支付渠道是否有效 - PayChannelDO channel = channelService.validPayChannel(channelId); - // 更新支付订单为已支付 - TenantUtils.execute(channel.getTenantId(), () -> getSelf().notifyOrder(channel, notify)); - } - - /** - * 通知并更新订单的支付结果 - * - * @param channel 支付渠道 - * @param notify 通知 - */ - @Transactional(rollbackFor = Exception.class) // 注意,如果是方法内调用该方法,需要通过 getSelf().notifyPayOrder(channel, notify) 调用,否则事务不生效 - public void notifyOrder(PayChannelDO channel, PayOrderRespDTO notify) { - // 情况一:支付成功的回调 - if (PayOrderStatusRespEnum.isSuccess(notify.getStatus())) { - notifyOrderSuccess(channel, notify); - return; - } - // 情况二:支付失败的回调 - if (PayOrderStatusRespEnum.isClosed(notify.getStatus())) { - notifyOrderClosed(channel, notify); - } - // 情况三:WAITING:无需处理 - // 情况四:REFUND:通过退款回调处理 - } - - private void notifyOrderSuccess(PayChannelDO channel, PayOrderRespDTO notify) { - // 1. 更新 PayOrderExtensionDO 支付成功 - PayOrderExtensionDO orderExtension = updateOrderSuccess(notify); - // 2. 更新 PayOrderDO 支付成功 - Boolean paid = updateOrderSuccess(channel, orderExtension, notify); - if (paid) { // 如果之前已经成功回调,则直接返回,不用重复记录支付通知记录;例如说:支付平台重复回调 - return; - } - - // 3. 插入支付通知记录 - notifyService.createPayNotifyTask(PayNotifyTypeEnum.ORDER.getType(), - orderExtension.getOrderId()); - } - - /** - * 更新 PayOrderExtensionDO 支付成功 - * - * @param notify 通知 - * @return PayOrderExtensionDO 对象 - */ - private PayOrderExtensionDO updateOrderSuccess(PayOrderRespDTO notify) { - // 1. 查询 PayOrderExtensionDO - PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(notify.getOutTradeNo()); - if (orderExtension == null) { - throw exception(ORDER_EXTENSION_NOT_FOUND); - } - if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { // 如果已经是成功,直接返回,不用重复更新 - log.info("[updateOrderExtensionSuccess][orderExtension({}) 已经是已支付,无需更新]", orderExtension.getId()); - return orderExtension; - } - if (ObjectUtil.notEqual(orderExtension.getStatus(), PayOrderStatusEnum.WAITING.getStatus())) { // 校验状态,必须是待支付 - throw exception(ORDER_EXTENSION_STATUS_IS_NOT_WAITING); - } - - // 2. 更新 PayOrderExtensionDO - int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(), orderExtension.getStatus(), - PayOrderExtensionDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(toJsonString(notify)).build()); - if (updateCounts == 0) { // 校验状态,必须是待支付 - throw exception(ORDER_EXTENSION_STATUS_IS_NOT_WAITING); - } - log.info("[updateOrderExtensionSuccess][orderExtension({}) 更新为已支付]", orderExtension.getId()); - return orderExtension; - } - - /** - * 更新 PayOrderDO 支付成功 - * - * @param channel 支付渠道 - * @param orderExtension 支付拓展单 - * @param notify 通知回调 - * @return 是否之前已经成功回调 - */ - private Boolean updateOrderSuccess(PayChannelDO channel, PayOrderExtensionDO orderExtension, - PayOrderRespDTO notify) { - // 1. 判断 PayOrderDO 是否处于待支付 - PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId()); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - if (PayOrderStatusEnum.isSuccess(order.getStatus()) // 如果已经是成功,直接返回,不用重复更新 - && Objects.equals(order.getExtensionId(), orderExtension.getId())) { - log.info("[updateOrderExtensionSuccess][order({}) 已经是已支付,无需更新]", order.getId()); - return true; - } - if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 - throw exception(ORDER_STATUS_IS_NOT_WAITING); - } - - // 2. 更新 PayOrderDO - int updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(), - PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus()) - .channelId(channel.getId()).channelCode(channel.getCode()) - .successTime(notify.getSuccessTime()).extensionId(orderExtension.getId()).no(orderExtension.getNo()) - .channelOrderNo(notify.getChannelOrderNo()).channelUserId(notify.getChannelUserId()) - .channelFeeRate(channel.getFeeRate()) - .channelFeePrice(MoneyUtils.calculateRatePrice(order.getPrice(), channel.getFeeRate())) - .build()); - if (updateCounts == 0) { // 校验状态,必须是待支付 - throw exception(ORDER_STATUS_IS_NOT_WAITING); - } - log.info("[updateOrderExtensionSuccess][order({}) 更新为已支付]", order.getId()); - return false; - } - - private void notifyOrderClosed(PayChannelDO channel, PayOrderRespDTO notify) { - updateOrderExtensionClosed(channel, notify); - } - - private void updateOrderExtensionClosed(PayChannelDO channel, PayOrderRespDTO notify) { - // 1. 查询 PayOrderExtensionDO - PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(notify.getOutTradeNo()); - if (orderExtension == null) { - throw exception(ORDER_EXTENSION_NOT_FOUND); - } - if (PayOrderStatusEnum.isClosed(orderExtension.getStatus())) { // 如果已经是关闭,直接返回,不用重复更新 - log.info("[updateOrderExtensionClosed][orderExtension({}) 已经是支付关闭,无需更新]", orderExtension.getId()); - return; - } - // 一般出现先是支付成功,然后支付关闭,都是全部退款导致关闭的场景。这个情况,我们不更新支付拓展单,只通过退款流程,更新支付单 - if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { - log.info("[updateOrderExtensionClosed][orderExtension({}) 是已支付,无需更新为支付关闭]", orderExtension.getId()); - return; - } - if (ObjectUtil.notEqual(orderExtension.getStatus(), PayOrderStatusEnum.WAITING.getStatus())) { // 校验状态,必须是待支付 - throw exception(ORDER_EXTENSION_STATUS_IS_NOT_WAITING); - } - - // 2. 更新 PayOrderExtensionDO - int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(), orderExtension.getStatus(), - PayOrderExtensionDO.builder().status(PayOrderStatusEnum.CLOSED.getStatus()).channelNotifyData(toJsonString(notify)) - .channelErrorCode(notify.getChannelErrorCode()).channelErrorMsg(notify.getChannelErrorMsg()).build()); - if (updateCounts == 0) { // 校验状态,必须是待支付 - throw exception(ORDER_EXTENSION_STATUS_IS_NOT_WAITING); - } - log.info("[updateOrderExtensionClosed][orderExtension({}) 更新为支付关闭]", orderExtension.getId()); - } - - @Override - public void updateOrderRefundPrice(Long id, Integer incrRefundPrice) { - PayOrderDO order = orderMapper.selectById(id); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - if (!PayOrderStatusEnum.isSuccessOrRefund(order.getStatus())) { - throw exception(ORDER_REFUND_FAIL_STATUS_ERROR); - } - if (order.getRefundPrice() + incrRefundPrice > order.getPrice()) { - throw exception(REFUND_PRICE_EXCEED); - } - - // 更新订单 - PayOrderDO updateObj = new PayOrderDO() - .setRefundPrice(order.getRefundPrice() + incrRefundPrice) - .setStatus(PayOrderStatusEnum.REFUND.getStatus()); - int updateCount = orderMapper.updateByIdAndStatus(id, order.getStatus(), updateObj); - if (updateCount == 0) { - throw exception(ORDER_REFUND_FAIL_STATUS_ERROR); - } - } - - @Override - public void updatePayOrderPriceById(Long payOrderId, Integer payPrice) { - // TODO @puhui999:不能直接这样修改哈;应该只有未支付状态的订单才可以改;另外,如果价格如果没变,可以直接 return 哈; - PayOrderDO order = orderMapper.selectById(payOrderId); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - - order.setPrice(payPrice); - orderMapper.updateById(order); - } - - @Override - public PayOrderExtensionDO getOrderExtension(Long id) { - return orderExtensionMapper.selectById(id); - } - - @Override - public PayOrderExtensionDO getOrderExtensionByNo(String no) { - return orderExtensionMapper.selectByNo(no); - } - - @Override - public int syncOrder(LocalDateTime minCreateTime) { - // 1. 查询指定创建时间内的待支付订单 - List orderExtensions = orderExtensionMapper.selectListByStatusAndCreateTimeGe( - PayOrderStatusEnum.WAITING.getStatus(), minCreateTime); - if (CollUtil.isEmpty(orderExtensions)) { - return 0; - } - // 2. 遍历执行 - int count = 0; - for (PayOrderExtensionDO orderExtension : orderExtensions) { - count += syncOrder(orderExtension) ? 1 : 0; - } - return count; - } - - /** - * 同步单个支付拓展单 - * - * @param orderExtension 支付拓展单 - * @return 是否已支付 - */ - private boolean syncOrder(PayOrderExtensionDO orderExtension) { - try { - // 1.1 查询支付订单信息 - PayClient payClient = channelService.getPayClient(orderExtension.getChannelId()); - if (payClient == null) { - log.error("[syncOrder][渠道编号({}) 找不到对应的支付客户端]", orderExtension.getChannelId()); - return false; - } - PayOrderRespDTO respDTO = payClient.getOrder(orderExtension.getNo()); - // 1.2 回调支付结果 - notifyOrder(orderExtension.getChannelId(), respDTO); - - // 2. 如果是已支付,则返回 true - return PayOrderStatusRespEnum.isSuccess(respDTO.getStatus()); - } catch (Throwable e) { - log.error("[syncOrder][orderExtension({}) 同步支付状态异常]", orderExtension.getId(), e); - return false; - } - } - - @Override - public int expireOrder() { - // 1. 查询过期的待支付订单 - List orders = orderMapper.selectListByStatusAndExpireTimeLt( - PayOrderStatusEnum.WAITING.getStatus(), LocalDateTime.now()); - if (CollUtil.isEmpty(orders)) { - return 0; - } - - // 2. 遍历执行 - int count = 0; - for (PayOrderDO order : orders) { - count += expireOrder(order) ? 1 : 0; - } - return count; - } - - /** - * 同步单个支付单 - * - * @param order 支付单 - * @return 是否已过期 - */ - private boolean expireOrder(PayOrderDO order) { - try { - // 1. 需要先处理关联的支付拓展单,避免错误的过期已支付 or 已退款的订单 - List orderExtensions = orderExtensionMapper.selectListByOrderId(order.getId()); - for (PayOrderExtensionDO orderExtension : orderExtensions) { - if (PayOrderStatusEnum.isClosed(orderExtension.getStatus())) { - continue; - } - // 情况一:校验数据库中的 orderExtension 是不是已支付 - if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { - log.error("[expireOrder][order({}) 的 extension({}) 已支付,可能是数据不一致]", - order.getId(), orderExtension.getId()); - return false; - } - // 情况二:调用三方接口,查询支付单状态,是不是已支付/已退款 - PayClient payClient = channelService.getPayClient(orderExtension.getChannelId()); - if (payClient == null) { - log.error("[expireOrder][渠道编号({}) 找不到对应的支付客户端]", orderExtension.getChannelId()); - return false; - } - PayOrderRespDTO respDTO = payClient.getOrder(orderExtension.getNo()); - if (PayOrderStatusRespEnum.isRefund(respDTO.getStatus())) { - // 补充说明:按道理,应该是 WAITING => SUCCESS => REFUND 状态,如果直接 WAITING => REFUND 状态,说明中间丢了过程 - // 此时,需要人工介入,手工补齐数据,保持 WAITING => SUCCESS => REFUND 的过程 - log.error("[expireOrder][extension({}) 的 PayOrderRespDTO({}) 已退款,可能是回调延迟]", - orderExtension.getId(), toJsonString(respDTO)); - return false; - } - if (PayOrderStatusRespEnum.isSuccess(respDTO.getStatus())) { - notifyOrder(orderExtension.getChannelId(), respDTO); - return false; - } - // 兜底逻辑:将支付拓展单更新为已关闭 - PayOrderExtensionDO updateObj = new PayOrderExtensionDO().setStatus(PayOrderStatusEnum.CLOSED.getStatus()) - .setChannelNotifyData(toJsonString(respDTO)); - if (orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(), PayOrderStatusEnum.WAITING.getStatus(), - updateObj) == 0) { - log.error("[expireOrder][extension({}) 更新为支付关闭失败]", orderExtension.getId()); - return false; - } - log.info("[expireOrder][extension({}) 更新为支付关闭成功]", orderExtension.getId()); - } - - // 2. 都没有上述情况,可以安心更新为已关闭 - PayOrderDO updateObj = new PayOrderDO().setStatus(PayOrderStatusEnum.CLOSED.getStatus()); - if (orderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateObj) == 0) { - log.error("[expireOrder][order({}) 更新为支付关闭失败]", order.getId()); - return false; - } - log.info("[expireOrder][order({}) 更新为支付关闭失败]", order.getId()); - return true; - } catch (Throwable e) { - log.error("[expireOrder][order({}) 过期订单异常]", order.getId(), e); - return false; - } - } - - /** - * 获得自身的代理对象,解决 AOP 生效问题 - * - * @return 自己 - */ - private PayOrderServiceImpl getSelf() { - return SpringUtil.getBean(getClass()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundService.java deleted file mode 100644 index aea027f1..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.win.module.pay.service.refund; - -import com.win.framework.common.pojo.PageResult; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; - -import java.util.List; - -/** - * 退款订单 Service 接口 - * - * @author aquan - */ -public interface PayRefundService { - - /** - * 获得退款订单 - * - * @param id 编号 - * @return 退款订单 - */ - PayRefundDO getRefund(Long id); - - /** - * 获得退款订单 - * - * @param no 外部退款单号 - * @return 退款订单 - */ - PayRefundDO getRefundByNo(String no); - - /** - * 获得指定应用的退款数量 - * - * @param appId 应用编号 - * @return 退款数量 - */ - Long getRefundCountByAppId(Long appId); - - /** - * 获得退款订单分页 - * - * @param pageReqVO 分页查询 - * @return 退款订单分页 - */ - PageResult getRefundPage(PayRefundPageReqVO pageReqVO); - - /** - * 获得退款订单列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 退款订单列表 - */ - List getRefundList(PayRefundExportReqVO exportReqVO); - - /** - * 创建退款申请 - * - * @param reqDTO 退款申请信息 - * @return 退款单号 - */ - Long createPayRefund(PayRefundCreateReqDTO reqDTO); - - /** - * 渠道的退款通知 - * - * @param channelId 渠道编号 - * @param notify 通知 - */ - void notifyRefund(Long channelId, PayRefundRespDTO notify); - - /** - * 同步渠道退款的退款状态 - * - * @return 同步到状态的退款数量,包括退款成功、退款失败 - */ - int syncRefund(); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundServiceImpl.java deleted file mode 100644 index bdc6e00d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/refund/PayRefundServiceImpl.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.win.module.pay.service.refund; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.enums.refund.PayRefundStatusRespEnum; -import com.win.framework.tenant.core.util.TenantUtils; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; -import com.win.module.pay.convert.refund.PayRefundConvert; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.dal.mysql.refund.PayRefundMapper; -import com.win.module.pay.dal.redis.no.PayNoRedisDAO; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.pay.enums.refund.PayRefundStatusEnum; -import com.win.module.pay.framework.pay.config.PayProperties; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.channel.PayChannelService; -import com.win.module.pay.service.notify.PayNotifyService; -import com.win.module.pay.service.order.PayOrderService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static com.win.module.pay.enums.ErrorCodeConstants.*; - -/** - * 退款订单 Service 实现类 - * - * @author jason - */ -@Service -@Slf4j -@Validated -public class PayRefundServiceImpl implements PayRefundService { - - @Resource - private PayProperties payProperties; - - @Resource - private PayRefundMapper refundMapper; - @Resource - private PayNoRedisDAO noRedisDAO; - - @Resource - private PayOrderService orderService; - @Resource - private PayAppService appService; - @Resource - private PayChannelService channelService; - @Resource - private PayNotifyService notifyService; - - @Override - public PayRefundDO getRefund(Long id) { - return refundMapper.selectById(id); - } - - @Override - public PayRefundDO getRefundByNo(String no) { - return refundMapper.selectByNo(no); - } - - @Override - public Long getRefundCountByAppId(Long appId) { - return refundMapper.selectCountByAppId(appId); - } - - @Override - public PageResult getRefundPage(PayRefundPageReqVO pageReqVO) { - return refundMapper.selectPage(pageReqVO); - } - - @Override - public List getRefundList(PayRefundExportReqVO exportReqVO) { - return refundMapper.selectList(exportReqVO); - } - - @Override - public Long createPayRefund(PayRefundCreateReqDTO reqDTO) { - // 1.1 校验 App - PayAppDO app = appService.validPayApp(reqDTO.getAppId()); - // 1.2 校验支付订单 - PayOrderDO order = validatePayOrderCanRefund(reqDTO); - // 1.3 校验支付渠道是否有效 - PayChannelDO channel = channelService.validPayChannel(order.getChannelId()); - PayClient client = channelService.getPayClient(channel.getId()); - if (client == null) { - log.error("[refund][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); - throw exception(CHANNEL_NOT_FOUND); - } - // 1.4 校验退款订单是否已经存在 - PayRefundDO refund = refundMapper.selectByAppIdAndMerchantRefundId( - app.getId(), reqDTO.getMerchantRefundId()); - if (refund != null) { - throw exception(REFUND_EXISTS); - } - - // 2.1 插入退款单 - String no = noRedisDAO.generate(payProperties.getRefundNoPrefix()); - refund = PayRefundConvert.INSTANCE.convert(reqDTO) - .setNo(no).setOrderId(order.getId()).setOrderNo(order.getNo()) - .setChannelId(order.getChannelId()).setChannelCode(order.getChannelCode()) - // 商户相关的字段 - .setNotifyUrl(app.getRefundNotifyUrl()) - // 渠道相关字段 - .setChannelOrderNo(order.getChannelOrderNo()) - // 退款相关字段 - .setStatus(PayRefundStatusEnum.WAITING.getStatus()) - .setPayPrice(order.getPrice()).setRefundPrice(reqDTO.getPrice()); - refundMapper.insert(refund); - try { - // 2.2 向渠道发起退款申请 - PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO() - .setPayPrice(order.getPrice()) - .setRefundPrice(reqDTO.getPrice()) - .setOutTradeNo(order.getNo()) - .setOutRefundNo(refund.getNo()) - .setNotifyUrl(genChannelRefundNotifyUrl(channel)) - .setReason(reqDTO.getReason()); - PayRefundRespDTO refundRespDTO = client.unifiedRefund(unifiedReqDTO); - // 2.3 处理退款返回 - getSelf().notifyRefund(channel, refundRespDTO); - } catch (Throwable e) { - // 注意:这里仅打印异常,不进行抛出。 - // 原因是:虽然调用支付渠道进行退款发生异常(网络请求超时),实际退款成功。这个结果,后续通过退款回调、或者退款轮询补偿可以拿到。 - // 最终,在异常的情况下,支付中心会异步回调业务的退款回调接口,提供退款结果 - log.error("[createPayRefund][退款 id({}) requestDTO({}) 发生异常]", - refund.getId(), reqDTO, e); - } - - // 返回退款编号 - return refund.getId(); - } - - /** - * 校验支付订单是否可以退款 - * - * @param reqDTO 退款申请信息 - * @return 支付订单 - */ - private PayOrderDO validatePayOrderCanRefund(PayRefundCreateReqDTO reqDTO) { - PayOrderDO order = orderService.getOrder(reqDTO.getAppId(), reqDTO.getMerchantOrderId()); - if (order == null) { - throw exception(ORDER_NOT_FOUND); - } - // 校验状态,必须是已支付、或者已退款 - if (!PayOrderStatusEnum.isSuccessOrRefund(order.getStatus())) { - throw exception(ORDER_REFUND_FAIL_STATUS_ERROR); - } - - // 校验金额,退款金额不能大于原定的金额 - if (reqDTO.getPrice() + order.getRefundPrice() > order.getPrice()){ - throw exception(REFUND_PRICE_EXCEED); - } - // 是否有退款中的订单 - if (refundMapper.selectCountByAppIdAndOrderId(reqDTO.getAppId(), order.getId(), - PayRefundStatusEnum.WAITING.getStatus()) > 0) { - throw exception(REFUND_HAS_REFUNDING); - } - return order; - } - - /** - * 根据支付渠道的编码,生成支付渠道的回调地址 - * - * @param channel 支付渠道 - * @return 支付渠道的回调地址 配置地址 + "/" + channel id - */ - private String genChannelRefundNotifyUrl(PayChannelDO channel) { - return payProperties.getRefundNotifyUrl() + "/" + channel.getId(); - } - - @Override - public void notifyRefund(Long channelId, PayRefundRespDTO notify) { - // 校验支付渠道是否有效 - PayChannelDO channel = channelService.validPayChannel(channelId); - // 更新退款订单 - TenantUtils.execute(channel.getTenantId(), () -> getSelf().notifyRefund(channel, notify)); - } - - /** - * 通知并更新订单的退款结果 - * - * @param channel 支付渠道 - * @param notify 通知 - */ - @Transactional(rollbackFor = Exception.class) // 注意,如果是方法内调用该方法,需要通过 getSelf().notifyRefund(channel, notify) 调用,否则事务不生效 - public void notifyRefund(PayChannelDO channel, PayRefundRespDTO notify) { - // 情况一:退款成功 - if (PayRefundStatusRespEnum.isSuccess(notify.getStatus())) { - notifyRefundSuccess(channel, notify); - return; - } - // 情况二:退款失败 - if (PayRefundStatusRespEnum.isFailure(notify.getStatus())) { - notifyRefundFailure(channel, notify); - } - } - - private void notifyRefundSuccess(PayChannelDO channel, PayRefundRespDTO notify) { - // 1.1 查询 PayRefundDO - PayRefundDO refund = refundMapper.selectByAppIdAndNo( - channel.getAppId(), notify.getOutRefundNo()); - if (refund == null) { - throw exception(REFUND_NOT_FOUND); - } - if (PayRefundStatusEnum.isSuccess(refund.getStatus())) { // 如果已经是成功,直接返回,不用重复更新 - log.info("[notifyRefundSuccess][退款订单({}) 已经是退款成功,无需更新]", refund.getId()); - return; - } - if (!PayRefundStatusEnum.WAITING.getStatus().equals(refund.getStatus())) { - throw exception(REFUND_STATUS_IS_NOT_WAITING); - } - // 1.2 更新 PayRefundDO - PayRefundDO updateRefundObj = new PayRefundDO() - .setSuccessTime(notify.getSuccessTime()) - .setChannelRefundNo(notify.getChannelRefundNo()) - .setStatus(PayRefundStatusEnum.SUCCESS.getStatus()) - .setChannelNotifyData(toJsonString(notify)); - int updateCounts = refundMapper.updateByIdAndStatus(refund.getId(), refund.getStatus(), updateRefundObj); - if (updateCounts == 0) { // 校验状态,必须是等待状态 - throw exception(REFUND_STATUS_IS_NOT_WAITING); - } - log.info("[notifyRefundSuccess][退款订单({}) 更新为退款成功]", refund.getId()); - - // 2. 更新订单 - orderService.updateOrderRefundPrice(refund.getOrderId(), refund.getRefundPrice()); - - // 3. 插入退款通知记录 - notifyService.createPayNotifyTask(PayNotifyTypeEnum.REFUND.getType(), - refund.getId()); - } - - private void notifyRefundFailure(PayChannelDO channel, PayRefundRespDTO notify) { - // 1.1 查询 PayRefundDO - PayRefundDO refund = refundMapper.selectByAppIdAndNo( - channel.getAppId(), notify.getOutRefundNo()); - if (refund == null) { - throw exception(REFUND_NOT_FOUND); - } - if (PayRefundStatusEnum.isFailure(refund.getStatus())) { // 如果已经是成功,直接返回,不用重复更新 - log.info("[notifyRefundSuccess][退款订单({}) 已经是退款关闭,无需更新]", refund.getId()); - return; - } - if (!PayRefundStatusEnum.WAITING.getStatus().equals(refund.getStatus())) { - throw exception(REFUND_STATUS_IS_NOT_WAITING); - } - // 1.2 更新 PayRefundDO - PayRefundDO updateRefundObj = new PayRefundDO() - .setChannelRefundNo(notify.getChannelRefundNo()) - .setStatus(PayRefundStatusEnum.FAILURE.getStatus()) - .setChannelNotifyData(toJsonString(notify)) - .setChannelErrorCode(notify.getChannelErrorCode()).setChannelErrorMsg(notify.getChannelErrorMsg()); - int updateCounts = refundMapper.updateByIdAndStatus(refund.getId(), refund.getStatus(), updateRefundObj); - if (updateCounts == 0) { // 校验状态,必须是等待状态 - throw exception(REFUND_STATUS_IS_NOT_WAITING); - } - log.info("[notifyRefundFailure][退款订单({}) 更新为退款失败]", refund.getId()); - - // 2. 插入退款通知记录 - notifyService.createPayNotifyTask(PayNotifyTypeEnum.REFUND.getType(), - refund.getId()); - } - - @Override - public int syncRefund() { - // 1. 查询指定创建时间内的待退款订单 - List refunds = refundMapper.selectListByStatus(PayRefundStatusEnum.WAITING.getStatus()); - if (CollUtil.isEmpty(refunds)) { - return 0; - } - // 2. 遍历执行 - int count = 0; - for (PayRefundDO refund : refunds) { - count += syncRefund(refund) ? 1 : 0; - } - return count; - } - - /** - * 同步单个退款订单 - * - * @param refund 退款订单 - * @return 是否同步到 - */ - private boolean syncRefund(PayRefundDO refund) { - try { - // 1.1 查询退款订单信息 - PayClient payClient = channelService.getPayClient(refund.getChannelId()); - if (payClient == null) { - log.error("[syncRefund][渠道编号({}) 找不到对应的支付客户端]", refund.getChannelId()); - return false; - } - PayRefundRespDTO respDTO = payClient.getRefund(refund.getOrderNo(), refund.getNo()); - // 1.2 回调退款结果 - notifyRefund(refund.getChannelId(), respDTO); - - // 2. 如果同步到,则返回 true - return PayRefundStatusEnum.isSuccess(respDTO.getStatus()) - || PayRefundStatusEnum.isFailure(respDTO.getStatus()); - } catch (Throwable e) { - log.error("[syncRefund][refund({}) 同步退款状态异常]", refund.getId(), e); - return false; - } - } - - /** - * 获得自身的代理对象,解决 AOP 生效问题 - * - * @return 自己 - */ - private PayRefundServiceImpl getSelf() { - return SpringUtil.getBean(getClass()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletService.java deleted file mode 100644 index 7c332f5c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.win.module.pay.service.wallet; - -import com.win.module.pay.dal.dataobject.wallet.PayWalletDO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; - -/** - * 钱包 Service 接口 - * - * @author jason - */ -public interface PayWalletService { - - /** - * 获取钱包信息 - * - * 如果不存在,则创建钱包。由于用户注册时候不会创建钱包 - * - * @param userId 用户编号 - * @param userType 用户类型 - */ - PayWalletDO getOrCreateWallet(Long userId, Integer userType); - - /** - * 钱包订单支付 - * - * @param userId 用户 id - * @param userType 用户类型 - * @param outTradeNo 外部订单号 - * @param price 金额 - */ - PayWalletTransactionDO orderPay(Long userId, Integer userType, String outTradeNo, Integer price); - - /** - * 钱包订单支付退款 - * - * @param outRefundNo 外部退款号 - * @param refundPrice 退款金额 - * @param reason 退款原因 - */ - PayWalletTransactionDO orderRefund(String outRefundNo, Integer refundPrice, String reason); - - /** - * 扣减钱包余额 - * - * @param userId 用户 id - * @param userType 用户类型 - * @param bizId 业务关联 id - * @param bizType 业务关联分类 - * @param price 扣减金额 - * @return 钱包流水 - */ - PayWalletTransactionDO reduceWalletBalance(Long userId, Integer userType, - Long bizId, PayWalletBizTypeEnum bizType, Integer price); - - /** - * 增加钱包余额 - * - * @param userId 用户 id - * @param userType 用户类型 - * @param bizId 业务关联 id - * @param bizType 业务关联分类 - * @param price 增加金额 - * @return 钱包流水 - */ - PayWalletTransactionDO addWalletBalance(Long userId, Integer userType, - Long bizId, PayWalletBizTypeEnum bizType, Integer price); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletServiceImpl.java deleted file mode 100644 index 73fc4cf9..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletServiceImpl.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.win.module.pay.service.wallet; - -import cn.hutool.core.lang.Assert; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletDO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.dal.mysql.wallet.PayWalletMapper; -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -import com.win.module.pay.service.wallet.bo.CreateWalletTransactionBO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.pay.enums.ErrorCodeConstants.*; -import static com.win.module.pay.enums.member.PayWalletBizTypeEnum.PAYMENT; -import static com.win.module.pay.enums.member.PayWalletBizTypeEnum.PAYMENT_REFUND; - -/** - * 钱包 Service 实现类 - * - * @author jason - */ -@Service -@Slf4j -public class PayWalletServiceImpl implements PayWalletService { - - @Resource - private PayWalletMapper walletMapper; - @Resource - private PayWalletTransactionService walletTransactionService; - @Resource - @Lazy - private PayOrderService orderService; - @Resource - @Lazy - private PayRefundService refundService; - - @Override - public PayWalletDO getOrCreateWallet(Long userId, Integer userType) { - PayWalletDO wallet = walletMapper.selectByUserIdAndType(userId, userType); - if (wallet == null) { - wallet = new PayWalletDO().setUserId(userId).setUserType(userType) - .setBalance(0).setTotalExpense(0).setTotalRecharge(0); - wallet.setCreateTime(LocalDateTime.now()); - walletMapper.insert(wallet); - } - return wallet; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public PayWalletTransactionDO orderPay(Long userId, Integer userType, String outTradeNo, Integer price) { - // 1. 判断支付交易拓展单是否存 - PayOrderExtensionDO orderExtension = orderService.getOrderExtensionByNo(outTradeNo); - if (orderExtension == null) { - throw exception(ORDER_EXTENSION_NOT_FOUND); - } - // 2. 扣减余额 - return reduceWalletBalance(userId, userType, orderExtension.getOrderId(), PAYMENT, price); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public PayWalletTransactionDO orderRefund(String outRefundNo, Integer refundPrice, String reason) { - // 1.1 判断退款单是否存在 - PayRefundDO payRefund = refundService.getRefundByNo(outRefundNo); - if (payRefund == null) { - throw exception(REFUND_NOT_FOUND); - } - // 1.2 校验是否可以退款 - Long walletId = validateWalletCanRefund(payRefund.getId(), payRefund.getChannelOrderNo(), refundPrice); - PayWalletDO wallet = walletMapper.selectById(walletId); - Assert.notNull(wallet, "钱包 {} 不存在", walletId); - // 2. 增加余额 - return addWalletBalance(wallet.getUserId(), wallet.getUserType(), payRefund.getId(), PAYMENT_REFUND, refundPrice); - } - - /** - * 校验是否能退款 - * - * @param refundId 支付退款单 id - * @param walletPayNo 钱包支付 no - */ - private Long validateWalletCanRefund(Long refundId, String walletPayNo, Integer refundPrice) { - // 1. 校验钱包支付交易存在 - PayWalletTransactionDO walletTransaction = walletTransactionService.getWalletTransactionByNo(walletPayNo); - if (walletTransaction == null) { - throw exception(WALLET_TRANSACTION_NOT_FOUND); - } - // 原来的支付金额 - // TODO @jason:应该允许多次退款哈; - int amount = - walletTransaction.getPrice(); - if (refundPrice != amount) { - throw exception(WALLET_REFUND_AMOUNT_ERROR); - } - PayWalletTransactionDO refundTransaction = walletTransactionService.getWalletTransaction( - String.valueOf(refundId), PAYMENT_REFUND); - if (refundTransaction != null) { - throw exception(WALLET_REFUND_EXIST); - } - return walletTransaction.getWalletId(); - } - - @Override - public PayWalletTransactionDO reduceWalletBalance(Long userId, Integer userType, - Long bizId, PayWalletBizTypeEnum bizType, Integer price) { - // 1. 获取钱包 - PayWalletDO payWallet = getOrCreateWallet(userId, userType); - - // 2.1 扣除余额 - int updateCounts = 0 ; - switch (bizType) { - case PAYMENT: { - updateCounts = walletMapper.updateWhenConsumption(price, payWallet.getId()); - break; - } - case RECHARGE_REFUND: { - // TODO - break; - } - } - if (updateCounts == 0) { - throw exception(WALLET_BALANCE_NOT_ENOUGH); - } - // 2.2 生成钱包流水 - Integer afterBalance = payWallet.getBalance() - price; - CreateWalletTransactionBO bo = new CreateWalletTransactionBO().setWalletId(payWallet.getId()) - .setPrice(-price).setBalance(afterBalance).setBizId(String.valueOf(bizId)) - .setBizType(bizType.getType()).setTitle(bizType.getDescription()); - return walletTransactionService.createWalletTransaction(bo); - } - - @Override - public PayWalletTransactionDO addWalletBalance(Long userId, Integer userType, - Long bizId, PayWalletBizTypeEnum bizType, Integer price) { - // 1. 获取钱包 - PayWalletDO payWallet = getOrCreateWallet(userId, userType); - switch (bizType) { - case PAYMENT_REFUND: { - // 更新退款 - walletMapper.updateWhenConsumptionRefund(price, payWallet.getId()); - break; - } - case RECHARGE: { - //TODO - break; - } - } - - // 2. 生成钱包流水 - CreateWalletTransactionBO bo = new CreateWalletTransactionBO().setWalletId(payWallet.getId()) - .setPrice(price).setBalance(payWallet.getBalance()+price).setBizId(String.valueOf(bizId)) - .setBizType(bizType.getType()).setTitle(bizType.getDescription()); - return walletTransactionService.createWalletTransaction(bo); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionService.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionService.java deleted file mode 100644 index 2dad553c..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionService.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.win.module.pay.service.wallet; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; -import com.win.module.pay.service.wallet.bo.CreateWalletTransactionBO; - -import javax.validation.Valid; - -/** - * 钱包余额流水 Service 接口 - * - * @author jason - */ -public interface PayWalletTransactionService { - - /** - * 查询钱包余额流水分页 - * - * @param userId 用户编号 - * @param userType 用户类型 - * @param pageVO 分页查询参数 - */ - PageResult getWalletTransactionPage(Long userId, Integer userType, - AppPayWalletTransactionPageReqVO pageVO); - - /** - * 新增钱包余额流水 - * - * @param bo 创建钱包流水 bo - * @return 新建的钱包 do - */ - PayWalletTransactionDO createWalletTransaction(@Valid CreateWalletTransactionBO bo); - - /** - * 根据 no,获取钱包余流水 - * - * @param no 流水号 - */ - PayWalletTransactionDO getWalletTransactionByNo(String no); - - /** - * 获取钱包流水 - * - * @param bizId 业务编号 - * @param type 业务类型 - * @return 钱包流水 - */ - PayWalletTransactionDO getWalletTransaction(String bizId, PayWalletBizTypeEnum type); - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionServiceImpl.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionServiceImpl.java deleted file mode 100644 index ee7f533d..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/PayWalletTransactionServiceImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.win.module.pay.service.wallet; - -import com.win.framework.common.pojo.PageResult; -import com.win.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO; -import com.win.module.pay.convert.wallet.PayWalletTransactionConvert; -import com.win.module.pay.dal.dataobject.wallet.PayWalletDO; -import com.win.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; -import com.win.module.pay.dal.mysql.wallet.PayWalletTransactionMapper; -import com.win.module.pay.dal.redis.no.PayNoRedisDAO; -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; -import com.win.module.pay.service.wallet.bo.CreateWalletTransactionBO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 钱包流水 Service 实现类 - * - * @author jason - */ -@Service -@Slf4j -public class PayWalletTransactionServiceImpl implements PayWalletTransactionService { - - /** - * 钱包流水的 no 前缀 - */ - private static final String WALLET_NO_PREFIX = "W"; - - @Resource - private PayWalletService payWalletService; - @Resource - private PayWalletTransactionMapper payWalletTransactionMapper; - @Resource - private PayNoRedisDAO noRedisDAO; - - @Override - public PageResult getWalletTransactionPage(Long userId, Integer userType, - AppPayWalletTransactionPageReqVO pageVO) { - PayWalletDO wallet = payWalletService.getOrCreateWallet(userId, userType); - return payWalletTransactionMapper.selectPage(wallet.getId(), pageVO); - } - - @Override - public PayWalletTransactionDO createWalletTransaction(CreateWalletTransactionBO bo) { - PayWalletTransactionDO transaction = PayWalletTransactionConvert.INSTANCE.convert(bo) - .setNo(noRedisDAO.generate(WALLET_NO_PREFIX)); - payWalletTransactionMapper.insert(transaction); - return transaction; - } - - @Override - public PayWalletTransactionDO getWalletTransactionByNo(String no) { - return payWalletTransactionMapper.selectByNo(no); - } - - @Override - public PayWalletTransactionDO getWalletTransaction(String bizId, PayWalletBizTypeEnum type) { - return payWalletTransactionMapper.selectByBiz(bizId, type.getType()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/bo/CreateWalletTransactionBO.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/bo/CreateWalletTransactionBO.java deleted file mode 100644 index f20369d0..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/service/wallet/bo/CreateWalletTransactionBO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.win.module.pay.service.wallet.bo; - -import com.win.module.pay.enums.member.PayWalletBizTypeEnum; -import lombok.Data; - -/** - * 创建钱包流水 BO - * - * @author jason - */ -@Data -public class CreateWalletTransactionBO { - - // TODO @jason:bo 的话,最好加个参数校验哈; - - /** - * 钱包编号 - * - */ - private Long walletId; - - /** - * 交易金额,单位分 - * - * 正值表示余额增加,负值表示余额减少 - */ - private Integer price; - - /** - * 交易后余额,单位分 - */ - private Integer balance; - - /** - * 关联业务分类 - * - * 枚举 {@link PayWalletBizTypeEnum#getType()} - */ - private Integer bizType; - - /** - * 关联业务编号 - */ - private String bizId; - - /** - * 流水说明 - */ - private String title; -} diff --git a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/util/PaySeqUtils.java b/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/util/PaySeqUtils.java deleted file mode 100644 index 46024515..00000000 --- a/win-module-pay/win-module-pay-biz/src/main/java/com/win/module/pay/util/PaySeqUtils.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.win.module.pay.util; - -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; - -import java.time.LocalDateTime; -import java.util.concurrent.atomic.AtomicLong; - -/** - * 支付相关编号的生产 - */ -// TODO @jason:需要改造,基于 db; -public class PaySeqUtils { - - private static final AtomicLong REFUND_REQ_NO_SEQ = new AtomicLong(0L); - - private static final AtomicLong MER_REFUND_NO_SEQ = new AtomicLong(0L); - - private static final AtomicLong MER_ORDER_NO_SEQ = new AtomicLong(0L); - - // TODO 芋艿:需要看看 - /** - * 生成商户退款单号,用于测试,应该由商户系统生成 - * @return 商户退款单 - */ - public static String genMerchantRefundNo() { - return String.format("%s%s%04d", "MR", - DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_MS_PATTERN), - (int) MER_REFUND_NO_SEQ.getAndIncrement() % 10000); - } - - // TODO 芋艿:需要看看 - - /** - * 生成退款请求号 - * @return 退款请求号 - */ - public static String genRefundReqNo() { - return String.format("%s%s%04d", "RR", - DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_MS_PATTERN), - (int) REFUND_REQ_NO_SEQ.getAndIncrement() % 10000); - } - - /** - * 生成商户订单编号号 用于测试,应该由商户系统生成 - * @return 商户订单编号 - */ - public static String genMerchantOrderNo() { - return String.format("%s%s%04d", "MO", - DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_MS_PATTERN), - (int) MER_ORDER_NO_SEQ.getAndIncrement() % 10000); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/dataobject/merchant/PayChannelDOTest.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/dataobject/merchant/PayChannelDOTest.java deleted file mode 100644 index ca5b5435..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/dataobject/merchant/PayChannelDOTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.win.module.pay.dal.dataobject.merchant; - -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.pay.core.client.impl.weixin.WXPayClientConfig; -import org.junit.jupiter.api.Test; - -public class PayChannelDOTest { - - @Test - public void testSerialization() { - PayChannelDO payChannelDO = new PayChannelDO(); - // 创建配置 - WXPayClientConfig config = new WXPayClientConfig(); - config.setAppId("wx041349c6f39b268b"); - config.setMchId("1545083881"); - config.setApiVersion(WXPayClientConfig.API_VERSION_V2); - config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p"); - payChannelDO.setConfig(config); - - // 序列化 - String text = JsonUtils.toJsonString(payChannelDO); - System.out.println(text); - - // 反序列化 - payChannelDO = JsonUtils.parseObject(text, PayChannelDO.class); - System.out.println(payChannelDO.getConfig().getClass()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java deleted file mode 100644 index 6c941208..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.win.module.pay.dal.mysql.merchant; - -import cn.hutool.core.io.IoUtil; -import com.win.module.pay.dal.dataobject.merchant.PayChannelDO; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; -import com.win.framework.pay.core.client.impl.weixin.WXPayClientConfig; -import com.win.framework.pay.core.enums.PayChannelEnum; -import com.win.module.pay.test.BaseDbIntegrationTest; -import org.junit.jupiter.api.Test; - -import javax.annotation.Resource; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.List; - -@Resource -public class PayChannelMapperIntegrationTest extends BaseDbIntegrationTest { - - @Resource - private PayChannelMapper payChannelMapper; - - /** - * 插入 {@link PayChannelEnum#WX_PUB} 初始配置 - */ - @Test - public void testInsertWxPub() throws FileNotFoundException { - PayChannelDO payChannelDO = new PayChannelDO(); - payChannelDO.setCode(PayChannelEnum.WX_PUB.getCode()); - payChannelDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - payChannelDO.setFeeRate(1D); - payChannelDO.setAppId(6L); - // 配置 - WXPayClientConfig config = new WXPayClientConfig(); - config.setAppId("wx041349c6f39b268b"); - config.setMchId("1545083881"); - config.setApiVersion(WXPayClientConfig.API_VERSION_V2); - config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p"); - config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem"))); - config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"))); - config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"); - payChannelDO.setConfig(config); - // 执行插入 - payChannelMapper.insert(payChannelDO); - } - - // TODO @ouyang:Zfb 改成 AlipayQr - /** - * 插入 {@link PayChannelEnum#ALIPAY_QR} 初始配置 - */ - @Test - public void testInsertZfb() { - PayChannelDO payChannelDO = new PayChannelDO(); - payChannelDO.setCode(PayChannelEnum.ALIPAY_QR.getCode()); - payChannelDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - payChannelDO.setFeeRate(1D); - payChannelDO.setAppId(6L); - // 配置 - AlipayPayClientConfig config = new AlipayPayClientConfig(); - config.setAppId("2021000118634035"); - config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX); - config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); - config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); - config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); - // 创建客户端 - payChannelDO.setConfig(config); - // 执行插入 - payChannelMapper.insert(payChannelDO); - } - - /** - * 查询所有支付配置,看看是否都是 ok 的 - */ - @Test - public void testSelectList() { - List payChannels = payChannelMapper.selectList(); - System.out.println(payChannels.size()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/order/PayOrderServiceIntegrationTest.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/order/PayOrderServiceIntegrationTest.java deleted file mode 100644 index 36658bd7..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/order/PayOrderServiceIntegrationTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.win.module.pay.service.order; - -import com.win.module.pay.service.channel.PayAppServiceImpl; -import com.win.module.pay.service.channel.PayChannelServiceImpl; -import com.win.module.pay.service.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.service.order.dto.PayOrderSubmitReqDTO; -import com.win.module.pay.test.BaseDbIntegrationTest; -import com.win.framework.common.util.date.DateUtils; -import com.win.framework.pay.config.WinPayAutoConfiguration; -import com.win.framework.pay.core.enums.PayChannelEnum; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; - -@Import({PayOrderServiceImpl.class, PayAppServiceImpl.class, - PayChannelServiceImpl.class, WinPayAutoConfiguration.class}) -public class PayOrderServiceIntegrationTest extends BaseDbIntegrationTest { - - @Resource - private PayOrderService payOrderService; - - @Test - public void testCreatePayOrder() { - // 构造请求 - PayOrderCreateReqDTO reqDTO = new PayOrderCreateReqDTO(); - reqDTO.setAppId(6L); - reqDTO.setUserIp("127.0.0.1"); - reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis())); - reqDTO.setSubject("标题"); - reqDTO.setBody("内容"); - reqDTO.setPrice(100); - reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1))); - // 发起请求 - payOrderService.createPayOrder(reqDTO); - } - - @Test - public void testSubmitPayOrder() { - // 构造请求 - PayOrderSubmitReqDTO reqDTO = new PayOrderSubmitReqDTO(); - reqDTO.setId(10L); - reqDTO.setAppId(6L); - reqDTO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - reqDTO.setUserIp("127.0.0.1"); - // 发起请求 - payOrderService.submitPayOrder(reqDTO); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/package-info.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/package-info.java deleted file mode 100644 index cb518ca1..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.win.module.pay.service; diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbAndRedisIntegrationTest.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbAndRedisIntegrationTest.java deleted file mode 100644 index ebd1faf7..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbAndRedisIntegrationTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.win.module.pay.test; - -import com.win.framework.datasource.config.WinDataSourceAutoConfiguration; -import com.win.framework.mybatis.config.WinMybatisAutoConfiguration; -import com.win.framework.redis.config.WinRedisAutoConfiguration; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class) -@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 -public class BaseDbAndRedisIntegrationTest { - - @Import({ - // DB 配置类 - DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 - WinDataSourceAutoConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - // MyBatis 配置类 - WinMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - - // Redis 配置类 - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - WinRedisAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbIntegrationTest.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbIntegrationTest.java deleted file mode 100644 index dbaaac71..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseDbIntegrationTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.win.module.pay.test; - -import com.win.framework.datasource.config.WinDataSourceAutoConfiguration; -import com.win.framework.mybatis.config.WinMybatisAutoConfiguration; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbIntegrationTest.Application.class) -@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 -public class BaseDbIntegrationTest { - - @Import({ - // DB 配置类 - DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 - WinDataSourceAutoConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - // MyBatis 配置类 - WinMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - }) - public static class Application { - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseRedisIntegrationTest.java b/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseRedisIntegrationTest.java deleted file mode 100644 index b1d7cb31..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/java/com/win/module/pay/test/BaseRedisIntegrationTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.win.module.pay.test; - -import com.win.framework.redis.config.WinRedisAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class) -@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 -public class BaseRedisIntegrationTest { - - @Import({ - // Redis 配置类 - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - WinRedisAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test-integration/resources/application-integration-test.yaml b/win-module-pay/win-module-pay-biz/src/test-integration/resources/application-integration-test.yaml deleted file mode 100644 index 4e5397f6..00000000 --- a/win-module-pay/win-module-pay-biz/src/test-integration/resources/application-integration-test.yaml +++ /dev/null @@ -1,93 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: - # 数据源配置项 - autoconfigure: - exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 - datasource: - druid: # Druid 【监控】相关的全局配置 - web-stat-filter: - enabled: 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: - name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT - driver-class-name: com.mysql.jdbc.Driver - username: root - password: 123456 - slave: # 模拟从库,可根据自己需要修改 - name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT - driver-class-name: com.mysql.jdbc.Driver - username: root - password: 123456 - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 6379 # 端口 - database: 0 # 数据库索引 - -mybatis: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 - global-config: - db-config: - id-type: AUTO # 自增 ID - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: ${win.info.base-package}.module.*.dal.dataobject - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 -resilience4j: - ratelimiter: - instances: - backendA: - limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 - limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 - timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s - register-health-indicator: true # 是否注册到健康监测 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -win: - info: - version: 1.0.0 - base-package: com.win.module - pay: - pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify - refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify diff --git a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/app/PayAppServiceTest.java b/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/app/PayAppServiceTest.java deleted file mode 100644 index ffeb363e..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/app/PayAppServiceTest.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.win.module.pay.service.app; - -import cn.hutool.core.util.RandomUtil; -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.pay.controller.admin.app.vo.PayAppCreateReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppPageReqVO; -import com.win.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.mysql.app.PayAppMapper; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Map; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.*; -import static com.win.module.pay.enums.ErrorCodeConstants.*; -import static java.util.Collections.singleton; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link PayAppServiceImpl} 的单元测试 - * - * @author aquan - */ -@Import(PayAppServiceImpl.class) -public class PayAppServiceTest extends BaseDbUnitTest { - - @Resource - private PayAppServiceImpl appService; - - @Resource - private PayAppMapper appMapper; - - @MockBean - private PayOrderService orderService; - @MockBean - private PayRefundService refundService; - - @Test - public void testCreateApp_success() { - // 准备参数 - PayAppCreateReqVO reqVO = randomPojo(PayAppCreateReqVO.class, o -> - o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())) - .setOrderNotifyUrl(randomURL()) - .setRefundNotifyUrl(randomURL())); - - // 调用 - Long appId = appService.createApp(reqVO); - // 断言 - assertNotNull(appId); - PayAppDO app = appMapper.selectById(appId); - assertPojoEquals(reqVO, app); - } - - @Test - public void testUpdateApp_success() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> { - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setOrderNotifyUrl(randomURL()).setRefundNotifyUrl(randomURL()); - o.setId(dbApp.getId()); // 设置更新的 ID - }); - - // 调用 - appService.updateApp(reqVO); - // 校验是否更新正确 - PayAppDO app = appMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, app); - } - - @Test - public void testUpdateApp_notExists() { - // 准备参数 - PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> - o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))); - // 调用, 并断言异常 - assertServiceException(() -> appService.updateApp(reqVO), APP_NOT_FOUND); - } - - @Test - public void testUpdateAppStatus() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class, o -> - o.setStatus(CommonStatusEnum.DISABLE.getStatus())); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - - // 准备参数 - Long id = dbApp.getId(); - Integer status = CommonStatusEnum.ENABLE.getStatus(); - // 调用 - appService.updateAppStatus(id, status); - // 断言 - PayAppDO app = appMapper.selectById(id); // 获取最新的 - assertEquals(status, app.getStatus()); - } - - @Test - public void testDeleteApp_success() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp.getId(); - - // 调用 - appService.deleteApp(id); - // 校验数据不存在了 - assertNull(appMapper.selectById(id)); - } - - @Test - public void testDeleteApp_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> appService.deleteApp(id), APP_NOT_FOUND); - } - - @Test - public void testDeleteApp_existOrder() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp.getId(); - // mock 订单有订单 - when(orderService.getOrderCountByAppId(eq(id))).thenReturn(10L); - - // 调用, 并断言异常 - assertServiceException(() -> appService.deleteApp(id), APP_EXIST_ORDER_CANT_DELETE); - } - - @Test - public void testDeleteApp_existRefund() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp.getId(); - // mock 订单有订单 - when(refundService.getRefundCountByAppId(eq(id))).thenReturn(10L); - - // 调用, 并断言异常 - assertServiceException(() -> appService.deleteApp(id), APP_EXIST_REFUND_CANT_DELETE); - } - - @Test - public void testApp() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp.getId(); - - // 调用 - PayAppDO app = appService.getApp(id); - // 校验数据一致 - assertPojoEquals(app, dbApp); - } - - @Test - public void testAppMap() { - // mock 数据 - PayAppDO dbApp01 = randomPojo(PayAppDO.class); - appMapper.insert(dbApp01);// @Sql: 先插入出一条存在的数据 - PayAppDO dbApp02 = randomPojo(PayAppDO.class); - appMapper.insert(dbApp02);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp01.getId(); - - // 调用 - Map appMap = appService.getAppMap(singleton(id)); - // 校验数据一致 - assertEquals(1, appMap.size()); - assertPojoEquals(dbApp01, appMap.get(id)); - } - - @Test - public void testGetAppPage() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到 - o.setName("灿灿姐的杂货铺"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(buildTime(2021,11,20)); - }); - - appMapper.insert(dbApp); - // 测试 name 不匹配 - appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺"))); - // 测试 status 不匹配 - appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21)))); - // 准备参数 - PayAppPageReqVO reqVO = new PayAppPageReqVO(); - reqVO.setName("灿灿姐的杂货铺"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setCreateTime(buildBetweenTime(2021, 11, 19, 2021, 11, 21)); - - // 调用 - PageResult pageResult = appService.getAppPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbApp, pageResult.getList().get(0)); - } - - @Test - public void testValidPayApp_success() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class, - o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp.getId(); - - // 调用 - PayAppDO app = appService.validPayApp(id); - // 校验数据一致 - assertPojoEquals(app, dbApp); - } - - @Test - public void testValidPayApp_notFound() { - assertServiceException(() -> appService.validPayApp(randomLongId()), APP_NOT_FOUND); - } - - @Test - public void testValidPayApp_disable() { - // mock 数据 - PayAppDO dbApp = randomPojo(PayAppDO.class, - o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); - appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbApp.getId(); - - // 调用,并断言异常 - assertServiceException(() -> appService.validPayApp(id), APP_IS_DISABLE); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/channel/PayChannelServiceTest.java b/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/channel/PayChannelServiceTest.java deleted file mode 100644 index f680cf34..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/channel/PayChannelServiceTest.java +++ /dev/null @@ -1,343 +0,0 @@ -package com.win.module.pay.service.channel; - -import com.win.framework.common.enums.CommonStatusEnum; -import com.win.framework.common.util.json.JsonUtils; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.PayClientFactory; -import com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; -import com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; -import com.win.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.mysql.channel.PayChannelMapper; -import com.alibaba.fastjson.JSON; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import javax.validation.Validator; -import java.util.Collections; -import java.util.List; - -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.*; -import static com.win.module.pay.enums.ErrorCodeConstants.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -@Import({PayChannelServiceImpl.class}) -public class PayChannelServiceTest extends BaseDbUnitTest { - - @Resource - private PayChannelServiceImpl channelService; - - @Resource - private PayChannelMapper channelMapper; - - @MockBean - private PayClientFactory payClientFactory; - @MockBean - private Validator validator; - - @Test - public void testCreateChannel_success() { - // 准备参数 - WxPayClientConfig config = randomWxPayClientConfig(); - PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { - o.setStatus(randomCommonStatus()); - o.setCode(PayChannelEnum.WX_PUB.getCode()); - o.setConfig(JsonUtils.toJsonString(config)); - }); - - // 调用 - Long channelId = channelService.createChannel(reqVO); - // 校验记录的属性是否正确 - PayChannelDO channel = channelMapper.selectById(channelId); - assertPojoEquals(reqVO, channel, "config"); - assertPojoEquals(config, channel.getConfig()); - // 校验缓存 - assertNull(channelService.getClientCache().getIfPresent(channelId)); - } - - @Test - public void testCreateChannel_exists() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, - o -> o.setConfig(randomWxPayClientConfig())); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { - o.setAppId(dbChannel.getAppId()); - o.setCode(dbChannel.getCode()); - }); - - // 调用, 并断言异常 - assertServiceException(() -> channelService.createChannel(reqVO), CHANNEL_EXIST_SAME_CHANNEL_ERROR); - } - - @Test - public void testUpdateChannel_success() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - AlipayPayClientConfig config = randomAlipayPayClientConfig(); - PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> { - o.setId(dbChannel.getId()); // 设置更新的 ID - o.setStatus(randomCommonStatus()); - o.setConfig(JsonUtils.toJsonString(config)); - }); - - // 调用 - channelService.updateChannel(reqVO); - // 校验是否更新正确 - PayChannelDO channel = channelMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, channel, "config"); - assertPojoEquals(config, channel.getConfig()); - // 校验缓存 - assertNull(channelService.getClientCache().getIfPresent(channel.getId())); - } - - @Test - public void testUpdateChannel_notExists() { - // 准备参数 - AlipayPayClientConfig payClientPublicKeyConfig = randomAlipayPayClientConfig(); - PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> { - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setConfig(JSON.toJSONString(payClientPublicKeyConfig)); - }); - - // 调用, 并断言异常 - assertServiceException(() -> channelService.updateChannel(reqVO), CHANNEL_NOT_FOUND); - } - - @Test - public void testDeleteChannel_success() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbChannel.getId(); - - // 调用 - channelService.deleteChannel(id); - // 校验数据不存在了 - assertNull(channelMapper.selectById(id)); - // 校验缓存 - assertNull(channelService.getClientCache().getIfPresent(id)); - } - - @Test - public void testDeleteChannel_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> channelService.deleteChannel(id), CHANNEL_NOT_FOUND); - } - - @Test - public void testGetChannel() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbChannel.getId(); - - // 调用 - PayChannelDO channel = channelService.getChannel(id); - // 校验是否更新正确 - assertPojoEquals(dbChannel, channel); - } - - @Test - public void testGetChannelListByAppIds() { - // mock 数据 - PayChannelDO dbChannel01 = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - }); - channelMapper.insert(dbChannel01);// @Sql: 先插入出一条存在的数据 - PayChannelDO dbChannel02 = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.WX_PUB.getCode()); - o.setConfig(randomWxPayClientConfig()); - }); - channelMapper.insert(dbChannel02);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long appId = dbChannel01.getAppId(); - - // 调用 - List channels = channelService.getChannelListByAppIds(Collections.singleton(appId)); - // 校验是否更新正确 - assertEquals(1, channels.size()); - assertPojoEquals(dbChannel01, channels.get(0)); - } - - @Test - public void testGetChannelByAppIdAndCode() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long appId = dbChannel.getAppId(); - String code = dbChannel.getCode();; - - // 调用 - PayChannelDO channel = channelService.getChannelByAppIdAndCode(appId, code); - // 断言 - assertPojoEquals(channel, dbChannel); - } - - @Test - public void testValidPayChannel_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> channelService.validPayChannel(id), CHANNEL_NOT_FOUND); - } - - @Test - public void testValidPayChannel_isDisable() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbChannel.getId(); - - // 调用, 并断言异常 - assertServiceException(() -> channelService.validPayChannel(id), CHANNEL_IS_DISABLE); - } - - @Test - public void testValidPayChannel_success() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbChannel.getId(); - - // 调用 - PayChannelDO channel = channelService.validPayChannel(id); - // 断言异常 - assertPojoEquals(channel, dbChannel); - } - - @Test - public void testValidPayChannel_appIdAndCode() { - // mock 数据 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long appId = dbChannel.getAppId(); - String code = dbChannel.getCode(); - - // 调用 - PayChannelDO channel = channelService.validPayChannel(appId, code); - // 断言异常 - assertPojoEquals(channel, dbChannel); - } - - @Test - public void testGetEnableChannelList() { - // 准备参数 - Long appId = randomLongId(); - // mock 数据 01(enable 不匹配) - PayChannelDO dbChannel01 = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - }); - channelMapper.insert(dbChannel01);// @Sql: 先插入出一条存在的数据 - // mock 数据 02(appId 不匹配) - PayChannelDO dbChannel02 = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - channelMapper.insert(dbChannel02);// @Sql: 先插入出一条存在的数据 - // mock 数据 03 - PayChannelDO dbChannel03 = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - o.setAppId(appId); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - channelMapper.insert(dbChannel03);// @Sql: 先插入出一条存在的数据 - - // 调用 - List channel = channelService.getEnableChannelList(appId); - // 断言异常 - assertPojoEquals(channel, dbChannel03); - } - - @Test - public void testGetPayClient() { - // mock 数据 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> { - o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); - o.setConfig(randomAlipayPayClientConfig()); - }); - channelMapper.insert(channel); - // mock 参数 - Long id = channel.getId(); - // mock 方法 - PayClient mockClient = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(id))).thenReturn(mockClient); - - // 调用 - PayClient client = channelService.getPayClient(id); - // 断言 - assertSame(client, mockClient); - verify(payClientFactory).createOrUpdatePayClient(eq(id), eq(channel.getCode()), - eq(channel.getConfig())); - } - - public WxPayClientConfig randomWxPayClientConfig() { - return new WxPayClientConfig() - .setAppId(randomString()) - .setMchId(randomString()) - .setApiVersion(WxPayClientConfig.API_VERSION_V2) - .setMchKey(randomString()); - } - - public AlipayPayClientConfig randomAlipayPayClientConfig() { - return new AlipayPayClientConfig() - .setServerUrl(randomURL()) - .setAppId(randomString()) - .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT) - .setMode(AlipayPayClientConfig.MODE_PUBLIC_KEY) - .setPrivateKey(randomString()) - .setAlipayPublicKey(randomString()); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/notify/PayNotifyServiceTest.java b/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/notify/PayNotifyServiceTest.java deleted file mode 100644 index ccf9cb40..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/notify/PayNotifyServiceTest.java +++ /dev/null @@ -1,351 +0,0 @@ -package com.win.module.pay.service.notify; - -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.pojo.CommonResult; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.test.core.ut.BaseDbUnitTest; -import com.win.module.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyLogDO; -import com.win.module.pay.dal.dataobject.notify.PayNotifyTaskDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.dal.mysql.notify.PayNotifyLogMapper; -import com.win.module.pay.dal.mysql.notify.PayNotifyTaskMapper; -import com.win.module.pay.dal.redis.notify.PayNotifyLockRedisDAO; -import com.win.module.pay.enums.notify.PayNotifyStatusEnum; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.win.module.pay.framework.job.config.PayJobConfiguration; -import com.win.module.pay.service.order.PayOrderService; -import com.win.module.pay.service.refund.PayRefundService; -import com.win.module.pay.service.refund.PayRefundServiceImpl; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; -import java.util.List; - -import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; -import static com.win.framework.common.util.date.LocalDateTimeUtils.*; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.framework.test.core.util.RandomUtils.randomString; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** - * {@link PayRefundServiceImpl} 的单元测试类 - * - * @author 芋艿 - */ -@Import({PayJobConfiguration.class, PayNotifyServiceImpl.class, PayNotifyLockRedisDAO.class}) -public class PayNotifyServiceTest extends BaseDbUnitTest { - - @Resource - private PayNotifyServiceImpl notifyService; - - @MockBean - private PayOrderService orderService; - @MockBean - private PayRefundService refundService; - - @Resource - private PayNotifyTaskMapper notifyTaskMapper; - @Resource - private PayNotifyLogMapper notifyLogMapper; - - @MockBean - private RedissonClient redissonClient; - - @Test - public void testCreatePayNotifyTask_order() { - PayNotifyServiceImpl payNotifyService = mock(PayNotifyServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayNotifyServiceImpl.class))) - .thenReturn(payNotifyService); - - // 准备参数 - Integer type = PayNotifyTypeEnum.ORDER.getType(); - Long dataId = 1L; - // mock 方法(order) - PayOrderDO order = randomPojo(PayOrderDO.class); - when(orderService.getOrder(eq(1L))).thenReturn(order); - // mock 方法(lock) - mockLock(null); // null 的原因,是咱没办法拿到 taskId 新增 - - // 调用 - notifyService.createPayNotifyTask(type, dataId); - // 断言,task - PayNotifyTaskDO dbTask = notifyTaskMapper.selectOne(null); - assertNotNull(dbTask.getNextNotifyTime()); - assertThat(dbTask) - .extracting("type", "dataId", "status", "notifyTimes", "maxNotifyTimes", - "appId", "merchantOrderId", "notifyUrl") - .containsExactly(type, dataId, PayNotifyStatusEnum.WAITING.getStatus(), 0, 9, - order.getAppId(), order.getMerchantOrderId(), order.getNotifyUrl()); - // 断言,调用 - verify(payNotifyService).executeNotify0(eq(dbTask)); - } - } - - @Test - public void testCreatePayNotifyTask_refund() { - PayNotifyServiceImpl payNotifyService = mock(PayNotifyServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayNotifyServiceImpl.class))) - .thenReturn(payNotifyService); - - // 准备参数 - Integer type = PayNotifyTypeEnum.REFUND.getType(); - Long dataId = 1L; - // mock 方法(refund) - PayRefundDO refund = randomPojo(PayRefundDO.class); - when(refundService.getRefund(eq(1L))).thenReturn(refund); - // mock 方法(lock) - mockLock(null); // null 的原因,是咱没办法拿到 taskId 新增 - - // 调用 - notifyService.createPayNotifyTask(type, dataId); - // 断言,task - PayNotifyTaskDO dbTask = notifyTaskMapper.selectOne(null); - assertNotNull(dbTask.getNextNotifyTime()); - assertThat(dbTask) - .extracting("type", "dataId", "status", "notifyTimes", "maxNotifyTimes", - "appId", "merchantOrderId", "notifyUrl") - .containsExactly(type, dataId, PayNotifyStatusEnum.WAITING.getStatus(), 0, 9, - refund.getAppId(), refund.getMerchantOrderId(), refund.getNotifyUrl()); - // 断言,调用 - verify(payNotifyService).executeNotify0(eq(dbTask)); - } - } - - @Test - public void testExecuteNotify() throws InterruptedException { - // mock 数据(notify) - PayNotifyTaskDO dbTask01 = randomPojo(PayNotifyTaskDO.class, - o -> o.setStatus(PayNotifyStatusEnum.WAITING.getStatus()) - .setNextNotifyTime(addTime(Duration.ofMinutes(-1)))); - notifyTaskMapper.insert(dbTask01); - PayNotifyTaskDO dbTask02 = randomPojo(PayNotifyTaskDO.class, - o -> o.setStatus(PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus()) - .setNextNotifyTime(addTime(Duration.ofMinutes(-1)))); - notifyTaskMapper.insert(dbTask02); - PayNotifyTaskDO dbTask03 = randomPojo(PayNotifyTaskDO.class, - o -> o.setStatus(PayNotifyStatusEnum.REQUEST_FAILURE.getStatus()) - .setNextNotifyTime(addTime(Duration.ofMinutes(-1)))); - notifyTaskMapper.insert(dbTask03); - PayNotifyTaskDO dbTask04 = randomPojo(PayNotifyTaskDO.class, // 不满足状态 - o -> o.setStatus(PayNotifyStatusEnum.FAILURE.getStatus()) - .setNextNotifyTime(addTime(Duration.ofMinutes(-1)))); - notifyTaskMapper.insert(dbTask04); - PayNotifyTaskDO dbTask05 = randomPojo(PayNotifyTaskDO.class, // 不满足状态 - o -> o.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus()) - .setNextNotifyTime(addTime(Duration.ofMinutes(-1)))); - notifyTaskMapper.insert(dbTask05); - PayNotifyTaskDO dbTask06 = randomPojo(PayNotifyTaskDO.class, // 不满足时间 - o -> o.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus()) - .setNextNotifyTime(addTime(Duration.ofMinutes(1)))); - notifyTaskMapper.insert(dbTask06); - // mock 方法(lock) - mockLock(dbTask01.getId()); - mockLock(dbTask02.getId()); - mockLock(dbTask03.getId()); - - // 调用 - int count = notifyService.executeNotify(); - // 断言,数量 - assertEquals(count, 3); - } - - @Test // 由于 HttpUtil 不好 mock,所以只测试异常的情况 - public void testExecuteNotify0_exception() { - // mock 数据(task) - PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class, o -> o.setType(-1) - .setNotifyTimes(0).setMaxNotifyTimes(9)); - notifyTaskMapper.insert(task); - - // 调用 - notifyService.executeNotify0(task); - // 断言,task - PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId()); - assertNotEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime()); - assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime()); - assertEquals(dbTask.getNotifyTimes(), 1); - assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus()); - // 断言,log - PayNotifyLogDO dbLog = notifyLogMapper.selectOne(null); - assertEquals(dbLog.getTaskId(), task.getId()); - assertEquals(dbLog.getNotifyTimes(), 1); - assertTrue(dbLog.getResponse().contains("未知的通知任务类型:")); - assertEquals(dbLog.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus()); - } - - @Test - public void testProcessNotifyResult_success() { - // mock 数据(task) - PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class, - o -> o.setNotifyTimes(0).setMaxNotifyTimes(9)); - notifyTaskMapper.insert(task); - // 准备参数 - CommonResult invokeResult = CommonResult.success(randomString()); - - // 调用 - notifyService.processNotifyResult(task, invokeResult, null); - // 断言 - PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId()); - assertEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime()); - assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime()); - assertEquals(dbTask.getNotifyTimes(), 1); - assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.SUCCESS.getStatus()); - } - - @Test - public void testProcessNotifyResult_failure() { - // mock 数据(task) - PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class, - o -> o.setNotifyTimes(8).setMaxNotifyTimes(9)); - notifyTaskMapper.insert(task); - // 准备参数 - CommonResult invokeResult = CommonResult.error(BAD_REQUEST); - - // 调用 - notifyService.processNotifyResult(task, invokeResult, null); - // 断言 - PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId()); - assertEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime()); - assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime()); - assertEquals(dbTask.getNotifyTimes(), 9); - assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.FAILURE.getStatus()); - } - - @Test - public void testProcessNotifyResult_requestFailure() { - // mock 数据(task) - PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class, - o -> o.setNotifyTimes(0).setMaxNotifyTimes(9)); - notifyTaskMapper.insert(task); - // 准备参数 - CommonResult invokeResult = CommonResult.error(BAD_REQUEST); - - // 调用 - notifyService.processNotifyResult(task, invokeResult, null); - // 断言 - PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId()); - assertNotEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime()); - assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime()); - assertEquals(dbTask.getNotifyTimes(), 1); - assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus()); - } - - @Test - public void testProcessNotifyResult_requestSuccess() { - // mock 数据(task) - PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class, - o -> o.setNotifyTimes(0).setMaxNotifyTimes(9)); - notifyTaskMapper.insert(task); - // 准备参数 - CommonResult invokeResult = CommonResult.error(BAD_REQUEST); - RuntimeException invokeException = new RuntimeException(); - - // 调用 - notifyService.processNotifyResult(task, invokeResult, invokeException); - // 断言 - PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId()); - assertNotEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime()); - assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime()); - assertEquals(dbTask.getNotifyTimes(), 1); - assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus()); - } - - @Test - public void testGetNotifyTask() { - // mock 数据(task) - PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class); - notifyTaskMapper.insert(task); - // 准备参数 - Long id = task.getId(); - - // 调用 - PayNotifyTaskDO dbTask = notifyService.getNotifyTask(id); - // 断言 - assertPojoEquals(dbTask, task); - } - - @Test - public void testGetNotifyTaskPage() { - // mock 数据 - PayNotifyTaskDO dbTask = randomPojo(PayNotifyTaskDO.class, o -> { // 等会查询到 - o.setAppId(1L); - o.setType(PayNotifyTypeEnum.REFUND.getType()); - o.setDataId(100L); - o.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus()); - o.setMerchantOrderId("P110"); - o.setCreateTime(buildTime(2023, 2, 3)); - }); - notifyTaskMapper.insert(dbTask); - // 测试 appId 不匹配 - notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setAppId(2L))); - // 测试 type 不匹配 - notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setType(PayNotifyTypeEnum.ORDER.getType()))); - // 测试 dataId 不匹配 - notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setDataId(200L))); - // 测试 status 不匹配 - notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setStatus(PayNotifyStatusEnum.FAILURE.getStatus()))); - // 测试 merchantOrderId 不匹配 - notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setMerchantOrderId(randomString()))); - // 测试 createTime 不匹配 - notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setCreateTime(buildTime(2023, 1, 1)))); - // 准备参数 - PayNotifyTaskPageReqVO reqVO = new PayNotifyTaskPageReqVO(); - reqVO.setAppId(1L); - reqVO.setType(PayNotifyTypeEnum.REFUND.getType()); - reqVO.setDataId(100L); - reqVO.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus()); - reqVO.setMerchantOrderId("P110"); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = notifyService.getNotifyTaskPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbTask, pageResult.getList().get(0)); - } - - @Test - public void testGetNotifyLogList() { - // mock 数据 - PayNotifyLogDO dbLog = randomPojo(PayNotifyLogDO.class); - notifyLogMapper.insert(dbLog); - PayNotifyLogDO dbLog02 = randomPojo(PayNotifyLogDO.class); - notifyLogMapper.insert(dbLog02); - // 准备参数 - Long taskId = dbLog.getTaskId(); - - // 调用 - List logList = notifyService.getNotifyLogList(taskId); - // 断言 - assertEquals(logList.size(), 1); - assertPojoEquals(dbLog, logList.get(0)); - } - - private void mockLock(Long id) { - RLock lock = mock(RLock.class); - if (id == null) { - when(redissonClient.getLock(anyString())) - .thenReturn(lock); - } else { - when(redissonClient.getLock(eq("pay_notify:lock:" + id))) - .thenReturn(lock); - } - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/order/PayOrderServiceTest.java b/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/order/PayOrderServiceTest.java deleted file mode 100644 index 129f7646..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/order/PayOrderServiceTest.java +++ /dev/null @@ -1,1105 +0,0 @@ -package com.win.module.pay.service.order; - -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.PayClientFactory; -import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum; -import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum; -import com.win.framework.test.core.ut.BaseDbAndRedisUnitTest; -import com.win.module.pay.api.order.dto.PayOrderCreateReqDTO; -import com.win.module.pay.controller.admin.order.vo.PayOrderExportReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderPageReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO; -import com.win.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.order.PayOrderExtensionDO; -import com.win.module.pay.dal.mysql.order.PayOrderExtensionMapper; -import com.win.module.pay.dal.mysql.order.PayOrderMapper; -import com.win.module.pay.dal.redis.no.PayNoRedisDAO; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.pay.framework.pay.config.PayProperties; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.channel.PayChannelService; -import com.win.module.pay.service.notify.PayNotifyService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.List; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.*; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.*; -import static com.win.module.pay.enums.ErrorCodeConstants.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -/** - * {@link PayOrderServiceImpl} 的单元测试类 - * - * @author 芋艿 - */ -@Import({PayOrderServiceImpl.class, PayNoRedisDAO.class}) -public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { - - @Resource - private PayOrderServiceImpl orderService; - - @Resource - private PayOrderMapper orderMapper; - @Resource - private PayOrderExtensionMapper orderExtensionMapper; - - @MockBean - private PayClientFactory payClientFactory; - @MockBean - private PayProperties properties; - @MockBean - private PayAppService appService; - @MockBean - private PayChannelService channelService; - @MockBean - private PayNotifyService notifyService; - - @BeforeEach - public void setUp() { - when(properties.getOrderNotifyUrl()).thenReturn("http://127.0.0.1"); - } - - @Test - public void testGetOrder_id() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class); - orderMapper.insert(order); - // 准备参数 - Long id = order.getId(); - - // 调用 - PayOrderDO dbOrder = orderService.getOrder(id); - // 断言 - assertPojoEquals(dbOrder, order); - } - - @Test - public void testGetOrder_appIdAndMerchantOrderId() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class); - orderMapper.insert(order); - // 准备参数 - Long appId = order.getAppId(); - String merchantOrderId = order.getMerchantOrderId(); - - // 调用 - PayOrderDO dbOrder = orderService.getOrder(appId, merchantOrderId); - // 断言 - assertPojoEquals(dbOrder, order); - } - - @Test - public void testGetOrderCountByAppId() { - // mock 数据(PayOrderDO) - PayOrderDO order01 = randomPojo(PayOrderDO.class); - orderMapper.insert(order01); - PayOrderDO order02 = randomPojo(PayOrderDO.class); - orderMapper.insert(order02); - // 准备参数 - Long appId = order01.getAppId(); - - // 调用 - Long count = orderService.getOrderCountByAppId(appId); - // 断言 - assertEquals(count, 1L); - } - - @Test - public void testGetOrderPage() { - // mock 数据 - PayOrderDO dbOrder = randomPojo(PayOrderDO.class, o -> { // 等会查询到 - o.setAppId(1L); - o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - o.setMerchantOrderId("110"); - o.setChannelOrderNo("220"); - o.setNo("330"); - o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - o.setCreateTime(buildTime(2018, 1, 15)); - }); - orderMapper.insert(dbOrder); - // 测试 appId 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setAppId(2L))); - // 测试 channelCode 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); - // 测试 merchantOrderId 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setMerchantOrderId(randomString()))); - // 测试 channelOrderNo 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelOrderNo(randomString()))); - // 测试 no 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setNo(randomString()))); - // 测试 status 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()))); - // 测试 createTime 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setCreateTime(buildTime(2019, 1, 1)))); - // 准备参数 - PayOrderPageReqVO reqVO = new PayOrderPageReqVO(); - reqVO.setAppId(1L); - reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - reqVO.setMerchantOrderId("11"); - reqVO.setChannelOrderNo("22"); - reqVO.setNo("33"); - reqVO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - reqVO.setCreateTime(buildBetweenTime(2018, 1, 10, 2018, 1, 30)); - - // 调用 - PageResult pageResult = orderService.getOrderPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbOrder, pageResult.getList().get(0)); - } - - @Test - public void testGetOrderList() { - // mock 数据 - PayOrderDO dbOrder = randomPojo(PayOrderDO.class, o -> { // 等会查询到 - o.setAppId(1L); - o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - o.setMerchantOrderId("110"); - o.setChannelOrderNo("220"); - o.setNo("330"); - o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - o.setCreateTime(buildTime(2018, 1, 15)); - }); - orderMapper.insert(dbOrder); - // 测试 appId 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setAppId(2L))); - // 测试 channelCode 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); - // 测试 merchantOrderId 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setMerchantOrderId(randomString()))); - // 测试 channelOrderNo 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelOrderNo(randomString()))); - // 测试 no 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setNo(randomString()))); - // 测试 status 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()))); - // 测试 createTime 不匹配 - orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setCreateTime(buildTime(2019, 1, 1)))); - // 准备参数 - PayOrderExportReqVO reqVO = new PayOrderExportReqVO(); - reqVO.setAppId(1L); - reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - reqVO.setMerchantOrderId("11"); - reqVO.setChannelOrderNo("22"); - reqVO.setNo("33"); - reqVO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - reqVO.setCreateTime(buildBetweenTime(2018, 1, 10, 2018, 1, 30)); - - // 调用 - List list = orderService.getOrderList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbOrder, list.get(0)); - } - - @Test - public void testCreateOrder_success() { - // mock 参数 - PayOrderCreateReqDTO reqDTO = randomPojo(PayOrderCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("10") - .setSubject(randomString()).setBody(randomString())); - // mock 方法 - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L).setOrderNotifyUrl("http://127.0.0.1")); - when(appService.validPayApp(eq(reqDTO.getAppId()))).thenReturn(app); - - // 调用 - Long orderId = orderService.createOrder(reqDTO); - // 断言 - PayOrderDO order = orderMapper.selectById(orderId); - assertPojoEquals(order, reqDTO); - assertEquals(order.getAppId(), 1L); - assertEquals(order.getNotifyUrl(), "http://127.0.0.1"); - assertEquals(order.getStatus(), PayOrderStatusEnum.WAITING.getStatus()); - assertEquals(order.getRefundPrice(), 0); - } - - @Test - public void testCreateOrder_exists() { - // mock 参数 - PayOrderCreateReqDTO reqDTO = randomPojo(PayOrderCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("10")); - // mock 数据 - PayOrderDO dbOrder = randomPojo(PayOrderDO.class, o -> o.setAppId(1L).setMerchantOrderId("10")); - orderMapper.insert(dbOrder); - - // 调用 - Long orderId = orderService.createOrder(reqDTO); - // 断言 - PayOrderDO order = orderMapper.selectById(orderId); - assertPojoEquals(dbOrder, order); - } - - @Test - public void testSubmitOrder_notFound() { - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class); - String userIp = randomString(); - - // 调用, 并断言异常 - assertServiceException(() -> orderService.submitOrder(reqVO, userIp), ORDER_NOT_FOUND); - } - - @Test - public void testSubmitOrder_notWaiting() { - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.REFUND.getStatus())); - orderMapper.insert(order); - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId())); - String userIp = randomString(); - - // 调用, 并断言异常 - assertServiceException(() -> orderService.submitOrder(reqVO, userIp), ORDER_STATUS_IS_NOT_WAITING); - } - - @Test - public void testSubmitOrder_isSuccess() { - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus())); - orderMapper.insert(order); - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId())); - String userIp = randomString(); - - // 调用, 并断言异常 - assertServiceException(() -> orderService.submitOrder(reqVO, userIp), ORDER_STATUS_IS_SUCCESS); - } - - @Test - public void testSubmitOrder_expired() { - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setExpireTime(addTime(Duration.ofDays(-1)))); - orderMapper.insert(order); - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId())); - String userIp = randomString(); - - // 调用, 并断言异常 - assertServiceException(() -> orderService.submitOrder(reqVO, userIp), ORDER_IS_EXPIRED); - } - - @Test - public void testSubmitOrder_channelNotFound() { - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)))); - orderMapper.insert(order); - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId()) - .setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - String userIp = randomString(); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(1L), eq(PayChannelEnum.ALIPAY_APP.getCode()))) - .thenReturn(channel); - - // 调用, 并断言异常 - assertServiceException(() -> orderService.submitOrder(reqVO, userIp), CHANNEL_NOT_FOUND); - } - - @Test // 调用 unifiedOrder 接口,返回存在渠道错误 - public void testSubmitOrder_channelError() { - PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) - .thenReturn(payOrderServiceImpl); - - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)))); - orderMapper.insert(order); - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId()) - .setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - String userIp = randomString(); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(1L), eq(PayChannelEnum.ALIPAY_APP.getCode()))) - .thenReturn(channel); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法() - PayOrderRespDTO unifiedOrderResp = randomPojo(PayOrderRespDTO.class, o -> - o.setChannelErrorCode("001").setChannelErrorMsg("模拟异常")); - when(client.unifiedOrder(argThat(payOrderUnifiedReqDTO -> { - assertNotNull(payOrderUnifiedReqDTO.getOutTradeNo()); - assertThat(payOrderUnifiedReqDTO) - .extracting("subject", "body", "notifyUrl", "returnUrl", "price", "expireTime") - .containsExactly(order.getSubject(), order.getBody(), "http://127.0.0.1/10", - reqVO.getReturnUrl(), order.getPrice(), order.getExpireTime()); - return true; - }))).thenReturn(unifiedOrderResp); - - // 调用,并断言异常 - assertServiceException(() -> orderService.submitOrder(reqVO, userIp), - ORDER_SUBMIT_CHANNEL_ERROR, "001", "模拟异常"); - // 断言,数据记录(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = orderExtensionMapper.selectOne(null); - assertNotNull(orderExtension); - assertThat(orderExtension).extracting("no", "orderId").isNotNull(); - assertThat(orderExtension) - .extracting("channelId", "channelCode","userIp" ,"status", "channelExtras", - "channelErrorCode", "channelErrorMsg", "channelNotifyData") - .containsExactly(10L, PayChannelEnum.ALIPAY_APP.getCode(), userIp, - PayOrderStatusEnum.WAITING.getStatus(), reqVO.getChannelExtras(), - null, null, null); - } - } - - @Test - public void testSubmitOrder_success() { - PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) - .thenReturn(payOrderServiceImpl); - - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)))); - orderMapper.insert(order); - // 准备参数 - PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId()) - .setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - String userIp = randomString(); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(1L), eq(PayChannelEnum.ALIPAY_APP.getCode()))) - .thenReturn(channel); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(支付渠道的调用) - PayOrderRespDTO unifiedOrderResp = randomPojo(PayOrderRespDTO.class, o -> o.setChannelErrorCode(null).setChannelErrorMsg(null) - .setDisplayMode(PayOrderDisplayModeEnum.URL.getMode()).setDisplayContent("tudou")); - when(client.unifiedOrder(argThat(payOrderUnifiedReqDTO -> { - assertNotNull(payOrderUnifiedReqDTO.getOutTradeNo()); - assertThat(payOrderUnifiedReqDTO) - .extracting("subject", "body", "notifyUrl", "returnUrl", "price", "expireTime") - .containsExactly(order.getSubject(), order.getBody(), "http://127.0.0.1/10", - reqVO.getReturnUrl(), order.getPrice(), order.getExpireTime()); - return true; - }))).thenReturn(unifiedOrderResp); - - // 调用 - PayOrderSubmitRespVO result = orderService.submitOrder(reqVO, userIp); - // 断言,数据记录(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = orderExtensionMapper.selectOne(null); - assertNotNull(orderExtension); - assertThat(orderExtension).extracting("no", "orderId").isNotNull(); - assertThat(orderExtension) - .extracting("channelId", "channelCode","userIp" ,"status", "channelExtras", - "channelErrorCode", "channelErrorMsg", "channelNotifyData") - .containsExactly(10L, PayChannelEnum.ALIPAY_APP.getCode(), userIp, - PayOrderStatusEnum.WAITING.getStatus(), reqVO.getChannelExtras(), - null, null, null); - // 断言,返回(PayOrderSubmitRespVO) - assertThat(result) - .extracting("status", "displayMode", "displayContent") - .containsExactly(PayOrderStatusEnum.WAITING.getStatus(), PayOrderDisplayModeEnum.URL.getMode(), "tudou"); - // 断言,调用 - verify(payOrderServiceImpl).notifyOrder(same(channel), same(unifiedOrderResp)); - } - } - - @Test - public void testValidateOrderActuallyPaid_dbPaid() { - // 准备参数 - Long id = randomLongId(); - // mock 方法(OrderExtension 已支付) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setOrderId(id).setStatus(PayOrderStatusEnum.SUCCESS.getStatus())); - orderExtensionMapper.insert(orderExtension); - - // 调用,并断言异常 - assertServiceException(() -> orderService.validateOrderActuallyPaid(id), - ORDER_EXTENSION_IS_PAID); - } - - @Test - public void testValidateOrderActuallyPaid_remotePaid() { - // 准备参数 - Long id = randomLongId(); - // mock 方法(OrderExtension 已支付) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setOrderId(id).setStatus(PayOrderStatusEnum.WAITING.getStatus())); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient 已支付) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(orderExtension.getChannelId()))).thenReturn(client); - when(client.getOrder(eq(orderExtension.getNo()))).thenReturn(randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()))); - - // 调用,并断言异常 - assertServiceException(() -> orderService.validateOrderActuallyPaid(id), - ORDER_EXTENSION_IS_PAID); - } - - @Test - public void testValidateOrderActuallyPaid_success() { - // 准备参数 - Long id = randomLongId(); - // mock 方法(OrderExtension 已支付) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setOrderId(id).setStatus(PayOrderStatusEnum.WAITING.getStatus())); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient 已支付) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(orderExtension.getChannelId()))).thenReturn(client); - when(client.getOrder(eq(orderExtension.getNo()))).thenReturn(randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()))); - - // 调用,并断言异常 - orderService.validateOrderActuallyPaid(id); - } - - @Test - public void testNotifyOrder_channelId() { - PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) - .thenReturn(payOrderServiceImpl); - // 准备参数 - Long channelId = 10L; - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - - // 调用 - orderService.notifyOrder(channelId, notify); - // 断言 - verify(payOrderServiceImpl).notifyOrder(same(channel), same(notify)); - } - } - - @Test - public void testNotifyOrderSuccess_orderExtension_notFound() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.SUCCESS.getStatus())); - - // 调用,并断言异常 - assertServiceException(() -> orderService.notifyOrder(channel, notify), - ORDER_EXTENSION_NOT_FOUND); - } - - @Test - public void testNotifyOrderSuccess_orderExtension_closed() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()) - .setNo("P110")); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.SUCCESS.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言异常 - assertServiceException(() -> orderService.notifyOrder(channel, notify), - ORDER_EXTENSION_STATUS_IS_NOT_WAITING); - } - - @Test - public void testNotifyOrderSuccess_order_notFound() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setNo("P110")); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.SUCCESS.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言异常 - assertServiceException(() -> orderService.notifyOrder(channel, notify), - ORDER_NOT_FOUND); - // 断言 PayOrderExtensionDO :数据更新被回滚 - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null)); - } - - @Test - public void testNotifyOrderSuccess_order_closed() { - testNotifyOrderSuccess_order_closedOrRefund(PayOrderStatusEnum.CLOSED.getStatus()); - } - - @Test - public void testNotifyOrderSuccess_order_refund() { - testNotifyOrderSuccess_order_closedOrRefund(PayOrderStatusEnum.REFUND.getStatus()); - } - - private void testNotifyOrderSuccess_order_closedOrRefund(Integer status) { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(status)); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setNo("P110") - .setOrderId(order.getId())); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.SUCCESS.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言异常 - assertServiceException(() -> orderService.notifyOrder(channel, notify), - ORDER_STATUS_IS_NOT_WAITING); - // 断言 PayOrderExtensionDO :数据未更新,因为它是 SUCCESS - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null)); - } - - @Test - public void testNotifyOrderSuccess_order_paid() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus())); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setNo("P110") - .setOrderId(order.getId())); - orderExtensionMapper.insert(orderExtension); - // 重要:需要将 order 的 extensionId 更新下 - order.setExtensionId(orderExtension.getId()); - orderMapper.updateById(order); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.SUCCESS.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言异常 - orderService.notifyOrder(channel, notify); - // 断言 PayOrderExtensionDO :数据未更新,因为它是 SUCCESS - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null)); - // 断言 PayOrderDO :数据未更新,因为它是 SUCCESS - assertPojoEquals(order, orderMapper.selectOne(null)); - // 断言,调用 - verify(notifyService, never()).createPayNotifyTask(anyInt(), anyLong()); - } - - @Test - public void testNotifyOrderSuccess_order_waiting() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setPrice(10)); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setNo("P110") - .setOrderId(order.getId())); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setFeeRate(0.1D)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.SUCCESS.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言异常 - orderService.notifyOrder(channel, notify); - // 断言 PayOrderExtensionDO :数据未更新,因为它是 SUCCESS - orderExtension.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setChannelNotifyData(toJsonString(notify)); - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null), - "updateTime", "updater"); - // 断言 PayOrderDO :数据未更新,因为它是 SUCCESS - order.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setChannelId(10L).setChannelCode(channel.getCode()) - .setSuccessTime(notify.getSuccessTime()).setExtensionId(orderExtension.getId()).setNo(orderExtension.getNo()) - .setChannelOrderNo(notify.getChannelOrderNo()).setChannelUserId(notify.getChannelUserId()) - .setChannelFeeRate(0.1D).setChannelFeePrice(1); - assertPojoEquals(order, orderMapper.selectOne(null), - "updateTime", "updater"); - // 断言,调用 - verify(notifyService).createPayNotifyTask(eq(PayNotifyTypeEnum.ORDER.getType()), - eq(orderExtension.getOrderId())); - } - - @Test - public void testNotifyOrderClosed_orderExtension_notFound() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.CLOSED.getStatus())); - - // 调用,并断言异常 - assertServiceException(() -> orderService.notifyOrder(channel, notify), - ORDER_EXTENSION_NOT_FOUND); - } - - @Test - public void testNotifyOrderClosed_orderExtension_closed() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()) - .setNo("P110")); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.CLOSED.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言 - orderService.notifyOrder(channel, notify); - // 断言 PayOrderExtensionDO :数据未更新,因为它是 CLOSED - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null)); - } - - @Test - public void testNotifyOrderClosed_orderExtension_paid() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setNo("P110")); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.CLOSED.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言 - orderService.notifyOrder(channel, notify); - // 断言 PayOrderExtensionDO :数据未更新,因为它是 SUCCESS - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null)); - } - - @Test - public void testNotifyOrderClosed_orderExtension_refund() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setNo("P110")); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.CLOSED.getStatus()) - .setOutTradeNo("P110")); - - // 调用,并断言异常 - assertServiceException(() -> orderService.notifyOrder(channel, notify), - ORDER_EXTENSION_STATUS_IS_NOT_WAITING); - } - - @Test - public void testNotifyOrderClosed_orderExtension_waiting() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setNo("P110")); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - PayOrderRespDTO notify = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusRespEnum.CLOSED.getStatus()) - .setOutTradeNo("P110")); - - // 调用 - orderService.notifyOrder(channel, notify); - // 断言 PayOrderExtensionDO - orderExtension.setStatus(PayOrderStatusEnum.CLOSED.getStatus()).setChannelNotifyData(toJsonString(notify)) - .setChannelErrorCode(notify.getChannelErrorCode()).setChannelErrorMsg(notify.getChannelErrorMsg()); - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null), - "updateTime", "updater"); - } - - @Test - public void testUpdateOrderRefundPrice_notFound() { - // 准备参数 - Long id = randomLongId(); - Integer incrRefundPrice = randomInteger(); - - // 调用,并断言异常 - assertServiceException(() -> orderService.updateOrderRefundPrice(id, incrRefundPrice), - ORDER_NOT_FOUND); - } - - @Test - public void testUpdateOrderRefundPrice_waiting() { - testUpdateOrderRefundPrice_waitingOrClosed(PayOrderStatusEnum.WAITING.getStatus()); - } - - @Test - public void testUpdateOrderRefundPrice_closed() { - testUpdateOrderRefundPrice_waitingOrClosed(PayOrderStatusEnum.CLOSED.getStatus()); - } - - private void testUpdateOrderRefundPrice_waitingOrClosed(Integer status) { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(status)); - orderMapper.insert(order); - // 准备参数 - Long id = order.getId(); - Integer incrRefundPrice = randomInteger(); - - // 调用,并断言异常 - assertServiceException(() -> orderService.updateOrderRefundPrice(id, incrRefundPrice), - ORDER_REFUND_FAIL_STATUS_ERROR); - } - - @Test - public void testUpdateOrderRefundPrice_priceExceed() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setRefundPrice(1).setPrice(10)); - orderMapper.insert(order); - // 准备参数 - Long id = order.getId(); - Integer incrRefundPrice = 10; - - // 调用,并断言异常 - assertServiceException(() -> orderService.updateOrderRefundPrice(id, incrRefundPrice), - REFUND_PRICE_EXCEED); - } - - @Test - public void testUpdateOrderRefundPrice_refund() { - testUpdateOrderRefundPrice_refundOrSuccess(PayOrderStatusEnum.REFUND.getStatus()); - } - - @Test - public void testUpdateOrderRefundPrice_success() { - testUpdateOrderRefundPrice_refundOrSuccess(PayOrderStatusEnum.SUCCESS.getStatus()); - } - - private void testUpdateOrderRefundPrice_refundOrSuccess(Integer status) { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(status).setRefundPrice(1).setPrice(10)); - orderMapper.insert(order); - // 准备参数 - Long id = order.getId(); - Integer incrRefundPrice = 8; - - // 调用 - orderService.updateOrderRefundPrice(id, incrRefundPrice); - // 断言 - order.setRefundPrice(9).setStatus(PayOrderStatusEnum.REFUND.getStatus()); - assertPojoEquals(order, orderMapper.selectOne(null), - "updateTime", "updater"); - } - - @Test - public void testGetOrderExtension() { - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class); - orderExtensionMapper.insert(orderExtension); - // 准备参数 - Long id = orderExtension.getId(); - - // 调用 - PayOrderExtensionDO dbOrderExtension = orderService.getOrderExtension(id); - // 断言 - assertPojoEquals(dbOrderExtension, orderExtension); - } - - @Test - public void testSyncOrder_payClientNotFound() { - // 准备参数 - LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setCreateTime(LocalDateTime.now())); - orderExtensionMapper.insert(orderExtension); - - // 调用 - int count = orderService.syncOrder(minCreateTime); - // 断言 - assertEquals(count, 0); - } - - @Test - public void testSyncOrder_exception() { - // 准备参数 - LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setChannelId(10L) - .setCreateTime(LocalDateTime.now())); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(PayClient 异常) - when(client.getOrder(any())).thenThrow(new RuntimeException()); - - // 调用 - int count = orderService.syncOrder(minCreateTime); - // 断言 - assertEquals(count, 0); - } - - @Test - public void testSyncOrder_orderSuccess() { - PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) - .thenReturn(payOrderServiceImpl); - - // 准备参数 - LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setChannelId(10L).setNo("P110") - .setCreateTime(LocalDateTime.now())); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(PayClient 成功返回) - PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus())); - when(client.getOrder(eq("P110"))).thenReturn(respDTO); - // mock 方法(PayChannelDO) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - - // 调用 - int count = orderService.syncOrder(minCreateTime); - // 断言 - assertEquals(count, 1); - verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO)); - } - } - - @Test - public void testSyncOrder_orderClosed() { - PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) - .thenReturn(payOrderServiceImpl); - - // 准备参数 - LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); - // mock 数据(PayOrderExtensionDO) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setChannelId(10L).setNo("P110") - .setCreateTime(LocalDateTime.now())); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(PayClient 成功返回) - PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus())); - when(client.getOrder(eq("P110"))).thenReturn(respDTO); - // mock 方法(PayChannelDO) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - - // 调用 - int count = orderService.syncOrder(minCreateTime); - // 断言 - assertEquals(count, 0); - verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO)); - } - } - - @Test - public void testExpireOrder_orderExtension_isSuccess() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setExpireTime(addTime(Duration.ofMinutes(-1)))); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO 已支付) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()) - .setOrderId(order.getId())); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - - // 调用 - int count = orderService.expireOrder(); - // 断言 - assertEquals(count, 0); - // 断言 order 没有变化,因为没更新 - assertPojoEquals(order, orderMapper.selectOne(null)); - } - - @Test - public void testExpireOrder_payClient_notFound() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setExpireTime(addTime(Duration.ofMinutes(-1)))); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO 等待中) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setOrderId(order.getId()) - .setChannelId(10L)); - orderExtensionMapper.insert(orderExtension); - - // 调用 - int count = orderService.expireOrder(); - // 断言 - assertEquals(count, 0); - // 断言 order 没有变化,因为没更新 - assertPojoEquals(order, orderMapper.selectOne(null)); - } - - @Test - public void testExpireOrder_getOrder_isRefund() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setExpireTime(addTime(Duration.ofMinutes(-1)))); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO 等待中) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setOrderId(order.getId()).setNo("P110") - .setChannelId(10L)); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(PayClient 退款返回) - PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.REFUND.getStatus())); - when(client.getOrder(eq("P110"))).thenReturn(respDTO); - - // 调用 - int count = orderService.expireOrder(); - // 断言 - assertEquals(count, 0); - // 断言 order 没有变化,因为没更新 - assertPojoEquals(order, orderMapper.selectOne(null)); - } - - @Test - public void testExpireOrder_getOrder_isSuccess() { - PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) - .thenReturn(payOrderServiceImpl); - - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setExpireTime(addTime(Duration.ofMinutes(-1)))); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO 等待中) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setOrderId(order.getId()).setNo("P110") - .setChannelId(10L)); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(PayClient 成功返回) - PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus())); - when(client.getOrder(eq("P110"))).thenReturn(respDTO); - // mock 方法(PayChannelDO) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - - // 调用 - int count = orderService.expireOrder(); - // 断言 - assertEquals(count, 0); - // 断言 order 没有变化,因为没更新 - assertPojoEquals(order, orderMapper.selectOne(null)); - verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO)); - } - } - - @Test - public void testExpireOrder_success() { - // mock 数据(PayOrderDO) - PayOrderDO order = randomPojo(PayOrderDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setExpireTime(addTime(Duration.ofMinutes(-1)))); - orderMapper.insert(order); - // mock 数据(PayOrderExtensionDO 等待中) - PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, - o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) - .setOrderId(order.getId()).setNo("P110") - .setChannelId(10L)); - orderExtensionMapper.insert(orderExtension); - // mock 方法(PayClient) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(PayClient 关闭返回) - PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, - o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus())); - when(client.getOrder(eq("P110"))).thenReturn(respDTO); - - // 调用 - int count = orderService.expireOrder(); - // 断言 - assertEquals(count, 1); - // 断言 extension 变化 - orderExtension.setStatus(PayOrderStatusEnum.CLOSED.getStatus()) - .setChannelNotifyData(toJsonString(respDTO)); - assertPojoEquals(orderExtension, orderExtensionMapper.selectOne(null), - "updateTime", "updater"); - // 断言 order 变化 - order.setStatus(PayOrderStatusEnum.CLOSED.getStatus()); - assertPojoEquals(order, orderMapper.selectOne(null), - "updateTime", "updater"); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/refund/PayRefundServiceTest.java b/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/refund/PayRefundServiceTest.java deleted file mode 100644 index c72f3971..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/java/com/win/module/pay/service/refund/PayRefundServiceTest.java +++ /dev/null @@ -1,703 +0,0 @@ -package com.win.module.pay.service.refund; - -import cn.hutool.extra.spring.SpringUtil; -import com.win.framework.common.pojo.PageResult; -import com.win.framework.pay.core.client.PayClient; -import com.win.framework.pay.core.client.PayClientFactory; -import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO; -import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; -import com.win.framework.pay.core.enums.channel.PayChannelEnum; -import com.win.framework.pay.core.enums.refund.PayRefundStatusRespEnum; -import com.win.framework.test.core.ut.BaseDbAndRedisUnitTest; -import com.win.module.pay.api.refund.dto.PayRefundCreateReqDTO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; -import com.win.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; -import com.win.module.pay.dal.dataobject.app.PayAppDO; -import com.win.module.pay.dal.dataobject.channel.PayChannelDO; -import com.win.module.pay.dal.dataobject.order.PayOrderDO; -import com.win.module.pay.dal.dataobject.refund.PayRefundDO; -import com.win.module.pay.dal.mysql.refund.PayRefundMapper; -import com.win.module.pay.dal.redis.no.PayNoRedisDAO; -import com.win.module.pay.enums.notify.PayNotifyTypeEnum; -import com.win.module.pay.enums.order.PayOrderStatusEnum; -import com.win.module.pay.enums.refund.PayRefundStatusEnum; -import com.win.module.pay.framework.pay.config.PayProperties; -import com.win.module.pay.service.app.PayAppService; -import com.win.module.pay.service.channel.PayChannelService; -import com.win.module.pay.service.notify.PayNotifyService; -import com.win.module.pay.service.order.PayOrderService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; - -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static com.win.framework.common.util.date.LocalDateTimeUtils.buildTime; -import static com.win.framework.common.util.json.JsonUtils.toJsonString; -import static com.win.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static com.win.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.win.framework.test.core.util.AssertUtils.assertServiceException; -import static com.win.framework.test.core.util.RandomUtils.randomPojo; -import static com.win.framework.test.core.util.RandomUtils.randomString; -import static com.win.module.pay.enums.ErrorCodeConstants.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** - * {@link PayRefundServiceImpl} 的单元测试类 - * - * @author 芋艿 - */ -@Import({PayRefundServiceImpl.class, PayNoRedisDAO.class}) -public class PayRefundServiceTest extends BaseDbAndRedisUnitTest { - - @Resource - private PayRefundServiceImpl refundService; - - @Resource - private PayRefundMapper refundMapper; - - @MockBean - private PayProperties payProperties; - @MockBean - private PayClientFactory payClientFactory; - @MockBean - private PayOrderService orderService; - @MockBean - private PayAppService appService; - @MockBean - private PayChannelService channelService; - @MockBean - private PayNotifyService notifyService; - - @BeforeEach - public void setUp() { - when(payProperties.getRefundNotifyUrl()).thenReturn("http://127.0.0.1"); - } - - @Test - public void testGetRefund() { - // mock 数据 - PayRefundDO refund = randomPojo(PayRefundDO.class); - refundMapper.insert(refund); - // 准备参数 - Long id = refund.getId(); - - // 调用 - PayRefundDO dbRefund = refundService.getRefund(id); - // 断言 - assertPojoEquals(dbRefund, refund); - } - - @Test - public void testGetRefundCountByAppId() { - // mock 数据 - PayRefundDO refund01 = randomPojo(PayRefundDO.class); - refundMapper.insert(refund01); - PayRefundDO refund02 = randomPojo(PayRefundDO.class); - refundMapper.insert(refund02); - // 准备参数 - Long appId = refund01.getAppId(); - - // 调用 - Long count = refundService.getRefundCountByAppId(appId); - // 断言 - assertEquals(count, 1); - } - - @Test - public void testGetRefundPage() { - // mock 数据 - PayRefundDO dbRefund = randomPojo(PayRefundDO.class, o -> { // 等会查询到 - o.setAppId(1L); - o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - o.setMerchantOrderId("MOT0000001"); - o.setMerchantRefundId("MRF0000001"); - o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - o.setChannelOrderNo("CH0000001"); - o.setChannelRefundNo("CHR0000001"); - o.setCreateTime(buildTime(2021, 1, 10)); - }); - refundMapper.insert(dbRefund); - // 测试 appId 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setAppId(2L))); - // 测试 channelCode 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); - // 测试 merchantOrderId 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantOrderId(randomString()))); - // 测试 merchantRefundId 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantRefundId(randomString()))); - // 测试 channelOrderNo 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelOrderNo(randomString()))); - // 测试 channelRefundNo 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelRefundNo(randomString()))); - // 测试 status 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()))); - // 测试 createTime 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - PayRefundPageReqVO reqVO = new PayRefundPageReqVO(); - reqVO.setAppId(1L); - reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - reqVO.setMerchantOrderId("MOT0000001"); - reqVO.setMerchantRefundId("MRF0000001"); - reqVO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - reqVO.setChannelOrderNo("CH0000001"); - reqVO.setChannelRefundNo("CHR0000001"); - reqVO.setCreateTime(buildBetweenTime(2021, 1, 9, 2021, 1, 11)); - - // 调用 - PageResult pageResult = refundService.getRefundPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbRefund, pageResult.getList().get(0)); - } - - @Test - public void testGetRefundList() { - // mock 数据 - PayRefundDO dbRefund = randomPojo(PayRefundDO.class, o -> { // 等会查询到 - o.setAppId(1L); - o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - o.setMerchantOrderId("MOT0000001"); - o.setMerchantRefundId("MRF0000001"); - o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - o.setChannelOrderNo("CH0000001"); - o.setChannelRefundNo("CHR0000001"); - o.setCreateTime(buildTime(2021, 1, 10)); - }); - refundMapper.insert(dbRefund); - // 测试 appId 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setAppId(2L))); - // 测试 channelCode 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); - // 测试 merchantOrderId 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantOrderId(randomString()))); - // 测试 merchantRefundId 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantRefundId(randomString()))); - // 测试 channelOrderNo 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelOrderNo(randomString()))); - // 测试 channelRefundNo 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelRefundNo(randomString()))); - // 测试 status 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()))); - // 测试 createTime 不匹配 - refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - PayRefundExportReqVO reqVO = new PayRefundExportReqVO(); - reqVO.setAppId(1L); - reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); - reqVO.setMerchantOrderId("MOT0000001"); - reqVO.setMerchantRefundId("MRF0000001"); - reqVO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); - reqVO.setChannelOrderNo("CH0000001"); - reqVO.setChannelRefundNo("CHR0000001"); - reqVO.setCreateTime(buildBetweenTime(2021, 1, 9, 2021, 1, 11)); - - // 调用 - List list = refundService.getRefundList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbRefund, list.get(0)); - } - - @Test - public void testCreateRefund_orderNotFound() { - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L)); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - - // 调用,并断言异常 - assertServiceException(() -> refundService.createPayRefund(reqDTO), - ORDER_NOT_FOUND); - } - - @Test - public void testCreateRefund_orderWaiting() { - testCreateRefund_orderWaitingOrClosed(PayOrderStatusEnum.WAITING.getStatus()); - } - - @Test - public void testCreateRefund_orderClosed() { - testCreateRefund_orderWaitingOrClosed(PayOrderStatusEnum.CLOSED.getStatus()); - } - - private void testCreateRefund_orderWaitingOrClosed(Integer status) { - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100")); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(status)); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - - // 调用,并断言异常 - assertServiceException(() -> refundService.createPayRefund(reqDTO), - ORDER_REFUND_FAIL_STATUS_ERROR); - } - - @Test - public void testCreateRefund_refundPriceExceed() { - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100").setPrice(10)); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> - o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setPrice(10).setRefundPrice(1)); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - - // 调用,并断言异常 - assertServiceException(() -> refundService.createPayRefund(reqDTO), - REFUND_PRICE_EXCEED); - } - - @Test - public void testCreateRefund_orderHasRefunding() { - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100").setPrice(10)); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> - o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setPrice(10).setRefundPrice(1)); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - // mock 数据(refund 在退款中) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> - o.setOrderId(order.getId()).setStatus(PayOrderStatusEnum.WAITING.getStatus())); - refundMapper.insert(refund); - - // 调用,并断言异常 - assertServiceException(() -> refundService.createPayRefund(reqDTO), - REFUND_PRICE_EXCEED); - } - - @Test - public void testCreateRefund_channelNotFound() { - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100").setPrice(9)); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> - o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setPrice(10).setRefundPrice(1) - .setChannelId(1L).setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(1L))).thenReturn(channel); - - // 调用,并断言异常 - assertServiceException(() -> refundService.createPayRefund(reqDTO), - CHANNEL_NOT_FOUND); - } - - @Test - public void testCreateRefund_refundExists() { - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100").setPrice(9) - .setMerchantRefundId("200").setReason("测试退款")); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> - o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setPrice(10).setRefundPrice(1) - .setChannelId(1L).setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(1L))).thenReturn(channel); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 数据(refund 已存在) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> - o.setAppId(1L).setMerchantRefundId("200")); - refundMapper.insert(refund); - - // 调用,并断言异常 - assertServiceException(() -> refundService.createPayRefund(reqDTO), - REFUND_EXISTS); - } - - @Test - public void testCreateRefund_invokeException() { - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100").setPrice(9) - .setMerchantRefundId("200").setReason("测试退款")); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> - o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setPrice(10).setRefundPrice(1) - .setChannelId(10L).setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(client 调用发生异常) - when(client.unifiedRefund(any(PayRefundUnifiedReqDTO.class))).thenThrow(new RuntimeException()); - - // 调用 - Long refundId = refundService.createPayRefund(reqDTO); - // 断言 - PayRefundDO refundDO = refundMapper.selectById(refundId); - assertPojoEquals(reqDTO, refundDO); - assertNotNull(refundDO.getNo()); - assertThat(refundDO) - .extracting("orderId", "orderNo", "channelId", "channelCode", - "notifyUrl", "channelOrderNo", "status", "payPrice", "refundPrice") - .containsExactly(order.getId(), order.getNo(), channel.getId(), channel.getCode(), - app.getRefundNotifyUrl(), order.getChannelOrderNo(), PayRefundStatusEnum.WAITING.getStatus(), - order.getPrice(), reqDTO.getPrice()); - } - - @Test - public void testCreateRefund_invokeSuccess() { - PayRefundServiceImpl payRefundServiceImpl = mock(PayRefundServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayRefundServiceImpl.class))) - .thenReturn(payRefundServiceImpl); - - // 准备参数 - PayRefundCreateReqDTO reqDTO = randomPojo(PayRefundCreateReqDTO.class, - o -> o.setAppId(1L).setMerchantOrderId("100").setPrice(9) - .setMerchantRefundId("200").setReason("测试退款")); - // mock 方法(app) - PayAppDO app = randomPojo(PayAppDO.class, o -> o.setId(1L)); - when(appService.validPayApp(eq(1L))).thenReturn(app); - // mock 数据(order) - PayOrderDO order = randomPojo(PayOrderDO.class, o -> - o.setStatus(PayOrderStatusEnum.REFUND.getStatus()) - .setPrice(10).setRefundPrice(1) - .setChannelId(10L).setChannelCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(orderService.getOrder(eq(1L), eq("100"))).thenReturn(order); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L) - .setCode(PayChannelEnum.ALIPAY_APP.getCode())); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(client 成功) - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class); - when(client.unifiedRefund(argThat(unifiedReqDTO -> { - assertNotNull(unifiedReqDTO.getOutRefundNo()); - assertThat(unifiedReqDTO) - .extracting("payPrice", "refundPrice", "outTradeNo", - "notifyUrl", "reason") - .containsExactly(order.getPrice(), reqDTO.getPrice(), order.getNo(), - "http://127.0.0.1/10", reqDTO.getReason()); - return true; - }))).thenReturn(refundRespDTO); - - // 调用 - Long refundId = refundService.createPayRefund(reqDTO); - // 断言 - PayRefundDO refundDO = refundMapper.selectById(refundId); - assertPojoEquals(reqDTO, refundDO); - assertNotNull(refundDO.getNo()); - assertThat(refundDO) - .extracting("orderId", "orderNo", "channelId", "channelCode", - "notifyUrl", "channelOrderNo", "status", "payPrice", "refundPrice") - .containsExactly(order.getId(), order.getNo(), channel.getId(), channel.getCode(), - app.getRefundNotifyUrl(), order.getChannelOrderNo(), PayRefundStatusEnum.WAITING.getStatus(), - order.getPrice(), reqDTO.getPrice()); - // 断言调用 - verify(payRefundServiceImpl).notifyRefund(same(channel), same(refundRespDTO)); - } - } - - @Test - public void testNotifyRefund() { - PayRefundServiceImpl payRefundServiceImpl = mock(PayRefundServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayRefundServiceImpl.class))) - .thenReturn(payRefundServiceImpl); - - // 准备参数 - Long channelId = 10L; - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - - // 调用 - refundService.notifyRefund(channelId, refundRespDTO); - // 断言 - verify(payRefundServiceImpl).notifyRefund(same(channel), same(refundRespDTO)); - } - } - - @Test - public void testNotifyRefundSuccess_notFound() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.SUCCESS.getStatus()).setOutRefundNo("R100")); - - // 调用,并断言异常 - assertServiceException(() -> refundService.notifyRefund(channel, refundRespDTO), - REFUND_NOT_FOUND); - } - - @Test - public void testNotifyRefundSuccess_isSuccess() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.SUCCESS.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 已支付) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.SUCCESS.getStatus())); - refundMapper.insert(refund); - - // 调用 - refundService.notifyRefund(channel, refundRespDTO); - // 断言,refund 没有更新,因为已经退款成功 - assertPojoEquals(refund, refundMapper.selectById(refund.getId())); - } - - @Test - public void testNotifyRefundSuccess_failure() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.SUCCESS.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 已支付) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.FAILURE.getStatus())); - refundMapper.insert(refund); - - // 调用,并断言异常 - assertServiceException(() -> refundService.notifyRefund(channel, refundRespDTO), - REFUND_STATUS_IS_NOT_WAITING); - } - - @Test - public void testNotifyRefundSuccess_updateOrderException() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.SUCCESS.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 已支付) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.WAITING.getStatus()) - .setOrderId(100L).setRefundPrice(23)); - refundMapper.insert(refund); - // mock 方法(order + 更新异常) - doThrow(new RuntimeException()).when(orderService) - .updateOrderRefundPrice(eq(100L), eq(23)); - - // 调用,并断言异常 - assertThrows(RuntimeException.class, () -> refundService.notifyRefund(channel, refundRespDTO)); - // 断言,refund 没有更新,因为事务回滚了 - assertPojoEquals(refund, refundMapper.selectById(refund.getId())); - } - - @Test - public void testNotifyRefundSuccess_success() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.SUCCESS.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 已支付) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.WAITING.getStatus()) - .setOrderId(100L).setRefundPrice(23)); - refundMapper.insert(refund); - - // 调用 - refundService.notifyRefund(channel, refundRespDTO); - // 断言,refund - refund.setSuccessTime(refundRespDTO.getSuccessTime()) - .setChannelRefundNo(refundRespDTO.getChannelRefundNo()) - .setStatus(PayRefundStatusEnum.SUCCESS.getStatus()) - .setChannelNotifyData(toJsonString(refundRespDTO)); - assertPojoEquals(refund, refundMapper.selectById(refund.getId()), - "updateTime", "updater"); - // 断言,调用 - verify(orderService).updateOrderRefundPrice(eq(100L), eq(23)); - verify(notifyService).createPayNotifyTask(eq(PayNotifyTypeEnum.REFUND.getType()), - eq(refund.getId())); - } - - @Test - public void testNotifyRefundFailure_notFound() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.FAILURE.getStatus()).setOutRefundNo("R100")); - - // 调用,并断言异常 - assertServiceException(() -> refundService.notifyRefund(channel, refundRespDTO), - REFUND_NOT_FOUND); - } - - @Test - public void testNotifyRefundFailure_isFailure() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.FAILURE.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 退款失败) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.FAILURE.getStatus())); - refundMapper.insert(refund); - - // 调用 - refundService.notifyRefund(channel, refundRespDTO); - // 断言,refund 没有更新,因为已经退款失败 - assertPojoEquals(refund, refundMapper.selectById(refund.getId())); - } - - @Test - public void testNotifyRefundFailure_isSuccess() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.FAILURE.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 已支付) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.SUCCESS.getStatus())); - refundMapper.insert(refund); - - // 调用,并断言异常 - assertServiceException(() -> refundService.notifyRefund(channel, refundRespDTO), - REFUND_STATUS_IS_NOT_WAITING); - } - - @Test - public void testNotifyRefundFailure_success() { - // 准备参数 - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L).setAppId(1L)); - PayRefundRespDTO refundRespDTO = randomPojo(PayRefundRespDTO.class, - o -> o.setStatus(PayRefundStatusRespEnum.FAILURE.getStatus()).setOutRefundNo("R100")); - // mock 数据(refund + 已支付) - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setNo("R100") - .setStatus(PayRefundStatusEnum.WAITING.getStatus()) - .setOrderId(100L).setRefundPrice(23)); - refundMapper.insert(refund); - - // 调用 - refundService.notifyRefund(channel, refundRespDTO); - // 断言,refund - refund.setChannelRefundNo(refundRespDTO.getChannelRefundNo()) - .setStatus(PayRefundStatusEnum.FAILURE.getStatus()) - .setChannelNotifyData(toJsonString(refundRespDTO)) - .setChannelErrorCode(refundRespDTO.getChannelErrorCode()) - .setChannelErrorMsg(refundRespDTO.getChannelErrorMsg()); - assertPojoEquals(refund, refundMapper.selectById(refund.getId()), - "updateTime", "updater"); - // 断言,调用 - verify(notifyService).createPayNotifyTask(eq(PayNotifyTypeEnum.REFUND.getType()), - eq(refund.getId())); - } - - @Test - public void testSyncRefund_notFound() { - // 准备参数 - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L) - .setStatus(PayRefundStatusEnum.WAITING.getStatus())); - refundMapper.insert(refund); - - // 调用 - int count = refundService.syncRefund(); - // 断言 - assertEquals(count, 0); - } - - @Test - public void testSyncRefund_waiting() { - assertEquals(testSyncRefund_waitingOrSuccessOrFailure(PayRefundStatusRespEnum.WAITING.getStatus()), 0); - } - - @Test - public void testSyncRefund_success() { - assertEquals(testSyncRefund_waitingOrSuccessOrFailure(PayRefundStatusRespEnum.SUCCESS.getStatus()), 1); - } - - @Test - public void testSyncRefund_failure() { - assertEquals(testSyncRefund_waitingOrSuccessOrFailure(PayRefundStatusRespEnum.FAILURE.getStatus()), 1); - } - - private int testSyncRefund_waitingOrSuccessOrFailure(Integer status) { - PayRefundServiceImpl payRefundServiceImpl = mock(PayRefundServiceImpl.class); - try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { - springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayRefundServiceImpl.class))) - .thenReturn(payRefundServiceImpl); - - // 准备参数 - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setChannelId(10L) - .setStatus(PayRefundStatusEnum.WAITING.getStatus()) - .setOrderNo("P110").setNo("R220")); - refundMapper.insert(refund); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(client 返回指定状态) - PayRefundRespDTO respDTO = randomPojo(PayRefundRespDTO.class, o -> o.setStatus(status)); - when(client.getRefund(eq("P110"), eq("R220"))).thenReturn(respDTO); - // mock 方法(channel) - PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); - when(channelService.validPayChannel(eq(10L))).thenReturn(channel); - - // 调用 - return refundService.syncRefund(); - } - } - - @Test - public void testSyncRefund_exception() { - // 准备参数 - PayRefundDO refund = randomPojo(PayRefundDO.class, o -> o.setAppId(1L).setChannelId(10L) - .setStatus(PayRefundStatusEnum.WAITING.getStatus()) - .setOrderNo("P110").setNo("R220")); - refundMapper.insert(refund); - // mock 方法(client) - PayClient client = mock(PayClient.class); - when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); - // mock 方法(client 抛出异常) - when(client.getRefund(eq("P110"), eq("R220"))).thenThrow(new RuntimeException()); - - // 调用 - int count = refundService.syncRefund(); - // 断言 - assertEquals(count, 0); - } - -} diff --git a/win-module-pay/win-module-pay-biz/src/test/resources/application-unit-test.yaml b/win-module-pay/win-module-pay-biz/src/test/resources/application-unit-test.yaml deleted file mode 100644 index aa9fd1ce..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/resources/application-unit-test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -spring: - main: - lazy-initialization: true # 开启懒加载,加快速度 - banner-mode: off # 单元测试,禁用 Banner - ---- #################### 数据库相关配置 #################### - -spring: - # 数据源配置项 - datasource: - name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 - driver-class-name: org.h2.Driver - username: sa - password: - druid: - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 - sql: - init: - schema-locations: classpath:/sql/create_tables.sql - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口(单元测试,使用 16379 端口) - database: 0 # 数据库索引 - -mybatis: - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 - ---- #################### 定时任务相关配置 #################### - ---- #################### 配置中心相关配置 #################### - ---- #################### 服务保障相关配置 #################### - -# Lock4j 配置项(单元测试,禁用 Lock4j) - -# Resilience4j 配置项 - ---- #################### 监控相关配置 #################### - ---- #################### 芋道相关配置 #################### - -# 芋道配置项,设置当前项目所有自定义的配置 -win: - info: - base-package: com.win.module diff --git a/win-module-pay/win-module-pay-biz/src/test/resources/logback.xml b/win-module-pay/win-module-pay-biz/src/test/resources/logback.xml deleted file mode 100644 index daf756bf..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/win-module-pay/win-module-pay-biz/src/test/resources/sql/clean.sql b/win-module-pay/win-module-pay-biz/src/test/resources/sql/clean.sql deleted file mode 100644 index 91fff0ca..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/resources/sql/clean.sql +++ /dev/null @@ -1,7 +0,0 @@ -DELETE FROM pay_app; -DELETE FROM pay_channel; -DELETE FROM pay_order; -DELETE FROM pay_order_extension; -DELETE FROM pay_refund; -DELETE FROM pay_notify_task; -DELETE FROM pay_notify_log; diff --git a/win-module-pay/win-module-pay-biz/src/test/resources/sql/create_tables.sql b/win-module-pay/win-module-pay-biz/src/test/resources/sql/create_tables.sql deleted file mode 100644 index 6ae2ce2d..00000000 --- a/win-module-pay/win-module-pay-biz/src/test/resources/sql/create_tables.sql +++ /dev/null @@ -1,146 +0,0 @@ -CREATE TABLE IF NOT EXISTS "pay_app" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar(64) NOT NULL, - "status" tinyint NOT NULL, - "remark" varchar(255) DEFAULT NULL, - `order_notify_url` varchar(1024) NOT NULL, - `refund_notify_url` varchar(1024) NOT NULL, - "creator" varchar(64) DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付应用'; - -CREATE TABLE IF NOT EXISTS "pay_channel" ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "code" varchar(32) NOT NULL, - "status" tinyint(4) NOT NULL, - "remark" varchar(255) DEFAULT NULL, - "fee_rate" double NOT NULL DEFAULT 0, - "app_id" bigint(20) NOT NULL, - "config" varchar(10240) NOT NULL, - "creator" varchar(64) NULL DEFAULT '', - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updater" varchar(64) NULL DEFAULT '', - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - "deleted" bit(1) NOT NULL DEFAULT FALSE, - "tenant_id" bigint not null default '0', - PRIMARY KEY ("id") -) COMMENT = '支付渠道'; - -CREATE TABLE IF NOT EXISTS `pay_order` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `app_id` bigint(20) NOT NULL, - `channel_id` bigint(20) DEFAULT NULL, - `channel_code` varchar(32) DEFAULT NULL, - `merchant_order_id` varchar(64) NOT NULL, - `subject` varchar(32) NOT NULL, - `body` varchar(128) NOT NULL, - `notify_url` varchar(1024) NOT NULL, - `price` bigint(20) NOT NULL, - `channel_fee_rate` double DEFAULT 0, - `channel_fee_price` bigint(20) DEFAULT 0, - `status` tinyint(4) NOT NULL, - `user_ip` varchar(50) NOT NULL, - `expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, - `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, - `extension_id` bigint(20) DEFAULT NULL, - `no` varchar(64) NULL, - `refund_price` bigint(20) NOT NULL, - `channel_user_id` varchar(255) DEFAULT NULL, - `channel_order_no` varchar(64) DEFAULT NULL, - `creator` varchar(64) DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付订单'; - -CREATE TABLE IF NOT EXISTS `pay_order_extension` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `no` varchar(64) NOT NULL, - `order_id` bigint(20) NOT NULL, - `channel_id` bigint(20) NOT NULL, - `channel_code` varchar(32) NOT NULL, - `user_ip` varchar(50) NULL DEFAULT NULL, - `status` tinyint(4) NOT NULL, - `channel_extras` varchar(1024) NULL DEFAULT NULL, - `channel_error_code` varchar(64) NULL, - `channel_error_msg` varchar(64) NULL, - `channel_notify_data` varchar(1024) NULL, - `creator` varchar(64) NULL DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) NULL DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付订单拓展'; - -CREATE TABLE IF NOT EXISTS `pay_refund` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `no` varchar(64) NOT NULL, - `app_id` bigint(20) NOT NULL, - `channel_id` bigint(20) NOT NULL, - `channel_code` varchar(32) NOT NULL, - `order_id` bigint(20) NOT NULL, - `order_no` varchar(64) NOT NULL, - `merchant_order_id` varchar(64) NOT NULL, - `merchant_refund_id` varchar(64) NOT NULL, - `notify_url` varchar(1024) NOT NULL, - `status` tinyint(4) NOT NULL, - `pay_price` bigint(20) NOT NULL, - `refund_price` bigint(20) NOT NULL, - `reason` varchar(256) NOT NULL, - `user_ip` varchar(50) NULL DEFAULT NULL, - `channel_order_no` varchar(64) NOT NULL, - `channel_refund_no` varchar(64) NULL DEFAULT NULL, - `success_time` datetime(0) NULL DEFAULT NULL, - `channel_error_code` varchar(128) NULL DEFAULT NULL, - `channel_error_msg` varchar(256) NULL DEFAULT NULL, - `channel_notify_data` varchar(1024) NULL, - `creator` varchar(64) NULL DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) NULL DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '退款订单'; - -CREATE TABLE IF NOT EXISTS `pay_notify_task` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `app_id` bigint(20) NOT NULL, - `type` tinyint(4) NOT NULL, - `data_id` bigint(20) NOT NULL, - `merchant_order_id` varchar(64) NOT NULL, - `status` tinyint(4) NOT NULL, - `next_notify_time` datetime(0) NULL DEFAULT NULL, - `last_execute_time` datetime(0) NULL DEFAULT NULL, - `notify_times` int NOT NULL, - `max_notify_times` int NOT NULL, - `notify_url` varchar(1024) NOT NULL, - `creator` varchar(64) NULL DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) NULL DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - `tenant_id` bigint(20) NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -) COMMENT = '支付通知任务'; - -CREATE TABLE IF NOT EXISTS `pay_notify_log` ( - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, - `task_id` bigint(20) NOT NULL, - `notify_times` int NOT NULL, - `response` varchar(1024) NOT NULL, - `status` tinyint(4) NOT NULL, - `creator` varchar(64) NULL DEFAULT '', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updater` varchar(64) NULL DEFAULT '', - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `deleted` bit(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY ("id") -) COMMENT = '支付通知日志'; diff --git a/win-server/src/main/java/com/win/server/controller/DefaultController.java b/win-server/src/main/java/com/win/server/controller/DefaultController.java index 9431966d..ad46a6fc 100644 --- a/win-server/src/main/java/com/win/server/controller/DefaultController.java +++ b/win-server/src/main/java/com/win/server/controller/DefaultController.java @@ -21,30 +21,10 @@ public class DefaultController { "[工作流模块 win-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); } - @RequestMapping("/admin-api/mp/**") - public CommonResult mp404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[微信公众号 win-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]"); - } - - @RequestMapping(value = {"/admin-api/product/**", // 商品中心 - "/admin-api/trade/**", // 交易中心 - "/admin-api/promotion/**"}) // 营销中心 - public CommonResult mall404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[商城系统 win-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); - } - @RequestMapping(value = {"/admin-api/report/**"}) public CommonResult report404() { return CommonResult.error(NOT_IMPLEMENTED.getCode(), "[报表模块 win-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]"); } - @RequestMapping(value = {"/admin-api/pay/**"}) - public CommonResult pay404() { - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[支付模块 win-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]"); - } - } diff --git a/win-server/src/main/resources/application-dev.yaml b/win-server/src/main/resources/application-dev.yaml index 717b5065..187f0b7b 100644 --- a/win-server/src/main/resources/application-dev.yaml +++ b/win-server/src/main/resources/application-dev.yaml @@ -1,5 +1,5 @@ server: - port: 48080 + port: 12080 --- #################### 数据库相关配置 #################### @@ -165,10 +165,7 @@ win: exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - pay: - order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址 - refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址 - demo: true # 开启演示模式 + demo: false # 开启演示模式 justauth: enabled: true diff --git a/win-server/src/main/resources/application-prod.yaml b/win-server/src/main/resources/application-prod.yaml index 717b5065..187f0b7b 100644 --- a/win-server/src/main/resources/application-prod.yaml +++ b/win-server/src/main/resources/application-prod.yaml @@ -1,5 +1,5 @@ server: - port: 48080 + port: 12080 --- #################### 数据库相关配置 #################### @@ -165,10 +165,7 @@ win: exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - pay: - order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址 - refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址 - demo: true # 开启演示模式 + demo: false # 开启演示模式 justauth: enabled: true diff --git a/win-server/src/main/resources/application-test.yaml b/win-server/src/main/resources/application-test.yaml index 717b5065..187f0b7b 100644 --- a/win-server/src/main/resources/application-test.yaml +++ b/win-server/src/main/resources/application-test.yaml @@ -1,5 +1,5 @@ server: - port: 48080 + port: 12080 --- #################### 数据库相关配置 #################### @@ -165,10 +165,7 @@ win: exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - pay: - order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址 - refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址 - demo: true # 开启演示模式 + demo: false # 开启演示模式 justauth: enabled: true diff --git a/win-server/src/main/resources/application.yaml b/win-server/src/main/resources/application.yaml index 04bdef49..f6f68a7f 100644 --- a/win-server/src/main/resources/application.yaml +++ b/win-server/src/main/resources/application.yaml @@ -141,10 +141,7 @@ win: constants-class-list: - com.win.module.bpm.enums.ErrorCodeConstants - com.win.module.infra.enums.ErrorCodeConstants - - com.win.module.member.enums.ErrorCodeConstants - - com.win.module.pay.enums.ErrorCodeConstants - com.win.module.system.enums.ErrorCodeConstants - - com.win.module.mp.enums.ErrorCodeConstants mq: redis: pubsub: