瀏覽代碼

关单退回库存

刘俊驰 1 年之前
父節點
當前提交
c7fbae5080

+ 18 - 6
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -81,16 +81,28 @@ public class OmsOrderController {
     }
 
 
-    @ApiOperation("批量完成订单")
+    @ApiOperation("批量修改订单")
     @RequestMapping(value = "/update/success", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult success(@RequestBody @Validated OmsOrderWrapper.OrderStatusUpdate orderStatusUpdate) {
 
-         int count = orderService.updateStatus(orderStatusUpdate);
-        // if (count > 0) {
-        //     return CommonResult.success(count);
-        // }
-        return CommonResult.success(true);
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_REFUND_ORDER_MALL + ":delivery");
+        try {
+            boolean b = lock.tryLock(60, 60, TimeUnit.SECONDS);
+            if (b) {
+                int count = orderService.updateStatus(orderStatusUpdate);
+                if (count > 0) {
+                    return CommonResult.success(count);
+                }
+            }
+        } catch (InterruptedException e) {
+            log.error("批量修改订单", e);
+        } finally {
+            if (lock.getHoldCount() >0) {
+                lock.unlock();
+            }
+        }
+        return CommonResult.success(false);
     }
 
 

+ 61 - 3
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.admin.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.google.common.collect.Lists;
 import com.ym.mec.common.dto.SchoolDto;
@@ -25,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -202,16 +204,19 @@ public class OmsOrderServiceImpl implements OmsOrderService {
         List<PmsProductSkuStockRecord> updateList = new ArrayList<>();
         Map<String, List<OmsOrderItem>> map = omsOrderItems.stream().collect(Collectors.groupingBy(o -> o.getOrderSn()));
         List<OrderSkuSync> skuSyncList = new ArrayList<>();
+        List<OmsOrderItem> updateItems = new ArrayList<>();
         map.forEach((sn,v) -> {
             OrderSkuSync skuSync = new OrderSkuSync();
             skuSync.setOrderNo(sn);
             List<OrderSkuSync.SkuSync> skuSyncs = new ArrayList<>();
             skuSync.setSkuSyncList(skuSyncs);
             v.stream().forEach(o -> {
+
                 List<PmsProductSkuStockRecord> skuStockRecords = skuStockRecordMap.get(o.getProductSkuId());
                 if (CollectionUtils.isEmpty(skuStockRecords)) {
                     throw new BizException(skuMap.get(o.getProductSkuId()) +"库存不足");
                 }
+                List<OrderSkuSync.SkuSync> itemSkus = new ArrayList<>();
                 int count1 = o.getProductQuantity();
                 // 扣减内部库存
                 for (PmsProductSkuStockRecord skuStockRecord : skuStockRecords) {
@@ -242,6 +247,7 @@ public class OmsOrderServiceImpl implements OmsOrderService {
                             }
                             updateList.add(record);
                             skuSyncs.add(sync);
+                            itemSkus.add(sync);
                         }
                     }
                 }
@@ -273,23 +279,34 @@ public class OmsOrderServiceImpl implements OmsOrderService {
                             }
                             updateList.add(record);
                             skuSyncs.add(sync);
+                            itemSkus.add(sync);
                         }
                     }
                 }
                 if (count1 > 0) {
                     throw new BizException(skuMap.get(o.getProductSkuId())+"库存不足");
                 }
+                if (CollUtil.isNotEmpty(itemSkus)) {
+
+                    OmsOrderItem orderItem = new OmsOrderItem();
+                    orderItem.setId(o.getId());
+                    orderItem.setStockJson(JSON.toJSONString(itemSkus));
+                    updateItems.add(orderItem);
+                }
             });
             skuSyncList.add(skuSync);
         });
         for (PmsProductSkuStockRecord pmsProductSkuStockRecord : updateList) {
             pmsProductSkuStockRecordMapper.updateByPrimaryKeySelective(pmsProductSkuStockRecord);
         }
+        // 更新订单详情
+        for (OmsOrderItem updateItem : updateItems) {
+            omsOrderItemMapper.updateByPrimaryKeySelective(updateItem);
+        }
 
         // 调用三方发货通知接口
         OmsOrderExample orderExample = new OmsOrderExample();
         orderExample.createCriteria().andIdIn(orderIds);
-        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
         try {
             HttpResponseResult httpResponseResult = webFeignService.updateShippedStatus(skuSyncList);
             if (httpResponseResult.getCode() != 200 && !httpResponseResult.getStatus()) {
@@ -813,13 +830,54 @@ public class OmsOrderServiceImpl implements OmsOrderService {
     @Transactional
     public int updateStatus(OmsOrderWrapper.OrderStatusUpdate orderStatusUpdate) {
 
+
+        // 如果时关单 并且 是已发货状态 则需要退回库存
+        OmsOrderExample orderExample = new OmsOrderExample();
+        orderExample.createCriteria().andIdIn(orderStatusUpdate.getIds());
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        List<Long> orderIds = omsOrders.stream().filter(o -> o.getStatus() == 2 || o.getStatus() == 3)
+            .map(OmsOrder::getId).collect(Collectors.toList());
+        if (orderStatusUpdate.getStatus() ==4 && !CollectionUtils.isEmpty(orderIds)) {
+            OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
+            orderItemExample.createCriteria().andOrderIdIn(orderIds);
+            List<OmsOrderItem> omsOrderItems = omsOrderItemMapper.selectByExample(orderItemExample);
+            List<String> stockJsons = omsOrderItems.stream().map(OmsOrderItem::getStockJson)
+                .filter(o ->!StringUtils.isEmpty(o)).collect(Collectors.toList());
+            List<OrderSkuSync.SkuSync> skuSyncList = new ArrayList<>();
+            for (String stockJson : stockJsons) {
+                List<OrderSkuSync.SkuSync> skuSyncs = JSON.parseArray(stockJson, OrderSkuSync.SkuSync.class);
+                skuSyncList.addAll(skuSyncs);
+            }
+            Map<Long, Integer> internalMap = skuSyncList.stream().filter(o -> "INTERNAL".equals(o.getType()))
+                .collect(Collectors.groupingBy(OrderSkuSync.SkuSync::getRecordId, Collectors.summingInt(OrderSkuSync.SkuSync::getCount)));
+            Map<Long, Integer> taxMap = skuSyncList.stream().filter(o -> "TAX".equals(o.getType()))
+                .collect(Collectors.groupingBy(OrderSkuSync.SkuSync::getRecordId, Collectors.summingInt(OrderSkuSync.SkuSync::getCount)));
+            List<PmsProductSkuStockRecord> updateList = new ArrayList<>();
+            for (Map.Entry<Long, Integer> entry : internalMap.entrySet()) {
+                PmsProductSkuStockRecord skuStockRecord = new PmsProductSkuStockRecord();
+                skuStockRecord.setId(entry.getKey());
+                skuStockRecord.setInternalSaleStock(entry.getValue());
+                updateList.add(skuStockRecord);
+            }
+            for (Map.Entry<Long, Integer> entry : taxMap.entrySet()) {
+                PmsProductSkuStockRecord skuStockRecord = new PmsProductSkuStockRecord();
+                skuStockRecord.setId(entry.getKey());
+                skuStockRecord.setTaxSaleStock(entry.getValue());
+                updateList.add(skuStockRecord);
+            }
+            for (PmsProductSkuStockRecord pmsProductSkuStockRecord : updateList) {
+                pmsProductSkuStockRecordMapper.updateStock(pmsProductSkuStockRecord);
+            }
+
+
+        }
+
         OmsOrder record = new OmsOrder();
         record.setStatus(orderStatusUpdate.getStatus());
         OmsOrderExample example = new OmsOrderExample();
-        example.createCriteria().andDeleteStatusEqualTo(0).andIdIn(orderStatusUpdate.getIds());
+        example.createCriteria().andIdIn(orderStatusUpdate.getIds());
         orderMapper.updateByExampleSelective(record, example);
 
-
         //添加操作记录
         List<OmsOrderOperateHistory> operateHistoryList = orderStatusUpdate.getIds().stream()
             .map(id -> {

+ 2 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductSkuStockRecordMapper.java

@@ -32,4 +32,6 @@ public interface PmsProductSkuStockRecordMapper {
     int lockStock(@Param("stockRecordIds") List<Long> stockRecordIds);
 
     int updateByIdAndStockSelective( PmsProductSkuStockRecord pmsProductSkuStockRecord);
+
+    void updateStock(@Param("record") PmsProductSkuStockRecord pmsProductSkuStockRecord);
 }

+ 10 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderItem.java

@@ -71,6 +71,16 @@ public class OmsOrderItem implements Serializable {
 
     private BigDecimal precisionAmount;
 
+    private String stockJson;
+
+    public String getStockJson() {
+        return stockJson;
+    }
+
+    public void setStockJson(String stockJson) {
+        this.stockJson = stockJson;
+    }
+
     private static final long serialVersionUID = 1L;
 
     public BigDecimal getPrecisionAmount() {

+ 18 - 3
mec-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml

@@ -27,6 +27,7 @@
     <result column="promoter_id" jdbcType="INTEGER" property="promoterId" />
     <result column="share_proportion_" jdbcType="INTEGER" property="shareProportion" />
     <result column="precision_amount" jdbcType="INTEGER" property="precisionAmount" />
+    <result column="stock_json" jdbcType="VARCHAR" property="stockJson" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -90,7 +91,7 @@
     id, order_id, order_sn, product_id, product_pic, product_name, product_brand, product_sn, 
     product_price, product_quantity, product_sku_id, product_sku_code, product_category_id, 
     promotion_name, promotion_amount, coupon_amount, integration_amount, real_amount, 
-    gift_integration, gift_growth, product_attr,promoter_id,share_proportion_,precision_amount
+    gift_integration, gift_growth, product_attr,promoter_id,share_proportion_,precision_amount,stock_json
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItemExample" resultMap="BaseResultMap">
     select a.*,if(oora.status is null,-1,oora.status) as returnStatus from  (
@@ -134,14 +135,14 @@
       product_sku_id, product_sku_code, product_category_id, 
       promotion_name, promotion_amount, coupon_amount, 
       integration_amount, real_amount, gift_integration, 
-      gift_growth, product_attr,promoter_id,share_proportion_,precision_amount)
+      gift_growth, product_attr,promoter_id,share_proportion_,precision_amount,stock_json)
     values (#{orderId,jdbcType=BIGINT}, #{orderSn,jdbcType=VARCHAR}, #{productId,jdbcType=BIGINT}, 
       #{productPic,jdbcType=VARCHAR}, #{productName,jdbcType=VARCHAR}, #{productBrand,jdbcType=VARCHAR}, 
       #{productSn,jdbcType=VARCHAR}, #{productPrice,jdbcType=DECIMAL}, #{productQuantity,jdbcType=INTEGER}, 
       #{productSkuId,jdbcType=BIGINT}, #{productSkuCode,jdbcType=VARCHAR}, #{productCategoryId,jdbcType=BIGINT}, 
       #{promotionName,jdbcType=VARCHAR}, #{promotionAmount,jdbcType=DECIMAL}, #{couponAmount,jdbcType=DECIMAL}, 
       #{integrationAmount,jdbcType=DECIMAL}, #{realAmount,jdbcType=DECIMAL}, #{giftIntegration,jdbcType=INTEGER}, 
-      #{giftGrowth,jdbcType=INTEGER}, #{productAttr,jdbcType=VARCHAR},#{promoterId},#{shareProportion},#{precisionAmount})
+      #{giftGrowth,jdbcType=INTEGER}, #{productAttr,jdbcType=VARCHAR},#{promoterId},#{shareProportion},#{precisionAmount},#{stockJson})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItem">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -218,6 +219,9 @@
       <if test="precisionAmount != null">
         precision_amount,
       </if>
+        <if test="stockJson != null">
+        stock_json,
+        </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="orderId != null">
@@ -289,6 +293,9 @@
       <if test="precisionAmount != null">
         #{precisionAmount},
       </if>
+        <if test="stockJson != null">
+        #{stockJson,jdbcType=VARCHAR},
+        </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItemExample" resultType="java.lang.Long">
@@ -372,6 +379,9 @@
       <if test="record.precisionAmount != null">
         precision_amount = #{record.precisionAmount,jdbcType=VARCHAR},
       </if>
+        <if test="record.stockJson != null">
+        stock_json = #{record.stockJson,jdbcType=VARCHAR},
+        </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -402,6 +412,7 @@
       promoter_id = #{record.promoterId,jdbcType=INTEGER},
       share_proportion_ = #{record.shareProportion},
       precision_amount = #{record.precisionAmount},
+        stock_json = #{record.stockJson},
       product_attr = #{record.productAttr,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -479,6 +490,9 @@
       <if test="precisionAmount != null">
         precision_amount = #{precisionAmount,jdbcType=VARCHAR},
       </if>
+        <if test="stockJson != null">
+        stock_json = #{stockJson,jdbcType=VARCHAR},
+        </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -506,6 +520,7 @@
       promoter_id = #{promoterId,jdbcType=INTEGER},
     share_proportion_ = #{shareProportion},
     precision_amount = #{precisionAmount},
+    stock_json = #{stockJson},
       product_attr = #{productAttr,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>

+ 15 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductSkuStockRecordMapper.xml

@@ -361,4 +361,19 @@
       </set>
       where id = #{id,jdbcType=BIGINT} and internal_sale_stock = 0 and tax_sale_stock = 0
     </update>
+
+  <update id="updateStock">
+
+        update pms_product_sku_stock_record
+        <set>
+            <if test="record.internalSaleStock != null">
+                internal_sale_stock = internal_sale_stock - #{record.internalSaleStock},
+            </if>
+            <if test="record.taxSaleStock != null">
+                tax_sale_stock = tax_sale_stock -#{record.taxSaleStock}
+            </if>
+        </set>
+
+        where id = #{record.id}
+    </update>
 </mapper>