diff --git a/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java b/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java index 73af2839..cabe8b6c 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java +++ b/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java @@ -326,12 +326,12 @@ public interface ShopService { /** * 获取店铺的内部运费 shopping_fee_inner (远程调用用途) * - * @param store_id + * @param order_id * @return */ @ApiOperation(value = "获取店铺的内部运费 shopping_fee_inner", notes = "获取店铺的内部运费 shopping_fee_inner (远程调用用途)") @RequestMapping(value = "/admin/shop/shop-store-info/shopping-fee-inner", method = RequestMethod.POST) - Integer storeShoppingFeeInner(@RequestParam(name = "store_id") Integer store_id); + Integer storeShoppingFeeInner(@RequestParam(name = "order_id") String order_id); @GetMapping(value = "/admin/shop/shop-store-employee-rights-base/queryByRightsIds") diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/OrderCacDeliveryFeeDTO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/OrderCacDeliveryFeeDTO.java new file mode 100644 index 00000000..146be51f --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/OrderCacDeliveryFeeDTO.java @@ -0,0 +1,47 @@ +package com.suisung.mall.common.pojo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "OrderDeliveryInfoDTO", description = "计算订单内部配送费参数实体类") +public class OrderCacDeliveryFeeDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "订单ID") + private String order_id; + + @ApiModelProperty(value = "店铺ID") + private Integer store_id; + + @ApiModelProperty(value = "配送方式Id") + private Integer delivery_type_id; + + @ApiModelProperty(value = "订单商品金额") + private BigDecimal order_product_amount; + + @ApiModelProperty(value = "订单支付金额") + private BigDecimal order_payment_amount; + + @ApiModelProperty(value = "订单折扣金额") + private BigDecimal order_discount_amount; + + @ApiModelProperty(value = "订单重量(克)") + private Integer order_weight_gram; + + @ApiModelProperty(value = "配送地址经度") + private String da_longitude; + + @ApiModelProperty(value = "配送地址纬度") + private String da_latitude; +} \ No newline at end of file diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java index 2521325a..25e5d117 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java @@ -50,9 +50,9 @@ public interface AccountBaseConfigService extends IBaseService { */ Long getOrderCountByStoreId(Integer storeId, List orderStatusIdList, List orderRefundStatusIdList, List deliveryTypeList, Long expireSeconds); + + /** + * 根据订单ID获取计算配送费所需的订单信息 + *

+ * 查询逻辑说明: + * 1. 从订单基础信息表获取订单ID、店铺ID和商品总额 + * 2. 从订单数据表计算实际支付金额(订单支付金额 - 运费金额) + * 3. 从订单数据表计算折扣金额(商品零售总额 - 折扣金额 - 优惠券金额 - 调整金额 - 积分抵扣金额) + * 4. 从订单配送地址表获取配送地址的经纬度 + * + * @param orderId 订单ID + * @return OrderCacDeliveryFeeDTO 订单配送费计算参数实体 + */ + @Select("SELECT sob.order_id,sob.store_id,sob.order_product_amount,sob.order_payment_amount," + + "(sob.order_product_amount-sod.order_discount_amount-sod.voucher_price-sod.order_adjust_fee-sod.order_points_fee) as order_discount_amount," + + "0 as order_weight_gram," + + "aoda.da_longitude,aoda.da_latitude, soi.delivery_type_id " + + "FROM shop_order_base sob " + + "JOIN shop_order_data sod ON sob.order_id=sod.order_id " + + "JOIN shop_order_info soi ON sob.order_id=soi.order_id " + + "JOIN shop_order_delivery_address aoda ON sob.order_id=aoda.order_id " + + "WHERE sob.order_id=#{orderId}") + OrderCacDeliveryFeeDTO getOrderCacDeliveryFeeArgs(String orderId); + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java index 968209fd..47a00897 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java @@ -3,6 +3,7 @@ package com.suisung.mall.shop.order.service; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.modules.order.ShopOrderInfo; import com.suisung.mall.common.pojo.dto.BookingArgDTO; +import com.suisung.mall.common.pojo.dto.OrderCacDeliveryFeeDTO; import com.suisung.mall.core.web.service.IBaseService; import org.springframework.data.util.Pair; @@ -145,11 +146,33 @@ public interface ShopOrderInfoService extends IBaseService { List genBookingOrderArgList(String storeId); /** - * 获取某个活动订单成功数量 + * 获取某个活动订单成功数量(目前砍价用途) * * @param activityId 活动ID * @param activityTypeId 活动类型ID, 可选参数 * @return */ long fetchActivityOrderSuccessCount(String activityId, String activityTypeId); + + /** + * 获取某个订单是否存在(满足)内部配送费 + * + * @param deliveryTypeId 店铺ID + * @return Pair,第一个元素表示是否满足内部配送费条件,第二个元素为内部配送费金额 + */ + Boolean hasInnerMinDeliveryFee(Integer deliveryTypeId); + + /** + * 根据订单ID获取计算配送费所需的订单信息 + *

+ * 查询逻辑说明: + * 1. 从订单基础信息表获取订单ID、店铺ID和商品总额 + * 2. 从订单数据表计算实际支付金额(订单支付金额 - 运费金额) + * 3. 从订单数据表计算折扣金额(商品总额 - 折扣金额 - 调整金额 - 积分抵扣金额) + * 4. 从订单配送地址表获取配送地址的经纬度 + * + * @param orderId 订单ID + * @return OrderCacDeliveryFeeDTO 订单配送费计算参数实体 + */ + OrderCacDeliveryFeeDTO getOrderCacDeliveryFeeArgs(String orderId); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 87046f57..9e1cca1a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -917,6 +917,8 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl productBaseOpl = product_rows.stream().filter(s -> ObjectUtil.equal(product_id, Convert.toInt(s.get("product_id")))).findFirst(); @@ -962,8 +964,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl + * 内部配送费仅适用于同城配送方式,该方法通过检查配送方式是否为同城配送来判断是否满足条件 + * + * @param deliveryTypeId 配送方式ID + * @return Boolean 是否满足内部配送费条件 + */ + @Override + public Boolean hasInnerMinDeliveryFee(Integer deliveryTypeId) { + // 参数校验 + if (CheckUtil.isEmpty(deliveryTypeId)) { + logger.warn("[获取内部配送费] 配送方式ID为空,deliveryTypeId: {}", deliveryTypeId); + return false; + } + + // 检查配送方式是否为同城配送(只有同城配送才有内部配送费) + boolean isSameCityDelivery = StateCode.DELIVERY_TYPE_MAP.containsKey(deliveryTypeId) + && ObjectUtil.equal(StateCode.DELIVERY_TYPE_SAME_CITY, deliveryTypeId); + + logger.debug("[获取内部配送费] 配送方式检查结果, deliveryTypeId: {}, isSameCityDelivery: {}", + deliveryTypeId, isSameCityDelivery); + + return isSameCityDelivery; + } + + + /** + * 根据订单ID获取计算配送费所需的订单信息 + *

+ * 查询逻辑说明: + * 1. 从订单基础信息表获取订单ID、店铺ID和商品总额 + * 2. 从订单数据表计算实际支付金额(订单支付金额 - 运费金额) + * 3. 从订单数据表计算折扣金额(商品总额 - 折扣金额 - 调整金额 - 积分抵扣金额) + * 4. 从订单配送地址表获取配送地址的经纬度 + * + * @param orderId 订单ID + * @return OrderCacDeliveryFeeDTO 订单配送费计算参数实体 + */ + @Override + public OrderCacDeliveryFeeDTO getOrderCacDeliveryFeeArgs(String orderId) { + if (StrUtil.isBlank(orderId)) { + return null; + } + return shopOrderInfoMapper.getOrderCacDeliveryFeeArgs(orderId); + } + /** * 根据一个或多个店铺id获取有效店铺的有效营业时间段 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index d356b0fe..a940aaa3 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -2581,6 +2581,11 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0 (订单商品数量 > 已退货数量) + * 3. 可退金额 > 0 (订单商品金额 > 已同意退款金额) + * + * @param orderItemId 订单子项ID + * @return boolean 是否可以退款 + */ + private boolean ifCanReturnOrderItem(Long orderItemId) { + // 查询订单子项是否存在 + ShopOrderItem orderItem = shopOrderItemService.get(orderItemId); + return ifCanReturnOrderItem(orderItem); + } + + /** + * 判断订单子项是否可以退款 + * 条件: + * 1. 订单子项必须存在 + * 2. 可退数量 > 0 (订单商品数量 > 已退货数量) + * 3. 可退金额 > 0 (订单商品金额 > 已同意退款金额) + * + * @param orderItem 订单子项 + * @return boolean 是否可以退款 + */ + private boolean ifCanReturnOrderItem(ShopOrderItem orderItem) { + // 如果订单子项不存在,不能退款 + if (orderItem == null) { + return false; + } + + // 获取订单子项的相关字段,使用默认值避免空指针 + Integer orderItemQuantity = ObjectUtil.defaultIfNull(orderItem.getOrder_item_quantity(), 0); + Integer orderItemReturnNum = ObjectUtil.defaultIfNull(orderItem.getOrder_item_return_num(), 0); + BigDecimal orderItemAmount = ObjectUtil.defaultIfNull(orderItem.getOrder_item_amount(), BigDecimal.ZERO); + BigDecimal orderItemReturnAgreeAmount = ObjectUtil.defaultIfNull(orderItem.getOrder_item_return_agree_amount(), BigDecimal.ZERO); + + // 判断是否可以退款: + // 1. 可退数量 > 0 + // 2. 可退金额 > 0 + return orderItemQuantity > orderItemReturnNum + && orderItemAmount.compareTo(orderItemReturnAgreeAmount) > 0; + } + } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index b4e5af13..ac0eaf46 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -269,12 +269,12 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 3. 获取或初始化商家配送信息 ShopStoreSameCityTransportBase transportBase = shopStoreSameCityTransportBaseService - .getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); + .getShopStoreSameCityTransportBaseById(Long.valueOf(storeId), CommonConstant.Disable2); if (transportBase == null) { // 如果没有商家配送运费设置,则初始化 shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId); - transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); + transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId), CommonConstant.Disable2); } if (transportBase == null) { @@ -963,7 +963,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return new ThirdApiRes().fail(1003, "缺少店铺 Id!"); } - ShopStoreSameCityTransportBase shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(storeId); + ShopStoreSameCityTransportBase shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(storeId, CommonConstant.Disable2); if (shopStoreSameCityTransportBase == null) { logger.error("无法获取顺丰店铺 Id!"); return new ThirdApiRes().fail(1003, "无法获取店铺Id"); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java index 8ef5668c..42178dcb 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java @@ -5,10 +5,12 @@ import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.modules.store.ShopStoreInfo; import com.suisung.mall.common.service.impl.BaseControllerImpl; +import com.suisung.mall.shop.base.service.AccountBaseConfigService; import com.suisung.mall.shop.store.service.ShopStoreInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -30,6 +32,12 @@ public class ShopStoreInfoController extends BaseControllerImpl { @Autowired private ShopStoreInfoService shopStoreInfoService; + + @Lazy + @Autowired + private AccountBaseConfigService accountBaseConfigService; + + /** * 分页列表查询 * @@ -83,13 +91,13 @@ public class ShopStoreInfoController extends BaseControllerImpl { /** * 获取店铺的内部运费 shopping_fee_inner (远程调用用途) * - * @param store_id + * @param order_id * @return */ @ApiOperation(value = "获取店铺的内部运费 shopping_fee_inner", notes = "获取店铺的内部运费 shopping_fee_inner (远程调用用途)") @RequestMapping(value = "/shopping-fee-inner", method = RequestMethod.POST) - public Integer storeShoppingFeeInner(@RequestParam(name = "store_id") Integer store_id) { - return shopStoreInfoService.getStoreShippingFeeInner(store_id); + public Integer storeShoppingFeeInner(@RequestParam(name = "order_id") String order_id) { + return accountBaseConfigService.getInnerMinDeliveryFee(order_id); } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java index 4855ecaa..c3d35f76 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java @@ -10,8 +10,6 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; - @Api(tags = "同城配送运费设置控制器") @RestController @RequestMapping("/admin/shop/store/same-city-transport") @@ -25,8 +23,8 @@ public class ShopStoreSameCityTransportBaseController { @ApiOperation(value = "获取同城配送运费设置详情", notes = "获取同城配送运费设置详情") @RequestMapping(value = "/detail", method = {RequestMethod.GET}) - public CommonResult shopStoreSameCityTransportBaseDetail() { - return transportBaseService.ShopStoreSameCityTransportBaseDetail(); + public CommonResult shopStoreSameCityTransportBaseDetail(@RequestParam(name = "is_platfrom", defaultValue = "2") Integer isPlatform) { + return transportBaseService.ShopStoreSameCityTransportBaseDetail(isPlatform); } @ApiOperation(value = "保存(新增或修改)同城配送运费设置", notes = "保存(新增或修改)同城配送运费设置") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java index c7cb57b3..040b1028 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java @@ -10,8 +10,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; - @Api(tags = "同城配送运费设置控制器") @RestController @RequestMapping("/mobile/shop/store/same-city-transport") @@ -22,7 +20,7 @@ public class ShopStoreSameCityTransportBaseMobileController { @ApiOperation(value = "下单前检测同城订单配送是否符合要求", notes = "下单前检测同城订单配送是否符合要求") @RequestMapping(value = "/check/same-city/delivery", method = {RequestMethod.POST}) - public CommonResult checkSameCityDelivery(@RequestParam(name = "store_id", defaultValue = "0") Integer storeId) { - return transportBaseService.ShopStoreSameCityTransportBaseDetail(); + public CommonResult checkSameCityDelivery(@RequestParam(name = "is_platfrom", defaultValue = "2") Integer isPlatform) { + return transportBaseService.ShopStoreSameCityTransportBaseDetail(isPlatform); } } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java index bbd76846..037a86c1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java @@ -23,7 +23,7 @@ public interface ShopStoreSameCityTransportBaseService { * * @return */ - CommonResult ShopStoreSameCityTransportBaseDetail(); + CommonResult ShopStoreSameCityTransportBaseDetail(Integer isPlatform); /** * 保存或更新同城配送各项设置 @@ -52,17 +52,19 @@ public interface ShopStoreSameCityTransportBaseService { * 根据店铺 Id 获取同城配送设置详情信息 * * @param storeId + * @param isPlatform 1-平台 2-店铺 * @return */ - ShopStoreSameCityTransportBaseDTO getShopStoreSameCityTransportBaseDTOById(Long storeId); + ShopStoreSameCityTransportBaseDTO getShopStoreSameCityTransportBaseDTOById(Long storeId, Integer isPlatform); /** * 根据店铺Id获取同城配送基础运费记录 * * @param storeId + * @param isPlatform 1-平台 2-店铺 * @return */ - ShopStoreSameCityTransportBase getShopStoreSameCityTransportBaseById(Long storeId); + ShopStoreSameCityTransportBase getShopStoreSameCityTransportBaseById(Long storeId, Integer isPlatform); /** * 保存同城配送基础设置(存在更新,不存在新增) @@ -96,4 +98,25 @@ public interface ShopStoreSameCityTransportBaseService { */ SameCityDeliveryFeeRespDTO computeSameCityTransportFee(Long storeId, String orderLongitude, String orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount, Boolean canThrow); + /** + * 平台计算同城订单的内部配送费(仅仅作用于平台内部配送费计算,商家配送费忽略此方法,只对下单成功的订单起效果) + * + * @param orderId 订单ID + * @return 配送费,单位为分 + */ + Integer computeSameCityInnerDeliveryFeeByOrderId(String orderId); + + /** + * 平台计算同城订单的内部配送费(仅仅作用于平台内部配送费计算,商家配送费忽略此方法,下单前可以查询) + * + * @param storeId 店铺Id + * @param orderLongitude (订单送达地)目的地经度 + * @param orderLatitude (订单送达地)目的地维度 + * @param orderWeightGram 订单重量(单位克) + * @param orderProductAmount 订单商品原价金额 + * @param orderDiscountAmount 订单商品折扣金额(订单原价减去每个商品折扣费) + * @param orderPayAmount 订单实际支付金额(折扣金额-优惠券-积分扣-人工干预扣费),不包含运费 + * @return 配送费,单位为分 + */ + Integer computeSameCityInnerDeliveryFee(Integer storeId, String orderLongitude, String orderLatitude, Integer orderWeightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount); } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java index 5c9631ae..a804394b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java @@ -131,7 +131,7 @@ public class ShopStoreInfoServiceImpl extends BaseServiceImpl - * 店铺内部运费,单位(分)0-使用平台的内部运费;>0 使用店铺的内部运费 + * 店铺内部运费,单位(分)使用店铺的内部运费<=0 的时候 * * @param storeId 店铺ID * @return 内部运费,单位分 @@ -147,7 +147,6 @@ public class ShopStoreInfoServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", storeId).select("shopping_fee_inner"); ShopStoreInfo shopStoreInfo = getOne(queryWrapper); - if (shopStoreInfo == null || CheckUtil.isEmpty(shopStoreInfo.getShopping_fee_inner())) { return 0; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java index 46ba9523..8579f4da 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java @@ -25,6 +25,7 @@ import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.modules.store.ShopStoreSameCityTransport; import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.pojo.dto.DeliveryFeeResultDTO; +import com.suisung.mall.common.pojo.dto.OrderCacDeliveryFeeDTO; import com.suisung.mall.common.pojo.dto.SameCityDeliveryFeeRespDTO; import com.suisung.mall.common.pojo.dto.ShopStoreSameCityTransportBaseDTO; import com.suisung.mall.common.utils.CommonUtil; @@ -32,6 +33,7 @@ import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.PositionUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.base.service.AccountBaseConfigService; +import com.suisung.mall.shop.order.service.ShopOrderInfoService; import com.suisung.mall.shop.store.mapper.ShopStoreSameCityTransportBaseMapper; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; @@ -64,6 +66,11 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 2) { + isPlatform = CommonConstant.Disable2; + } + Long storeId = Convert.toLong(user.getStore_id()); - ShopStoreSameCityTransportBaseDTO retDTO = getShopStoreSameCityTransportBaseDTOById(storeId); + ShopStoreSameCityTransportBaseDTO retDTO = getShopStoreSameCityTransportBaseDTOById(storeId, isPlatform); if (retDTO == null) { return CommonResult.failed("商家未设置店铺地址,请先设置店铺地址!"); } @@ -226,10 +237,11 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 2) { + isPlatform = 2; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", storeId); + queryWrapper.eq("is_platform", isPlatform); queryWrapper.eq("status", CommonConstant.Enable); return getOne(queryWrapper); @@ -298,11 +315,19 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl saveOrUpdateShopStoreSameCityTransportBase(ShopStoreSameCityTransportBase transportBase) { try { + // 参数校验 if (transportBase == null || transportBase.getStore_id() == null || transportBase.getStore_id() <= 0) { + log.warn("保存或更新同城配送基础信息参数校验失败: transportBase={}", transportBase); return Pair.of(0L, "缺少店铺Id必要参数!"); } - // 设置默认值 + Integer isPlatform = transportBase.getIs_platform(); + if (isPlatform == null || isPlatform < 0 || isPlatform > 2) { + isPlatform = 2; + transportBase.setIs_platform(isPlatform); + } + + // 设置默认值 - 使用更清晰的条件判断 if (transportBase.getDistance_base() == null || transportBase.getDistance_base() < 0) { transportBase.setDistance_base(0); } @@ -327,36 +352,51 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", transportBase.getStore_id()); + queryWrapper.eq("is_platform", transportBase.getIs_platform()); + queryWrapper.eq("status", CommonConstant.Enable); ShopStoreSameCityTransportBase exist = getOne(queryWrapper); + Date now = new Date(); if (exist == null) { - // 新增 + // 新增操作 + log.debug("开始新增同城配送基础信息, storeId={}", transportBase.getStore_id()); transportBase.setCreated_by(transportBase.getUpdated_by()); + transportBase.setCreated_at(now); + transportBase.setUpdated_at(now); + if (add(transportBase)) { // 确保获取到ID Long transportBaseId = transportBase.getTransport_base_id(); if (transportBaseId == null || transportBaseId <= 0) { // 补偿机制:若transportBase.getTransport_base_id()==null,重新查询数据 + log.debug("新增后ID为空,重新查询获取ID, storeId={}", transportBase.getStore_id()); exist = getOne(queryWrapper); if (exist != null) { transportBaseId = exist.getTransport_base_id(); } } + log.info("新增同城配送基础信息成功, transportBaseId={}, storeId={}", transportBaseId, transportBase.getStore_id()); return Pair.of(transportBaseId, "添加成功!"); } else { + log.error("新增同城配送基础信息失败, storeId={}", transportBase.getStore_id()); return Pair.of(0L, "添加失败!"); } } else { - // 更新 + // 更新操作 + log.debug("开始更新同城配送基础信息, transportBaseId={}, storeId={}", exist.getTransport_base_id(), transportBase.getStore_id()); transportBase.setTransport_base_id(exist.getTransport_base_id()); + transportBase.setUpdated_at(now); + if (updateById(transportBase)) { + log.info("更新同城配送基础信息成功, transportBaseId={}, storeId={}", transportBase.getTransport_base_id(), transportBase.getStore_id()); return Pair.of(transportBase.getTransport_base_id(), "更新成功!"); } else { + log.error("更新同城配送基础信息失败, transportBaseId={}, storeId={}", transportBase.getTransport_base_id(), transportBase.getStore_id()); return Pair.of(0L, "更新失败!"); } } } catch (Exception e) { - log.error("保存或更新同城配送基础信息异常: ", e); + log.error("保存或更新同城配送基础信息异常, storeId={}", transportBase != null ? transportBase.getStore_id() : "unknown", e); return Pair.of(0L, "系统内部错误"); } } @@ -406,6 +446,11 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 2) { + isPlatform = 2; + } + transportBase.setIs_platform(isPlatform); transportBase.setStore_id(Convert.toLong(storeBase.getStore_id())); transportBase.setStore_longitude(storeBase.getStore_longitude()); transportBase.setStore_latitude(storeBase.getStore_latitude()); @@ -461,7 +506,6 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) { // 末尾非零进位,比如:2.1将是3, 2.0将是2,2.001将是3 - times = NumberUtil.div(diffWeightKg, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP); + times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP); } deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times)); @@ -690,4 +734,213 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(Convert.toLong(storeId)); + + if (CollUtil.isEmpty(transportList)) { + // 没有配送范围规则的时候,直接以基础配送费来配送 + return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue(); + } + + // 判断配送范围和起送金额条件 + String canNotDeliveryReason = ""; + boolean canDelivery = false; + + // 优先处理距离和金额都满足的规则 + for (ShopStoreSameCityTransport transport : transportList) { + // 判断订单距离是否在配送范围内 + if (transport.getMax_delivery_radius() >= distance) { + // 距离在配送范围内,判断金额是否符合起配金额额度 + boolean moneyPassed = false; + if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) { + moneyPassed = orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) <= 0; + } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) { + moneyPassed = orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) <= 0; + } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) { + moneyPassed = orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) <= 0; + } + + // 距离和金额都满足条件 + if (moneyPassed) { + canDelivery = true; + break; + } + } + } + + // 如果没有找到完全满足条件的规则,再详细检查找出失败原因 + if (!canDelivery) { + for (ShopStoreSameCityTransport transport : transportList) { + // 判断订单距离是否在配送范围内 + if (transport.getMax_delivery_radius() < distance) { + // 记录距离不满足的原因 + canNotDeliveryReason = storeName + "的订单不在配送范围内,订单无法配送。"; + } else { + // 距离在配送范围内,判断金额是否符合起配金额额度 + if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) { + if (orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) > 0) { + BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderProductAmount); + canNotDeliveryReason = String.format("%s商品原价金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney); + } else { + canDelivery = true; + break; + } + } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) { + if (orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) > 0) { + BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderDiscountAmount); + canNotDeliveryReason = String.format("%s订单折后金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney); + } else { + canDelivery = true; + break; + } + } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) { + if (orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) > 0) { + BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderPayAmount); + canNotDeliveryReason = String.format("%s订单应支付金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney); + } else { + canDelivery = true; + break; + } + } + } + } + } + + // 如果仍然不能配送,记录日志并返回0 + if (!canDelivery) { + logger.warn(canNotDeliveryReason.isEmpty() ? (storeName + "订单不在配送范围内或未达起送金额,请检查!") : canNotDeliveryReason); + return 0; + } + + // 额外配送费计算 + // 每增加一个距离累加运费 + if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && distance > transportBase.getDistance_base() * 1000) { + // 实际配送距离超出基础距离,单位km + BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000))); + // 倍数 + BigDecimal times = BigDecimal.ZERO; + if (transportBase.getDistance_increase_km() > 0 && diffDistanceM.intValue() > transportBase.getDistance_increase_km()) { + // 末尾非零进位,比如:2.1将是3, 2.0将是2,2.001将是3 + times = NumberUtil.div(diffDistanceM, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP); + } + + // 超过基础运费距离后,累加上运费 + deliveryBaseFee = deliveryBaseFee.add(transportBase.getDistance_increase_fee().multiply(times)); + } + + // 每增加一个重量累加运费(重量暂时忽略,配置的时候设置0) + if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && orderWeightGram != null && orderWeightGram > transportBase.getWeight_base() * 1000) { + // 实际配送重量超出基础重量,单位kg + BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(orderWeightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000))); + // 倍数 + BigDecimal times = BigDecimal.ZERO; + if (transportBase.getWeight_increase_kg() > 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) { + // 末尾非零进位,比如:2.1将是3, 2.0将是2,2.001将是3 + times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP); // 修正:应该除以weight_increase_kg而不是distance_increase_km + } + + deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times)); + } + + // 返回单位为分的配送费 + return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue(); + } + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java index 2487ec1c..4dc94d45 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java @@ -2644,7 +2644,7 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl