Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

wangming 5 päivää sitten
vanhempi
commit
5bb33b5153
24 muutettua tiedostoa jossa 640 lisäystä ja 516 poistoa
  1. 17 7
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java
  2. 3 1
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  3. 5 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java
  4. 47 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ScoreDataDto.java
  5. 2 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ReturnMoneyStsType.java
  6. 1 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefundSku.java
  7. 21 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java
  8. 64 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderRefundParam.java
  9. 3 2
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/HBOrderRefundController.java
  10. 3 1
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java
  11. 2 2
      yami-shop-service/src/main/java/com/yami/shop/service/OrderRefundService.java
  12. 16 0
      yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java
  13. 6 181
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java
  14. 77 73
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java
  15. 192 4
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java
  16. 9 6
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java
  17. 6 6
      yami-shop-service/src/main/resources/mapper/OrderMapper.xml
  18. 25 1
      yami-shop-service/src/main/resources/mapper/PointsRecordMapper.xml
  19. 41 7
      yami-shop-service/src/main/resources/mapper/ProductMapper.xml
  20. 22 113
      yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/controller/UserScoreController.java
  21. 0 3
      yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/listener/SubmitOrderListener.java
  22. 0 90
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/dto/ScoreDataDto.java
  23. 10 4
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/UserScoreDetailService.java
  24. 68 11
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/UserScoreDetailServiceImpl.java

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

@@ -22,6 +22,7 @@ import com.yami.shop.bean.event.SubmitSeckillOrderEvent;
 import com.yami.shop.bean.model.*;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.util.Arith;
+import com.yami.shop.dao.PointsRecordMapper;
 import com.yami.shop.security.api.util.SecurityUtils;
 import com.yami.shop.service.*;
 import com.yami.shop.service.hb.IHBOrderService;
@@ -61,6 +62,8 @@ public class OrderController {
     private UserAddrOrderService userAddrOrderService;
     @Autowired
     private IQnhService qnhService;
+    @Autowired
+    private PointsRecordMapper pointsRecordMapper;
 
     @Autowired
     private IHBOrderService hbOrderService;
@@ -76,7 +79,7 @@ public class OrderController {
                 Basket byId = basketService.getById(basketId);
                 Sku byIdss = skuService.getById(byId);
                 boolean skuStock = qnhService.getSkuStock(byIdss.getSkuCode(), byId.getProdId(), orderParam.getPlatform());
-                Product byId1 = productService.getById(byId.getProdId(),orderParam.getPlatform());
+                Product byId1 = productService.getById(byId.getProdId(), orderParam.getPlatform());
 //                byId1.setTotalStocks(byIdss.getStocks());
                 productService.updateById(byId1);
                 if (skuStock && byId1.getTotalStocks() < byId.getBasketCount()) {
@@ -100,7 +103,7 @@ public class OrderController {
         UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class);
         // 组装获取用户提交的购物车商品项
         OrderItemParam orderItem = orderParam.getOrderItem();
-        if(null != orderItem){
+        if (null != orderItem) {
             orderItem.setPlatform(orderParam.getPlatform());
         }
         List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderItem, userId);
@@ -110,12 +113,17 @@ public class OrderController {
         // 根据店铺组装购车中的商品信息,返回每个店铺中的购物车商品信息
         List<ShopCartDto> shopCarts = basketService.getShopCarts(shopCartItems, 0L);
 
-
-
+        Long point = pointsRecordMapper.statisticsPoint(userId, orderParam.getPlatform());
+        double v = 0.0;
         // 将要返回给前端的完整的订单信息
         ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto();
         shopCartOrderMergerDto.setUserAddr(userAddrDto);
         shopCartOrderMergerDto.setIsScorePay(orderParam.getIsScorePay());
+        if (null != point) {
+            v = ((double) point / 100);
+            //总的可用积分
+            shopCartOrderMergerDto.setTotalAvailableScore(point);
+        }
         // 所有店铺的订单信息
         List<ShopCartOrderDto> shopCartOrders = new ArrayList<>();
 
@@ -183,8 +191,9 @@ public class OrderController {
             shopCartOrders.get(n).setShopCartItemDiscounts(shopCartItemDiscounts);
             actualTotal = Arith.add(actualTotal, shopCartOrderDto.getActualTotal());
         }
-
-        shopCartOrderMergerDto.setActualTotal(actualTotal);
+        //v
+        shopCartOrderMergerDto.setActualTotal(Arith.sub(actualTotal, v) < 0 ? 0 : Arith.sub(actualTotal, v));
+        shopCartOrderMergerDto.setTotalUsableScore(Arith.sub(actualTotal, v) < 0 ? actualTotal : v);//总共消耗的积分
         shopCartOrderMergerDto.setTotal(total);
         shopCartOrderMergerDto.setTotalCount(totalCount);
         shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
@@ -231,7 +240,8 @@ public class OrderController {
             allOrderReduce = Arith.add(allOrderReduce, shopCartOrder.getShopReduce());
             totalTransfee = Arith.add(totalTransfee, shopCartOrder.getTransfee());
         }
-        shopCartOrderMergerDto.setActualTotal(actualTotal);
+        shopCartOrderMergerDto.setActualTotal(Arith.sub(actualTotal, v) < 0 ? 0 : Arith.sub(actualTotal, v));
+        shopCartOrderMergerDto.setTotalUsableScore(Arith.sub(actualTotal, v) < 0 ? actualTotal : v);//总共消耗的积分
         shopCartOrderMergerDto.setTotalTransfee(totalTransfee);
         shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
 

+ 3 - 1
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -130,7 +130,7 @@ public class SubmitOrderListener {
             // 每个店铺生成一个订单
             for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) {
                 //兑换人民币是分,必须要实时统计计算
-                Integer point = pointsRecordMapper.statisticsPoint(userId, mergerOrder.getPlatform());
+                Long point = pointsRecordMapper.statisticsPoint(userId, mergerOrder.getPlatform());
                 // 使用雪花算法生成的订单号
                 String orderNumber = String.valueOf(snowflake.nextId());
                 shopCartOrderDto.setOrderNumber(orderNumber);
@@ -432,12 +432,14 @@ public class SubmitOrderListener {
                 pr.setVariablePoints(BigDecimal.valueOf(actualTotal));
                 actualTotal = 0.0;
             }
+            pointsRecord.setCurrentlyAvailablePoints(pointsRecord.getPoints().subtract(pointsRecord.getVariablePoints()));
             int update = pointsRecordMapper.updateById(pointsRecord);
             if (update > 0) {
                 pr.setId(null);
                 pr.setPointsType(2);
                 pr.setOrderNumber(orderNumber);
                 pr.setExpiryDate(null);
+                pr.setCurrentlyAvailablePoints(pr.getPoints().subtract(pr.getVariablePoints()));
                 pointsRecordMapper.insert(pr);
             }
             //  插入数据库

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

@@ -39,7 +39,10 @@ public class ShopCartOrderMergerDto implements Serializable {
     private Integer scorePrice;
 
     @ApiModelProperty(value = "整个订单使用的积分数", required = true)
-    private Integer totalUsableScore = 0;
+    private Double totalUsableScore = 0.0;
+
+    @ApiModelProperty(value = "所有可用积分")
+    private Long totalAvailableScore;
 
     @ApiModelProperty(value = "整个订单最多可以使用的积分数", required = true)
     private Integer maxUsableScore = 0;
@@ -80,5 +83,6 @@ public class ShopCartOrderMergerDto implements Serializable {
     private Integer platform;
 
     private Double weight;
+
     private Boolean nextPay = Boolean.FALSE;
 }

+ 47 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ScoreDataDto.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ */
+
+package com.yami.shop.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 积分中心信息
+ *
+ * @author LHD
+ * @date 2019-12-19 10:27:46
+ */
+@Data
+public class ScoreDataDto implements Serializable{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户总充值积分
+     */
+    @ApiModelProperty(value = "用户总充值积分")
+    private Long totalRechargedPoints;
+    /**
+     * 已过期的积分
+     */
+    @ApiModelProperty(value = "已过期的积分")
+    private Long expiredPoints;
+    /**
+     * 当前可用积分
+     */
+    @ApiModelProperty(value = "当前可用积分")
+    private Long totalAvailablePoints;
+     /**
+     * 已消耗的积分
+     */
+    @ApiModelProperty(value = "已消耗的积分")
+    private Long consumedPoints;
+
+
+}

+ 2 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ReturnMoneyStsType.java

@@ -21,6 +21,7 @@ public enum ReturnMoneyStsType {
      * 待确认收货(二审待审核)
      */
     RECEIVE(65),
+
     /**
      * 退款成功
      */
@@ -32,7 +33,7 @@ public enum ReturnMoneyStsType {
     CANCEL(40),
 
     /**
-     * 商家拒绝
+     * 商家拒绝(驳回)
      */
     REJECT(30),
 

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

@@ -30,7 +30,7 @@ public class OrderRefundSku implements Serializable{
     private Long id;
 
     /**
-     * 退款编号
+     * 退款商品ID
      */
     private Long skuId;
 

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

@@ -1,5 +1,6 @@
 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;
@@ -7,7 +8,6 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -66,6 +66,10 @@ public class PointsRecord implements Serializable {
      * 变动积分
      */
     private BigDecimal variablePoints;
+    /**
+     * 当前可用积分
+     */
+    private BigDecimal currentlyAvailablePoints;
 
     /**
      * 积分记录类型(1-充值,2-下单,3-退款)
@@ -82,10 +86,26 @@ public class PointsRecord implements Serializable {
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date creationDate;
+    //
+    @TableField(exist = false)
+    private String creationDateStr;
+
+    @TableField(exist = false)
+    private String pointsTypeStr;
+
+    @TableField(exist = false)
+    private Long totalAvailablePoints;
+
+    /**
+     * 变动积分
+     */
+    @TableField(exist = false)
+    private String variablePointsStr;
 
     /**
      * 过期日期
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date expiryDate;
+
 }

+ 64 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderRefundParam.java

@@ -10,10 +10,14 @@
 
 package com.yami.shop.bean.param;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yami.shop.bean.model.OrderRefundSku;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Data
 public class OrderRefundParam {
@@ -23,12 +27,67 @@ public class OrderRefundParam {
     @NotEmpty(message = "退款ID不能为空")
     private Long refundId;
 
+
+    @ApiModelProperty(value = "订单编号", required = true)
+    @NotEmpty(message = "订单编号不能为空")
+    private String orderNumber;
+
+
+    @ApiModelProperty(value = "退款金额", required = true)
+    @NotNull(message = "退款金额不能为空")
+    private Double refundAmount;
+    @ApiModelProperty(value = "申请类型(1:仅退款 2退款退货)", required = true)
+    @NotNull(message = "申请类型不能为空")
+    private Integer applyType;
+
+    @ApiModelProperty(value = "退款数量(0或不传值则为全部数量)", required = true)
+    private Integer goodsNum = 0;
+
+    /**
+     * 仅退款-未收到货申请原因
+     *      11(质量问题)
+     *      12(拍错/多拍/不喜欢)
+     *      3(商品描述不符)
+     *      14(假货), 15(商家发错货)
+     *      16(商品破损/少件)
+     *      17(其他)
+     * 仅退款-已收到货申请原因
+     *      51(多买/买错/不想要)
+     *      52(快递无记录)
+     *      53(少货/空包裹)
+     *      54(未按约定时间发货)
+     *      55(快递一直未送达)
+     *      56(其他)
+     * 退货退款-申请原因
+     *      101(商品破损/少件)
+     *      102(商家发错货)
+     *      103(商品描述不符)
+     *      104(拍错/多拍/不喜欢)
+     *      105(质量问题)
+     *      107(其他)
+     */
+    @ApiModelProperty(value = "申请原因(下拉选择)", required = true)
+    @NotNull(message = "申请原因不能为空")
+    private String buyerReason;
+    @ApiModelProperty(value = "手机号码(默认当前订单手机号码)", required = true)
+    @NotNull(message = "手机号码不能为空")
+    private String buyerMobile;
+
+    @ApiModelProperty(value = "备注说明", required = true)
+    private String buyerDesc;
+
+    @ApiModelProperty(value = "凭证图片列表", required = true)
+    private String photoFiles;
+
     /**
      * 退款编号
      */
     @NotEmpty(message = "退款编号不能为空")
     private String refundSn;
 
+    @ApiModelProperty(value = "退款单类型(1:整单退款,2:单个物品退款)", required = true)
+    @NotNull(message = "退款单类型不能为空")
+    private Integer refundType;
     /**
      * 处理状态(2:同意,3:不同意)
      */
@@ -60,4 +119,9 @@ public class OrderRefundParam {
      * 是否收到货
      */
     private Boolean isReceiver;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "退款商品详情")
+    private List<OrderRefundSku> orderRefundSkuList;
+
 }

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

@@ -57,11 +57,12 @@ public class HBOrderRefundController {
     /**
      * 退款-退款单状态同步(上行)
      * @param afterSaleOrder  退款单号
+     *  @param  refundStatus 退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
      */
     @PostMapping("/changeStatus")
-    public HBR changeStatus(String afterSaleOrder) {
+    public HBR changeStatus(String afterSaleOrder,Integer refundStatus) {
         log.info("海博售后订单状态同步afterSaleOrder:{}",afterSaleOrder);
-        return HBR.success(orderRefundService.changeStatus(afterSaleOrder));
+        return HBR.success(orderRefundService.changeStatus(afterSaleOrder,refundStatus));
     }
 
 

+ 3 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java

@@ -2,6 +2,7 @@
 package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.bean.model.PointsRecord;
 import org.apache.ibatis.annotations.Param;
 
@@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
  * @since 2025-09-XX
  */
 public interface PointsRecordMapper extends BaseMapper<PointsRecord> {
-    Integer statisticsPoint(@Param("userId") String userId, @Param("platform") Integer platform);
+    Long statisticsPoint(@Param("userId") String userId, @Param("platform") Integer platform);
+    ScoreDataDto statisticsAllScorePoint(@Param("userId") String userId, @Param("platform") Integer platform);
 
 }

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

@@ -141,7 +141,6 @@ public interface OrderRefundService extends IService<OrderRefund> {
     void overTimeRefundOrder(com.yami.shop.bean.app.param.OrderRefundParam orderRefundParam);
 
 
-
     //*************************** 售后接口 ***************************
     /**
      * 创建退款订单接口-推送接口
@@ -153,8 +152,9 @@ public interface OrderRefundService extends IService<OrderRefund> {
     /**
      * 退款-退款单状态同步(上行)
      * @param afterSaleOrder  退款单号
+     *  退款单状态 退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
      */
-    String changeStatus(String afterSaleOrder);
+    String changeStatus(String afterSaleOrder,Integer  refundStatus);
 
 
     /**

+ 16 - 0
yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java

@@ -21,6 +21,7 @@ import com.yami.shop.bean.model.OrderItem;
 import com.yami.shop.bean.param.CancelOrderParam;
 import com.yami.shop.bean.param.OrderParam;
 import com.yami.shop.bean.param.OrderPayParam;
+import com.yami.shop.bean.param.OrderRefundParam;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.servlet.http.HttpServletResponse;
@@ -113,4 +114,19 @@ public interface OrderService extends IService<Order> {
     Map<Long, Integer> getOrderItemMap(Long orderId);
 
     String cancelOrder(CancelOrderParam cancelOrderParam);
+
+
+    /**
+     * 订单申请退款
+     * @param orderRefundParam 订单申请退款参数
+     * @param rReturnMoneySts 退款状态
+     * @return 订单申请退款结果
+     */
+    String applyAgain(OrderRefundParam orderRefundParam , Integer  rReturnMoneySts);
+    /**
+     * 订单申请退款
+     * @param orderNumber 订单单号
+     * @return 订单申请退款结果
+     */
+    void returnRefund(String orderNumber);
 }

+ 6 - 181
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java

@@ -6,10 +6,10 @@ 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.yami.shop.bean.app.param.OrderRefundParam;
 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.common.config.Constant;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.util.Arith;
@@ -202,6 +202,8 @@ public class HBOrderService implements IHBOrderService {
         order.setHbOrderStatus(operatorType);
         if (operatorType == 70) {
             order.setHbOrderStatus(80);
+        } else if (operatorType == 60) {
+            order.setHbOrderStatus(60);
         }
         orderMapper.updateById(order);
 
@@ -217,7 +219,7 @@ public class HBOrderService implements IHBOrderService {
             orderRefundParam.setRefundType(1);
             orderRefundParam.setIsReceiver(false);
             orderRefundParam.setBuyerReason("17");
-            orderRefundParam.setBuyerDesc(bodyJson.getString("remark"));
+            orderRefundParam.setBuyerDesc(bodyJson.getString("reason"));
             orderRefundParam.setBuyerMobile(order.getUserMobile());
             orderRefundParam.setGoodsNum(order.getProductNums());
             orderRefundParam.setRefundAmount(order.getActualTotal());
@@ -232,11 +234,9 @@ public class HBOrderService implements IHBOrderService {
                 orderRefundSku.setProductCount(orderItem.getProdCount());
                 orderRefundSku.setSkuPrice(orderItem.getPrice());
                 orderRefundSkuList.add(orderRefundSku);
-                orderRefundParam.setOrderRefundSkuList(orderRefundSkuList);
             }
-
-
-            String afterSaleOrder = applyAgain(orderRefundParam);
+            orderRefundParam.setOrderRefundSkuList(orderRefundSkuList);
+            String afterSaleOrder = orderService.applyAgain(orderRefundParam, ReturnMoneyStsType.SUCCESS.value());
             orderRefundService.createRefundOrder(order.getOrderNumber(), afterSaleOrder);
 
         }
@@ -478,183 +478,8 @@ public class HBOrderService implements IHBOrderService {
         return HBR.success(createOrderRequest);
     }
 
-    /**
-     * 退货退款
-     */
-    private void returnRefund(String orderNumber) {
-        Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>()
-                .eq(Order::getOrderNumber, orderNumber)
-                .in(Order::getHbOrderStatus, List.of(OrderStatus.CONSIGNMENT.value(), OrderStatus.SUCCESS.value()))
-        );
-        if (null != order) {
-            //判定已完成的时间
-            if (Objects.equals(order.getHbOrderStatus(), OrderStatus.SUCCESS.value()) && isPaymentOver7Days(order.getPayTime())) {
-                throw new GlobalException("支付完成已经超过7天,不支持退款");
-            }
-            //可以直接退积分或者是钱
-            if (order.getActualTotal() > 0) {
-                //退,微信支付
-            } else {
-                //退,积分
-            }
-        }
-    }
-
-
-    /**
-     * 生成退款单 请求
-     *
-     * @param orderRefundParam 退款单数据
-     * @return
-     */
-    private String applyAgain(OrderRefundParam orderRefundParam) {
-        log.info(" 海博申请退款参数:{}", JSONObject.toJSONString(orderRefundParam));
-        List<OrderRefundSku> orderRefundSkuList = orderRefundParam.getOrderRefundSkuList();
-
-        Order order = orderMapper.getOrderAndOrderItemByOrderNumber(orderRefundParam.getOrderNumber());
-
-        if (!Objects.equals(order.getIsPayed(), 1)) {
-            throw new GlobalException("当前订单还未付款,无法申请");
-        }
-
-        if (!orderRefundService.checkRefundDate(order)) {
-            throw new GlobalException("当前订单已确认收货超过" + Constant.MAX_FINALLY_REFUND_TIME + "天,无法退款");
-        }
-
-        if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
-            throw new GlobalException("该订单已有商品正在退款中,不能再进行整单退款");
-        }
-
-        OrderRefund newOrderRefund = new OrderRefund();
-
-        // 获取所有正在进行中的退款订单
-        List<OrderRefund> orderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(order.getOrderId());
-
-        for (OrderRefund orderRefund : orderRefunds) {
-            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
-                throw new GlobalException("该订单正在进行整单退款,无法进行新的退款操作");
-            }
-
-//            if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) {
-//                throw new GlobalException("该商品正在进行退款中,无法进行新的退款操作");
-//            }
-        }
-
-        // 如果存在分销订单,则计算分销总金额
-        List<OrderItem> orderItemList = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
-        // 判断退款单类型(1:整单退款,2:单个物品退款)
-
-        if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
-            // 全部物品退款
-            // 计算该订单项的分销金额
-            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(orderItemList));
-            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
-            newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount());
-            newOrderRefund.setOrderItemId(0L);
-        } else {
-            CullenUtils.validateDataThrowException(orderRefundSkuList.isEmpty(), "退款商品不能为空...");
-            // 部分物品退款
-            OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>()
-                    .eq(OrderItem::getOrderItemId, orderRefundParam.getOrderItemId())
-                    .eq(OrderItem::getOrderNumber, orderRefundParam.getOrderNumber()));
-            if (orderItem == null) {
-                throw new GlobalException("该物品在订单中不存在");
-            }
-            boolean isCanRefund = false;
-            //  查看是否有支付金额和积分都为空的订单,有则抛出异常
-            for (OrderItem item : orderItemList) {
-                if (item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0) {
-                    isCanRefund = true;
-                    break;
-                }
-            }
-            if (isCanRefund) {
-                throw new GlobalException("该订单部分订单项支付金额和积分为0,无法使用部分退款!");
-            }
-
-            if (order.getPlatformAmount() > 0 && !Arith.isEquals(orderRefundParam.getRefundAmount(), orderItem.getActualTotal())) {
-                throw new GlobalException("该订单有使用平台优惠,无法使用部分退款!");
-            }
-            // 计算该订单项的分销金额
-            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(Collections.singletonList(orderItem)));
-
-            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
-            newOrderRefund.setPlatformRefundAmount(orderItem.getPlatformShareReduce());
-
-            // 退款物品数量为null或者0时,则为退款全部数量
-            if (orderRefundParam.getGoodsNum() <= 0) {
-                orderRefundParam.setGoodsNum(orderItem.getProdCount());
-            }
-
-            // 判断退款数量是否溢出
-            if (orderRefundParam.getGoodsNum() > orderItem.getProdCount()) {
-                throw new GlobalException("退款物品数量已超出订单中的数量,不允许申请");
-            }
-
-            // 判断退款金额是否超出订单金额
-            double refundSingleAmount = Arith.div(orderRefundParam.getRefundAmount(), orderRefundParam.getGoodsNum(), 3);
-            double singleAmount = Arith.div(orderItem.getActualTotal(), orderItem.getProdCount(), 3);
-            if (refundSingleAmount > orderItem.getProductTotalAmount() || refundSingleAmount > singleAmount) {
-                throw new GlobalException("退款金额已超出订单金额,无法申请");
-            }
-
-            newOrderRefund.setOrderItemId(orderRefundParam.getOrderItemId());
-            // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
-            if (Objects.equals(order.getHbOrderStatus(), 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()));
-                }
-            }
-        }
-
-        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());
-        newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount());
-
 
-        newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
-        newOrderRefund.setApplyType(orderRefundParam.getApplyType());
-        if (Objects.equals(orderRefundParam.getApplyType(), 2)) {
-            newOrderRefund.setIsReceiver(true);
-        } else {
-            newOrderRefund.setIsReceiver(orderRefundParam.getIsReceiver());
-        }
-        newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason());
-        newOrderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc());
-        newOrderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile());
-        newOrderRefund.setPhotoFiles(orderRefundParam.getPhotoFiles());
-        newOrderRefund.setReturnMoneySts(ReturnMoneyStsType.APPLY.value());
-        newOrderRefund.setApplyTime(new Date());
-        newOrderRefund.setUpdateTime(new Date());
-        log.info("生成退款单:{}", newOrderRefund);
-        OrderRefund orderRefund = orderRefundService.applyRefund(newOrderRefund);
-        if (ObjectUtil.isNotEmpty(orderRefundSkuList)) {
-            orderRefundSkuList.forEach(c -> {
-                c.setOrderRefundId(orderRefund.getRefundId());
-                orderRefundSkuMapper.insert(c);
-            });
-        }
-
-//        orderRefundService.removeById(refundId);
-//        orderRefundSkuMapper.delete(new LambdaQueryWrapper<OrderRefundSku>().eq(OrderRefundSku::getOrderRefundId,refundId));
-        return newOrderRefund.getRefundSn();
-    }
 
 
-    private boolean isPaymentOver7Days(Date paymentDate) {
-        // 1. 将支付时间转换为 Instant
-        Instant paymentInstant = paymentDate.toInstant();
-        // 2. 增加 7 天(精确到毫秒,考虑时区)
-        Instant expirationInstant = paymentInstant.plus(7, java.time.temporal.ChronoUnit.DAYS);
-        // 3. 获取当前时间
-        Instant nowInstant = Instant.now();
-        // 4. 比较时间
-        return nowInstant.isAfter(expirationInstant) || nowInstant.equals(expirationInstant);
-    }
 
 }

+ 77 - 73
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java

@@ -34,6 +34,7 @@ import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.dao.*;
 import com.yami.shop.service.*;
 import com.yami.shop.service.hb.IHBOrderService;
+import com.yami.shop.utils.CullenUtils;
 import com.yami.shop.utils.HBSignUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -268,7 +269,12 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         save(orderRefund);
         // 更新订单状态
         Order order = orderService.getById(orderRefund.getOrderId());
-        order.setRefundStatus(RefundStatusEnum.APPLY.value());
+        Integer refundType = orderRefund.getRefundType();
+        if (Objects.equals(refundType, RefundType.ALL.value())) {
+            order.setRefundStatus(RefundStatusEnum.APPLY.value());
+        } else {
+            order.setRefundStatus(RefundStatusEnum.PARTIAL_SUCCESS.value());
+        }
         orderService.updateById(order);
         return orderRefund;
     }
@@ -952,23 +958,25 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         build.setBody(JSON.toJSONString(requestBody));
 
         build.setSign(hbSignUtil.signMd5(build));
-        log.info("post 单推送单号参数:{}", JSON.toJSONString(build));
+        log.info("post 退款单推送单号参数:{}", JSON.toJSONString(build));
         String post = post(hbSignUtil.getHBHost() + "/api/refund/asyncSave", build);
-        log.info("post 单推送结果:{}", post);
+        log.info("post 退款单推送结果:{}", post);
         return post;
     }
 
     @Override
-    public String changeStatus(String afterSaleOrder) {
+    public String changeStatus(String afterSaleOrder, Integer refundStatus) {
         HBBaseReq<Object> build = HBBaseReq.create();
         build.setAppId(hbSignUtil.getAppId());
         OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
+        orderRefund.setReturnMoneySts(refundStatus);
+        orderRefundMapper.updateById(orderRefund);
 
         // 3. 构建外层请求体
         JSONObject requestBody = new JSONObject();
         requestBody.put("afterSaleOrder", afterSaleOrder);
 //        退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货(一审同意) 65:待确认收货(二审待审核) 70:退款完成
-        requestBody.put("refundStatus", refundHbStatus(orderRefund.getReturnMoneySts()));
+        requestBody.put("refundStatus", refundStatus);
         requestBody.put("timestamp", orderRefund.getApplyTime().getTime());
 
 //        deliveryMan 退货的配送员名称
@@ -978,9 +986,15 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         // 4. 将整个JSON对象序列化为字符串并设置
         build.setBody(JSON.toJSONString(requestBody));
         build.setSign(hbSignUtil.signMd5(build));
-        log.info("post 单推送单号参数:{}", JSON.toJSONString(build));
+        log.info("post 退款单推送单号参数:{}", JSON.toJSONString(build));
         String post = post(hbSignUtil.getHBHost() + "/api/refund/changeStatus", build);
-        log.info("post 订单推送结果:{}", post);
+        log.info("post 退款单推送结果:{}", post);
+
+        //TODO 退款单完成处理积分
+        if (refundStatus == 70){
+            orderService.returnRefund(orderRefund.getOrderNumber());
+        }
+
         return post;
     }
 
@@ -1002,8 +1016,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             thirdPartyRefundRequest.setProblemDescription(orderRefund.getBuyerDesc());
             thirdPartyRefundRequest.setPictures(orderRefund.getPhotoFiles());
 
-            Integer returnMoneySts = orderRefund.getReturnMoneySts();
-            thirdPartyRefundRequest.setRefundStatus(refundHbStatus(returnMoneySts));
+            thirdPartyRefundRequest.setRefundStatus(orderRefund.getReturnMoneySts());
             Integer applyType = orderRefund.getApplyType();
             if (Objects.equals(applyType, 2)) {
                 thirdPartyRefundRequest.setApplyDeal(40);
@@ -1019,15 +1032,15 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
 
 
             List<ProductRequest> productRequests = new ArrayList<>();
-            orderItemService.list(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, orderRefund.getOrderId())).forEach(orderItem -> {
-                Sku sku = skuService.getById(orderItem.getSkuId());
+            orderRefundSkuMapper.selectList(new LambdaQueryWrapper<OrderRefundSku>().eq(OrderRefundSku::getOrderRefundId, orderRefund.getRefundId())).forEach(orderRefundSku -> {
+                Sku sku = skuService.getById(orderRefundSku.getSkuId());
                 ProductRequest productRequest = new ProductRequest();
-                productRequest.setSkuName(orderItem.getSkuName());
-                productRequest.setSkuId(orderItem.getSkuId());
+                productRequest.setSkuName(sku.getSkuName());
+                productRequest.setSkuId(orderRefundSku.getSkuId());
                 productRequest.setChannelSkuId(sku.getHbSkuId());
 //                productRequest.setUpcCode(orderItem.getSkuId());
-                productRequest.setRefundCount(orderItem.getProdCount());
-                productRequest.setRefundMoney((long) (orderItem.getProductTotalAmount() == null ? 0 : orderItem.getProductTotalAmount() * 100));
+                productRequest.setRefundCount(orderRefundSku.getProductCount());
+                productRequest.setRefundMoney((long) (orderRefundSku.getSkuPrice() == null ? 0 : orderRefundSku.getProductCount() * orderRefundSku.getSkuPrice() * 100));
                 productRequest.setTransId(sku.getSkuId().toString());
                 productRequests.add(productRequest);
 
@@ -1043,16 +1056,15 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             thirdPartyRefundRequest.setOrderPayments(orderPaymentRequests);
             log.info("退款订单信息,参数:{}", thirdPartyRefundRequest);
 
-
             // 返回退款单信息
-            changeStatus(orderRefund.getRefundSn());
+            changeStatus(orderRefund.getRefundSn(), orderRefund.getReturnMoneySts());
 
         } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
             HBR.error("未知异常");
         }
 
-
+        log.info("退款订单信息,返回:{}", thirdPartyRefundRequest);
         return HBR.success(thirdPartyRefundRequest);
     }
 
@@ -1076,14 +1088,11 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
 
             OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
 
-            if (auditType == 2) {
-                orderRefund.setApplyType(applyDeal);
-                orderRefund.setReturnMoneySts(2);
-            } else if (auditType == 4) {
+            if (auditType == 2 || auditType == 4) {
                 orderRefund.setApplyType(applyDeal);
-                orderRefund.setReturnMoneySts(2);
+                orderRefund.setReturnMoneySts(ReturnMoneyStsType.PROCESSING.value());
             } else {
-                orderRefund.setReturnMoneySts(7);
+                orderRefund.setReturnMoneySts(ReturnMoneyStsType.REJECT.value());
                 orderRefund.setRejectMessage(bodyStr.getString("reason"));
             }
             orderRefundMapper.updateById(orderRefund);
@@ -1115,16 +1124,14 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
 
             OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
 
-            if (auditType == 2) {
-                orderRefund.setReturnMoneySts(2);
+            if (auditType == 2 || auditType == 4) {
                 orderRefund.setIsReceiver(true);
-            } else if (auditType == 4) {
-                orderRefund.setIsReceiver(true);
-                orderRefund.setReturnMoneySts(2);
+                orderRefund.setReturnMoneySts(ReturnMoneyStsType.PROCESSING.value());
             } else {
-                orderRefund.setReturnMoneySts(7);
+                orderRefund.setReturnMoneySts(ReturnMoneyStsType.REJECT.value());
                 orderRefund.setRejectMessage(bodyStr.getString("reason"));
             }
+
             orderRefundMapper.updateById(orderRefund);
 
 
@@ -1151,8 +1158,21 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             Integer auditType = bodyStr.getInteger("auditType");
             Integer applyDeal = bodyStr.getInteger("applyDeal");
 
-            OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderNumber, channelOrderId));
 
+            OrderRefundParam orderRefundParam = new OrderRefundParam();
+            Order order = orderMapper.getOrderAndOrderItemByOrderNumber(channelOrderId);
+
+            orderRefundParam.setOrderNumber(channelOrderId);
+            orderRefundParam.setRefundType( RefundType.SINGLE.value());
+            orderRefundParam.setApplyType(1);
+            orderRefundParam.setRefundType(1);
+            orderRefundParam.setIsReceiver(false);
+            orderRefundParam.setBuyerReason("17");
+            orderRefundParam.setBuyerDesc(bodyStr.getString("reason"));
+            orderRefundParam.setBuyerMobile(order.getUserMobile());
+            orderRefundParam.setRefundAmount(order.getActualTotal());
+
+            OrderRefund orderRefund = new OrderRefund();
             if (ObjectUtil.isNotEmpty(applyDeal)) {
                 if (applyDeal == 10) {
                     orderRefund.setApplyType(1);
@@ -1161,32 +1181,42 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
                 }
             }
 
-            if (auditType == 2) {
-                orderRefund.setReturnMoneySts(2);
-                orderRefund.setIsReceiver(true);
-            } else if (auditType == 4) {
+            if (auditType == 2 || auditType == 4) {
                 orderRefund.setIsReceiver(true);
-                orderRefund.setReturnMoneySts(2);
+                orderRefund.setReturnMoneySts(ReturnMoneyStsType.PROCESSING.value());
             } else {
-                orderRefund.setReturnMoneySts(7);
+                orderRefund.setReturnMoneySts(ReturnMoneyStsType.REJECT.value());
                 orderRefund.setRejectMessage(bodyStr.getString("reason"));
             }
 
             JSONArray products = bodyStr.getJSONArray("products");
             log.info("部分退款接口-回调接口,products:{}", products);
+
+
+            List<OrderRefundSku> orderRefundSkuList = new ArrayList<>();
+            int goodsNum = 0;
             for (Object product : products) {
-                JSONObject productJson = (JSONObject) product;
+                JSONObject productJson = JSON.parseObject(product.toString());
+                long channelSkuId = Long.parseLong(productJson.getString("channelSkuId"));
                 OrderRefundSku orderRefundSku = new OrderRefundSku();
-                String skuId = productJson.getString("skuId");
-                orderRefundSku.setSkuId(Long.parseLong(productJson.getString("channelSkuId")));
-                orderRefundSku.setProductCount(Integer.parseInt(productJson.getString("productCount")));
-                orderRefundSkuMapper.insert(orderRefundSku);
+//                String skuId = productJson.getString("skuId");
+                skuService.getOne(new LambdaQueryWrapper<Sku>().eq(Sku::getHbSkuId, channelSkuId));
+                OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getSkuId, channelSkuId)
+                        .eq(OrderItem::getOrderNumber, channelOrderId));
+
+                orderRefundSku.setSkuId(orderItem.getSkuId());
+                orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
+                orderRefundSku.setSkuPrice(orderItem.getPrice());
+                int count = Integer.parseInt(productJson.getString("productCount"));
+                goodsNum += count;
+                orderRefundSku.setProductCount(count);
+                orderRefundSkuList.add(orderRefundSku);
             }
+            orderRefund.setGoodsNum(goodsNum);
+            orderRefundParam.setOrderRefundSkuList(orderRefundSkuList);
 
 
-            Order orderByOrderNumber = orderService.getById(orderRefund.getOrderId());
-            orderByOrderNumber.setRefundStatus(3);
-            orderService.updateById(orderByOrderNumber);
+            orderService.applyAgain(orderRefundParam,ReturnMoneyStsType.APPLY.value());
 
         } catch (Exception e) {
             log.error("海博退款订单查询异常:{}", e);
@@ -1204,7 +1234,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
             String afterSaleOrder = bodyStr.getString("afterSaleOrder");
 
             OrderRefund orderRefund = orderRefundMapper.selectOne(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getRefundSn, afterSaleOrder));
-            orderRefund.setReturnMoneySts(5);
+            orderRefund.setReturnMoneySts(ReturnMoneyStsType.SUCCESS.value());
             orderRefundMapper.updateById(orderRefund);
 
             Order orderByOrderNumber = orderService.getById(orderRefund.getOrderId());
@@ -1218,31 +1248,5 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
         return HBR.success();
     }
 
-    /**
-     * 系统订单状态转换为海博订单状态
-     * 退款单状态 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;
-    }
+
 }

+ 192 - 4
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -15,9 +15,11 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.IORuntimeException;
 import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -36,16 +38,15 @@ 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.common.util.PageAdapter;
-import com.yami.shop.dao.OrderMapper;
-import com.yami.shop.dao.OrderRefundMapper;
-import com.yami.shop.dao.ProductMapper;
-import com.yami.shop.dao.SkuMapper;
+import com.yami.shop.dao.*;
 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 com.yami.shop.utils.CullenUtils;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,12 +62,14 @@ import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.time.Instant;
 import java.util.*;
 import java.util.stream.Collectors;
 
 /**
  * @author lgh on 2018/09/15.
  */
+@Slf4j
 @Service
 @AllArgsConstructor
 public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
@@ -88,6 +91,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private Snowflake snowflake;
 
 
+    private final OrderRefundSkuMapper orderRefundSkuMapper;
 
 
     @Override
@@ -735,4 +739,188 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             }
         }
     }
+
+
+    /**
+     * 生成退款单 请求
+     *
+     * @param orderRefundParam 退款单数据
+     * @return rReturnMoneySts
+     */
+    @Override
+    public String applyAgain(OrderRefundParam orderRefundParam, Integer rReturnMoneySts) {
+        log.info(" 海博申请退款参数:{}", JSONObject.toJSONString(orderRefundParam));
+        List<OrderRefundSku> orderRefundSkuList = orderRefundParam.getOrderRefundSkuList();
+
+        Order order = orderMapper.getOrderAndOrderItemByOrderNumber(orderRefundParam.getOrderNumber());
+
+        if (!Objects.equals(order.getIsPayed(), 1)) {
+            throw new GlobalException("当前订单还未付款,无法申请");
+        }
+
+
+        if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
+            throw new GlobalException("该订单已有商品正在退款中,不能再进行整单退款");
+        }
+
+        OrderRefund newOrderRefund = new OrderRefund();
+
+        // 获取所有正在进行中的退款订单
+        List<OrderRefund> orderRefunds = orderRefundMapper.getProcessingOrderRefundByOrderId(order.getOrderId());
+
+        for (OrderRefund orderRefund : orderRefunds) {
+            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
+                throw new GlobalException("该订单正在进行整单退款,无法进行新的退款操作");
+            }
+
+//            if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) {
+//                throw new GlobalException("该商品正在进行退款中,无法进行新的退款操作");
+//            }
+        }
+
+        // 如果存在分销订单,则计算分销总金额
+        List<OrderItem> orderItemList = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+        // 判断退款单类型(1:整单退款,2:单个物品退款)
+
+
+        //TODO 待处理 全部和部分退款积分问题
+        if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
+            // 全部物品退款
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(sumTotalDistributionAmountByOrderItem(orderItemList));
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount());
+            newOrderRefund.setOrderItemId(0L);
+        } else {
+            CullenUtils.validateDataThrowException(orderRefundSkuList.isEmpty(), "退款商品不能为空...");
+            // 部分物品退款
+            OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>()
+                    .eq(OrderItem::getOrderNumber, orderRefundParam.getOrderNumber()));
+            if (orderItem == null) {
+                throw new GlobalException("该物品在订单中不存在");
+            }
+            boolean isCanRefund = false;
+            //  查看是否有支付金额和积分都为空的订单,有则抛出异常
+            for (OrderItem item : orderItemList) {
+                if (item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0) {
+                    isCanRefund = true;
+                    break;
+                }
+            }
+            if (isCanRefund) {
+                throw new GlobalException("该订单部分订单项支付金额和积分为0,无法使用部分退款!");
+            }
+
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(sumTotalDistributionAmountByOrderItem(Collections.singletonList(orderItem)));
+
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            newOrderRefund.setPlatformRefundAmount(orderItem.getPlatformShareReduce());
+
+            // 退款物品数量为null或者0时,则为退款全部数量
+            if (orderRefundParam.getGoodsNum() <= 0) {
+                orderRefundParam.setGoodsNum(orderItem.getProdCount());
+            }
+
+            // 判断退款数量是否溢出
+            if (orderRefundParam.getGoodsNum() > orderItem.getProdCount()) {
+                throw new GlobalException("退款物品数量已超出订单中的数量,不允许申请");
+            }
+
+            // 判断退款金额是否超出订单金额
+            double refundSingleAmount = Arith.div(orderRefundParam.getRefundAmount(), orderRefundParam.getGoodsNum(), 3);
+            double singleAmount = Arith.div(orderItem.getActualTotal(), orderItem.getProdCount(), 3);
+            if (refundSingleAmount > orderItem.getProductTotalAmount() || refundSingleAmount > singleAmount) {
+                throw new GlobalException("退款金额已超出订单金额,无法申请");
+            }
+
+            // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
+            if (Objects.equals(order.getHbOrderStatus(), 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()));
+                }
+            }
+        }
+
+        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());
+        newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount());
+
+
+        newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
+        newOrderRefund.setApplyType(orderRefundParam.getApplyType());
+        if (Objects.equals(orderRefundParam.getApplyType(), 2)) {
+            newOrderRefund.setIsReceiver(true);
+        } else {
+            newOrderRefund.setIsReceiver(orderRefundParam.getIsReceiver());
+        }
+        newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason());
+        newOrderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc());
+        newOrderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile());
+        newOrderRefund.setPhotoFiles(orderRefundParam.getPhotoFiles());
+        newOrderRefund.setReturnMoneySts(rReturnMoneySts);
+        newOrderRefund.setApplyTime(new Date());
+        newOrderRefund.setUpdateTime(new Date());
+        log.info("生成退款单:{}", newOrderRefund);
+
+
+        // 生成退款单
+        orderRefundMapper.insert(newOrderRefund);
+        // 更新订单状态
+        Integer refundType = newOrderRefund.getRefundType();
+        if (Objects.equals(refundType, RefundType.ALL.value())) {
+            order.setRefundStatus(RefundStatusEnum.APPLY.value());
+        } else {
+            order.setRefundStatus(RefundStatusEnum.PARTIAL_SUCCESS.value());
+        }
+        orderMapper.updateById(order);
+
+        if (ObjectUtil.isNotEmpty(orderRefundSkuList)) {
+            orderRefundSkuList.forEach(c -> {
+                c.setOrderRefundId(newOrderRefund.getRefundId());
+                orderRefundSkuMapper.insert(c);
+            });
+        }
+        return newOrderRefund.getRefundSn();
+    }
+
+
+    /**
+     * 退货退款
+     */
+    @Override
+    public void returnRefund(String orderNumber) {
+        Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>()
+                .eq(Order::getOrderNumber, orderNumber)
+                .in(Order::getHbOrderStatus, List.of(OrderStatus.CONSIGNMENT.value(), OrderStatus.SUCCESS.value()))
+        );
+        if (null != order) {
+            //判定已完成的时间
+            if (Objects.equals(order.getHbOrderStatus(), OrderStatus.SUCCESS.value()) && isPaymentOver7Days(order.getPayTime())) {
+                throw new GlobalException("支付完成已经超过7天,不支持退款");
+            }
+            //可以直接退积分或者是钱
+            if (order.getActualTotal() > 0) {
+                //退,微信支付
+            } else {
+                //退,积分
+            }
+        }
+    }
+
+    private boolean isPaymentOver7Days(Date paymentDate) {
+        // 1. 将支付时间转换为 Instant
+        Instant paymentInstant = paymentDate.toInstant();
+        // 2. 增加 7 天(精确到毫秒,考虑时区)
+        Instant expirationInstant = paymentInstant.plus(7, java.time.temporal.ChronoUnit.DAYS);
+        // 3. 获取当前时间
+        Instant nowInstant = Instant.now();
+        // 4. 比较时间
+        return nowInstant.isAfter(expirationInstant) || nowInstant.equals(expirationInstant);
+    }
 }

+ 9 - 6
yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java

@@ -756,15 +756,18 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     public IPage<Product> listProdByCategoryIdAndShopId(ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO) {
         IPage<Product> productIPage = productMapper.listProdByCIdAndSId(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
                 prodByCategoryIdAndShopIdDTO);
-        if (productIPage.getRecords().isEmpty()) {
-            productIPage = productMapper.listProdByCategoryIdAndShopId2(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
-                    prodByCategoryIdAndShopIdDTO);
-        }
+//        if (productIPage.getRecords().isEmpty()) {
+//            productIPage = productMapper.listProdByCategoryIdAndShopId2(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
+//                    prodByCategoryIdAndShopIdDTO);
+//        }
         productIPage.getRecords().forEach(product -> {
-            List<Sku> skus = skuMapper.selectList(Wrappers.<Sku>lambdaQuery().eq(Sku::getProdId, product.getProdId()));
+//            List<Sku> skus = skuMapper.selectList(Wrappers.<Sku>lambdaQuery().eq(Sku::getProdId, product.getProdId()));
             //TODO wangjian 查询具体的价格
-            product.setSkuList(skus);
+//            product.setSkuList(skus);
+            List<Sku> skuList = skuMapper.listByProdId(product.getProdId());
+            product.setSkuList(skuList);
         });
+
         return productIPage;
     }
 

+ 6 - 6
yami-shop-service/src/main/resources/mapper/OrderMapper.xml

@@ -570,12 +570,12 @@
     <select id="getOrderCount" resultType="com.yami.shop.bean.app.dto.OrderCountData">
         SELECT
         COUNT(o.order_id) all_count,
-        COUNT( CASE WHEN o.hbOrderStatus = 0 THEN o.order_id ELSE NULL END ) AS unPay,
-        COUNT( CASE WHEN o.hbOrderStatus = 20 THEN o.order_id ELSE NULL END ) AS payed,
-        COUNT( CASE WHEN o.hbOrderStatus = 30 THEN o.order_id ELSE NULL END ) AS consignment,
-        COUNT( CASE WHEN o.hbOrderStatus = 40 THEN o.order_id ELSE NULL END ) AS confirm,
-        COUNT( CASE WHEN o.hbOrderStatus = 50 THEN o.order_id ELSE NULL END ) AS success,
-        COUNT( CASE WHEN o.hbOrderStatus = 60 THEN o.order_id ELSE NULL END ) AS `close`
+        COUNT( CASE WHEN o.hb_order_status = 0 THEN o.order_id ELSE NULL END ) AS unPay,
+        COUNT( CASE WHEN o.hb_order_status = 20 THEN o.order_id ELSE NULL END ) AS payed,
+        COUNT( CASE WHEN o.hb_order_status = 30 THEN o.order_id ELSE NULL END ) AS consignment,
+        COUNT( CASE WHEN o.hb_order_status = 40 THEN o.order_id ELSE NULL END ) AS confirm,
+        COUNT( CASE WHEN o.hb_order_status = 50 THEN o.order_id ELSE NULL END ) AS success,
+        COUNT( CASE WHEN o.hb_order_status = 60 THEN o.order_id ELSE NULL END ) AS `close`
         FROM tz_order o
         WHERE o.user_id =#{userId} AND o.delete_status = 0
     </select>

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

@@ -2,7 +2,7 @@
 <!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 id="statisticsPoint" resultType="java.lang.Long">
         SELECT SUM(
                        CASE
                            WHEN points_audit = 1 THEN points
@@ -16,4 +16,28 @@
           AND points_audit IN (1, 2)
           AND (expiry_date > NOW() OR expiry_date IS NULL)
     </select>
+
+      <select id="statisticsAllScorePoint" resultType="com.yami.shop.bean.dto.ScoreDataDto">
+          SELECT
+          SUM( CASE WHEN points_audit = 1 THEN points WHEN points_audit = 2 THEN points - variable_points END ) AS total_available_points,
+          SUM( points ) AS total_recharged_points,
+          SUM(CASE WHEN points_audit IN ( 1, 2 ) AND expiry_date &lt;= NOW() THEN CASE
+          points_audit
+          WHEN 1 THEN
+          points
+          WHEN 2 THEN
+          points - variable_points
+          END ELSE 0
+          END
+          ) AS expired_points,
+          SUM( CASE WHEN points_audit = 3 THEN points WHEN points_audit = 2 THEN variable_points ELSE 0 END ) AS
+          consumed_points
+          FROM
+          tz_points_record
+          WHERE
+          user_id = #{userId}
+          AND channel_id =#{platform}
+          AND points_type IN (1, 3)
+      </select>
+
 </mapper>

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

@@ -741,19 +741,53 @@
 
     <select id="listProdByCIdAndSId" parameterType="com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO" resultType="com.yami.shop.bean.model.Product">
         SELECT
-            p.*
+            tp.prod_id,
+            MAX(tp.prod_name) AS prod_name,
+            tsc.shop_id AS shop_id,
+            MAX(tp.brand_id) AS brand_id,
+            MAX(tp.brand_name) AS brand_name,
+            MAX(tp.ori_price) AS ori_price,
+            MIN(cp.channel_prod_price) as price,
+            MAX(tp.score_price) AS score_price,
+            MAX(tp.brief) AS brief,
+            MAX(tp.video) AS video,
+            MAX(tp.pic) AS pic,
+            MAX(tp.content) AS content,
+            MAX(tp.imgs) AS imgs,
+            MAX(tp.status) AS status,
+            MAX(tp.is_delete) AS is_delete,
+            MAX(tp.shop_category_id) AS shop_category_id,
+            MAX(tp.category_id) AS category_id,
+            MAX(tp.hb_front_category_id) AS hb_front_category_id,
+            MAX(tp.sold_num) AS sold_num,
+            SUM(tss.shop_sku_stocks) AS total_stocks,
+            MAX(tp.delivery_mode) AS delivery_mode,
+            MAX(tp.delivery_template_id) AS delivery_template_id,
+            MAX(tp.create_time) AS create_time,
+            MAX(tp.update_time) AS update_time,
+            MAX(tp.putaway_time) AS putaway_time,
+            MAX(tp.version) AS version,
+            MAX(tp.prod_type) AS prod_type,
+            MAX(tp.activity_id) AS activity_id,
+            MAX(tp.sup_id) AS sup_id,
+            MAX(tp.hb_spu_id) AS hb_spu_id,
+            MAX(tp.hb_status) AS hb_status
         FROM
-            tz_prod p
-                LEFT JOIN tz_category_prod tcp ON p.prod_id=tcp.prod_id
-                LEFT JOIN tz_shop_category tsc ON tcp.`code`=tsc.`code`
+            tz_prod tp
+                LEFT JOIN tz_category_prod tcp ON tp.prod_id = tcp.prod_id
+                LEFT JOIN tz_shop_category tsc ON tcp.`code` = tsc.`code`
+                LEFT JOIN tz_shop_sku tss ON  tss.spu_id=tcp.prod_id
+                LEFT JOIN tz_channel_prod cp ON  (cp.shop_id=tsc.shop_id AND cp.sku_id=tss.sku_id)
         WHERE
-            p.STATUS = 1
+            tp.STATUS = 1
           AND tcp.is_delete = 0
           AND tsc.is_delete = 0
-          AND p.shop_id=#{prodByCategoryIdAndShopIdDTO.shopId}
+          AND cp.channel_prod_price IS NOT NULL
+          AND tsc.shop_id=#{prodByCategoryIdAndShopIdDTO.shopId}
           AND tsc.id=#{prodByCategoryIdAndShopIdDTO.categoryId}
+        GROUP BY tp.prod_id, tsc.shop_id
         ORDER BY
-            p.create_time DESC
+            MAX(tp.create_time) DESC
     </select>
 
     <select id="listProdByCategoryIdAndShopId2" parameterType="com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO" resultType="com.yami.shop.bean.model.Product">

+ 22 - 113
yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/controller/UserScoreController.java

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.enums.ScoreLogType;
 import com.yami.shop.bean.event.UpdateUserScoreEvent;
+import com.yami.shop.bean.model.PointsRecord;
 import com.yami.shop.bean.param.ScoreExpireParam;
 import com.yami.shop.common.bean.SysConfig;
 import com.yami.shop.bean.model.UserExtension;
@@ -24,8 +25,7 @@ import com.yami.shop.common.util.PageParam;
 import com.yami.shop.security.api.util.SecurityUtils;
 import com.yami.shop.service.SysConfigService;
 import com.yami.shop.service.UserExtensionService;
-import com.yami.shop.user.comment.dto.ScoreDataDto;
-import com.yami.shop.user.comment.model.UserLevel;
+import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.user.comment.model.UserScoreDetail;
 import com.yami.shop.user.comment.model.UserScoreLog;
 import com.yami.shop.user.comment.service.UserLevelService;
@@ -37,13 +37,12 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.context.ApplicationContext;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+
 /**
  * 用户积分信息管理实现
  *
@@ -59,133 +58,41 @@ public class UserScoreController {
 
     private final UserScoreLogService scoreLogService;
     private final UserScoreDetailService userScoreDetailService;
-    private final ApplicationContext applicationContext;
     private final SysConfigService sysConfigService;
-    private final UserExtensionService userExtensionService;
-    private final UserLevelService userLevelService;
-
-
-    @GetMapping("/updateUserScore")
-    @ApiOperation(value = "积分签到", notes = "积分签到")
-    public ResponseEntity<String> updateUserScore() {
-        String userId = SecurityUtils.getUser().getUserId();
-        ScoreConfigParam scoreParam = sysConfigService.getSysConfigObject(Constant.SCORE_CONFIG, ScoreConfigParam.class);
-        //签到,计算连续签到日期
-        if(isSignIn(userId)){
-            return ResponseEntity.ok("今天已经签到过了,请明天再试!");
-        }
-        //根据逗号分隔
-        String[] signInScore = scoreParam.getSignInScoreString().split(StrUtil.COMMA);
-        Integer count = getCount(userId);
-        count++;
-        int score = Integer.parseInt(signInScore[count - 1]);
-        String remarks = "签到第" + count + "天获取的积分";
-        applicationContext.publishEvent(new UpdateUserScoreEvent(ScoreLogType.SIGN_IN.value(),score,1,
-                null, remarks,userId));
-        return ResponseEntity.ok("领取积分成功");
-    }
 
-    /**
-     * 获取数据库的签到记录记录
-     * @param userId
-     * @return
-     */
-    private Integer getCount(String userId) {
-        Integer count = scoreLogService.getConsecutiveDays(userId);
-        //如果没有记录就是第一天签到
-        if(count == null){
-            count = 0;
-        }
-        //如果是第七天之后都是第七天的奖励
-        count = Math.min(6,count);
-        return count;
-    }
 
     @GetMapping("/scoreInfo")
     @ApiOperation(value = "查看积分中心信息", notes = "查看积分中心信息")
-    public ResponseEntity<ScoreDataDto> scoreInfo() {
-        ScoreDataDto scoreDataDto = new ScoreDataDto();
+    public ResponseEntity<ScoreDataDto> scoreInfo(@RequestParam Integer platform) {
         String userId = SecurityUtils.getUser().getUserId();
-        ScoreConfigParam scoreParam = sysConfigService.getSysConfigObject(Constant.SCORE_CONFIG, ScoreConfigParam.class);
-        // 0.计算过期时间
-        ScoreExpireParam scoreExpireParam = sysConfigService.getSysConfigObject(Constant.SCORE_EXPIRE,ScoreExpireParam.class);
-        if (Objects.isNull(scoreParam)) {
-            return ResponseEntity.ok().build();
-        }
-        Integer year = Objects.isNull(scoreExpireParam) ? 0:scoreExpireParam.getExpireYear();
-        ArrayList<Integer> signInScores = new ArrayList<>();
-        for(String s : scoreParam.getSignInScoreString().trim().split(StrUtil.COMMA)){
-            Integer signInScore = Integer.valueOf(s);
-            signInScores.add(signInScore);
-        }
-        UserExtension userExtension = userExtensionService.getOne(new LambdaQueryWrapper<UserExtension>().eq(UserExtension::getUserId, userId));
-        if (userExtension == null) {
-            return ResponseEntity.ok().build();
-        }
-        UserScoreDetail userScoreDetail = userScoreDetailService.getOne(new LambdaQueryWrapper<UserScoreDetail>().eq(UserScoreDetail::getUserId, userId)
-                .eq(UserScoreDetail::getStatus, -1).orderByDesc(UserScoreDetail::getExpireTime).last("limit 1"));
-        scoreDataDto.setIsRegister(1);
-        scoreDataDto.setExpireScore(Objects.nonNull(userScoreDetail) ?userScoreDetail.getUsableScore():0);
-        scoreDataDto.setExpireYear(year);
-        scoreDataDto.setGrowth(userExtension.getGrowth());
-        scoreDataDto.setScore(userExtension.getScore());
-        scoreDataDto.setScoreList(signInScores);
-        scoreDataDto.setRegisterScore(scoreParam.getRegisterScore());
-        scoreDataDto.setShopScore(scoreParam.getShopGetScore());
-        scoreDataDto.setIsSignIn(isSignIn(userId)? 1:0);
-        scoreDataDto.setLevelType(userExtension.getLevelType());
-//        UserLevel userLevel = userLevelService.getOne(new LambdaQueryWrapper<UserLevel>()
-//                .eq(UserLevel::getLevel, userExtension.getLevel())
-//                .eq(UserLevel::getLevelType, userExtension.getLevelType())
-//        );
-        //scoreDataDto.setLevelName(userLevel.getLevelName());
-        //计算签到天数
-        Integer count = scoreLogService.getConsecutiveDays(userId);
-        //如果没有记录就是第一天签到
-        if(count == null){
-            count = 1;
-        }
-        count = Math.min(7,count);
-        scoreDataDto.setSignInCount(isSignIn(userId)?count:count+ 1);
-        return ResponseEntity.ok(scoreDataDto);
+        return ResponseEntity.ok(userScoreDetailService.doGetUserScore(userId, platform));
     }
 
-    /**
-     * 是否已经签到
-     * @param userId
-     * @return
-     */
-    private boolean isSignIn(String userId){
-        List<UserScoreLog> scoreList = scoreLogService.list(new LambdaQueryWrapper<UserScoreLog>().eq(UserScoreLog::getSource, ScoreLogType.SIGN_IN.value())
-                                                        .ge(UserScoreLog::getCreateTime, DateUtil.beginOfDay(DateUtil.date()))
-                                                        .le(UserScoreLog::getCreateTime, DateUtil.endOfDay(DateUtil.date()))
-                                                        .eq(UserScoreLog::getUserId, userId));
-        return CollectionUtils.isNotEmpty(scoreList);
-    }
 
     /**
      * 分页查询积分明细
+     *
      * @param page 分页对象
      * @return 分页数据
      */
-    @GetMapping("/page" )
+    @GetMapping("/page")
     @ApiOperation(value = "查询积分明细", notes = "查询积分明细")
-    public ResponseEntity<IPage<UserScoreLog>> getScoreLogPage(PageParam<UserScoreLog> page) {
+    public ResponseEntity<IPage<PointsRecord>> getScoreLogPage(@ModelAttribute PageParam<PointsRecord> page, @RequestParam Integer platform) {
         String userId = SecurityUtils.getUser().getUserId();
-        return ResponseEntity.ok(scoreLogService.page(page,new LambdaQueryWrapper<UserScoreLog>()
-                .eq(UserScoreLog::getUserId,userId).orderByDesc(UserScoreLog::getCreateTime)));
+        return ResponseEntity.ok(userScoreDetailService.doGetScorePage(page, userId,platform));
     }
 
 
     /**
      * 积分说明
+     *
      * @return 积分说明
      */
-    @GetMapping("/getScoreExplain" )
+    @GetMapping("/getScoreExplain")
     @ApiOperation(value = "积分说明", notes = "积分说明")
     public ResponseEntity<SysConfig> getScoreExplain() {
-        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey,Constant.SCORE_EXPLAIN));
-        if(Objects.isNull(config)){
+        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey, Constant.SCORE_EXPLAIN));
+        if (Objects.isNull(config)) {
             return ResponseEntity.ok(new SysConfig());
         }
         return ResponseEntity.ok(config);
@@ -193,13 +100,14 @@ public class UserScoreController {
 
     /**
      * 等级页展示
+     *
      * @return 等级页展示
      */
-    @GetMapping("/getLevelShow" )
+    @GetMapping("/getLevelShow")
     @ApiOperation(value = "等级页展示", notes = "等级页展示")
     public ResponseEntity<String> getLevelShow() {
-        String config = sysConfigService.getSysConfigObject(Constant.LEVEL_SHOW,String.class);
-        if(Objects.isNull(config)){
+        String config = sysConfigService.getSysConfigObject(Constant.LEVEL_SHOW, String.class);
+        if (Objects.isNull(config)) {
             return ResponseEntity.ok().build();
         }
         return ResponseEntity.ok(config);
@@ -207,13 +115,14 @@ public class UserScoreController {
 
     /**
      * 积分常见问题
+     *
      * @return 积分常见问题
      */
-    @GetMapping("/getScoreQuestion" )
+    @GetMapping("/getScoreQuestion")
     @ApiOperation(value = "积分常见问题", notes = "积分常见问题")
     public ResponseEntity<SysConfig> getScoreQuestion() {
-        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey,Constant.SCORE_QUESTION));
-        if(Objects.isNull(config)){
+        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey, Constant.SCORE_QUESTION));
+        if (Objects.isNull(config)) {
             return ResponseEntity.ok(new SysConfig());
         }
         return ResponseEntity.ok(config);

+ 0 - 3
yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/listener/SubmitOrderListener.java

@@ -126,9 +126,6 @@ public class SubmitOrderListener {
         }
         userScoreLogService.saveBatch(logList);
         userScoreDetailService.updateBatchById(updateScoreDetails);
-        //保存用户积分
-        userExtension.setScore(userExtension.getScore() - mergerOrder.getTotalUsableScore());
-        userExtensionService.updateById(userExtension);
     }
 
 }

+ 0 - 90
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/dto/ScoreDataDto.java

@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- */
-
-package com.yami.shop.user.comment.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 积分中心信息
- *
- * @author LHD
- * @date 2019-12-19 10:27:46
- */
-@Data
-public class ScoreDataDto implements Serializable{
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 签到积分列表
-     */
-    @ApiModelProperty(value = "签到积分列表")
-    private List<Integer> scoreList;
-    /**
-     * 用户积分
-     */
-    @ApiModelProperty(value = "用户积分")
-    private Integer score;
-    /**
-     * 上次结算过期的积分
-     */
-    @ApiModelProperty(value = "上次结算过期的积分")
-    private Integer expireScore;
-    /**
-     * 过期时间(年)
-     */
-    @ApiModelProperty(value = "过期时间(年)")
-    private Integer expireYear;
-    /**
-     * 等级名称
-     */
-    @ApiModelProperty(value = "等级名称")
-    private String levelName;
-    /**
-     * 等级类型 0 普通会员 1 付费会员
-     */
-    @ApiModelProperty(value = "等级类型 0 普通会员 1 付费会员")
-    private Integer levelType;
-    /**
-     * 用户当前成长值
-     */
-    @ApiModelProperty(value = "用户当前成长值")
-    private Integer growth;
-    /**
-     * 注册可获取积分
-     */
-    @ApiModelProperty(value = "注册可获取积分")
-    private Integer registerScore;
-    /**
-     * 购物可获取积分
-     */
-    @ApiModelProperty(value = "购物可获取积分")
-    private Double shopScore;
-
-    /**
-     * 是否已经签到 1是 0否
-     */
-    @ApiModelProperty(value = "是否已经签到 1是 0否")
-    private Integer isSignIn;
-
-    /**
-     * 是否已经注册 1是 0否
-     */
-    @ApiModelProperty(value = "是否已经注册 1是 0否")
-    private Integer isRegister;
-
-    /**
-     * 签到第几天
-     */
-    @ApiModelProperty(value = "签到第几天")
-    private Integer signInCount;
-
-}

+ 10 - 4
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/UserScoreDetailService.java

@@ -8,14 +8,16 @@
 package com.yami.shop.user.comment.service;
 
 import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.dto.ScoreDataDto;
+import com.yami.shop.bean.model.PointsRecord;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.user.comment.model.UserScoreDetail;
-
-import java.util.List;
+import com.yami.shop.user.comment.model.UserScoreLog;
+import io.swagger.models.auth.In;
 
 /**
- *
- *
  * @author lhd
  * @date 2020-05-25 15:31:02
  */
@@ -24,4 +26,8 @@ public interface UserScoreDetailService extends IService<UserScoreDetail> {
     void updateExpireScoreDetail(DateTime dateTime);
 
     void updateLogAndDetail(Long orderId, String userId);
+
+    ScoreDataDto doGetUserScore(String userId, Integer platform);
+
+    IPage<PointsRecord> doGetScorePage(PageParam<PointsRecord> page, String userId, Integer platform);
 }

+ 68 - 11
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/UserScoreDetailServiceImpl.java

@@ -11,13 +11,15 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 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.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.enums.ScoreLogType;
-import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.model.PointsRecord;
 import com.yami.shop.bean.model.UserExtension;
-import com.yami.shop.dao.UserExtensionMapper;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.dao.PointsRecordMapper;
 import com.yami.shop.service.UserExtensionService;
-import com.yami.shop.user.comment.dao.UserScoreLogMapper;
+import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.user.comment.model.UserScoreDetail;
 import com.yami.shop.user.comment.dao.UserScoreDetailMapper;
 import com.yami.shop.user.comment.model.UserScoreLog;
@@ -28,12 +30,13 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
 /**
- *
- *
  * @author lhd
  * @date 2020-05-25 15:31:02
  */
@@ -44,10 +47,12 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
     private final UserScoreDetailMapper scoreDetailMapper;
     private final UserExtensionService userExtensionService;
     private final UserScoreLogService userScoreLogService;
+    private final PointsRecordMapper pointsRecordMapper;
 
 
     /**
      * 修改用户过期积分
+     *
      * @param dateTime 过期时间
      */
     @Override
@@ -59,7 +64,7 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
 
         // 1.查询有积分过期的用户
         List<UserScoreDetail> userScoreDetails = scoreDetailMapper.listExpireScoreDetail(dateTime);
-        if(CollectionUtils.isEmpty(userScoreDetails)){
+        if (CollectionUtils.isEmpty(userScoreDetails)) {
             return;
         }
         // 2.修改用户积分信息
@@ -84,10 +89,10 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
             logList.add(userScoreLog);
         }
         // 批量修改用户积分和添加积分日志
-        if(CollectionUtils.isNotEmpty(userExtensions)){
+        if (CollectionUtils.isNotEmpty(userExtensions)) {
             userExtensionService.updateBatchByUserId(userExtensions);
         }
-        if(CollectionUtils.isNotEmpty(logList)){
+        if (CollectionUtils.isNotEmpty(logList)) {
             userScoreLogService.saveBatch(logList);
         }
         // 3.修改积分明细
@@ -100,21 +105,22 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
 
     /**
      * 取消订单时修改用户积分和添加日志
+     *
      * @param orderId 订单号
-     * @param userId 用户id
+     * @param userId  用户id
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateLogAndDetail(Long orderId, String userId) {
         UserExtension userExtension = userExtensionService.getOne(
                 new LambdaQueryWrapper<UserExtension>().eq(UserExtension::getUserId, userId));
-        if(Objects.isNull(userExtension)){
+        if (Objects.isNull(userExtension)) {
             return;
         }
         //修改积分明细
         List<UserScoreDetail> scoreDetails = list(new LambdaUpdateWrapper<UserScoreDetail>()
                 .eq(UserScoreDetail::getBizId, orderId).eq(UserScoreDetail::getStatus, 0));
-        if(CollectionUtils.isEmpty(scoreDetails)){
+        if (CollectionUtils.isEmpty(scoreDetails)) {
             return;
         }
         //要修改的用户积分,状态为-1表示还没过期的可以返还的用户积分
@@ -136,4 +142,55 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
         scoreLog.setIoType(1);
         userScoreLogService.save(scoreLog);
     }
+
+    @Override
+    public ScoreDataDto doGetUserScore(String userId, Integer platform) {
+        return pointsRecordMapper.statisticsAllScorePoint(userId, platform);
+    }
+
+    @Override
+    public IPage<PointsRecord> doGetScorePage(PageParam<PointsRecord> page, String userId, Integer platform) {
+        IPage<PointsRecord> pointsRecordIPage = pointsRecordMapper.selectPage(page, new LambdaQueryWrapper<PointsRecord>()
+                .eq(PointsRecord::getUserId, userId)
+                .eq(PointsRecord::getChannelId, platform)
+        );
+        SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 HH:mm");
+        List<PointsRecord> collect = pointsRecordIPage.getRecords().stream().peek((pointsRecord) -> {
+            pointsRecord.setCreationDateStr(sdf.format(pointsRecord.getCreationDate()));
+            String mark = "";
+            if (isExpiredToday(pointsRecord.getExpiryDate())) {
+                pointsRecord.setPointsTypeStr("过期");
+                mark = "-";
+            } else {
+                switch (pointsRecord.getPointsType()) {
+                    case 1:
+                        pointsRecord.setPointsTypeStr("充值");
+                        mark = "+";
+                        break;
+                    case 2:
+                        pointsRecord.setPointsTypeStr("购物");
+                        mark = "-";
+                        break;
+                    case 3:
+                        pointsRecord.setPointsTypeStr("退款");
+                        mark = "+";
+                        break;
+                }
+            }
+            pointsRecord.setVariablePointsStr(mark + pointsRecord.getVariablePoints());
+            pointsRecord.setTotalAvailablePoints(pointsRecord.getCurrentlyAvailablePoints().longValue());
+        }).collect(Collectors.toList());
+        pointsRecordIPage.setRecords(collect);
+        return pointsRecordIPage;
+    }
+
+    public boolean isExpiredToday(Date expiryDate) {
+        if (null == expiryDate) return false;
+        LocalDate today = LocalDate.now();
+        LocalDate expiryLocalDate = expiryDate.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        return expiryLocalDate.isBefore(today);
+    }
+
 }