Jelajahi Sumber

添加退款金额总数和退款积分逻辑

zhangxin 23 jam lalu
induk
melakukan
c4730f80aa

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

@@ -359,7 +359,16 @@ public class OrderRefundController {
                 }
             }
         }
-
+        BigDecimal refundTotalMoney=BigDecimal.ZERO;
+        for (OrderRefundSku orderRefundSku : orderRefundSkuList) {
+            int mul = (int) Arith.mul(orderRefundSku.getSkuPrice(), 100)*orderRefundSku.getProductCount();
+            refundTotalMoney= refundTotalMoney.add(BigDecimal.valueOf(mul));
+        }
+        //计算退款订单金额 整单退款需要退运费
+        if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())){
+            refundTotalMoney= refundTotalMoney.add(BigDecimal.valueOf(Arith.mul(order.getFreightAmount(), 100)));
+        }
+        newOrderRefund.setRefundTotalMoney(refundTotalMoney);
         newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
         newOrderRefund.setApplyType(orderRefundParam.getApplyType());
         if (Objects.equals(orderRefundParam.getApplyType(), 2)) {

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

@@ -15,6 +15,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -167,6 +168,11 @@ public class OrderRefund implements Serializable{
 
     private Double freightAmount;
 
+    /**
+     * 退款总金额
+     */
+    private BigDecimal refundTotalMoney;
+
     /**
      * 该退款单是否处理完成
      */

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

@@ -2,8 +2,10 @@
 package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.bean.model.PointsRecord;
+import com.yami.shop.common.util.PageParam;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -19,4 +21,6 @@ public interface PointsRecordMapper extends BaseMapper<PointsRecord> {
     ScoreDataDto statisticsAllScorePoint(@Param("userId") String userId, @Param("platform") Integer platform);
 
     List<PointsRecord> findByOrderNumber(@Param("orderNumber")String orderNumber,@Param("pointsType") Integer pointsType);
+
+    IPage<PointsRecord> findPage(PageParam<PointsRecord> page,@Param("userId") String userId,@Param("platform") Integer platform);
 }

+ 41 - 24
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -989,19 +989,17 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                             System.out.println("微信退款结果:" + s);
                             refundActual = BigDecimal.valueOf(Arith.add(order.getActualTotal(), order.getFreightAmount()));
                             //优先退未过期的积分,退积分
-                            List<PointsRecord> pointsRecords = pointsRecordMapper.selectList(new LambdaQueryWrapper<PointsRecord>()
-                                    .eq(PointsRecord::getOrderNumber, order.getOrderNumber()).eq(PointsRecord::getPointsType, 2)
-                                    .and(wrapper -> wrapper
-                                            .gt(PointsRecord::getExpiryDate, LocalDateTime.now())
-                                            .or()
-                                            .isNull(PointsRecord::getExpiryDate)
-                                    ).orderByDesc(PointsRecord::getExpiryDate));
+//                            List<PointsRecord> pointsRecords = pointsRecordMapper.selectList(new LambdaQueryWrapper<PointsRecord>()
+//                                    .eq(PointsRecord::getOrderNumber, order.getOrderNumber()).eq(PointsRecord::getPointsType, 2)
+//                                    .orderByDesc(PointsRecord::getExpiryDate));
+                            List<PointsRecord> pointsRecords = pointsRecordMapper.findByOrderNumber(order.getOrderNumber(), 2);
                             for (PointsRecord pointsRecord : pointsRecords) {
                                 refundScore = (long) (refundScore + Arith.add(order.getActualTotal(), order.getFreightAmount()));
                                 PointsRecord npr = new PointsRecord();
                                 BeanUtils.copyProperties(pointsRecord, npr);
                                 npr.setId(null);
                                 npr.setPointsType(3);
+                                npr.setPointsAudit(1);
                                 npr.setPoints(pointsRecord.getVariablePoints());
                                 npr.setVariablePoints(BigDecimal.valueOf(0));
                                 Long l = pointsRecordMapper.statisticsPoint(pointsRecord.getUserId(), Math.toIntExact(pointsRecord.getChannelId()));
@@ -1028,18 +1026,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                         }
                     } else {
                         //退,积分【优先退未过期的积分】
-                        List<PointsRecord> pointsRecords = pointsRecordMapper.selectList(new LambdaQueryWrapper<PointsRecord>()
-                                .eq(PointsRecord::getOrderNumber, order.getOrderNumber()).eq(PointsRecord::getPointsType, 2)
-                                .and(wrapper -> wrapper
-                                        .gt(PointsRecord::getExpiryDate, LocalDateTime.now())
-                                        .or()
-                                        .isNull(PointsRecord::getExpiryDate)
-                                ).orderByDesc(PointsRecord::getExpiryDate));
+//                        List<PointsRecord> pointsRecords = pointsRecordMapper.selectList(new LambdaQueryWrapper<PointsRecord>()
+//                                .eq(PointsRecord::getOrderNumber, order.getOrderNumber()).eq(PointsRecord::getPointsType, 2)
+//                                .orderByDesc(PointsRecord::getExpiryDate));
+                        List<PointsRecord> pointsRecords = pointsRecordMapper.findByOrderNumber(order.getOrderNumber(), 2);
                         for (PointsRecord pointsRecord : pointsRecords) {
                             PointsRecord npr = new PointsRecord();
                             BeanUtils.copyProperties(pointsRecord, npr);
                             npr.setId(null);
                             npr.setPointsType(3);
+                            npr.setPointsAudit(1);
                             npr.setPoints(pointsRecord.getVariablePoints());
                             npr.setVariablePoints(BigDecimal.valueOf(0));
                             Long l = pointsRecordMapper.statisticsPoint(pointsRecord.getUserId(), Math.toIntExact(pointsRecord.getChannelId()));
@@ -1047,15 +1043,23 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                                 l = 0L;
                             }
                             if (null != pointsRecord.getVariablePoints()) {
-                                npr.setCurrentlyAvailablePoints(pointsRecord.getVariablePoints().add(BigDecimal.valueOf(l)));
+                                if (pointsRecord.getExpiryStatus()==1){
+                                    npr.setCurrentlyAvailablePoints(pointsRecord.getVariablePoints().add(BigDecimal.valueOf(l)));
+                                }else {
+                                    npr.setCurrentlyAvailablePoints(BigDecimal.valueOf(0.0).add(BigDecimal.valueOf(l)));
+                                }
+                                if (pointsRecord.getExpiryStatus()==2){
+                                    refundExpiredScore += pointsRecord.getVariablePoints().longValue();
+                                }
                             } else {
-                                npr.setCurrentlyAvailablePoints(BigDecimal.valueOf(0.0).add(BigDecimal.valueOf(l)));
+                                npr.setCurrentlyAvailablePoints(BigDecimal.ZERO.add(BigDecimal.valueOf(l)));
                             }
+
                             npr.setCreationDate(new Date());
                             refundScore = (long) (refundScore + Arith.add(order.getActualTotal(), order.getFreightAmount()));
                             pointsRecordMapper.insert(npr);
                         }
-                        refundExpiredScore = order.getOffsetPoints() - refundScore;
+//                        refundExpiredScore = order.getOffsetPoints() - refundScore;
                     }
                     break;
                 case 2://2:单个物品退款
@@ -1163,21 +1167,34 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     }
                     //退钱
                     if (totalRefundActual > 0) {
+                        int refundMoney=0;//需要退款的金额
+                        if (totalRefundScore>0){
+                            if (totalRefundActual>=totalRefundScore){
+                                refundMoney = totalRefundScore;
+                            }else {
+                                System.out.println("退款金额大于支付金额");
+                            }
+                        }else if (totalRefundScore==0){
+                            refundMoney =(int) Arith.mul(totalRefundActual, 100);
+                        }else {
+                            System.out.println("单笔退款未知状态");
+                            break;
+                        }
                         OrderSettlement orderSettlement = orderSettlementMapper.selectOne(new LambdaQueryWrapper<OrderSettlement>()
                                 .eq(OrderSettlement::getOrderNumber, order.getOrderNumber())
                                 .eq(OrderSettlement::getPayType, 1));
                         RefundInfoPo po = new RefundInfoPo();
                         po.setOutTradeNo(orderSettlement.getPayNo());
-                        po.setTotal((int) Arith.mul(Arith.add(order.getTotal(), order.getFreightAmount()), 100));
-                        po.setRefundMoney((int) Arith.mul(totalRefundActual, 100));
-                        String s = wxProviderService.refundOrder(po);
-                        System.out.println("微信退款结果:" + s);
-                        refundActual = BigDecimal.valueOf(totalRefundActual);
+                        po.setTotal((int) Arith.mul(order.getActualTotal(), 100));
+                        po.setRefundMoney(refundMoney);
+                        if (refundMoney!=0){
+                            String s = wxProviderService.refundOrder(po);
+                            System.out.println("微信退款结果:" + s);
+                        }
+                        refundActual = BigDecimal.valueOf(refundMoney);
                     }
                     break;
             }
-
-
             if (1 == orderRefund.getRefundType()) {
                 order.setHbOrderStatus(OrderStatus.CLOSE.value());
             }else {

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

@@ -66,5 +66,11 @@
                ELSE 2 END AS expiryStatus
         from tz_points_record where order_number = #{orderNumber} and points_type =#{pointsType} order by  expiry_date desc
     </select>
+    <select id="findPage" resultType="com.yami.shop.bean.model.PointsRecord">
+        select id,user_id,channel_id,order_number,points_id,`code`,parent_code,points,variable_points,points_type,points_audit,expiry_date,creation_date,currently_available_points from  tz_points_record where channel_id = #{platform}  and user_id = #{userId}
+        UNION ALL
+        SELECT id,user_id,channel_id,order_number,points_id,`code`,parent_code,(points-IFNULL(variable_points,0)) AS points,variable_points, 4 as  points_type,points_audit,expiry_date,creation_date,currently_available_points from tz_points_record  where channel_id =  #{platform}  and user_id = #{userId} and expiry_date &lt;=NOW() and points-IFNULL(variable_points,0) >0
+        order by  creation_date DESC
+    </select>
 
 </mapper>

+ 63 - 54
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/UserScoreDetailServiceImpl.java

@@ -30,6 +30,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.ZoneId;
@@ -150,11 +151,8 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
 
     @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)
-                .orderByDesc(PointsRecord::getCreationDate)
-        );
+        IPage<PointsRecord> pointsRecordIPage = pointsRecordMapper.findPage(page,userId,platform);
+        Long l = pointsRecordMapper.statisticsPoint(userId, platform);
         SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 HH:mm");
         List<PointsRecord> collect = pointsRecordIPage.getRecords().stream().flatMap((pointsRecord) -> {
             pointsRecord.setCreationDateStr(sdf.format(pointsRecord.getCreationDate()));
@@ -165,31 +163,31 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
                 case 1:
                     int variablePoints = pointsRecord.getVariablePoints() != null ?
                             pointsRecord.getVariablePoints().intValue() : 0;
-                    int remainingPoints = pointsRecord.getPoints().intValue() - variablePoints;
-
-                    if (remainingPoints > 0 && isExpiredToday(pointsRecord.getExpiryDate())) {
-                        PointsRecord expiredRecord = new PointsRecord();
-                        // 复制关键属性(根据实际属性补充)
-                        expiredRecord.setId(pointsRecord.getId()); // 若ID唯一需注意业务逻辑
-                        expiredRecord.setCreationDate(pointsRecord.getCreationDate());
-                        expiredRecord.setPointsType(pointsRecord.getPointsType());
-                        expiredRecord.setPoints(pointsRecord.getPoints());
-                        expiredRecord.setVariablePoints(pointsRecord.getVariablePoints());
-                        expiredRecord.setExpiryDate(pointsRecord.getExpiryDate());
-                        expiredRecord.setCurrentlyAvailablePoints(pointsRecord.getCurrentlyAvailablePoints());
-
-                        // 设置复制对象的显示属性
-                        expiredRecord.setCreationDateStr(pointsRecord.getCreationDateStr()); // 复用已格式化的日期
-                        expiredRecord.setPointsTypeStr("过期扣减"); // 示例:区分类型
-                        expiredRecord.setVariablePointsStr("-" + remainingPoints); // 示例:显示过期数量
-                        // 设置原对象为过期记录
-                        expiredRecord.setPointsTypeStr("过期");
-                        mark = "-";
-                        expiredRecord.setVariablePointsStr(mark +
-                                (pointsRecord.getVariablePoints() != null ?
-                                        pointsRecord.getVariablePoints() : pointsRecord.getPoints()));
-                        recordsToAdd.add(expiredRecord); // 添加复制对象
-                    }
+//                    int remainingPoints = pointsRecord.getPoints().intValue() - variablePoints;
+//
+//                    if (remainingPoints > 0 && isExpiredToday(pointsRecord.getExpiryDate())) {
+//                        PointsRecord expiredRecord = new PointsRecord();
+//                        // 复制关键属性(根据实际属性补充)
+//                        expiredRecord.setId(pointsRecord.getId()); // 若ID唯一需注意业务逻辑
+//                        expiredRecord.setCreationDate(pointsRecord.getCreationDate());
+//                        expiredRecord.setPointsType(pointsRecord.getPointsType());
+//                        expiredRecord.setPoints(pointsRecord.getPoints());
+//                        expiredRecord.setVariablePoints(pointsRecord.getVariablePoints());
+//                        expiredRecord.setExpiryDate(pointsRecord.getExpiryDate());
+//                        expiredRecord.setCurrentlyAvailablePoints(pointsRecord.getCurrentlyAvailablePoints());
+//
+//                        // 设置复制对象的显示属性
+//                        expiredRecord.setCreationDateStr(pointsRecord.getCreationDateStr()); // 复用已格式化的日期
+//                        expiredRecord.setPointsTypeStr("过期扣减"); // 示例:区分类型
+//                        expiredRecord.setVariablePointsStr("-" + remainingPoints); // 示例:显示过期数量
+//                        // 设置原对象为过期记录
+//                        expiredRecord.setPointsTypeStr("过期");
+//                        mark = "-";
+//                        expiredRecord.setVariablePointsStr(mark +
+//                                (pointsRecord.getVariablePoints() != null ?
+//                                        pointsRecord.getVariablePoints() : pointsRecord.getPoints()));
+//                        recordsToAdd.add(expiredRecord); // 添加复制对象
+//                    }
                         pointsRecord.setPointsTypeStr("充值");
                         mark = "+";
                         pointsRecord.setVariablePointsStr(mark + pointsRecord.getPoints());
@@ -202,34 +200,45 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
                                     pointsRecord.getVariablePoints() : "0"));
                     break;
                 case 3:
-                    if (isExpiredToday(pointsRecord.getExpiryDate())&&pointsRecord.getPointsAudit()!=3) {
-                        PointsRecord expiredRecord = new PointsRecord();
-                        // 复制关键属性(根据实际属性补充)
-                        expiredRecord.setId(pointsRecord.getId()); // 若ID唯一需注意业务逻辑
-                        expiredRecord.setCreationDate(pointsRecord.getCreationDate());
-                        expiredRecord.setPointsType(pointsRecord.getPointsType());
-                        expiredRecord.setPoints(pointsRecord.getPoints());
-                        expiredRecord.setVariablePoints(pointsRecord.getVariablePoints());
-                        expiredRecord.setExpiryDate(pointsRecord.getExpiryDate());
-                        expiredRecord.setCurrentlyAvailablePoints(pointsRecord.getCurrentlyAvailablePoints());
-
-                        // 设置复制对象的显示属性
-                        expiredRecord.setCreationDateStr(pointsRecord.getCreationDateStr()); // 复用已格式化的日期
-                        expiredRecord.setPointsTypeStr("过期扣减"); // 示例:区分类型
-                        if (pointsRecord.getPointsAudit()==1){
-                            expiredRecord.setVariablePointsStr("-" + pointsRecord.getPoints()); // 示例:显示过期数量
-                        } else if (pointsRecord.getPointsAudit()==2) {
-                            expiredRecord.setVariablePointsStr("-" + (pointsRecord.getPoints().intValue()-pointsRecord.getVariablePoints().intValue())); // 示例:显示过期数量
-                        }
-
-                        // 设置原对象为过期记录
-                        expiredRecord.setPointsTypeStr("过期");
-                        recordsToAdd.add(expiredRecord); // 添加复制对象
-                    }
+//                    if (isExpiredToday(pointsRecord.getExpiryDate())&&pointsRecord.getPointsAudit()!=3) {
+//                        PointsRecord expiredRecord = new PointsRecord();
+//                        // 复制关键属性(根据实际属性补充)
+//                        expiredRecord.setId(pointsRecord.getId()); // 若ID唯一需注意业务逻辑
+//                        expiredRecord.setCreationDate(pointsRecord.getCreationDate());
+//                        expiredRecord.setPointsType(pointsRecord.getPointsType());
+//                        expiredRecord.setPoints(pointsRecord.getPoints());
+//                        expiredRecord.setVariablePoints(pointsRecord.getVariablePoints());
+//                        expiredRecord.setExpiryDate(pointsRecord.getExpiryDate());
+//                        expiredRecord.setCurrentlyAvailablePoints(pointsRecord.getCurrentlyAvailablePoints());
+//
+//                        // 设置复制对象的显示属性
+//                        expiredRecord.setCreationDateStr(pointsRecord.getCreationDateStr()); // 复用已格式化的日期
+//                        expiredRecord.setPointsTypeStr("过期扣减"); // 示例:区分类型
+//                        if (pointsRecord.getPointsAudit()==1){
+//                            expiredRecord.setVariablePointsStr("-" + pointsRecord.getPoints()); // 示例:显示过期数量
+//                        } else if (pointsRecord.getPointsAudit()==2) {
+//                            expiredRecord.setVariablePointsStr("-" + (pointsRecord.getPoints().intValue()-pointsRecord.getVariablePoints().intValue())); // 示例:显示过期数量
+//                        }
+//
+//                        // 设置原对象为过期记录
+//                        expiredRecord.setPointsTypeStr("过期");
+//                        recordsToAdd.add(expiredRecord); // 添加复制对象
+//                    }
                     pointsRecord.setPointsTypeStr("退款");
                     mark = "+";
                     pointsRecord.setVariablePointsStr(mark + pointsRecord.getPoints());
                     break;
+                case 4:
+                    if (l==null){
+                        pointsRecord.setCurrentlyAvailablePoints(BigDecimal.ZERO);
+                    }else {
+                        pointsRecord.setCurrentlyAvailablePoints(BigDecimal.valueOf(l));
+                    }
+
+                    pointsRecord.setPointsTypeStr("过期");
+                    mark = "-";
+                    pointsRecord.setVariablePointsStr(mark + pointsRecord.getPoints());
+                    break;
             }
 
             // 设置可用积分(原对象和复制对象都会执行)