wang 3 долоо хоног өмнө
parent
commit
d2a53cb869

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

@@ -92,7 +92,7 @@ public class OrderController {
             }
         }
         String userId = SecurityUtils.getUser().getUserId();
-        orderParam.setDvyType(1);
+//        orderParam.setDvyType(1);
 
         // 订单的地址信息
         UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId);
@@ -109,7 +109,7 @@ public class OrderController {
 
         // 将要返回给前端的完整的订单信息
         ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto();
-        shopCartOrderMergerDto.setDvyType(orderParam.getDvyType());
+//        shopCartOrderMergerDto.setDvyType(orderParam.getDvyType());
         shopCartOrderMergerDto.setUserAddr(userAddrDto);
         shopCartOrderMergerDto.setIsScorePay(orderParam.getIsScorePay());
         // 所有店铺的订单信息
@@ -142,46 +142,46 @@ public class OrderController {
 
             shopCartOrder.setShopCartItemDiscounts(shopCartItemDiscounts);
             allCartItem.addAll(shopAllShopCartItems);
-            // TODO wangjian 计算积分抵现和分摊,报错
+
             applicationContext.publishEvent(new ConfirmOrderEvent(shopCartOrder, orderParam, shopAllShopCartItems));
 
             total = Arith.add(total, shopCartOrder.getTotal());
             totalCount = totalCount + shopCartOrder.getTotalCount();
             allOrderReduce = Arith.add(allOrderReduce, shopCartOrder.getShopReduce());
-
+            //TODO wangjian 计算配送方式,和运费
             totalTransfee = Arith.add(totalTransfee, shopCartOrder.getTransfee());
             weight = Arith.add(weight, shopCartOrder.getTotalWeight());
             shopCartOrders.add(shopCartOrder);
         }
 
-//        //根据价格进行店铺、满减、商品项的价格升序操作
-//        for (int n = 0; n < shopCartOrders.size(); n++) {
-//            shopCartOrders = shopCartOrders.stream().sorted(Comparator.comparing(ShopCartOrderDto::getActualTotal)).collect(Collectors.toList());
-//            ShopCartOrderDto shopCartOrderDto = shopCartOrders.get(n);
-//
-//            List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts();
-//            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
-//                List<ShopCartItemDto> sortShopCartItems = shopCartItemDiscount.getShopCartItems();
-//                sortShopCartItems = sortShopCartItems.stream().sorted(Comparator.comparing(ProductItemDto::getActualTotal)).collect(Collectors.toList());
-//                shopCartItemDiscount.setShopCartItems(sortShopCartItems);
-//                double totalAmount = shopCartItemDiscount.getShopCartItems().stream().mapToDouble(ProductItemDto::getActualTotal).sum();
-//                //TODO 计算真实总库存
-//                shopCartItemDiscount.setTotalAmount(totalAmount);
-//            }
-//            // 如果是折扣特别小的情况下,导致实际金额为0是,改变最小支付金额为0.01元,并且优惠金额减去0.01。
-//            if (shopCartOrderDto.getActualTotal() <= 0) {
-//                shopCartOrderDto.setActualTotal(0.01);
-//                shopCartOrderDto.setShopReduce(Arith.sub(shopCartOrderDto.getShopReduce(), 0.01));
-//                List<ShopCartItemDto> sortItems = shopCartItemDiscounts.get(shopCartItemDiscounts.size() - 1).getShopCartItems();
-//                ShopCartItemDto shopCartItemDto = sortItems.get(sortItems.size() - 1);
-//                shopCartItemDto.setActualTotal(0.01);
-//                shopCartItemDto.setShareReduce(Arith.sub(shopCartItemDto.getShareReduce(), 0.01));
-//            }
-//            shopCartItemDiscounts = shopCartItemDiscounts.stream().sorted(Comparator.comparing(ShopCartItemDiscountDto::getTotalAmount)).collect(Collectors.toList());
-//            shopCartOrders.get(n).setShopCartItemDiscounts(shopCartItemDiscounts);
-//            //TODO 计算真实总库存
-//            actualTotal = Arith.add(actualTotal, shopCartOrderDto.getActualTotal());
-//        }
+        //根据价格进行店铺、满减、商品项的价格升序操作
+        for (int n = 0; n < shopCartOrders.size(); n++) {
+            shopCartOrders = shopCartOrders.stream().sorted(Comparator.comparing(ShopCartOrderDto::getActualTotal)).collect(Collectors.toList());
+            ShopCartOrderDto shopCartOrderDto = shopCartOrders.get(n);
+
+            List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts();
+            for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
+                List<ShopCartItemDto> sortShopCartItems = shopCartItemDiscount.getShopCartItems();
+                sortShopCartItems = sortShopCartItems.stream().sorted(Comparator.comparing(ProductItemDto::getActualTotal)).collect(Collectors.toList());
+                shopCartItemDiscount.setShopCartItems(sortShopCartItems);
+                double totalAmount = shopCartItemDiscount.getShopCartItems().stream().mapToDouble(ProductItemDto::getActualTotal).sum();
+                //TODO 计算真实总库存
+                shopCartItemDiscount.setTotalAmount(totalAmount);
+            }
+            // 如果是折扣特别小的情况下,导致实际金额为0是,改变最小支付金额为0.01元,并且优惠金额减去0.01。
+            if (shopCartOrderDto.getActualTotal() <= 0) {
+                shopCartOrderDto.setActualTotal(0.01);
+                shopCartOrderDto.setShopReduce(Arith.sub(shopCartOrderDto.getShopReduce(), 0.01));
+                List<ShopCartItemDto> sortItems = shopCartItemDiscounts.get(shopCartItemDiscounts.size() - 1).getShopCartItems();
+                ShopCartItemDto shopCartItemDto = sortItems.get(sortItems.size() - 1);
+                shopCartItemDto.setActualTotal(0.01);
+                shopCartItemDto.setShareReduce(Arith.sub(shopCartItemDto.getShareReduce(), 0.01));
+            }
+            shopCartItemDiscounts = shopCartItemDiscounts.stream().sorted(Comparator.comparing(ShopCartItemDiscountDto::getTotalAmount)).collect(Collectors.toList());
+            shopCartOrders.get(n).setShopCartItemDiscounts(shopCartItemDiscounts);
+            //TODO 计算真实总库存
+            actualTotal = Arith.add(actualTotal, shopCartOrderDto.getActualTotal());
+        }
 
         shopCartOrderMergerDto.setActualTotal(actualTotal);
         shopCartOrderMergerDto.setTotal(total);
@@ -246,6 +246,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());
 

+ 59 - 19
yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java

@@ -16,10 +16,7 @@ import com.yami.shop.bean.app.dto.ShopCartOrderDto;
 import com.yami.shop.bean.app.param.OrderParam;
 import com.yami.shop.bean.enums.DvyType;
 import com.yami.shop.bean.event.ConfirmOrderEvent;
-import com.yami.shop.bean.model.FreightFeeReduction;
-import com.yami.shop.bean.model.Product;
-import com.yami.shop.bean.model.Sku;
-import com.yami.shop.bean.model.UserAddr;
+import com.yami.shop.bean.model.*;
 import com.yami.shop.bean.order.ConfirmOrderOrder;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.exception.YamiShopBindException;
@@ -31,6 +28,8 @@ import com.yami.shop.service.ProductService;
 import com.yami.shop.service.SkuService;
 import com.yami.shop.service.UserAddrService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
@@ -102,27 +101,68 @@ public class ConfirmOrderListener {
             totalCount = shopCartItem.getProdCount() + totalCount;
             total = Arith.add(shopCartItem.getProductTotalAmount(), total);
             // 用户地址如果为空,则表示该用户从未设置过任何地址相关信息
+            // TODO wangjian 计算积分抵现和分摊,报错
             shopCartItem.setActualTotal(shopCartItem.getProductTotalAmount());
             shopCartOrderDto.setTotalWeight(Arith.add(shopCartOrderDto.getTotalWeight(), Arith.mul(shopCartItem.getWeight(), shopCartItem.getProdCount())));
         }
-        if (userAddr != null && !Objects.equals(orderParam.getDvyType(), DvyType.FETCH.value())) {
-            // 将所有订单传入处理,计算运费
-            transfee = transportManagerService.calculateTransfeeSecond2(shopCartItems.get(0).getShopId(), userAddr);
+        //默认走即使配送
+
+//        if (userAddr != null && !Objects.equals(orderParam.getDvyType(), DvyType.FETCH.value())) {
+        if (userAddr != null) {
+            // 根据配送范围计算配送费,没超出就
+            Transport2 transport2 = transportManagerService.calculateTransfeeSecondTransport2(shopCartItems.get(0).getShopId(), userAddr, orderParam.getPlatform());
+            if (ObjectUtils.isEmpty(transport2)) throw new GlobalException("该渠道下的门店尚未配置可用运费模板");
+            switch (orderParam.getPlatform()) {
+                case 1://企业用户,计算分单规则
+                    if (transport2.getTargetDistance() > transport2.getDistance()) {
+                        //超出配送范围使用快递
+                        orderParam.setDvyType(DvyType.DELIVERY.value());
+                    } else {
+                        //即时配送
+                        orderParam.setDvyType(DvyType.NOT_DELIVERY.value());
+                    }
+                    //费用按重量计算
+                    double sub = Arith.sub(shopCartOrderDto.getTotalWeight(), 20.0);
+                    transfee = transport2.getFreightFee().doubleValue();
+                    if (sub > 0) {
+                        //超过重量的安规则计算,累加费用
+                        // 假设5元/20kg
+                        // (20,40]  (40,60]  (60,80]
+                        //   2         3         4
+                        //  5*2+5     5*3+5     5*4+5
+                        int num = 1;
+                        while (sub > (1 << num) * 10) {
+                            num++;
+                            transfee = Arith.add(transfee, Arith.mul(transfee, num));
+                        }
+                    }
+                    break;
+                case 2: //夫妻店,B端只走物流
+                    orderParam.setDvyType(DvyType.DELIVERY.value());
+                    //TODO 费用待定
+                    break;
+                case 3: // 市民请集合,C端。只走配送
+                    orderParam.setDvyType(DvyType.NOT_DELIVERY.value());
+                    //TODO 费用待定
+                    break;
+            }
         }
 
+
+        //TODO wangjian 减免运费
         Double freeTransfee = 0.0;
-        List<FreightFeeReduction> feeReductions = freightFeeReductionService.list(new LambdaQueryWrapper<FreightFeeReduction>()
-                        .eq(FreightFeeReduction::getStatus, 1)
-                        .ge(FreightFeeReduction::getEndTime, LocalDateTime.now())
-//                .orderByAsc(FreightFeeReduction::getEndTime)
-        );
-        if (!feeReductions.isEmpty()) {
-            for (FreightFeeReduction feeReduction : feeReductions) {
-                freeTransfee += Arith.add(feeReduction.getMoney().doubleValue(), freeTransfee);
-            }
-        }
-        double sub = Arith.sub(transfee, freeTransfee);
-        transfee = Math.signum(sub) < 0 ? 0 : sub;
+//        List<FreightFeeReduction> feeReductions = freightFeeReductionService.list(new LambdaQueryWrapper<FreightFeeReduction>()
+//                        .eq(FreightFeeReduction::getStatus, 1)
+//                        .ge(FreightFeeReduction::getEndTime, LocalDateTime.now())
+////                .orderByAsc(FreightFeeReduction::getEndTime)
+//        );
+//        if (!feeReductions.isEmpty()) {
+//            for (FreightFeeReduction feeReduction : feeReductions) {
+//                freeTransfee += Arith.add(feeReduction.getMoney().doubleValue(), freeTransfee);
+//            }
+//        }
+//        double sub = Arith.sub(transfee, freeTransfee);
+//        transfee = Math.signum(sub) < 0 ? 0 : sub;
 
         shopCartOrderDto.setTotal(total);
         shopCartOrderDto.setTotalCount(totalCount);

+ 1 - 5
yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DvyType.java

@@ -19,13 +19,9 @@ public enum DvyType {
      * 快递
      */
     DELIVERY(1),
-    /**
-     * 自提
-     */
-    FETCH(2),
 
     /**
-     * 无需快递
+     * 及时配送
      */
     NOT_DELIVERY(3)
     ;

+ 21 - 9
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transport2.java

@@ -17,6 +17,7 @@ import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -28,40 +29,51 @@ public class Transport2 implements Serializable {
      * 运费模板id
      */
     @TableId
-    @ApiModelProperty(value = "运费模板id",required=true)
+    @ApiModelProperty(value = "运费模板id", required = true)
     private Long transportId;
 
     /**
      * 运费模板名称
      */
 
-    @ApiModelProperty(value = "运费模板名称",required=true)
+    @ApiModelProperty(value = "运费模板名称", required = true)
     private String transName;
 
+
+    @ApiModelProperty(value = "重量限制", required = true)
+    private Double weight;
+
+     @ApiModelProperty(value = "费用(元/20kg)", required = true)
+    private BigDecimal freightFee;
+
+     @ApiModelProperty(value = "渠道ID", required = true)
+    private Integer channelId;
+
     /**
      * 创建时间
      */
 
-	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @ApiModelProperty(value = "创建时间",required=true)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间", required = true)
     private Date createTime;
 
     /**
      * 店铺id
      */
 
-    @ApiModelProperty(value = "店铺id",required=true)
+    @ApiModelProperty(value = "店铺id", required = true)
     private Long shopId;
 
-    @ApiModelProperty(value = "配送距离",required=true)
+    @ApiModelProperty(value = "配送距离", required = true)
     private Double distance;
 
-    @ApiModelProperty(value = "订单需要满多少",required=true)
+    @ApiModelProperty(value = "订单需要满多少", required = true)
     private Double amount;
 
-    @ApiModelProperty(value = "配送费",required=true)
+    @ApiModelProperty(value = "配送费", required = true)
     private Double piece;
-
+    //用户范围
+    private Double targetDistance;
 
 
 }

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

@@ -154,5 +154,5 @@ public class User implements Serializable {
     /**
      * 1铜仁移动(企业用户) 2夫妻店(B端) 3 市民请集合(C端)
      */
-    private Long platform;
+    private Integer platform;
 }

+ 4 - 0
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/dao/Transport2Mapper.java

@@ -18,8 +18,12 @@ import org.apache.ibatis.annotations.Param;
 public interface Transport2Mapper extends BaseMapper<Transport2> {
 
 
+    Transport2 getTransportShopPlatform(@Param("shopId") Long shopId,@Param("platform") Integer platform);
+
     Transport2 getTransport(@Param("shopId") Long shopId, @Param("distance") Double distance);
 
+    Transport2 getTransportWeight(@Param("shopId") Long shopId, @Param("distance") Double distance, @Param("weight") Double weight);
+
     Transport2 findByTransportId(@Param("transportId") Long transportId);
 
     void deleteTransports(@Param("ids") Long[] ids);

+ 3 - 0
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/Transport2Service.java

@@ -30,6 +30,9 @@ public interface Transport2Service extends IService<Transport2> {
     Transport2 getTransportAndAllItems(Long transportId);
 
     Transport2 findByDistance(Long shopId, Double distance);
+    Transport2 findByDistance(Long shopId, Integer platform);
+
+    Transport2 findByDistance(Long shopId, Double distance, Double weight);
 
     ShopTransport findShopTransports(Long shopName);
 

+ 3 - 0
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/TransportManagerService.java

@@ -28,6 +28,9 @@ public interface TransportManagerService {
 
 
     Double calculateTransfeeSecond2(Long shopId, UserAddr userAddr);
+    Transport2 calculateTransfeeSecondTransport2(Long shopId, UserAddr userAddr,Integer platform);
+
+    Double calculateTransfeeSecond2(Long shopId, UserAddr userAddr, Double weight);
 
     Transport2 calculateTransfeeStart(Long shopId, Double longitude, Double latitude);
 }

+ 9 - 0
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/impl/Transport2ServiceImpl.java

@@ -74,6 +74,15 @@ public class Transport2ServiceImpl extends ServiceImpl<Transport2Mapper, Transpo
     public Transport2 findByDistance(Long shopId, Double distance) {
         return transportMapper.getTransport(shopId, distance);
     }
+    @Override
+    public Transport2 findByDistance(Long shopId, Integer platform) {
+        return transportMapper.getTransportShopPlatform(shopId, platform);
+    }
+
+    @Override
+    public Transport2 findByDistance(Long shopId, Double distance, Double weight) {
+        return transportMapper.getTransportWeight(shopId, distance,weight);
+    }
 
     @Override
     public ShopTransport findShopTransports(Long shopId) {

+ 36 - 2
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/impl/TransportManagerServiceImpl.java

@@ -196,19 +196,53 @@ public class TransportManagerServiceImpl implements TransportManagerService {
 
     @Override
     public Double calculateTransfeeSecond2(Long shopId, UserAddr userAddr) {
+        Double longitude = userAddr.getLongitude();
+        Double latitude = userAddr.getLatitude();
+        if (longitude.equals(0.0)) {
+            throw new GlobalException("收货地址经纬度为空");
+        }
+
+        ShopDetail shopDetailByShopId = shopDetailService.getShopDetailByShopId(shopId);
+        double v = calculateDistance(latitude, longitude, Double.valueOf(shopDetailByShopId.getShopLat()), Double.valueOf(shopDetailByShopId.getShopLng()));
+        Transport2 byDistance = transport2Service.findByDistance(shopId, v);
+        if (ObjectUtil.isEmpty(byDistance)) {
+            System.out.println("超出配送范围");
+            return -1.0;
+        }
+        // todo 计算价格
+
+        return byDistance.getPiece();
+    }
 
+    @Override
+    public Transport2 calculateTransfeeSecondTransport2(Long shopId, UserAddr userAddr, Integer platform) {
         Double longitude = userAddr.getLongitude();
         Double latitude = userAddr.getLatitude();
+        if (longitude.equals(0.0)) {
+            throw new GlobalException("收货地址经纬度为空");
+        }
+
+        ShopDetail shopDetailByShopId = shopDetailService.getShopDetailByShopId(shopId);
+        double v = calculateDistance(latitude, longitude, Double.valueOf(shopDetailByShopId.getShopLat()), Double.valueOf(shopDetailByShopId.getShopLng()));
+        Transport2 byDistance = transport2Service.findByDistance(shopId, platform);
+        byDistance.setTargetDistance(v);
+        return byDistance;
+    }
 
+    @Override
+    public Double calculateTransfeeSecond2(Long shopId, UserAddr userAddr, Double weight) {
+        Double longitude = userAddr.getLongitude();
+        Double latitude = userAddr.getLatitude();
         if (longitude.equals(0.0)) {
             throw new GlobalException("收货地址经纬度为空");
         }
 
         ShopDetail shopDetailByShopId = shopDetailService.getShopDetailByShopId(shopId);
         double v = calculateDistance(latitude, longitude, Double.valueOf(shopDetailByShopId.getShopLat()), Double.valueOf(shopDetailByShopId.getShopLng()));
-        Transport2 byDistance = transport2Service.findByDistance(shopId, v);
+        Transport2 byDistance = transport2Service.findByDistance(shopId, v, weight);
         if (ObjectUtil.isEmpty(byDistance)) {
-            throw new GlobalException("超出配送范围");
+            System.out.println("超出配送范围或重量超重");
+            return -1.0;
         }
         // todo 计算价格
 

+ 17 - 0
yami-shop-delivery/yami-shop-delivery-comment/src/main/resources/mapper/Transport2Mapper.xml

@@ -24,6 +24,14 @@
     </resultMap>
 
 
+    <select id="getTransportShopPlatform" resultMap="BaseResultMap">
+        SELECT *
+        FROM tz_transport2 p
+        WHERE p.shop_id = #{shopId}
+          AND p.channel_id = #{platform}
+        ORDER BY p.distance LIMIT 1
+    </select>
+
     <select id="getTransport" resultMap="BaseResultMap">
         SELECT *
         FROM tz_transport2 p
@@ -32,6 +40,15 @@
         ORDER BY p.distance LIMIT 1
     </select>
 
+    <select id="getTransportWeight" resultMap="BaseResultMap">
+        SELECT *
+        FROM tz_transport2 p
+        WHERE p.shop_id = #{shopId}
+          AND p.distance &gt;= #{distance}
+          AND p.weight &gt;= #{weight}
+        ORDER BY p.distance LIMIT 1
+    </select>
+
 
     <select id="findByTransportId" resultMap="BaseResultMap">
         select *