Aslee 3 年 前
コミット
f5e6e4f18e

+ 4 - 1
src/main/java/com/caimei/controller/OrderSubmitApi.java

@@ -54,6 +54,7 @@ public class OrderSubmitApi {
      *               *   "cartType":3,               //购买类型:(1购物车提交[对应表cm_cart],2直接购买提交)
      *               *   "addressId": 2732,          //地址ID
      *               *   "couponId": 12             //优惠券ID
+     *               *   "couponId": 12             //优惠券分享ID
      *               *   "orderInfo": [
      *               *                   { "shopId":1001,    // 供应商ID
      *               *                     "note":备注,
@@ -83,6 +84,7 @@ public class OrderSubmitApi {
         Integer cartType = null;
         Integer addressId = null;
         Integer couponId = null;
+        Integer couponShareId = null;
         List<Map<String, Object>> orderInfo = null;
         Map<String, Object> payInfo = null;
         Map<String, Object> orderInvoice = null;
@@ -105,6 +107,7 @@ public class OrderSubmitApi {
                 return ResponseJson.error("地址数据异常", null);
             }
             couponId = paramsMap.getInteger("couponId");
+            couponShareId = paramsMap.getInteger("couponShareId");
             orderInfo = (List<Map<String, Object>>) paramsMap.get("orderInfo");
             if (null == orderInfo) {
                 return ResponseJson.error("订单商品数据异常", null);
@@ -119,6 +122,6 @@ public class OrderSubmitApi {
         }
 
         log.info("****** 提交订单参数:【机构自己下单】:" + params);
-        return orderSubmitService.orderSubmit(userId, cartType, addressId, couponId, orderInfo, payInfo);
+        return orderSubmitService.orderSubmit(userId, cartType, addressId, couponId, couponShareId, orderInfo, payInfo);
     }
 }

+ 6 - 9
src/main/java/com/caimei/mapper/CouponMapper.java

@@ -31,7 +31,7 @@ public interface CouponMapper {
      * @param couponType    劵类型 1活动券 2专享券 3新人券 4好友分享券 5好友消费券
      * @return
      */
-    String getCurrentCouponIds(int couponType);
+    List<Integer> getCurrentCouponIds(int couponType);
 
 
     /**
@@ -118,7 +118,7 @@ public interface CouponMapper {
      * @param couponId
      * @return
      */
-    Integer findReceiveCouponId(@Param("userId") Integer userId, @Param("couponId") Integer couponId);
+    Integer findReceiveCouponId(@Param("userId") Integer userId, @Param("couponId") Integer couponId, @Param("couponShareId") Integer couponShareId);
 
     /**
      * 用户领取优惠券保存
@@ -131,14 +131,11 @@ public interface CouponMapper {
      * @param receiveUserId
      * @return
      */
-    Integer getCouponShareId(Integer receiveUserId);
+    CouponSharePo getCouponShareId(Integer receiveUserId);
 
     /**
-     * 更新优惠券分享记录的好友消费券id
-     *
-     * @param couponShareId
-     * @param consumeCouponIds
+     * 保存消费券发送记录
+     * @param couponSharePo
      */
-    void updateCouponShareRecord(@Param("couponShareId") Integer couponShareId, @Param("consumeCouponIds") String consumeCouponIds);
-
+    void insertCouponShare(CouponSharePo couponSharePo);
 }

+ 13 - 0
src/main/java/com/caimei/mapper/OrderMapper.java

@@ -279,4 +279,17 @@ public interface OrderMapper {
      * @return
      */
     Integer findProductStatus(Integer productId);
+
+    /**
+     * 查找订单使用的优惠券
+     * @param orderId
+     * @return
+     */
+    Integer findOrderCoupon(Integer orderId);
+
+    /**
+     * 取消订单回退优惠券
+     * @param receiveCouponId
+     */
+    void revertCoupon(Integer receiveCouponId);
 }

+ 3 - 0
src/main/java/com/caimei/model/dto/CouponsDto.java

@@ -19,4 +19,7 @@ public class CouponsDto implements Serializable {
 
     @ApiModelProperty("用户id")
     private Integer userId;
+
+    @ApiModelProperty("优惠券分享id")
+    private Integer couponShareId;
 }

+ 2 - 10
src/main/java/com/caimei/model/po/CouponSharePo.java

@@ -22,15 +22,7 @@ public class CouponSharePo implements Serializable {
      */
     private Integer receiveUserId;
     /**
-     * 分享得到的好友分享券id,以,隔开
+     * 分享得到的好友分享/消费券id
      */
-    private String shareCouponIds;
-    /**
-     * 被分享者是否已消费,0未消费,1已消费
-     */
-    private Integer consumeFlag;
-    /**
-     * 分享对象消费后得到的好友消费券id
-     */
-    private String consumeCouponIds;
+    private Integer shareCouponId;
 }

+ 5 - 0
src/main/java/com/caimei/model/po/ReceiveCouponPo.java

@@ -20,6 +20,11 @@ public class ReceiveCouponPo implements Serializable {
      */
     private Integer couponId;
 
+    /**
+     * 优惠券分享id
+     */
+    private Integer couponShareId;
+
     /**
      * 用户id
      */

+ 5 - 0
src/main/java/com/caimei/model/vo/CouponVo.java

@@ -20,6 +20,11 @@ public class CouponVo implements Serializable {
      */
     private Integer couponId;
 
+    /**
+     * 优惠券分享id
+     */
+    private Integer couponShareId;
+
     /**
      * 优惠券名称
      */

+ 2 - 1
src/main/java/com/caimei/service/OrderSubmitService.java

@@ -32,9 +32,10 @@ public interface OrderSubmitService {
      * @param cartType
      * @param addressId
      * @param couponId
+     * @param couponShareId
      * @param orderInfo
      * @param payInfo
      * @return
      */
-    ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, Integer couponId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo);
+    ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, Integer couponId, Integer couponShareId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo);
 }

+ 1 - 1
src/main/java/com/caimei/service/impl/CouponServiceImpl.java

@@ -143,7 +143,7 @@ public class CouponServiceImpl implements CouponService {
 
     @Override
     public ResponseJson<String> collarCoupons(CouponsDto couponsDto) {
-        Integer receiveCouponId = couponMapper.findReceiveCouponId(couponsDto.getUserId(), couponsDto.getCouponId());
+        Integer receiveCouponId = couponMapper.findReceiveCouponId(couponsDto.getUserId(), couponsDto.getCouponId(), couponsDto.getCouponShareId());
         if (receiveCouponId != null && receiveCouponId > 0) {
             return ResponseJson.error("已经领取过了", null);
         }

+ 3 - 0
src/main/java/com/caimei/service/impl/OrderServiceImpl.java

@@ -266,6 +266,9 @@ public class OrderServiceImpl implements OrderService {
         }
         order.setStatus("6");
         orderMapper.cancelOrder(orderId);
+        Integer receiveCouponId = orderMapper.findOrderCoupon(orderId);
+        //取消订单回退优惠券
+        orderMapper.revertCoupon(receiveCouponId);
         return ResponseJson.success(null);
     }
 

+ 4 - 11
src/main/java/com/caimei/service/impl/OrderSubmitServiceImpl.java

@@ -95,11 +95,13 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
                 // 参与优惠券的所有商品id
                 String couponProductIds = couponMapper.getCouponProductIds(coupon.getCouponId());
                 if (productId != null && productId > 0) {
+                    // 立即购买
                     CartProductVo cartProduct = totalProducts.get(0);
                     if (couponProductIds.contains(cartProduct.getProductId().toString())) {
                         touchCouponAmount = totalPrice.get();
                     }
                 } else {
+                    // 购物车结算
                     for (CartProductVo product : totalProducts) {
                         if (couponProductIds.contains(product.getProductId().toString())) {
                             touchCouponAmount = MathUtil.add(touchCouponAmount, MathUtil.mul(product.getProductCount(), product.getPrice()));
@@ -130,7 +132,7 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, Integer couponId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo) {
+    public ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, Integer couponId, Integer couponShareId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo) {
         /*
          * 逻辑处理 start
          */
@@ -299,7 +301,7 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
         // 已领取优惠券id
         Integer receiveCouponId = null;
         if (null != couponId && couponId > 0) {
-            receiveCouponId = couponMapper.findReceiveCouponId(userId, couponId);
+            receiveCouponId = couponMapper.findReceiveCouponId(userId, couponId, couponShareId);
             List<CouponVo> receiveCouponList = couponMapper.findReceiveCouponList(userId, null, receiveCouponId, 1);
             if (receiveCouponList == null || receiveCouponList.size() <= 0) {
                 // 设置手动回滚事务
@@ -481,15 +483,6 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
             orderSubmitMapper.insertCouponOrderRecord(orderRecord);
         }
 
-        /*
-         * 保存好友消费券赠送记录
-         */
-        Integer couponShareId = couponMapper.getCouponShareId(userId);
-        if (null != couponShareId) {
-            String consumeCouponIds = couponMapper.getCurrentCouponIds(5);
-            couponMapper.updateCouponShareRecord(couponShareId, consumeCouponIds);
-        }
-
         log.info("******************** 提交订单逻辑处理 end *******************");
         /*
          * 构造返回参数

+ 15 - 4
src/main/java/com/caimei/service/impl/PayOrderServiceImpl.java

@@ -2,14 +2,12 @@ package com.caimei.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.caimei.mapper.CouponMapper;
 import com.caimei.mapper.OrderMapper;
 import com.caimei.mapper.PayOrderMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.dto.PaymentDto;
-import com.caimei.model.po.CmDiscernReceiptPo;
-import com.caimei.model.po.CmPayShopPo;
-import com.caimei.model.po.CmPayShopRecordPo;
-import com.caimei.model.po.CmReceiptOrderRelationPo;
+import com.caimei.model.po.*;
 import com.caimei.model.vo.*;
 import com.caimei.service.PayOrderService;
 import com.caimei.util.MathUtil;
@@ -38,6 +36,8 @@ public class PayOrderServiceImpl implements PayOrderService {
     private PayOrderMapper payOrderMapper;
     @Resource
     private OrderMapper orderMapper;
+    @Resource
+    private CouponMapper couponMapper;
 
     @Value("${caimei.delayedSplittingUrl}")
     private String delayedSplittingUrl;
@@ -214,6 +214,17 @@ public class PayOrderServiceImpl implements PayOrderService {
             //(收款买家)收款状态:1待收款、2部分收款、3已收款
             order.setReceiptStatus("3");
             log.info("订单全部支付,修改订单状态>>>>>>" + order.getStatus());
+            /*
+             * 保存好友消费券赠送记录
+             */
+            CouponSharePo couponShare = couponMapper.getCouponShareId(order.getUserId());
+            if (null != couponShare) {
+                List<Integer> couponIds = couponMapper.getCurrentCouponIds(5);
+                couponIds.forEach(couponId->{
+                    couponShare.setShareCouponId(couponId);
+                    couponMapper.insertCouponShare(couponShare);
+                });
+            }
         } else {
             //部分支付
             if ("11".equals(order.getStatus()) || "21".equals(order.getStatus())) {

+ 21 - 3
src/main/java/com/caimei/service/impl/ProductServiceImpl.java

@@ -142,6 +142,26 @@ public class ProductServiceImpl implements ProductService {
         //相关参数
         List<RelatedParametersVo> parametersList = productMapper.findParameters(product.getProductId());
         product.setParametersList(parametersList);
+        Integer activityId = productMapper.findActivityByProductId(product.getProductId());
+        //内部优惠折扣
+        Integer discount = productMapper.findProductDiscount(product.getProductId(), userId);
+        //税费
+        boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
+        if (activityId != null && activityId > 0) {
+            //活动阶梯
+            List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
+            if (null != discount && discount > 0 && null != ladderList && ladderList.size() > 0) {
+                ladderList.forEach(ladder-> ladder.setBuyPrice(MathUtil.div(MathUtil.mul(ladder.getBuyPrice(), discount), 100)));
+            }
+            if (addTaxFlag && null != ladderList && ladderList.size() > 0) {
+                ladderList.forEach(ladder->{
+                    BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(ladder.getBuyPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
+                    BigDecimal price = MathUtil.add(ladder.getBuyPrice(), addedValueTax);
+                    ladder.setBuyPrice(price);
+                });
+            }
+            product.setLadderList(ladderList);
+        }
         setProductDetails(product, userId);
         return ResponseJson.success(product);
     }
@@ -176,9 +196,7 @@ public class ProductServiceImpl implements ProductService {
         String image = productMapper.findActivityById(activityId);
         PageHelper.startPage(pageNum, pageSize);
         List<ProductVo> productList = productMapper.findActivityProduct(userId, activityId);
-        productList.forEach(product -> {
-            setProductDetails(product, userId);
-        });
+        productList.forEach(product -> setProductDetails(product, userId));
         PageInfo<ProductVo> pageInfo = new PageInfo<>(productList);
         map.put("image", image);
         map.put("pageInfo", pageInfo);

+ 59 - 45
src/main/resources/mapper/CouponMapper.xml

@@ -8,12 +8,13 @@
         values (#{userId}, #{couponId}, NOW())
     </insert>
     <insert id="insertReceiveCoupon">
-        insert into cm_hehe_receive_coupon (userId, couponId, source, status, receiveTime, delFlag)
-        values (#{userId}, #{couponId}, #{source}, #{status}, #{receiveTime}, #{delFlag})
+        insert into cm_hehe_receive_coupon (userId, couponId, couponShareId, source, status, receiveTime, delFlag)
+        values (#{userId}, #{couponId}, #{couponShareId}, #{source}, #{status}, #{receiveTime}, #{delFlag})
+    </insert>
+    <insert id="insertCouponShare">
+        insert into cm_hehe_coupon_share (shareUserId, receiveUserId, type, shareCouponId, createTime)
+        values (#{shareUserId}, #{receiveUserId}, 2, #{shareCouponId}, NOW())
     </insert>
-    <update id="updateCouponShareRecord">
-        update cm_hehe_coupon_share set consumeFlag = 1 and consumeCouponIds = #{consumeCouponIds}
-    </update>
     <select id="getCouponCount" resultType="java.lang.Integer">
         select count(*) from cm_hehe_coupon
         where couponType = #{couponType}
@@ -36,7 +37,8 @@
           and userId = #{userId}
     </select>
     <select id="findCouponList" resultType="com.caimei.model.vo.CouponVo">
-        select distinct chc.id as couponId,
+        select chc.id as couponId,
+        chcs.id as couponShareId,
         name as couponName,
         couponType,
         productType,
@@ -50,56 +52,67 @@
                 date_add(startTime,interval receivePeriod DAY)
             </if>
             <if test="userId > 0">
-                date_add(if(#{registerTime} <![CDATA[ >= ]]> startTime,
-                    #{registerTime},startTime),interval receivePeriod DAY)
+                date_add(
+                    if(couponType <![CDATA[ <= ]]> 3,
+                    if(#{registerTime} <![CDATA[ >= ]]> startTime,#{registerTime},startTime),
+                    chcs.createTime
+                    )
+                ,interval receivePeriod DAY)
             </if>
         ) as receivePeriod,
-        chc.createDate,
-        if(productType = 2,group_concat(chcp.productId),null) as productIds
+        if(productType = 2,chcp.productIds,null) as productIds,
+        chc.createDate
         from cm_hehe_coupon chc
-        left join cm_hehe_coupon_product chcp on chc.id = chcp.couponId
+        left join cm_hehe_coupon_share chcs on chc.id = chcs.shareCouponId
+        left join (select couponId as couponId, group_concat(productId) as productIds
+            from cm_hehe_coupon_product
+            group by couponId
+            ) as  chcp on chc.id = chcp.couponId
         where chc.delFlag = 0
         and if(startNowFlag = 1, true, NOW() <![CDATA[  >=  ]]> startTime)
+        <if test="productIdArr != null and productIdArr.length > 0">
+            and (chc.productType = 1
+            <foreach item="productId" index="index" collection="productIdArr" open="" separator=" " close="">
+                or find_in_set(#{productId},productIds)
+            </foreach>)
+        </if>
         <if test="userId == null or userId == 0">
             AND couponType not in (2,4,5)
             and if(receiveFlag = 1,
                 if(permanentFlag = 1,true,NOW() <![CDATA[ < ]]> endTime),
                 NOW() <![CDATA[ < ]]> date_add(startTime,interval receivePeriod DAY))
         </if>
-        <if test="productIdArr != null and productIdArr.length > 0">
-            and (chc.productType = 1 or chcp.productId in
-                <foreach item="productId" index="index" collection="productIdArr" open="(" separator="," close=")">
-                    #{productId}
-                </foreach>
-                )
-        </if>
         <if test="userId > 0">
-            and chc.id not in (select couponId from cm_hehe_receive_coupon where userId = #{userId})
+            and if(couponType <![CDATA[ <= ]]> 3,
+                chc.id not in (select couponId from cm_hehe_receive_coupon where userId = #{userId} and couponId is not null),
+                chcs.id not in (select couponShareId from cm_hehe_receive_coupon where userId = #{userId} and couponShareId is not null)
+                )
             and (
                 (couponType = 1
-                or (couponType = 2 and chc.id in (select distinct couponId from cm_hehe_coupon_user where userId = #{userId}))
+                or (couponType = 2 and chc.id in (select distinct couponId from cm_hehe_coupon_user where userId = #{userId} and couponId is not null))
                 or (couponType = 3 and #{registerTime} <![CDATA[ >= ]]> startTime)
-                or (couponType = 4 and FIND_IN_SET(chc.id , (select group_concat(shareCouponIds) from cm_hehe_coupon_share where shareUserId = #{userId})))
-                or (couponType = 5 and FIND_IN_SET(chc.id , (select group_concat(consumeCouponIds) from cm_hehe_coupon_share where shareUserId = #{userId} and consumeFlag = 1)))
+                or (couponType = 4 and chcs.shareUserId = #{userId})
+                or (couponType = 5 and chcs.shareUserId = #{userId})
                 )
             and if(receiveFlag = 1,
-                    if(permanentFlag = 1,true,NOW() <![CDATA[ < ]]> endTime),
-                    NOW() <![CDATA[ < ]]> date_add(
-                        if(couponType <![CDATA[ <= ]]> 3,
+                if(permanentFlag = 1,true,NOW() <![CDATA[ < ]]> endTime),
+                NOW() <![CDATA[ < ]]> date_add(
+                    if(couponType <![CDATA[ <= ]]> 3,
                         if(#{registerTime} <![CDATA[ >= ]]> startTime,#{registerTime},startTime),
-                        (select if(couponType = 4,createTime,updateTime) from cm_hehe_coupon_share where FIND_IN_SET(chc.id,if(couponType = 4,shareCouponIds,consumeCouponIds)))),
-                        interval receivePeriod DAY)
-                )
+                        chcs.createTime
+                    )
+                ,interval receivePeriod DAY))
+            )
         </if>
         <if test="couponType != null">
             and couponType = #{couponType}
         </if>
-        group by chc.id
         order by chc.createDate desc
     </select>
     <select id="findReceiveCouponList" resultType="com.caimei.model.vo.CouponVo">
         select distinct
             chrc.couponId as couponId,
+            chrc.couponShareId,
             name as couponName,
             couponType,
             productType,
@@ -108,35 +121,33 @@
             noThresholdFlag,
             date_add(chrc.receiveTime, interval chc.usePeriod DAY) as usePeriod,
             createDate,
-            if(productType = 2,group_concat(chcp.productId),null) as productIds
+            if(productType = 2,chcp.productIds,null) as productIds
         from cm_hehe_receive_coupon chrc left join cm_hehe_coupon chc on chrc.couponId = chc.id
-        left join cm_hehe_coupon_product chcp on chrc.couponId = chcp.couponId
+        left join (select couponId as couponId, group_concat(productId) as productIds
+                from cm_hehe_coupon_product
+                group by couponId) chcp on chrc.couponId = chcp.couponId
         where chrc.delFlag = 0 and chc.delFlag = 0 and chrc.userId = #{userId}
         <if test="receiveCouponId != null and receiveCouponId>0">
             and chrc.id = #{receiveCouponId}
         </if>
         <if test="productIdArr != null and productIdArr.length > 0">
-            and (chc.productType = 1 or chcp.productId in
-            <foreach item="productId" index="index" collection="productIdArr" open="(" separator="," close=")">
-                #{productId}
-            </foreach>
-            )
+            and (chc.productType = 1
+            <foreach item="productId" index="index" collection="productIdArr" open="" separator=" " close="">
+                or find_in_set(#{productId},productIds)
+            </foreach>)
         </if>
         <if test="status == 1">
             and chrc.status = 1
             and NOW() <![CDATA[ <= ]]> date_add(chrc.receiveTime, interval chc.usePeriod DAY)
-            group by chrc.couponId
             order by chrc.receiveTime desc
         </if>
         <if test="status == 2">
             and chrc.status = 2
-            group by chrc.couponId
             order by chrc.useTime desc
         </if>
         <if test="status == 3">
             and chrc.status = 1
             and NOW() <![CDATA[ > ]]> date_add(chrc.receiveTime, interval chc.usePeriod DAY)
-            group by chrc.couponId
             order by date_add(chrc.receiveTime, interval chc.usePeriod DAY) desc
         </if>
     </select>
@@ -188,17 +199,20 @@
         select id
         from cm_hehe_receive_coupon
         where userId = #{userId}
-          and couponId = #{couponId}
+        and couponId = #{couponId}
+        <if test="couponShareId != null">
+            and couponShareId = #{couponShareId}
+        </if>
     </select>
-    <select id="getCurrentCouponIds" resultType="java.lang.String">
-        select group_concat(id)
+    <select id="getCurrentCouponIds" resultType="java.lang.Integer">
+        select id
         from cm_hehe_coupon
         where couponType = #{couponType} and if(startNowFlag = 1,true, NOW() <![CDATA[  >=  ]]> startTime )
           and if(permanentFlag = 1,true,NOW() <![CDATA[  <=  ]]> endTime) and delFlag = 0
-        group by couponType
     </select>
-    <select id="getCouponShareId" resultType="java.lang.Integer">
-        select id from cm_hehe_coupon_share where receiveUserId = #{receiveUserId} and consumeFlag != 1
+    <select id="getCouponShareId" resultType="com.caimei.model.po.CouponSharePo">
+        select id, shareUserId, receiveUserId, shareCouponId
+        from cm_hehe_coupon_share where receiveUserId = #{receiveUserId} and type = 1
     </select>
 
 </mapper>

+ 11 - 0
src/main/resources/mapper/OrderMapper.xml

@@ -431,6 +431,14 @@
     <update id="updateHistoryById">
         UPDATE user_order_history SET searchDate = #{searchDate} WHERE id = #{id}
     </update>
+    <update id="revertCoupon">
+        update cm_hehe_receive_coupon
+        set source  = 2,
+            status  = 1,
+            orderId =null,
+            useTime= null
+        where id = #{receiveCouponId}
+    </update>
 
     <delete id="deleteHistoryByUserId">
         DELETE FROM user_order_history
@@ -526,4 +534,7 @@
     <select id="findProductStatus" resultType="integer">
         SELECT validFlag FROM cm_hehe_product WHERE productId = #{productId}
     </select>
+    <select id="findOrderCoupon" resultType="java.lang.Integer">
+        select receiveCouponId from cm_hehe_coupon_order_record where orderId = #{orderId}
+    </select>
 </mapper>