diff --git a/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java index acea7dc5..8bc163f1 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java @@ -37,7 +37,7 @@ public class PointsHistoryBuyerController { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(MemberPointsHistory::getMemberId, UserContext.getCurrentUser().getId()); - + queryWrapper.orderByDesc(MemberPointsHistory::getCreateTime); return ResultUtil.data(memberPointsHistoryService.page(PageUtil.initPage(page), queryWrapper)); } diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/KanjiaGoodsActivityBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/KanjiaGoodsActivityBuyerController.java new file mode 100644 index 00000000..7383582f --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/KanjiaGoodsActivityBuyerController.java @@ -0,0 +1,107 @@ +package cn.lili.controller.promotion; + +import cn.hutool.core.util.StrUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.vos.kanjia.*; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityLogService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 买家端,砍价活动商品 + * + * @author qiuqiu + * @date 2021/7/12 + **/ +@RestController +@Api(tags = "买家端,砍价商品接口") +@RequestMapping("/buyer/promotion/kanjiaGoods") +public class KanjiaGoodsActivityBuyerController { + + /** + * 砍价活动商品 + */ + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; + /** + * 帮砍记录 + */ + @Autowired + private KanjiaActivityLogService kanJiaActivityLogService; + /** + * 砍价活动 + */ + @Autowired + private KanjiaActivityService kanJiaActivityService; + + @GetMapping + @ApiOperation(value = "分页获取砍价商品") + public ResultMessage> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) { + // 会员端查询到的肯定是已经开始的活动商品 + kanjiaActivityGoodsParams.setPromotionStatus(PromotionStatusEnum.START.name()); + return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page)); + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取砍价活动商品") + @ApiImplicitParam(name = "id", value = "砍价活动商品ID", required = true, paramType = "path") + public ResultMessage getKanjiaActivityGoods(@PathVariable String id) { + return ResultUtil.data(kanJiaActivityGoodsService.getKanJiaGoodsVO(id)); + } + + @GetMapping("/getKanjiaActivity/logs") + @ApiOperation(value = "分页获取砍价活动-帮砍记录") + public ResultMessage> getKanjiaActivityLog(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO page) { + return ResultUtil.data(kanJiaActivityLogService.getForPage(kanJiaActivityLogQuery, page)); + } + + @PostMapping("/getKanjiaActivity") + @ApiOperation(value = "获取砍价活动") + public ResultMessage getKanJiaActivity(KanjiaActivitySearchParams kanjiaActivitySearchParams) { + //如果是非被邀请关系则填写会员ID + if (StrUtil.isEmpty(kanjiaActivitySearchParams.getKanjiaActivityId())) { + kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId()); + } + return ResultUtil.data(kanJiaActivityService.getKanjiaActivityVO(kanjiaActivitySearchParams)); + } + + @PostMapping + @ApiImplicitParam(name = "id", value = "砍价活动商品ID", required = true, paramType = "path") + @ApiOperation(value = "发起砍价活动") + public ResultMessage launchKanJiaActivity(String id) { + KanjiaActivityLog kanjiaActivityLog = kanJiaActivityService.add(id); + return ResultUtil.data(kanjiaActivityLog); + } + + @PostMapping("/help/{kanjiaActivityId}") + @ApiImplicitParam(name = "kanJiaActivityId", value = "砍价活动ID", required = true, paramType = "path") + @ApiOperation(value = "帮砍一刀") + public ResultMessage helpKanJia(@PathVariable String kanjiaActivityId) { + KanjiaActivityLog kanjiaActivityLog = kanJiaActivityService.helpKanJia(kanjiaActivityId); + return ResultUtil.data(kanjiaActivityLog); + } + + @GetMapping("/kanjiaActivity/mine/") + @ApiOperation(value = "分页获取已参与的砍价活动") + public ResultMessage> getPointsGoodsPage(KanjiaActivityQuery kanjiaActivityQuery, PageVO page) { + // 会员端查询到的肯定是已经开始的活动商品 + kanjiaActivityQuery.setMemberId(UserContext.getCurrentUser().getId()); + IPage kanjiaActivity = kanJiaActivityService.getForPage(kanjiaActivityQuery, page); + return ResultUtil.data(kanjiaActivity); + } + +} diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java index 75dbf129..6bd0ee33 100644 --- a/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java @@ -10,9 +10,11 @@ import cn.lili.modules.promotion.service.PointsGoodsCategoryService; import cn.lili.modules.promotion.service.PointsGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -44,4 +46,11 @@ public class PointsGoodsBuyerController { return ResultUtil.data(pointsGoodsCategoryService.getCategoryByPage(name, page)); } + @GetMapping("/{id}") + @ApiOperation(value = "获取积分活动商品") + @ApiImplicitParam(name = "id", value = "积分商品ID", required = true, paramType = "path") + public ResultMessage getPointsGoodsPage(@PathVariable String id) { + return ResultUtil.data(pointsGoodsService.getPointsGoodsDetail(id)); + } + } diff --git a/config/application.yml b/config/application.yml index e431729c..a119cd71 100644 --- a/config/application.yml +++ b/config/application.yml @@ -37,9 +37,6 @@ spring: # replica-set-name: mongoreplset cache: type: redis - #amqp - # rabbitmq: - # host: 192.168.0.116 jpa: # 自动生成表结构 generate-ddl: true diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java index 8251d47b..3451b1ee 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java @@ -1,6 +1,7 @@ package cn.lili.event.impl; +import cn.hutool.core.convert.Convert; import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.StringUtils; import cn.lili.event.AfterSaleStatusChangeEvent; @@ -87,7 +88,7 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp if (orderMessage.getNewStatus().equals(OrderStatusEnum.COMPLETED)) { Order order = orderService.getBySn(orderMessage.getOrderSn()); //根据订单编号获取订单数据,如果订单促销类型不为空,并且订单促销类型为积分订单 则直接返回 - if (StringUtils.isNotEmpty(order.getOrderPromotionType()) && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINT.name())) { + if (StringUtils.isNotEmpty(order.getOrderPromotionType()) && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name())) { return; } //获取积分设置 @@ -96,7 +97,13 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp Double point = CurrencyUtil.mul(pointSetting.getMoney(), order.getFlowPrice(), 0); //赠送会员积分 memberService.updateMemberPoint(point.longValue(), true, order.getMemberId(), "会员下单,赠送积分" + point + "分"); - + //取消订单恢复积分 + } else if (orderMessage.getNewStatus().equals(OrderStatusEnum.CANCELLED)) { + //根据订单编号获取订单数据,如果为积分订单则跳回 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + if (order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name()) && order.getPriceDetailDTO().getPayPoint() != null) { + memberService.updateMemberPoint(Convert.toLong(order.getPriceDetailDTO().getPayPoint()), true, order.getMemberId(), "订单取消,恢复积分:" + order.getPriceDetailDTO().getPayPoint() + "分"); + } } } diff --git a/framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java b/framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java index 3c4c845c..d2698984 100644 --- a/framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java +++ b/framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java @@ -16,13 +16,14 @@ public enum PromotionTypeEnum { COUPON("优惠券"), FULL_DISCOUNT("满减"), POINTS_GOODS("积分商品"), + KANJIA("砍价"), COUPON_ACTIVITY("优惠券活动") ; /** * 拼团秒杀拥有独立库存,如果其他促销也有独立库存涉及库存扣减的,请添加在下方 */ - static PromotionTypeEnum[] haveStockPromotion = new PromotionTypeEnum[]{PINTUAN, SECKILL}; + static PromotionTypeEnum[] haveStockPromotion = new PromotionTypeEnum[]{PINTUAN, SECKILL, KANJIA}; private final String description; diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index b72d707a..d971db28 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -125,6 +125,7 @@ public enum ResultCode { USER_OVERDUE_CONNECT_ERROR(20022, "授权信息已过期,请重新授权/登录"), USER_CONNECT_BANDING_ERROR(20023, "当前联合登陆方式,已绑定其他账号,需进行解绑操作"), USER_CONNECT_NOT_EXIST_ERROR(20024, "暂无联合登陆信息,无法实现一键注册功能,请点击第三方登录进行授权"), + USER_POINTS_ERROR(20024, "用户积分不足"), /** * 权限 @@ -234,13 +235,16 @@ public enum ResultCode { * 活动 */ PROMOTION_GOODS_NOT_EXIT(40001, "当前促销商品不存在!"), - PROMOTION_SAME_ACTIVE_EXIST(40002, "当前时间内已存在同类活动"), - PROMOTION_START_TIME_ERROR(40003, "活动起始时间不能大于活动结束时间"), - PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于当前时间"), - PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"), - PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"), - PROMOTION_STATUS_END(40007, "当前活动已停止"), - PROMOTION_UPDATE_ERROR(40008, "当前活动已开始/结束,无法编辑!"), + PROMOTION_SAME_ACTIVE_EXIST(40002,"当前时间内已存在同类活动"), + PROMOTION_START_TIME_ERROR(40003,"活动起始时间不能大于活动结束时间"), + PROMOTION_TIME_ERROR(40004,"活动起始时间必须大于当前时间"), + PROMOTION_SAME_ERROR(40005,"当前时间段已存在相同活动!"), + PROMOTION_GOODS_ERROR(40006,"请选择要参与活动的商品"), + PROMOTION_STATUS_END(40007,"当前活动已停止"), + PROMOTION_UPDATE_ERROR(40008,"当前活动已开始/结束,无法编辑!"), + PROMOTION_ACTIVITY_GOODS_ERROR(40009,"当前活动已经开始无法添加商品"), + PROMOTION_ACTIVITY_ERROR(40009,"当前促销活动不存在"), + PROMOTION_LOG_EXIST(40010,"活动已参加,已发重复参加"), /** * 优惠券 @@ -325,7 +329,23 @@ public enum ResultCode { * 其他促销 */ MEMBER_SIGN_REPEAT(47001, "请勿重复签到"), - POINT_GOODS_ACTIVE_STOCK_ERROR(47002, "活动库存数量不能高于商品库存"), + POINT_GOODS_ACTIVE_STOCK_ERROR(47002, "最低金额不能高于商品金额"), + + /** + * 砍价活动 + */ + KANJIA_GOODS_ACTIVE_STOCK_ERROR(48001, "活动库存数量不能高于商品库存"), + KANJIA_GOODS_ACTIVE_PRICE_ERROR(48002, "最低购买金额不能高于商品金额"), + KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR(48003, "最高砍价金额不能为0且不能超过商品金额"), + KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR(48004, "最低砍价金额不能为0且不能超过商品金额"), + KANJIA_GOODS_ACTIVE_HIGHEST_LOWEST_PRICE_ERROR(48005, "最低砍价金额不能高于最高砍价金额"), + KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR(48006, "结算金额不能高于商品金额"), + KANJIA_GOODS_DELETE_ERROR(48007, "删除砍价商品异常"), + KANJIA_ACTIVITY_NOT_FOUND_ERROR(48008, "砍价记录不存在"), + KANJIA_ACTIVITY_LOG_MEMBER_ERROR(48009, "当前会员已经帮砍"), + KANJIA_ACTIVITY_MEMBER_ERROR(48010, "当前会员已经发起此砍价商品活动"), + KANJIA_ACTIVITY_NOT_PASS_ERROR(48011, "当前砍价未满足条件,不能进行购买"), + KANJIA_NUM_BUY_ERROR(48012, "砍价商品购买数量不正确"), /** * 店铺 */ diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java index 32ec0108..1f273a53 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java @@ -16,6 +16,10 @@ public enum CartTypeEnum { * 立即购买 */ BUY_NOW, + /** + * 虚拟商品 + */ + VIRTUAL, /** * 拼团 */ @@ -25,8 +29,8 @@ public enum CartTypeEnum { */ POINTS, /** - * 虚拟商品 + * 砍价商品 */ - VIRTUAL; + KANJIA; } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java index ab292c31..c3e78937 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java @@ -66,8 +66,7 @@ public class CartSkuVO extends CartBase implements Serializable { @ApiModelProperty(value = "是否可配送") private Boolean isShip; - @ApiModelProperty(value = - "拼团id 如果是拼团购买 此值为拼团活动id," + + @ApiModelProperty(value = "拼团id 如果是拼团购买 此值为拼团活动id," + "当pintuanId为空,则表示普通购买(或者拼团商品,单独购买)") private String pintuanId; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java index 137aec54..c7cfbee9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java @@ -48,12 +48,18 @@ public class TradeBuilder { */ int[] defaultRender = {0, 1, 2, 4, 5, 6, 7}; + /** + * 单个商品优惠,不需要渲染满减优惠 + */ + int[] singleRender = {0, 2, 4, 5, 6, 7}; + /** * 购物车购物车渲染 * 0-> 校验商品, 1-》 满优惠渲染, 2->渲染优惠, 5->计算价格 */ int[] cartRender = {0, 1, 2, 5}; + /** * 构造购物车 * 购物车与结算信息不一致的地方主要是优惠券计算和运费计算,其他规则都是一致都 @@ -98,12 +104,23 @@ public class TradeBuilder { //将购物车到sku未选择信息过滤 List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); tradeDTO.setSkuList(collect); - //按照计划进行渲染 - for (int index : defaultRender) { - try { - cartRenderSteps.get(index).render(tradeDTO); - } catch (Exception e) { - log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e); + if (checkedWay.equals(CartTypeEnum.CART) || checkedWay.equals(CartTypeEnum.BUY_NOW) || checkedWay.equals(CartTypeEnum.VIRTUAL)) { + //按照计划进行渲染 + for (int index : defaultRender) { + try { + cartRenderSteps.get(index).render(tradeDTO); + } catch (Exception e) { + log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e); + } + } + } else { + //按照计划进行渲染 + for (int index : singleRender) { + try { + cartRenderSteps.get(index).render(tradeDTO); + } catch (Exception e) { + log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e); + } } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java index 77cd1dc3..7b6525cf 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java @@ -1,13 +1,18 @@ package cn.lili.modules.order.cart.render.impl; -import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.StrUtil; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.goods.service.CategoryService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.render.CartRenderStep; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.PointsGoodsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; @@ -33,6 +38,16 @@ public class CartPriceRender implements CartRenderStep { */ @Autowired private CategoryService categoryService; + /** + * 积分商品 + */ + @Autowired + private PointsGoodsService pointsGoodsService; + /** + * 砍价商品 + */ + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; @Override public void render(TradeDTO tradeDTO) { @@ -97,21 +112,43 @@ public class CartPriceRender implements CartRenderStep { if (Boolean.TRUE.equals(cartSkuVO.getChecked())) { PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); //流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice - couponPrice - double flowPrice = CurrencyUtil.sub(CurrencyUtil.add(priceDetailDTO.getGoodsPrice(), priceDetailDTO.getFreightPrice()), CurrencyUtil.add(priceDetailDTO.getDiscountPrice(), priceDetailDTO.getCouponPrice() != null ? priceDetailDTO.getCouponPrice() : 0)); + double flowPrice = CurrencyUtil.sub( + CurrencyUtil.add(priceDetailDTO.getGoodsPrice(), priceDetailDTO.getFreightPrice()), + CurrencyUtil.add(priceDetailDTO.getDiscountPrice(), + priceDetailDTO.getCouponPrice() != null ? priceDetailDTO.getCouponPrice() : 0)); priceDetailDTO.setFlowPrice(flowPrice); - //最终结算金额 = flowPrice - platFormCommission - distributionCommission - double billPrice = CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, priceDetailDTO.getPlatFormCommission()), priceDetailDTO.getDistributionCommission()); - priceDetailDTO.setBillPrice(billPrice); + //如果是普通订单最终结算金额 = flowPrice - platFormCommission - distributionCommission + //砍价、积分订单按照商品的结算价进行结算 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) + || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW) + || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) { + + double billPrice = CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, priceDetailDTO.getPlatFormCommission()), priceDetailDTO.getDistributionCommission()); + priceDetailDTO.setBillPrice(billPrice); + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId()); + priceDetailDTO.setBillPrice(pointsGoodsVO.getSettlementPrice()); + priceDetailDTO.setSettlementPrice(pointsGoodsVO.getSettlementPrice()); + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) { + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanJiaGoodsBySku(cartSkuVO.getGoodsSku().getId()); + priceDetailDTO.setBillPrice(kanjiaActivityGoodsDTO.getSettlementPrice()); + priceDetailDTO.setSettlementPrice(kanjiaActivityGoodsDTO.getSettlementPrice()); + } + //填写结算价格 + //平台佣金 String categoryId = cartSkuVO.getGoodsSku().getCategoryPath().substring( cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1 ); - if (CharSequenceUtil.isNotEmpty(categoryId)) { + + //平台佣金=订单金额 * 分类佣金百分比 + if (StrUtil.isNotEmpty(categoryId)) { Double platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, categoryService.getById(categoryId).getCommissionRate()), 100); priceDetailDTO.setPlatFormCommission(platFormCommission); } + priceDetailDTOS.add(priceDetailDTO); } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java index 9687b989..68b2edbd 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java @@ -1,6 +1,7 @@ package cn.lili.modules.order.cart.render.impl; import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; @@ -9,12 +10,20 @@ import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.render.CartRenderStep; import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.promotion.entity.dos.Pintuan; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; +import cn.lili.modules.promotion.service.PintuanService; +import cn.lili.modules.promotion.service.PointsGoodsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; @@ -22,6 +31,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -40,15 +50,26 @@ public class CheckDataRender implements CartRenderStep { @Autowired private OrderService orderService; + @Autowired + private PintuanService pintuanService; + + @Autowired + private MemberService memberService; + + @Autowired + private PointsGoodsService pointsGoodsService; + @Override public void render(TradeDTO tradeDTO) { - //校验商品有效性 - checkData(tradeDTO); - //店铺分组数据初始化 - groupStore(tradeDTO); //预校验 preCalibration(tradeDTO); + //校验商品有效性 + checkData(tradeDTO); + + //店铺分组数据初始化 + groupStore(tradeDTO); + } /** @@ -125,15 +146,43 @@ public class CheckDataRender implements CartRenderStep { * @param tradeDTO */ private void preCalibration(TradeDTO tradeDTO) { - //拼团判定,不能参与自己创建的拼团 - if (tradeDTO.getParentOrderSn() != null) { - //订单接受 - cn.lili.modules.order.order.entity.dos.Order parentOrder = orderService.getBySn(tradeDTO.getParentOrderSn()); - //参与活动判定 - if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { - throw new ServiceException(ResultCode.PINTUAN_JOIN_ERROR); + + //拼团订单预校验 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) { + //拼团判定,不能参与自己创建的拼团 + if (tradeDTO.getParentOrderSn() != null) { + //订单接受 + cn.lili.modules.order.order.entity.dos.Order parentOrder = orderService.getBySn(tradeDTO.getParentOrderSn()); + //参与活动判定 + if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { + throw new ServiceException(ResultCode.PINTUAN_JOIN_ERROR); + } + } + //判断拼团商品的限购数量 + Optional pintuanId = tradeDTO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); + if (pintuanId.isPresent()) { + Pintuan pintuan = pintuanService.getPintuanById(pintuanId.get()); + Integer limitNum = pintuan.getLimitNum(); + for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { + throw new ServiceException(ResultCode.PINTUAN_LIMIT_NUM_ERROR); + } + } + } + //积分商品,判断用户积分是否满足 + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { + String skuId = tradeDTO.getSkuList().get(0).getGoodsSku().getId(); + //获取积分商品VO + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(skuId); + if(pointsGoodsVO==null){ + throw new ServiceException(ResultCode.POINT_GOODS_ERROR); + } + Member member = memberService.getUserInfo(); + if (member.getPoint() < pointsGoodsVO.getPoints()) { + throw new ServiceException(ResultCode.USER_POINTS_ERROR); } } + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index 5711c06d..b9c9f671 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -1,8 +1,6 @@ package cn.lili.modules.order.cart.render.impl; import cn.hutool.core.date.DateUtil; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; @@ -14,14 +12,10 @@ import cn.lili.modules.order.cart.entity.vo.PriceDetailVO; import cn.lili.modules.order.cart.render.CartRenderStep; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.dos.Pintuan; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dto.GoodsSkuPromotionPriceDTO; import cn.lili.modules.promotion.entity.dto.PromotionPriceDTO; import cn.lili.modules.promotion.entity.dto.PromotionPriceParamDTO; import cn.lili.modules.promotion.entity.dto.StorePromotionPriceDTO; -import cn.lili.common.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionPriceService; import org.springframework.beans.factory.annotation.Autowired; @@ -53,46 +47,31 @@ public class SkuPromotionRender implements CartRenderStep { */ @Autowired private PromotionGoodsService promotionGoodsService; - /** - * 拼团 - */ - @Autowired - private PintuanService pintuanService; @Override public void render(TradeDTO tradeDTO) { - //主要渲染各个优惠的价格 - this.renderSkuPromotion(tradeDTO); + //渲染促销价格 + this.renderPromotionPrice(tradeDTO); - this.checkPromotionLimit(tradeDTO); + //获取商品促销 + renderSkuPromotion(tradeDTO); } /** - * 渲染单品优惠 积分/拼团/秒杀 + * 渲染单品优惠 积分/拼团/秒杀/砍价 * * @param tradeDTO 购物车视图 */ private void renderSkuPromotion(TradeDTO tradeDTO) { - //渲染促销价格 - this.renderPromotionPrice(tradeDTO); - - //拼团和积分购买需要特殊处理,这里优先特殊处理 - if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { - List cartSkuVOList = tradeDTO.getSkuList(); - for (CartSkuVO cartSku : cartSkuVOList) { - PriceDetailDTO priceDetailDTO = cartSku.getPriceDetailDTO(); - //需要支付的积分 - priceDetailDTO.setPayPoint( - CurrencyUtil.mul( - cartSku.getPoint(), cartSku.getNum()).intValue()); - } - } else { - //这里普通购物车也只渲染满优惠,其他优惠都是商品级别的,都写在商品属性里 + //非积分商品、拼团、砍价商品可渲染满优惠活动 + //这里普通购物车也只渲染满优惠,其他优惠都是商品级别的,都写在商品属性里 + if (!tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS) + && !tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN) + && !tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) { List cartVOS = tradeDTO.getCartList(); - for (CartVO cartVO : cartVOS) { if (isFull(cartVO)) { this.renderFullMinus(cartVO); @@ -101,16 +80,61 @@ public class SkuPromotionRender implements CartRenderStep { promotionGoodsService.getCartSkuPromotion(cartSkuVO); } } - } } /** * 渲染购物车视图的促销价格 + * 1.获取购物车商品列表 + * 2.获取用户的优惠券 + * 3.调用价格计算模块,返回价格计算结果 + * 4.分配计算后的促销 * * @param tradeDTO 购物车视图 */ private void renderPromotionPrice(TradeDTO tradeDTO) { + + //获取购物车商品列表 + List promotionPriceParamList = this.getPromotionPriceParamList(tradeDTO); + //店铺优惠券集合 + List memberCoupons = this.getMemberCoupons(tradeDTO); + //调用价格计算模块,返回价格计算结果 + PromotionPriceDTO promotionPrice = promotionPriceService.calculationPromotionPrice(promotionPriceParamList, memberCoupons,tradeDTO.getCartTypeEnum()); + // 分配计算后的促销 + this.distributionPromotionPrice(tradeDTO, promotionPrice); + } + + /** + * 获取用户优惠券列表 + * + * @param tradeDTO 交易DTO + * @return 用户优惠券列表 + */ + private List getMemberCoupons(TradeDTO tradeDTO) { + //店铺优惠券集合 + List memberCoupons = new ArrayList<>(); + if (tradeDTO.getStoreCoupons() != null) { + memberCoupons.addAll(tradeDTO.getStoreCoupons().values().parallelStream().map(MemberCouponDTO::getMemberCoupon).collect(Collectors.toList())); + } + + //平台优惠券 + if (tradeDTO.getPlatformCoupon() != null && tradeDTO.getPlatformCoupon().getMemberCoupon() != null) { + memberCoupons.add(tradeDTO.getPlatformCoupon().getMemberCoupon()); + } + + //清除过期优惠券 + long now = DateUtil.date().getTime(); + memberCoupons.removeIf(memberCoupon -> memberCoupon.getEndTime().getTime() < now); + return memberCoupons; + } + + /** + * 获取促销价格DTO列表 + * + * @param tradeDTO 交易DTO + * @return 促销价格DTO列表 + */ + private List getPromotionPriceParamList(TradeDTO tradeDTO) { List promotionPriceParamList = new ArrayList<>(); List cartList = tradeDTO.getCartList(); for (CartVO cartVO : cartList) { @@ -130,30 +154,7 @@ public class SkuPromotionRender implements CartRenderStep { } } } - //如果包含促销规则 - if (!promotionPriceParamList.isEmpty()) { - //店铺优惠券集合 - List memberCoupons = new ArrayList<>(); - if (tradeDTO.getStoreCoupons() != null) { - memberCoupons.addAll(tradeDTO.getStoreCoupons().values().parallelStream().map(MemberCouponDTO::getMemberCoupon).collect(Collectors.toList())); - } - - //平台优惠券 - if (tradeDTO.getPlatformCoupon() != null && tradeDTO.getPlatformCoupon().getMemberCoupon() != null) { - memberCoupons.add(tradeDTO.getPlatformCoupon().getMemberCoupon()); - } - //检查优惠券集合中是否存在过期优惠券 - this.checkMemberCoupons(memberCoupons); - //调用价格计算模块,返回价格计算结果 - PromotionPriceDTO promotionPrice = promotionPriceService.calculationPromotionPrice(promotionPriceParamList, memberCoupons); - // 分配计算后的促销 - this.distributionPromotionPrice(tradeDTO, promotionPrice); - } - } - - private void checkMemberCoupons(List memberCoupons) { - long now = DateUtil.date().getTime(); - memberCoupons.removeIf(memberCoupon -> memberCoupon.getEndTime().getTime() < now); + return promotionPriceParamList; } /** @@ -284,19 +285,4 @@ public class SkuPromotionRender implements CartRenderStep { return false; } - private void checkPromotionLimit(TradeDTO tradeDTO) { - if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) { - //如果为拼团订单,则获取拼团活动ID - Optional pintuanId = tradeDTO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); - if (pintuanId.isPresent()) { - Pintuan pintuan = pintuanService.getPintuanById(pintuanId.get()); - Integer limitNum = pintuan.getLimitNum(); - for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { - if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { - throw new ServiceException(ResultCode.PINTUAN_LIMIT_NUM_ERROR); - } - } - } - } - } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java index 985daecb..e36bb96b 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java @@ -2,6 +2,7 @@ package cn.lili.modules.order.cart.service; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.cache.Cache; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; @@ -23,16 +24,16 @@ import cn.lili.modules.order.cart.entity.vo.TradeParams; import cn.lili.modules.order.cart.render.TradeBuilder; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.vo.ReceiptVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; -import cn.lili.common.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.service.MemberAddressService; -import cn.lili.modules.promotion.service.MemberCouponService; -import cn.lili.modules.promotion.service.PintuanService; -import cn.lili.modules.promotion.service.PromotionGoodsService; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.service.*; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsSearchService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -93,6 +94,13 @@ public class CartServiceImpl implements CartService { */ @Autowired private PintuanService pintuanService; + /** + * 砍价 + */ + @Autowired + private KanjiaActivityService kanjiaActivityService; + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; /** * 交易 */ @@ -147,32 +155,26 @@ public class CartServiceImpl implements CartService { CartSkuVO cartSkuVO = new CartSkuVO(dataSku); cartSkuVO.setCartType(cartTypeEnum); promotionGoodsService.updatePromotion(cartSkuVO); - //再设置加入购物车的数量 - this.checkSetGoodsQuantity(cartSkuVO, skuId, num); - - //拼团判定 - checkPintuan(cartTypeEnum, cartSkuVO); - + //检测购物车数据 + checkCart(cartTypeEnum, cartSkuVO, skuId, num); //计算购物车小计 cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); cartSkuVOS.add(cartSkuVO); } - tradeDTO.setCartTypeEnum(cartTypeEnum); //如购物车发生更改,则重置优惠券 tradeDTO.setStoreCoupons(null); tradeDTO.setPlatformCoupon(null); this.resetTradeDTO(tradeDTO); - } catch (ServiceException se) { - throw se; + } catch (ServiceException serviceException) { + throw serviceException; } catch (Exception e) { log.error("购物车渲染异常", e); throw new ServiceException(errorMessage); } } - @Override public void updateNum(String skuId, int num) { try { @@ -637,32 +639,80 @@ public class CartServiceImpl implements CartService { } /** - * 校验拼团信息 + * 检测购物车 * * @param cartTypeEnum 购物车枚举 - * @param cartSkuVO 购物车信息 + * @param cartSkuVO SKUVO + * @param skuId SkuId + * @param num 数量 */ - private void checkPintuan(CartTypeEnum cartTypeEnum, CartSkuVO cartSkuVO) { - - //拼团活动的话,需要对限购数量进行判定 + private void checkCart(CartTypeEnum cartTypeEnum, CartSkuVO cartSkuVO, String skuId, Integer num) { + //拼团判定 if (cartTypeEnum.equals(CartTypeEnum.PINTUAN)) { - //获取拼团信息 - List currentPromotion = cartSkuVO.getPromotions().stream().filter( - promotionGoods -> (promotionGoods.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name()))) - .collect(Collectors.toList()); - //拼团活动判定 - if (!currentPromotion.isEmpty()) { - //写入拼团信息 - cartSkuVO.setPintuanId(currentPromotion.get(0).getPromotionId()); - } else { - throw new ServiceException(ResultCode.CART_PINTUAN_NOT_EXIST_ERROR); - } + checkPintuan(cartSkuVO); + //砍价判定 + } else if (cartTypeEnum.equals(CartTypeEnum.KANJIA)) { + checkKanjia(cartSkuVO); + //检测购物车的数量 + } else { + this.checkSetGoodsQuantity(cartSkuVO, skuId, num); + } - Pintuan pintuan = pintuanService.getPintuanById(cartSkuVO.getPintuanId()); - Integer limitNum = pintuan.getLimitNum(); - if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { - throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR); - } + } + + /** + * 校验拼团信息 + * + * @param cartSkuVO 购物车信息 + */ + private void checkPintuan(CartSkuVO cartSkuVO) { + + //拼团活动,需要对限购数量进行判定 + //获取拼团信息 + List currentPromotion = cartSkuVO.getPromotions().stream().filter( + promotionGoods -> (promotionGoods.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name()))) + .collect(Collectors.toList()); + //拼团活动判定 + if (!currentPromotion.isEmpty()) { + //写入拼团信息 + cartSkuVO.setPintuanId(currentPromotion.get(0).getPromotionId()); + } else { + throw new ServiceException(ResultCode.CART_PINTUAN_NOT_EXIST_ERROR); + } + //检测拼团限购数量 + Pintuan pintuan = pintuanService.getPintuanById(cartSkuVO.getPintuanId()); + Integer limitNum = pintuan.getLimitNum(); + if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { + throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR); } } + + /** + * 校验砍价信息 + * + * @param cartSkuVO 购物车信息 + */ + private void checkKanjia(CartSkuVO cartSkuVO) { + + //根据skuId获取砍价商品 + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO=kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId()); + + //查找当前会员的砍价商品活动 + KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams(); + kanjiaActivitySearchParams.setKanjiaActivityGoodsId(kanjiaActivityGoodsDTO.getId()); + kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId()); + kanjiaActivitySearchParams.setStatus(KanJiaStatusEnum.SUCCESS.name()); + KanjiaActivity kanjiaActivity = kanjiaActivityService.getKanjiaActivity(kanjiaActivitySearchParams); + + //校验砍价活动是否满足条件 + //判断发起砍价活动 + if (kanjiaActivity == null) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_FOUND_ERROR); + //判断砍价活动是否已满足条件 + } else if (!KanJiaStatusEnum.SUCCESS.name().equals(kanjiaActivity.getStatus())) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_PASS_ERROR); + } + //砍价商品默认一件货物 + cartSkuVO.setNum(1); + } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java index baf838df..eee4edbc 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java @@ -1,5 +1,6 @@ package cn.lili.modules.order.order.entity.dos; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import cn.lili.mybatis.BaseEntity; import cn.lili.common.utils.BeanUtil; @@ -167,7 +168,7 @@ public class Order extends BaseEntity { private Boolean needReceipt; @ApiModelProperty(value = "是否为其他订单下的订单,如果是则为依赖订单的sn,否则为空") - private String parentOrderSn=""; + private String parentOrderSn = ""; @ApiModelProperty(value = "是否为某订单类型的订单,如果是则为订单类型的id,否则为空") private String promotionId; @@ -215,7 +216,7 @@ public class Order extends BaseEntity { BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this); BeanUtil.copyProperties(cartVO, this); //填写订单类型 - this.setTradeType(cartVO,tradeDTO); + this.setTradeType(cartVO, tradeDTO); setId(oldId); //设置默认支付状态 @@ -253,22 +254,23 @@ public class Order extends BaseEntity { * 2.普通订单进行区分:实物订单、虚拟订单 * 3.促销订单判断货物进行区分实物、虚拟商品。 * 4.拼团订单需要填写父订单ID - * @param cartVO 购物车VO + * + * @param cartVO 购物车VO * @param tradeDTO 交易DTO */ - private void setTradeType(CartVO cartVO, TradeDTO tradeDTO){ + private void setTradeType(CartVO cartVO, TradeDTO tradeDTO) { //判断是否为普通订单、促销订单 if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW)) { this.setOrderType(OrderTypeEnum.NORMAL.name()); - }else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) { + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) { this.setOrderType(OrderTypeEnum.VIRTUAL.name()); - }else{ + } else { //促销订单(拼团、积分)-判断购买的是虚拟商品还是实物商品 - String goodsType=cartVO.getSkuList().get(0).getGoodsSku().getGoodsType(); - if(goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name())){ + String goodsType = cartVO.getSkuList().get(0).getGoodsSku().getGoodsType(); + if (StrUtil.isEmpty(goodsType) || goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name())) { this.setOrderType(OrderTypeEnum.NORMAL.name()); - }else{ + } else { this.setOrderType(OrderTypeEnum.VIRTUAL.name()); } //填写订单的促销类型 @@ -276,7 +278,8 @@ public class Order extends BaseEntity { //判断是否为拼团订单,如果为拼团订单获取拼团ID,判断是否为主订单 if (tradeDTO.getCartTypeEnum().name().equals(PromotionTypeEnum.PINTUAN.name())) { - Optional pintuanId = cartVO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); + Optional pintuanId = cartVO.getSkuList().get(0).getPromotions().stream() + .filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); promotionId = pintuanId.get(); } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java index 9495fcdb..0628add5 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java @@ -91,6 +91,17 @@ public class StoreFlow { @ApiModelProperty(value = "流水类型:PAY/REFUND 支付/退款", allowableValues = "PAY,REFUND") private String flowType; + /** + * @see cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum + */ + @ApiModelProperty(value = "订单促销类型") + private String orderPromotionType; + + @ApiModelProperty(value = "积分活动商品结算价格") + private Double pointSettlementPrice; + + @ApiModelProperty(value = "砍价活动商品结算价格") + private Double kanjiaSettlementPrice; @ApiModelProperty(value = "平台优惠券 使用金额") private Double siteCouponPrice; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java index a74f2765..aa4ba665 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java @@ -81,6 +81,9 @@ public class PriceDetailDTO implements Serializable { @ApiModelProperty(value = "流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice - couponPrice + updatePrice") private Double flowPrice; + @ApiModelProperty(value = "结算价格 与 商家/供应商 结算价格(例如积分商品/砍价商品)") + private Double settlementPrice; + @ApiModelProperty(value = "最终结算金额 = flowPrice - platFormCommission - distributionCommission") private Double billPrice; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java index 8d38d8cd..76e43d36 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java @@ -8,6 +8,10 @@ package cn.lili.modules.order.order.entity.enums; */ public enum OrderPromotionTypeEnum { + /** + * 普通订单 + */ + NORMAL, /** * 赠品订单 */ @@ -19,6 +23,10 @@ public enum OrderPromotionTypeEnum { /** * 积分订单 */ - POINT + POINTS, + /** + * 砍价订单 + */ + KANJIA } diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java index f43b3534..ba0c29ea 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java @@ -7,6 +7,7 @@ import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; import cn.lili.modules.order.order.entity.dos.StoreFlow; import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; +import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.StoreFlowMapper; import cn.lili.modules.order.order.service.OrderItemService; @@ -25,7 +26,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -63,14 +63,13 @@ public class StoreFlowServiceImpl extends ServiceImpl sns = new ArrayList<>(); - sns.add(order.getSn()); - sns.add(order.getTradeSn()); - //如果查询到多条支付记录,打印日志 if (order.getPayStatus().equals(PayStatusEnum.PAID.name())) { log.error("订单[{}]检测到重复付款,请处理", orderSn); } + + //获取订单促销类型,如果为促销订单则获取促销商品并获取结算价 + String orderPromotionType = order.getOrderPromotionType(); //循环子订单记录流水 for (OrderItem item : orderItems) { StoreFlow storeFlow = new StoreFlow(); @@ -93,6 +92,18 @@ public class StoreFlowServiceImpl extends ServiceImpl lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(StoreFlow::getStoreId, storeId); - lambdaQueryWrapper.isNotNull(distribution,StoreFlow::getDistributionRebate); + lambdaQueryWrapper.isNotNull(distribution, StoreFlow::getDistributionRebate); lambdaQueryWrapper.between(StoreFlow::getCreateTime, startTime, endTime); - lambdaQueryWrapper.eq(StringUtils.isNotEmpty(type),StoreFlow::getFlowType, type); + lambdaQueryWrapper.eq(StringUtils.isNotEmpty(type), StoreFlow::getFlowType, type); return this.page(PageUtil.initPage(pageVO), lambdaQueryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java index e2189f9d..938cfc27 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java @@ -1 +1 @@ -package cn.lili.modules.order.order.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MqOrderTagsEnum; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @date 2020/11/17 7:39 下午 */ @Service @Transactional(rollbackFor = Exception.class) public class TradeServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //积分预处理 pointPretreatment(tradeDTO); //优惠券预处理 couponPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 积分预处理 * 下单同时,使用积分 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()).append(","); } if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { Member userInfo = memberService.getUserInfo(); if (userInfo.getPoint() < tradeDTO.getPriceDetailDTO().getPayPoint()) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO(). getPayPoint().longValue(), false, tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } } \ No newline at end of file +package cn.lili.modules.order.order.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MqOrderTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @date 2020/11/17 7:39 下午 */ @Service @Transactional(rollbackFor = Exception.class) public class TradeServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //优惠券预处理 couponPretreatment(tradeDTO); //积分预处理 pointPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } /** * 创建交易,积分处理 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { //需要支付积分 if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()); } boolean result = memberService.updateMemberPoint((0 - tradeDTO.getPriceDetailDTO().getPayPoint().longValue()), false, tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivity.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivity.java new file mode 100644 index 00000000..9c8ab06d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivity.java @@ -0,0 +1,60 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@Entity +@Table(name = "li_kanjia_activity") +@TableName("li_kanjia_activity") +@ApiModel(value = "砍价活动参与对象") +public class KanjiaActivity extends BaseEntity { + + + private static final long serialVersionUID = -1583030890805926292L; + + @ApiModelProperty(value = "砍价商品id") + private String kanjiaActivityGoodsId; + + @ApiModelProperty(value = "发起砍价活动会员id") + private String memberId; + + @ApiModelProperty(value = "发起砍价活动会员名称") + private String memberName; + + @ApiModelProperty(value = "剩余购买金额") + private Double surplusPrice; + + @ApiModelProperty(value = "砍价最低购买金额") + private Double purchasePrice; + + @ApiModelProperty(value = "砍价商品skuId") + private String skuId; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "缩略图") + private String thumbnail; + + /** + * @see KanJiaStatusEnum + */ + @ApiModelProperty(value = "砍价活动状态") + private String status; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityGoods.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityGoods.java new file mode 100644 index 00000000..5244441c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityGoods.java @@ -0,0 +1,60 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.modules.promotion.entity.dto.BasePromotion; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; + +/** + * 砍价活动商品实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@Entity +@Table(name = "li_kanjia_activity_goods") +@TableName("li_kanjia_activity_goods") +@ApiModel(value = "砍价活动商品对象") +public class KanjiaActivityGoods extends BasePromotion { + + private static final long serialVersionUID = 6694714877345423488L; + + @ApiModelProperty(value = "结算价格") + @NotEmpty(message = "结算价格不能为空") + private Double settlementPrice; + + @ApiModelProperty(value = "商品原价") + private Double originalPrice; + + @ApiModelProperty(value = "最低购买金额") + @NotEmpty(message = "最低购买金额不能为空") + private Double purchasePrice; + + @ApiModelProperty(value = "货品id") + @NotEmpty(message = "货品id不能为空") + private String skuId; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "缩略图") + private String thumbnail; + + @ApiModelProperty(value = "活动库存") + @NotEmpty(message = "活动库存不能为空") + private Integer stock; + + @ApiModelProperty(value = "每人最低砍价金额") + @NotEmpty(message = "每人最低砍价金额不能为空") + private Double lowestPrice; + + @ApiModelProperty(value = "每人最高砍价金额") + @NotEmpty(message = "每人最高砍价金额不能为空") + private Double highestPrice; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityLog.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityLog.java new file mode 100644 index 00000000..1b0e5157 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityLog.java @@ -0,0 +1,47 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 砍价活动商品实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@Entity +@Table(name = "li_kanjia_activity_log") +@TableName("li_kanjia_activity_log") +@ApiModel(value = "砍价活动日志对象") +public class KanjiaActivityLog extends BaseEntity { + + + private static final long serialVersionUID = 3977352717995562783L; + + @ApiModelProperty(value = "砍价活动参与记录id") + private String kanjiaActivityId; + + @ApiModelProperty(value = "砍价会员id") + private String kanjiaMemberId; + + @ApiModelProperty(value = "砍价会员名称") + private String kanjiaMemberName; + + @ApiModelProperty(value = "砍价会员头像") + private String kanjiaMemberFace; + + @ApiModelProperty(value = "砍价金额") + private Double kanjiaPrice; + + @ApiModelProperty(value = "剩余购买金额") + private Double surplusPrice; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java index 4f9a0731..716d9c3c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java @@ -53,8 +53,8 @@ public class GoodsSkuPromotionPriceDTO implements Serializable { @ApiModelProperty(value = "单个商品积分购买数量") private Double points; - @ApiModelProperty(value = "商品购买总数量 = 单个商品积分购买数量 * 数量") - private Double totalPoints; + @ApiModelProperty(value = "商品购买积分总数量 = 单个商品积分购买数量 * 数量") + private Long totalPoints; @ApiModelProperty(value = "单个优惠的所占总优惠金额比例") private Double discountPriceRate; @@ -102,8 +102,9 @@ public class GoodsSkuPromotionPriceDTO implements Serializable { this.setOriginalPrice(sku.getPrice()); this.setCouponPrice(0D); this.setPoints(0d); - this.setTotalPoints(0d); + this.setTotalPoints(0L); this.setFinalePrice(sku.getPrice()); this.setJoinPromotion(new ArrayList<>()); + } } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanJiaActivityLogQuery.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanJiaActivityLogQuery.java new file mode 100644 index 00000000..0639bc89 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanJiaActivityLogQuery.java @@ -0,0 +1,37 @@ +package cn.lili.modules.promotion.entity.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动参与记录查询对象") +public class KanJiaActivityLogQuery { + + + private static final long serialVersionUID = -1583030890805926292L; + + @ApiModelProperty(value = "砍价发起活动id") + private String kanJiaActivityId; + + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (CharSequenceUtil.isNotEmpty(kanJiaActivityId)) { + queryWrapper.like("kanjia_activity_id", kanJiaActivityId); + } + queryWrapper.eq("delete_flag", false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityDTO.java new file mode 100644 index 00000000..59e43b84 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityDTO.java @@ -0,0 +1,23 @@ +package cn.lili.modules.promotion.entity.dto; + + +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动参与记录对象") +public class KanjiaActivityDTO extends KanjiaActivityLog { + + @ApiModelProperty(value = "砍价商品Id") + private String kanjiaActivityGoodsId; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsDTO.java new file mode 100644 index 00000000..87e57d88 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsDTO.java @@ -0,0 +1,26 @@ +package cn.lili.modules.promotion.entity.dto; + + +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 砍价活动商品DTO + * + * @author qiuqiu + * @date 2020/8/21 + **/ +@Data +public class KanjiaActivityGoodsDTO extends KanjiaActivityGoods implements Serializable { + + + private static final long serialVersionUID = 1969340823809319805L; + + @ApiModelProperty(value = "商品规格详细信息") + private GoodsSku goodsSku; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsOperationDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsOperationDTO.java new file mode 100644 index 00000000..cfb987f3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsOperationDTO.java @@ -0,0 +1,38 @@ +package cn.lili.modules.promotion.entity.dto; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Min; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 砍价活动商品操作DTO + * + * @author qiuqiu + * @date 2020/8/21 + **/ +@Data +public class KanjiaActivityGoodsOperationDTO implements Serializable { + + + private static final long serialVersionUID = -1378599087650538592L; + + @Min(message = "活动开始时间不能为空", value = 0) + @ApiModelProperty(value = "活动开始时间", required = true) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Min(message = "活动结束时间不能为空", value = 0) + @ApiModelProperty(value = "活动结束时间", required = true) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @ApiModelProperty(value = "砍价活动商品列表") + List promotionGoodsList; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityQuery.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityQuery.java new file mode 100644 index 00000000..332a7d39 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityQuery.java @@ -0,0 +1,44 @@ +package cn.lili.modules.promotion.entity.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动参与记录查询对象") +public class KanjiaActivityQuery { + + + private static final long serialVersionUID = -1583030890805926292L; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "会员id", hidden = true) + private String memberId; + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (memberId != null) { + queryWrapper.eq("member_id", memberId); + } + queryWrapper.eq("delete_flag", false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java index d2033e5b..afb69a6c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java @@ -20,4 +20,10 @@ public class PromotionPriceParamDTO { @ApiModelProperty(value = "拼团id 如果是拼团购买 此值为拼团活动id,当pintuanId为空,则表示普通购买(或者拼团商品,单独购买)") private String pintuanId; + + @ApiModelProperty(value = "砍价ID") + private String kanjiaId; + + @ApiModelProperty(value = "积分ID") + private String pointsId; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/KanJiaStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/KanJiaStatusEnum.java new file mode 100644 index 00000000..54f7743e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/KanJiaStatusEnum.java @@ -0,0 +1,38 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 砍价活动状态状态枚举 + * + * @author Chopper + * @date 2020-03-19 3:53 下午 + */ +public enum KanJiaStatusEnum { + + /** + * 已开始 + */ + START("开始"), + /** + * 砍价失败 + */ + FAIL("失败"), + /** + * 砍价成功 + */ + SUCCESS("成功"), + /** + * 砍价活动结束 + * 已购买、超时未购买都是这个状态 + */ + END("已结束"); + + private final String description; + + KanJiaStatusEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsListVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsListVO.java new file mode 100644 index 00000000..5c7024e2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsListVO.java @@ -0,0 +1,30 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价商品视图对象 + * + * @author paulG + * @date 2021/1/13 + **/ +@Data +public class KanjiaActivityGoodsListVO { + + @ApiModelProperty(value = "砍价活动商品id") + private String id; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "缩略图") + private String thumbnail; + + @ApiModelProperty(value = "最低购买金额") + private Double purchasePrice; + + @ApiModelProperty(value = "活动库存") + private Integer stock; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsParams.java new file mode 100644 index 00000000..82900494 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsParams.java @@ -0,0 +1,93 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +import java.io.Serializable; +import java.util.Date; +import java.util.regex.Pattern; + +/** + * 砍价活动商品查询通用类 + * + * @author qiuqiu + * @date 2020/8/21 + **/ +@Data +public class KanjiaActivityGoodsParams implements Serializable { + + private static final long serialVersionUID = 1344104067705714289L; + + @ApiModelProperty(value = "活动商品") + private String goodsName; + + @ApiModelProperty(value = "活动开始时间") + private Long startTime; + + @ApiModelProperty(value = "活动结束时间") + private Long endTime; + + @ApiModelProperty(value = "skuId") + private String skuId; + + /** + * @see PromotionStatusEnum + */ + @ApiModelProperty(value = "活动状态") + private String promotionStatus; + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (promotionStatus != null) { + queryWrapper.eq("promotion_status", promotionStatus); + } + if (startTime != null) { + queryWrapper.ge("start_time", new Date(startTime)); + } + if (endTime != null) { + queryWrapper.le("end_time", new Date(endTime)); + } + queryWrapper.eq("delete_flag", false); + return queryWrapper; + } + + + public Query mongoQuery() { + Query query = new Query(); + if (CharSequenceUtil.isNotEmpty(goodsName)) { + Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE); + query.addCriteria(Criteria.where("goodsSku.goodsName").regex(pattern)); + } + if (CharSequenceUtil.isNotEmpty(promotionStatus)) { + query.addCriteria(Criteria.where("promotionStatus").is(promotionStatus)); + } + + if (CharSequenceUtil.isNotEmpty(skuId)) { + query.addCriteria(Criteria.where("skuId").is(skuId)); + } + if (startTime != null && endTime != null) { + Criteria fromTime = Criteria.where("startTime").gte(new Date(startTime)); + Criteria toTime = Criteria.where("endTime").lte(new Date(endTime)); + query.addCriteria(fromTime); + query.addCriteria(toTime); + } + query.addCriteria(Criteria.where("deleteFlag").is(false)); + Sort.Order order = new Sort.Order(Sort.Direction.DESC, "createTime"); + query.with(Sort.by(order)); + + return query; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsVO.java new file mode 100644 index 00000000..f5ae1f66 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsVO.java @@ -0,0 +1,25 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import cn.lili.modules.goods.entity.dos.GoodsSku; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价商品视图对象 + * + * @author paulG + * @date 2021/1/13 + **/ +@Data +public class KanjiaActivityGoodsVO { + + @ApiModelProperty(value = "商品规格详细信息") + private GoodsSku goodsSku; + + @ApiModelProperty(value = "最低购买金额") + private Double purchasePrice; + + @ApiModelProperty(value = "活动库存") + private Integer stock; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivitySearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivitySearchParams.java new file mode 100644 index 00000000..0b2bceb2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivitySearchParams.java @@ -0,0 +1,42 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价活动搜索参数 + * + * @author Bulbasaur + * @date: 2021/7/13 2:41 下午 + */ +@Data +public class KanjiaActivitySearchParams { + + @ApiModelProperty(value = "砍价活动ID") + private String id; + + @ApiModelProperty(value = "砍价商品SkuID") + private String kanjiaActivityGoodsId; + + @ApiModelProperty(value = "会员ID" ,hidden = true) + private String memberId; + + @ApiModelProperty(value = "状态") + private String status; + + @ApiModelProperty(value = "邀请活动ID,有值说明是被邀请人") + private String kanjiaActivityId; + + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StrUtil.isNotEmpty(id), "id", id); + queryWrapper.eq(StrUtil.isNotEmpty(kanjiaActivityId), "id", kanjiaActivityId); + queryWrapper.eq(StrUtil.isNotEmpty(kanjiaActivityGoodsId), "kanjia_activity_goods_id", kanjiaActivityGoodsId); + queryWrapper.eq(StrUtil.isNotEmpty(memberId), "member_id", memberId); + queryWrapper.eq(StrUtil.isNotEmpty(status), "status", status); + return queryWrapper; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityVO.java new file mode 100644 index 00000000..696dddb6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityVO.java @@ -0,0 +1,33 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动VO") +public class KanjiaActivityVO extends KanjiaActivity { + + @ApiModelProperty(value = "是否可以砍价") + private Boolean help; + + @ApiModelProperty(value = "是否已发起砍价") + private Boolean launch; + + @ApiModelProperty(value = "是否可购买") + private Boolean pass; + + public KanjiaActivityVO() { + this.setHelp(false); + this.setLaunch(false); + this.setPass(false); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityGoodsMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityGoodsMapper.java new file mode 100644 index 00000000..3baeb5f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityGoodsMapper.java @@ -0,0 +1,30 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * 砍价活动商品数据处理层 + * + * @author qiuqiu + * @date 2021/7/1 + */ +public interface KanJiaActivityGoodsMapper extends BaseMapper { + + /** + * 获取砍价商品VO分页 + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 砍价商品VO分页 + */ + @Select("SELECT * FROM li_kanjia_activity_goods ${ew.customSqlSegment}") + IPage kanjiaActivityGoodsVOPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityLogMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityLogMapper.java new file mode 100644 index 00000000..2a297688 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityLogMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * + * 砍价活动日志数据处理层 + * + * @author qiuqiu + * @date 2021/7/1 + */ +public interface KanJiaActivityLogMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityMapper.java new file mode 100644 index 00000000..237aa46a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * + * 砍价活动参与记录 数据处理层 + * + * @author qiuqiu + * @date 2021/7/1 + */ +public interface KanJiaActivityMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityGoodsService.java new file mode 100644 index 00000000..7ef066bd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityGoodsService.java @@ -0,0 +1,98 @@ +package cn.lili.modules.promotion.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + + +/** + * 砍价业务层 + * + * @author qiuqiu + * @date 2021/7/1 9:45 上午 + */ +public interface KanjiaActivityGoodsService extends IService { + + + /** + * 添加砍价活动商品 + * + * @param kanJiaActivityGoodsDTOS 砍价商品 + * @return 是否添加成功 + */ + Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsDTOS); + + /** + * 查询砍价活动商品分页信息 + * + * @param kanJiaActivityGoodsParams 砍价活动商品 + * @param pageVO 分页信息 + * @return 砍价商品 + */ + IPage getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO); + + /** + * 查询砍价活动商品分页信息 + * + * @param kanJiaActivityGoodsParams 砍价活动商品 + * @param pageVO 分页信息 + * @return 砍价商品 + */ + IPage kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO); + + /** + * 查询砍价活动商品 + * + * @param goodsId 砍价活动商品id + * @return 砍价活动商品信息 + */ + KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId); + + /** + * 根据SkuId获取正在进行中的砍价商品 + * @param skuId 商品规格Id + * @return 砍价商品 + */ + KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId); + + /** + * 查询砍价活动商品VO + * @param id 砍价活动商品ID + * @return 砍价活动商品 + */ + KanjiaActivityGoodsVO getKanJiaGoodsVO(String id); + + /** + * 修改看见商品信息 + * + * @param kanjiaActivityGoodsDTO 砍价商品信息 + * @return 是否修改成功 + */ + boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO); + + /** + * 删除砍价商品 + * + * @param ids 砍价商品ids + * @return 是否删除成功 + */ + boolean deleteKanJiaGoods(List ids); + + /** + * 根据skuID查询当前进行的砍价商品信息 + * + * @param skuId 商品skuId + * @return + */ + KanjiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityLogService.java b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityLogService.java new file mode 100644 index 00000000..12e591d8 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityLogService.java @@ -0,0 +1,36 @@ +package cn.lili.modules.promotion.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; +import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + + +/** + * 砍价活动日志业务层 + * + * @author qiuqiu + * @date 2021/7/1 9:45 上午 + */ +public interface KanjiaActivityLogService extends IService { + + /** + * 根据砍价参与记录id查询砍价记录 + * + * @param kanJiaActivityLogQuery 砍价活动帮砍信息 + * @param pageVO 分页信息 + * @return 砍价日志 + */ + IPage getForPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO pageVO); + + /** + * 砍一刀 + * + * @param kanJiaActivityDTO 砍价记录 + * @return + */ + KanjiaActivityLog addKanJiaActivityLog(KanjiaActivityDTO kanJiaActivityDTO); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityService.java b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityService.java new file mode 100644 index 00000000..e2a5e2e4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityService.java @@ -0,0 +1,67 @@ +package cn.lili.modules.promotion.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + + +/** + * 砍价活动参与记录业务层 + * + * @author qiuqiu + * @date 2021/7/1 9:45 上午 + */ +public interface KanjiaActivityService extends IService { + + /** + * 获取砍价活动 + * + * @param kanJiaActivitySearchParams 砍价活动搜索参数 + * @return 砍价活动 + */ + KanjiaActivity getKanjiaActivity(KanjiaActivitySearchParams kanJiaActivitySearchParams); + + /** + * 获取砍价活动 + *

+ * 有值说明是已参加的砍价活动 + * 没有值说明是未参加的砍价活动 + * + * @param kanJiaActivitySearchParams 砍价活动搜索参数 + * @return 砍价活动 + */ + KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams); + + /** + * 发起人发起砍价活动 + * + * @param id 活动ID + * @return + */ + KanjiaActivityLog add(String id); + + /** + * 帮砍 + * + * @param kanJiaActivityId 活动id + * @return 砍价详细 + */ + KanjiaActivityLog helpKanJia(String kanJiaActivityId); + + /** + * 根据条件查询我参与的砍价活动 + * + * @param kanJiaActivityQuery 砍价活动查询条件 + * @param page 分页对象 + * @return 我参与的砍价活动信息 + */ + IPage getForPage(KanjiaActivityQuery kanJiaActivityQuery, PageVO page); + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java index 5c8e26a7..faac3f07 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java @@ -59,12 +59,12 @@ public interface PointsGoodsService extends IService { PointsGoodsVO getPointsGoodsDetail(String id); /** - * 根据SkuID获取积分商品信息 + * 根据ID获取积分详情 * - * @param skuId 商品skuId + * @param skuId 商品SkuId * @return 积分详情 */ - PointsGoods getPointsGoodsDetailBySkuId(String skuId); + PointsGoodsVO getPointsGoodsVOByMongo(String skuId); /** * 根据条件查询积分商品 diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java index 2e49eb59..4d8e56f7 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java @@ -1,5 +1,6 @@ package cn.lili.modules.promotion.service; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dto.PromotionPriceDTO; import cn.lili.modules.promotion.entity.dto.PromotionPriceParamDTO; @@ -19,8 +20,9 @@ public interface PromotionPriceService { * * @param tradeSkuList 促销计算参数 * @param memberCouponList 使用的优惠券 + * @param cartTypeEnum 购物车类型 * @return 促销计算结果 */ - PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList); + PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList, CartTypeEnum cartTypeEnum); } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java new file mode 100644 index 00000000..cee8334e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java @@ -0,0 +1,336 @@ +package cn.lili.modules.promotion.serviceimpl; + + +import cn.hutool.core.util.StrUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.utils.DateUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO; +import cn.lili.modules.promotion.mapper.KanJiaActivityGoodsMapper; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.trigger.enums.DelayTypeEnums; +import cn.lili.trigger.interfaces.TimeTrigger; +import cn.lili.trigger.message.PromotionMessage; +import cn.lili.trigger.model.TimeExecuteConstant; +import cn.lili.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.util.DelayQueueTools; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 砍价业务层实现 + * + * @author qiuqiu + * @date 2021/7/1 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class KanjiaActivityGoodsServiceImpl extends ServiceImpl implements KanjiaActivityGoodsService { + + //规格商品 + @Autowired + private GoodsSkuService goodsSkuService; + + //Rocketmq + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + //延时任务 + @Autowired + private TimeTrigger timeTrigger; + + //Mongo + @Autowired + private MongoTemplate mongoTemplate; + + + @Override + public Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) { + List kanjiaActivityGoodsList = new ArrayList<>(); + for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) { + //根据skuId查询商品信息 + GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId()); + //参数检测 + this.checkParam(kanJiaActivityGoodsDTO, goodsSku); + //检测同一时间段是否存在相同的商品 + PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime().getTime(), kanJiaActivityGoodsOperationDTO.getEndTime().getTime()); + kanJiaActivityGoodsDTO.setStartTime(kanJiaActivityGoodsOperationDTO.getStartTime()); + kanJiaActivityGoodsDTO.setEndTime(kanJiaActivityGoodsOperationDTO.getEndTime()); + //检测同一时间段不能允许添加相同的商品 + if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) { + throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!"); + } + kanJiaActivityGoodsDTO.setGoodsSku(goodsSku); + kanJiaActivityGoodsDTO.setSkuId(kanJiaActivityGoodsDTO.getSkuId()); + kanJiaActivityGoodsDTO.setThumbnail(goodsSku.getThumbnail()); + kanJiaActivityGoodsDTO.setGoodsName(goodsSku.getGoodsName()); + kanJiaActivityGoodsDTO.setPromotionStatus(PromotionStatusEnum.NEW.name()); + kanJiaActivityGoodsDTO.setOriginalPrice(kanJiaActivityGoodsDTO.getGoodsSku().getPrice()); + kanjiaActivityGoodsList.add(kanJiaActivityGoodsDTO); + } + Boolean result = this.saveBatch(kanjiaActivityGoodsList); + if (result) { + //发送砍价延迟任务消息 + for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) { + this.mongoTemplate.save(kanJiaActivityGoodsDTO); + this.addKanJiaGoodsPromotionTask(kanJiaActivityGoodsDTO); + } + } + return result; + } + + + /** + * 添加砍价商品mq任务 + * + * @param kanJiaActivityGoods 砍价商品信息 + */ + private void addKanJiaGoodsPromotionTask(KanjiaActivityGoodsDTO kanJiaActivityGoods) { + PromotionMessage promotionMessage = new PromotionMessage(kanJiaActivityGoods.getId(), PromotionTypeEnum.KANJIA.name(), + PromotionStatusEnum.START.name(), + kanJiaActivityGoods.getStartTime(), kanJiaActivityGoods.getEndTime()); + TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, + promotionMessage.getStartTime().getTime(), + promotionMessage, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + rocketmqCustomProperties.getPromotionTopic()); + //发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + } + + @Override + public IPage getForPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) { + IPage kanJiaActivityGoodsDTOIPage = new Page<>(); + Query query = kanJiaActivityGoodsParams.mongoQuery(); + if (pageVO != null) { + PromotionTools.mongoQueryPageParam(query, pageVO); + kanJiaActivityGoodsDTOIPage.setSize(pageVO.getPageSize()); + kanJiaActivityGoodsDTOIPage.setCurrent(pageVO.getPageNumber()); + } + List kanJiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class); + kanJiaActivityGoodsDTOIPage.setRecords(kanJiaActivityGoodsDTOS); + kanJiaActivityGoodsDTOIPage.setTotal(this.mongoTemplate.count(kanJiaActivityGoodsParams.mongoQuery(), KanjiaActivityGoodsDTO.class)); + return kanJiaActivityGoodsDTOIPage; + + } + + @Override + public IPage kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO pageVO) { + return this.baseMapper.kanjiaActivityGoodsVOPage(PageUtil.initPage(pageVO),kanjiaActivityGoodsParams.wrapper()); + } + + + /** + * 检查商品Sku是否存 + * + * @param skuId skuId + * @return 商品sku + */ + private GoodsSku checkSkuExist(String skuId) { + GoodsSku goodsSku = this.goodsSkuService.getGoodsSkuByIdFromCache(skuId); + if (goodsSku == null) { + log.error("商品ID为" + skuId + "的商品不存在!"); + throw new ServiceException(); + } + return goodsSku; + } + + /** + * 检查参与砍价商品参数 + * + * @param kanJiaActivityGoodsDTO 砍价商品信息 + * @param goodsSku 商品sku信息 + */ + private void checkParam(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO, GoodsSku goodsSku) { + //校验商品是否存在 + if (goodsSku == null) { + throw new ServiceException(ResultCode.PROMOTION_GOODS_NOT_EXIT); + } + //校验商品状态 + if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) { + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); + } + //校验活动库存是否超出此sku的库存 + if (goodsSku.getQuantity() < kanJiaActivityGoodsDTO.getStock()) { + throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR); + } + //校验最低购买金额不能高于商品金额 + if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getPurchasePrice()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_PRICE_ERROR); + } + //校验结算价格不能超过商品金额 + if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getSettlementPrice()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR); + } + //校验最高砍价金额 + if (kanJiaActivityGoodsDTO.getHighestPrice() > goodsSku.getPrice() || kanJiaActivityGoodsDTO.getHighestPrice() <= 0) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR); + } + //校验最低砍价金额 + if (kanJiaActivityGoodsDTO.getLowestPrice() > goodsSku.getPrice() || kanJiaActivityGoodsDTO.getLowestPrice() <= 0) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR); + } + //校验最低砍价金额不能高与最低砍价金额 + if (kanJiaActivityGoodsDTO.getLowestPrice() > kanJiaActivityGoodsDTO.getHighestPrice()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR); + } + } + + /** + * 检查砍价商品是否重复存在 + * + * @param skuId 商品SkuId + * @param kanJiaActivityGoodsDTO 砍价商品 + * @return 积分商品信息 + */ + private KanjiaActivityGoods checkSkuDuplicate(String skuId, KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KanjiaActivityGoods::getSkuId, skuId); + if (kanJiaActivityGoodsDTO != null && StrUtil.isNotEmpty(kanJiaActivityGoodsDTO.getId())) { + queryWrapper.ne(KanjiaActivityGoods::getId, kanJiaActivityGoodsDTO.getId()); + } + queryWrapper.ne(KanjiaActivityGoods::getPromotionStatus, PromotionStatusEnum.END.name()); + + queryWrapper.ge(KanjiaActivityGoods::getStartTime, kanJiaActivityGoodsDTO.getStartTime()); + + queryWrapper.le(KanjiaActivityGoods::getEndTime, kanJiaActivityGoodsDTO.getEndTime()); + + return this.getOne(queryWrapper); + + } + + @Override + public KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId) { + KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(goodsId, KanjiaActivityGoodsDTO.class); + if (kanJiaActivityGoodsDTO == null) { + log.error("id为" + goodsId + "的砍价商品不存在!"); + throw new ServiceException(); + } + return kanJiaActivityGoodsDTO; + } + + @Override + public KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId) { + + Query query = new Query(); + query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); + query.addCriteria(Criteria.where("skuId").is(skuId)); + List kanjiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class); + return kanjiaActivityGoodsDTOS.get(0); + } + + @Override + public KanjiaActivityGoodsVO getKanJiaGoodsVO(String id) { + + KanjiaActivityGoodsVO kanJiaActivityGoodsVO = new KanjiaActivityGoodsVO(); + //获取砍价商品 + KanjiaActivityGoods kanJiaActivityGoods=this.getById(id); + //获取商品SKU + GoodsSku goodsSku = this.goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId()); + //填写活动商品价格、剩余数量 + kanJiaActivityGoodsVO.setGoodsSku(goodsSku); + kanJiaActivityGoodsVO.setStock(kanJiaActivityGoods.getStock()); + kanJiaActivityGoodsVO.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice()); + //返回商品数据 + return kanJiaActivityGoodsVO; + + } + + @Override + public boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { + //校验砍价商品是否存在 + KanjiaActivityGoodsDTO dbKanJiaActivityGoods = this.getKanjiaGoodsDetail(kanJiaActivityGoodsDTO.getId()); + //校验当前活动是否已经开始,只有新建的未开始的活动可以编辑 + if (!dbKanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) { + throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR); + } + //获取当前sku信息 + GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId()); + //校验商品状态 + if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) { + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); + } + //常规校验砍价商品参数 + this.checkParam(kanJiaActivityGoodsDTO, goodsSku); + //检测开始结束时间是否正确 + PromotionTools.checkPromotionTime(kanJiaActivityGoodsDTO.getStartTime().getTime(), kanJiaActivityGoodsDTO.getEndTime().getTime()); + //检测同一时间段不能允许添加相同的商品 + if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) { + throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!"); + } + //修改数据库 + boolean result = this.updateById(kanJiaActivityGoodsDTO); + //如果校验成功则发送修改延迟任务消息 + if (result) { + this.mongoTemplate.save(kanJiaActivityGoodsDTO); + if (dbKanJiaActivityGoods.getStartTime().getTime() != kanJiaActivityGoodsDTO.getStartTime().getTime()) { + PromotionMessage promotionMessage = new PromotionMessage(kanJiaActivityGoodsDTO.getId(), PromotionTypeEnum.KANJIA.name(), PromotionStatusEnum.START.name(), kanJiaActivityGoodsDTO.getStartTime(), kanJiaActivityGoodsDTO.getEndTime()); + //更新延时任务 + this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, + promotionMessage, + kanJiaActivityGoodsDTO.getStartTime().getTime(), + kanJiaActivityGoodsDTO.getStartTime().getTime(), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DateUtil.getDelayTime(kanJiaActivityGoodsDTO.getStartTime().getTime()), + rocketmqCustomProperties.getPromotionTopic()); + } + } + return result; + } + + @Override + public boolean deleteKanJiaGoods(List ids) { + List skuIds = new ArrayList<>(); + for (String id : ids) { + KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.getKanjiaGoodsDetail(id); + this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, + kanJiaActivityGoodsDTO.getStartTime().getTime(), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.KANJIA.name() + kanJiaActivityGoodsDTO.getId())), + rocketmqCustomProperties.getPromotionTopic()); + skuIds.add(kanJiaActivityGoodsDTO.getSkuId()); + } + boolean result = this.removeByIds(ids); + if (result) { + Query query = new Query(); + query.addCriteria(new Criteria("id").in(ids)); + this.mongoTemplate.remove(query, KanjiaActivityGoodsDTO.class); + } + return result; + } + + + @Override + public KanjiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId) { + //mongo查询条件 + Query query = new Query(); + query.addCriteria(Criteria.where("skuId").is(skuId)) + .addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); + List kanjiaActivityGoodsDTOList=this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class); + return kanjiaActivityGoodsDTOList.get(0); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityLogServiceImpl.java new file mode 100644 index 00000000..cda873f1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityLogServiceImpl.java @@ -0,0 +1,82 @@ +package cn.lili.modules.promotion.serviceimpl; + + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.mapper.KanJiaActivityLogMapper; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityLogService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +/** + * 砍价活动日志业务层实现 + * + * @author qiuqiu + * @date 2021/7/1 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class KanjiaActivityLogServiceImpl extends ServiceImpl implements KanjiaActivityLogService { + + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; + + @Autowired + private KanjiaActivityService kanJiaActivityService; + + @Override + public IPage getForPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO pageVO) { + QueryWrapper queryWrapper = kanJiaActivityLogQuery.wrapper(); + return this.page(PageUtil.initPage(pageVO), queryWrapper); + } + + + @Override + public KanjiaActivityLog addKanJiaActivityLog(KanjiaActivityDTO kanjiaActivityDTO) { + //校验当前会员是否已经参与过此次砍价 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(kanjiaActivityDTO.getKanjiaActivityId() != null, KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityDTO.getKanjiaActivityId()); + queryWrapper.eq( KanjiaActivityLog::getKanjiaMemberId, UserContext.getCurrentUser().getId()); + Integer count = this.baseMapper.selectCount(queryWrapper); + if (count > 0) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_LOG_MEMBER_ERROR); + } + //校验当前砍价商品是否有效 + KanjiaActivityGoods kanjiaActivityGoods = kanJiaActivityGoodsService.getById(kanjiaActivityDTO.getKanjiaActivityGoodsId()); + //如果当前活动不为空且还在活动时间内 才可以参与砍价活动 + if (kanjiaActivityGoods != null && kanjiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { + //获取砍价参与者记录 + KanjiaActivity kanjiaActivity = kanJiaActivityService.getById(kanjiaActivityDTO.getKanjiaActivityId()); + if (kanjiaActivity != null) { + KanjiaActivityLog kanJiaActivityLog = new KanjiaActivityLog(); + kanJiaActivityLog.setKanjiaActivityId(kanjiaActivity.getId()); + BeanUtil.copyProperties(kanjiaActivityDTO, kanJiaActivityLog); + boolean result = this.save(kanJiaActivityLog); + if (result) { + return kanJiaActivityLog; + } + } + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_FOUND_ERROR); + } + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityServiceImpl.java new file mode 100644 index 00000000..8a74fd8d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityServiceImpl.java @@ -0,0 +1,221 @@ +package cn.lili.modules.promotion.serviceimpl; + + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.RandomUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery; +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import cn.lili.modules.promotion.mapper.KanJiaActivityMapper; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityLogService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; + + +/** + * 砍价活动参与记录业务层实现 + * + * @author qiuqiu + * @date 2021/7/1 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class KanjiaActivityServiceImpl extends ServiceImpl implements KanjiaActivityService { + + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + @Autowired + private KanjiaActivityLogService kanjiaActivityLogService; + @Autowired + private MemberService memberService; + @Autowired + private GoodsSkuService goodsSkuService; + + @Override + public KanjiaActivity getKanjiaActivity(KanjiaActivitySearchParams kanJiaActivitySearchParams) { + return this.getOne(kanJiaActivitySearchParams.wrapper()); + } + + @Override + public KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams) { + KanjiaActivity kanjiaActivity = this.getKanjiaActivity(kanJiaActivitySearchParams); + KanjiaActivityVO kanjiaActivityVO = new KanjiaActivityVO(); + //判断是否参与活动 + if (kanjiaActivity == null) { + return kanjiaActivityVO; + } + BeanUtil.copyProperties(kanjiaActivity, kanjiaActivityVO); + + //判断是否发起了砍价活动,如果发起可参与活动 + if (kanjiaActivity != null) { + kanjiaActivityVO.setLaunch(true); + //如果已发起砍价判断用户是否可以砍价 + KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.getOne(new LambdaQueryWrapper() + .eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivity.getId()) + .eq(KanjiaActivityLog::getKanjiaMemberId, UserContext.getCurrentUser().getId())); + if (kanjiaActivityLog == null) { + kanjiaActivityVO.setHelp(true); + } + //判断活动已通过并且是当前用户发起的砍价则可以进行购买 + if (kanjiaActivity.getStatus().equals(KanJiaStatusEnum.SUCCESS.name()) && + kanjiaActivity.getMemberId().equals(UserContext.getCurrentUser().getId())) { + kanjiaActivityVO.setPass(true); + } + } + return kanjiaActivityVO; + } + + @Override + public KanjiaActivityLog add(String id) { + //根据skuId查询当前sku是否参与活动并且是在活动进行中 + KanjiaActivityGoods kanJiaActivityGoods = kanjiaActivityGoodsService.getById(id); + //只有砍价商品存在且已经开始的活动才可以发起砍价 + if (kanJiaActivityGoods == null || !kanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + } + KanjiaActivityLog kanjiaActivityLog = new KanjiaActivityLog(); + //获取会员信息 + Member member = memberService.getById(UserContext.getCurrentUser().getId()); + //校验此活动是否已经发起过 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("kanjia_activity_goods_id", kanJiaActivityGoods.getId()); + queryWrapper.eq("member_id", member.getId()); + if (this.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_MEMBER_ERROR); + } + KanjiaActivity kanJiaActivity = new KanjiaActivity(); + //获取商品信息 + GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId()); + if (goodsSku != null && member != null) { + kanJiaActivity.setSkuId(kanJiaActivityGoods.getSkuId()); + kanJiaActivity.setGoodsName(goodsSku.getGoodsName()); + kanJiaActivity.setKanjiaActivityGoodsId(kanJiaActivityGoods.getId()); + kanJiaActivity.setThumbnail(goodsSku.getThumbnail()); + kanJiaActivity.setMemberId(UserContext.getCurrentUser().getId()); + kanJiaActivity.setMemberName(member.getUsername()); + kanJiaActivity.setStatus(KanJiaStatusEnum.START.name()); + //剩余砍价金额 开始 是商品金额; + kanJiaActivity.setSurplusPrice(goodsSku.getPrice()); + //砍价最低购买金额 + kanJiaActivity.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice()); + //保存我的砍价活动 + boolean result = this.save(kanJiaActivity); + + //因为发起砍价就是自己给自己砍一刀,所以要添加砍价记录信息 + if (result) { + kanjiaActivityLog = this.helpKanJia(kanJiaActivity.getId()); + } + } + return kanjiaActivityLog; + } + + + @Override + public KanjiaActivityLog helpKanJia(String kanjiaActivityId) { + //获取会员信息 + Member member = memberService.getById(UserContext.getCurrentUser().getId()); + //根据砍价发起活动id查询砍价活动信息 + KanjiaActivity kanjiaActivity = this.getById(kanjiaActivityId); + //判断活动非空或非正在进行中的活动 + if (kanjiaActivity == null || !kanjiaActivity.getStatus().equals(PromotionStatusEnum.START.name())) { + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + } else if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + //根据skuId查询当前sku是否参与活动并且是在活动进行中 + KanjiaActivityGoods kanJiaActivityGoods = kanjiaActivityGoodsService.getById(kanjiaActivity.getKanjiaActivityGoodsId()); + if (kanJiaActivityGoods == null) { + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + } + //判断是否已参与 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityId) + .eq(KanjiaActivityLog::getKanjiaMemberId, member.getId()); + if (kanjiaActivityLogService.count(lambdaQueryWrapper) > 0) { + throw new ServiceException(ResultCode.PROMOTION_LOG_EXIST); + } + + //添加砍价记录 + KanjiaActivityDTO kanjiaActivityDTO = new KanjiaActivityDTO(); + kanjiaActivityDTO.setKanjiaActivityGoodsId(kanjiaActivity.getKanjiaActivityGoodsId()); + kanjiaActivityDTO.setKanjiaActivityId(kanjiaActivityId); + //获取砍价金额 + Double price = this.getKanjiaPrice(kanJiaActivityGoods, kanjiaActivity.getSurplusPrice()); + kanjiaActivityDTO.setKanjiaPrice(price); + //计算剩余金额 + kanjiaActivityDTO.setSurplusPrice(CurrencyUtil.sub(kanjiaActivity.getSurplusPrice(), price)); + kanjiaActivityDTO.setKanjiaMemberId(member.getId()); + kanjiaActivityDTO.setKanjiaMemberName(member.getUsername()); + kanjiaActivityDTO.setKanjiaMemberFace(member.getFace()); + KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.addKanJiaActivityLog(kanjiaActivityDTO); + + //如果可砍金额为0的话说明活动成功了 + if (Double.doubleToLongBits(kanjiaActivityDTO.getSurplusPrice()) == Double.doubleToLongBits(0D)) { + kanjiaActivity.setStatus(KanJiaStatusEnum.SUCCESS.name()); + } + kanjiaActivity.setSurplusPrice(kanjiaActivityLog.getSurplusPrice()); + this.updateById(kanjiaActivity); + return kanjiaActivityLog; + } + + + /** + * 随机获取砍一刀价格 + * + * @param kanjiaActivityGoods 砍价商品信息 + * @param surplusPrice 剩余可砍金额 + * @return + */ + private Double getKanjiaPrice(KanjiaActivityGoods kanjiaActivityGoods, Double surplusPrice) { + + //如果剩余砍价金额小于最低砍价金额则返回0 + if (kanjiaActivityGoods.getLowestPrice() > surplusPrice) { + return surplusPrice; + } + + //如果金额相等则直接返回 + if (kanjiaActivityGoods.getLowestPrice().equals(kanjiaActivityGoods.getHighestPrice())) { + return kanjiaActivityGoods.getLowestPrice(); + } + //获取随机砍价金额 + BigDecimal bigDecimal = RandomUtil.randomBigDecimal(Convert.toBigDecimal(kanjiaActivityGoods.getLowestPrice()), + Convert.toBigDecimal(kanjiaActivityGoods.getHighestPrice())); + bigDecimal.setScale(2, BigDecimal.ROUND_UP); + return Convert.toDouble(bigDecimal, 0.0); + + } + + + @Override + public IPage getForPage(KanjiaActivityQuery kanjiaActivityQuery, PageVO page) { + QueryWrapper queryWrapper = kanjiaActivityQuery.wrapper(); + return this.page(PageUtil.initPage(page), queryWrapper); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java index f0b28ef5..cf6f15e1 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java @@ -203,20 +203,14 @@ public class PointsGoodsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PointsGoods::getSkuId, skuId).eq(PointsGoods::getPromotionStatus, PromotionStatusEnum.START.name()); - List list = this.list(queryWrapper); - if (list.size() == 1) { - return list.get(0); - } - return null; + public PointsGoodsVO getPointsGoodsVOByMongo(String skuId) { + //mongo查询条件 + Query query = new Query(); + query.addCriteria(Criteria.where("skuId").is(skuId)) + .addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); + List pointsGoodsVO=this.mongoTemplate.find(query, PointsGoodsVO.class); + return pointsGoodsVO.get(0); } /** diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java index 48ef7ef3..85e70b25 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java @@ -2,11 +2,11 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.DateUtil; -import cn.lili.mybatis.util.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.distribution.entity.dos.DistributionGoods; import cn.lili.modules.distribution.service.DistributionGoodsService; @@ -24,7 +24,6 @@ import cn.lili.modules.promotion.entity.dto.BasePromotion; import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillVO; @@ -32,6 +31,7 @@ import cn.lili.modules.promotion.mapper.PromotionGoodsMapper; import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.SeckillApplyService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -123,10 +123,14 @@ public class PromotionGoodsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PromotionGoods::getSkuId, cartSkuVO.getGoodsSku().getId()).eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()); - queryWrapper.le(PromotionGoods::getStartTime, date); + queryWrapper.eq(PromotionGoods::getSkuId, cartSkuVO.getGoodsSku().getId()) + .eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()) + .le(PromotionGoods::getStartTime, date); //获取有效的促销活动 List promotionGoods = this.list(queryWrapper); //同步查询缓存中的促销活动商品的库存 @@ -168,7 +173,7 @@ public class PromotionGoodsServiceImpl extends ServiceImpl couponVOS = mongoTemplate.find(query, CouponVO.class); for (CouponVO couponVO : couponVOS) { boolean aLLScopeType = (couponVO.getPromotionGoodsList() == null diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java index 6df379d7..b8a03a5e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java @@ -1,16 +1,17 @@ package cn.lili.modules.promotion.serviceimpl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.promotion.entity.dos.*; import cn.lili.modules.promotion.entity.dto.*; import cn.lili.modules.promotion.entity.enums.*; -import cn.lili.modules.promotion.service.PromotionGoodsService; -import cn.lili.modules.promotion.service.PromotionPriceService; -import cn.lili.modules.promotion.service.SeckillApplyService; +import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; +import cn.lili.modules.promotion.service.*; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsSearchService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -51,46 +52,114 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { */ @Autowired private GoodsSkuService goodsSkuService; + /** + * 积分商品 + */ + @Autowired + private PointsGoodsService pointsGoodsService; + /** + * 积分商品 + */ + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + @Override - public PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList) { - PromotionPriceDTO promotionPrice = new PromotionPriceDTO(); - if (!tradeSkuList.isEmpty()) { - //拆分出SkuId列表 - List skuIds = tradeSkuList.parallelStream().map(PromotionPriceParamDTO::getSkuId).collect(Collectors.toList()); - //参与计算的ES商品SKU及其促销信息列表 - List esGoodsSkus = goodsSearchService.getEsGoodsBySkuIds(skuIds); + public PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList, CartTypeEnum cartTypeEnum) { + + List priceDTOList = new ArrayList<>(); + + //拆分出SkuId列表 + List skuIds = tradeSkuList.parallelStream().map(PromotionPriceParamDTO::getSkuId).collect(Collectors.toList()); + //参与计算的ES商品SKU及其促销信息列表 + List esGoodsSkus = goodsSearchService.getEsGoodsBySkuIds(skuIds); + + //判断交易类型,进行不同的处理 + if (cartTypeEnum.equals(CartTypeEnum.POINTS)) { + priceDTOList = this.pointGoodsPromotion(tradeSkuList); + } else if (cartTypeEnum.equals(CartTypeEnum.KANJIA)) { + priceDTOList = this.kanjiaPromotion(tradeSkuList); + } else { //参与计算的缓存中的商品SKU列表 List goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds); - //计算价格 - promotionPrice = this.calculationPromotionPrice(tradeSkuList, memberCouponList, esGoodsSkus, goodsSkus); + + //单品商品SKU促销计算结果列表 + priceDTOList = this.packageGoodsSkuPromotionPrice(tradeSkuList, esGoodsSkus, goodsSkus); } + + + //获取商品促销价格DTO列表 + List storePromotionPriceList = new ArrayList<>(); + + //计算优惠券金额 + Double couponTotalPrice = 0.0; + //将使用的优惠券根据店铺分类 + Map> couponCollect = memberCouponList.parallelStream().collect(Collectors.groupingBy(MemberCoupon::getStoreId)); + //获取店铺优惠券金额 + this.getStorePromotionPrice(storePromotionPriceList, priceDTOList, esGoodsSkus, couponCollect, couponTotalPrice); + //获取平台优惠金额 + this.getPlatformPromotionPrice(couponCollect, storePromotionPriceList, priceDTOList, couponTotalPrice); + + //计算最终结算金额返回数据 + return this.getPromotionPriceDTO(storePromotionPriceList, couponTotalPrice); + } + + /** + * 获取促销金额DTO + * + * @param storePromotionPriceList 店铺促销列表 + * @param couponTotalPrice 优惠券优惠金额 + * @return 促销金额DTO + */ + private PromotionPriceDTO getPromotionPriceDTO(List storePromotionPriceList, Double couponTotalPrice) { + + PromotionPriceDTO promotionPrice = new PromotionPriceDTO(); + promotionPrice.setStorePromotionPriceList(storePromotionPriceList); + promotionPrice.setTotalCouponPrice(couponTotalPrice); + promotionPrice.setTotalOriginPrice(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalOriginPrice).sum()); + promotionPrice.setTotalPoints(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalPoints).sum()); + promotionPrice.setTotalDiscountPrice(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalDiscountPrice).sum()); + //最终结算金额 = 商品原价格合计 - 总优惠价格合计 - 优惠券合计 + double totalFinalePrice = CurrencyUtil.sub(CurrencyUtil.sub(promotionPrice.getTotalOriginPrice(), promotionPrice.getTotalDiscountPrice()), promotionPrice.getTotalCouponPrice()); + promotionPrice.setTotalFinalePrice(totalFinalePrice); + return promotionPrice; } /** - * 促销计算 + * 获取平台优惠券促销金额 * - * @param tradeSkuList 促销计算参数列表 - * @param memberCouponList 参与促销计算的优惠券列表 - * @param esGoodsSkus 参与计算的ES商品SKU及其促销信息列表 - * @param goodsSkus 参与计算的缓存中的商品SKU列表 - * @return 促销计算结果 + * @param couponCollect 优惠券列表 + * @param storePromotionPriceList 店铺促销列表 + * @param priceDTOList 商品促销DTO列表 + * @param couponTotalPrice 优惠券金额合计 */ - private PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList, List esGoodsSkus, List goodsSkus) { - PromotionPriceDTO promotionPrice = new PromotionPriceDTO(); - - //单品商品SKU促销计算结果列表 - List priceDTOList = this.packageGoodsSkuPromotionPrice(tradeSkuList, esGoodsSkus, goodsSkus); - - //将使用的优惠券根据店铺分类 - Map> couponCollect = memberCouponList.parallelStream().collect(Collectors.groupingBy(MemberCoupon::getStoreId)); - - double couponTotalPrice = 0; + private void getPlatformPromotionPrice(Map> couponCollect, List storePromotionPriceList, List priceDTOList, Double couponTotalPrice) { + //获取平台优惠券 + List platformCoupons = couponCollect.get("platform"); + if (platformCoupons != null && !platformCoupons.isEmpty()) { + //计算平台优惠券活动 + couponTotalPrice = CurrencyUtil.add(couponTotalPrice, this.calculationCoupon(platformCoupons, priceDTOList)); + for (StorePromotionPriceDTO storePromotionPriceDTO : storePromotionPriceList) { + Double couponPrice = storePromotionPriceDTO.getGoodsSkuPromotionPriceList().parallelStream().mapToDouble(GoodsSkuPromotionPriceDTO::getCouponPrice).sum(); + storePromotionPriceDTO.setTotalCouponPrice(couponPrice); + } + } + } + /** + * 获取店铺优惠券促销金额 + * + * @param storePromotionPriceList 店铺促销金额列表 + * @param priceDTOList 商品促销金额DTO列表 + * @param esGoodsSkus 商品索引SKU + * @param couponCollect 会员优惠券列表 + * @param couponTotalPrice 优惠券金额合计 + */ + private void getStorePromotionPrice(List storePromotionPriceList, List priceDTOList, + List esGoodsSkus, Map> couponCollect, Double couponTotalPrice) { //根据卖家分组商品信息 Map> storeCollect = priceDTOList.parallelStream().collect(Collectors.groupingBy(GoodsSkuPromotionPriceDTO::getStoreId)); - List storePromotionPriceList = new ArrayList<>(); for (Map.Entry> entry : storeCollect.entrySet()) { StorePromotionPriceDTO storePromotionPrice = new StorePromotionPriceDTO(); storePromotionPrice.setStoreId(entry.getKey()); @@ -130,28 +199,8 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { storePromotionPriceList.add(storePromotionPrice); } - //获取平台优惠券 - List platformCoupons = couponCollect.get("platform"); - if (platformCoupons != null && !platformCoupons.isEmpty()) { - //计算平台优惠券活动 - couponTotalPrice = CurrencyUtil.add(couponTotalPrice, this.calculationCoupon(platformCoupons, priceDTOList)); - for (StorePromotionPriceDTO storePromotionPriceDTO : storePromotionPriceList) { - Double couponPrice = storePromotionPriceDTO.getGoodsSkuPromotionPriceList().parallelStream().mapToDouble(GoodsSkuPromotionPriceDTO::getCouponPrice).sum(); - storePromotionPriceDTO.setTotalCouponPrice(couponPrice); - } - } - promotionPrice.setStorePromotionPriceList(storePromotionPriceList); - promotionPrice.setTotalCouponPrice(couponTotalPrice); - promotionPrice.setTotalOriginPrice(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalOriginPrice).sum()); - promotionPrice.setTotalPoints(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalPoints).sum()); - promotionPrice.setTotalDiscountPrice(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalDiscountPrice).sum()); - //最终结算金额 = 商品原价格合计 - 总优惠价格合计 - 优惠券合计 - double totalFinalePrice = CurrencyUtil.sub(CurrencyUtil.sub(promotionPrice.getTotalOriginPrice(), promotionPrice.getTotalDiscountPrice()), promotionPrice.getTotalCouponPrice()); - promotionPrice.setTotalFinalePrice(totalFinalePrice); - return promotionPrice; } - /** * 单品SKU的促销计算 * @@ -167,19 +216,16 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { if (!collect.isEmpty()) { EsGoodsIndex esGoodsIndex = collect.get(0); //找出当前商品相应的结算参数 - PromotionPriceParamDTO tradeSku = tradeSkuList.parallelStream().filter(i -> i.getSkuId().equals(skus.getId())).findFirst().orElse(new PromotionPriceParamDTO()); - GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice = new GoodsSkuPromotionPriceDTO(skus, tradeSku.getNum()); + PromotionPriceParamDTO promotionPriceParamDTO = tradeSkuList.parallelStream().filter(i -> i.getSkuId().equals(skus.getId())).findFirst().orElse(new PromotionPriceParamDTO()); + GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice = new GoodsSkuPromotionPriceDTO(skus, promotionPriceParamDTO.getNum()); //商品原价总价 = 商品原价 * 数量 - goodsSkuPromotionPrice.setTotalOriginalPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), tradeSku.getNum())); + goodsSkuPromotionPrice.setTotalOriginalPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), promotionPriceParamDTO.getNum())); //获取当前商品所有参加的促销活动 Map promotionMap = esGoodsIndex.getPromotionMap(); - //是否计算拼团促销 - String pintuanId = tradeSku.getPintuanId() != null ? tradeSku.getPintuanId() : null; //如果商品促销列表存在促销活动 - this.calculationPromotionMap(promotionMap, goodsSkuPromotionPrice, esGoodsIndex, pintuanId); + this.calculationPromotionMap(promotionMap, goodsSkuPromotionPrice, esGoodsIndex, promotionPriceParamDTO); goodsSkuPromotionPrice.setTotalOriginalPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), goodsSkuPromotionPrice.getNumber())); - goodsSkuPromotionPrice.setTotalPoints(CurrencyUtil.mul(goodsSkuPromotionPrice.getPoints(), goodsSkuPromotionPrice.getNumber())); goodsSkuPromotionPrice.setTotalDiscountPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getDiscountPrice(), goodsSkuPromotionPrice.getNumber())); goodsSkuPromotionPrice.setTotalFinalePrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getFinalePrice(), goodsSkuPromotionPrice.getNumber())); priceDTOList.add(goodsSkuPromotionPrice); @@ -188,29 +234,116 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { return priceDTOList; } + /** - * 促销计算(秒杀活动,拼团) + * 计算积分商品 + * 积分商品的购买金额是:0 + * 1.根据SkuId去查询积分商品(Mongo) + * 2.计算积分商品的优惠信息 + * + * @param tradeSkuList 交易商品促销金额列表 + * @return 计算结果 + */ + private List pointGoodsPromotion(List tradeSkuList) { + List priceDTOList = new ArrayList<>(); + //获取积分商品SkuId + String skuId = tradeSkuList.get(0).getSkuId(); + //获取积分商品VO + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(skuId); + //参与计算的缓存中的商品SKU列表 + GoodsSku goodsSku = pointsGoodsVO.getGoodsSku(); + //获取商品促销金额 + GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice = new GoodsSkuPromotionPriceDTO(goodsSku, tradeSkuList.get(0).getNum()); + //计算商品原价=原价*数量 + goodsSkuPromotionPrice.setTotalOriginalPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), goodsSkuPromotionPrice.getNumber())); + //计算商品积分数量=兑换积分*数量 + goodsSkuPromotionPrice.setTotalPoints(pointsGoodsVO.getPoints() * Convert.toLong(goodsSkuPromotionPrice.getNumber())); + //优惠金额=商品原价*数量 + goodsSkuPromotionPrice.setTotalDiscountPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), goodsSkuPromotionPrice.getNumber())); + //购买价格=积分商品价格为 0 + goodsSkuPromotionPrice.setTotalFinalePrice(0.0); + priceDTOList.add(goodsSkuPromotionPrice); + return priceDTOList; + } + + /** + * 计算砍价商品 + * 砍价商品只能购买一件 + * 1.根据SkuId去查询积分商品(Mongo) + * 2.计算积分商品的优惠信息 + * + * @param tradeSkuList 交易商品促销金额列表 + * @return 计算结果 + */ + private List kanjiaPromotion(List tradeSkuList) { + List priceDTOList = new ArrayList<>(); + //获取积分商品SkuId + String skuId = tradeSkuList.get(0).getSkuId(); + //获取积分商品VO + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanJiaGoodsBySku(skuId); + + //参与计算的缓存中的商品SKU列表 + GoodsSku goodsSku = kanjiaActivityGoodsDTO.getGoodsSku(); + GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice = new GoodsSkuPromotionPriceDTO(goodsSku, tradeSkuList.get(0).getNum()); + //优惠金额=商品原价-购买价格 + goodsSkuPromotionPrice.setTotalDiscountPrice(CurrencyUtil.sub(goodsSkuPromotionPrice.getOriginalPrice(), kanjiaActivityGoodsDTO.getPurchasePrice())); + //购买价格=砍价成交金额 + goodsSkuPromotionPrice.setTotalFinalePrice(kanjiaActivityGoodsDTO.getPurchasePrice()); + //原价 + goodsSkuPromotionPrice.setTotalOriginalPrice(goodsSkuPromotionPrice.getOriginalPrice()); + priceDTOList.add(goodsSkuPromotionPrice); + return priceDTOList; + } + + /** + * 促销计算(秒杀活动、拼团、满优惠活动、砍价) * * @param promotionMap 当前商品所有参加的促销活动 * @param goodsSkuPromotionPrice 商品SKU促销计算信息 * @param esGoodsIndex ES商品信息 - * @param pintuanId 拼团id,标示是否计算拼团活动 + * @param promotionPriceParamDTO 拼团id,标示是否计算拼团活动 */ - private void calculationPromotionMap(Map promotionMap, GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice, EsGoodsIndex esGoodsIndex, String pintuanId) { - if (promotionMap != null && !promotionMap.isEmpty()) { - //检查当前商品是否存在秒杀活动活动 - Optional existSeckill = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.SECKILL.name())).findFirst(); - if (existSeckill.isPresent()) { - Seckill seckill = (Seckill) promotionMap.get(existSeckill.get()); - //计算秒杀活动促销 - this.calculationSeckill(seckill, goodsSkuPromotionPrice); - seckill.setPromotionName(PromotionTypeEnum.SECKILL.name()); - goodsSkuPromotionPrice.getJoinPromotion().add(seckill); - } + private void calculationPromotionMap(Map promotionMap, GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice, EsGoodsIndex esGoodsIndex, PromotionPriceParamDTO promotionPriceParamDTO) { + //未参加促销则直接返回 + if (promotionMap == null || promotionMap.isEmpty()) { + return; + } - //检查当前商品是否存在拼团活动 + //检查当前商品是否存在满优惠活动 + Optional existFullDiscount = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst(); + if (existFullDiscount.isPresent()) { + FullDiscount discount = (FullDiscount) promotionMap.get(existFullDiscount.get()); + goodsSkuPromotionPrice.setPromotionId(discount.getId()); + goodsSkuPromotionPrice.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name()); + } + + //检查当前商品是否存在秒杀活动活动 + Optional existSeckill = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.SECKILL.name())).findFirst(); + if (existSeckill.isPresent()) { + Seckill seckill = (Seckill) promotionMap.get(existSeckill.get()); + //计算秒杀活动促销 + this.calculationSeckill(seckill, goodsSkuPromotionPrice); + seckill.setPromotionName(PromotionTypeEnum.SECKILL.name()); + goodsSkuPromotionPrice.getJoinPromotion().add(seckill); + } + + //检查当前商品是否存在砍价活动 + if (promotionPriceParamDTO.getKanjiaId() != null) { + Optional existKanjia = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.KANJIA.name())).findFirst(); + if (existKanjia.isPresent()) { + KanjiaActivityGoods kanjiaActivityGoods = (KanjiaActivityGoods) promotionMap.get(existKanjia.get()); + //优惠的总价格 = 原商品总价 - 优惠后的商品总价 + double discountPrice = CurrencyUtil.sub(kanjiaActivityGoods.getOriginalPrice(), kanjiaActivityGoods.getPurchasePrice()); + goodsSkuPromotionPrice.setDiscountPrice(discountPrice); + goodsSkuPromotionPrice.setFinalePrice(kanjiaActivityGoods.getPurchasePrice()); + goodsSkuPromotionPrice.getJoinPromotion().add(kanjiaActivityGoods); + + } + } + //检查当前商品是否存在拼团活动 + else if (promotionPriceParamDTO.getPintuanId() != null) { Optional existPintuan = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); - if (existPintuan.isPresent() && pintuanId != null) { + if (existPintuan.isPresent()) { Pintuan pintuan = (Pintuan) promotionMap.get(existPintuan.get()); //优惠的总价格 = 原商品总价 - 优惠后的商品总价 double discountPrice = CurrencyUtil.sub(goodsSkuPromotionPrice.getOriginalPrice(), esGoodsIndex.getPromotionPrice()); @@ -219,20 +352,17 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { pintuan.setPromotionName(PromotionTypeEnum.PINTUAN.name()); goodsSkuPromotionPrice.getJoinPromotion().add(pintuan); } - - //检查当前商品是否存在满优惠活动 - Optional existFullDiscount = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst(); - if (existFullDiscount.isPresent()) { - FullDiscount discount = (FullDiscount) promotionMap.get(existFullDiscount.get()); - goodsSkuPromotionPrice.setPromotionId(discount.getId()); - goodsSkuPromotionPrice.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name()); - } - - + } + //检查当前商品是否存在积分商品活动 + else if (promotionPriceParamDTO.getPointsId() != null) { Optional existPointsGoods = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.POINTS_GOODS.name())).findFirst(); if (existPointsGoods.isPresent()) { PointsGoods pointsGoods = (PointsGoods) promotionMap.get(existPointsGoods.get()); goodsSkuPromotionPrice.setPoints(pointsGoods.getPoints().doubleValue()); + goodsSkuPromotionPrice.setDiscountPrice(goodsSkuPromotionPrice.getOriginalPrice()); + goodsSkuPromotionPrice.setFinalePrice(0.0); + pointsGoods.setPromotionName(pointsGoods.getPromotionName()); + goodsSkuPromotionPrice.getJoinPromotion().add(pointsGoods); } } } @@ -346,7 +476,8 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { */ private void calculationSeckill(Seckill seckill, GoodsSkuPromotionPriceDTO promotionPrice) { //检查 活动有效时间 及 活动有效状态 - if (checkPromotionValidTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL.name(), seckill.getId()) && seckill.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { + if (checkPromotionValidTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL.name(), seckill.getId()) && + seckill.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SeckillApply::getSkuId, promotionPrice.getSkuId()).eq(SeckillApply::getSeckillId, seckill.getId()); SeckillApply seckillApply = seckillApplyService.getOne(queryWrapper); diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java index 4a97ceba..f938c573 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java @@ -10,6 +10,7 @@ import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.trigger.message.PromotionMessage; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.promotion.entity.dos.*; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; import cn.lili.modules.promotion.entity.enums.*; import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.PintuanVO; @@ -97,6 +98,8 @@ public class PromotionServiceImpl implements PromotionService { */ @Autowired private MongoTemplate mongoTemplate; + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; @Override @@ -124,7 +127,11 @@ public class PromotionServiceImpl implements PromotionService { break; //积分商品 case POINTS_GOODS: - result = this.updatePointsGoods(promotionMessage, esPromotionKey, promotionTypeEnum); + result = this.updatePointsGoods(promotionMessage, promotionTypeEnum); + break; + //砍价商品商品 + case KANJIA: + result = this.updateKanjiaGoods(promotionMessage, promotionTypeEnum); break; //优惠券活动 case COUPON_ACTIVITY: @@ -432,11 +439,10 @@ public class PromotionServiceImpl implements PromotionService { * 修改积分商品状态 * * @param promotionMessage 信息队列传输促销信息实体 - * @param esPromotionKey es Key * @param promotionTypeEnum 促销分类枚举 * @return 修改结果 */ - private boolean updatePointsGoods(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) { + private boolean updatePointsGoods(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) { boolean result; PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PointsGoodsVO.class); if (pointsGoodsVO == null) { @@ -445,12 +451,31 @@ public class PromotionServiceImpl implements PromotionService { } pointsGoodsVO.setPromotionStatus(promotionMessage.getPromotionStatus()); result = this.pointsGoodsService.update(updateWrapper(promotionMessage)); - PointsGoods pointsGoods = JSONUtil.toBean(JSONUtil.toJsonStr(pointsGoodsVO), PointsGoods.class); - this.goodsIndexService.updateEsGoodsIndex(pointsGoodsVO.getSkuId(), pointsGoods, esPromotionKey, null); this.mongoTemplate.save(pointsGoodsVO); return result; } + /** + * 修改砍价商品状态 + * + * @param promotionMessage 信息队列传输促销信息实体 + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ + private boolean updateKanjiaGoods(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) { + KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), KanjiaActivityGoodsDTO.class); + if (kanJiaActivityGoodsDTO == null) { + this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); + return false; + } + kanJiaActivityGoodsDTO.setPromotionStatus(promotionMessage.getPromotionStatus()); + boolean result = this.kanJiaActivityGoodsService.updateById(kanJiaActivityGoodsDTO); + if (result) { + this.mongoTemplate.save(kanJiaActivityGoodsDTO); + } + return result; + } + /** * 修改优惠券活动状态 * @@ -500,6 +525,7 @@ public class PromotionServiceImpl implements PromotionService { /** * 根据消息,获取update wrapper + * * @param * @return */ diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java index 48a49ae1..4a7c97ca 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java @@ -92,6 +92,7 @@ public class Bill { * -commissionPrice+refundCommissionPrice * -distributionCommission+distributionRefundCommission * +siteCouponCommission-siteCouponRefundCommission + * +kanjiaSettlementPrice+pointSettlementPrice */ @ApiModelProperty(value = "结算周期内订单付款总金额") private Double orderPrice; @@ -117,6 +118,12 @@ public class Bill { @ApiModelProperty(value = "退货平台优惠券补贴返还") private Double siteCouponRefundCommission; + @ApiModelProperty(value = "积分商品结算价格") + private Double pointSettlementPrice; + + @ApiModelProperty(value = "砍价商品结算价格") + private Double kanjiaSettlementPrice; + @ApiModelProperty(value = "最终结算金额") private Double billPrice; diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java index 2d9aa1ea..d9bd6c76 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java @@ -37,7 +37,10 @@ public interface BillMapper extends BaseMapper { */ @Select("SELECT SUM( final_price ) AS orderPrice,SUM( commission_price ) AS commissionPrice" + ",SUM( distribution_rebate ) AS distributionCommission,SUM( site_coupon_commission ) AS siteCouponCommission" + - ",SUM( bill_price ) AS billPrice FROM li_store_flow ${ew.customSqlSegment}") + ",SUM( point_settlement_price ) AS pointSettlementPrice " + + ",SUM( kanjia_settlement_price ) AS kanjiaSettlementPrice " + + ",SUM( bill_price ) AS billPrice " + + "FROM li_store_flow ${ew.customSqlSegment}") Bill getOrderBill(@Param(Constants.WRAPPER) QueryWrapper queryWrapper); /** diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java index e20cccd7..986f2734 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java @@ -89,7 +89,11 @@ public class BillServiceImpl extends ServiceImpl implements Bi bill.setCommissionPrice(orderBill.getCommissionPrice()); bill.setDistributionCommission(orderBill.getDistributionCommission()); bill.setSiteCouponCommission(orderBill.getSiteCouponCommission()); - orderPrice = orderBill.getBillPrice(); + bill.setPointSettlementPrice(orderBill.getPointSettlementPrice()); + bill.setKanjiaSettlementPrice(orderBill.getKanjiaSettlementPrice()); + //入账金额=订单金额+积分商品+砍价商品 + orderPrice = CurrencyUtil.add(CurrencyUtil.add(orderBill.getBillPrice(), orderBill.getPointSettlementPrice()), + orderBill.getKanjiaSettlementPrice()); } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/KanJiaActivityGoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/KanJiaActivityGoodsManagerController.java new file mode 100644 index 00000000..0b6f305f --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/promotion/KanJiaActivityGoodsManagerController.java @@ -0,0 +1,77 @@ +package cn.lili.controller.promotion; + + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + + +/** + * 管理端,促销接口 + * + * @author qiuqiu + * @date 2021/7/2 + **/ +@RestController +@Api(tags = "管理端,砍价促销接口") +@RequestMapping("/manager/promotion/kan-jia-goods") +public class KanJiaActivityGoodsManagerController { + + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; + + @PostMapping + @ApiOperation(value = "添加砍价活动") + public ResultMessage add(@RequestBody KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) { + kanJiaActivityGoodsService.add(kanJiaActivityGoodsOperationDTO); + return ResultUtil.success(); + } + + + @ApiOperation(value = "获取砍价活动分页") + @GetMapping + public ResultMessage> getKanJiaActivityPage(KanjiaActivityGoodsParams KanJiaActivityParams, PageVO page) { + return ResultUtil.data(kanJiaActivityGoodsService.getForPage(KanJiaActivityParams, page)); + } + + + @GetMapping("/{id}") + @ApiOperation(value = "获取积分商品详情") + public ResultMessage getPointsGoodsDetail(@PathVariable("id") String goodsId) { + KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = kanJiaActivityGoodsService.getKanjiaGoodsDetail(goodsId); + return ResultUtil.data(kanJiaActivityGoodsDTO); + } + + + @PutMapping + @ApiOperation(value = "修改砍价商品") + public ResultMessage updatePointsGoods(@RequestBody KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { + kanJiaActivityGoodsService.updateKanjiaActivityGoods(kanJiaActivityGoodsDTO); + return ResultUtil.success(); + } + + + @DeleteMapping("/{ids}") + @ApiOperation(value = "删除砍价商品") + public ResultMessage delete(@PathVariable String ids) { + if (kanJiaActivityGoodsService.deleteKanJiaGoods(Arrays.asList(ids.split(",")))) { + return ResultUtil.success(); + } + throw new ServiceException(ResultCode.KANJIA_GOODS_DELETE_ERROR); + } + + +} diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java index e31e9d0a..db15c51f 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java @@ -39,7 +39,7 @@ public class PointsGoodsManagerController { List collect = new ArrayList<>(); for (PointsGoodsVO i : pointsGoodsList) { i.setStoreName(i.getGoodsSku().getStoreName()); - i.setStoreId(UserContext.getCurrentUser().getStoreId()); + i.setStoreId(i.getGoodsSku().getStoreId()); collect.add(i); } pointsGoodsService.addPointsGoods(collect); diff --git a/update-sql/version4.2to4.3.sql b/update-sql/version4.2to4.3.sql index e4ea5b35..e9ff408d 100644 --- a/update-sql/version4.2to4.3.sql +++ b/update-sql/version4.2to4.3.sql @@ -16,6 +16,14 @@ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; +/** 添加结算单积分、砍价结算价信息**/ +ALTER TABLE li_bill ADD point_settlement_price double DEFAULT 0.00 COMMENT '积分商品结算金额 '; +ALTER TABLE li_bill ADD kanjia_settlement_price double DEFAULT 0.00 COMMENT '砍价商品结算金额'; +ALTER TABLE li_store_flow ADD point_settlement_price double DEFAULT 0.00 COMMENT '积分商品结算金额'; +ALTER TABLE li_store_flow ADD kanjia_settlement_price double DEFAULT 0.00 COMMENT '砍价商品结算金额'; + +/** 热词管理*/ +UPDATE `lilishop`.`li_menu` SET `create_by` = 'admin', `create_time` = '2021-03-03 09:54:51', `delete_flag` = b'0', `update_by` = 'admin', `update_time` = '2021-07-23 19:07:45', `description` = 'null', `front_route` = 'page/article-manage/hotWords', `icon` = 'md-aperture', `level` = 2, `name` = 'hotKeyWord', `parent_id` = '1367050250249830400', `path` = 'hotKeyWord', `sort_order` = 0.00, `title` = '搜索热词', `front_component` = 'null' WHERE `id` = 1367050829697122304; -- ---------------------------- -- Table structure for li_menu @@ -146,5 +154,4 @@ INSERT INTO `li_menu` VALUES (1407602673334636546, 'admin', '2021-06-23 15:33:24 INSERT INTO `li_menu` VALUES (1410862675914764290, 'admin', '2021-07-02 15:27:29', b'0', 'admin', '2021-07-27 16:06:26', 'null', 'distribution/distributionCash', '', 2, 'distributionCash', '1374173575405109248', 'distributionCash', 5.00, '分销提现', 'null', '/manager/distribution/cash*'); INSERT INTO `li_menu` VALUES (1419926569920536578, 'admin', '2021-07-27 15:44:10', b'0', 'admin', '2021-07-27 16:07:10', NULL, 'customWords/index', NULL, 2, 'customWords', '1367050250249830400', 'customWords', 4.00, 'ES分词', NULL, '/manager/manager/custom-words*'); COMMIT; - SET FOREIGN_KEY_CHECKS = 1;