Browse Source

用户提货订单运费计算

cup 3 years ago
parent
commit
25f71749ad

+ 40 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java

@@ -1,18 +1,21 @@
 package com.qs.mp.web.controller.api.user;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
-import com.qs.mp.common.enums.BizTypeEnum;
-import com.qs.mp.common.enums.DeliverOrderStatusEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.domain.ShippingTemplate;
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.service.IShippingTemplateRuleService;
+import com.qs.mp.common.service.IShippingTemplateService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.redis.RedisKey;
@@ -32,11 +35,15 @@ import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -77,6 +84,9 @@ public class UserDeliverOrderController extends BaseApiController {
   @Autowired
   private RedisCache redisCache;
 
+  @Autowired
+  private IShippingTemplateRuleService shippingTemplateRuleService;
+
   /**
    * 订单列表
    */
@@ -138,6 +148,9 @@ public class UserDeliverOrderController extends BaseApiController {
    */
   @PostMapping("/order/settle")
   @ApiOperation(value = "订单结算" , notes = "奖品库里点提货")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success", response = DeliverOrderSettleVO.class)
+  )
   public AjaxResult settle(@Valid @RequestBody DeliverOrderParam param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
 
@@ -161,6 +174,29 @@ public class UserDeliverOrderController extends BaseApiController {
         .in(UserPrizeStorage::getStorageId, param.getIds()));
 
 
+    // 计算运费
+    UserAddr userAddr = orderSettleVO.getAddr();
+    // TODO: 4L上线需要调整,后期放开就是取的商品里配的运费模板id
+    ShippingTemplateCalculateVO shippingTemplateCalculateVO = shippingTemplateRuleService.getShippingTemplateRuleByTemplateIdAndAreaInfo(4L, userAddr.getProvinceId(), userAddr.getCityId());
+    // 无法查到运费模板则默认为0
+    if (Objects.nonNull(shippingTemplateCalculateVO)) {
+
+      orderSettleVO.setFreightRemark(shippingTemplateCalculateVO.getRemark());
+      orderSettleVO.setFreightType(shippingTemplateCalculateVO.getType());
+
+      if (ShippingTemplateRuleTypeEnum.SHIP.getValue().equals(shippingTemplateCalculateVO.getType())) {
+        int goodsNum = prizeStorageList.stream().mapToInt(UserPrizeStorage::getGoodsNum).sum();
+        freightAmt = shippingTemplateCalculateVO.getDefaultNumber();
+        if (goodsNum - shippingTemplateCalculateVO.getDefaultNumber() >= shippingTemplateCalculateVO.getCreateNumber()) {
+
+          // 运费:首件价格 + ((商品数量 - 首件数量) / 续件数量)向上取整 * 续件价格
+          int createNumber = shippingTemplateCalculateVO.getCreateNumber();
+          freightAmt += ((int) Math.ceil(NumberUtil.div(goodsNum - shippingTemplateCalculateVO.getDefaultNumber(), createNumber))) * shippingTemplateCalculateVO.getCreatePrice();
+        }
+      }
+
+    }
+
     orderSettleVO.setOrderAmt(orderAmt);
     orderSettleVO.setFreightAmt(freightAmt);
     orderSettleVO.setPayAmt(orderAmt + freightAmt);

+ 37 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ShippingTemplateRuleTypeEnum.java

@@ -0,0 +1,37 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+/**
+ * 运费模板规则类型枚举类
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板规则类型枚举类")
+public enum ShippingTemplateRuleTypeEnum implements IEnum<Integer> {
+
+    SHIP(1,"发货"),
+
+    NOT_SHIP(2,"不发货");
+
+
+    ShippingTemplateRuleTypeEnum(int value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    private final int value;
+    private final String desc;
+
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+}

+ 51 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateCalculateVO.java

@@ -0,0 +1,51 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 运费计算出参类
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费计算出参类")
+@Data
+public class ShippingTemplateCalculateVO {
+
+    /**
+     * 类型 1发货,2不发货,默认1
+     */
+    @ApiModelProperty("类型 1发货,2不发货,默认1")
+    private Integer type;
+
+    /**
+     * 默认数量
+     */
+    @ApiModelProperty("默认数量")
+    private Integer defaultNumber;
+
+    /**
+     * 默认价格
+     */
+    @ApiModelProperty("默认价格")
+    private Integer defaultPrice;
+
+    /**
+     * 新增数量
+     */
+    @ApiModelProperty("新增数量")
+    private Integer createNumber;
+
+    /**
+     * 新增价格
+     */
+    @ApiModelProperty("新增价格")
+    private Integer createPrice;
+
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 12 - 0
mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateRuleMapper.java

@@ -1,7 +1,12 @@
 package com.qs.mp.common.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
 import com.qs.mp.common.domain.ShippingTemplateRule;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @auther quanshu
@@ -10,4 +15,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ShippingTemplateRuleMapper extends BaseMapper<ShippingTemplateRule> {
 
+    /**
+     * 根据运费模板和地区信息获取运费规则
+     *
+     * @param queryWrapper
+     * @return
+     */
+    ShippingTemplateCalculateVO selectShippingTemplateRuleByTemplateIdAndAreaInfo(@Param(Constants.WRAPPER) QueryWrapper<ShippingTemplateRule> queryWrapper);
 }

+ 10 - 0
mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateRuleService.java

@@ -1,5 +1,6 @@
 package com.qs.mp.common.service;
 
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
 import com.qs.mp.common.domain.ShippingTemplateRule;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +14,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IShippingTemplateRuleService extends IService<ShippingTemplateRule> {
 
+    /**
+     * 根据运费模板和地区信息获取运费规则
+     *
+     * @param shippingTemplateId 运费模板id
+     * @param provinceId         省份id
+     * @param cityId             城市id
+     * @return
+     */
+    ShippingTemplateCalculateVO getShippingTemplateRuleByTemplateIdAndAreaInfo(long shippingTemplateId, Long provinceId, Long cityId);
 }

+ 12 - 0
mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateRuleServiceImpl.java

@@ -1,5 +1,9 @@
 package com.qs.mp.common.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.common.domain.Area;
 import com.qs.mp.common.domain.ShippingTemplateRule;
 import com.qs.mp.common.mapper.ShippingTemplateRuleMapper;
 import com.qs.mp.common.service.IShippingTemplateRuleService;
@@ -17,4 +21,12 @@ import org.springframework.stereotype.Service;
 @Service
 public class ShippingTemplateRuleServiceImpl extends ServiceImpl<ShippingTemplateRuleMapper, ShippingTemplateRule> implements IShippingTemplateRuleService {
 
+    @Override
+    public ShippingTemplateCalculateVO getShippingTemplateRuleByTemplateIdAndAreaInfo(long shippingTemplateId, Long provinceId, Long cityId) {
+        QueryWrapper<ShippingTemplateRule> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.id", shippingTemplateId);
+        queryWrapper.eq("t3.province_id", provinceId);
+        queryWrapper.eq("t3.city_id", cityId);
+        return this.getBaseMapper().selectShippingTemplateRuleByTemplateIdAndAreaInfo(queryWrapper);
+    }
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderSettleVO.java

@@ -32,6 +32,12 @@ public class DeliverOrderSettleVO {
   @ApiModelProperty("运费")
   private Integer freightAmt = 0;
 
+  @ApiModelProperty("运费模板类型 1发货,2不发货")
+  private Integer freightType;
+
+  @ApiModelProperty("运费备注")
+  private String freightRemark;
+
   /**
    * 实付金额
    */

+ 13 - 0
mp-service/src/main/resources/mapper/common/ShippingTemplateRuleMapper.xml

@@ -20,4 +20,17 @@
         id, shipping_template_id, type, default_number, default_price, create_number, create_price, created_time, updated_time
     </sql>
 
+
+        <select id="selectShippingTemplateRuleByTemplateIdAndAreaInfo" resultType="com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO">
+        select t2.type,
+               t2.default_number,
+               t2.default_price,
+               t2.create_number,
+               t2.create_price,
+                t3.remark
+        FROM mp_shipping_template t1
+         LEFT JOIN mp_shipping_template_rule t2 on t1.id = t2.shipping_template_id
+         LEFT JOIN mp_shipping_template_rule_area t3 on t2.id = t3.shipping_template_rule_id
+         ${ew.customSqlSegment}
+    </select>
 </mapper>