From 99ddd78578d73dc15a17ef03ddf56933399543f1 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Mon, 12 May 2025 15:28:43 +0800 Subject: [PATCH] refactor(mall): 积分支付相关功能 --- src/main/java/cc/mrbird/febs/mall/vo/MallGoodsListVo.java | 3 src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java | 3 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java | 10 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 222 +++++++---- src/main/java/cc/mrbird/febs/mall/controller/member/ApiMallMemberController.java | 4 src/main/java/cc/mrbird/febs/mall/controller/signActivity/ApiScoreController.java | 2 src/main/java/cc/mrbird/febs/mall/vo/OrderItemVo.java | 3 src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsController.java | 2 src/main/java/cc/mrbird/febs/mall/controller/order/ViewMallOrderController.java | 2 src/main/java/cc/mrbird/febs/vip/service/IVipCommonService.java | 3 src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java | 6 src/main/java/cc/mrbird/febs/mall/vo/OrderListVo.java | 3 src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java | 18 + src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html | 58 +- src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java | 2 src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java | 1 src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java | 7 src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html | 38 + src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java | 2 src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsController.java | 2 src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallAddressInfoController.java | 4 src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java | 436 +++++++++++++++++------ src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsController.java | 4 src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberFootprintController.java | 4 src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsCategoryController.java | 4 src/main/java/cc/mrbird/febs/common/enumerates/ScoreFlowTypeEnum.java | 7 src/main/java/cc/mrbird/febs/mall/controller/order/AdminMallOrderController.java | 12 src/main/resources/mapper/modules/MallOrderInfoMapper.xml | 2 src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallInvoiceController.java | 2 src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java | 3 src/main/resources/mapper/modules/MallGoodsMapper.xml | 4 src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallShoppingCartController.java | 4 src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallOrderController.java | 4 src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 144 +++---- src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java | 4 src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java | 2 src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsCategoryController.java | 2 src/main/java/cc/mrbird/febs/mall/entity/MallAchieveRecord.java | 4 src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java | 3 src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsCategoryController.java | 2 src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberCollectionController.java | 4 41 files changed, 687 insertions(+), 359 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java index 23a02f9..89f0eaf 100644 --- a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java +++ b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java @@ -171,6 +171,24 @@ } + + + @Bean + public DirectExchange saleLevelUp() { + return new DirectExchange(RabbitQueueEnum.SALE_LEVEL_UP.getExchange()); + } + + @Bean + public Queue saleLevelUpQueue() { + return new Queue(RabbitQueueEnum.SALE_LEVEL_UP.getQueue()); + } + + @Bean + public Binding saleLevelUpBind() { + return BindingBuilder.bind(saleLevelUpQueue()).to(saleLevelUp()).with(RabbitQueueEnum.SALE_LEVEL_UP.getRoute()); + } + + @Bean public DirectExchange activityOrderCheckExchange() { return new DirectExchange(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange()); diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java index eccc67e..82bc4ac 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java @@ -15,11 +15,11 @@ */ BALANCE(1), /** - * 积分 + * 会员升级经验 */ SCORE(2), /** - * 竞猜积分 + * 积分 */ PRIZE_SCORE(3), /** diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/ScoreFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/ScoreFlowTypeEnum.java index 1c8028d..c57fc53 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/ScoreFlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/ScoreFlowTypeEnum.java @@ -8,9 +8,13 @@ /** * */ + SALE_RECOMMEND(6, "好友下单获得佣金"), + OTHER_RECOMMEND(5, "推荐下单获得积分"), + MINE_RECOMMEND(4, "下单获得积分"), + PAY(1, "积分支付"), - BUY(2, "购买商品获得积分"), + BUY(2, "购买商品,获得等级经验"), RECOMMEND(3, "推荐下单获得积分"); @@ -29,7 +33,6 @@ return scoreFlowTypeEnum.getDesc(); } } - return ""; } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java b/src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java index dd69018..0ff6494 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java @@ -23,7 +23,7 @@ @RestController @RequestMapping(value = "/api/news") @RequiredArgsConstructor -@Api(value = "ApiMallNewsController", tags = "新闻接口类") +@Api(value = "ApiMallNewsController", tags = "365轮播广告接口类") public class ApiMallNewsController { private final IApiMallNewsService newsService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsCategoryController.java similarity index 98% rename from src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsCategoryController.java index bb2391e..a603574 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsCategoryController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.annotation.ControllerEndpoint; import cc.mrbird.febs.common.controller.BaseController; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsController.java similarity index 99% rename from src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsController.java index 428afbf..c653d7a 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/AdminMallGoodsController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.annotation.ControllerEndpoint; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsCategoryController.java similarity index 93% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsCategoryController.java index 3a525be..b4c0f0c 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsCategoryController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService; @@ -24,7 +24,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/category") -@Api(value = "ApiMallGoodsCategoryController", tags = "商品分类参数接收类") +@Api(value = "ApiMallGoodsCategoryController", tags = "365商品分类") public class ApiMallGoodsCategoryController { private final IApiMallGoodsCategoryService mallGoodsCategoryService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsController.java similarity index 96% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsController.java index b8da8bc..9f676a5 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMallGoodsController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ApiMallGoodsCommentDto; @@ -23,7 +23,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/goods") -@Api(value = "ApiMallGoodsController", tags = "商城商品接口类") +@Api(value = "ApiMallGoodsController", tags = "365商品") public class ApiMallGoodsController { private final IApiMallGoodsService mallGoodsService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMemberCollectionController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberCollectionController.java similarity index 93% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMemberCollectionController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberCollectionController.java index 680b621..76714de 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMemberCollectionController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberCollectionController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.AddCollectionDto; @@ -18,7 +18,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/collection") -@Api(value = "ApiMemberCollectionController", tags = "收藏接口类") +@Api(value = "ApiMemberCollectionController", tags = "365商品收藏") public class ApiMemberCollectionController { @Autowired diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMemberFootprintController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberFootprintController.java similarity index 94% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMemberFootprintController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberFootprintController.java index 3f68174..95d633e 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMemberFootprintController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/ApiMemberFootprintController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.entity.FebsResponse; @@ -23,7 +23,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/footprint") -@Api(value = "ApiMemberFootprintController", tags = "足迹接口类") +@Api(value = "ApiMemberFootprintController", tags = "365商品浏览足迹") public class ApiMemberFootprintController { @Autowired diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsCategoryController.java similarity index 98% rename from src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsCategoryController.java index 4fc96b5..1baddf6 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsCategoryController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsConstant; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsController.java similarity index 99% rename from src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java rename to src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsController.java index 5a34524..3ac03ab 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/goods/ViewMallGoodsController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.goods; import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsConstant; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/member/ApiMallMemberController.java similarity index 98% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java rename to src/main/java/cc/mrbird/febs/mall/controller/member/ApiMallMemberController.java index 819e3fa..e79a5db 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/member/ApiMallMemberController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.member; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; @@ -29,7 +29,7 @@ @RestController @RequestMapping(value = "/api/member") @RequiredArgsConstructor -@Api(value = "ApiMallMemberController", tags = "商城用户接口类") +@Api(value = "ApiMallMemberController", tags = "365用户操作") public class ApiMallMemberController { private final IApiMallMemberService memberService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/order/AdminMallOrderController.java similarity index 97% rename from src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java rename to src/main/java/cc/mrbird/febs/mall/controller/order/AdminMallOrderController.java index 7973074..8333411 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/order/AdminMallOrderController.java @@ -1,15 +1,11 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.order; import cc.mrbird.febs.common.annotation.ControllerEndpoint; import cc.mrbird.febs.common.controller.BaseController; -import cc.mrbird.febs.common.entity.DeptTree; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; -import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.enumerates.OrderDeliveryStateEnum; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; -import cc.mrbird.febs.common.exception.FebsException; -import cc.mrbird.febs.common.utils.FebsUtil; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextHolder; import cc.mrbird.febs.common.utils.excl.ExcelSheetPO; @@ -19,17 +15,11 @@ import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; -import cc.mrbird.febs.mall.service.IAdminMallGoodsService; import cc.mrbird.febs.mall.service.IAdminMallOrderService; import cc.mrbird.febs.mall.service.IApiMallTeamLeaderService; import cc.mrbird.febs.mall.service.MallInvoiceService; import cc.mrbird.febs.mall.vo.AdminAddAddressTreeVo; -import cc.mrbird.febs.mall.vo.AdminMallOrderRefundAddressVo; -import cc.mrbird.febs.pay.model.OrderStateDto; import cc.mrbird.febs.pay.service.IXcxPayService; -import cc.mrbird.febs.pay.util.WechatConfigure; -import cc.mrbird.febs.system.entity.Dept; -import cc.mrbird.febs.system.entity.User; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallAddressInfoController.java similarity index 96% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java rename to src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallAddressInfoController.java index 8305013..3a5bc7e 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallAddressInfoController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.order; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion; @@ -28,7 +28,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/address") -@Api(value = "ApiMallAddressInfoController", tags = "用户地址管理接口类") +@Api(value = "ApiMallAddressInfoController", tags = "365订单地址") public class ApiMallAddressInfoController { private final IApiMallAddressInfoService mallAddressInfoService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallInvoiceController.java b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallInvoiceController.java similarity index 95% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallInvoiceController.java rename to src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallInvoiceController.java index 5c92b77..b8e9350 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallInvoiceController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallInvoiceController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.order; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ApiMallInvoiceDto; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallOrderController.java similarity index 98% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java rename to src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallOrderController.java index bdb6196..7a54449 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallOrderController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.order; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; @@ -27,7 +27,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/order") -@Api(value = "ApiMallOrderController", tags = "订单接口类") +@Api(value = "ApiMallOrderController", tags = "365订单") public class ApiMallOrderController { private final IApiMallOrderInfoService mallOrderInfoService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallShoppingCartController.java similarity index 95% rename from src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java rename to src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallShoppingCartController.java index 6d4a4ee..47c5591 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/order/ApiMallShoppingCartController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.order; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.AddCartDto; @@ -28,7 +28,7 @@ @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/cart") -@Api(value = "ApiMallShoppingCartController", tags = "商城购物车接口请求类") +@Api(value = "ApiMallShoppingCartController", tags = "365购物车") public class ApiMallShoppingCartController { private final IApiMallShoppingCartService mallShoppingCartService; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/order/ViewMallOrderController.java similarity index 99% rename from src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java rename to src/main/java/cc/mrbird/febs/mall/controller/order/ViewMallOrderController.java index a91c4db..f1417d8 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/order/ViewMallOrderController.java @@ -1,4 +1,4 @@ -package cc.mrbird.febs.mall.controller; +package cc.mrbird.febs.mall.controller.order; import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsConstant; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/signActivity/ApiScoreController.java b/src/main/java/cc/mrbird/febs/mall/controller/signActivity/ApiScoreController.java index 1e5763f..71503ba 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/signActivity/ApiScoreController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/signActivity/ApiScoreController.java @@ -29,7 +29,7 @@ @CrossOrigin("*") @RequiredArgsConstructor @RequestMapping(value = "/api/score") -@Api(value = "ApiScoreController", tags = "365签到接口类") +@Api(value = "ApiScoreController", tags = "365签到") public class ApiScoreController { private final IScoreService scoreService; diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallAchieveRecord.java b/src/main/java/cc/mrbird/febs/mall/entity/MallAchieveRecord.java index 81c7a79..168a90f 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallAchieveRecord.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallAchieveRecord.java @@ -16,9 +16,9 @@ public class MallAchieveRecord extends BaseEntity { private Long memberId; - + //业绩 private BigDecimal amount; - + //返佣 private BigDecimal costAmount; private Date achieveTime; diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java index fe7f3be..6cb4c4c 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java @@ -64,6 +64,9 @@ */ private BigDecimal staticProp; + @TableField(exist = false) + private BigDecimal staticPropPrice; + /** * 是否多规则 1-是 2-否 */ diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java index 5754d1c..28650b8 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java @@ -25,6 +25,8 @@ private Date orderTime; private Date payTime; + //支付积分 + private BigDecimal scoreAmount; private BigDecimal amount; diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java index 29c9ed8..603b2d1 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @@ -36,6 +37,8 @@ private Integer cnt; private BigDecimal price; + //支付积分 + private BigDecimal scoreAmount; private BigDecimal amount; @@ -58,4 +61,7 @@ @TableField(exist = false) private BigDecimal itemAmount; + + @TableField(exist = false) + private BigDecimal itemScoreAmount; } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java index eb14dd2..745c4c0 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java @@ -1,32 +1,17 @@ package cc.mrbird.febs.mall.service.impl; -import cc.mrbird.febs.common.enumerates.AgentLevelEnum; -import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; -import cc.mrbird.febs.common.utils.AppContants; -import cc.mrbird.febs.mall.entity.AgentInfo; -import cc.mrbird.febs.mall.entity.DataDictionaryCustom; -import cc.mrbird.febs.mall.entity.MallMember; -import cc.mrbird.febs.mall.entity.MallOrderInfo; +import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IAgentService; -import cc.mrbird.febs.mall.service.IApiMallMemberService; -import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; -import cc.mrbird.febs.mall.service.IMallAchieveService; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; -import jdk.nashorn.internal.ir.IfNode; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * @author wzy @@ -39,116 +24,105 @@ private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallMemberMapper memberMapper; + private final HappySaleLevelMapper happySaleLevelMapper; + /** + * 自动升级代理等级 + * 根据会员的当前状态和业绩,自动为其升级到下一个代理等级 + * @param memberId 会员ID,用于识别需要升级的会员 + */ @Override @Transactional(rollbackFor = Exception.class) public void autoUpAgentLevel(Long memberId) { + // 根据会员ID查询会员信息 MallMember member = memberMapper.selectById(memberId); - if(StrUtil.isBlank(member.getReferrerIds())) { + + // 检查会员账户状态和类型,只有在启用状态和普通类型时才进行升级操作 + if(MallMember.ACCOUNT_STATUS_ENABLE != member.getAccountStatus() + || MallMember.ACCOUNT_TYPE_NORMAL != member.getAccountType() ){ + return; + } + // 获取会员当前的店铺主人等级 + Integer storeMaster = member.getStoreMaster(); + // 下一个分销等级 + storeMaster =storeMaster +1; + // 根据新的店铺主人等级查询对应的快乐销售等级信息 + HappySaleLevel happySaleLevel = happySaleLevelMapper.selectOne( + new LambdaQueryWrapper<HappySaleLevel>() + .eq(HappySaleLevel::getCode, storeMaster) + ); + // 如果没有找到对应的快乐销售等级信息,则记录日志并返回 + if (happySaleLevel == null) { + log.info("当前等级无下级"); + return; + } + // 检查直推会员数量是否达到要求 + if (!directMemberCnt(member, happySaleLevel.getDirectCnt())) { return; } - List<String> ids = StrUtil.split(member.getReferrerIds(), ','); - List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids); - for (MallMember parent : parentMembers) { - // 未激活用户无法升级 - if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) { - continue; - } - - DataDictionaryCustom nextLevel = dataDictionaryCustomMapper.selectNextAgentLevelInfo(parent.getLevel()); - if (nextLevel == null) { - log.info("当前层级无下一级:{}", parent.getLevel()); - continue; - } - - AgentInfo agentInfo = JSONObject.parseObject(nextLevel.getValue(), AgentInfo.class); - if (!directMemberCnt(parent, agentInfo)) { - continue; - } - - if (!agentCntFinish(parent, agentInfo)) { - continue; - } - - if (!teamIncome(parent, agentInfo)) { - continue; - } - - parent.setLevel(nextLevel.getCode()); - memberMapper.updateById(parent); + // 检查团队人数是否达到要求 + if (!teamCntFinish(member, happySaleLevel.getTeamCnt())) { + return; } + + // 检查团队业绩是否达到要求 + if (!teamIncome(member, happySaleLevel.getTeamAmount())) { + return; + } + + // 更新会员的店铺主人等级 + member.setStoreMaster(storeMaster); + // 更新会员信息 + memberMapper.updateById(member); } + /** * 判断直推人数是否达标 - * - * @param member - * @return */ - private boolean directMemberCnt(MallMember member, AgentInfo agentInfo) { - List<MallMember> childs = memberMapper.selectByRefererId(member.getInviteId()); - if (CollUtil.isEmpty(childs)) { + private boolean directMemberCnt(MallMember member, Integer directCnt) { + List<MallMember> childList = memberMapper.selectByRefererId(member.getInviteId()); + if (CollUtil.isEmpty(childList)) { return false; } - if (childs.size() >= agentInfo.getDirectCnt()) { + if (childList.size() >= directCnt) { return true; } - log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), childs.size(), agentInfo.getLastAgentCnt()); + log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getStoreMaster(), childList.size(), directCnt); return false; } /** - * 判断下级代理数量是否达标 - * - * @return + * 判断团队数量是否达标 */ - private boolean agentCntFinish(MallMember member, AgentInfo agentInfo) { - if (agentInfo.getLastAgentCnt() == null || agentInfo.getLastAgentCnt() == 0) { - return true; - } - + private boolean teamCntFinish(MallMember member, Integer teamCnt) { // 直推用户 - List<MallMember> directMember = memberMapper.selectByRefererId(member.getInviteId()); - if (CollUtil.isEmpty(directMember)) { + List<MallMember> teamMember = memberMapper.selectAllChildAgentListByInviteId(member.getInviteId()); + if (CollUtil.isEmpty(teamMember)) { return false; } - // 用户团队达到指定代理数量,且都不在同一条线 - int i = 0; - for (MallMember child : directMember) { - List<MallMember> mallMembers = memberMapper.selectChildAgentList(child.getInviteId(), member.getLevel()); - if (CollUtil.isNotEmpty(mallMembers)) { - i++; - } - } - - if (i >= agentInfo.getLastAgentCnt()) { + if (teamMember.size() >= teamCnt) { return true; } - log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), i, agentInfo.getLastAgentCnt()); + log.info("用户:{}团队数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getStoreMaster(), teamMember.size(), teamCnt); return false; } /** * 团队业绩是否达标 - * - * @param mallMember - * @param agentInfo - * @return */ - private boolean teamIncome(MallMember member, AgentInfo agentInfo) { + private boolean teamIncome(MallMember member, BigDecimal teamAmount) { BigDecimal totalIncome = memberMapper.selectAchieveByMemberId(member.getInviteId(), 2); - BigDecimal targetIncome = agentInfo.getTeamIncome().multiply(new BigDecimal("10000")); - if (totalIncome.compareTo(targetIncome) >= 0) { + if(totalIncome.compareTo(teamAmount) >= 0){ return true; } - - log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), totalIncome, targetIncome); + log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getPhone(), member.getStoreMaster(), totalIncome, teamAmount); return false; } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java index 1b46a1c..95d834f 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java @@ -44,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -56,6 +57,7 @@ @RequiredArgsConstructor public class ApiMallOrderInfoServiceImpl extends ServiceImpl<MallOrderInfoMapper, MallOrderInfo> implements IApiMallOrderInfoService { + private final MallMemberWalletMapper mallMemberWalletMapper; private final MallGoodsMapper mallGoodsMapper; private final MallGoodsSkuMapper mallGoodsSkuMapper; private final MallAddressInfoMapper mallAddressInfoMapper; @@ -88,6 +90,7 @@ private final CouponGoodsMapper couponGoodsMapper; private final IMallVipConfigService mallVipConfigService; + private final MallAchieveRecordMapper mallAchieveRecordMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -121,6 +124,7 @@ this.baseMapper.insert(orderInfo); BigDecimal total = BigDecimal.ZERO; + BigDecimal totalScoreAmount = BigDecimal.ZERO; /** * 根据传入的优惠卷ID和商品明细集合计算出每个商品获取的实际支付金额 */ @@ -138,6 +142,15 @@ } List<AddOrderItemDto> items = addOrderDto.getItems(); couponAmountMap = getCouponAmountMap(memberCouponId, items); + } + /** + * 判断用户的积分是否足够 + */ + Map<Long, BigDecimal> scoreAmountMap = getScoreAmountMap(addOrderDto.getItems()); + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + //判断scoreAmountMap中的总积分数量是否大于用户的积分数量 + if(scoreAmountMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(mallMemberWallet.getPrizeScore()) > 0){ + throw new FebsException("您的积分不足"); } for (AddOrderItemDto item : addOrderDto.getItems()) { MallOrderItem orderItem = new MallOrderItem(); @@ -225,6 +238,7 @@ } } orderItem.setAmount(amount); + orderItem.setScoreAmount(scoreAmountMap.get(item.getSkuId())); orderItem.setCnt(item.getCnt()); orderItem.setOrderId(orderInfo.getId()); orderItem.setPrice(sku.getPresentPrice()); @@ -246,6 +260,7 @@ orderItem.setCostPrice(sku.getCostPrice()); total = total.add(amount); + totalScoreAmount = totalScoreAmount.add(scoreAmountMap.get(item.getSkuId())); //规格的库存销量 Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt()); if(1 != skuResult){ @@ -266,6 +281,7 @@ total = total.add(delivaryAmount); orderInfo.setAmount(total); + orderInfo.setScoreAmount(totalScoreAmount); orderInfo.setAddressId(address.getId()); orderInfo.setName(address.getName()); orderInfo.setPhone(address.getPhone()); @@ -281,6 +297,39 @@ //过期时间修改成24小时 agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 24 * 60 * 60 * 1000L); return orderInfo.getId(); + } + + private Map<Long, BigDecimal> getScoreAmountMap(List<AddOrderItemDto> items) { + + Map<Long, BigDecimal> scoreAmountMap = new HashMap<>(); + //全部skuIds + Set<Long> skuIds = items.stream().map(AddOrderItemDto::getSkuId).collect(Collectors.toSet()); + LambdaQueryWrapper<MallGoodsSku> mallGoodsSkuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + mallGoodsSkuLambdaQueryWrapper.in(MallGoodsSku::getId, skuIds); + List<MallGoodsSku> skusAll = mallGoodsSkuMapper.selectList(mallGoodsSkuLambdaQueryWrapper); + //全部goodsId + Set<Long> goodsIdsAll = skusAll.stream().map(MallGoodsSku::getGoodsId).collect(Collectors.toSet()); + LambdaQueryWrapper<MallGoods> mallGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + mallGoodsLambdaQueryWrapper.in(MallGoods::getId, goodsIdsAll); + List<MallGoods> goodsAll = mallGoodsMapper.selectList(mallGoodsLambdaQueryWrapper); + //stream流操作goodsAll,返回一个Hashmap<id,MallGoods> + Map<Long, MallGoods> goodsMap = goodsAll.stream().collect(Collectors.toMap(MallGoods::getId, mallGoods -> mallGoods)); + + for (AddOrderItemDto item : items) { + Long skuId = item.getSkuId(); + MallGoodsSku sku = skusAll.stream().filter(s -> s.getId().equals(skuId)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(sku)) { + Long goodsId = sku.getGoodsId(); + MallGoods mallGoods = goodsMap.get(goodsId); + if (ObjectUtil.isNotEmpty(mallGoods)) { + BigDecimal multi = mallGoods.getStaticProp().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_DOWN); + //获取该商品该规格的积分 + BigDecimal scoreAmount = sku.getOriginalPrice().multiply(multi).setScale(0, RoundingMode.HALF_DOWN); + scoreAmountMap.put(skuId, scoreAmount); + } + } + } + return scoreAmountMap; } /** @@ -494,76 +543,109 @@ if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) { throw new FebsException("订单状态不能支付"); } + //先支付积分部分 + if(orderInfo.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){ + balanceScorePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); + mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), ScoreFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), null, 2); + } String payResultStr = ""; String wxResultStr = ""; - switch (payOrderDto.getType()) { - case "1": - BrandWCPayRequestData brandWCPayRequestData = null; - try { - brandWCPayRequestData = iXcxPayService.startPayment(orderInfo); - } catch (Exception e) { - throw new FebsException("支付失败"); - } - wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); - payResultStr = brandWCPayRequestData.getPrepay_id(); - orderInfo.setPayMethod("微信支付"); - break; - case "2": - if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { - payResultStr = orderInfo.getPayOrderNo(); - } else { - payResultStr = payService.aliPay(orderInfo); - } + if(orderInfo.getAmount().compareTo(BigDecimal.ZERO) <= 0){ + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("积分支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + payResultStr = orderInfo.getOrderNo(); + }else{ + switch (payOrderDto.getType()) { + case "1": + BrandWCPayRequestData brandWCPayRequestData = null; + try { + brandWCPayRequestData = iXcxPayService.startPayment(orderInfo); + } catch (Exception e) { + throw new FebsException("支付失败"); + } + wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); + payResultStr = brandWCPayRequestData.getPrepay_id(); + orderInfo.setPayMethod("微信支付"); + break; + case "2": + if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { + payResultStr = orderInfo.getPayOrderNo(); + } else { + payResultStr = payService.aliPay(orderInfo); + } - orderInfo.setPayOrderNo(payResultStr); - orderInfo.setPayMethod("支付宝支付"); - agentProducer.sendOrderReturn(orderInfo.getId()); - break; - case "3": - payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance"); + orderInfo.setPayOrderNo(payResultStr); + orderInfo.setPayMethod("支付宝支付"); + agentProducer.sendOrderReturn(orderInfo.getId()); + break; + case "3": + payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance"); - orderInfo.setPayOrderNo(orderInfo.getOrderNo()); - orderInfo.setPayMethod("余额支付"); - orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); - orderInfo.setPayTime(new Date()); - orderInfo.setPayResult("1"); - orderInfo.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_WAIT.getValue()); + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("余额支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + orderInfo.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_WAIT.getValue()); - mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2); + mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2); - agentProducer.sendOrderCoupon(orderInfo.getId()); - break; - case "4": - if (orderInfo.getOrderType() != 2) { - throw new FebsException("非积分订单,无法使用积分支付"); - } - payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); + agentProducer.sendOrderCoupon(orderInfo.getId()); + break; + case "4": + if (orderInfo.getOrderType() != 2) { + throw new FebsException("非积分订单,无法使用积分支付"); + } + payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); - orderInfo.setPayOrderNo(orderInfo.getOrderNo()); - orderInfo.setPayMethod("积分支付"); - orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); - orderInfo.setPayTime(new Date()); - orderInfo.setPayResult("1"); + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("积分支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); - mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), ScoreFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), null, 2); - break; - default: + mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), ScoreFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), null, 2); + break; + default: + } } //订单支付成功产生一个提货码 String takeCode = ShareCodeUtil.toSerialCode(orderInfo.getId()); orderInfo.setTakeCode(takeCode); this.baseMapper.updateById(orderInfo); - Map<String, Object> map = new HashMap<>(); map.put("orderInfo", payResultStr); map.put("orderNo", orderInfo.getOrderNo()); map.put("orderId", orderInfo.getId()); map.put("wxResultStr", wxResultStr); - return map; + } + + private String balanceScorePay(MallOrderInfo orderInfo, String tradePwd, String field) { + if (StrUtil.isBlank(tradePwd)) { + throw new FebsException("支付密码错误"); + } + + MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId()); + if (StrUtil.isBlank(mallMember.getTradePassword())) { + throw new FebsException("未设置支付密码"); + } + + if (!SecureUtil.md5(tradePwd).equals(mallMember.getTradePassword())) { + throw new FebsException("支付密码错误"); + } + + int reduce = memberWalletService.reduce(orderInfo.getScoreAmount(), mallMember.getId(), field); + if (reduce == 2) { + throw new FebsException("积分不足"); + } + return orderInfo.getOrderNo(); } private String balancePay(MallOrderInfo orderInfo, String tradePwd, String field) { @@ -616,6 +698,7 @@ if(CollUtil.isNotEmpty(items)){ for(MallOrderItem mallOrderItem : items){ mallOrderItem.setItemAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getAmount()); + mallOrderItem.setScoreAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getScoreAmount()); } } @@ -655,10 +738,6 @@ throw new FebsException("该状态不能确认收货"); } -// if (orderInfo.getDeliveryState() != OrderDeliveryStateEnum.DELIVERY_FINISH.getValue()) { -// throw new FebsException("还未送至自提点"); -// } - List<MallRefundEntity> mallRefundEntities = mallRefundMapper.selectByItemIdAndOrderIdAndState(null, orderInfo.getId(), 3); if(CollUtil.isNotEmpty(mallRefundEntities)){ throw new FebsException("请先处理退款商品"); @@ -669,34 +748,6 @@ this.baseMapper.updateById(orderInfo); agentProducer.sendGetScoreMsg(orderInfo.getId()); - //生成一条团长提成记录 -// Long orderInfoId = orderInfo.getId(); -// List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfoId); -// if(CollUtil.isNotEmpty(mallOrderItemList)){ -// -// MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode()); -// Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch(); -// BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent()); -// -// if(1 == profitSwitch){ -// for(MallOrderItem mallOrderItem : mallOrderItemList){ -// Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState(); -// if(1 == state){ -// MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve(); -// mallLeaderAchieve.setMemberId(orderInfo.getMemberId()); -// mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo()); -// mallLeaderAchieve.setOrderItemId(mallOrderItem.getId()); -// BigDecimal itemAmount = mallOrderItem.getAmount(); -// mallLeaderAchieve.setAmount(itemAmount); -// BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN); -// mallLeaderAchieve.setProfitAmount(bigDecimal); -// mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode()); -// mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE); -// mallLeaderAchieveMapper.insert(mallLeaderAchieve); -// } -// } -// } -// } } @Override @@ -1006,6 +1057,15 @@ if(CollUtil.isEmpty(items)){ return new FebsResponse().fail().message("请先挑选商品"); } + /** + * 判断用户的积分是否足够 + */ + Map<Long, BigDecimal> scoreAmountMap = getScoreAmountMap(apiCreateOrderVerifyDto.getItems()); + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + //判断scoreAmountMap中的总积分数量是否大于用户的积分数量 + if(scoreAmountMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(mallMemberWallet.getPrizeScore()) > 0){ + throw new FebsException("您的积分不足"); + } for (AddOrderItemDto item : apiCreateOrderVerifyDto.getItems()) { MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); if (sku == null) { @@ -1035,6 +1095,8 @@ if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) { return new FebsResponse().fail().message(mallGoods.getGoodsName() + "已下架"); } + + //判断 } return new FebsResponse().success(); diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java index 378526e..deb8872 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java @@ -39,6 +39,9 @@ @ApiModelProperty(value = "原价") private String originalPrice; + @ApiModelProperty(value = "积分价格") + private String staticPropPrice; + @ApiModelProperty(value = "现价") private String presentPrice; diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsListVo.java index 8166302..f319ed2 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsListVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsListVo.java @@ -32,6 +32,9 @@ @ApiModelProperty(value = "原价") private String originalPrice; + @ApiModelProperty(value = "积分价格") + private String staticPropPrice; + @ApiModelProperty(value = "现价") private String presentPrice; diff --git a/src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java b/src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java index 538eb5d..035b007 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java @@ -37,6 +37,9 @@ @ApiModelProperty(value = "状态") private Integer status; + @ApiModelProperty(value = "订单积分") + private BigDecimal scoreAmount; + @ApiModelProperty(value = "订单金额") private BigDecimal amount; diff --git a/src/main/java/cc/mrbird/febs/mall/vo/OrderItemVo.java b/src/main/java/cc/mrbird/febs/mall/vo/OrderItemVo.java index d7a0c3d..63c5fd5 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/OrderItemVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/OrderItemVo.java @@ -54,6 +54,9 @@ @ApiModelProperty(value = "1:正常 2:退款中3:已退") private Integer state; + @ApiModelProperty(value = "订单积分") + private BigDecimal itemScore; + @ApiModelProperty(value = "支付金额") private BigDecimal itemAmount; } diff --git a/src/main/java/cc/mrbird/febs/mall/vo/OrderListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/OrderListVo.java index a1a4923..9b09c26 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/OrderListVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/OrderListVo.java @@ -27,6 +27,9 @@ @ApiModelProperty(value = "状态 1-待支付 2-待发货 3-待收货 4-已完成 5-退款中 6-退款处理完成 7-已取消") private Integer status; + //支付积分 + @ApiModelProperty(value = "订单积分") + private BigDecimal scoreAmount; @ApiModelProperty(value = "订单金额") private BigDecimal amount; diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java index 3c0f198..b0c04f2 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java +++ b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java @@ -16,4 +16,5 @@ public static final String GET_SCORE_MSG = "queue_get_score_msg"; public static final String VIP_LEVEL_UP = "queue_vip_level_up"; + public static final String SALE_LEVEL_UP = "queue_sale_level_up"; } diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java index bd3f44a..e7b9d19 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java @@ -110,6 +110,16 @@ } } + @RabbitListener(queues = QueueConstants.SALE_LEVEL_UP) + public void saleLevelUp(Long orderId) { + log.info("收到团长升级:{}", orderId); + try { + vipCommonService.saleLevelUp(orderId); + } catch (Exception e) { + log.error("团长升级消息异常", e); + } + } + @RabbitListener(queues = QueueConstants.ACTIVITY_ORDER_ITEM_CHECK) public void checkActivityItem(Long orderId) { log.info("收到核销活动门票:{}", orderId); diff --git a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java index a1f4eb5..f79e51c 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java +++ b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java @@ -22,6 +22,8 @@ GET_SCORE_MSG("exchange_get_score_msg", "route_key_get_score_msg", QueueConstants.GET_SCORE_MSG), + SALE_LEVEL_UP("exchange_sale_level_up", "route_key_sale_level_up", QueueConstants.SALE_LEVEL_UP), + VIP_LEVEL_UP("exchange_vip_level_up", "route_key_vip_level_up", QueueConstants.VIP_LEVEL_UP); private String exchange; diff --git a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java index 1efdee6..d40c39d 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java @@ -98,6 +98,13 @@ rabbitTemplate.convertAndSend(RabbitQueueEnum.VIP_LEVEL_UP.getExchange(), RabbitQueueEnum.VIP_LEVEL_UP.getRoute(), orderId, correlationData); } + public void sendSaleLevelUp(Long orderId) { + log.info("发送团长升级:{}", orderId); + + CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); + rabbitTemplate.convertAndSend(RabbitQueueEnum.SALE_LEVEL_UP.getExchange(), RabbitQueueEnum.SALE_LEVEL_UP.getRoute(), orderId, correlationData); + } + public void sendCheckActivityItem(Long orderId) { log.info("核销活动门票:{}", orderId); diff --git a/src/main/java/cc/mrbird/febs/vip/service/IVipCommonService.java b/src/main/java/cc/mrbird/febs/vip/service/IVipCommonService.java index e07a285..550c14d 100644 --- a/src/main/java/cc/mrbird/febs/vip/service/IVipCommonService.java +++ b/src/main/java/cc/mrbird/febs/vip/service/IVipCommonService.java @@ -5,4 +5,7 @@ void getScore(Long orderId); void levelUp(Long orderId); + + void saleLevelUp(Long orderId); + } diff --git a/src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java b/src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java index d514a17..f6c696c 100644 --- a/src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java @@ -2,13 +2,11 @@ import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; +import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum; -import cc.mrbird.febs.mall.entity.MallGoods; -import cc.mrbird.febs.mall.entity.MallMember; -import cc.mrbird.febs.mall.entity.MallOrderInfo; -import cc.mrbird.febs.mall.entity.MallOrderItem; -import cc.mrbird.febs.mall.mapper.MallMemberMapper; -import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallGoodsService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; @@ -21,6 +19,7 @@ import cc.mrbird.febs.vip.service.IVipCommonService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; @@ -46,164 +45,369 @@ private final IMallVipConfigService mallVipConfigService; private final IMallMoneyFlowService mallMoneyFlowService; private final IApiMallMemberWalletService mallMemberWalletService; + private final MallMemberWalletMapper mallMemberWalletMapper; private final MallMemberMapper mallMemberMapper; private final MallVipConfigMapper mallVipConfigMapper; private final AgentProducer agentProducer; private final IApiMallGoodsService mallGoodsService; - + private final HappyMemberLevelMapper happyMemberLevelMapper; + private final HappySaleLevelMapper happySaleLevelMapper; + private final MallAchieveRecordMapper mallAchieveRecordMapper; + /** + * 根据订单ID获取分数 + * 此方法处理订单得分逻辑,包括直接购买得分、会员等级得分和推荐人得分 + * + * @param orderId 订单ID,用于查询订单详细信息 + */ @Override @Transactional(rollbackFor = Exception.class) public void getScore(Long orderId) { + // 根据订单ID查询订单详细信息 MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); if (mallOrderInfo == null) { + // 如果订单信息为空,则直接返回 return; } - Long memberId = mallOrderInfo.getMemberId(); - MallVipBenefits mallVipBenefits = mallVipConfigService.hasVipBenefits(memberId); - - MallMember member = mallMemberMapper.selectById(memberId); - BigDecimal multiple = BigDecimal.ONE; - String name = ""; - if (mallVipBenefits != null) { - multiple = mallVipBenefits.getScoreMultiple(); - name = mallVipBenefits.getName(); + if (mallOrderInfo.getStatus() != OrderStatusEnum.FINISH.getValue()) { + // 订单不是完成状态 + return; } - List<String> skuNames = mallOrderInfo.getItems().stream().map(MallOrderItem::getSkuName).collect(Collectors.toList()); - double sum = mallOrderInfo.getItems().stream().map(MallOrderItem::getAmount).mapToDouble(BigDecimal::doubleValue).sum(); + // 获取订单金额 + BigDecimal amount = mallOrderInfo.getAmount(); + if(BigDecimal.ZERO.compareTo(amount) >= 0){ + // 如果订单金额小于等于0,则直接返回 + return; + } - int score = multiple.multiply(BigDecimal.valueOf(sum)).intValue(); + // 获取会员ID + Long memberId = mallOrderInfo.getMemberId(); + // 根据会员ID查询会员信息 + MallMember member = mallMemberMapper.selectById(memberId); - mallMoneyFlowService.addMoneyFlow(memberId, new BigDecimal(score), ScoreFlowTypeEnum.BUY.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), CollUtil.join(skuNames, ","), 2); - mallMemberWalletService.add(new BigDecimal(score), memberId, "prizeScore"); + // 记录会员购买获得的经验 + mallMoneyFlowService.addMoneyFlow( + memberId, + amount, + ScoreFlowTypeEnum.BUY.getValue(), + mallOrderInfo.getOrderNo(), + FlowTypeEnum.SCORE.getValue(), + ScoreFlowTypeEnum.BUY.getDesc(), + 2 + ); + // 更新会员钱包中的分数 + mallMemberWalletService.add(amount, memberId, "score"); - List<Long> itemGoodsIds = mallOrderInfo.getItems().stream().map(MallOrderItem::getGoodsId).distinct().collect(Collectors.toList()); - List<MallGoods> goodsList = mallGoodsService.listByIds(itemGoodsIds); - Map<Long, MallGoods> goodsMap = goodsList.stream().collect(Collectors.toMap(MallGoods::getId, MallGoods -> MallGoods)); - + // 下单自己获得积分,推荐人获得积分 + //<memberId,积分数量>的map Map<Long, BigDecimal> recommendScoreMap = new HashMap<>(); - mallOrderInfo.getItems().forEach(item -> { - if (StrUtil.isNotBlank(item.getMemberInviteId()) && !member.getInviteId().equals(item.getMemberInviteId())) { - MallGoods mallGoods = goodsMap.get(item.getGoodsId()); - if (mallGoods.getStaticMulti() == null) { - return; - } - - BigDecimal multi = mallGoods.getStaticMulti().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); - MallMember mallMember = mallMemberMapper.selectInfoByInviteId(item.getMemberInviteId()); - if (mallMember == null) { - return; - } - - BigDecimal recommendScore = recommendScoreMap.get(mallMember.getId()); - recommendScore = recommendScore == null ? BigDecimal.ZERO : recommendScore; - recommendScore = recommendScore.add(item.getAmount().multiply(multi)); - - recommendScoreMap.put(mallMember.getId(), recommendScore); + Map<Long, Integer> recommendTypeScoreMap = new HashMap<>(); + // 获取会员的董事等级代码 + Integer director = member.getDirector(); + // 查询与董事等级代码匹配的会员等级信息 + LambdaQueryWrapper<HappyMemberLevel> happyMemberLevelLambdaQueryWrapper = new LambdaQueryWrapper<HappyMemberLevel>(); + happyMemberLevelLambdaQueryWrapper.eq(HappyMemberLevel::getCode, director); + happyMemberLevelLambdaQueryWrapper.last("limit 1"); + HappyMemberLevel happyMemberLevel = happyMemberLevelMapper.selectOne(happyMemberLevelLambdaQueryWrapper); + if(ObjectUtil.isNotEmpty(happyMemberLevel)){ + // 计算自己获得的积分 + BigDecimal minePercent = happyMemberLevel.getMinePercent(); + BigDecimal mineScore = amount.multiply(minePercent.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_DOWN)).setScale(0, RoundingMode.HALF_DOWN); + if(BigDecimal.ZERO.compareTo(mineScore) < 0){ + recommendScoreMap.put(memberId, mineScore); + recommendTypeScoreMap.put(memberId, ScoreFlowTypeEnum.MINE_RECOMMEND.getValue()); } - }); + // 计算推荐人获得的积分 + if(StrUtil.isNotEmpty(member.getReferrerId())){ + MallMember refMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId()); + BigDecimal otherPercent = happyMemberLevel.getOtherPercent(); + BigDecimal otherScore = amount.multiply(otherPercent.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_DOWN)).setScale(0, RoundingMode.HALF_DOWN); + if(BigDecimal.ZERO.compareTo(otherScore) < 0){ + recommendScoreMap.put(refMember.getId(), otherScore); + recommendTypeScoreMap.put(memberId, ScoreFlowTypeEnum.OTHER_RECOMMEND.getValue()); + } + } + } + // 为推荐人和自己添加积分流动记录和更新钱包 recommendScoreMap.forEach((key, value) -> { if (value != null) { - mallMoneyFlowService.addMoneyFlow(key, value, ScoreFlowTypeEnum.RECOMMEND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), CollUtil.join(skuNames, ","), 2); + mallMoneyFlowService.addMoneyFlow( + key, + value, + recommendTypeScoreMap.get(key), + mallOrderInfo.getOrderNo(), + FlowTypeEnum.PRIZE_SCORE.getValue(), + ScoreFlowTypeEnum.getDescByValue(recommendTypeScoreMap.get(key)), + 2); mallMemberWalletService.add(value, key, "prizeScore"); } }); + // 发送会员等级升级消息 agentProducer.sendVipLevelUp(orderId); } + + /** + * 根据订单ID升级会员等级 + * 当订单完成时,根据会员当前的经验值升级会员等级 + * + * @param orderId 订单ID + */ @Override public void levelUp(Long orderId) { + // 根据订单ID获取订单详细信息 MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); + // 如果订单信息为空,则直接返回 if (mallOrderInfo == null) { return; } + // 如果订单状态不是完成状态,则直接返回 + if (mallOrderInfo.getStatus() != OrderStatusEnum.FINISH.getValue()) { + // 订单不是完成状态 + return; + } + // 根据订单中的会员ID获取会员信息 MallMember member = mallMemberMapper.selectById(mallOrderInfo.getMemberId()); + // 如果会员信息为空,则记录日志并返回 if (member == null) { log.info("会员不存在"); return; } - MallVipConfig config = mallVipConfigMapper.selectVipConfigByCode(member.getLevel()); - if (config == null) { - log.info("会员等级配置不存在"); + // 根据会员ID获取会员钱包信息 + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(member.getId()); + // 如果会员钱包信息为空,则记录日志并返回 + if (mallMemberWallet == null) { + log.info("会员钱包不存在"); + return; + } + //当前经验值 + int score = mallMemberWallet.getScore().intValue(); + + // 查询当前经验值对应的会员等级 + HappyMemberLevel happyMemberLevel = happyMemberLevelMapper.selectOne( + new LambdaQueryWrapper<HappyMemberLevel>() + .ge(HappyMemberLevel::getUpgradeScore, score) + .orderByAsc(HappyMemberLevel::getCode) + .last("limit 1") + ); + // 如果查询不到对应的会员等级,则记录日志并返回 + if (happyMemberLevel == null) { + log.info("会员等级不存在"); + return; + } + // 获取当前会员等级代码 + Integer code = happyMemberLevel.getCode(); + // 如果当前会员等级与会员的导演等级相同,则直接返回 + if(member.getDirector() == code){ return; } -// LambdaQueryWrapper<MallVipConfig> configQuery = new LambdaQueryWrapper<>(); -// configQuery.gt(MallVipConfig::getLevel, config.getLevel()) -// .orderByAsc(MallVipConfig::getLevel) -// .last("limit 1"); -// MallVipConfig nextLevel = mallVipConfigMapper.selectOne(configQuery); + // 更新会员的导演等级为当前会员等级代码 + member.setDirector(code); + // 更新会员信息 + mallMemberMapper.updateById(member); - List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList(); - - String nextLevelCode = ""; - for (MallVipConfig nextLevel : configs) { - if (config.getLevel() >= nextLevel.getLevel()) { - continue; - } - - // 指定商品 - if (nextLevel.getType() == 1) { - boolean hasMatch = mallOrderInfo.getItems().stream().anyMatch(item -> { - return item.getGoodsId().equals(nextLevel.getTargetId()); - }); - - if (hasMatch) { - nextLevelCode = nextLevel.getCode(); - continue; - } - } - - // 时间区间内金额 - if (nextLevel.getType() == 2) { - Date endTime = DateUtil.endOfDay(new Date()); - Date startTime = getStartTime(nextLevel.getValidType()); - - LambdaQueryWrapper<MallOrderInfo> query = new LambdaQueryWrapper<>(); - query.ge(MallOrderInfo::getReceivingTime, startTime) - .le(MallOrderInfo::getReceivingTime, endTime) - .eq(MallOrderInfo::getStatus, 4) - .eq(MallOrderInfo::getMemberId, member.getId()); - List<MallOrderInfo> orderList = mallOrderInfoMapper.selectList(query); - if (CollUtil.isEmpty(orderList)) { - continue; - } - - double totalAmount = orderList.stream().mapToDouble(item -> { - return item.getAmount().doubleValue(); - }).sum(); - - if (nextLevel.getAmount().compareTo(BigDecimal.valueOf(totalAmount)) <= 0) { - nextLevelCode = nextLevel.getCode(); - } - } - } - - if (StrUtil.isNotBlank(nextLevelCode)) { - MallMember update = new MallMember(); - update.setId(member.getId()); - update.setLevel(nextLevelCode); - update.setVipLevelTime(new Date()); - mallMemberMapper.updateById(update); - } + // 发送分销等级升级消息 + agentProducer.sendSaleLevelUp(orderId); } - private Date getStartTime(String type) { - Date date = new Date(); - switch (type) { - case "day" : - return DateUtil.beginOfDay(date); - case "month": - return DateUtil.beginOfMonth(date); - case "year": - return DateUtil.beginOfYear(date); - default: - return date; + /** + * 升级销售级别时处理订单相关的逻辑 + * + * @param orderId 订单ID,用于识别和处理特定的订单 + */ + @Override + public void saleLevelUp(Long orderId) { + // 根据订单ID获取订单详细信息 + MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); + // 如果订单信息为空,则直接返回 + if (mallOrderInfo == null) { + return; } + // 如果订单状态不是完成状态,则直接返回 + if (mallOrderInfo.getStatus() != OrderStatusEnum.FINISH.getValue()) { + // 订单不是完成状态 + return; + } + + // 根据订单中的会员ID获取会员信息 + MallMember member = mallMemberMapper.selectById(mallOrderInfo.getMemberId()); + // 如果会员信息为空,则记录日志并返回 + if (member == null) { + log.info("会员不存在"); + return; + } + + // 如果会员的推荐人ID为空,则直接返回 + if(StrUtil.isEmpty(member.getReferrerIds())){ + return; + } + // 分割会员的推荐人ID + String[] referrerIds = member.getReferrerIds().split(","); + // 查询符合条件的团长会员 + MallMember storeMasterMember = mallMemberMapper.selectOne( + new LambdaQueryWrapper<MallMember>() + .in(MallMember::getInviteId, referrerIds) + .eq(MallMember::getAccountStatus, MallMember.ACCOUNT_STATUS_ENABLE) + .eq(MallMember::getAccountType, MallMember.ACCOUNT_TYPE_NORMAL) + .ne(MallMember::getStoreMaster, 0) + .orderByAsc(MallMember::getStoreMaster) + .last("limit 1") + ); + // 如果没有找到符合条件的团长,则记录日志并返回 + if (storeMasterMember == null) { + log.info("团长不存在"); + return; + } + // 根据团长的等级代码查询团长等级信息 + HappySaleLevel happySaleLevel = happySaleLevelMapper.selectOne( + new LambdaQueryWrapper<HappySaleLevel>() + .eq(HappySaleLevel::getCode, storeMasterMember.getStoreMaster()) + ); + // 如果团长等级信息不存在,则记录日志并返回 + if (happySaleLevel == null) { + log.info("团长等级不存在"); + return; + } + // 计算返佣金额 + BigDecimal divide = happySaleLevel.getReturnPercent().divide(new BigDecimal(100)); + BigDecimal multiply = mallOrderInfo.getAmount().multiply(divide).setScale(2, RoundingMode.HALF_DOWN); + // 如果返佣金额小于等于0,则直接返回 + if(BigDecimal.ZERO.compareTo(multiply) >=0){ + return; + } + // 如果返佣金额大于等于订单金额,则直接返回 + if(multiply.compareTo(mallOrderInfo.getAmount()) >= 0){ + return; + } + // 记录团长获得返佣 + mallMoneyFlowService.addMoneyFlow( + storeMasterMember.getId(), + multiply, + ScoreFlowTypeEnum.SALE_RECOMMEND.getValue(), + mallOrderInfo.getOrderNo(), + FlowTypeEnum.BALANCE.getValue(), + ScoreFlowTypeEnum.SALE_RECOMMEND.getDesc(), + 2 + ); + // 更新会员钱包中的余额 + mallMemberWalletService.add(multiply, storeMasterMember.getId(), "balance"); + + MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); + mallAchieveRecord.setMemberId(mallOrderInfo.getMemberId()); + mallAchieveRecord.setAchieveTime(new Date()); + mallAchieveRecord.setAmount(mallOrderInfo.getAmount()); + mallAchieveRecord.setCostAmount(multiply); + mallAchieveRecord.setOrderId(mallOrderInfo.getId()); + mallAchieveRecord.setIsNormal(1); + mallAchieveRecord.setPayTime(mallOrderInfo.getPayTime()); + mallAchieveRecordMapper.insert(mallAchieveRecord); + + this.autoUpAgentLevel(storeMasterMember.getId()); } + + + /** + * 自动升级代理等级 + * 根据会员的当前状态和业绩,自动为其升级到下一个代理等级 + * @param memberId 会员ID,用于识别需要升级的会员 + */ + private void autoUpAgentLevel(Long memberId) { + // 根据会员ID查询会员信息 + MallMember member = mallMemberMapper.selectById(memberId); + + // 检查会员账户状态和类型,只有在启用状态和普通类型时才进行升级操作 + if(MallMember.ACCOUNT_STATUS_ENABLE != member.getAccountStatus() + || MallMember.ACCOUNT_TYPE_NORMAL != member.getAccountType() ){ + return; + } + // 获取会员当前的店铺主人等级 + Integer storeMaster = member.getStoreMaster(); + // 下一个分销等级 + storeMaster =storeMaster +1; + // 根据新的店铺主人等级查询对应的快乐销售等级信息 + HappySaleLevel happySaleLevel = happySaleLevelMapper.selectOne( + new LambdaQueryWrapper<HappySaleLevel>() + .eq(HappySaleLevel::getCode, storeMaster) + ); + // 如果没有找到对应的快乐销售等级信息,则记录日志并返回 + if (happySaleLevel == null) { + log.info("当前等级无下级"); + return; + } + // 检查直推会员数量是否达到要求 + if (!directMemberCnt(member, happySaleLevel.getDirectCnt())) { + return; + } + + // 检查团队人数是否达到要求 + if (!teamCntFinish(member, happySaleLevel.getTeamCnt())) { + return; + } + + // 检查团队业绩是否达到要求 + if (!teamIncome(member, happySaleLevel.getTeamAmount())) { + return; + } + + // 更新会员的店铺主人等级 + member.setStoreMaster(storeMaster); + // 更新会员信息 + mallMemberMapper.updateById(member); + } + + + /** + * 判断直推人数是否达标 + */ + private boolean directMemberCnt(MallMember member, Integer directCnt) { + List<MallMember> childList = mallMemberMapper.selectByRefererId(member.getInviteId()); + if (CollUtil.isEmpty(childList)) { + return false; + } + + if (childList.size() >= directCnt) { + return true; + } + + log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getStoreMaster(), childList.size(), directCnt); + return false; + } + + /** + * 判断团队数量是否达标 + */ + private boolean teamCntFinish(MallMember member, Integer teamCnt) { + // 直推用户 + List<MallMember> teamMember = mallMemberMapper.selectAllChildAgentListByInviteId(member.getInviteId()); + if (CollUtil.isEmpty(teamMember)) { + return false; + } + + if (teamMember.size() >= teamCnt) { + return true; + } + + log.info("用户:{}团队数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getStoreMaster(), teamMember.size(), teamCnt); + return false; + } + + /** + * 团队业绩是否达标 + */ + private boolean teamIncome(MallMember member, BigDecimal teamAmount) { + BigDecimal totalIncome = mallMemberMapper.selectAchieveByMemberId(member.getInviteId(), 2); + + if(totalIncome.compareTo(teamAmount) >= 0){ + return true; + } + log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getPhone(), member.getStoreMaster(), totalIncome, teamAmount); + return false; + } + } diff --git a/src/main/resources/mapper/modules/MallGoodsMapper.xml b/src/main/resources/mapper/modules/MallGoodsMapper.xml index 3162fc5..6bc8228 100644 --- a/src/main/resources/mapper/modules/MallGoodsMapper.xml +++ b/src/main/resources/mapper/modules/MallGoodsMapper.xml @@ -13,6 +13,7 @@ <result property="goodsDetails" column="goods_details" /> <result property="isSale" column="is_sale" /> <result property="originalPrice" column="original_price" /> + <result property="staticPropPrice" column="staticPropPrice" /> <result property="presentPrice" column="present_price" /> <result property="categoryId" column="category_id" /> <result property="volume" column="volume" /> @@ -66,6 +67,7 @@ c.stock sku_stock, c.sku_volume, c.original_price sku_original_price, + a.original_price*a.static_prop staticPropPrice, c.present_price sku_present_price, c.style_id sku_style_id, c.goods_weight sku_goods_weight, @@ -90,6 +92,7 @@ a.thumb, a.unit, a.original_price, + a.original_price*a.static_prop staticPropPrice, a.present_price, a.level_one_price, a.level_two_price, @@ -340,6 +343,7 @@ a.thumb, a.unit, a.original_price, + a.original_price*a.static_prop staticPropPrice, a.present_price, a.score, a.is_hot, diff --git a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml index 9e7f9e6..ae7ff75 100644 --- a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml +++ b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml @@ -108,6 +108,7 @@ <result column="member_id" property="memberId" /> <result column="order_time" property="orderTime" /> <result column="pay_time" property="payTime" /> + <result column="score_amount" property="scoreAmount" /> <result column="amount" property="amount" /> <result column="pay_method" property="payMethod" /> <result column="pay_order_no" property="payOrderNo" /> @@ -356,6 +357,7 @@ <result column="member_id" property="memberId" /> <result column="order_time" property="orderTime" /> <result column="pay_time" property="payTime" /> + <result column="score_amount" property="scoreAmount" /> <result column="amount" property="amount" /> <result column="pay_method" property="payMethod" /> <result column="pay_order_no" property="payOrderNo" /> diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html index 55605b8..36a817c 100644 --- a/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html +++ b/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html @@ -103,20 +103,22 @@ </div> </div> - <div class="layui-form-item"> - <label class="layui-form-label">推销员返积分比例(%)</label> - <div class="layui-input-block"> - <input type="text" name="staticMulti" placeholder="请输入推销员返积分比例" autocomplete="off" class="layui-input"> - </div> - </div> +<!-- <div class="layui-form-item">--> +<!-- <label class="layui-form-label">推销员返积分比例(%)</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticMulti" placeholder="请输入推销员返积分比例" autocomplete="off" class="layui-input">--> +<!-- </div>--> +<!-- </div>--> - <div class="layui-form-item febs-hide tc-set"> - <label class="layui-form-label">静态占比(%)</label> - <div class="layui-input-block"> - <input type="text" name="staticProp" placeholder="请输入静态占比" autocomplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div> - </div> - </div> +<!-- <div class="layui-form-item febs-hide tc-set">--> +<!-- <label class="layui-form-label">积分折扣(%)</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticProp" placeholder="请输入积分折扣" autocomplete="off" class="layui-input">--> +<!-- <div class="layui-form-mid layui-word-aux">折扣积分=售价*积分折扣(%)*积分换算比例</div>--> +<!-- <div class="layui-form-mid layui-word-aux">不允许使用积分设置成:0%</div>--> +<!-- <div class="layui-form-mid layui-word-aux">全部使用积分设置成:大于等于100%</div>--> +<!-- </div>--> +<!-- </div>--> </div> <div class="layui-tab-item"> @@ -238,6 +240,16 @@ <input type="text" name="costPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> </div> </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">积分折扣(%)</label> + <div class="layui-input-block"> + <input type="text" name="staticProp" lay-verify="required" placeholder="请输入积分折扣" lay-reqText="请输入积分折扣" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">折扣积分=原价 * 积分折扣(%)* 积分换算比例</div> + <div class="layui-form-mid layui-word-aux">不允许使用积分设置成:0%</div> + <div class="layui-form-mid layui-word-aux">全部使用积分设置成:大于等于100%</div> + </div> + </div> + </div> <blockquote class="layui-elem-quote blue-border">运费设置</blockquote> <div class="layui-form-item"> @@ -374,7 +386,7 @@ upload = layui.upload, validate = layui.validate, element = layui.element; - + // form.verify(validate); form.render(); const E = window.wangEditor; const editor = new E('#toolbar-container', '#text-container'); // 传入两个元素 @@ -826,14 +838,14 @@ return false; }); - form.on('select(goods-type-select)', function(data){ - $('.tc-set').each(function() { - if (data.value == 2) { - $(this).show(); - } else { - $(this).hide(); - } - }) - }); + // form.on('select(goods-type-select)', function(data){ + // $('.tc-set').each(function() { + // if (data.value == 2) { + // $(this).show(); + // } else { + // $(this).hide(); + // } + // }) + // }); }); </script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html index a21f756..073af2a 100644 --- a/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html +++ b/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html @@ -112,21 +112,21 @@ </div> </div> - <div class="layui-form-item"> - <label class="layui-form-label">推销员返积分比例(%)</label> - <div class="layui-input-block"> - <input type="text" name="staticMulti" placeholder="请输入推销员返积分比例" autocomplete="off" class="layui-input"> - </div> - </div> +<!-- <div class="layui-form-item">--> +<!-- <label class="layui-form-label">推销员返积分比例(%)</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticMulti" placeholder="请输入推销员返积分比例" autocomplete="off" class="layui-input">--> +<!-- </div>--> +<!-- </div>--> - <div class="layui-form-item febs-hide tc-set"> - <label class="layui-form-label">静态占比(%)</label> - <div class="layui-input-block"> - <input type="text" name="staticProp" placeholder="请输入静态占比" - autoComplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div> - </div> - </div> +<!-- <div class="layui-form-item febs-hide tc-set">--> +<!-- <label class="layui-form-label">静态占比(%)</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticProp" placeholder="请输入静态占比"--> +<!-- autoComplete="off" class="layui-input">--> +<!-- <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div>--> +<!-- </div>--> +<!-- </div>--> </div> <div class="layui-tab-item"> @@ -238,6 +238,16 @@ <input type="text" name="costPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> </div> </div> + + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">积分折扣(%)</label> + <div class="layui-input-block"> + <input type="text" name="staticProp" lay-verify="required" placeholder="请输入积分折扣" lay-reqText="请输入积分折扣" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">折扣积分=售价*积分折扣(%)*积分换算比例</div> + <div class="layui-form-mid layui-word-aux">不允许使用积分设置成:0%</div> + <div class="layui-form-mid layui-word-aux">全部使用积分设置成:大于等于100%</div> + </div> + </div> </div> <!-- <blockquote class="layui-elem-quote blue-border">代理价格</blockquote>--> <!-- <div class="layui-row layui-col-space10 layui-form-item">--> -- Gitblit v1.9.1