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] : "";
+ }
+
+
}