diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java index 71cbcb5c..ef29724b 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java @@ -131,6 +131,34 @@ public class CommonUtil { .distinct().collect(Collectors.toList()); } + /** + * 判断任何一个对象是否有空值? + * @param objs + * @return + */ + public static boolean hasAnyBlank(Object... objs) { + if (objs == null || objs.length == 0) { + return true; + } + + for (Object o : objs) { + if (o == null) { + return true; + } + } + + return false; + } + + /** + * 判断全部对象是否都不为空 + * @param objs + * @return + */ + public static boolean isAllNotBlank(Object... objs) { + return !hasAnyBlank(objs); + } + /** * Double 四舍五入,不保留小数点 * @param d @@ -150,6 +178,12 @@ public class CommonUtil { } + /** + * 根据上一个订单状态和当前状态,获取订单状态变化备注 + * @param order_state_pre_id + * @param order_state_id + * @return + */ public static String getOrderStateNote(int order_state_pre_id, int order_state_id) { String rtn = ""; 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 312c9dec..dc94a9d6 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 @@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.suisung.mall.common.api.*; +import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.constant.ConfigConstant; import com.suisung.mall.common.constant.MqConstant; import com.suisung.mall.common.domain.UserDto; @@ -1224,7 +1225,6 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl item_rows = new ArrayList(); if (ifcart > 0) { - // 权限判断 + // 从购物车走 QueryWrapper cartQueryWrapper = new QueryWrapper<>(); cartQueryWrapper.eq("chain_id", chain_id).eq("user_id", user_id).eq("cart_select", 1).gt("cart_quantity", 0); if (checked_store > 0) { + // 权限判断 cartQueryWrapper.eq("store_id", checked_store); } @@ -1260,6 +1259,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl) cart_data.get("items"); } + // 注:重要方法 return doQuickAddOrder(user_id, item_rows, ud_id, true, "", StateCode.ORDER_TYPE_DD, null); } @@ -1304,7 +1304,8 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl user_voucher_ids = checkCoupon(); Map checkout_row = new HashMap(); - Integer delivery_type_id = getParameter("delivery_type_id", StateCode.DELIVERY_TYPE_EXP); + // 配送方式:5-门店自提;10-普通快递;16-同城配送; + Integer delivery_type_id = getParameter("delivery_type_id", StateCode.DELIVERY_TYPE_SAME_CITY); if (getParameter("checkout_row") == null) { Date cur_date = new Date(); checkout_row.put("payment_type_id", StateCode.PAYMENT_TYPE_ONLINE); @@ -1318,8 +1319,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl 0) { + // 从购物车走 QueryWrapper cartQueryWrapper = new QueryWrapper<>(); cartQueryWrapper.eq("chain_id", chain_id).eq("user_id", user_id).eq("cart_select", 1).gt("cart_quantity", 0); - if (checked_store > 0) { cartQueryWrapper.eq("store_id", checked_store); } @@ -1411,7 +1413,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl store_o2o_flag_row = ((List) cart_data.get("items")).stream().map(s -> Convert.toInt(s.get("store_o2o_flag"))).distinct().collect(Collectors.toList()); if (store_o2o_flag_row.size() > 1) { @@ -1541,7 +1543,6 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl -1) { order_resource_ext2_use = order_resource_ext2; @@ -5907,7 +5908,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl computeSameCityTransportFee(Long storeId, BigDecimal orderLongitude, BigDecimal orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount) { // 该订单能否配送? - Boolean canTransport = false; + Boolean canDelivery = false; - if (storeId == null || storeId <= 0 || orderLongitude == null || orderLatitude == null) { + if (CommonUtil.hasAnyBlank(storeId, orderLongitude, orderLatitude) || storeId <= 0) { logger.error("同城配送费计算:缺少必要的参数"); - return Pair.of(canTransport, BigDecimal.ZERO); + return Pair.of(canDelivery, BigDecimal.ZERO); } // 获取基础运费设置记录 ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(storeId); - if (transportBase == null || transportBase.getStore_longitude() == null || transportBase.getStore_latitude() == null || transportBase.getDistance_base() == null || transportBase.getDelivery_base_fee() == null) { + if (CommonUtil.hasAnyBlank(transportBase, transportBase.getStore_longitude(), transportBase.getStore_latitude(), transportBase.getDistance_base(), transportBase.getDelivery_base_fee())) { logger.error("同城配送费计算:无法获取基础运费设置记录,或店铺经纬度为空"); - return Pair.of(canTransport, BigDecimal.ZERO); + return Pair.of(canDelivery, BigDecimal.ZERO); } // 通过高德或百度地图api,计算两点的距离,如果服务不可用或无法计算,使用内部算法计算距离(单位米) @@ -277,7 +277,8 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl transportBase.getDistance_base() * 1000) { + if (CommonUtil.isAllNotBlank(transportBase.getDistance_increase_km(), transportBase.getDistance_increase_fee(),transportBase.getDistance_base()) && distance > transportBase.getDistance_base() * 1000) { +// if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && transportBase.getDistance_base() != null && distance > transportBase.getDistance_base() * 1000) { // 实际配送距离超出基础距离,单位km BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000))); // 累加的次数 @@ -295,7 +296,8 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl transportBase.getWeight_base() * 1000) { + if (CommonUtil.isAllNotBlank(transportBase.getWeight_increase_kg(), transportBase.getWeight_increase_fee(),transportBase.getWeight_base()) && weightGram > transportBase.getWeight_base() * 1000) { + // if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && transportBase.getWeight_base() != null && weightGram > transportBase.getWeight_base() * 1000) { // 实际配送重量超出基础重量,单位kg BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(weightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000))); // 累加的次数 @@ -322,14 +324,14 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 0)) { // 订单原价金额小于起送金额,返回订单不能送达了 - canTransport = false; + canDelivery = false; continue; - } - if (!canTransport) { - canTransport = true; + if (!canDelivery) { + canDelivery = true; } // 获取优惠的配送费 @@ -364,7 +365,7 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl= 0 ? deliveryBaseFee : BigDecimal.ZERO); + return Pair.of(canDelivery, deliveryBaseFee.compareTo(BigDecimal.ZERO) >= 0 ? deliveryBaseFee : BigDecimal.ZERO); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreTransportTypeServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreTransportTypeServiceImpl.java index adc0dcdd..6f91e57f 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreTransportTypeServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreTransportTypeServiceImpl.java @@ -151,7 +151,7 @@ public class ShopStoreTransportTypeServiceImpl extends BaseServiceImpl { * 2、配送区域问题 * * @param cart_data 最总数据 - * @param district_id 配送地区 + * @param district_id 配送地区(城市id city_id) */ void calTransportFreight(Map cart_data, Integer district_id); 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 575a3d19..9055be5e 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 @@ -14,7 +14,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.ResultCode; import com.suisung.mall.common.api.StateCode; -import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.exception.ApiUserException; @@ -53,9 +52,11 @@ import com.suisung.mall.shop.user.service.ShopUserCartService; import com.suisung.mall.shop.user.service.ShopUserDeliveryAddressService; import com.suisung.mall.shop.user.service.ShopUserVoucherService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.io.Serializable; import java.math.BigDecimal; import java.util.*; @@ -90,7 +91,7 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl transportTypes = transportTypeService.gets(transport_type_ids); + List transportTypes = shopStoreTransportTypeService.gets(transport_type_ids); for (Map store_row : store_rows) { Map activitys = (Map) ObjectUtil.defaultIfNull(store_row.get("activitys"), new HashMap()); @@ -2163,7 +2166,7 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl Convert.toBigDecimal(s.get("policy_discount_amount"), BigDecimal.ZERO)).reduce(BigDecimal::add).get(); store_row.put("policy_discount_amount", policy_discount_amount); @@ -2173,7 +2176,7 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl Convert.toBigDecimal(s.get("item_discount_amount"), BigDecimal.ZERO)).reduce(BigDecimal::add).get(); //item_discount_amount 数据实时放入 activityDiscountMoney, pulseActivityDiscountMoney 中。 不重叠放入。二选一。 + //店铺订单活动总额度 = 店铺全局优惠 + 单品优惠 store_row.put("order_activity_discount_amount", order_activity_discount_amount); - // 店铺订单总优惠额度 = 店铺全局优惠 + 单品优惠 + 价格策略折扣 + // 店铺订单总优惠额度 = 店铺全局优惠 + 单品优惠 + (会员等级)价格策略折扣 store_row.put("order_discount_amount", order_discount_amount); - store_row.put("postFree", true); // 是否免运费 - store_row.put("freight", 0); // 运费 - store_row.put("postFreeBalance", 0); // 还需 postFreeBalance 元即可免邮费 - + store_row.put("freight", 0); // 运费金额 + store_row.put("postFreeBalance", 0); // 还需postFreeBalance元即可免邮费 store_row.put("activity_discount_amount", order_activity_discount_amount); // 关键订单金额数据 orderSelProductAmount = orderSelProductAmount.add(store_origin_total); - orderSelFreightAmount = orderSelFreightAmount.add(Convert.toBigDecimal(store_row.get("freight"))); - orderSelMoneyAmount = orderSelMoneyAmount.add(Convert.toBigDecimal(store_row.get("order_money_select_items"))); - orderDiscountAmount = orderDiscountAmount.add(Convert.toBigDecimal(store_row.get("order_discount_amount"))); + orderSelFreightAmount = orderSelFreightAmount.add(Convert.toBigDecimal(store_row.get("freight"))); // 重要:订单运费金额 + orderSelMoneyAmount = orderSelMoneyAmount.add(Convert.toBigDecimal(store_row.get("order_money_select_items")));// 重要:订单折后金额(订单金额-折扣金额) + orderDiscountAmount = orderDiscountAmount.add(Convert.toBigDecimal(store_row.get("order_discount_amount"))); // 重要:订单折扣金额 orderSelPointsAmount = orderSelPointsAmount.add(store_points_total); orderSelSpAmount = orderSelSpAmount.add(store_sp_total); orderRebateAmount = orderRebateAmount.add(Convert.toBigDecimal(store_row.get("store_rebate"))); @@ -2469,225 +2470,291 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl items = (List) cart_data.get("items"); - for (Map store_row : items) { - // 不配送区域 - BigDecimal freight = BigDecimal.ZERO; - - if (isgiftbag) { - // 以下是礼包的情况 - Integer cart_quantity = Convert.toInt(activity_rule.get("cart_quantity")); - BigDecimal giftbag_fixed_amount = Convert.toBigDecimal(activity_rule.get("giftbag_fixed_amount")); - BigDecimal giftbag_amount = Convert.toBigDecimal(activity_rule.get("giftbag_amount")); - BigDecimal giftbag_fixed_discount = NumberUtil.div(Convert.toBigDecimal(activity_rule.get("giftbag_fixed_discount")), 10); - - if (Convert.toInt(activity_rule.get("group_discount_type")).intValue() == StateCode.ACTIVITY_GROUPBOOKING_FIXED_AMOUNT) { - //优惠固定金额购买 - store_row.put("order_money_select_items", NumberUtil.mul(giftbag_fixed_amount, cart_quantity)); - } else if (Convert.toInt(activity_rule.get("group_discount_type")).intValue() == StateCode.ACTIVITY_GROUPBOOKING_FIXED_DISCOUNT) { - //以固定折扣购买 - store_row.put("order_money_select_items", NumberUtil.mul(giftbag_amount, giftbag_fixed_discount, cart_quantity)); - } else { - //以固定价格购买 - store_row.put("order_money_select_items", NumberUtil.mul(giftbag_amount, cart_quantity)); - } - } - - // todo 此处免运费,传递的是transport_type设置中的值, 则默认代表为订单了, 未来可以优化。 - BigDecimal post_free_max = BigDecimal.ZERO; - - // 按照店铺订单计算运费 - Integer store_id = Convert.toInt(store_row.get("store_id")); - - //是否启用店铺订单免运费 - boolean ifEnabledFreeFreight = shopStoreConfigService.ifEnabledFreeFreight(store_id); - if (ifEnabledFreeFreight) { - // 免运费 - BigDecimal order_money_select_items = Convert.toBigDecimal(store_row.get("order_money_select_items"), BigDecimal.ZERO); - Map data = transportAmountService.calFreight(store_id, district_id, order_money_select_items, post_free_max); - - boolean type_freight = (boolean) data.get("type_freight"); - post_free_max = Convert.toBigDecimal(data.get("post_free_max")); - BigDecimal _freight = Convert.toBigDecimal(data.get("freight")); - - if (!type_freight) { - // 配送不到这个区域,提示删除商品 - throw new ApiException(I18nUtil._("所选商品有不在配送区域!")); - } else { - freight.add(_freight); - } - } else { - // 判断运费方式,如果发现同一个订单计费模式不一致,报错,禁止下单。 - Map tt_ids = (Map) store_row.get("tt_ids"); - Boolean isOnSale = (Boolean) store_row.get("is_on_sale");//正活动中的商品? - List transport_type_rows = new ArrayList<>(); - Integer transport_type_id; - - // 一般情况下活动商品才会走到这里进行判断 - if (isOnSale != null && !isOnSale) { - throw new ApiException(I18nUtil._("该商品库存不足!")); - } - - if (isgiftbag) { - //礼包不判断运费模式,礼包只有一个运费模板 - transport_type_id = Convert.toInt(activity_rule.get("transport_type_id")); - } else { - if (CollUtil.isNotEmpty(tt_ids)) { - Set tt_id_row = tt_ids.keySet(); - transport_type_rows = transportTypeService.gets(tt_id_row); - - List transport_type_pricing_method = transport_type_rows.stream().map(s -> s.getTransport_type_pricing_method()).distinct().collect(Collectors.toList()); - if (transport_type_pricing_method.size() > 1) { - throw new ApiException(I18nUtil._("所选商品运费模式不统一,请拆分下单!")); - } - } else { - throw new ApiException(I18nUtil._("商品运费设置有误!请联系商家检查商品设置!")); - } - - List transport_type_ids = (List) tt_ids.keySet().stream().collect(Collectors.toList()); - transport_type_id = transport_type_ids.get(0); - } - - Optional transportTypeOpl = transport_type_rows.stream().filter(s -> ObjectUtil.equal(s.getTransport_type_id(), transport_type_id)).findFirst(); - ShopStoreTransportType transportType = transportTypeOpl.orElseGet(ShopStoreTransportType::new); - Integer transport_type_pricing_method = transportType.getTransport_type_pricing_method(); - BigDecimal order_money_select_items = Convert.toBigDecimal(store_row.get("order_money_select_items")); - - //计费规则(ENUM):1-按件数;2-按重量;3-按体积;4-按配送区域计费(猜测不确定); - if (transport_type_pricing_method != null && 4 == transport_type_pricing_method) { - // 按照配送区域计费 - Map data = transportTypeService.calFreight(transport_type_id, district_id, 1, order_money_select_items, post_free_max); - - post_free_max = Convert.toBigDecimal(data.get("post_free_max")); - freight = Convert.toBigDecimal(data.get("freight")); - } else { - if (isgiftbag) { - // 以下是礼包的情况 - Map data = transportTypeService.calFreight(transport_type_id, district_id, Convert.toInt(activity_rule.get("giftbag_quantity")), Convert.toBigDecimal(store_row.get("order_money_select_items")), post_free_max); - boolean type_freight = (boolean) data.get("type_freight"); - - if (!type_freight) { - //配送不到这个区域,提示删除商品 - transport_type_none_ids.add(transport_type_id); - } else { - BigDecimal _freight = Convert.toBigDecimal(data.get("freight")); - freight = NumberUtil.add(freight, _freight); - } - } else { - // 按件计费 - Set _tt_ids = tt_ids.keySet(); - for (Object tt_id : _tt_ids) { - Integer quantity = Convert.toInt(tt_ids.get(tt_id)); - Integer tt_transport_type_id = Convert.toInt(tt_id); - Map data = transportTypeService.calFreight(tt_transport_type_id, district_id, quantity, order_money_select_items, post_free_max); - - boolean type_freight = (boolean) data.get("type_freight"); - BigDecimal _freight = Convert.toBigDecimal(data.get("freight")); - - if (!type_freight) { - // 配送不到这个区域,提示删除商品 - transport_type_none_ids.add(tt_transport_type_id); - } else { - freight = NumberUtil.add(freight, _freight); - } - } - } - - // 配送区域无货设置; - if (CollUtil.isNotEmpty(transport_type_none_ids)) { - List _items = (List) store_row.get("items"); - for (Map item_row : _items) { - Boolean cart_select = Convert.toBool(item_row.get("cart_select")); - Boolean is_on_sale = Convert.toBool(item_row.get("is_on_sale")); - - if (cart_select && is_on_sale) { - // 配送区域 库存问题。 - Integer _transport_type_id = Convert.toInt(item_row.get("transport_type_id")); - boolean show_oos = transport_type_none_ids.contains(_transport_type_id); - item_row.put("show_oos", show_oos); - - delivery_item_none_row.add(item_row); - - // 礼品 - List pulse_gift_carts = (List) item_row.get("pulse_gift_cart"); - if (CollUtil.isNotEmpty(pulse_gift_carts)) { - for (Map pulse_gift_cart : pulse_gift_carts) { - // 配送区域 库存问题。 - Integer cart_transport_type_id = Convert.toInt(pulse_gift_cart.get("transport_type_id")); - boolean _show_oos = transport_type_none_ids.contains(cart_transport_type_id); - pulse_gift_cart.put("show_oos", _show_oos); - - delivery_item_none_row.add(pulse_gift_cart); - } - } - } - - // 单品加价购 - List pulse_bargains_carts = (List) item_row.get("pulse_bargains_cart"); - if (CollUtil.isNotEmpty(pulse_bargains_carts)) { - for (Map pulse_bargains_cart : pulse_bargains_carts) { - BigDecimal item_sale_price = Convert.toBigDecimal(pulse_bargains_cart.get("item_sale_price")); - BigDecimal cart_quantity = Convert.toBigDecimal(pulse_bargains_cart.get("cart_quantity")); - - if (cart_select && is_on_sale) { - Boolean pulse_cart_select = Convert.toBool(pulse_bargains_cart.get("cart_select")); - Boolean pulse_is_on_sale = Convert.toBool(pulse_bargains_cart.get("is_on_sale")); - if (pulse_cart_select && pulse_is_on_sale) { - pulse_bargains_cart.put("subtotal", NumberUtil.mul(item_sale_price, cart_quantity)); - } else { - pulse_bargains_cart.put("subtotal", BigDecimal.ZERO); - } - - Integer _transport_type_id = Convert.toInt(pulse_bargains_cart.get("transport_type_id")); - boolean show_oos = transport_type_none_ids.contains(_transport_type_id); - pulse_bargains_cart.put("show_oos", show_oos); - delivery_item_none_row.add(pulse_bargains_cart); - } - } - } - } - } - } - } - - if (CheckUtil.isEmpty(freight)) { - // 免运费 - store_row.put("postFree", true); // 是否免运费 - } else { - // 不免运费 - store_row.put("postFree", false); // 是否免运费 - - BigDecimal order_money_select_items = Convert.toBigDecimal(store_row.get("order_money_select_items")); - // 选中商品金额 - 免除运费金额 - store_row.put("postFreeBalance", NumberUtil.sub(order_money_select_items, post_free_max).abs()); - } - - store_row.put("freight", freight); // 运费 - - BigDecimal orderSelFreightAmount = Convert.toBigDecimal(cart_data.get("orderSelFreightAmount")); - cart_data.put("orderSelFreightAmount", NumberUtil.add(orderSelFreightAmount, freight)); - - BigDecimal orderSelMoneyAmount = Convert.toBigDecimal(cart_data.get("orderSelMoneyAmount")); - cart_data.put("orderSelMoneyAmount", NumberUtil.add(orderSelMoneyAmount, freight)); + if(cart_data==null || district_id==null){ + throw new ApiException(I18nUtil._("参数有误!")); } - cart_data.put("can_delivery", transport_type_none_ids.size() == 0); + // 配送方式 5-门店自取;10-普通快递;16-同城配送; + Integer delivery_type_id = Convert.toInt(cart_data.get("delivery_type_id"), StateCode.DELIVERY_TYPE_SAME_CITY); + // 同城配送运费计算分支 + if (delivery_type_id == StateCode.DELIVERY_TYPE_SAME_CITY) { + // 配送不到这个区域商品id + cart_data.put("transport_type_none_ids", new ArrayList()); + // 配送不到这个区域商品记录 + cart_data.put("delivery_item_none_row", new ArrayList()); + + //16-同城配送; + BigDecimal orderSelProductAmount = Convert.toBigDecimal(cart_data.get("orderSelProductAmount"), BigDecimal.ZERO); //商品订单原价 + BigDecimal orderSelFreightAmount = Convert.toBigDecimal(cart_data.get("orderSelFreightAmount"), BigDecimal.ZERO);//选中商品运费金额(仅运费) + BigDecimal orderSelMoneyAmount = Convert.toBigDecimal(cart_data.get("orderSelMoneyAmount"), BigDecimal.ZERO);//选中商品最终应付金额 +// BigDecimal orderDiscountAmount = Convert.toBigDecimal(cart_data.get("orderDiscountAmount"), BigDecimal.ZERO);//商品订单折扣优惠金额 +// BigDecimal orderSelPointsAmount = Convert.toBigDecimal(cart_data.get("orderSelPointsAmount"), BigDecimal.ZERO);//商品订单积分抵扣金额 +// BigDecimal orderSelSpAmount = Convert.toBigDecimal(cart_data.get("orderSelSpAmount"), BigDecimal.ZERO);//可能是:商品订单促销金额 +// BigDecimal orderRebateAmount = Convert.toBigDecimal(cart_data.get("order_rebate_amount"), BigDecimal.ZERO);//可能是:商品订单返利金额 + + // items:一个或多个店铺的订单 + List items = (List) cart_data.get("items"); + for (Map store_row : items) { + // 一个店铺的订单 + Long storeId = Convert.toLong(store_row.get("store_id")); + BigDecimal storeLng = Convert.toBigDecimal(store_row.get("store_longitude")); + BigDecimal storeLat = Convert.toBigDecimal(store_row.get("store_latitude")); + // 订单商品原价金额 + BigDecimal productMoneyOriginGoods = Convert.toBigDecimal(store_row.get("productMoneyOriginGoods")); + // 订单折扣后金额 + BigDecimal orderSelDiscountAmount = Convert.toBigDecimal(store_row.get("productMoneySelGoods")); + // 订单最终应付金额 + BigDecimal orderPaymentAmount = Convert.toBigDecimal(store_row.get("productMoneySelGoods")); + + // 同城配送运费检查和计算 + Pair pair = shopStoreSameCityTransportBaseService.computeSameCityTransportFee(storeId,storeLng,storeLat,0,productMoneyOriginGoods,orderSelDiscountAmount,orderPaymentAmount); + + Boolean postFree = pair.getFirst(); + store_row.put("postFree", postFree); // 是否免运费 + store_row.put("freight", pair.getSecond()); // 运费金额 + store_row.put("postFreeBalance", 0); // 还需postFreeBalance元即可免邮费 + + // 关键订单金额数据 + orderSelFreightAmount = orderSelFreightAmount.add(Convert.toBigDecimal(pair.getSecond())); // 重要:订单运费金额 + if(postFree) { + orderSelMoneyAmount = orderSelMoneyAmount.add(Convert.toBigDecimal(store_row.get("order_money_select_items")));// 重要:订单折后金额(订单金额-折扣金额) + } + } + + cart_data.put("orderSelFreightAmount", orderSelFreightAmount); + cart_data.put("orderSelMoneyAmount", orderSelMoneyAmount); + + + + } else { + // 普通快递运费计算和门店自取分支 + + // 配送不到这个区域商品id + List transport_type_none_ids = new ArrayList(); + // 配送不到这个区域商品记录 + List delivery_item_none_row = new ArrayList(); + + // 配送不到这个区域商品id + cart_data.put("transport_type_none_ids", transport_type_none_ids); + // 配送不到这个区域商品记录 + cart_data.put("delivery_item_none_row", delivery_item_none_row); + + //判断是不是礼包 + boolean isgiftbag = false; + Map activity_rule = new HashMap(); + + // 活动可能影响,重新计算价格 + List items = (List) cart_data.get("items"); + for (Map store_row : items) { + BigDecimal freight = BigDecimal.ZERO; + + if (isgiftbag) { + // 以下是礼包的情况 + Integer cart_quantity = Convert.toInt(activity_rule.get("cart_quantity")); + BigDecimal giftbag_fixed_amount = Convert.toBigDecimal(activity_rule.get("giftbag_fixed_amount")); + BigDecimal giftbag_amount = Convert.toBigDecimal(activity_rule.get("giftbag_amount")); + BigDecimal giftbag_fixed_discount = NumberUtil.div(Convert.toBigDecimal(activity_rule.get("giftbag_fixed_discount")), 10); + + if (Convert.toInt(activity_rule.get("group_discount_type")).intValue() == StateCode.ACTIVITY_GROUPBOOKING_FIXED_AMOUNT) { + //优惠固定金额购买 + store_row.put("order_money_select_items", NumberUtil.mul(giftbag_fixed_amount, cart_quantity)); + } else if (Convert.toInt(activity_rule.get("group_discount_type")).intValue() == StateCode.ACTIVITY_GROUPBOOKING_FIXED_DISCOUNT) { + //以固定折扣购买 + store_row.put("order_money_select_items", NumberUtil.mul(giftbag_amount, giftbag_fixed_discount, cart_quantity)); + } else { + //以固定价格购买 + store_row.put("order_money_select_items", NumberUtil.mul(giftbag_amount, cart_quantity)); + } + } + + // todo 此处免运费,传递的是transport_type设置中的值, 则默认代表为订单了, 未来可以优化。 + // 可免最大运费金额 + BigDecimal post_free_max = BigDecimal.ZERO; + + // 按照店铺订单计算运费 + Integer store_id = Convert.toInt(store_row.get("store_id")); + + //是否启用店铺订单免运费 + boolean ifEnabledFreeFreight = shopStoreConfigService.ifEnabledFreeFreight(store_id); + if (ifEnabledFreeFreight) { + // 免运费 + BigDecimal order_money_select_items = Convert.toBigDecimal(store_row.get("order_money_select_items"), BigDecimal.ZERO); + Map data = transportAmountService.calFreight(store_id, district_id, order_money_select_items, post_free_max); + + boolean type_freight = (boolean) data.get("type_freight"); + post_free_max = Convert.toBigDecimal(data.get("post_free_max")); + BigDecimal _freight = Convert.toBigDecimal(data.get("freight")); + + if (!type_freight) { + // 配送不到这个区域,提示删除商品 + throw new ApiException(I18nUtil._("所选商品有不在配送区域!")); + } else { + freight.add(_freight); + } + } else { + // 判断运费方式,如果发现同一个订单计费模式不一致,报错,禁止下单。 + Map tt_ids = (Map) store_row.get("tt_ids"); + Boolean isOnSale = (Boolean) store_row.get("is_on_sale");//搞活动中的商品? + List transport_type_rows = new ArrayList<>(); + Integer transport_type_id; + + // 一般情况下活动商品才会走到这里进行判断 + if (isOnSale != null && !isOnSale) { + throw new ApiException(I18nUtil._("该商品库存不足!")); + } + + if (isgiftbag) { + //礼包不判断运费模式,礼包只有一个运费模板 + transport_type_id = Convert.toInt(activity_rule.get("transport_type_id")); + } else { + if (CollUtil.isNotEmpty(tt_ids)) { + Set tt_id_row = tt_ids.keySet(); + transport_type_rows = shopStoreTransportTypeService.gets(tt_id_row); + + List transport_type_pricing_method = transport_type_rows.stream().map(s -> s.getTransport_type_pricing_method()).distinct().collect(Collectors.toList()); + if (transport_type_pricing_method.size() > 1) { + throw new ApiException(I18nUtil._("所选商品运费模式不统一,请拆分下单!")); + } + } else { + throw new ApiException(I18nUtil._("商品运费设置有误!请联系商家检查商品设置!")); + } + + List transport_type_ids = (List) tt_ids.keySet().stream().collect(Collectors.toList()); + transport_type_id = transport_type_ids.get(0); + } + + Optional transportTypeOpl = transport_type_rows.stream().filter(s -> ObjectUtil.equal(s.getTransport_type_id(), transport_type_id)).findFirst(); + ShopStoreTransportType transportType = transportTypeOpl.orElseGet(ShopStoreTransportType::new); + Integer transport_type_pricing_method = transportType.getTransport_type_pricing_method(); + BigDecimal order_money_select_items = Convert.toBigDecimal(store_row.get("order_money_select_items")); + + //计费规则(ENUM):1-按件数;2-按重量;3-按体积;4-按配送区域计费(猜测不确定); + if (transport_type_pricing_method != null && 4 == transport_type_pricing_method) { + // 按照配送区域计费 + Map data = shopStoreTransportTypeService.calFreight(transport_type_id, district_id, 1, order_money_select_items, post_free_max); + + // 可免最大运费金额 + post_free_max = Convert.toBigDecimal(data.get("post_free_max")); + freight = Convert.toBigDecimal(data.get("freight")); + } else { + if (isgiftbag) { + // 以下是礼包的情况 + + // 运费计算, 如果一个订单,都多个货物,则计算方式为:以最大基础运费为基础 + 每个商品递增部分。 + Map data = shopStoreTransportTypeService.calFreight(transport_type_id, district_id, Convert.toInt(activity_rule.get("giftbag_quantity")), Convert.toBigDecimal(store_row.get("order_money_select_items")), post_free_max); + + // 是否可配送 + boolean type_freight = (boolean) data.get("type_freight"); + + if (!type_freight) { + //配送不到这个区域,提示删除商品 + transport_type_none_ids.add(transport_type_id); + } else { + BigDecimal _freight = Convert.toBigDecimal(data.get("freight")); + freight = NumberUtil.add(freight, _freight); + } + } else { + // 按件计费 + Set _tt_ids = tt_ids.keySet(); + for (Object tt_id : _tt_ids) { + Integer quantity = Convert.toInt(tt_ids.get(tt_id)); + Integer tt_transport_type_id = Convert.toInt(tt_id); + Map data = shopStoreTransportTypeService.calFreight(tt_transport_type_id, district_id, quantity, order_money_select_items, post_free_max); + + boolean type_freight = (boolean) data.get("type_freight"); + BigDecimal _freight = Convert.toBigDecimal(data.get("freight")); + + if (!type_freight) { + // 配送不到这个区域,提示删除商品 + transport_type_none_ids.add(tt_transport_type_id); + } else { + freight = NumberUtil.add(freight, _freight); + } + } + } + + // 配送区域无货设置; + if (CollUtil.isNotEmpty(transport_type_none_ids)) { + List _items = (List) store_row.get("items"); + for (Map item_row : _items) { + Boolean cart_select = Convert.toBool(item_row.get("cart_select")); + Boolean is_on_sale = Convert.toBool(item_row.get("is_on_sale")); + + if (cart_select && is_on_sale) { + // 配送区域 库存问题。 + Integer _transport_type_id = Convert.toInt(item_row.get("transport_type_id")); + boolean show_oos = transport_type_none_ids.contains(_transport_type_id); + item_row.put("show_oos", show_oos); + + delivery_item_none_row.add(item_row); + + // 礼品 + List pulse_gift_carts = (List) item_row.get("pulse_gift_cart"); + if (CollUtil.isNotEmpty(pulse_gift_carts)) { + for (Map pulse_gift_cart : pulse_gift_carts) { + // 配送区域 库存问题。 + Integer cart_transport_type_id = Convert.toInt(pulse_gift_cart.get("transport_type_id")); + boolean _show_oos = transport_type_none_ids.contains(cart_transport_type_id); + pulse_gift_cart.put("show_oos", _show_oos); + + delivery_item_none_row.add(pulse_gift_cart); + } + } + } + + // 单品加价购 + List pulse_bargains_carts = (List) item_row.get("pulse_bargains_cart"); + if (CollUtil.isNotEmpty(pulse_bargains_carts)) { + for (Map pulse_bargains_cart : pulse_bargains_carts) { + BigDecimal item_sale_price = Convert.toBigDecimal(pulse_bargains_cart.get("item_sale_price")); + BigDecimal cart_quantity = Convert.toBigDecimal(pulse_bargains_cart.get("cart_quantity")); + + if (cart_select && is_on_sale) { + Boolean pulse_cart_select = Convert.toBool(pulse_bargains_cart.get("cart_select")); + Boolean pulse_is_on_sale = Convert.toBool(pulse_bargains_cart.get("is_on_sale")); + if (pulse_cart_select && pulse_is_on_sale) { + pulse_bargains_cart.put("subtotal", NumberUtil.mul(item_sale_price, cart_quantity)); + } else { + pulse_bargains_cart.put("subtotal", BigDecimal.ZERO); + } + + Integer _transport_type_id = Convert.toInt(pulse_bargains_cart.get("transport_type_id")); + boolean show_oos = transport_type_none_ids.contains(_transport_type_id); + pulse_bargains_cart.put("show_oos", show_oos); + delivery_item_none_row.add(pulse_bargains_cart); + } + } + } + } + } + } + } + + if (CheckUtil.isEmpty(freight)) { + // 免运费 + store_row.put("postFree", true); // 全免运费 + } else { + // 不免运费 + store_row.put("postFree", false); // 不是全免运费 + + BigDecimal order_money_select_items = Convert.toBigDecimal(store_row.get("order_money_select_items")); + // 选中商品金额 - 免除运费金额 + store_row.put("postFreeBalance", NumberUtil.sub(order_money_select_items, post_free_max).abs()); // 计算绝对值,运费大于商品价格的时候,有问题吧? + } + + store_row.put("freight", freight); // 运费 + + BigDecimal orderSelFreightAmount = Convert.toBigDecimal(cart_data.get("orderSelFreightAmount")); + // 订单运费总额(仅运费) + cart_data.put("orderSelFreightAmount", NumberUtil.add(orderSelFreightAmount, freight)); + + // 应支付金额 + BigDecimal orderSelMoneyAmount = Convert.toBigDecimal(cart_data.get("orderSelMoneyAmount")); + cart_data.put("orderSelMoneyAmount", NumberUtil.add(orderSelMoneyAmount, freight)); + } + + cart_data.put("can_delivery", transport_type_none_ids.size() == 0); + } } /** diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index 2b68e0fc..5a8954d6 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -6,7 +6,7 @@ spring: mvc: static-path-pattern: /shop/static/** datasource: - url: jdbc:mysql://@mysql.host@:@mysql.port@/@mysql.db@?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&&zeroDateTimeBehavior=convertToNull + url: jdbc:mysql://@mysql.host@:@mysql.port@/@mysql.db@?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&maxReconnects=5 username: @mysql.user@ password: @mysql.pwd@ driver-class-name: @mysql.driver@