Browse Source

订单售后最后商品改变订单状态

fubojin 3 weeks ago
parent
commit
9dda1c3224

+ 2 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/SimilarProdListVo.java

@@ -16,6 +16,8 @@ import lombok.Data;
 @Data
 public class SimilarProdListVo {
 
+    @ApiModelProperty("门店ID")
+    private Long shopId;
     @ApiModelProperty("商品spuID")
     private Long prodId;
     @ApiModelProperty("商品名")

+ 8 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundSkuMapper.java

@@ -13,10 +13,18 @@ package com.yami.shop.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yami.shop.bean.model.OrderRefundSku;
 import com.yami.shop.bean.vo.OrderRefundSkuVo;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
 public interface OrderRefundSkuMapper extends BaseMapper<OrderRefundSku> {
 
     List<OrderRefundSkuVo> selectByRefundId(Long refundId);
+
+    /**
+     * 根据订单项id查询
+     * @param orderItemId
+     * @return
+     */
+    List<OrderRefundSku> selectByOrderItemList(@Param("orderItemId") Long orderItemId);
 }

+ 1 - 0
yami-shop-service/src/main/java/com/yami/shop/service/OrderRefundService.java

@@ -190,6 +190,7 @@ public interface OrderRefundService extends IService<OrderRefund> {
      */
     HBR partRefund(JSONObject hBRequest);
 
+     void addOrderRefundRecord(Long refundId, Integer auditStatus, Integer sort, String instructions) ;
     /**
      * 创建退款结果接口-回调接口
      * @param hBRequest 海博请求参数

+ 56 - 15
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java

@@ -10,6 +10,7 @@ import com.yami.shop.bean.dto.hb.*;
 import com.yami.shop.bean.enums.*;
 import com.yami.shop.bean.model.*;
 import com.yami.shop.bean.param.OrderRefundParam;
+import com.yami.shop.bean.vo.OrderRefundSkuVo;
 import com.yami.shop.common.config.Constant;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.util.Arith;
@@ -32,6 +33,7 @@ import java.time.Instant;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.yami.shop.common.util.HttpUtil.post;
 
@@ -58,6 +60,7 @@ public class HBOrderService implements IHBOrderService {
     private final OrderRiderLocationMapper orderRiderLocationMapper;
     private final OrderRefundService orderRefundService;
     private final OrderService orderService;
+    private final OrderRefundSkuMapper orderRefundSkuMapper;
 
 
     public HBR addHBGoods(JSONObject hbRequest) {
@@ -213,26 +216,64 @@ public class HBOrderService implements IHBOrderService {
             List<OrderItem> listByOrderNumber = orderItemMapper.getListByOrderNumber(order.getOrderNumber());
             List<OrderRefundSku> orderRefundSkuList = new ArrayList<>();
             for (OrderItem orderItem : listByOrderNumber) {
-                OrderRefundSku orderRefundSku = new OrderRefundSku();
-                orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
-                orderRefundSku.setSkuId(orderItem.getSkuId());
-                orderRefundSku.setProductCount(orderItem.getProdCount());
-                orderRefundSku.setSkuPrice(orderItem.getPrice());
-                orderRefundSkuList.add(orderRefundSku);
+
+                // 查询该订单项的所有退款记录
+                List<OrderRefund> orderRefundList = orderRefundService.list(new LambdaQueryWrapper<OrderRefund>()
+                        .eq(OrderRefund::getOrderNumber, orderRefundParam.getOrderNumber())
+                        .eq(OrderRefund::getReturnMoneySts, 70)
+                        .eq(OrderRefund::getOrderItemId, orderItem.getOrderItemId()));
+
+                if (ObjectUtil.isNotEmpty(orderRefundList)) {
+                    // 计算该订单项已退款的总数量(通过退款单查询退款商品)
+                    List<OrderRefundSkuVo> orderRefundSkuVos = orderRefundSkuMapper.selectByRefundId(orderItem.getOrderItemId());
+                    Integer totalRefundedCount = orderRefundSkuVos.stream()
+                            .mapToInt(OrderRefundSkuVo::getProductCount)
+                            .sum();
+
+                    // 计算剩余可退款数量
+                    Integer remainingCount = orderItem.getProdCount() - totalRefundedCount;
+
+                    if (remainingCount > 0) {
+                        // 数量不同,添加剩余数量
+                        OrderRefundSku orderRefundSku = new OrderRefundSku();
+                        orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
+                        orderRefundSku.setSkuId(orderItem.getSkuId());
+                        orderRefundSku.setProductCount(remainingCount); // 设置剩余数量
+                        orderRefundSku.setSkuPrice(orderItem.getPrice());
+                        orderRefundSkuList.add(orderRefundSku);
+                    }
+                    // 如果remainingCount <= 0,说明已全部退款,不添加到列表
+                } else {
+                    // 没有退款记录,正常添加全部数量
+                    OrderRefundSku orderRefundSku = new OrderRefundSku();
+                    orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
+                    orderRefundSku.setSkuId(orderItem.getSkuId());
+                    orderRefundSku.setProductCount(orderItem.getProdCount());
+                    orderRefundSku.setSkuPrice(orderItem.getPrice());
+                    orderRefundSkuList.add(orderRefundSku);
+                }
+            }
+            if (ObjectUtil.isEmpty(orderRefundSkuList)){
+                return;
             }
             orderRefundParam.setOrderRefundSkuList(orderRefundSkuList);
 
-            OrderRefund orderRefund1 = orderRefundService.getOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderNumber, orderRefundParam.getOrderNumber()));
-            log.info(" 申请系统退款参数:{}", JSONObject.toJSONString(orderRefund1));
+            OrderRefund orderRefund1 = orderRefundService.getOne(new LambdaQueryWrapper<OrderRefund>()
+                    .eq(OrderRefund::getOrderNumber, orderRefundParam.getOrderNumber())
+                    .notIn(OrderRefund::getReturnMoneySts, Arrays.asList(30, 40, 70)));
+            log.info(" 申请系统退款未处理数据参数:{}", JSONObject.toJSONString(orderRefund1));
             if (ObjectUtil.isNotEmpty(orderRefund1)) {
-                orderRefund1.setReturnMoneySts(ReturnMoneyStsType.SUCCESS.value());
+                orderRefund1.setReturnMoneySts(ReturnMoneyStsType.REJECT.value());
                 orderRefundService.updateById(orderRefund1);
-                //退款单状态同步70
-                orderRefundService.changeStatus(orderRefund1.getRefundSn(), ReturnMoneyStsType.SUCCESS.value());
-            } else {
-                OrderRefund orderRefund = orderService.applyAgain(orderRefundParam, ReturnMoneyStsType.SUCCESS.value());
-                orderRefundService.createRefundOrder(order.getOrderNumber(), orderRefund.getRefundSn());
+                //退款单状态同步驳回
+                orderRefundService.changeStatus(orderRefund1.getRefundSn(), ReturnMoneyStsType.REJECT.value());
+
+                //生成流程记录
+                orderRefundService.addOrderRefundRecord( orderRefund1.getRefundId(), 20, 10,"驳回单个商家整单处理");
             }
+            OrderRefund orderRefund = orderService.applyAgain(orderRefundParam, ReturnMoneyStsType.SUCCESS.value());
+            orderRefundService.createRefundOrder(order.getOrderNumber(), orderRefund.getRefundSn());
+
 
         }
         //成功直接通知海博
@@ -449,7 +490,7 @@ public class HBOrderService implements IHBOrderService {
             orderPayment.setPaymentType(1002);
         } else if (order.getPayType() == 2) {
             orderPayment.setPaymentType(1001);
-        }else {
+        } else {
             orderPayment.setPaymentType(9999);
         }
 

+ 2 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java

@@ -1184,7 +1184,8 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         return HBR.success();
     }
 
-    private void addOrderRefundRecord(Long refundId, Integer auditStatus, Integer sort, String instructions) {
+    @Override
+    public void addOrderRefundRecord(Long refundId, Integer auditStatus, Integer sort, String instructions) {
         OrderRefundRecord orderRefundRecord = new OrderRefundRecord();
         orderRefundRecord.setOrderRefundId(refundId);
         orderRefundRecord.setInstructions(instructions);

+ 62 - 5
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -20,6 +20,7 @@ import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,6 +31,7 @@ import com.google.common.collect.Maps;
 import com.google.gson.internal.LinkedTreeMap;
 import com.yami.shop.bean.app.dto.OrderCountData;
 import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto;
+import com.yami.shop.bean.dto.hb.HBBaseReq;
 import com.yami.shop.bean.enums.*;
 import com.yami.shop.bean.event.CancelOrderEvent;
 import com.yami.shop.bean.event.ReceiptOrderEvent;
@@ -48,6 +50,7 @@ import com.yami.shop.service.OrderItemService;
 import com.yami.shop.service.OrderService;
 import com.yami.shop.service.OrderSettlementService;
 import com.yami.shop.utils.CullenUtils;
+import com.yami.shop.utils.HBSignUtil;
 import com.yami.shop.wx.po.RefundInfoPo;
 import com.yami.shop.wx.service.WxProviderService;
 import lombok.AllArgsConstructor;
@@ -73,6 +76,8 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.yami.shop.common.util.HttpUtil.post;
+
 /**
  * @author lgh on 2018/09/15.
  */
@@ -95,6 +100,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private final OrderSettlementMapper orderSettlementMapper;
     private Snowflake snowflake;
     private final OrderRefundSkuMapper orderRefundSkuMapper;
+    private final HBSignUtil hbSignUtil;
 
 
     @Override
@@ -959,12 +965,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 .eq(OrderRefund::getReturnMoneySts, 70)
                 .eq(OrderRefund::getHandler, Boolean.FALSE)
         );
-        //生成待商家审核记录
-        addOrderRefundRecord(orderRefund.getRefundId(), 25, 6, "平台已退款到微信账户中");
-        addOrderRefundRecord(orderRefund.getRefundId(), 30, 10, "商家已同意收货,正在为你处理退款。");
+        if (ObjectUtils.isNotEmpty(orderRefund)) {
+        Order order = orderMapper.selectById(orderRefund.getOrderId());
+
+            //生成待商家审核记录
+            addOrderRefundRecord(orderRefund.getRefundId(), 25, 6, "平台已退款到微信账户中");
+            addOrderRefundRecord(orderRefund.getRefundId(), 30, 10, "商家已同意收货,正在为你处理退款。");
+            //如果是分次退款最后一个商品需要改变订单状态
+            updateOrderStatus(order);
 
 
-        if (ObjectUtils.isNotEmpty(orderRefund)) {
             //退款的金额
             BigDecimal refundActual = BigDecimal.ZERO;
             //退款的积分
@@ -973,7 +983,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             long refundExpiredScore = 0L;
             //退款总积分
              Long refundOffsetPoints=0L;
-            Order order = orderMapper.selectById(orderRefund.getOrderId());
+
             if (null == order) throw new GlobalException("该订单不支持退款");
             //判定已完成的时间
             if (Objects.equals(order.getHbOrderStatus(), OrderStatus.SUCCESS.value()) && isPaymentOver7Days(order.getPayTime())) {
@@ -1236,6 +1246,53 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         }
     }
 
+    /**
+     * 退款成功后,修改订单状态
+     * @param order 订单
+     *              退款单
+     */
+    private void  updateOrderStatus(Order order) {
+        //定义变量是否需要通知海博改变订单状态
+        boolean status = true;
+        for (OrderItem orderItem : orderItemMapper.getListByOrderNumber(order.getOrderNumber())) {
+            List<OrderRefundSku> orderRefundSkus = orderRefundSkuMapper.selectByOrderItemList(orderItem.getOrderItemId());
+            if (ObjectUtils.isEmpty(orderRefundSkus)){
+                status = false;
+                break;
+            }
+            //统计orderRefundSkus里面商品数量
+            int refundCount = orderRefundSkus.stream().mapToInt(OrderRefundSku::getProductCount).sum();
+            if (!orderItem.getProdCount().equals(refundCount)) {
+                status = false;
+                break;
+            }
+        }
+
+        if (status){
+            order.setHbOrderStatus(OrderStatus.CLOSE.value());
+            orderMapper.updateById(order);
+            //通知海博改变订单状态
+                HBBaseReq<Object> build = HBBaseReq.create();
+                build.setAppId(hbSignUtil.getAppId());
+
+                // 3. 构建外层请求体
+                JSONObject requestBody = new JSONObject();
+                requestBody.put("channelOrderId", order.getOrderNumber());
+                requestBody.put("operator", "admin");
+                // 订单操作时间戳毫秒数
+                requestBody.put("operatorTime", System.currentTimeMillis());
+                //操作类型 (20:订单已接单 30:订单待配送 60:订单已取消 80:订单已完成)
+                requestBody.put("operatorType", OrderStatus.CLOSE.value());
+                // 4. 将整个JSON对象序列化为字符串并设置
+                build.setBody(JSON.toJSONString(requestBody));
+
+                build.setSign(hbSignUtil.signMd5(build));
+                log.info("post 订单推送单号参数:{}", JSON.toJSONString(build));
+                String post = post(hbSignUtil.getHBHost() + "/api/order/changeOrderStatus", build);
+                log.info("post 订单推送结果:{}", post);
+        }
+    }
+
     private void addOrderRefundRecord(Long refundId, Integer auditStatus, Integer sort, String instructions) {
         OrderRefundRecord orderRefundRecord = new OrderRefundRecord();
         orderRefundRecord.setOrderRefundId(refundId);

+ 2 - 4
yami-shop-service/src/main/resources/mapper/OrderRefundMapper.xml

@@ -409,11 +409,9 @@
         FROM tz_order_refund r
         WHERE r.`order_id` = #{orderId}
           --         买家撤回申请
-          AND r.`return_money_sts` != 6
+          AND r.`return_money_sts` != 40
           --         商家拒绝
-          AND r.`return_money_sts` != 7
-          --         退款关闭
-          AND r.`return_money_sts` != - 1
+          AND r.`return_money_sts` != 30
     </select>
     <select id="sumRefundSuccessPlatformAmountByOrderId" resultType="double">
         select ifnull(sum(platform_refund_amount), 0)

+ 7 - 0
yami-shop-service/src/main/resources/mapper/OrderRefundSkuMapper.xml

@@ -24,4 +24,11 @@
         where ork.order_refund_id = #{refundId}
     </select>
 
+    <select id="selectByOrderItemList" resultType="com.yami.shop.bean.model.OrderRefundSku">
+        SELECT rs.*
+        FROM tz_order_refund refund
+                 LEFT JOIN tz_order_refund_sku rs ON rs.order_refund_id = refund.refund_id
+        where refund.return_money_sts not in(30,40)  and rs.order_item_id = #{orderItemId}
+    </select>
+
 </mapper>

+ 2 - 2
yami-shop-service/src/main/resources/mapper/ProductMapper.xml

@@ -961,13 +961,13 @@
 
 
     <select id="similarProdList" resultType="com.yami.shop.bean.vo.SimilarProdListVo">
-        SELECT p.prod_id AS prodId,p.prod_name AS prodName,p.pic,min(cha.channel_prod_price) AS channelProdPrice,sum(ss.shop_sku_stocks) shopSkuStocks FROM tz_category_prod cp                                                                                                                                                                INNER JOIN tz_prod p on p.prod_id =  cp.prod_id
+        SELECT ss.shop_id AS shopId, p.prod_id AS prodId,p.prod_name AS prodName,p.pic,min(cha.channel_prod_price) AS channelProdPrice,sum(ss.shop_sku_stocks) shopSkuStocks FROM tz_category_prod cp                                                                                                                                                                INNER JOIN tz_prod p on p.prod_id =  cp.prod_id
                             LEFT JOIN tz_shop_sku ss on ss.spu_id =  cp.prod_id and ss.is_delete = 0
                             INNER JOIN tz_channel_prod cha on cha.sku_id = ss.sku_id and cha.is_delete = 0
         where  p.is_delete = 0 and cha.channel_id =  #{channelId} and
             cp.code in (select sc.code FROM tz_category_prod cp
                                                 LEFT JOIN tz_shop_category sc on  cp.code = sc.code
-                        WHERE  sc.level = 2 and cp.shop_id = #{shopId}  sc.is_delete = 0 and cp.is_delete = 0
+                        WHERE  sc.level = 2 and cp.shop_id = #{shopId} and sc.is_delete = 0 and cp.is_delete = 0
                           and  cp.prod_id = #{prodId}
                         GROUP BY sc.code)
         GROUP BY p.prod_id