Browse Source

订单支付时接入活动游湖

codingliang 2 năm trước cách đây
mục cha
commit
c06ee16235

+ 43 - 0
src/main/java/com/sqx/modules/activity/controller/ActivityPartRecordController.java

@@ -0,0 +1,43 @@
+package com.sqx.modules.activity.controller;
+
+import com.sqx.common.utils.PageUtils;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.activity.dto.ActivityPartRecordQueryDTO;
+import com.sqx.modules.activity.service.ActivityPartRecordService;
+import com.sqx.modules.activity.vo.ActivityPartRecordVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+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;
+
+/**
+ * 活动参与记录
+ * @author : codingliang
+ * @date : 2024-6-24
+ */
+@Api(tags = "活动-活动参与记录管理")
+@RestController
+@RequestMapping("admin/activity-part-record")
+@RequiredArgsConstructor
+public class ActivityPartRecordController{
+    
+    private final ActivityPartRecordService activityPartRecordService;
+
+    @GetMapping("page")
+    @ApiOperation(value = "活动参与记录分页", response = PageUtils.class)
+    public Result page(ActivityPartRecordQueryDTO queryDTO) {
+        PageUtils page = activityPartRecordService.page(queryDTO);
+        return Result.success().put("data", page);
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation(value = "根据id获取活动参与记录信息", response = ActivityPartRecordVO.class)
+    public Result getById(@PathVariable @ApiParam("记录id") Long id) {
+        ActivityPartRecordVO vo = activityPartRecordService.getVoById(id);
+        return Result.success().put("data", vo);
+    }
+}

+ 23 - 0
src/main/java/com/sqx/modules/activity/dao/ActivityPartRecordDao.java

@@ -0,0 +1,23 @@
+package com.sqx.modules.activity.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sqx.modules.activity.dto.ActivityPartRecordQueryDTO;
+import com.sqx.modules.activity.entity.ActivityPartRecord;
+import com.sqx.modules.activity.vo.ActivityPartRecordVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 活动参与记录
+ * @author : codingliang
+ * @date : 2024-6-24
+ */
+@Mapper
+public interface ActivityPartRecordDao extends BaseMapper<ActivityPartRecord> {
+
+    ActivityPartRecordVO getVoById(@Param("recordId") Long recordId);
+
+    IPage<ActivityPartRecordVO> pageByQuery(@Param("pages") Page<ActivityPartRecord> pages, @Param("queryDTO") ActivityPartRecordQueryDTO queryDTO);
+}

+ 30 - 0
src/main/java/com/sqx/modules/activity/dto/ActivityPartRecordQueryDTO.java

@@ -0,0 +1,30 @@
+package com.sqx.modules.activity.dto;
+
+import com.sqx.common.query.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 活动参与记录查询dto
+ *
+ * @author : codingliang
+ * @date : 2024-06-24 15:39
+ */
+@Data
+public class ActivityPartRecordQueryDTO extends PageQuery {
+
+    @ApiModelProperty("订单id")
+    private Long orderId;
+
+    @ApiModelProperty("订单支付状态; 0未支付 1已支付")
+    private String orderPayStatus;
+
+    @ApiModelProperty("用户手机号")
+    private String userPhone;
+
+    @ApiModelProperty("活动标题")
+    private String activityTitle;
+
+    @ApiModelProperty("活动类型")
+    private String activityType;
+}

+ 45 - 0
src/main/java/com/sqx/modules/activity/entity/ActivityPartRecord.java

@@ -0,0 +1,45 @@
+package com.sqx.modules.activity.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 活动参与记录
+ * @author : codingliang
+ * @date : 2024-6-24
+ */
+@ApiModel(value = "活动参与记录")
+@TableName("activity_part_record")
+@Data
+public class ActivityPartRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+    
+    @ApiModelProperty(name = "id")
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    
+    @ApiModelProperty(name = "订单id")
+    private Long orderId;
+    
+    @ApiModelProperty(name = "用户id")
+    private Long userId;
+    
+    @ApiModelProperty(name = "活动id")
+    private Long activityId;
+    
+    @ApiModelProperty(name = "参与时间")
+    private Date createTime;
+
+     @ApiModelProperty(name = "参与商品id;多个id之间使用,分割")
+     private String goodsId;
+
+     @ApiModelProperty(name = "参与商品名称;多个名称之间使用,分割")
+     private String goodsName;
+}

+ 28 - 0
src/main/java/com/sqx/modules/activity/service/ActivityPartRecordService.java

@@ -0,0 +1,28 @@
+package com.sqx.modules.activity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.activity.dto.ActivityPartRecordQueryDTO;
+import com.sqx.modules.activity.entity.ActivityPartRecord;
+import com.sqx.modules.activity.vo.ActivityPartRecordVO;
+import com.sqx.modules.activity.vo.OrderSuitActivityVO;
+import com.sqx.modules.order.entity.TbOrder;
+
+/**
+ * 活动参与记录
+ * @author : codingliang
+ * @date : 2024-6-24
+ */
+public interface ActivityPartRecordService extends IService<ActivityPartRecord> {
+
+    PageUtils page(ActivityPartRecordQueryDTO queryDTO);
+
+    /**
+     * 根据订单和订单活动信息保存活动参与记录
+     * @param order 订单信息
+     * @param orderBestActivity 订单活动
+     */
+    void saveByOrderAndSuitActivityVO(TbOrder order, OrderSuitActivityVO orderBestActivity);
+
+    ActivityPartRecordVO getVoById(Long recordId);
+}

+ 8 - 1
src/main/java/com/sqx/modules/activity/service/ActivityService.java

@@ -34,7 +34,14 @@ public interface ActivityService extends IService<Activity> {
     /**
      * 获取订单适用活动列表
      * @param orderId 订单id
-     * @return 活动
+     * @return 活动列表
      */
     List<OrderSuitActivityVO> getOrderSuitActivity(Long orderId);
+
+    /**
+     * 获取订单最适用活动
+     * @param orderId 订单id
+     * @return 活动
+     */
+    OrderSuitActivityVO getOrderBestActivity(Long orderId);
 }

+ 61 - 0
src/main/java/com/sqx/modules/activity/service/impl/ActivityPartRecordServiceImpl.java

@@ -0,0 +1,61 @@
+package com.sqx.modules.activity.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.activity.dao.ActivityPartRecordDao;
+import com.sqx.modules.activity.dto.ActivityPartRecordQueryDTO;
+import com.sqx.modules.activity.entity.ActivityPartRecord;
+import com.sqx.modules.activity.service.ActivityPartRecordService;
+import com.sqx.modules.activity.vo.ActivityPartRecordVO;
+import com.sqx.modules.activity.vo.OrderSuitActivityVO;
+import com.sqx.modules.order.entity.TbOrder;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.stream.Collectors;
+
+/**
+ * 活动参与记录
+ * @author : codingliang
+ * @date : 2024-6-24
+ */
+@Service
+@RequiredArgsConstructor
+public class ActivityPartRecordServiceImpl extends ServiceImpl<ActivityPartRecordDao, ActivityPartRecord> implements ActivityPartRecordService {
+
+    @Override
+    public PageUtils page(ActivityPartRecordQueryDTO queryDTO) {
+        Page<ActivityPartRecord> pages = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
+
+        IPage<ActivityPartRecordVO> pageResult = baseMapper.pageByQuery(pages, queryDTO);
+        return new PageUtils(pageResult);
+    }
+
+    @Override
+    public void saveByOrderAndSuitActivityVO(TbOrder order, OrderSuitActivityVO orderBestActivity) {
+        // 先清空当前活动已有的活动参与记录
+        LambdaQueryWrapper<ActivityPartRecord> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ActivityPartRecord::getOrderId, order.getOrderId());
+        this.remove(queryWrapper);
+
+        ActivityPartRecord record = new ActivityPartRecord();
+        record.setOrderId(order.getOrderId());
+        record.setActivityId(orderBestActivity.getActivityId());
+        record.setUserId(order.getUserId());
+        record.setCreateTime(new Date());
+        record.setGoodsId(orderBestActivity.getGoodsIds().stream().map(String::valueOf).collect(Collectors.joining(",")));
+        record.setGoodsName(orderBestActivity.getGoodsNames().stream().map(String::valueOf).collect(Collectors.joining(",")));
+
+        this.save(record);
+    }
+
+    @Override
+    public ActivityPartRecordVO getVoById(Long recordId) {
+        return baseMapper.getVoById(recordId);
+    }
+}

+ 18 - 0
src/main/java/com/sqx/modules/activity/service/impl/ActivityServiceImpl.java

@@ -180,8 +180,15 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityDao, Activity> impl
         return goodsActivityVOList.stream()
                 .map(e -> {
                     String type = e.getType();
+                    // 符合当前活动的商品id集合
                     List<Long> curGoodsIds = e.getGoodsIds();
 
+                    // 符合当前活动的商品id集合
+                    List<String> curGoodsNames = orderGoodsList.stream()
+                            .filter(orderGoods -> curGoodsIds.contains(orderGoods.getGoodsId()))
+                            .map(OrderGoods::getGoodsName)
+                            .collect(Collectors.toList());
+
                     // 当前商品总价
                     double curGoodsTotalPrice = orderGoodsList.stream()
                             .filter(orderGoods -> curGoodsIds.contains(orderGoods.getGoodsId()))
@@ -225,12 +232,23 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityDao, Activity> impl
                     vo.setActivityTitle(e.getTitle());
                     vo.setActivityType(type);
                     vo.setDiscountAmount(discountAmount);
+                    vo.setGoodsIds(curGoodsIds);
                     return vo;
                 })
                 .sorted(Comparator.comparing(OrderSuitActivityVO::getDiscountAmount))
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public OrderSuitActivityVO getOrderBestActivity(Long orderId) {
+        List<OrderSuitActivityVO> suitActivity = getOrderSuitActivity(orderId);
+        if (CollUtil.isEmpty(suitActivity)) {
+            return null;
+        } else {
+            return suitActivity.get(0);
+        }
+    }
+
     /**
      * 根据id获取活动信息
      *    如id对应记录不存在,则抛出数据不存在异常

+ 60 - 0
src/main/java/com/sqx/modules/activity/vo/ActivityPartRecordVO.java

@@ -0,0 +1,60 @@
+package com.sqx.modules.activity.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 活动参与记录vo
+ *
+ * @author : codingliang
+ * @date : 2024-06-24 15:23
+ */
+@Data
+@ApiModel(value = "活动参与记录")
+public class ActivityPartRecordVO {
+
+    @ApiModelProperty("记录id")
+    private Long id;
+
+    @ApiModelProperty("订单id")
+    private Long orderId;
+
+    @ApiModelProperty("订单支付状态; 0未支付 1已支付")
+    private String orderPayStatus;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("用户头像")
+    private String userImg;
+
+    @ApiModelProperty("用户手机号")
+    private String userPhone;
+
+    @ApiModelProperty("活动id")
+    private Long activityId;
+    
+    @ApiModelProperty("活动标题")
+    private String activityTitle;
+    
+    @ApiModelProperty("活动图片")
+    private String activityImg;
+
+    @ApiModelProperty("活动内容")
+    private String activityContent;
+
+    @ApiModelProperty("活动类型")
+    private String activityType;
+
+    @ApiModelProperty("参与时间")
+    private Date createTime;
+
+    @ApiModelProperty("参与商品id;多个id之间使用,分割")
+    private String goodsId;
+
+    @ApiModelProperty("参与商品名称;多个名称之间使用,分割")
+    private String goodsName;
+}

+ 3 - 0
src/main/java/com/sqx/modules/activity/vo/OrderSuitActivityVO.java

@@ -30,4 +30,7 @@ public class OrderSuitActivityVO {
 
     @ApiModelProperty("符合该条件的商品id列表")
     private List<Long> goodsIds;
+
+    @ApiModelProperty("符合该条件的商品名称列表")
+    private List<String> goodsNames;
 }

+ 28 - 1
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sqx.modules.order.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -11,6 +12,9 @@ import com.sqx.common.utils.DateUtils;
 import com.sqx.common.utils.DistanceUtil;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
+import com.sqx.modules.activity.service.ActivityService;
+import com.sqx.modules.activity.service.ActivityPartRecordService;
+import com.sqx.modules.activity.vo.OrderSuitActivityVO;
 import com.sqx.modules.address.entity.Address;
 import com.sqx.modules.address.service.AddressService;
 import com.sqx.modules.app.dao.UserBrowseDao;
@@ -58,6 +62,7 @@ import com.sqx.modules.utils.fieYun.FeiYunUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -126,6 +131,12 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     private AddressService addressService;
     @Autowired
     private ShopMessageService shopMessageService;
+    @Lazy
+    @Autowired
+    private ActivityService activityService;
+    @Autowired
+    private ActivityPartRecordService activityPartRecordService;
+
     private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
 
     @Override
@@ -373,6 +384,9 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         // 校验地址、配送费信息
         checkAddress(parentOrder, addressId, goodsShop);
 
+        // 检查活动优惠信息
+        checkActivity(parentOrder);
+
         // 校验优惠券信息
         checkCoupon(parentOrder, userId);
 
@@ -382,6 +396,18 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return parentOrder;
     }
 
+    private void checkActivity(TbOrder parentOrder) {
+        // 获取当前订单最优惠的活动
+        OrderSuitActivityVO orderBestActivity = activityService.getOrderBestActivity(parentOrder.getOrderId());
+        if (ObjectUtil.isNotNull(orderBestActivity)) {
+            // 支付金额减去活动优惠金额
+            parentOrder.setPayMoney(parentOrder.getPayMoney().subtract(new BigDecimal(orderBestActivity.getDiscountAmount())));
+
+            // 保存活动参与信息
+            activityPartRecordService.saveByOrderAndSuitActivityVO(parentOrder, orderBestActivity);
+        }
+    }
+
     @Override
     public void subStock(TbOrder tbOrder) {
         Long shopId1 = tbOrder.getShopId();
@@ -764,9 +790,10 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             throw new SqxException("订单不存在,请刷新后重试!");
         }
         for(int i = 0; i < orderList.size(); i++) {
+            Long orderId = orderList.get(i).getOrderId();
             List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(
                     new QueryWrapper<OrderGoods>()
-                            .eq("order_id", orderList.get(i).getOrderId()));
+                            .eq("order_id", orderId));
             for (int a = 0; a < orderGoodsList.size(); a++) {
                 BigDecimal goodsNum = new BigDecimal(orderGoodsList.get(a).getGoodsNum());
                 BigDecimal goodsPrice = orderGoodsList.get(a).getGoodsPrice();

+ 57 - 0
src/main/resources/mapper/activity/ActivityPartRecordDao.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sqx.modules.activity.dao.ActivityPartRecordDao">
+
+    <select id="getVoById" resultType="com.sqx.modules.activity.vo.ActivityPartRecordVO">
+        select
+            apr.*,
+            o.is_pay orderPayStatus,
+            u.avatar userImg,
+            u.phone userPhone,
+            a.title activityTitle,
+            a.image activityImg,
+            a.content activityContent,
+            a.type activityType
+        from
+            activity_part_record apr
+        left join activity a on a.id = apr.activity_id
+        left join tb_order o on o.order_id = apr.order_id
+        left join tb_user u on u.user_id = apr.user_id
+        where
+            apr.id = #{recordId}
+    </select>
+
+    <select id="pageByQuery" resultType="com.sqx.modules.activity.vo.ActivityPartRecordVO">
+        select
+            apr.*,
+            o.is_pay orderPayStatus,
+            u.avatar userImg,
+            u.phone userPhone,
+            a.title activityTitle,
+            a.image activityImg,
+            a.content activityContent,
+            a.type activityType
+        from
+            activity_part_record apr
+                left join activity a on a.id = apr.activity_id
+                left join tb_order o on o.order_id = apr.order_id
+                left join tb_user u on u.user_id = apr.user_id
+        <where>
+            <if test="queryDTO.orderId != null">
+                and app.order_id = #{queryDTO.orderId}
+            </if>
+            <if test="queryDTO.orderPayStatus != null and queryDTO.orderPayStatus != ''">
+                and o.is_pay = #{queryDTO.orderPayStatus}
+            </if>
+            <if test="queryDTO.userPhone != null and queryDTO.userPhone != ''">
+                and u.phone = #{queryDTO.userPhone}
+            </if>
+            <if test="queryDTO.activityTitle != null and queryDTO.activityTitle != ''">
+                and a.title = #{queryDTO.activityTitle}
+            </if>
+            <if test="queryDTO.activityType != null and queryDTO.activityType != ''">
+                and a.type = #{queryDTO.activityType}
+            </if>
+        </where>
+    </select>
+</mapper>