lmx 6 dní pred
rodič
commit
375a5343f1

+ 10 - 0
fs-admin/src/main/java/com/fs/live/controller/LiveAfterSalesController.java

@@ -180,4 +180,14 @@ public class LiveAfterSalesController extends BaseController
         param.setOperator(loginUser.getUser().getNickName());
         return liveAfterSalesService.cancel(param);
     }
+
+    @PreAuthorize("@ss.hasPermi('store:storeAfterSales:refund')")
+    @PostMapping("/handleImmediatelyRefund")
+    public R handleImmediatelyRefund(@RequestBody LiveAfterSalesRefundParam param)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setOperator(loginUser.getUser().getNickName());
+        return liveAfterSalesService.handleImmediatelyRefund(param.getOrderId());
+    }
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/live/mapper/LiveAfterSalesMapper.java

@@ -130,4 +130,7 @@ public interface LiveAfterSalesMapper {
             "where user_id=#{userId}  and sales_status =#{salesStatus} " +
             "</script>"})
     Integer selectLiveAfterSalesCount(@Param("userId")long userId,@Param("salesStatus") int salesStatus);
+
+    @Select(" select  * from  live_after_sales where order_id = #{orderId} and sales_status = 0 ")
+    LiveAfterSales getLiveAfterSalesByOrderId(@Param("orderId") Long orderId);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/live/service/ILiveAfterSalesService.java

@@ -90,4 +90,6 @@ public interface ILiveAfterSalesService {
     List<LiveAfterSalesQueryVO> selectLiveAfterSalesListQuery(LiveAfterSalesQueryParam param);
 
     Integer selectLiveAfterSalesCount(long l, int i);
+
+    R handleImmediatelyRefund(Long orderId);
 }

+ 220 - 4
fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.live.service.impl;
 
 import java.lang.reflect.InvocationTargetException;
 import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -10,6 +11,7 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
@@ -17,6 +19,9 @@ import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.DateUtils;
 
 import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.spring.SpringUtils;
+import com.fs.company.service.ICompanyService;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.erp.constant.AfterSalesOrderStatusEnum;
 import com.fs.erp.domain.FsJstAftersalePush;
 import com.fs.erp.dto.BaseResponse;
@@ -24,25 +29,30 @@ import com.fs.erp.dto.ErpRefundUpdateRequest;
 import com.fs.erp.mapper.FsJstAftersalePushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsHfpayConfig;
 import com.fs.his.domain.FsUser;
+import com.fs.his.mapper.FsHfpayConfigMapper;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.config.FsErpConfig;
 import com.fs.hisStore.domain.*;
 import com.fs.hisStore.dto.StoreOrderProductDTO;
-import com.fs.hisStore.enums.AfterSalesStatusEnum;
-import com.fs.hisStore.enums.AfterStatusEnum;
-import com.fs.hisStore.enums.OrderInfoEnum;
-import com.fs.hisStore.enums.SysConfigEnum;
+import com.fs.hisStore.enums.*;
 import com.fs.hisStore.param.FsStoreAfterSalesProductParam;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.hisStore.service.IFsUserScrmService;
 import com.fs.hisStore.vo.FsStoreAfterSalesQueryVO;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
+import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.service.HuiFuService;
 import com.fs.live.domain.*;
 import com.fs.live.dto.LiveAfterSalesProductDTO;
 import com.fs.live.enums.LiveAfterSalesStatusEnum;
 import com.fs.live.mapper.*;
 import com.fs.live.param.*;
 import com.fs.live.service.ILiveOrderItemService;
+import com.fs.live.service.ILiveOrderLogsService;
 import com.fs.live.service.ILiveOrderService;
 import com.fs.live.vo.LiveAfterSalesListUVO;
 import com.fs.live.vo.LiveAfterSalesQueryVO;
@@ -52,9 +62,17 @@ import com.fs.store.config.StoreConfig;
 import com.fs.store.domain.*;
 import com.fs.store.service.cache.IFsUserCacheService;
 import com.fs.system.service.ISysConfigService;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.ObjectUtils;
 import org.apache.http.util.Asserts;
 import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -887,4 +905,202 @@ public class LiveAfterSalesServiceImpl implements ILiveAfterSalesService {
     }
 
 
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+    @Autowired
+    private LiveUserLotteryRecordMapper liveUserLotteryRecordMapper;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductService;
+
+    @Autowired
+    private WxPayService wxPayService;
+
+
+    @Autowired
+    private HuiFuService huiFuService;
+
+    @Autowired
+    private ILiveOrderLogsService liveOrderLogsService;
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private LiveAfterSalesMapper liveAfterSalesMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public R handleImmediatelyRefund(Long orderId) {
+        IErpOrderService erpOrderService = getErpService();
+        FsErpConfig erpConfig = configUtil.generateStructConfigByKey("his.config", FsErpConfig.class);
+        LiveOrder order = liveOrderService.selectLiveOrderByOrderId(String.valueOf(orderId));
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        if (order.getStatus() == -2) {
+            return R.error("已退款");
+        }
+        if (!Integer.valueOf(-1).equals(order.getStatus())) {
+            return R.error("非法操作");
+        }
+        if (erpConfig.getErpOpen() != null
+                && erpConfig.getErpOpen() == 1
+                && StringUtils.isEmpty(order.getExtendOrderId())
+                && !CloudHostUtils.hasCloudHostName("康年堂")) {
+            return R.error("暂未推送至erp,请稍后再试!");
+        }
+//        if (StringUtils.isNotEmpty(order.getExtendOrderId())) {
+//            ErpRefundUpdateRequest request = new ErpRefundUpdateRequest();
+//            request.setTid(order.getOrderCode());
+//            request.setOid(order.getOrderCode());
+//            request.setRefund_state(1);
+//
+//            if (ObjectUtils.equals(order.getStatus(), 2)) {
+//                LiveAfterSalesParam param = new LiveAfterSalesParam();
+//                param.setOrderCode(order.getOrderCode());
+//                param.setRefundAmount(order.getPayMoney());
+//                param.setServiceType(1);
+//                param.setReasons("后台手动退款流程");
+//                param.setExplainImg(null);
+//                List<FsStoreAfterSalesProductParam> productParams = new ArrayList<>();
+//                List <LiveOrderItem> items = liveOrderItemMapper.selectLiveOrderItemByOrderId(order.getOrderId());
+//                for (LiveOrderItem item : items){
+//                    FsStoreAfterSalesProductParam param1 = new FsStoreAfterSalesProductParam();
+//                    param1.setProductId(item.getProductId());
+//                    param1.setNum(Math.toIntExact(item.getNum()));
+//                    productParams.add(param1);
+//                }
+//                return liveAfterSalesService.applyForAfterSales(order.getUserId(), param);
+//            } else {
+//                jSTOrderService.refundUpdateLive(request);
+//            }
+//        }
+        order.setStatus(OrderInfoEnum.STATUS_NE2.getValue());
+        order.setRefundMoney(order.getPayMoney());
+        order.setRefundStatus(String.valueOf(OrderInfoEnum.REFUND_STATUS_2.getValue()));
+        liveUserLotteryRecordMapper.updateOrderStatusByOrderId(order.getOrderId(), -2);
+        liveOrderService.updateLiveOrder(order);
+
+        //退库存
+        //获取订单下的商品
+        List<LiveOrderItem> orderItemVOS = liveOrderItemMapper.selectLiveOrderItemByOrderId(order.getOrderId());
+        for (LiveOrderItem vo : orderItemVOS) {
+            if (vo.getIsAfterSales() == 1) {
+                fsStoreProductService.incProductStock(vo.getNum(), vo.getProductId(), vo.getProductAttrValueId());
+            }
+        }
+        if ("3".equals(order.getPayType())) {
+            //货到付款
+        } else {
+            //将钱退还给用户
+            List<LiveOrderPayment> payments = liveOrderPaymentMapper.selectLiveOrderPaymentByPay(5, order.getOrderId());
+            if (payments != null && !payments.isEmpty()) {
+                String json = configService.selectConfigByKey("his.pay");
+                FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
+                for (LiveOrderPayment payment : payments) {
+                    if (payment.getPayMode() == null || "wx".equals(payment.getPayMode())) {
+                        WxPayConfig payConfig = new WxPayConfig();
+                        payConfig.setAppId(fsPayConfig.getAppId());
+                        payConfig.setMchId(fsPayConfig.getWxMchId());
+                        payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                        payConfig.setKeyPath(fsPayConfig.getKeyPath());
+                        payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                        payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                        wxPayService.setConfig(payConfig);
+                        WxPayRefundRequest refundRequest = new WxPayRefundRequest();
+                        refundRequest.setOutTradeNo("live-" + payment.getPayCode());
+                        refundRequest.setOutRefundNo("live-" + payment.getPayCode());
+                        refundRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
+                        refundRequest.setRefundFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
+                        try {
+                            WxPayRefundResult refundResult = wxPayService.refund(refundRequest);
+                            WxPayRefundQueryResult refundQueryResult = wxPayService.refundQuery("", refundResult.getOutTradeNo(), refundResult.getOutRefundNo(), refundResult.getRefundId());
+                            if (refundQueryResult != null && "SUCCESS".equals(refundQueryResult.getResultCode())) {
+                                LiveOrderPayment paymentMap = new LiveOrderPayment();
+                                paymentMap.setPaymentId(payment.getPaymentId());
+                                paymentMap.setStatus(-1);
+                                paymentMap.setRefundTime(DateUtils.getNowDate());
+                                paymentMap.setRefundMoney(payment.getPayMoney());
+                                liveOrderPaymentMapper.updateLiveOrderPayment(paymentMap);
+                            } else {
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return R.error("退款请求失败" + (refundQueryResult != null ? refundQueryResult.getErrCodeDes() : ""));
+                            }
+                        } catch (WxPayException e) {
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return R.error("退款请求失败" + e.getErrCodeDes());
+                        }
+                    } else if (payment.getPayMode() != null && "hf".equals(payment.getPayMode())) {
+                        String huifuId = "";
+                        FsHfpayConfigMapper fsHfpayConfigMapper = SpringUtils.getBean(FsHfpayConfigMapper.class);
+                        if (payment.getAppId() != null) {
+                            FsHfpayConfig fsHfpayConfig = fsHfpayConfigMapper.selectByAppId(payment.getAppId());
+                            if (fsHfpayConfig != null) {
+                                huifuId = fsHfpayConfig.getHuifuId();
+                            }
+                        } else {
+                            CloudHostProper cloudHostProper = SpringUtils.getBean(CloudHostProper.class);
+                            if ("益善缘".equals(cloudHostProper.getCompanyName())) {
+                                FsHfpayConfig fsPayConfig2 = fsHfpayConfigMapper.selectByAppId("wx0d1a3dd485268521");
+                                if (fsPayConfig2 != null) {
+                                    huifuId = fsPayConfig2.getHuifuId();
+                                }
+                            } else {
+                                huifuId = fsPayConfig.getHuifuId();
+                            }
+                        }
+
+                        V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+                        request.setOrgHfSeqId(payment.getTradeNo());
+                        request.setHuifuId(huifuId);
+                        request.setOrdAmt(payment.getPayMoney().toString());
+                        request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+                        request.setReqSeqId("refund-" + payment.getPayCode());
+                        Map<String, Object> extendInfoMap = new HashMap<>();
+                        extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
+                        request.setExtendInfo(extendInfoMap);
+                        HuiFuRefundResult refund = huiFuService.refund(request);
+                        log.info("退款:" + refund);
+                        if (refund != null && ("00000000".equals(refund.getResp_code()) || "00000100".equals(refund.getResp_code()))
+                                && ("S".equals(refund.getTrans_stat()) || "P".equals(refund.getTrans_stat()))) {
+                            payment.setRefundMoney(payment.getPayMoney());
+                            payment.setStatus(-1);
+                            payment.setRefundTime(new Date());
+                            liveOrderPaymentMapper.updateLiveOrderPayment(payment);
+                        } else {
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return R.error(refund != null ? refund.getResp_desc() : "退款失败");
+                        }
+                    } else {
+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                        return R.error("支付类型异常");
+                    }
+                }
+            }
+        }
+        liveOrderLogsService.create(order.getOrderId(), OrderLogEnum.REFUND_ORDER_SUCCESS.getValue(),
+                OrderLogEnum.REFUND_ORDER_SUCCESS.getDesc());
+        //减去公司收入
+        if (order.getCompanyId() != null && order.getCompanyId() > 0 && order.getTuiMoneyStatus() != null && order.getTuiMoneyStatus() == 1) {
+            companyService.subLiveCompanyMoney(order);
+        }
+        // 减去用户佣金
+        if (order.getTuiUserId() != null && order.getTuiUserId() > 0) {
+            IFsUserScrmService userService = SpringUtils.getBean(IFsUserScrmService.class);
+            if (userService != null) {
+                // 需要将LiveOrder转换为FsStoreOrderScrm用于subTuiMoney方法
+                FsStoreOrderScrm storeOrder = new FsStoreOrderScrm();
+                storeOrder.setId(order.getOrderId());
+                storeOrder.setTuiUserId(order.getTuiUserId());
+                userService.subTuiMoney(storeOrder);
+            }
+        }
+        LiveAfterSales liveAfterSales = liveAfterSalesMapper.getLiveAfterSalesByOrderId(orderId);
+        LiveAfterSales liveMp = new LiveAfterSales();
+        liveMp.setId(liveAfterSales.getId());
+        liveMp.setStatus(LiveAfterSalesStatusEnum.STATUS_4.getValue());
+        liveMp.setSalesStatus(3);
+        liveAfterSalesMapper.updateLiveAfterSales(liveMp);
+
+        return R.ok();
+    }
 }

+ 81 - 77
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -2364,82 +2364,86 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 
     private BigDecimal handleDeliveryMoney(Long cityId, FsStoreProductScrm fsStoreProduct, String totalNumSize) {
         BigDecimal storePostage = BigDecimal.ZERO;
-//        List<Long> citys = new ArrayList<>();
-//        citys.add(cityId);
-//        citys.add(0l);
-//        String ids = String.valueOf(fsStoreProduct.getTempId());
-//        List<FsShippingTemplates> shippingTemplatesList = shippingTemplatesService.selectFsShippingTemplatesByIds(ids);
-//        String cityIds = String.join(",", citys.stream()
-//                .map(String::valueOf).collect(Collectors.toList()));
-//        List<FsShippingTemplatesRegion> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(ids,cityIds);
-//        Map<Long, Integer> shippingTemplatesMap = shippingTemplatesList
-//                .stream()
-//                .collect(Collectors.toMap(FsShippingTemplates::getId,
-//                        FsShippingTemplates::getType));
-//        //提取运费模板有相同值覆盖
-//        Map<Long, FsShippingTemplatesRegion> shippingTemplatesRegionMap =
-//                shippingTemplatesRegionList.stream()
-//                        .collect(Collectors.toMap(FsShippingTemplatesRegion::getTempId,
-//                                YxShippingTemplatesRegion -> YxShippingTemplatesRegion,
-//                                (key1, key2) -> key2));
-//        Long tempId = Long.valueOf(fsStoreProduct.getTempId());
-//        double num = 0d;
-//        Integer templateType = shippingTemplatesMap.get(tempId);
-//        List<FsStoreProductAttrValue> productAttrValues = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueByProductId(fsStoreProduct.getProductId());
-//        if(productAttrValues == null || productAttrValues.isEmpty()) {
-//            return storePostage;
-//        }
-//        FsStoreProductAttrValue productAttrValue = productAttrValues.get(0);
-//        Integer totalNum = Integer.valueOf(totalNumSize);
-//        // TYPE_1: 按件数计算
-//        if (ShippingTempEnum.TYPE_1.getValue().equals(templateType)) {
-//            num = totalNum.doubleValue();
-//        }
-//        // TYPE_2: 按重量计算(数量 × 重量)
-//        else if (ShippingTempEnum.TYPE_2.getValue().equals(templateType)) {
-//            num = NumberUtil.mul(totalNum, productAttrValue.getWeight()).doubleValue();
-//        }
-//        // TYPE_3: 按体积计算(数量 × 体积)
-//        else if (ShippingTempEnum.TYPE_3.getValue().equals(templateType)) {
-//            num = NumberUtil.mul(totalNum, productAttrValue.getVolume()).doubleValue();
-//        }
-//        FsShippingTemplatesRegion shippingTemplatesRegion = shippingTemplatesRegionMap.get(tempId);
-//        if (shippingTemplatesRegion == null) {
-//            log.error("没有找到运费模板");
-//            return storePostage;
-//        }
-//        BigDecimal price = NumberUtil.round(NumberUtil.mul(totalNum, fsStoreProduct.getPrice()), 2);
-//
-//        TemplateDTO templateDTO = TemplateDTO.builder()
-//                .number(num)  // 累计数量(件数/重量/体积)
-//                .price(price)  // 累计金额
-//                .first(shippingTemplatesRegion.getFirst().doubleValue())  // 首件数量
-//                .firstPrice(shippingTemplatesRegion.getFirstPrice())  // 首件运费
-//                .continues(shippingTemplatesRegion.getContinues().doubleValue())  // 续件数量
-//                .continuePrice(shippingTemplatesRegion.getContinuePrice())  // 续件运费
-//                .tempId(tempId)  // 模板ID
-//                .cityId(cityId)  // 城市ID
-//                .build();
-//        //只满足首件
-//        if (Double.compare(templateDTO.getNumber(), templateDTO.getFirst()) <= 0) {
-//            storePostage = NumberUtil.round(NumberUtil.add(storePostage,
-//                    templateDTO.getFirstPrice()), 2);
-//        } else {
-//            BigDecimal firstPrice = NumberUtil.add(storePostage, templateDTO.getFirstPrice());
-//
-//            if (templateDTO.getContinues() <= 0) {
-//                storePostage = firstPrice;
-//            } else {
-//                //续件平均值且向上取整数
-//                double average = Math.ceil(NumberUtil.div(NumberUtil.sub(templateDTO.getNumber(),
-//                                templateDTO.getFirst()),
-//                        templateDTO.getContinues().doubleValue()));
-//                //最终邮费
-//                storePostage = NumberUtil.add(firstPrice, NumberUtil.mul(average,
-//                        templateDTO.getContinuePrice()));
-//            }
-//
-//        }
+        List<Long> citys = new ArrayList<>();
+        citys.add(cityId);
+        citys.add(0l);
+        String ids = String.valueOf(fsStoreProduct.getTempId());
+        //如果没有配置运费 直接返回
+        if(StringUtils.isBlank(ids)){
+            return storePostage;
+        }
+        List<FsShippingTemplatesScrm> shippingTemplatesList = shippingTemplatesService.selectFsShippingTemplatesByIds(ids);
+        String cityIds = String.join(",", citys.stream()
+                .map(String::valueOf).collect(Collectors.toList()));
+        List<FsShippingTemplatesRegionScrm> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(ids,cityIds);
+        Map<Long, Integer> shippingTemplatesMap = shippingTemplatesList
+                .stream()
+                .collect(Collectors.toMap(FsShippingTemplatesScrm::getId,
+                        FsShippingTemplatesScrm::getType));
+        //提取运费模板有相同值覆盖
+        Map<Long, FsShippingTemplatesRegionScrm> shippingTemplatesRegionMap =
+                shippingTemplatesRegionList.stream()
+                        .collect(Collectors.toMap(FsShippingTemplatesRegionScrm::getTempId,
+                                YxShippingTemplatesRegion -> YxShippingTemplatesRegion,
+                                (key1, key2) -> key2));
+        Long tempId = Long.valueOf(fsStoreProduct.getTempId());
+        double num = 0d;
+        Integer templateType = shippingTemplatesMap.get(tempId);
+        List<FsStoreProductAttrValueScrm> productAttrValues = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueByProductId(fsStoreProduct.getProductId());
+        if(productAttrValues == null || productAttrValues.isEmpty()) {
+            return storePostage;
+        }
+        FsStoreProductAttrValueScrm productAttrValue = productAttrValues.get(0);
+        Integer totalNum = Integer.valueOf(totalNumSize);
+        // TYPE_1: 按件数计算
+        if (ShippingTempEnum.TYPE_1.getValue().equals(templateType)) {
+            num = totalNum.doubleValue();
+        }
+        // TYPE_2: 按重量计算(数量 × 重量)
+        else if (ShippingTempEnum.TYPE_2.getValue().equals(templateType)) {
+            num = NumberUtil.mul(totalNum, productAttrValue.getWeight()).doubleValue();
+        }
+        // TYPE_3: 按体积计算(数量 × 体积)
+        else if (ShippingTempEnum.TYPE_3.getValue().equals(templateType)) {
+            num = NumberUtil.mul(totalNum, productAttrValue.getVolume()).doubleValue();
+        }
+        FsShippingTemplatesRegionScrm shippingTemplatesRegion = shippingTemplatesRegionMap.get(tempId);
+        if (shippingTemplatesRegion == null) {
+            log.error("没有找到运费模板");
+            return storePostage;
+        }
+        BigDecimal price = NumberUtil.round(NumberUtil.mul(totalNum, fsStoreProduct.getPrice()), 2);
+
+        TemplateDTO templateDTO = TemplateDTO.builder()
+                .number(num)  // 累计数量(件数/重量/体积)
+                .price(price)  // 累计金额
+                .first(shippingTemplatesRegion.getFirst().doubleValue())  // 首件数量
+                .firstPrice(shippingTemplatesRegion.getFirstPrice())  // 首件运费
+                .continues(shippingTemplatesRegion.getContinues().doubleValue())  // 续件数量
+                .continuePrice(shippingTemplatesRegion.getContinuePrice())  // 续件运费
+                .tempId(tempId)  // 模板ID
+                .cityId(cityId.toString())  // 城市ID
+                .build();
+        //只满足首件
+        if (Double.compare(templateDTO.getNumber(), templateDTO.getFirst()) <= 0) {
+            storePostage = NumberUtil.round(NumberUtil.add(storePostage,
+                    templateDTO.getFirstPrice()), 2);
+        } else {
+            BigDecimal firstPrice = NumberUtil.add(storePostage, templateDTO.getFirstPrice());
+
+            if (templateDTO.getContinues() <= 0) {
+                storePostage = firstPrice;
+            } else {
+                //续件平均值且向上取整数
+                double average = Math.ceil(NumberUtil.div(NumberUtil.sub(templateDTO.getNumber(),
+                                templateDTO.getFirst()),
+                        templateDTO.getContinues().doubleValue()));
+                //最终邮费
+                storePostage = NumberUtil.add(firstPrice, NumberUtil.mul(average,
+                        templateDTO.getContinuePrice()));
+            }
+
+        }
 
         return storePostage;
     }
@@ -2899,7 +2903,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 storePayment.setPayMoney(order.getPayMoney());
                 storePayment.setCreateTime(new Date());
                 storePayment.setPayTypeCode("weixin");
-                storePayment.setBusinessType(2);
+                storePayment.setBusinessType(5);
                 storePayment.setRemark("直播订单支付");
                 storePayment.setOpenId(user.getRealName());
                 storePayment.setUserId(user.getUserId());