diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java index e6aa08c7..56d8325c 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java @@ -1,5 +1,6 @@ package com.suisung.mall.common.utils; +import cn.hutool.core.util.StrUtil; import com.suisung.mall.common.pojo.to.AddressParseResultTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -100,6 +101,29 @@ public class AddressUtil { return ""; } + /** + * 分解地址字符串,支持ID和名称两种格式 + * + * @param input 输入字符串,格式如:"450000/450800/450881" 或 "广西壮族自治区/贵港市/桂平市" + * @return 包含三个元素的数组,不足三个的部分用空字符串填充 + */ + public static String[] parseAreas2Arr(String input) { + if (StrUtil.isBlank(input)) { + return new String[]{"", "", ""}; + } + + String[] parts = input.split("/"); + String[] result = {"", "", ""}; // 默认填充空字符串 + + // 将分割后的部分填入结果数组,最多填3个 + for (int i = 0; i < Math.min(parts.length, 3); i++) { + result[i] = parts[i].trim(); // 去除前后空白字符 + } + + return result; + } + + /** * 使用示例: *

diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSfSupplierAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSfSupplierAdminController.java new file mode 100644 index 00000000..ef212dba --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSfSupplierAdminController.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.shop.store.controller.admin; + +import cn.hutool.json.JSONObject; +import com.suisung.mall.common.api.CommonResult; +import com.suisung.mall.common.service.impl.BaseControllerImpl; +import com.suisung.mall.shop.store.service.ShopStoreSfSupplierService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Slf4j +@Api(tags = "顺丰商家平台控制器") +@RestController +@RequestMapping("/admin/shop/store/sf-supplier") +public class ShopStoreSfSupplierAdminController extends BaseControllerImpl { + + @Resource + private ShopStoreSfSupplierService shopStoreSfSupplierService; + + /** + * 商家申请入驻商城平台 + * + * @param jsonParam + * @return + */ + @ApiOperation(value = "后台-检测是否可重新生成sf店铺ID", notes = "检测是否可重新生成sf店铺ID") + @RequestMapping(value = "/check-recreate-shopid", method = RequestMethod.POST) + public CommonResult checkReCreateSfShopId(@RequestBody JSONObject jsonParam) { + return shopStoreSfSupplierService.checkReCreateSfShopId(jsonParam.getInt("store_id")); + } + + @ApiOperation(value = "后台-重新生成sf店铺ID", notes = "后台-重新生成sf店铺ID") + @RequestMapping(value = "/recreate-shopid", method = RequestMethod.POST) + public CommonResult reCreateSfShopId(@RequestBody JSONObject jsonParam) { + return shopStoreSfSupplierService.reCreateSfShopId(jsonParam.getInt("store_id"), jsonParam.getStr("supplier_id")); + } + +} 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 927bf4b1..11434f31 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 @@ -75,7 +75,16 @@ public interface ShopStoreSameCityTransportBaseService { */ Pair saveOrUpdateShopStoreSameCityTransportBase(ShopStoreSameCityTransportBase shopStoreSameCityTransportBase); - + /** + * 更新顺丰信息 + * + * @param storeId + * @param sfSupplierI + * @param sfShopIdd + * @return + */ + Boolean updateSfInfoByStoreId(Integer storeId, String sfSupplierI, String sfShopIdd); + /** * 初始化默认的同城配送基础运费信息 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java index f5f65fe1..bef03fee 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java @@ -55,5 +55,13 @@ public interface ShopStoreSfOrderService extends IBaseService * @return */ Boolean exists(Integer devId, String shopOrderId); + + /** + * 检查顺丰同城开发者id下,某个订单是否已经存在 + * + * @param sfShopId + * @return + */ + Boolean existsBySfShopId(String sfShopId); } 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 886e3d60..cce3cc5f 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 @@ -16,6 +16,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.ResultCode; import com.suisung.mall.common.constant.CommonConstant; @@ -506,6 +507,28 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(ShopStoreSameCityTransportBase::getStore_id, storeId); + updateWrapper.eq(ShopStoreSameCityTransportBase::getSupplier_id, sfSupplierId); + updateWrapper.eq(ShopStoreSameCityTransportBase::getShop_id, sfShopId); + + return update(updateWrapper); + } + /** * 初始化默认的同城配送基础运费信息 @@ -680,7 +703,6 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(storeId); List transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportListByTransportBaseId(transportBase.getTransport_base_id()); if (CollUtil.isEmpty(transportList)) { // 没有配送范围和起配金额规则的时候,直接以基础配送费来配送 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java index 8929021d..5be69db9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java @@ -9,6 +9,7 @@ package com.suisung.mall.shop.store.service.impl; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.suisung.mall.common.modules.store.ShopStoreSfOrder; @@ -217,4 +218,17 @@ public class ShopStoreSfOrderServiceImpl extends BaseServiceImpl 0; } + + /** + * 检查顺丰同城开发者id下,某个订单是否已经存在 + * + * @param sfShopId + * @return + */ + @Override + public Boolean existsBySfShopId(String sfShopId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ShopStoreSfOrder::getShop_id, sfShopId); + return count(wrapper) > 0; + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfSupplierServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfSupplierServiceImpl.java index c17095a9..108a58f3 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfSupplierServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfSupplierServiceImpl.java @@ -13,11 +13,12 @@ import com.suisung.mall.common.utils.AddressUtil; import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; -import com.suisung.mall.shop.store.mapper.ShopStoreSameCityTransportBaseMapper; import com.suisung.mall.shop.store.mapper.ShopStoreSfSupplierMapper; import com.suisung.mall.shop.store.service.ShopMchEntryService; import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; +import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; import com.suisung.mall.shop.store.service.ShopStoreSfSupplierService; +import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Lazy; @@ -36,9 +37,6 @@ public class ShopStoreSfSupplierServiceImpl extends BaseServiceImpl= 3 ? areaNames[2] : - areaNames.length > 0 ? areaNames[areaNames.length - 1] : cityName; - } else if (addressParseResultTO != null && StrUtil.isNotBlank(addressParseResultTO.getCity())) { - cityName = addressParseResultTO.getCity(); - } + // 调用顺丰API创建店铺 + Pair result = sFExpressApiService.createSfExpressShopInner(storeId, sfSupplierId, + shopMchEntry.getStore_name(), cityName, shopAddress, shopMchEntry.getContact_name(), + shopMchEntry.getLogin_mobile(), shopMchEntry.getStore_longitude(), shopMchEntry.getStore_latitude()); - if (StrUtil.isBlank(cityName)) { - cityName = "桂平市"; - logger.warn("[顺丰] 城市名为空,使用默认城市: {}", cityName); - } else { - logger.debug("[顺丰] 解析得到城市名: {}", cityName); - } - - - Pair result = sFExpressApiService.createSfExpressShopInner(storeId, sfSupplierId, shopMchEntry.getStore_name(), - cityName, shopAddress, shopMchEntry.getContact_name(), shopMchEntry.getLogin_mobile(), - shopMchEntry.getStore_longitude(), shopMchEntry.getStore_latitude()); if (Boolean.FALSE.equals(result.getFirst())) { return CommonResult.failed(result.getSecond()); } - // 更改店铺sf店铺ID - sameCityTransportBase.setSupplier_id(sfSupplierId); - sameCityTransportBase.setShop_id(result.getSecond()); - shopStoreSameCityTransportBaseMapper.updateById(sameCityTransportBase); + // 更新店铺信息 + shopStoreSameCityTransportBaseService.updateSfInfoByStoreId(storeId, sfSupplierId, result.getSecond()); + // 保存或更新顺丰供应商信息 ShopStoreSfSupplier record = new ShopStoreSfSupplier(); + record.setProvince_id(getArrayElement(areaIds, 0)); + record.setCity_id(getArrayElement(areaIds, 1)); + record.setDistrict_id(getArrayElement(areaIds, 2)); + + record.setProvince_name(getArrayElement(areaNames, 0)); + record.setCity_name(getArrayElement(areaNames, 1)); + record.setDistrict_name(getArrayElement(areaNames, 2)); record.setSupplier_id(sfSupplierId); addOrUpdate(record); @@ -190,4 +239,48 @@ public class ShopStoreSfSupplierServiceImpl extends BaseServiceImpl= 3) { + cityName = areaNames[2]; + } else if (areaNames.length > 0) { + cityName = areaNames[areaNames.length - 1]; + } + } else if (addressParseResultTO != null && StrUtil.isNotBlank(addressParseResultTO.getCity())) { + cityName = addressParseResultTO.getCity(); + } + + if (StrUtil.isBlank(cityName)) { + cityName = defaultCity; + logger.warn("[顺丰] 城市名为空,使用默认城市: {}", cityName); + } else { + logger.debug("[顺丰] 解析得到城市名: {}", cityName); + } + + return cityName; + } + + /** + * 安全获取数组元素 + * + * @param array 数组 + * @param index 索引 + * @return 元素值,如果索引超出范围则返回null + */ + private String getArrayElement(String[] array, int index) { + return array != null && array.length > index ? array[index] : ""; + } + + }