From 36c10c53dbcdf751c22c23001acaa40aa6129654 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Fri, 26 Sep 2025 08:58:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E6=88=B7=E5=85=A5=E9=A9=BB=E5=90=8E?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=AE=BE=E7=BD=AE=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=EF=BC=9A=E8=87=AA=E5=8A=A8=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E4=BD=99=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AccountBaseConfigService.java | 15 ++ .../base/service/ShopBaseDistrictService.java | 29 +++ .../impl/AccountBaseConfigServiceImpl.java | 39 ++++ .../impl/ShopBaseDistrictServiceImpl.java | 202 ++++++++++++++++++ .../service/impl/ShopUserCartServiceImpl.java | 14 +- .../shop/MallProductApplicationTests.java | 38 ---- 6 files changed, 298 insertions(+), 39 deletions(-) delete mode 100644 mall-shop/src/test/java/com/suisung/mall/shop/MallProductApplicationTests.java diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/AccountBaseConfigService.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/AccountBaseConfigService.java index d3997e94..9256981d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/AccountBaseConfigService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/AccountBaseConfigService.java @@ -50,4 +50,19 @@ public interface AccountBaseConfigService extends IBaseService configs); boolean saveOrUpdate(AccountBaseConfig config); + + /** + * 获取系统配置 + * + * @param configKey + * @return + */ + String getSystemConfig(String configKey); + + /** + * 获取平台内部最低配送费,单位(分) + * + * @return + */ + Integer getInnerMinDeliveryFee(); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseDistrictService.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseDistrictService.java index ce71b5fc..970c54d7 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseDistrictService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseDistrictService.java @@ -56,4 +56,33 @@ public interface ShopBaseDistrictService extends IBaseService */ String joinDistrict(List list, Integer joinKey, Boolean hasSeparator, String separator); + + /** + * 省市区ID路径和名称路径相互转换 + * 支持根据ID路径获取名称路径,或根据名称路径获取ID路径 + * + * @param areaIds 省市区ID路径,格式如:"450000/450800/450881" + * @param areaNames 省市区名称路径,格式如:"广西壮族自治区/贵港市/桂平市" + * @return String数组,第一个元素为处理后的ID路径,第二个元素为处理后的名称路径 + */ + String[] convertDistrictPath(String areaIds, String areaNames); + + /** + * 根据省市区ID路径获取对应的名称路径 + * 例如:450000/450800/450881 -> 广西壮族自治区/贵港市/桂平市 + * + * @param districtIdPath 省市区ID路径,格式如:"450000/450800/450881" + * @return 省市区名称路径,格式如:"广西壮族自治区/贵港市/桂平市" + */ + String getDistrictNamePathByIdPath(String districtIdPath); + + /** + * 根据省市区名称路径获取对应的ID路径 + * 例如:广西壮族自治区/贵港市/桂平市 -> 450000/450800/450881 + * + * @param districtNamePath 省市区名称路径,格式如:"省/市/区" + * @return 省市区ID路径,格式如:"450000/450800/450881" + */ + String getDistrictIdPathByNamePath(String districtNamePath); + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/AccountBaseConfigServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/AccountBaseConfigServiceImpl.java index d97b023d..f6c98682 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/AccountBaseConfigServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/AccountBaseConfigServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.constant.ConfigConstant; import com.suisung.mall.common.constant.RedisConstant; import com.suisung.mall.common.exception.ApiException; @@ -341,6 +342,44 @@ public class AccountBaseConfigServiceImpl extends BaseServiceImpl + * 根据配置键获取对应的配置值,如果配置值为空则返回空字符串。 + *

+ * + * @param configKey 配置键 + * @return 配置值,如果找不到或为空则返回空字符串 + */ + @Override + public String getSystemConfig(String configKey) { + // 参数校验 + if (StrUtil.isBlank(configKey)) { + log.warn("[系统配置] 参数校验失败:配置键不能为空"); + return ""; + } + + try { + String configValue = accountService.getAccountBaseConfigValue(configKey); + return StrUtil.blankToDefault(configValue, "0"); + } catch (Exception e) { + log.error("[系统配置] 获取配置值异常,configKey={}", configKey, e); + return ""; + } + } + + /** + * 获取平台内部最低配送费,单位(分) + * + * @return + */ + @Override + public Integer getInnerMinDeliveryFee() { + String v = getSystemConfig(CommonConstant.Inner_Min_DeliveryFee_Key); + return NumberUtil.isNumber(v) ? Convert.toInt(v) : 0; + } + + @Override @Async public void run(String... args) throws Exception { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseDistrictServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseDistrictServiceImpl.java index 833187ae..e484a094 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseDistrictServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseDistrictServiceImpl.java @@ -13,6 +13,7 @@ import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.base.mapper.ShopBaseDistrictMapper; import com.suisung.mall.shop.base.service.AccountBaseConfigService; import com.suisung.mall.shop.base.service.ShopBaseDistrictService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; @@ -30,6 +31,7 @@ import java.util.*; * @author Xinze * @since 2021-06-28 */ +@Slf4j @Service public class ShopBaseDistrictServiceImpl extends BaseServiceImpl implements ShopBaseDistrictService { @@ -339,4 +341,204 @@ public class ShopBaseDistrictServiceImpl extends BaseServiceImpl 广西壮族自治区/贵港市/桂平市 + * + * @param districtIdPath 省市区ID路径,格式如:"450000/450800/450881" + * @return 省市区名称路径,格式如:"广西壮族自治区/贵港市/桂平市" + */ + @Override + public String getDistrictNamePathByIdPath(String districtIdPath) { + if (StrUtil.isBlank(districtIdPath)) { + return ""; + } + + String[] idStrs = districtIdPath.split("/"); + List names = new ArrayList<>(idStrs.length); + List districts = new ArrayList<>(idStrs.length); + + // 先获取所有地区对象 + for (String idStr : idStrs) { + Integer districtId = Convert.toInt(idStr); + if (districtId == null) { + log.warn("[地区转换] ID格式不正确: {}", idStr); + return ""; + } + + ShopBaseDistrict district = get(districtId); + if (district == null) { + log.warn("[地区转换] 未找到对应地区信息, districtId: {}", districtId); + return ""; + } + + districts.add(district); + } + + // 按照层级关系重新排序 + List sortedDistricts = sortDistrictsByHierarchy(districts); + + // 提取名称 + for (ShopBaseDistrict district : sortedDistricts) { + names.add(district.getDistrict_name()); + } + + return String.join("/", names); + } + + /** + * 根据省市区名称路径获取对应的ID路径 + * 例如:广西壮族自治区/贵港市/桂平市 -> 450000/450800/450881 + * + * @param districtNamePath 省市区名称路径,格式如:"省/市/区" + * @return 省市区ID路径,格式如:"450000/450800/450881" + */ + @Override + public String getDistrictIdPathByNamePath(String districtNamePath) { + if (StrUtil.isBlank(districtNamePath)) { + return ""; + } + + String[] names = districtNamePath.split("/"); + List districts = new ArrayList<>(names.length); + + // 先根据名称获取所有地区对象(不考虑顺序) + for (String name : names) { + if (StrUtil.isBlank(name)) { + log.warn("[地区转换] 名称不能为空"); + return ""; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("district_name", name.trim()); + + ShopBaseDistrict district = findOne(queryWrapper); + if (district == null) { + log.warn("[地区转换] 未找到对应地区信息, name: {}", name); + return ""; + } + + districts.add(district); + } + + // 按照层级关系重新排序 + List sortedDistricts = sortDistrictsByHierarchy(districts); + + // 提取ID + List ids = new ArrayList<>(sortedDistricts.size()); + for (ShopBaseDistrict district : sortedDistricts) { + ids.add(district.getDistrict_id().toString()); + } + + return String.join("/", ids); + } + + /** + * 根据层级关系对地区进行排序 + * + * @param districts 地区列表 + * @return 按层级排序后的地区列表 + */ + private List sortDistrictsByHierarchy(List districts) { + if (districts.size() <= 1) { + return districts; + } + + // 构建ID到地区的映射 + Map districtMap = new HashMap<>(); + for (ShopBaseDistrict district : districts) { + districtMap.put(district.getDistrict_id(), district); + } + + // 构建层级关系 + List result = new ArrayList<>(districts.size()); + Set processedIds = new HashSet<>(); + + // 找到最顶级的地区(parent_id为0或者parent不在列表中的) + for (ShopBaseDistrict district : districts) { + if (district.getDistrict_parent_id() == 0 || !districtMap.containsKey(district.getDistrict_parent_id())) { + result.add(district); + processedIds.add(district.getDistrict_id()); + break; + } + } + + // 逐级查找子地区 + while (result.size() < districts.size()) { + ShopBaseDistrict lastDistrict = result.get(result.size() - 1); + boolean found = false; + + for (ShopBaseDistrict district : districts) { + if (!processedIds.contains(district.getDistrict_id()) && + district.getDistrict_parent_id().equals(lastDistrict.getDistrict_id())) { + result.add(district); + processedIds.add(district.getDistrict_id()); + found = true; + break; + } + } + + // 如果找不到下一级,则添加剩余未处理的地区 + if (!found) { + for (ShopBaseDistrict district : districts) { + if (!processedIds.contains(district.getDistrict_id())) { + result.add(district); + processedIds.add(district.getDistrict_id()); + } + } + break; + } + } + + return result; + } + + } 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 4b38b8c0..2de90dc0 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 @@ -2653,12 +2653,24 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl