فهرست منبع

Merge remote-tracking branch 'origin/master'

wangming 1 روز پیش
والد
کامیت
3b75d81c9c

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

@@ -102,6 +102,10 @@ public class PointsRecord implements Serializable {
     @TableField(exist = false)
     private String variablePointsStr;
 
+    //过期状态
+    @TableField(exist = false)
+    private Integer expiryStatus;
+
     /**
      * 过期日期
      */

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

@@ -1,8 +1,8 @@
 spring:
   # 环境 dev|prod|docker quartz定时任务
   profiles:
-#    active: dev
-    active: prod
+    active: dev
+#    active: prod
   #文件上传设置
   servlet:
 

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

@@ -104,4 +104,6 @@ public interface OrderRefundMapper extends BaseMapper<OrderRefund> {
      * @return 订单退款详情
      */
     OrderRefundVo selectInfoById(Long refundId);
+
+    List<OrderRefund> findByOrderNumber(@Param("orderNumber")String orderNumber, @Param("returnMoneySts")Integer returnMoneySts);
 }

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

@@ -6,6 +6,8 @@ import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.bean.model.PointsRecord;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 积分记录详细 Mapper接口
  *
@@ -16,4 +18,5 @@ public interface PointsRecordMapper extends BaseMapper<PointsRecord> {
     Long statisticsPoint(@Param("userId") String userId, @Param("platform") Integer platform);
     ScoreDataDto statisticsAllScorePoint(@Param("userId") String userId, @Param("platform") Integer platform);
 
+    List<PointsRecord> findByOrderNumber(@Param("orderNumber")String orderNumber,@Param("pointsType") Integer pointsType);
 }

+ 39 - 15
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -40,6 +40,7 @@ import com.yami.shop.bean.param.*;
 import com.yami.shop.common.config.Constant;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.util.Arith;
+import com.yami.shop.common.util.Json;
 import com.yami.shop.common.util.PageAdapter;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.dao.*;
@@ -960,8 +961,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //退款的积分
             Long refundScore = 0L;
             //过期的积分
-            Long refundExpiredScore = 0L;
-
+            long refundExpiredScore = 0L;
+            //退款总积分
+             Long refundOffsetPoints=0L;
             Order order = orderMapper.selectById(orderRefund.getOrderId());
             if (null == order) throw new GlobalException("该订单不支持退款");
             //判定已完成的时间
@@ -1060,22 +1062,33 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     order.setRefundStatus(3);
                     List<OrderRefundSku> orderRefundSkus = orderRefundSkuMapper.selectList(new LambdaQueryWrapper<OrderRefundSku>()
                             .eq(OrderRefundSku::getOrderRefundId, orderRefund.getRefundId()));
-                    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.findByOrderNumber(order.getOrderNumber(), 2);
+                    List<OrderRefund> orderRefundList = orderRefundMapper.findByOrderNumber(order.getOrderNumber(),70);
+
+                    for (OrderRefund refund : orderRefundList) {
+                        refundOffsetPoints += refund.getOffsetPoints();
+                    }
+
+
+//                            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));
                     //TODO (int) Arith.mul(order.getFreightAmount(), 100),加在这里就是每次部分退单都要减掉,有可能会出现退的积分比下单总积分少。少的值恰好为一次运费
-                    int totalRefundScore = -(int) Arith.mul(order.getFreightAmount(), 100);//需要退的总积分,先把运费剔除掉
+                    int totalRefundScore = 0;//需要退款的金额,部分退款时不需要退运费。
+                    int freightAmountScore = -(int) Arith.mul(order.getFreightAmount(), 100);//需要退的总积分,先把运费剔除掉
                     double totalRefundActual = 0.0;//需要退的总金额
+                    int shoppingScore= 0;
                     for (OrderRefundSku refundSkus : orderRefundSkus) {
                         Integer productCount = refundSkus.getProductCount();//退款的数量
                         OrderItem orderItem = orderItemMapper.selectById(refundSkus.getOrderItemId());
                         Double actualTotal = orderItem.getActualTotal();//付的钱
                         Integer useScore = orderItem.getUseScore();//使用的总积分
+                        shoppingScore = useScore +freightAmountScore;//商品的总金额积分
                         if (useScore > 0) {
                             //退的积分不一定等于下单的数量
                             totalRefundScore = (int) (totalRefundScore + Arith.mul(productCount * orderItem.getPrice(), 100));
@@ -1088,7 +1101,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     //退积分
                     if (totalRefundScore > 0) {
                         refundScore = (long) totalRefundScore;
-                        refundExpiredScore = order.getOffsetPoints() - refundScore;
                         for (PointsRecord pointsRecord : pointsRecords) {
                             //下单支付的金额
                             int variablePoints = pointsRecord.getVariablePoints().intValue();//574
@@ -1100,23 +1112,35 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                             if (null == l) {
                                 l = 0L;
                             }
-                            if (null != pointsRecord.getVariablePoints()) {
-                                npr.setCurrentlyAvailablePoints(pointsRecord.getVariablePoints().add(BigDecimal.valueOf(l)));
+                            if (pointsRecord.getExpiryStatus()==1){//当过期状态等于1时才进行变更可用金额 否则不变更
+                                if (null != pointsRecord.getVariablePoints()) {
+                                    npr.setCurrentlyAvailablePoints(pointsRecord.getVariablePoints().add(BigDecimal.valueOf(l)));
+                                } else {
+                                    npr.setCurrentlyAvailablePoints(BigDecimal.valueOf(0.0).add(BigDecimal.valueOf(l)));
+                                }
                             } else {
                                 npr.setCurrentlyAvailablePoints(BigDecimal.valueOf(0.0).add(BigDecimal.valueOf(l)));
                             }
+
                             npr.setCreationDate(new Date());
                             //574>188
                             if (variablePoints < totalRefundScore) {//下单金额全退
                                 npr.setPoints(pointsRecord.getVariablePoints());
                                 npr.setVariablePoints(BigDecimal.valueOf(0));
+
                                 totalRefundScore -= variablePoints;
                             } else {//574>188,应退188
                                 npr.setPoints(BigDecimal.valueOf(totalRefundScore));
                                 npr.setVariablePoints(BigDecimal.valueOf(0));
+                                totalRefundScore=0;
+                            }
+                            if (pointsRecord.getExpiryStatus()==2){
+                                refundExpiredScore += totalRefundScore;
                             }
                             pointsRecordMapper.insert(npr);
-                            if (variablePoints >= totalRefundScore) return;
+                            if (totalRefundScore==0 && shoppingScore>=refundOffsetPoints) {
+                                return;
+                            }
                         }
 
                     }

+ 3 - 0
yami-shop-service/src/main/resources/mapper/OrderRefundMapper.xml

@@ -513,5 +513,8 @@
                  join tz_order o on refund.order_id = o.order_id
         where refund.refund_id = #{refundId}
     </select>
+    <select id="findByOrderNumber" resultType="com.yami.shop.bean.model.OrderRefund">
+        select * from tz_order_refund where return_money_sts=#{returnMoneySts} and order_number =#{orderNumber}
+    </select>
 
 </mapper>

+ 40 - 42
yami-shop-service/src/main/resources/mapper/PointsRecordMapper.xml

@@ -19,48 +19,38 @@
 
       <select id="statisticsAllScorePoint" resultType="com.yami.shop.bean.dto.ScoreDataDto">
           SELECT
-              (
-                  SUM(CASE WHEN points_type = 1 THEN points ELSE 0 END)
-                      - SUM(
-                          CASE WHEN points_audit IN (1, 2) AND expiry_date &lt;= NOW() THEN
-                                   CASE
-                                       WHEN points_audit = 1 THEN
-                                           CASE points_type
-                                               WHEN 1 THEN points
-                                               WHEN 3 THEN points
-                                               ELSE 0
-                                               END
-                                       WHEN points_audit = 2 THEN
-                                           CASE points_type
-                                               WHEN 1 THEN points - variable_points
-                                               WHEN 3 THEN points
-                                               END
-                                       END
-                               ELSE 0 END
-                        )
-                      - SUM(CASE WHEN points_type = 2 THEN variable_points ELSE 0 END)
-                      + SUM(CASE WHEN points_type = 3 THEN points ELSE 0 END)
-                  ) AS total_available_points,
-              SUM(CASE WHEN points_type = 1 THEN points ELSE 0 END) AS total_recharged_points,
-              SUM(
-                      CASE WHEN points_audit IN (1, 2) AND expiry_date &lt;= NOW() THEN
-                               CASE
-                                   WHEN points_audit = 1 THEN
-                                       CASE points_type
-                                           WHEN 1 THEN points
-                                           WHEN 3 THEN points
-                                           ELSE 0
-                                           END
-                                   WHEN points_audit = 2 THEN
-                                       CASE points_type
-                                           WHEN 1 THEN points - variable_points
-                                           WHEN 3 THEN points
-                                           END
-                                   END
-                           ELSE 0 END
-              ) AS expired_points,
-              (SUM(CASE WHEN points_type = 2 THEN variable_points ELSE 0 END) - SUM(CASE WHEN points_type = 3 THEN points ELSE 0 END)) AS consumed_points,
-              SUM(CASE WHEN points_type = 3 THEN points ELSE 0 END) AS refund_points
+          (
+          SUM(CASE WHEN points_type = 1 OR points_type = 3 THEN points ELSE 0 END)
+          -
+          GREATEST(
+          SUM(
+          CASE WHEN expiry_date &lt;= NOW() THEN
+          CASE
+          WHEN points_type = 1 OR points_type = 3 THEN points
+          WHEN points_type = 2 THEN -variable_points
+          ELSE 0
+          END
+          ELSE 0 END
+          ),
+          0
+          )
+          - SUM(CASE WHEN points_type = 2 THEN variable_points ELSE 0 END)
+          ) AS total_available_points,
+          SUM(CASE WHEN points_type = 1 THEN points ELSE 0 END) AS total_recharged_points,
+          GREATEST(
+          SUM(
+          CASE WHEN expiry_date &lt;= NOW() THEN
+          CASE
+          WHEN points_type = 1 OR points_type = 3 THEN points
+          WHEN points_type = 2 THEN -variable_points
+          ELSE 0
+          END
+          ELSE 0 END
+          ),
+          0
+          ) AS expired_points,
+          (SUM(CASE WHEN points_type = 2 THEN variable_points ELSE 0 END) - SUM(CASE WHEN points_type = 3 THEN points ELSE 0 END)) AS consumed_points,
+          SUM(CASE WHEN points_type = 3 THEN points ELSE 0 END) AS refund_points
           FROM
               tz_points_record
           WHERE
@@ -68,5 +58,13 @@
           AND channel_id = #{platform}
           AND points_type IN (1, 2, 3)
       </select>
+    <select id="findByOrderNumber" resultType="com.yami.shop.bean.model.PointsRecord">
+        select id,user_id,channel_id,order_number,
+               code,parent_code,points,variable_points,points_type,points_audit,expiry_date,creation_date,currently_available_points,points_id,
+               CASE
+               WHEN expiry_date > NOW() THEN 1
+               ELSE 2 END AS expiryStatus
+        from tz_points_record where order_number = #{orderNumber} and points_type =#{pointsType} order by  expiry_date desc
+    </select>
 
 </mapper>