Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

wangming 1 týždeň pred
rodič
commit
26ca8dae53
31 zmenil súbory, kde vykonal 805 pridanie a 163 odobranie
  1. 2 2
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java
  2. 1 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderRefundController.java
  3. 13 0
      yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java
  4. 2 2
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java
  5. 129 13
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  6. 2 2
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java
  7. 14 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/hb/OrderPaymentRequest.java
  8. 22 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/hb/ProductRequest.java
  9. 2 25
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/hb/ThirdPartyRefundRequest.java
  10. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java
  11. 6 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java
  12. 44 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefundSku.java
  13. 2 2
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java
  14. 1 0
      yami-shop-multishop/src/main/java/com/yami/shop/multishop/controller/OrderController.java
  15. 2 3
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRechargeController.java
  16. 28 15
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderController.java
  17. 49 2
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderRefundController.java
  18. 1 0
      yami-shop-platform/src/main/resources/application.yml
  19. 27 0
      yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundSkuMapper.java
  20. 2 0
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java
  21. 38 1
      yami-shop-service/src/main/java/com/yami/shop/service/OrderRefundService.java
  22. 5 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBOrderService.java
  23. 11 9
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java
  24. 9 1
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java
  25. 297 24
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java
  26. 63 53
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java
  27. 3 3
      yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRechargeServiceImpl.java
  28. 3 3
      yami-shop-service/src/main/java/com/yami/shop/utils/HBSignUtil.java
  29. 1 1
      yami-shop-service/src/main/resources/mapper/PointsFailureRecordMapper.xml
  30. 1 1
      yami-shop-service/src/main/resources/mapper/PointsRechargeMapper.xml
  31. 19 0
      yami-shop-service/src/main/resources/mapper/PointsRecordMapper.xml

+ 2 - 2
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java

@@ -240,7 +240,7 @@ public class OrderController {
     @PostMapping("/submit")
     @ApiOperation(value = "提交订单,返回支付流水号", notes = "根据传入的参数判断是否为购物车提交订单,同时对购物车进行删除,用户开始进行支付")
     public ResponseEntity<OrderNumbersDto> submitOrders(@Valid @RequestBody SubmitOrderParam submitOrderParam) {
-        //TODO wangjian 扣减积分,先获取当前用户的所以积分,计算扣除之后是否还需要微信支付
+        //扣减积分,先获取当前用户的所以积分,计算扣除之后是否还需要微信支付
         String userId = SecurityUtils.getUser().getUserId();
         ShopCartOrderMergerDto mergerOrder = orderService.getConfirmOrderCache(userId + submitOrderParam.getUuid());
 
@@ -287,7 +287,7 @@ public class OrderController {
             basketService.removeShopCartItemsCacheByUserId(userId);
         }
         orderService.removeConfirmOrderCache(userId + submitOrderParam.getUuid());
-        return ResponseEntity.ok(new OrderNumbersDto(orderNumbers.toString(),false));
+        return ResponseEntity.ok(new OrderNumbersDto(orderNumbers.toString(),mergerOrder.getNextPay()));
     }
 
 

+ 1 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderRefundController.java

@@ -261,6 +261,7 @@ public class OrderRefundController {
         newOrderRefund.setShopId(order.getShopId());
         newOrderRefund.setUserId(order.getUserId());
         newOrderRefund.setOrderId(order.getOrderId());
+        newOrderRefund.setOrderNumber(order.getOrderNumber());
         newOrderRefund.setRefundSn(String.valueOf(snowflake.nextId()));
         newOrderRefund.setRefundType(orderRefundParam.getRefundType());
 

+ 13 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java

@@ -16,7 +16,10 @@ import com.yami.shop.bean.model.Order;
 import com.yami.shop.bean.model.OrderItem;
 import com.yami.shop.bean.model.RefundDelivery;
 import com.yami.shop.common.enums.PayType;
+import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.service.*;
+import com.yami.shop.service.hb.IHBOrderService;
+import com.yami.shop.service.hb.impl.HBOrderService;
 import com.yami.shop.wx.service.WxProviderService;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
@@ -49,6 +52,8 @@ public class PayNoticeController {
 
     private final WxProviderService wxProviderService;
 
+    private final IHBOrderService hbOrderService;
+
     @SneakyThrows
     @RequestMapping("/order/wxNotify")
     public ResponseEntity<String> wxNotify(HttpServletRequest request, HttpServletResponse response) {
@@ -75,8 +80,16 @@ public class PayNoticeController {
                     skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
                 }
             }
+
+            //推送海博订单
+            for (Order order : orders) {
+                hbOrderService.createOrderAsync(order.getOrderNumber());
+            }
         }
 
+
+
+
         return ResponseEntity.ok(payInfoBo.getSuccessString());
     }
 

+ 2 - 2
yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java

@@ -183,9 +183,9 @@ public class ShopCartController {
 
     @GetMapping("/prodCount")
     @ApiOperation(value = "获取购物车商品数量", notes = "获取所有购物车商品数量")
-    public ResponseEntity<Integer> prodCount() {
+    public ResponseEntity<Integer> prodCount(@RequestParam("platform") Integer platform) {
         String userId = SecurityUtils.getUser().getUserId();
-        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItems(userId);
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItems(userId, platform);
         if (CollectionUtil.isEmpty(shopCartItems)) {
             return ResponseEntity.ok(0);
         }

+ 129 - 13
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -10,8 +10,10 @@
 
 package com.yami.shop.api.listener;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yami.shop.bean.app.dto.ShopCartItemDiscountDto;
 import com.yami.shop.bean.app.dto.ShopCartItemDto;
 import com.yami.shop.bean.app.dto.ShopCartOrderDto;
@@ -22,7 +24,6 @@ import com.yami.shop.bean.event.SubmitOrderEvent;
 import com.yami.shop.bean.model.*;
 import com.yami.shop.bean.order.SubmitOrderOrder;
 import com.yami.shop.common.exception.GlobalException;
-import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.Arith;
 import com.yami.shop.dao.*;
 import com.yami.shop.security.api.util.SecurityUtils;
@@ -35,8 +36,12 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 确认订单信息时的默认操作
@@ -58,6 +63,7 @@ public class SubmitOrderListener {
 
     private final Snowflake snowflake;
 
+    private final PointsRecordMapper pointsRecordMapper;
     private final OrderItemMapper orderItemMapper;
 
     private final SkuMapper skuMapper;
@@ -75,6 +81,7 @@ public class SubmitOrderListener {
      */
     @EventListener(SubmitOrderEvent.class)
     @Order(SubmitOrderOrder.DEFAULT)
+    @Transactional(rollbackFor = Exception.class)
     public void defaultSubmitOrderListener(SubmitOrderEvent event) {
         Date now = new Date();
         String userId = SecurityUtils.getUser().getUserId();
@@ -98,20 +105,67 @@ public class SubmitOrderListener {
         userAddrOrder.setUserId(userId);
         userAddrOrder.setCreateTime(now);
         userAddrOrderService.save(userAddrOrder);
-
+        //所有当前用户可用的积分记录
+        List<PointsRecord> pointsRecords = pointsRecordMapper.selectList(new LambdaQueryWrapper<PointsRecord>()
+                        .eq(PointsRecord::getUserId, userId)
+                        .eq(PointsRecord::getChannelId, mergerOrder.getPlatform())
+                        .in(PointsRecord::getPointsType, Arrays.asList(1, 3))
+                        .in(PointsRecord::getPointsAudit, Arrays.asList(1, 2)).and(wrapper -> wrapper
+                                .gt(PointsRecord::getExpiryDate, LocalDateTime.now())
+                                .or()
+                                .isNull(PointsRecord::getExpiryDate)
+                        )).stream()
+                .sorted(Comparator
+                        .comparing(PointsRecord::getExpiryDate,
+                                Comparator.nullsLast(Comparator.naturalOrder()))
+                        .thenComparing(PointsRecord::getId))
+                .collect(Collectors.toList());
+        ;
+        // 将记录添加到队列中
+        ArrayDeque<PointsRecord> expiryQueue = new ArrayDeque<>(pointsRecords);
         // 订单地址id
         Long addrOrderId = userAddrOrder.getAddrOrderId();
 
         if (CollectionUtils.isNotEmpty(shopCartOrders)) {
             // 每个店铺生成一个订单
             for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) {
-                Double sumPlatformAmount = 0.0;
+                //兑换人民币是分,必须要实时统计计算
+                Integer point = pointsRecordMapper.statisticsPoint(userId, mergerOrder.getPlatform());
                 // 使用雪花算法生成的订单号
                 String orderNumber = String.valueOf(snowflake.nextId());
                 shopCartOrderDto.setOrderNumber(orderNumber);
 
                 Long shopId = shopCartOrderDto.getShopId();
+                // 订单信息
+                com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order();
+                order.setIsPayed(0);
+                order.setStatus(OrderStatus.UNPAY.value());
+                double actualTotal = Arith.add(shopCartOrderDto.getActualTotal(), shopCartOrderDto.getTransfee());
+                boolean isUseTransfee = false;
+                //企业用户才进这个判断,并且该用户的积分必须大于0
+                if (1 == mergerOrder.getPlatform() && null != point && point > 0) {
+                    // 计算商品金额和积分
+                    Double mul = Arith.mul(actualTotal, 100);
+                    Double vp = Double.valueOf(point);
+                    if (vp >= mul) {
+                        order.setIsPayed(1);
+                        order.setPayTime(new Date());
+                        order.setStatus(OrderStatus.PADYED.value());
+                        //积分完全足够支付
+                        order.setOffsetPoints(Long.valueOf(String.valueOf(mul).split("\\.")[0]));
+                        actualTotal = 0.0;//剩下需要付的钱
+                    } else {
+                        //积分不够抵扣
+                        double sub = Arith.sub(mul, vp);
+                        //剩下需要付的钱
+                        order.setOffsetPoints(Long.valueOf(String.valueOf(sub).split("\\.")[0]));
+                        actualTotal = sub / 100;
+                        mergerOrder.setNextPay(Boolean.TRUE);
 
+                    }
+                } else {
+                    mergerOrder.setNextPay(Boolean.TRUE);
+                }
                 // 订单商品名称
                 StringBuilder orderProdName = new StringBuilder(100);
                 List<OrderItem> orderItems = new ArrayList<>();
@@ -138,9 +192,25 @@ public class SubmitOrderListener {
                         orderItem.setBasketDate(shopCartItem.getBasketDate());
                         //平台的补贴优惠金额
                         orderItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce());
+                        Double actualItem = shopCartItem.getActualTotal();
+                        //后台充值的积分
+                        if (1 == mergerOrder.getPlatform() && null != point && point > 0) {
+                            Double useActualItem = actualItem;
+                            if (!isUseTransfee) {//每个订单增加手续费,都只扣一次
+                                Double transfee = shopCartOrderDto.getTransfee();
+                                useActualItem = Arith.add(useActualItem, transfee);
+                                isUseTransfee = Boolean.TRUE;
+                            }
+                            //把钱换算成积分
+                            actualItem = this.doGetOrderItemPoints(Arith.mul(useActualItem, 100), expiryQueue, orderNumber);
+                            //把积分换算成钱
+                            if (actualItem > 0) {
+                                actualItem = Arith.div(actualItem, 100);
+                            }
+                        }
                         // 实际订单项支付金额
-                        //TODO wangjian 根据platform来计算是否优先扣减积分抵扣
-                        orderItem.setActualTotal(shopCartItem.getActualTotal());
+                        // 根据platform来计算是否优先扣减积分抵扣
+                        orderItem.setActualTotal(actualItem);
                         // 分摊优惠金额
                         orderItem.setShareReduce(shopCartItem.getShareReduce());
                         orderProdName.append(orderItem.getProdName()).append(",");
@@ -162,8 +232,6 @@ public class SubmitOrderListener {
                     orderProdName.deleteCharAt(orderProdName.length() - 1);
                 }
 
-                // 订单信息
-                com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order();
 
                 order.setShopId(shopId);
                 order.setOrderNumber(orderNumber);
@@ -174,13 +242,11 @@ public class SubmitOrderListener {
                 // 商品总额
                 order.setTotal(shopCartOrderDto.getTotal());
                 // 实际总额
-                //TODO wangjian 根据platform来计算是否优先扣减积分抵扣
-                order.setActualTotal(shopCartOrderDto.getActualTotal());
-                order.setStatus(OrderStatus.UNPAY.value());
+                order.setActualTotal(actualTotal);
+
                 order.setChannelId(Long.valueOf(mergerOrder.getPlatform()));
                 order.setUpdateTime(now);
                 order.setCreateTime(now);
-                order.setIsPayed(0);
                 order.setDeleteStatus(0);
                 order.setProductNums(shopCartOrderDto.getTotalCount());
                 order.setAddrOrderId(addrOrderId);
@@ -217,7 +283,7 @@ public class SubmitOrderListener {
             basketMapper.deleteShopCartItemsByBasketIds(userId, basketIds);
         }
 
-//TODO wangjia 修改本地库存
+//        现在不用维护库存
 //        // 更新sku库存
 //        skuStocksMap.forEach((key, sku) -> {
 //
@@ -228,7 +294,7 @@ public class SubmitOrderListener {
 //            }
 //        });
 //
-////         更新商品库存
+//        //更新商品库存
 //        prodStocksMap.forEach((prodId, prod) -> {
 //
 //            if (productMapper.updateStocks(prod) == 0) {
@@ -331,4 +397,54 @@ public class SubmitOrderListener {
     }
 
 
+    private Double doGetOrderItemPoints(Double actualTotal, ArrayDeque<PointsRecord> expiryQueue, String orderNumber) {
+        PointsRecord pointsRecord = expiryQueue.poll();
+        PointsRecord pr = new PointsRecord();
+        if (pointsRecord != null) {
+            //判定可用金额
+            BigDecimal points = pointsRecord.getPoints() != null ? pointsRecord.getPoints() : BigDecimal.ZERO;
+            BigDecimal variablePoints = pointsRecord.getVariablePoints() != null ? pointsRecord.getVariablePoints() : BigDecimal.ZERO;
+            //充值记录中可用的记录
+            double available = points.subtract(variablePoints).doubleValue();
+            BeanUtil.copyProperties(pointsRecord, pr);
+            if (available > actualTotal) {
+                //钱已经抵扣完,但是当条积分还有剩余,所以不要重新把剩余的放入队列。钱少积分多
+                //剩余的积分
+                pointsRecord.setVariablePoints(variablePoints.add(BigDecimal.valueOf(actualTotal)));
+                pr.setVariablePoints(variablePoints.add(BigDecimal.valueOf(actualTotal)));
+                expiryQueue.addFirst(pointsRecord);
+                pointsRecord.setPointsAudit(2);//部分使用
+                pr.setPointsAudit(2);//部分使用
+                actualTotal = 0.0;
+            } else if (actualTotal > available) {
+                actualTotal = Arith.sub(actualTotal, available);
+                //把当前积分已扣完,但是还有钱。钱多积分少
+                pointsRecord.setVariablePoints(BigDecimal.valueOf(actualTotal));
+                pr.setVariablePoints(BigDecimal.valueOf(actualTotal));
+                pr.setPointsAudit(3);
+                pointsRecord.setPointsAudit(3);
+            } else {
+                //恰好等于
+                pr.setPointsAudit(3);
+                pointsRecord.setPointsAudit(3);
+                pointsRecord.setVariablePoints(BigDecimal.valueOf(actualTotal));
+                pr.setVariablePoints(BigDecimal.valueOf(actualTotal));
+                actualTotal = 0.0;
+            }
+            int update = pointsRecordMapper.updateById(pointsRecord);
+            if (update > 0) {
+                pr.setId(null);
+                pr.setPointsType(2);
+                pr.setOrderNumber(orderNumber);
+                pr.setExpiryDate(null);
+                pointsRecordMapper.insert(pr);
+            }
+            //  插入数据库
+            if (actualTotal > 0.0) {
+                actualTotal = this.doGetOrderItemPoints(actualTotal, expiryQueue, orderNumber);
+            }
+        }
+        return actualTotal;
+    }
+
 }

+ 2 - 2
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java

@@ -21,7 +21,7 @@ import java.util.List;
  * "/confirm" 使用
  */
 @Data
-public class ShopCartOrderMergerDto implements Serializable{
+public class ShopCartOrderMergerDto implements Serializable {
 
     @ApiModelProperty(value = "实际总值", required = true)
     private Double actualTotal;
@@ -80,5 +80,5 @@ public class ShopCartOrderMergerDto implements Serializable{
     private Integer platform;
 
     private Double weight;
-
+    private Boolean nextPay = Boolean.FALSE;
 }

+ 14 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/hb/OrderPaymentRequest.java

@@ -0,0 +1,14 @@
+package com.yami.shop.bean.dto.hb;
+
+import lombok.Data;
+
+@Data
+public class OrderPaymentRequest {
+    //1001:支付宝
+    //1002:微信
+    //1301:积分
+    //9999:其他
+    private Integer paymentType; // 支付类型
+    private Long paymentAmount; // 支付金额
+    private Integer paymentNum; // 支付数量
+}

+ 22 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/hb/ProductRequest.java

@@ -0,0 +1,22 @@
+package com.yami.shop.bean.dto.hb;
+
+import lombok.Data;
+
+@Data
+public class ProductRequest {
+
+    private String skuName; // 商品名称
+    private Long skuId; // 商品中台skuId
+    private String channelSkuId; // 渠道商品id
+    private String upcCode; // 商品upc
+    private Integer refundCount; // 商品个数
+    private Double skuWeight; // 本次退掉的重量
+    private Long refundMoney; // 单品退款总金额
+    private String transId; // 商品唯一码
+    private Long businessSingleProductSubsidy; // 商家单品补贴金额
+    private Long platformSingleProductSubsidy; // 平台单品补贴金额
+    private Long businessOrderSubsidy; // 分摊商家整单补贴金额
+    private Long platformOrderSubsidy; // 分摊平台整单补贴金额
+    private Long totalSkuPrice; // 商品原总价
+
+}

+ 2 - 25
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/hb/ThirdPartyRefundRequest.java

@@ -33,30 +33,7 @@ public class ThirdPartyRefundRequest {
     private Long totalSkuPrice; // 商品原总价
     private Integer refundSource; // 退款发起方
     private String jsonParam; // 补丁参数
-    private List<Product> products; // 本次退款商品
-    private List<OrderPayment> orderPayments; // 支付信息
+    private List<ProductRequest> products; // 本次退款商品
+    private List<OrderPaymentRequest> orderPayments; // 支付信息
 
-    @Data
-    public static class Product {
-        private String skuName; // 商品名称
-        private Long skuId; // 商品中台skuId
-        private String channelSkuId; // 渠道商品id
-        private String upcCode; // 商品upc
-        private Integer refundCount; // 商品个数
-        private Double skuWeight; // 本次退掉的重量
-        private Long refundMoney; // 单品退款总金额
-        private String transId; // 商品唯一码
-        private Long businessSingleProductSubsidy; // 商家单品补贴金额
-        private Long platformSingleProductSubsidy; // 平台单品补贴金额
-        private Long businessOrderSubsidy; // 分摊商家整单补贴金额
-        private Long platformOrderSubsidy; // 分摊平台整单补贴金额
-        private Long totalSkuPrice; // 商品原总价
-    }
-
-    @Data
-    public static class OrderPayment {
-        private Integer paymentType; // 支付类型
-        private Long paymentAmount; // 支付金额
-        private Integer paymentNum; // 支付数量
-    }
 }

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java

@@ -267,6 +267,12 @@ public class Order implements Serializable {
     @TableField(exist = false)
     private Integer payScore;
 
+    @TableField(exist = false)
+    private Boolean nextPay = Boolean.FALSE;
+
+    @TableField
+    private Long offsetPoints;
+
 
 
 

+ 6 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java

@@ -47,6 +47,11 @@ public class OrderRefund implements Serializable{
      * 订单ID
      */
     private Long orderId;
+    /**
+     * 订单编号
+     */
+    private String orderNumber;
+
     /**
      * 退款单类型(1:整单退款,2:单个物品退款)
      */
@@ -69,7 +74,7 @@ public class OrderRefund implements Serializable{
     @TableField(exist = false)
     private Integer refundScore;
     /**
-     * 申请类型:1,仅退款,2退款退货
+     * 申请类型:1,仅退款,2退款退货,5差价退款
      */
     private Integer applyType;
     /**

+ 44 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefundSku.java

@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ */
+
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ *
+ * @author fbj
+ * @date 2025-10-11 09:55:01
+ */
+@Data
+@TableName("tz_order_refund_sku")
+public class OrderRefundSku implements Serializable{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 记录ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 退款编号
+     */
+    private String skuId;
+    /**
+     * 退款商品数量
+     */
+    private String productCount;
+
+
+}

+ 2 - 2
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java

@@ -38,9 +38,9 @@ public class PointsRecord implements Serializable {
     private Long channelId;
 
     /**
-     * 订单ID
+     * 订单编号
      */
-    private Long orderId;
+    private String orderNumber;
 
     /**
      * 充值积分ID

+ 1 - 0
yami-shop-multishop/src/main/java/com/yami/shop/multishop/controller/OrderController.java

@@ -340,6 +340,7 @@ public class OrderController {
         newOrderRefund.setShopId(order.getShopId());
         newOrderRefund.setUserId(order.getUserId());
         newOrderRefund.setOrderId(order.getOrderId());
+        newOrderRefund.setOrderNumber(order.getOrderNumber());
         newOrderRefund.setRefundSn(String.valueOf(snowflake.nextId()));
         newOrderRefund.setRefundType(orderRefundParam.getRefundType());
 

+ 2 - 3
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRechargeController.java

@@ -119,10 +119,9 @@ public class PointsRechargeController {
     @ApiOperation(value = "导入积分充值数据", notes = "导入积分充值数据")
     public R<String> importPointsRecharge(@RequestParam("file") MultipartFile file) {
         //需要填写操作人
-        YamiSysUser sysUser = SecurityUtils.getSysUser();
-        Long userId = sysUser.getUserId();
+        Long sysUserId = SecurityUtils.getSysUser().getUserId();
         try {
-            String result = pointsRechargeService.importPointsRecharge(file,userId);
+            String result = pointsRechargeService.importPointsRecharge(file,sysUserId);
             return R.SUCCESS(result);
         } catch (Exception e) {
             log.error("导入积分充值数据失败:", e);

+ 28 - 15
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderController.java

@@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
 public class HBOrderController {
 
     private final IHBOrderService orderService;
+
     /**
      * 海博订单创建接口-推送接口
      *
@@ -30,8 +31,8 @@ public class HBOrderController {
      * @return 前台类目响应
      */
     @PostMapping("/createOrderAsync")
-    public String addGoods(String  channelOrderId) {
-        log.info("海博新增订单{}",channelOrderId);
+    public String addGoods(String channelOrderId) {
+        log.info("海博新增订单{}", channelOrderId);
         return orderService.createOrderAsync(channelOrderId);
     }
 
@@ -43,28 +44,29 @@ public class HBOrderController {
      */
     @PostMapping("/delivery")
     public HBR delivery(@RequestBody JSONObject HBRequest) {
-        log.info("海博订单配送{}",HBRequest);
+        log.info("海博订单配送{}", HBRequest);
         return null;
     }
 
     /**
      * 海博订单完成-回调
+     *
      * @param HBRequest 海博订单完成请求参数
      */
     @PostMapping("/completed")
     public HBR completed(@RequestBody JSONObject HBRequest) {
-        log.info("海博订单完成{}",HBRequest);
+        log.info("海博订单完成{}", HBRequest);
         return null;
     }
 
     /**
      * 海博查询订单详情-回调
-     * @param HBRequest 海博查询订单详情请求参数
      *
+     * @param HBRequest 海博查询订单详情请求参数
      */
     @PostMapping("/details")
     public HBR details(@RequestBody JSONObject HBRequest) {
-        log.info("进入海博查询订单详情接口{}",HBRequest);
+        log.info("进入海博查询订单详情接口{}", HBRequest);
         return orderService.details(HBRequest);
     }
 
@@ -76,7 +78,7 @@ public class HBOrderController {
      */
     @PostMapping("/info")
     public HBR goodsInfo(@RequestBody JSONObject HBRequest) {
-        log.info("海博修改订单请求参数{}",HBRequest);
+        log.info("海博修改订单请求参数{}", HBRequest);
         return null;
     }
 
@@ -88,7 +90,7 @@ public class HBOrderController {
      */
     @PostMapping("/updateStatus")
     public HBR updateStatus(@RequestBody JSONObject hBRequest) {
-        log.info("海博修改订单状态{}",hBRequest);
+        log.info("海博修改订单状态{}", hBRequest);
         orderService.orderStatusNotify(hBRequest);
         return HBR.success();
     }
@@ -101,7 +103,7 @@ public class HBOrderController {
      */
     @PostMapping("/createOrderResult")
     public HBR createOrderResult(@RequestBody JSONObject hBRequest) {
-        log.info("海博订单创建结果通知{}",hBRequest);
+        log.info("海博订单创建结果通知{}", hBRequest);
         return orderService.createOrderResult(hBRequest);
     }
 
@@ -113,7 +115,7 @@ public class HBOrderController {
      */
     @PostMapping("/logisticsStatus")
     public HBR logisticsStatus(@RequestBody JSONObject hBRequest) {
-        log.info("海博订单物流状态通知{}",hBRequest);
+        log.info("海博订单物流状态通知{}", hBRequest);
         orderService.updateLogisticStatus(hBRequest);
         return HBR.success();
     }
@@ -124,19 +126,20 @@ public class HBOrderController {
     @PostMapping("/orderStatusNotify")
     public HBR orderStatusNotify(@RequestBody JSONObject hBRequest) {
         orderService.orderStatusNotify(hBRequest);
-        log.info("海博订单状态变更通知{}",hBRequest);
+        log.info("海博订单状态变更通知{}", hBRequest);
         return HBR.success();
     }
 
 
     /**
      * 骑手经纬度接口
+     *
      * @param hBRequest 海博骑手经纬度请求参数
      * @return 订单响应
      */
     @PostMapping("/riderLocation")
     public HBR riderLocation(@RequestBody JSONObject hBRequest) {
-        log.info("海博骑手经纬度{}",hBRequest);
+        log.info("海博骑手经纬度{}", hBRequest);
         orderService.riderLocation(hBRequest);
         return HBR.success();
     }
@@ -146,15 +149,25 @@ public class HBOrderController {
      * 海博订单修改状态接口-推送接口
      *
      * @param channelOrderId 海博订单请求参数
-     * 订单类型 (20:订单已接单 30:订单待配送 60:订单已取消 80:订单已完成)
+     *                       订单类型 (20:订单已接单 30:订单待配送 60:订单已取消 80:订单已完成)
      * @return 订单详情响应
      */
     @PostMapping("/changeOrderStatus")
     public HBR changeOrderStatus(String channelOrderId, Integer type) {
-        log.info("海博订单修改状态{}",channelOrderId);
+        log.info("海博订单修改状态{}", channelOrderId);
         return HBR.success(orderService.changeOrderStatus(channelOrderId, type));
     }
 
-
+    /**
+     * 订单-发货消息(下行)
+     *
+     * @param hBRequest 海博订单发货消息请求参数
+     */
+    @PostMapping("/deliveryMsg")
+    public HBR deliveryMsg(@RequestBody JSONObject hBRequest) {
+        log.info("海博订单发货消息{}", hBRequest);
+        orderService.deliveryMsg(hBRequest);
+        return HBR.success();
+    }
 
 }

+ 49 - 2
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderRefundController.java

@@ -45,11 +45,58 @@ public class HBOrderRefundController {
     }
 
     /**
-     * 查询退款单详情(下行)
+     * 退款-退款单状态同步(上行)
+     * @param afterSaleOrder  退款单号
+     */
+    @PostMapping("/changeStatus")
+    public HBR changeStatus(String afterSaleOrder) {
+        log.info("海博售后订单状态同步afterSaleOrder:{}",afterSaleOrder);
+        return HBR.success(orderRefundService.changeStatus(afterSaleOrder));
+    }
+
+    /**
+     * 查询退款单详情(下行)-回调接口
      */
     @PostMapping("/details")
     public HBR details(@RequestBody JSONObject hBRequest) {
         log.info("进入海博查询订单详情接口{}",hBRequest);
-        return HBR.success(orderRefundService.details(hBRequest));
+        return orderRefundService.details(hBRequest);
+    }
+
+    /**
+     * 商家审核(下行)-回调接口
+     * @param hBRequest 海博请求参数
+     */
+    @PostMapping("/audit")
+    public HBR audit(@RequestBody JSONObject hBRequest) {
+        log.info("进入海博商家审核接口{}",hBRequest);
+        return orderRefundService.audit(hBRequest);
+    }
+
+    /**
+     * 商家确认收货(下行)-回调接口
+     */
+    @PostMapping("/confirmOrder")
+    public HBR confirmOrder(@RequestBody JSONObject hBRequest) {
+        log.info("进入海博商家确认收货接口");
+        return orderRefundService.confirmOrder(hBRequest);
+    }
+
+    /**
+     * 商家发起部分退款(下行)-回调接口
+     */
+    @PostMapping("/partRefund")
+    public HBR partRefund(@RequestBody JSONObject hBRequest) {
+        log.info("进入海博商家发起部分退款接口");
+        return orderRefundService.partRefund(hBRequest);
+    }
+
+    /**
+     * 退款-退款创建结果通知接口-回调接口
+     */
+    @PostMapping("/createResult")
+    public HBR createResult(@RequestBody JSONObject hBRequest) {
+        log.info("进入海博退款创建结果通知接口");
+        return orderRefundService.createResult(hBRequest);
     }
 }

+ 1 - 0
yami-shop-platform/src/main/resources/application.yml

@@ -37,6 +37,7 @@ application:
   datacenterId: 2
   workerId: 1
 
+
 hb:
   host: https://p-open.hiboos.com
   appId: 5347a7077e65428bb9a87510ca7e1ea1

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

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.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.yami.shop.bean.dto.OrderRefundDto;
+import com.yami.shop.bean.model.OrderRefund;
+import com.yami.shop.bean.model.OrderRefundSku;
+import com.yami.shop.bean.param.StatisticsRefundParam;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface OrderRefundSkuMapper extends BaseMapper<OrderRefundSku> {
+
+}

+ 2 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java

@@ -3,6 +3,7 @@ package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yami.shop.bean.model.PointsRecord;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 积分记录详细 Mapper接口
@@ -11,5 +12,6 @@ import com.yami.shop.bean.model.PointsRecord;
  * @since 2025-09-XX
  */
 public interface PointsRecordMapper extends BaseMapper<PointsRecord> {
+    Integer statisticsPoint(@Param("userId") String userId, @Param("platform") Integer platform);
 
 }

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

@@ -13,6 +13,7 @@ import com.yami.shop.bean.model.OrderRefund;
 import com.yami.shop.bean.model.RefundDelivery;
 import com.yami.shop.bean.param.OrderRefundParam;
 import com.yami.shop.bean.param.StatisticsRefundParam;
+import com.yami.shop.common.util.hb.HBR;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -153,10 +154,46 @@ public interface OrderRefundService extends IService<OrderRefund> {
      */
     String createRefundOrder(String channelOrderId,String afterSaleOrder);
 
+    /**
+     * 退款-退款单状态同步(上行)
+     * @param afterSaleOrder  退款单号
+     */
+    String changeStatus(String afterSaleOrder);
+
+
     /**
      * 售后详情接口-回调接口
      * @param hBRequest 海博请求参数
      * @return 退款订单响应报文
      */
-    String details(JSONObject hBRequest);
+    HBR details(JSONObject hBRequest);
+
+    /**
+     * 售后审核接口-回调接口
+     * @param hBRequest 海博请求参数
+     * @return 退款订单响应报文
+     */
+    HBR audit(JSONObject hBRequest);
+
+
+    /**
+     * 售后确认接口-回调接口
+     * @param hBRequest 海博请求参数
+     * @return 退款订单响应报文
+     */
+    HBR confirmOrder(JSONObject hBRequest);
+
+    /**
+     * 部分退款接口-回调接口
+     * @param hBRequest 海博请求参数
+     * @return 退款订单响应报文
+     */
+    HBR partRefund(JSONObject hBRequest);
+
+    /**
+     * 创建退款结果接口-回调接口
+     * @param hBRequest 海博请求参数
+     * @return 退款订单响应报文
+     */
+    HBR createResult(JSONObject hBRequest);
 }

+ 5 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBOrderService.java

@@ -66,4 +66,9 @@ public interface IHBOrderService {
     void riderLocation(JSONObject hBRequest);
 
 
+    /**
+     * 订单-发货消息(下行)
+     * @param hBRequest 海博订单结果请求参数
+     */
+    void deliveryMsg(JSONObject hBRequest);
 }

+ 11 - 9
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java

@@ -94,15 +94,16 @@ public class HBGoodsService implements IHBGoodsService {
 
 
                     Sku skuId = skuMapper.selectByHbSkuId(productInfo.getString("skuId"));
+                    // 创建并填充Sku对象
+                    Sku sku = createSkuFromProductInfo(productInfo);
+                    sku.setProdId(prodId);
+                    sku.setHbSpuId(hbSpuId);
+                    sku.setProdName(productAdd.getProdName());
                     if (ObjectUtil.isNotEmpty(skuId) && skuId.getIsDelete() == 0) {
-                        skuId.setSkuId(skuId.getSkuId());
-                        skuMapper.updateById(skuId);
+                        sku.setSkuId(skuId.getSkuId());
+                        skuMapper.updateById(sku);
                         log.info("商品skuId={},skuName={}已经存在,修改数据", productInfo.getString("skuId"), productInfo.getString("skuName"));
                     } else {
-                        // 创建并填充Sku对象
-                        Sku sku = createSkuFromProductInfo(productInfo);
-                        sku.setProdId(prodId);
-                        sku.setHbSpuId(hbSpuId);
                         skuMapper.insert(sku);
                         log.info("SKU创建成功: skuId={}, skuName={}", sku.getSkuId(), sku.getSkuName());
                     }
@@ -143,11 +144,12 @@ public class HBGoodsService implements IHBGoodsService {
                         Sku sku = createSkuFromProductInfo(jsonObjectSku);
                         sku.setProdId(prodId);
                         sku.setHbSpuId(hbSpuId);
+                        sku.setProdName(productAdd.getProdName());
                         Sku skuId = skuMapper.selectByHbSkuId(jsonObjectSku.getString("skuId"));
                         if (ObjectUtil.isNotEmpty(skuId) && skuId.getIsDelete() == 0) {
-                            skuId.setSkuId(skuId.getSkuId());
-                            skuMapper.updateById(skuId);
-                            log.info("商品skuId={},skuName={}已经存在无需添加", productInfo.getLong("skuId"), productInfo.getString("skuName"));
+                            sku.setSkuId(skuId.getSkuId());
+                            skuMapper.updateById(sku);
+                            log.info("商品skuId={},skuName={}已经存在无需添加,修改", productInfo.getLong("skuId"), productInfo.getString("skuName"));
                         } else {
                             skuMapper.insert(sku);
                         }

+ 9 - 1
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java

@@ -221,6 +221,14 @@ public class HBOrderService implements IHBOrderService {
         }
     }
 
+    @Override
+    public void deliveryMsg(JSONObject hBRequest) {
+        String bodyStr = hBRequest.getString("body");
+        log.info("订单信息,body:{}", bodyStr);
+        JSONObject bodyJson = JSON.parseObject(bodyStr);
+        Order order = orderMapper.getOrderAndOrderItemByOrderNumber(bodyJson.getString("channelOrderId"));
+
+    }
 
 
     @Override
@@ -361,7 +369,7 @@ public class HBOrderService implements IHBOrderService {
             orderProduct.setPlatformSingleProductSubsidy(0L);
             orderProduct.setBusinessOrderSubsidy(0L);
             orderProduct.setPlatformOrderSubsidy(0L);
-            orderProduct.setTransId(orderItem.getOrderItemId().toString());
+            orderProduct.setTransId(sku.getSkuId().toString());
             orderProduct.setParentHBSkuId(0L);
 //            orderProduct.setPromotionType(sku.getPromotionType());
 //            orderProduct.setProductFeatures(sku.getProductFeatures());

+ 297 - 24
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java

@@ -4,8 +4,10 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -13,6 +15,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.yami.shop.bean.dto.OrderRefundDto;
 import com.yami.shop.bean.dto.hb.HBBaseReq;
+import com.yami.shop.bean.dto.hb.OrderPaymentRequest;
+import com.yami.shop.bean.dto.hb.ProductRequest;
+import com.yami.shop.bean.dto.hb.ThirdPartyRefundRequest;
 import com.yami.shop.bean.enums.*;
 import com.yami.shop.bean.event.OrderRefundSuccessEvent;
 import com.yami.shop.bean.event.ReceiptOrderEvent;
@@ -27,10 +32,8 @@ import com.yami.shop.common.enums.PayType;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.Arith;
-import com.yami.shop.dao.OrderMapper;
-import com.yami.shop.dao.OrderRefundMapper;
-import com.yami.shop.dao.OrderSettlementMapper;
-import com.yami.shop.dao.ShopWalletMapper;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.dao.*;
 import com.yami.shop.service.*;
 import com.yami.shop.utils.HBSignUtil;
 import lombok.AllArgsConstructor;
@@ -65,7 +68,6 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     private final OrderSettlementMapper orderSettlementMapper;
 
     private final ShopDetailService shopDetailService;
-    private final RefundAddrService refundAddrService;
 
     private final ShopWalletMapper shopWalletMapper;
     private final OrderMapper orderMapper;
@@ -76,6 +78,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     private final PayManagerService payManagerService;
     private final Snowflake snowflake;
     private final HBSignUtil hbSignUtil;
+    private final OrderRefundSkuMapper orderRefundSkuMapper;
 
 
     /**
@@ -305,7 +308,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         // 是否同意退款
         if (Objects.equals(orderRefundParam.getRefundSts(), RefundStsType.DISAGREE.value())) {
             // 不同意退款
-            disagreeRefund(orderRefundParam, orderRefundDto,1);
+            disagreeRefund(orderRefundParam, orderRefundDto, 1);
         } else {
             // 正在处理退款的状态
             orderRefundDto.setReturnMoneySts(ReturnMoneyStsType.PROCESSING.value());
@@ -380,7 +383,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             agreeRefund(orderRefundDto);
 
         } else {
-            disagreeRefund(orderRefundParam, orderRefundDto,2);
+            disagreeRefund(orderRefundParam, orderRefundDto, 2);
         }
 
         // 是否收到货
@@ -462,11 +465,12 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
 
     /**
      * 不同意退款
+     *
      * @param orderRefundParam
      * @param orderRefundDto
-     * @param type 1 用户发起是拒绝  2 商家收货后拒绝
+     * @param type             1 用户发起是拒绝  2 商家收货后拒绝
      */
-    private void disagreeRefund(OrderRefundParam orderRefundParam, OrderRefundDto orderRefundDto,Integer type) {
+    private void disagreeRefund(OrderRefundParam orderRefundParam, OrderRefundDto orderRefundDto, Integer type) {
         // 不同意退款
         orderRefundDto.setReturnMoneySts(ReturnMoneyStsType.REJECT.value());
         orderRefundDto.setReturnMoneySts(ReturnMoneyStsType.FAIL.value());
@@ -485,7 +489,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         } else {
             order.setRefundStatus(RefundStatusEnum.DISAGREE.value());
         }
-        if(type==2){
+        if (type == 2) {
             order.setStatus(OrderStatus.CLOSE.value());
         }
         orderService.updateById(order);
@@ -736,14 +740,14 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void cancelWhenTimeOut(List<OrderRefund> orderRefundList) {
-        if(CollectionUtils.isEmpty(orderRefundList)) {
+        if (CollectionUtils.isEmpty(orderRefundList)) {
             return;
         }
         Date now = new Date();
         for (OrderRefund orderRefund : orderRefundList) {
             orderRefund.setReturnMoneySts(ReturnMoneyStsType.FAIL.value());
             Order order = orderService.getById(orderRefund.getOrderId());
-            if(ObjectUtil.isNotEmpty(order)){
+            if (ObjectUtil.isNotEmpty(order)) {
                 order.setRefundStatus(4);
                 orderService.updateById(order);
             }
@@ -777,8 +781,8 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     @Override
     public void overTimeRefundOrder(com.yami.shop.bean.app.param.OrderRefundParam orderRefundParam) {
         // 获取订单信息
-        Order order=orderService.getOrderByOrderNumber(orderRefundParam.getOrderNumber());
-        if(ObjectUtil.isEmpty(order)){
+        Order order = orderService.getOrderByOrderNumber(orderRefundParam.getOrderNumber());
+        if (ObjectUtil.isEmpty(order)) {
             throw new GlobalException("此订单不存在,无法退货退款");
         }
         if (!Objects.equals(order.getIsPayed(), 1)) {
@@ -821,8 +825,6 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         }
 
 
-
-
         // 生成退款单信息
         OrderRefund newOrderRefund = new OrderRefund();
 
@@ -940,10 +942,9 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
     }
 
 
-
     //*************************** 售后接口 ***************************
     @Override
-    public String createRefundOrder(String channelOrderId,String afterSaleOrder) {
+    public String createRefundOrder(String channelOrderId, String afterSaleOrder) {
         HBBaseReq<Object> build = HBBaseReq.create();
         build.setAppId(hbSignUtil.getAppId());
 
@@ -956,17 +957,289 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
 
         build.setSign(hbSignUtil.signMd5(build));
         log.info("post 订单推送单号参数:{}", JSON.toJSONString(build));
-        String post = post(hbSignUtil.getHBHost() + "/api/order/asyncSave", build);
+        String post = post(hbSignUtil.getHBHost() + "/api/refund/asyncSave", build);
+        log.info("post 订单推送结果:{}", post);
+        return post;
+    }
+
+    @Override
+    public String changeStatus(String afterSaleOrder) {
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+        OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
+
+        // 3. 构建外层请求体
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("afterSaleOrder", afterSaleOrder);
+//        退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
+        requestBody.put("refundStatus", refundHbStatus(orderRefund.getReturnMoneySts()));
+        requestBody.put("timestamp", orderRefund.getApplyTime().getTime());
+
+//        deliveryMan 退货的配送员名称
+//        deliveryMobile 退货的配送员电话
+//        deliveryManNo 退货的配送员编号
+
+        // 4. 将整个JSON对象序列化为字符串并设置
+        build.setBody(JSON.toJSONString(requestBody));
+        build.setSign(hbSignUtil.signMd5(build));
+        log.info("post 订单推送单号参数:{}", JSON.toJSONString(build));
+        String post = post(hbSignUtil.getHBHost() + "/api/refund/changeStatus", build);
         log.info("post 订单推送结果:{}", post);
         return post;
     }
 
     @Override
-    public String details(JSONObject hBRequest) {
-//        try {
-//            JSONObject bodyStr = hBRequest.getObject("body");
-//            log.info("退款订单信息,body:{}", bodyStr);
+    public HBR details(JSONObject hBRequest) {
+        ThirdPartyRefundRequest thirdPartyRefundRequest = new ThirdPartyRefundRequest();
+        try {
+            JSONObject bodyStr = hBRequest.getJSONObject("body");
+            log.info("退款订单信息,body:{}", bodyStr);
+            OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, bodyStr.getString("afterSaleOrder")));
+            ShopDetail shopDetailByShopId = shopDetailService.getShopDetailByShopId(orderRefund.getShopId());
+
+            thirdPartyRefundRequest.setChannelOrderId(bodyStr.getString("channelOrderId"));
+            thirdPartyRefundRequest.setOutStationNo(shopDetailByShopId.getHbStationNo());
+            thirdPartyRefundRequest.setAfterSaleOrder(orderRefund.getRefundSn());
+            thirdPartyRefundRequest.setSaleType(2);
+            thirdPartyRefundRequest.setReason(orderRefund.getBuyerReason());
+            thirdPartyRefundRequest.setProblemDescription(orderRefund.getBuyerDesc());
+            thirdPartyRefundRequest.setPictures(orderRefund.getPhotoFiles());
+
+            Integer returnMoneySts = orderRefund.getReturnMoneySts();
+            thirdPartyRefundRequest.setRefundStatus(refundHbStatus(returnMoneySts));
+            Integer applyType = orderRefund.getApplyType();
+            if (Objects.equals(applyType, 2)) {
+                thirdPartyRefundRequest.setApplyDeal(40);
+            } else {
+                thirdPartyRefundRequest.setApplyDeal(10);
+            }
+
+            thirdPartyRefundRequest.setPickAddress(orderRefund.getBuyerMobile());
+            thirdPartyRefundRequest.setRefundType(orderRefund.getRefundType());
+            thirdPartyRefundRequest.setMoney((long) (orderRefund.getRefundAmount() * 100));
+            thirdPartyRefundRequest.setTimestamp(orderRefund.getApplyTime().getTime());
+            thirdPartyRefundRequest.setRefundSource(1);
+
+
+            List<ProductRequest> productRequests = new ArrayList<>();
+            orderItemService.list(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, orderRefund.getOrderId())).forEach(orderItem -> {
+                Sku sku = skuService.getById(orderItem.getSkuId());
+                ProductRequest productRequest = new ProductRequest();
+                productRequest.setSkuName(orderItem.getSkuName());
+                productRequest.setSkuId(orderItem.getSkuId());
+                productRequest.setChannelSkuId(sku.getHbSkuId());
+//                productRequest.setUpcCode(orderItem.getSkuId());
+                productRequest.setRefundCount(orderItem.getProdCount());
+                productRequest.setRefundMoney((long) (orderItem.getProductTotalAmount() * 100));
+                productRequest.setTransId(sku.getSkuId().toString());
+                productRequests.add(productRequest);
+
+            });
+            thirdPartyRefundRequest.setProducts(productRequests);
+
+            List<OrderPaymentRequest> orderPaymentRequests = new ArrayList<>();
+            OrderPaymentRequest orderPaymentRequest = new OrderPaymentRequest();
+            orderPaymentRequest.setPaymentType(1002);
+            orderPaymentRequest.setPaymentAmount((long) (orderRefund.getRefundAmount() * 100));
+            orderPaymentRequest.setPaymentNum(1);
+            orderPaymentRequests.add(orderPaymentRequest);
+            thirdPartyRefundRequest.setOrderPayments(orderPaymentRequests);
+            log.info("退款订单信息,参数:{}", thirdPartyRefundRequest);
+        } catch (Exception e) {
+            log.error("海博退款订单查询异常:{}", e);
+            HBR.error("未知异常");
+        }
+
+        return HBR.success(thirdPartyRefundRequest);
+    }
+
+    @Override
+    public HBR audit(JSONObject hBRequest) {
+        try {
+            JSONObject bodyStr = hBRequest.getJSONObject("body");
+            log.info("售后审核接口-回调接口,body:{}", bodyStr);
+            String afterSaleOrder = bodyStr.getString("afterSaleOrder");
+            String channelOrderId = bodyStr.getString("channelOrderId");
+            Integer auditType = bodyStr.getInteger("auditType");
+            Integer applyDeal = bodyStr.getInteger("applyDeal");
+
+            if (ObjectUtil.isNotEmpty(applyDeal)) {
+                if (applyDeal == 40) {
+                    applyDeal = 2;
+                } else {
+                    applyDeal = 1;
+                }
+            }
+
+            OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
+
+            if (auditType == 2) {
+                orderRefund.setApplyType(applyDeal);
+                orderRefund.setReturnMoneySts(2);
+            } else if (auditType == 4) {
+                orderRefund.setApplyType(applyDeal);
+                orderRefund.setReturnMoneySts(2);
+            } else {
+                orderRefund.setReturnMoneySts(7);
+                orderRefund.setRejectMessage(bodyStr.getString("reason"));
+            }
+            orderRefundMapper.updateById(orderRefund);
+
+
+            //3:驳回
+            if (auditType == 3) {
+                Order orderByOrderNumber = orderService.getOrderByOrderNumber(channelOrderId);
+                orderByOrderNumber.setRefundStatus(4);
+                orderService.updateById(orderByOrderNumber);
+            }
+
+        } catch (Exception e) {
+            log.error("海博退款订单查询异常:{}", e);
+            HBR.error("未知异常");
+        }
+
+        return HBR.success();
+    }
+
+    @Override
+    public HBR confirmOrder(JSONObject hBRequest) {
+        try {
+            JSONObject bodyStr = hBRequest.getJSONObject("body");
+            log.info("售后确认接口-回调接口,body:{}", bodyStr);
+            String afterSaleOrder = bodyStr.getString("afterSaleOrder");
+            String channelOrderId = bodyStr.getString("channelOrderId");
+            Integer auditType = bodyStr.getInteger("auditType");
+
+            OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
+
+            if (auditType == 2) {
+                orderRefund.setReturnMoneySts(2);
+                orderRefund.setIsReceiver(true);
+            } else if (auditType == 4) {
+                orderRefund.setIsReceiver(true);
+                orderRefund.setReturnMoneySts(2);
+            } else {
+                orderRefund.setReturnMoneySts(7);
+                orderRefund.setRejectMessage(bodyStr.getString("reason"));
+            }
+            orderRefundMapper.updateById(orderRefund);
+
+
+            //3:驳回
+            if (auditType == 3) {
+                Order orderByOrderNumber = orderService.getOrderByOrderNumber(channelOrderId);
+                orderByOrderNumber.setRefundStatus(4);
+                orderService.updateById(orderByOrderNumber);
+            }
+        } catch (Exception e) {
+            log.error("海博退款订单查询异常:{}", e);
+            HBR.error("未知异常");
+        }
+
+        return HBR.success();
+    }
+
+    @Override
+    public HBR partRefund(JSONObject hBRequest) {
+        try {
+            JSONObject bodyStr = hBRequest.getJSONObject("body");
+            log.info("部分退款接口-回调接口,body:{}", bodyStr);
+            String channelOrderId = bodyStr.getString("channelOrderId");
+            Integer auditType = bodyStr.getInteger("auditType");
+            Integer applyDeal = bodyStr.getInteger("applyDeal");
+
+            OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderNumber, channelOrderId));
+
+            if (ObjectUtil.isNotEmpty(applyDeal)) {
+                if (applyDeal == 10) {
+                    orderRefund.setApplyType(1);
+                } else {
+                    orderRefund.setApplyType(5);
+                }
+            }
+
+            if (auditType == 2) {
+                orderRefund.setReturnMoneySts(2);
+                orderRefund.setIsReceiver(true);
+            } else if (auditType == 4) {
+                orderRefund.setIsReceiver(true);
+                orderRefund.setReturnMoneySts(2);
+            } else {
+                orderRefund.setReturnMoneySts(7);
+                orderRefund.setRejectMessage(bodyStr.getString("reason"));
+            }
+
+            JSONArray products = bodyStr.getJSONArray("products");
+            log.info("部分退款接口-回调接口,products:{}", products);
+            for (Object product : products) {
+                JSONObject productJson = (JSONObject) product;
+                OrderRefundSku orderRefundSku = new OrderRefundSku();
+                String skuId = productJson.getString("skuId");
+                orderRefundSku.setSkuId(productJson.getString("channelSkuId"));
+                orderRefundSku.setProductCount(productJson.getString("productCount"));
+                orderRefundSkuMapper.insert(orderRefundSku);
+            }
+
+
+            Order orderByOrderNumber = orderService.getById(orderRefund.getOrderId());
+            orderByOrderNumber.setRefundStatus(3);
+            orderService.updateById(orderByOrderNumber);
+
+        } catch (Exception e) {
+            log.error("海博退款订单查询异常:{}", e);
+            HBR.error("未知异常");
+        }
+
+        return HBR.success();
+    }
+
+    @Override
+    public HBR createResult(JSONObject hBRequest) {
+        try {
+            JSONObject bodyStr = hBRequest.getJSONObject("body");
+            log.info("创建退款结果接口-回调接口,body:{}", bodyStr);
+            String afterSaleOrder = bodyStr.getString("afterSaleOrder");
+
+            OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
+            orderRefund.setReturnMoneySts(5);
+            orderRefundMapper.updateById(orderRefund);
+
+            Order orderByOrderNumber = orderService.getById(orderRefund.getOrderId());
+            orderByOrderNumber.setRefundStatus(2);
+            orderService.updateById(orderByOrderNumber);
+        } catch (Exception e) {
+            log.error("海博退款订单查询异常:{}", e);
+            HBR.error("未知异常");
+        }
+
+        return HBR.success();
+    }
 
-        return null;
+    /**
+     * 系统订单状态转换为海博订单状态
+     * 退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
+     * 处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 6.买家撤回申请 7.商家拒绝 -1.退款关闭)详情见ReturnMoneyStsType
+     *
+     * @param returnMoneySts 退款单状态
+     * @return HB退款单状态
+     */
+    private Integer refundHbStatus(Integer returnMoneySts) {
+        switch (returnMoneySts) {
+            case 1:
+                return 10;
+            case 2:
+                return 60;
+            case 3:
+                return 10;
+            case 4:
+                return 20;
+            case 6:
+                return 40;
+            case 7:
+                return 30;
+            case 5:
+                return 70;
+        }
+        return 10;
     }
 }

+ 63 - 53
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -44,6 +44,7 @@ import com.yami.shop.service.OrderItemService;
 import com.yami.shop.service.OrderRefundService;
 import com.yami.shop.service.OrderService;
 import com.yami.shop.service.OrderSettlementService;
+import com.yami.shop.service.hb.IHBOrderService;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -87,6 +88,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private Snowflake snowflake;
 
 
+    private final IHBOrderService hbOrderService;
+
+
     @Override
     public Order getOrderByOrderNumber(String orderNumber) {
         return orderMapper.getOrderByOrderNumber(orderNumber);
@@ -106,7 +110,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     public OrderPayParam getPayUserCountByshopId(Long shopId, Date startTime, Date endTime) {
         OrderPayParam nowOrderPay = orderMapper.getOrderCountByShopId(shopId, startTime, endTime);
         StatisticsRefundParam refundParam = orderRefundMapper.getRefundByShopId(shopId, startTime, endTime);
-        Double onePrice = (nowOrderPay.getPayUserCount() == 0) ? 0 : (Arith.div(nowOrderPay.getPayActualTotal(), nowOrderPay.getPayUserCount(),2));
+        Double onePrice = (nowOrderPay.getPayUserCount() == 0) ? 0 : (Arith.div(nowOrderPay.getPayActualTotal(), nowOrderPay.getPayUserCount(), 2));
         if (nowOrderPay.getPayActualTotal() == null) {
             nowOrderPay.setPayActualTotal(0.00);
         }
@@ -135,10 +139,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         OrderPayParam param = new OrderPayParam();
         for (int i = 0; i < 24; i++) {
             if (payMap.get(i) != null) {
-                sum = Arith.add(sum,payMap.get(i));
+                sum = Arith.add(sum, payMap.get(i));
             }
             if (yesterdayPayMap.get(i) != null) {
-                yesterdaySum = Arith.add(yesterdaySum,yesterdayPayMap.get(i));
+                yesterdaySum = Arith.add(yesterdaySum, yesterdayPayMap.get(i));
             }
             payYesterdayActualTotal.add(Arith.round(yesterdaySum, 2));
             nowActualTotal.add(Arith.round(sum, 2));
@@ -157,9 +161,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         Double sum = 0.00;
         for (OrderPayParam orderPayParam : actualTotal) {
             DateTime time = DateTime.of(orderPayParam.getDates(), "yyyy-MM-dd");
-            if(DateUtil.compare(time,dateTime) > 0){
-                sum = Arith.add(sum,orderPayParam.getPayActualTotal());
-                orderPayParam.setOnePrice(Arith.round(sum,2));
+            if (DateUtil.compare(time, dateTime) > 0) {
+                sum = Arith.add(sum, orderPayParam.getPayActualTotal());
+                orderPayParam.setOnePrice(Arith.round(sum, 2));
             }
             actualTotalByDay.add(orderPayParam);
         }
@@ -194,16 +198,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     }
 
 
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public List<Order> submit(String userId, ShopCartOrderMergerDto mergerOrder) {
         List<Order> orderList = new ArrayList<>();
-
         // 提交订单
         eventPublisher.publishEvent(new SubmitOrderEvent(mergerOrder, orderList));
         // 插入订单
-        orderList.forEach(order -> orderMapper.insert(order));
+        orderList.forEach(orderMapper::insert);
         List<OrderItem> orderItems = orderList.stream()
                 .flatMap(order -> order.getOrderItems().stream()
                 )
@@ -214,9 +216,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         if (mergerOrder.getIsScorePay() != null && mergerOrder.getIsScorePay() == 1) {
             eventPublisher.publishEvent(new SubmitScoreOrderEvent(mergerOrder, orderList));
         }
+        for (Order order : orderList) {
+            //推送海博订单
+            if (!order.getNextPay()) {
+                hbOrderService.createOrderAsync(order.getOrderNumber());
+            }
+        }
         return orderList;
     }
-    public static void main(String[] args)  throws Exception{
+
+    public static void main(String[] args) throws Exception {
         String json = "{'buyPrice':10,'buyOrder':1}";
         ObjectMapper om = new ObjectMapper();
         // 允许单引号(非标准)
@@ -346,7 +355,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 .eq(Order::getOrderId, order.getOrderId())
                 .eq(Order::getOrderNumber, order.getOrderNumber())
         );
-        if (!Objects.equals(orderDb.getStatus(), OrderStatus.UNPAY.value())){
+        if (!Objects.equals(orderDb.getStatus(), OrderStatus.UNPAY.value())) {
             throw new GlobalException("订单状态异常,无法更改订单金额");
         }
         //减少金额
@@ -355,45 +364,45 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         double platformAmount = 0.00;
         Map<Long, OrderItem> collect = order.getOrderItems().stream().collect(Collectors.toMap(OrderItem::getOrderItemId, orderItem -> orderItem));
         List<OrderItem> orderItemList = orderItemService.list(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
-        for (OrderItem orderItemDb:orderItemList){
+        for (OrderItem orderItemDb : orderItemList) {
             OrderItem orderItem = collect.get(orderItemDb.getOrderItemId());
-            if (orderItem.getChageAmount() >= orderItemDb.getActualTotal() || orderItem.getChageAmount() < 0){
+            if (orderItem.getChageAmount() >= orderItemDb.getActualTotal() || orderItem.getChageAmount() < 0) {
                 throw new GlobalException("订单金额必须大于0,或者数据发生变化(请刷新后重试)");
             }
-            if (Objects.isNull(orderItem.getChageAmount()) || Objects.equals(orderItem.getChageAmount(),0.00)){
+            if (Objects.isNull(orderItem.getChageAmount()) || Objects.equals(orderItem.getChageAmount(), 0.00)) {
                 continue;
             }
             //修改平台优惠金额
             double playformItemAmount = 0.00;
-            if (orderItemDb.getPlatformShareReduce() > 0){
+            if (orderItemDb.getPlatformShareReduce() > 0) {
                 //金额减少比例 = 减少金额  % 总金额
-                double proportion = Arith.div(orderItem.getChageAmount(),orderItemDb.getProductTotalAmount(),6);
+                double proportion = Arith.div(orderItem.getChageAmount(), orderItemDb.getProductTotalAmount(), 6);
                 //平台优惠金额减少金额 = 减少比例 * 原平台优惠金额
-                playformItemAmount = Arith.round(Arith.mul(proportion,orderItemDb.getPlatformShareReduce()),2);
+                playformItemAmount = Arith.round(Arith.mul(proportion, orderItemDb.getPlatformShareReduce()), 2);
                 //平台优惠金额 = 原平台优惠金额 - 对应比例的金额
-                orderItemDb.setPlatformShareReduce(Arith.sub(orderItemDb.getPlatformShareReduce(),playformItemAmount));
+                orderItemDb.setPlatformShareReduce(Arith.sub(orderItemDb.getPlatformShareReduce(), playformItemAmount));
             }
             //实际金额 = 原实际金额 - 变化金额
-            orderItemDb.setActualTotal(Arith.sub(orderItemDb.getActualTotal(),orderItem.getChageAmount()));
+            orderItemDb.setActualTotal(Arith.sub(orderItemDb.getActualTotal(), orderItem.getChageAmount()));
             //总优惠金额 = 变化金额 + 原总优惠金额
-            orderItemDb.setShareReduce(Arith.add(orderItem.getChageAmount(),orderItemDb.getShareReduce()));
+            orderItemDb.setShareReduce(Arith.add(orderItem.getChageAmount(), orderItemDb.getShareReduce()));
 
-            amount = Arith.add(amount,orderItem.getChageAmount());
-            platformAmount = Arith.add(platformAmount,playformItemAmount);
+            amount = Arith.add(amount, orderItem.getChageAmount());
+            platformAmount = Arith.add(platformAmount, playformItemAmount);
         }
         orderItemService.updateBatchById(orderItemList);
         OrderSettlement orderSettlement = orderSettlementService.getOne(new LambdaQueryWrapper<OrderSettlement>().eq(OrderSettlement::getOrderNumber, order.getOrderNumber()));
         //修改订单信息
-        orderDb.setActualTotal(Arith.sub(orderDb.getActualTotal(),amount));
-        orderDb.setReduceAmount(Arith.add(orderDb.getReduceAmount(),amount));
-        orderDb.setPlatformAmount(Arith.sub(orderDb.getPlatformAmount(),platformAmount));
+        orderDb.setActualTotal(Arith.sub(orderDb.getActualTotal(), amount));
+        orderDb.setReduceAmount(Arith.add(orderDb.getReduceAmount(), amount));
+        orderDb.setPlatformAmount(Arith.sub(orderDb.getPlatformAmount(), platformAmount));
         //初始化
         amount = 0.00;
         // 计算运费变化金额
-        if(!Objects.equals(orderDb.getFreightAmount(),order.getFreightAmount())){
-            amount = Arith.add(amount,Arith.sub(order.getFreightAmount(),orderDb.getFreightAmount()));
+        if (!Objects.equals(orderDb.getFreightAmount(), order.getFreightAmount())) {
+            amount = Arith.add(amount, Arith.sub(order.getFreightAmount(), orderDb.getFreightAmount()));
         }
-        orderDb.setActualTotal(Arith.add(orderDb.getActualTotal(),amount));
+        orderDb.setActualTotal(Arith.add(orderDb.getActualTotal(), amount));
         orderSettlement.setPayAmount(orderDb.getActualTotal());
         orderSettlementService.updateById(orderSettlement);
         //修改运费信息
@@ -436,7 +445,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             mergeIfNeed(writer, firstRow, lastRow, ++col, col, addr.getReceiver());
             // "手机"
             mergeIfNeed(writer, firstRow, lastRow, ++col, col, addr.getMobile());
-            addrInfo=(StringUtils.isEmpty(addr.getAddress())?"":addr.getAddress())+(StringUtils.isEmpty(addr.getAddressName())?"":addr.getAddressName())+(StringUtils.isEmpty(addr.getAddrDetail())?"":addr.getAddrDetail());
+            addrInfo = (StringUtils.isEmpty(addr.getAddress()) ? "" : addr.getAddress()) + (StringUtils.isEmpty(addr.getAddressName()) ? "" : addr.getAddressName()) + (StringUtils.isEmpty(addr.getAddrDetail()) ? "" : addr.getAddrDetail());
             // "收货地址"
             mergeIfNeed(writer, firstRow, lastRow, ++col, col, addrInfo);
             int prodNameCol = ++col;
@@ -455,15 +464,15 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             // 订单实付
             mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getActualTotal());
             //订单状态
-            String[] statusValue = {"","待付款","待发货","待收货","待评价","成功","失败","待成团",""};
+            String[] statusValue = {"", "待付款", "待发货", "待收货", "待评价", "成功", "失败", "待成团", ""};
             String status = statusValue[dbOrder.getStatus()];
 
             String refundStatus = "";
-            String[] refundStatusValue = {"","申请退款","退款成功","退款成功","退款失败"};
+            String[] refundStatusValue = {"", "申请退款", "退款成功", "退款成功", "退款失败"};
             mergeIfNeed(writer, firstRow, lastRow, ++col, col, status);
-            if (!Objects.isNull(dbOrder.getRefundStatus())){
+            if (!Objects.isNull(dbOrder.getRefundStatus())) {
                 refundStatus = refundStatusValue[dbOrder.getRefundStatus()];
-            }else {
+            } else {
                 refundStatus = "暂无售后";
             }
             mergeIfNeed(writer, firstRow, lastRow, ++col, col, refundStatus);
@@ -478,24 +487,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     @Override
     public Order getOrderDetailByOrderNumberAndShopId(String orderNumber, Long shopId) {
-        return orderMapper.getOrderDetailByOrderNumberAndShopId(orderNumber,shopId);
+        return orderMapper.getOrderDetailByOrderNumberAndShopId(orderNumber, shopId);
     }
 
     @Override
     public Map<Long, Integer> getOrderItemMap(Long orderId) {
         List<OrderRefund> orderRefunds = orderRefundMapper.selectList(new LambdaQueryWrapper<OrderRefund>()
                 .eq(OrderRefund::getOrderId, orderId)
-                .lt(OrderRefund::getReturnMoneySts,6)
-                .gt(OrderRefund::getReturnMoneySts,0)
+                .lt(OrderRefund::getReturnMoneySts, 6)
+                .gt(OrderRefund::getReturnMoneySts, 0)
         );
         Map<Long, Integer> map = Maps.newHashMap();
 
-        for (OrderRefund orderRefund:orderRefunds){
-            if (orderRefund.getRefundType() == 1){
-                map.put(0L,orderRefund.getReturnMoneySts());
+        for (OrderRefund orderRefund : orderRefunds) {
+            if (orderRefund.getRefundType() == 1) {
+                map.put(0L, orderRefund.getReturnMoneySts());
                 return map;
             }
-            map.put(orderRefund.getOrderItemId(),orderRefund.getReturnMoneySts());
+            map.put(orderRefund.getOrderItemId(), orderRefund.getReturnMoneySts());
         }
         return map;
     }
@@ -513,7 +522,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 //        String userId = SecurityUtils.getUser().getUserId();
         // 获取订单信息
 //        Order order = orderService.getOrderByOrderNumberAndUserId(orderRefundParam.getOrderNumber(), userId, true);
-        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber,orderRefundParam.getOrderNumber()));
+        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, orderRefundParam.getOrderNumber()));
         if (!Objects.equals(order.getIsPayed(), 1)) {
             throw new GlobalException("当前订单还未付款,无法取消");
         }
@@ -542,8 +551,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
         //待收货 -> 整单退款 -> 退款金额 < 订单金额 - 运费金额
         if (Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value()) && orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
-            Double refundAmount = Arith.sub(order.getActualTotal(),order.getFreightAmount());
-            if (orderRefundParam.getRefundAmount() > refundAmount){
+            Double refundAmount = Arith.sub(order.getActualTotal(), order.getFreightAmount());
+            if (orderRefundParam.getRefundAmount() > refundAmount) {
                 throw new GlobalException("退款金额已超出订单金额,无法申请");
             }
         }
@@ -551,10 +560,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         if (!checkRefundDate(order)) {
             throw new GlobalException("当前订单已确认收货超过" + Constant.MAX_FINALLY_REFUND_TIME + "天,无法退款");
         }
-        if (Objects.equals(order.getOrderType(),Constant.ORDER_TYPE_SCORE)) {
+        if (Objects.equals(order.getOrderType(), Constant.ORDER_TYPE_SCORE)) {
             throw new GlobalException("积分商品,无法退款");
         }
-        if (Objects.equals(orderRefundParam.getRefundType(),RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
+        if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
             throw new GlobalException("该订单已有商品正在退款中,不能再进行整单退款");
         }
         // 生成退款单信息
@@ -564,7 +573,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         List<OrderRefund> orderRefunds = orderRefundMapper.getProcessingOrderRefundByOrderId(order.getOrderId());
 
         for (OrderRefund orderRefund : orderRefunds) {
-            if (Objects.equals(RefundType.ALL.value(),orderRefund.getRefundType())) {
+            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
                 throw new GlobalException("该订单正在进行整单退款,无法进行新的退款操作");
             }
             if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) {
@@ -592,7 +601,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             boolean isCanRefund = false;
             //  查看是否有支付金额和积分都为空的订单,有则抛出异常
             for (OrderItem item : orderItemList) {
-                if(item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0){
+                if (item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0) {
                     isCanRefund = true;
                     break;
                 }
@@ -643,23 +652,23 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         newOrderRefund.setRefundType(orderRefundParam.getRefundType());
 
         newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount());
-        if (Objects.equals(RefundType.ALL.value(),orderRefundParam.getRefundType())) {
+        if (Objects.equals(RefundType.ALL.value(), orderRefundParam.getRefundType())) {
             newOrderRefund.setOrderItemId(0L);
         } else {
             newOrderRefund.setOrderItemId(orderRefundParam.getOrderItemId());
             // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
-            if (Objects.equals(order.getStatus(),OrderStatus.PADYED.value()) && order.getFreightAmount() > 0){
+            if (Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && order.getFreightAmount() > 0) {
                 int orderItenCount = orderItemService.count(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
-                if (Objects.equals(orderRefunds.size(),orderItenCount - 1)){
-                    newOrderRefund.setRefundAmount(Arith.add(newOrderRefund.getRefundAmount(),order.getFreightAmount()));
+                if (Objects.equals(orderRefunds.size(), orderItenCount - 1)) {
+                    newOrderRefund.setRefundAmount(Arith.add(newOrderRefund.getRefundAmount(), order.getFreightAmount()));
                 }
             }
         }
         newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
         newOrderRefund.setApplyType(orderRefundParam.getApplyType());
-        if (Objects.equals(orderRefundParam.getApplyType(),2)){
+        if (Objects.equals(orderRefundParam.getApplyType(), 2)) {
             newOrderRefund.setIsReceiver(true);
-        }else {
+        } else {
             newOrderRefund.setIsReceiver(orderRefundParam.getIsReceiver());
         }
         newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason());
@@ -707,6 +716,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         }
 
     }
+
     private void writeExcel(HttpServletResponse response, ExcelWriter writer) {
         //response为HttpServletResponse对象
         response.setContentType("application/vnd.ms-excel;charset=utf-8");

+ 3 - 3
yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRechargeServiceImpl.java

@@ -113,7 +113,8 @@ public class PointsRechargeServiceImpl extends ServiceImpl<PointsRechargeMapper,
                 CommonUtils.validateCondition(!userName.equals(user.getRealName()),"员工姓名不正确!");
                 CommonUtils.validateCondition(user.getPlatform() == null,"员工未绑定企业,不能导入积分!");
                 //小程序注册未绑定企业没有绑定企业可以正常添加,绑定了必须相同
-                CommonUtils.validateCondition(!channel.getId().equals(user.getPlatform()),"该员工属于企业("+channel.getChannelName()+"),所属企业不匹配!");
+                // 更安全的写法
+                CommonUtils.validateCondition(user.getPlatform() == null || !channel.getId().equals(user.getPlatform().longValue()), "该员工属于企业("+channel.getChannelName()+"),所属企业不匹配!");
 
 
                 pointsRecharge.setChannelId(channel.getId());
@@ -147,8 +148,7 @@ public class PointsRechargeServiceImpl extends ServiceImpl<PointsRechargeMapper,
                 pointsRecord.setPointsAudit(1);
                 pointsRecord.setCreationDate(new Date());
                 pointsRecord.setExpiryDate(pointsRecharge.getExpiryDate());
-                pointsRecordService. save(pointsRecord);
-
+                pointsRecordService.save(pointsRecord);
                 successCount++;
                 addImportRecord(1, "成功", templateDTO, code,userId);
             } catch (GlobalException e) {

+ 3 - 3
yami-shop-service/src/main/java/com/yami/shop/utils/HBSignUtil.java

@@ -20,12 +20,12 @@ import static cn.hutool.crypto.SecureUtil.md5;
 @Configuration
 public class HBSignUtil {
     @Getter
-    @Value("${hb.host}")
+    @Value("${hb.host:https://p-open.hiboos.com}")
     private String hBHost;
     @Getter
-    @Value("${hb.appId}")
+    @Value("${hb.appId:5347a7077e65428bb9a87510ca7e1ea1}")
     private String appId;
-    @Value("${hb.secret}")
+    @Value("${hb.secret:67899367b17e4a8d8a7d10ebe8449b90}")
     private String secret;
 
     /**

+ 1 - 1
yami-shop-service/src/main/resources/mapper/PointsFailureRecordMapper.xml

@@ -21,6 +21,6 @@
         <where>
             <if test="channelId != null">p.channel_id = #{channelId}</if>
         </where>
-        GROUP BY p.code
+        GROUP BY p.code, p.create_by, p.channel_name, u.username, r.role_name
     </select>
 </mapper>

+ 1 - 1
yami-shop-service/src/main/resources/mapper/PointsRechargeMapper.xml

@@ -12,6 +12,6 @@
         <where>
               <if test="channelId != null"> channel_id = #{channelId}</if>
         </where>
-        GROUP BY channel_id
+        GROUP BY channel_id, channel_name
     </select>
 </mapper>

+ 19 - 0
yami-shop-service/src/main/resources/mapper/PointsRecordMapper.xml

@@ -0,0 +1,19 @@
+<?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.yami.shop.dao.PointsRecordMapper">
+
+    <select id="statisticsPoint" resultType="java.lang.Integer">
+        SELECT SUM(
+                       CASE
+                           WHEN points_audit = 1 THEN points
+                           WHEN points_audit = 2 THEN points - variable_points
+                           END
+               ) AS total_available_points
+        FROM tz_points_record
+        WHERE user_id = #{userId}
+          AND channel_id = #{platform}
+          AND points_type IN (1, 3)
+          AND points_audit IN (1, 2)
+          AND (expiry_date > NOW() OR expiry_date IS NULL)
+    </select>
+</mapper>