瀏覽代碼

sku购物车

zhijiezhao 2 年之前
父節點
當前提交
c2aefd727c

+ 15 - 0
src/main/java/com/caimei365/order/controller/CartClubApi.java

@@ -29,6 +29,21 @@ public class CartClubApi {
 
     private final CartClubService cartClubService;
 
+    @ApiOperation("购物车重选商品sku")
+    @GetMapping("/check/sku")
+    public ResponseJson checkOldCart(Integer oldSkuId, Integer userId, Integer newSkuId, Integer count) {
+        if (null == userId) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        if (null == count) {
+            return ResponseJson.error("购买数量不能为空!", null);
+        }
+        if (null == oldSkuId || null == newSkuId) {
+            return ResponseJson.error("skuId不能为空!", null);
+        }
+        return cartClubService.checkSkuId(userId, oldSkuId, newSkuId, count);
+    }
+
     /**
      * 购物车列表详细数据
      */

+ 2 - 0
src/main/java/com/caimei365/order/mapper/CartClubMapper.java

@@ -106,4 +106,6 @@ public interface CartClubMapper {
      * 会员机构类型:1医美,2生美
      */
     Integer getClubTypeById(Integer userId);
+
+    void deleteCartSku(@Param("userId") Integer userId, @Param("oldSkuId") Integer oldSkuId);
 }

+ 2 - 0
src/main/java/com/caimei365/order/mapper/OrderClubMapper.java

@@ -346,4 +346,6 @@ public interface OrderClubMapper {
     void updateCodeCoupon(CouponRecordPo couponRecordPo);
 
     OrderParamBo findUserName(Integer userId);
+
+    List<Sku> findSkus(Integer productId);
 }

+ 2 - 0
src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java

@@ -173,5 +173,7 @@ public interface OrderCommonMapper {
     String findWeChatFlag(String splitCode,Integer shopId);
 
     Integer findPayB2BRecord(Integer shopOrderId);
+
+    Integer findMaxStock(Integer productId);
 }
 

+ 4 - 0
src/main/java/com/caimei365/order/model/vo/CartItemVo.java

@@ -19,6 +19,10 @@ public class CartItemVo implements Serializable {
      * 赠品skuId
      */
     private Integer giftSkuId;
+    /**
+     * skus
+     */
+    private List<Sku> skus;
     /**
      * 购物车的商品skuId
      */

+ 70 - 0
src/main/java/com/caimei365/order/model/vo/Sku.java

@@ -0,0 +1,70 @@
+package com.caimei365.order.model.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zzj
+ */
+@Data
+public class Sku {
+
+    /**
+     * 划线价格
+     */
+    private Double originalPrice;
+    /**
+     * 最大购买量
+     */
+    private Integer maxBuyNumber;
+    /**
+     * 计算后价格等级
+     */
+    private Integer priceGrade;
+    /**
+     * 是否复购 0否 1是
+     */
+    private Integer repurchaseFlag;
+    /**
+     * 启用阶梯价格标识 0否 1是
+     */
+    private Integer ladderPriceFlag;
+    /**
+     * 比例成本百分比
+     */
+    private Double costProportional;
+    /**
+     * 成本价选中标志:1固定成本 2比例成
+     */
+    private Integer costCheckFlag;
+
+    private Integer skuId;
+    /**
+     * 起订量
+     */
+    private Integer minBuyNumber;
+    /**
+     * 成本价
+     */
+    private Double costPrice;
+    /**
+     * 库存
+     */
+    private Integer stock;
+    /**
+     * 机构价格
+     */
+    private Double price;
+    /**
+     * 市场价
+     */
+    private Double normalPrice;
+    /**
+     * 包装规格
+     */
+    private String unit;
+}

+ 20 - 13
src/main/java/com/caimei365/order/service/CartClubService.java

@@ -17,6 +17,7 @@ public interface CartClubService {
 
     /**
      * 购物车列表详细数据
+     *
      * @param userId 用户Id
      * @param source 来源 : 1 网站 ; 2 小程序
      */
@@ -24,6 +25,7 @@ public interface CartClubService {
 
     /**
      * 网站顶部购物车数据
+     *
      * @param userId 用户Id
      */
     ResponseJson<Map<String, Object>> getShoppingCartHead(Integer userId);
@@ -35,7 +37,7 @@ public interface CartClubService {
      *                userId       用户ID
      *                productId    商品id
      *                productCount 商品数量
-     * }
+     *                }
      */
     ResponseJson<Integer> addShoppingCart(CartDto cartDto);
 
@@ -45,10 +47,10 @@ public interface CartClubService {
      * @param cartDto {
      *                userId       用户ID
      *                productInfo  商品及数量信息:[   // 商品id,数量
-     *                                          {"productId": 2789, "productCount": 1},
-     *                                          {"productId": 2790, "productCount": 1}
-     *                                          ]
-     * }
+     *                {"productId": 2789, "productCount": 1},
+     *                {"productId": 2790, "productCount": 1}
+     *                ]
+     *                }
      */
     ResponseJson<Integer> addShoppingCartBulk(CartDto cartDto);
 
@@ -59,7 +61,7 @@ public interface CartClubService {
      *                userId       用户ID
      *                productId    商品id
      *                productCount 商品数量
-     * }
+     *                }
      */
     ResponseJson<Integer> updateShoppingCart(CartDto cartDto);
 
@@ -69,15 +71,15 @@ public interface CartClubService {
      * @param cartDto {
      *                userId       用户ID
      *                productIds   商品ids,逗号隔开
-     * }
+     *                }
      */
     ResponseJson<Integer> deleteShoppingCart(CartDto cartDto);
 
     /**
      * 购物车结算
      *
-     * @param  userId       用户ID
-     * @param  skuIds   skuIds,逗号隔开
+     * @param userId 用户ID
+     * @param skuIds skuIds,逗号隔开
      * @param source 来源 : 1 网站 ; 2 小程序
      */
     ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, String skuIds, Integer source);
@@ -90,20 +92,22 @@ public interface CartClubService {
      *                productId    商品id
      *                productCount 商品数量
      *                source       来源 : 1 网站 ; 2 小程序
-     * }
+     *                }
      */
     ResponseJson<Map<String, Object>> buyNowProduct(CartDto cartDto);
 
     /**
      * 获取结算商品运费
-     * @param  userId       用户ID
-     * @param  productIds   商品ids,逗号隔开
-     * @param townId        地区Id
+     *
+     * @param userId     用户ID
+     * @param productIds 商品ids,逗号隔开
+     * @param townId     地区Id
      */
     ResponseJson<Map<String, Object>> getProductsPostage(Integer userId, String productIds, Integer townId);
 
     /**
      * 获取用户发票信息
+     *
      * @param userId 用户Id
      */
     ResponseJson<InvoiceVo> getUserInvoice(Integer userId);
@@ -143,8 +147,11 @@ public interface CartClubService {
 
     /**
      * 组合商品立即购买
+     *
      * @param
      * @return
      */
     ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, String productInfo, Integer source);
+
+    ResponseJson checkSkuId(Integer userId, Integer oldSkuId, Integer newSkuId, Integer count);
 }

+ 24 - 11
src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java

@@ -19,9 +19,11 @@ import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.AtomicDouble;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.aspectj.weaver.ast.Var;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import redis.clients.jedis.Jedis;
 
 import javax.annotation.Resource;
@@ -153,6 +155,7 @@ public class CartClubServiceImpl implements CartClubService {
                 Iterator<CartItemVo> productIterator = productList.iterator();
                 while (productIterator.hasNext()) {
                     CartItemVo cartItemVo = productIterator.next();
+                    cartItemVo.setSkus(orderClubMapper.findSkus(cartItemVo.getProductId()));
                     // 设置商品图片及税费
                     boolean taxFlag = productService.setCartItemImgAndTax(cartItemVo);
                     // 商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
@@ -170,8 +173,9 @@ public class CartClubServiceImpl implements CartClubService {
                         cartItemVo.setIsChecked(false);
                         // 价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
                         boolean priceVisible = (cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1));
-                        // 是否库存充足
-                        boolean isStocked = (cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber());
+                        // 是否库存充足  只看所有sku的stock是否为0
+//                        boolean isStocked = (cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber());
+                        boolean isStocked = orderCommonMapper.findMaxStock(cartItemVo.getProductId()) > 0;
                         if (priceVisible && isStocked) {
                             if (1 == cartItemVo.getSvipProductFlag()) {
                                 // 超级会员优惠商品,不参与促销活动(普通机构购买该商品可参与店铺促销)/阶梯价/复购价
@@ -672,7 +676,8 @@ public class CartClubServiceImpl implements CartClubService {
         return ResponseJson.success("添加成功!返回购物车数量", cartCount);
     }
 
-    private void saveShoppingCart(CartDto cartDto) {
+    @Transactional(rollbackFor = Exception.class)
+    public void saveShoppingCart(CartDto cartDto) {
         CartPo cart = cartClubMapper.getCartPo(cartDto);
         if (cart != null) {
             // 购物车已存在该商品,更新数量
@@ -683,11 +688,8 @@ public class CartClubServiceImpl implements CartClubService {
             // 添加新购物车
             cart = new CartPo();
             cart.setUserId(cartDto.getUserId());
-            cart.setProductId(cartDto.getProductId());
             cart.setProductCount(cartDto.getProductCount());
             cart.setSkuId(cartDto.getSkuId());
-            Integer shopId = baseMapper.getShopIdByproductId(cartDto.getProductId());
-            cart.setShopId(shopId);
             //判断是否是再次购买  由商品id改为skuid
             Double repurchase = baseMapper.getRepurchasePrice(cartDto.getSkuId(), cartDto.getUserId());
             if (null != repurchase && repurchase > 0) {
@@ -843,9 +845,9 @@ public class CartClubServiceImpl implements CartClubService {
     /**
      * 购物车结算
      *
-     * @param userId     用户ID
-     * @param skuIds     skuIds,逗号隔开
-     * @param source     来源 : 1 网站 ; 2 小程序
+     * @param userId 用户ID
+     * @param skuIds skuIds,逗号隔开
+     * @param source 来源 : 1 网站 ; 2 小程序
      */
     @Override
     public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, String skuIds, Integer source) {
@@ -1202,7 +1204,7 @@ public class CartClubServiceImpl implements CartClubService {
      * 组合商品立即购买
      *
      * @param userId      用户ID
-     * @param productInfo 组合商品信息:Json字符串格式[{"id":4351,"count":1},{}]
+     * @param productInfo 组合商品信息:Json字符串格式[{"id":4351,"count":1,"skuId":123},{}]
      * @param source      来源 : 1 网站 ; 2 小程序
      * @return
      */
@@ -1301,7 +1303,7 @@ public class CartClubServiceImpl implements CartClubService {
                     // 供应商下商品列表
                     // 过滤保存已上架商品
                     List<CartItemVo> productList = cartClubMapper.getProductsByShopIdAndProductIds(shop.getShopId(), finalIdList);
-                    productList.forEach(p -> p.setNumber(productInfos.get(p.getProductId().toString())));
+                    productList.forEach(p -> p.setNumber(productInfos.get(p.getSkuId().toString())));
                     if (null != productList && productList.size() > 0) {
                         // 去除不可见商品,visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
                         productList.removeIf(cartItemVo -> !(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility() == 2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1)));
@@ -1566,6 +1568,17 @@ public class CartClubServiceImpl implements CartClubService {
         return ResponseJson.success(resultData);
     }
 
+    @Override
+    public ResponseJson checkSkuId(Integer userId, Integer oldSkuId, Integer newSkuId, Integer count) {
+        cartClubMapper.deleteCartSku(userId, oldSkuId);
+        CartDto cartDto = new CartDto();
+        cartDto.setUserId(userId);
+        cartDto.setSkuId(newSkuId);
+        cartDto.setProductCount(count);
+        saveShoppingCart(cartDto);
+        return ResponseJson.success();
+    }
+
     /**
      * 立即购买
      *

+ 10 - 2
src/main/resources/mapper/CartClubMapper.xml

@@ -220,14 +220,16 @@
     <update id="updateCart" parameterType="com.caimei365.order.model.po.CartPo">
         UPDATE cm_cart
         set productCount = #{productCount},
-            addTime      = #{addTime}
+            addTime      = #{addTime},
+            productId    = (select productId from cm_sku where skuId = #{skuId}),
+            shopId       = (select shopId from product p left join cm_sku cs on p.productId=cs.productId where cs.skuId=#{skuId})
         WHERE userID = #{userId}
           AND skuId = #{skuId}
     </update>
     <insert id="insertCart" keyColumn="cm_cartID" keyProperty="id" parameterType="com.caimei365.order.model.po.CartPo"
             useGeneratedKeys="true">
         INSERT INTO cm_cart (skuId, shopID, productID, userID, productCount, addTime, reBuyFlag)
-        VALUES (#{skuId}, #{shopId}, #{productId}, #{userId}, #{productCount}, #{addTime}, #{reBuyFlag})
+        VALUES (#{skuId}, #{shopId}, (select productId from cm_sku where skuId = #{skuId}), #{userId}, #{productCount}, #{addTime}, #{reBuyFlag})
     </insert>
     <delete id="deleteCartByProductIds">
         DELETE FROM cm_cart
@@ -242,6 +244,12 @@
         from cm_user_invoiceinfo
         where userId = #{userId}
     </delete>
+    <delete id="deleteCartSku">
+        delete
+        from cm_cart
+        where skuId = #{oldSkuId}
+          and userId = #{userId}
+    </delete>
     <insert id="insertUserInvoice">
         INSERT INTO cm_user_invoiceinfo (userId, invoiceTitle, corporationTaxNum,
                                          registeredAddress, registeredPhone, bankAccountNo, openBank)

+ 15 - 0
src/main/resources/mapper/OrderClubMapper.xml

@@ -731,4 +731,19 @@
         from user
         where userId = #{userId}
     </select>
+    <select id="findSkus" resultType="com.caimei365.order.model.vo.Sku">
+        select skuId,
+               price,
+               normalPrice,
+               costPrice,
+               ifnull(ladderPriceFlag,0) as ladderPriceFlag,
+               costCheckFlag,
+               costProportional,
+               stock,
+               unit,
+               minBuyNumber
+        from cm_sku
+        where productId = #{productId}
+        ORDER BY price ASC
+    </select>
 </mapper>

+ 37 - 22
src/main/resources/mapper/OrderCommonMapper.xml

@@ -493,7 +493,8 @@
         </if>
         <if test="userId >0">
             if(#{registerTime} <![CDATA[ > ]]> startDate,#{registerTime},startDate) as startDate,
-            if(useTimeFlag=1 or receiveFlag=1,endDate,date_add(if(#{registerTime} <![CDATA[ > ]]> startDate and #{registerTime}
+            if(useTimeFlag=1 or receiveFlag=1,endDate,date_add(if(#{registerTime} <![CDATA[ > ]]> startDate and
+            #{registerTime}
             <![CDATA[ < ]]> endDate,#{registerTime},startDate),interval receivePeriod day)) as endDate,
         </if>
         couponType,
@@ -523,15 +524,16 @@
         ORDER BY createDate DESC
     </select>
     <select id="getClubCouponList" resultType="com.caimei365.order.model.vo.CouponVo">
-        SELECT a.id                                                                              AS clubCouponId,
-               cc.id                                                                             AS couponId,
+        SELECT a.id                                                  AS clubCouponId,
+               cc.id                                                 AS couponId,
                cc.couponAmount,
                cc.touchPrice,
                cc.moneyCouponFlag,
                cc.moneyCouponPrice,
                cc.moneyCouponType,
-               if(cc.vipFlag = 1, cc.startDate, a.createDate)                                    as startDate,
-               if(cc.useTimeFlag = 1 or cc.vipFlag = 1, cc.endDate, date_add(a.createDate, interval cc.usePeriod day)) as endDate,
+               if(cc.vipFlag = 1, cc.startDate, a.createDate)        as startDate,
+               if(cc.useTimeFlag = 1 or cc.vipFlag = 1, cc.endDate,
+                  date_add(a.createDate, interval cc.usePeriod day)) as endDate,
                cc.couponType,
                cc.userId,
                cc.shopId,
@@ -540,13 +542,14 @@
                cc.couponPayWay
         FROM cm_coupon_club a
                  LEFT JOIN cm_coupon cc ON a.couponId = cc.id
-        WHERE if(cc.moneyCouponFlag=2,cc.delFlag = 0,cc.id>0)
+        WHERE if(cc.moneyCouponFlag = 2, cc.delFlag = 0, cc.id > 0)
           AND a.delFlag = 0
           AND a.userId = #{userId}
           AND a.status = 1
           AND if(cc.vipFlag = 1,
                  NOW() BETWEEN cc.startDate AND cc.endDate,
-                 NOW() BETWEEN a.createDate AND if(cc.usePeriod is null,cc.endDate,date_add(a.createDate, interval cc.usePeriod day)))
+                 NOW() BETWEEN a.createDate AND if(cc.usePeriod is null, cc.endDate,
+                                                   date_add(a.createDate, interval cc.usePeriod day)))
           AND cc.status != 2
         ORDER BY a.createDate DESC
     </select>
@@ -616,15 +619,15 @@
         ORDER BY cdr.receiptDate DESC
     </select>
     <select id="getShopOrderByOrderId" resultType="com.caimei365.order.model.vo.ShopOrderVo">
-        SELECT cop.shopOrderID AS shopOrderId,
+        SELECT cop.shopOrderID                  AS shopOrderId,
                cop.shopOrderNo,
-               cop.orderID     AS orderId,
+               cop.orderID                      AS orderId,
                cop.orderNo,
-               cop.shopID      AS shopId,
+               cop.shopID                       AS shopId,
                cop.note,
-               cop.userID      AS userId,
-               cop.clubID      AS clubId,
-               cop.spID        AS spId,
+               cop.userID                       AS userId,
+               cop.clubID                       AS clubId,
+               cop.spID                         AS spId,
                cop.orderPromotionsId,
                cop.promotionFullReduction,
                cop.brokerage,
@@ -646,8 +649,8 @@
                cop.receiptAmount,
                cop.receiptStatus,
                cop.splitCode,
-               ifnull(cop.paySuccessCounter,0) as paySuccessCounter,
-               p.name          as shopName
+               ifnull(cop.paySuccessCounter, 0) as paySuccessCounter,
+               p.name                           as shopName
         FROM cm_shop_order cop
                  left join shop p on cop.shopID = p.shopID
         WHERE delFlag = 0
@@ -713,17 +716,29 @@
         where shopOrderID = #{shopOrderId}
     </select>
     <select id="findEachDiscount" resultType="java.lang.Double">
-        select eachDiscount from cm_shop_order where shopOrderID = #{shopOrderId}
+        select eachDiscount
+        from cm_shop_order
+        where shopOrderID = #{shopOrderId}
     </select>
     <select id="findWeChatFlag" resultType="java.lang.String">
-        SELECT ifnull(weChatFlag,0) FROM cm_shop_splitcode
+        SELECT ifnull(weChatFlag, 0)
+        FROM cm_shop_splitcode
         WHERE commercialCode = #{splitCode}
-        and shopId = #{shopId}
+          and shopId = #{shopId}
     </select>
     <select id="findPayB2BRecord" resultType="java.lang.Integer">
-        SELECT COUNT(*) FROM cm_receipt_order_relation cror
-        LEFT JOIN cm_discern_receipt cdr ON cror.receiptID=cdr.id
-        WHERE cdr.payway=1 AND cdr.payType=12
-        AND cror.shopOrderId = #{shopOrderId}
+        SELECT COUNT(*)
+        FROM cm_receipt_order_relation cror
+                 LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        WHERE cdr.payway = 1
+          AND cdr.payType = 12
+          AND cror.shopOrderId = #{shopOrderId}
+    </select>
+    <select id="findMaxStock" resultType="java.lang.Integer">
+        SELECT stock
+        FROM cm_sku
+        WHERE productId = #{productId}
+        ORDER BY stock DESC
+        LIMIT 1
     </select>
 </mapper>