Преглед на файлове

优化订单积分流程

wang преди 2 седмици
родител
ревизия
c978fb7f9c

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

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

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

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

+ 62 - 31
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -136,7 +136,10 @@ public class SubmitOrderListener {
                 Long shopId = shopCartOrderDto.getShopId();
                 // 订单信息
                 com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order();
-                Double actualTotal = shopCartOrderDto.getActualTotal();
+                order.setIsPayed(0);
+                order.setStatus(OrderStatus.UNPAY.value());
+                double actualTotal = Arith.add(shopCartOrderDto.getActualTotal(), shopCartOrderDto.getTransfee());
+                boolean isUseTransfee = false;
                 //企业用户才进这个判断,并且该用户的积分必须大于0
                 if (1 == mergerOrder.getPlatform() && null != point && point > 0) {
                     // 计算商品金额和积分
@@ -144,15 +147,20 @@ public class SubmitOrderListener {
                     Double vp = Double.valueOf(point);
                     if (vp >= mul) {
                         //积分完全足够支付
+                        order.setOffsetPoints(Long.valueOf(String.valueOf(mul).split("\\.")[0]));
                         actualTotal = 0.0;//剩下需要付的钱
-                        order.setOffsetPoints(Long.valueOf(String.valueOf(mul)));
                     } else {
                         //积分不够抵扣
                         double sub = Arith.sub(mul, vp);
                         //剩下需要付的钱
+                        order.setOffsetPoints(Long.valueOf(String.valueOf(sub).split("\\.")[0]));
                         actualTotal = sub / 100;
-                        order.setOffsetPoints(Long.valueOf(String.valueOf(sub)));
+                        mergerOrder.setNextPay(Boolean.TRUE);
+                        order.setIsPayed(1);
+                        order.setStatus(OrderStatus.PADYED.value());
                     }
+                } else {
+                    mergerOrder.setNextPay(Boolean.TRUE);
                 }
                 // 订单商品名称
                 StringBuilder orderProdName = new StringBuilder(100);
@@ -183,8 +191,14 @@ public class SubmitOrderListener {
                         Double actualItem = shopCartItem.getActualTotal();
                         //后台充值的积分
                         if (1 == mergerOrder.getPlatform() && null != point && point > 0) {
+                            Double useActualItem = actualItem;
+                            if (!isUseTransfee) {//每个订单增加手续费,都只扣一次
+                                Double transfee = shopCartOrderDto.getTransfee();
+                                useActualItem = Arith.add(useActualItem, transfee);
+                                isUseTransfee = Boolean.TRUE;
+                            }
                             //把钱换算成积分
-                            actualItem = this.doGetOrderItemPoints(Arith.mul(actualItem, 100), expiryQueue, orderNumber);
+                            actualItem = this.doGetOrderItemPoints(Arith.mul(useActualItem, 100), expiryQueue, orderNumber);
                             //把积分换算成钱
                             if (actualItem > 0) {
                                 actualItem = Arith.div(actualItem, 100);
@@ -225,11 +239,10 @@ public class SubmitOrderListener {
                 order.setTotal(shopCartOrderDto.getTotal());
                 // 实际总额
                 order.setActualTotal(actualTotal);
-                order.setStatus(OrderStatus.UNPAY.value());
+
                 order.setChannelId(Long.valueOf(mergerOrder.getPlatform()));
                 order.setUpdateTime(now);
                 order.setCreateTime(now);
-                order.setIsPayed(0);
                 order.setDeleteStatus(0);
                 order.setProductNums(shopCartOrderDto.getTotalCount());
                 order.setAddrOrderId(addrOrderId);
@@ -382,32 +395,50 @@ public class SubmitOrderListener {
 
     private Double doGetOrderItemPoints(Double actualTotal, ArrayDeque<PointsRecord> expiryQueue, String orderNumber) {
         PointsRecord pointsRecord = expiryQueue.poll();
-        //判定可用金额
-        BigDecimal points = pointsRecord.getPoints();
-        BigDecimal variablePoints = pointsRecord.getVariablePoints();
-        //充值记录中可用的记录
-        Double available = points.subtract(variablePoints).doubleValue();
-        actualTotal = Arith.sub(actualTotal, available);
-        pointsRecord.setVariablePoints(BigDecimal.valueOf(available));
-        if (available > actualTotal) {
-            //钱已经抵扣完,但是当条积分还有剩余,所以不要重新把剩余的放入队列
-            //更改pointsRecord的变动的值,并修改数据库
-            expiryQueue.addFirst(pointsRecord);
-        }
-        int update = pointsRecordMapper.updateById(pointsRecord);
-        if (update > 0) {
-            PointsRecord pr = new PointsRecord();
+        PointsRecord pr = new PointsRecord();
+        if (pointsRecord != null) {
+            //判定可用金额
+            BigDecimal points = pointsRecord.getPoints() != null ? pointsRecord.getPoints() : BigDecimal.ZERO;
+            BigDecimal variablePoints = pointsRecord.getVariablePoints() != null ? pointsRecord.getVariablePoints() : BigDecimal.ZERO;
+            //充值记录中可用的记录
+            double available = points.subtract(variablePoints).doubleValue();
             BeanUtil.copyProperties(pointsRecord, pr);
-            pr.setId(null);
-            pr.setOrderNumber(orderNumber);
-        }
-        // TODO 插入数据库
-        if (actualTotal > available) {
-            //把当前积分已完全够扣,但是还有钱
-            actualTotal = this.doGetOrderItemPoints(actualTotal, expiryQueue, orderNumber);
-        } else {
-            //恰好积分等于钱
-//            actualTotal = Arith.sub(actualTotal, available);
+            if (available > actualTotal) {
+                //钱已经抵扣完,但是当条积分还有剩余,所以不要重新把剩余的放入队列。钱少积分多
+                //剩余的积分
+                pointsRecord.setVariablePoints(variablePoints.add(BigDecimal.valueOf(actualTotal)));
+                pr.setVariablePoints(variablePoints.add(BigDecimal.valueOf(actualTotal)));
+                expiryQueue.addFirst(pointsRecord);
+                pointsRecord.setPointsAudit(2);//部分使用
+                pr.setPointsAudit(2);//部分使用
+                actualTotal = 0.0;
+            } else if (actualTotal > available) {
+                actualTotal = Arith.sub(actualTotal, available);
+                //把当前积分已扣完,但是还有钱。钱多积分少
+                pointsRecord.setVariablePoints(points);
+                pr.setVariablePoints(points);
+                pr.setPointsAudit(3);
+                pointsRecord.setPointsAudit(3);
+            } else {
+                //恰好等于
+                pr.setPointsAudit(3);
+                pointsRecord.setPointsAudit(3);
+                pointsRecord.setVariablePoints(pointsRecord.getPoints());
+                pr.setVariablePoints(pointsRecord.getPoints());
+                actualTotal = 0.0;
+            }
+            int update = pointsRecordMapper.updateById(pointsRecord);
+            if (update > 0) {
+                pr.setId(null);
+                pr.setPointsType(2);
+                pr.setOrderNumber(orderNumber);
+                pr.setExpiryDate(null);
+                pointsRecordMapper.insert(pr);
+            }
+            //  插入数据库
+            if (actualTotal > 0.0) {
+                actualTotal = this.doGetOrderItemPoints(actualTotal, expiryQueue, orderNumber);
+            }
         }
         return actualTotal;
     }

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

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

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

@@ -3,7 +3,7 @@ package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yami.shop.bean.model.PointsRecord;
-import org.springframework.data.repository.query.Param;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 积分记录详细 Mapper接口

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

@@ -199,11 +199,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Transactional(rollbackFor = Exception.class)
     public List<Order> submit(String userId, ShopCartOrderMergerDto mergerOrder) {
         List<Order> orderList = new ArrayList<>();
-
         // 提交订单
         eventPublisher.publishEvent(new SubmitOrderEvent(mergerOrder, orderList));
         // 插入订单
-        orderList.forEach(order -> orderMapper.insert(order));
+        orderList.forEach(orderMapper::insert);
         List<OrderItem> orderItems = orderList.stream()
                 .flatMap(order -> order.getOrderItems().stream()
                 )