diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index d322f3ac..0e123214 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -67,6 +67,14 @@ public class CommonConstant { public static final Integer CONTRACT_SIGN_STA_REJECT = 7; + // 配送品牌:1-顺丰同城;2-美团配送;3-达达快送;4-京东秒送;5-闪送;6-UU跑腿; + public static final Integer DELIVERY_BRAND_SF = 1; + public static final Integer DELIVERY_BRAND_MT = 2; + public static final Integer DELIVERY_BRAND_DD = 3; + public static final Integer DELIVERY_BRAND_JDMS = 4; + public static final Integer DELIVERY_BRAND_SS = 5; + public static final Integer DELIVERY_BRAND_UUPT = 6; + /** * 推送消息类别:Contract-商家入驻合同;orderList-商家订单列表;orderDetail-商家订单详情 * * mchContract-商家入驻合同; @@ -83,5 +91,5 @@ public class CommonConstant { public static final String PUSH_MSG_CATE_MCH_RETURN_ORDER_LIST = "mchRetrunOrderList"; public static final String CONF_KEY_SAME_CITY_ORDER_EXPIRE_SECONDS = "sameCityOrderExpireSeconds"; - + } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreSameCityTransportBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreSameCityTransportBase.java index 50857c78..4764f276 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreSameCityTransportBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreSameCityTransportBase.java @@ -46,7 +46,7 @@ public class ShopStoreSameCityTransportBase implements Serializable { @ApiModelProperty(value = "店铺ID") private Long store_id; - @ApiModelProperty(value = "顺丰同城店铺ID") + @ApiModelProperty(value = "顺丰同城(第三方)店铺ID") private String shop_id; @ApiModelProperty(value = "店铺主营商品分类ID") @@ -88,6 +88,15 @@ public class ShopStoreSameCityTransportBase implements Serializable { @ApiModelProperty(value = "重量每增加n公斤的配送费增加(元)") private BigDecimal weight_increase_fee; + @ApiModelProperty(value = "第三方店铺(审核)状态:1-已审核;2-未审核;") + private Integer shop_state; + + @ApiModelProperty(value = "配送品牌:1-顺丰同城;2-美团配送;3-达达快送;4-京东秒送;5-闪送;6-UU跑腿;") + private Integer delivery_brand; + + @ApiModelProperty(value = "第三方店铺信息 JSON 格式") + private String shop_info; + @ApiModelProperty(value = "状态:1-有效;2-无效;") private Integer status; diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java new file mode 100644 index 00000000..5907b161 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java @@ -0,0 +1,138 @@ +/* + * 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.common.pojo.to; + +/** + * 地址解析结果类 + */ +public class AddressParseResultTO implements java.io.Serializable { + /** + * 省/自治区/直辖市 + */ + private String province; + + /** + * 市/自治州/地区 + */ + private String city; + + /** + * 区/县/县级市 + */ + private String district; + + /** + * 省/市/区 拼接的地址,格式如"广西壮族自治区/贵港市/桂平市" + */ + private String joinArea; + + /** + * 详细地址 + */ + private String detailAddress; + + public AddressParseResultTO() { + this.province = ""; + this.city = ""; + this.district = ""; + this.joinArea = ""; + this.detailAddress = ""; + } + + public AddressParseResultTO(String province, String city, String district, String detailAddress) { + this.province = province != null ? province : ""; + this.city = city != null ? city : ""; + this.district = district != null ? district : ""; + this.detailAddress = detailAddress != null ? detailAddress : ""; + this.joinArea = buildJoinArea(); + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province != null ? province : ""; + this.joinArea = buildJoinArea(); + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city != null ? city : ""; + this.joinArea = buildJoinArea(); + } + + public String getDistrict() { + return district; + } + + public void setDistrict(String district) { + this.district = district != null ? district : ""; + this.joinArea = buildJoinArea(); + } + + public String getJoinArea() { + return joinArea; + } + + public void setJoinArea(String joinArea) { + this.joinArea = joinArea != null ? joinArea : ""; + } + + public String getDetailAddress() { + return detailAddress; + } + + public void setDetailAddress(String detailAddress) { + this.detailAddress = detailAddress != null ? detailAddress : ""; + } + + /** + * 构建省/市/区拼接地址 + * + * @return 拼接后的地址,格式如"广西壮族自治区/贵港市/桂平市" + */ + private String buildJoinArea() { + StringBuilder sb = new StringBuilder(); + + if (province != null && !province.isEmpty()) { + sb.append(province); + } + + if (city != null && !city.isEmpty()) { + if (sb.length() > 0) { + sb.append("/"); + } + sb.append(city); + } + + if (district != null && !district.isEmpty()) { + if (sb.length() > 0) { + sb.append("/"); + } + sb.append(district); + } + + return sb.toString(); + } + + @Override + public String toString() { + return "AddressParseResultTO{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", district='" + district + '\'' + + ", joinArea='" + joinArea + '\'' + + ", detailAddress='" + detailAddress + '\'' + + '}'; + } +} 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 new file mode 100644 index 00000000..e4013607 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java @@ -0,0 +1,123 @@ +package com.suisung.mall.common.utils; + +import com.suisung.mall.common.pojo.to.AddressParseResultTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 地址处理工具类 + * 用于解析完整地址为省、市、区和详细地址等部分 + */ +public class AddressUtil { + + private static final Logger logger = LoggerFactory.getLogger(AddressUtil.class); + + // 省级行政区划关键词 + private static final String[] PROVINCE_KEYWORDS = { + "省", "自治区", "特别行政区", "市" // 直辖市 + }; + + // 市级行政区划关键词 + private static final String[] CITY_KEYWORDS = { + "市", "自治州", "地区", "盟" + }; + + // 区县级行政区划关键词 + private static final String[] DISTRICT_KEYWORDS = { + "区", "县", "市", "自治县", "旗", "自治旗", "县级市" + }; + + /** + * 将完整地址切分为省、市、区和详细地址 + * + * @param fullAddress 完整地址,例如:"广西壮族自治区贵港市桂平市西山镇新安街粤桂花城1102号" + * @return AddressParseResultTO 包含province、city、district、detailAddress的地址解析结果对象 + */ + public static AddressParseResultTO parseAddress(String fullAddress) { + AddressParseResultTO result = new AddressParseResultTO(); + + if (com.suisung.mall.common.utils.StringUtils.isBlank(fullAddress)) { + return result; + } + + try { + String remainingAddress = fullAddress; + + // 提取省/自治区/直辖市 + String province = extractArea(remainingAddress, PROVINCE_KEYWORDS); + if (!province.isEmpty()) { + result.setProvince(province); + remainingAddress = remainingAddress.substring(province.length()); + } + + // 提取市/自治州/地区 + String city = extractArea(remainingAddress, CITY_KEYWORDS); + if (!city.isEmpty()) { + result.setCity(city); + remainingAddress = remainingAddress.substring(city.length()); + } + + // 提取区/县/县级市 + String district = extractArea(remainingAddress, DISTRICT_KEYWORDS); + if (!district.isEmpty()) { + result.setDistrict(district); + remainingAddress = remainingAddress.substring(district.length()); + } + + // 剩余部分为详细地址 + result.setDetailAddress(remainingAddress.trim()); + + } catch (Exception e) { + logger.error("解析地址时发生异常: {}", e.getMessage(), e); + result.setDetailAddress(fullAddress); + } + + return result; + } + + /** + * 从地址中提取指定级别的行政区域 + * + * @param address 地址字符串 + * @param keywords 匹配关键词数组 + * @return 提取到的行政区域名称 + */ + private static String extractArea(String address, String[] keywords) { + for (String keyword : keywords) { + int index = address.indexOf(keyword); + if (index != -1) { + // 特殊处理直辖市的情况,如"北京市" + if (keyword.equals("市") && index == 0) { + // 查找下一个"市"字,可能是区县 + int nextIndex = address.indexOf("市", index + 1); + if (nextIndex > 0) { + return address.substring(0, nextIndex + 1); + } + } + return address.substring(0, index + keyword.length()); + } + } + return ""; + } + + /** + * 使用示例: + *

+ * String fullAddress = "广西壮族自治区贵港市桂平市西山镇新安街粤桂花城1102号"; + * AddressParseResultTO parsedAddress = AddressUtil.parseAddress(fullAddress); + *

+ * System.out.println("省: " + parsedAddress.getProvince()); // 广西壮族自治区 + * System.out.println("市: " + parsedAddress.getCity()); // 贵港市 + * System.out.println("区: " + parsedAddress.getDistrict()); // 桂平市 + * System.out.println("详细地址: " + parsedAddress.getDetailAddress()); // 西山镇新安街粤桂花城1102号 + */ + public static void main(String[] args) { + String fullAddress = "广西壮族自治区贵港市桂平市西山镇新安街粤桂花城1102号"; + AddressParseResultTO parsedAddress = AddressUtil.parseAddress(fullAddress); + System.out.println("省: " + parsedAddress.getProvince()); + System.out.println("市: " + parsedAddress.getCity()); + System.out.println("区: " + parsedAddress.getDistrict()); + System.out.println("省市区: " + parsedAddress.getJoinArea()); + System.out.println("详细地址: " + parsedAddress.getDetailAddress()); + } +} \ No newline at end of file diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java index 5fe683bb..50f1d601 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java @@ -23,7 +23,6 @@ import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ThreadLocalRandom; -import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -62,8 +61,7 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { "(?(\\w+省|\\w+自治区))?(?(\\w+市|\\w+自治州))?(?(\\w+区|\\w+县|\\w+市辖区|\\w+市))?"; public static void main(String[] args) { -// System.out.println(removeProvinceCityDistrict("广西壮族自治区贵港市桂平市西山镇新安街粤桂花城1102号")); - System.out.println(validateIDCard("45088119970105771X")); +// System.out.println(validateIDCard("45088119970105771X")); } public static String encode(String str) { @@ -300,66 +298,6 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { return base64.substring(0, length); } - /** - * 去除省市区,保留详细地址 - * - * @param fullAddress - * @return - */ - public static String removeProvinceCityDistrict(String fullAddress) { - if (StringUtils.isBlank(fullAddress)) { - return ""; - } - - try { - Pattern pattern = Pattern.compile(PROVINCE_CITY_DISTRICT_REGEX); - Matcher matcher = pattern.matcher(fullAddress); - - if (!matcher.find()) { - return fullAddress; - } - - StringBuilder result = new StringBuilder(fullAddress); - - // Remove matched groups in reverse order to avoid index shifting issues - if (matcher.group("district") != null) { - result.replace(matcher.start("district"), matcher.end("district"), ""); - } - if (matcher.group("city") != null) { - result.replace(matcher.start("city"), matcher.end("city"), ""); - } - if (matcher.group("province") != null) { - result.replace(matcher.start("province"), matcher.end("province"), ""); - } - - return result.toString().trim(); - } catch (Exception e) { - // Log the exception for debugging purposes - System.err.println("Error processing address: " + e.getMessage()); - return fullAddress; // Return original address on failure - } - } - - /** - * 去除省市区,保留详细地址 - * - * @param fullAddress - * @return - */ - public static String removeProvinceCityDistrict2(String fullAddress) { - // 定义省市县区的关键字 - String[] keywords = {"省", "市", "自治区", "特别行政区", "地区", "盟", "自治州", "县", "区", "自治县", "旗", "自治旗", "县级市"}; - - for (String keyword : keywords) { - int index = fullAddress.indexOf(keyword); - if (index != -1) { - // 若找到关键字,截取关键字之后的部分 - fullAddress = fullAddress.substring(index + keyword.length()); - } - } - return fullAddress; - } - /** * 判断字符串是否是XML或JSON格式 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java index 86464716..76c4793c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java @@ -19,9 +19,10 @@ import com.suisung.mall.common.api.ResultCode; import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.modules.store.ShopMchEntry; +import com.suisung.mall.common.pojo.to.AddressParseResultTO; import com.suisung.mall.common.service.impl.CommonService; +import com.suisung.mall.common.utils.AddressUtil; import com.suisung.mall.common.utils.RestTemplateHttpUtil; -import com.suisung.mall.common.utils.StringUtils; import com.suisung.mall.common.utils.UploadUtil; import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.shop.lakala.service.LklBanksService; @@ -349,7 +350,8 @@ public class LklTkServiceImpl { formData.put("email", shopMchEntry.getEmail()); formData.put("merRegName", shopMchEntry.getStore_name()); formData.put("merName", shopMchEntry.getStore_name()); - formData.put("merAddr", StringUtils.removeProvinceCityDistrict(shopMchEntry.getStore_address())); + AddressParseResultTO addressParseResultTO = AddressUtil.parseAddress(shopMchEntry.getStore_address()); + formData.put("merAddr", addressParseResultTO.getDetailAddress()); // 是企业类型商家 Boolean isQy = CommonConstant.MCH_ENTITY_TYPE_QY.equals(shopMchEntry.getEntity_type()); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderDeliveryAddressServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderDeliveryAddressServiceImpl.java index 9749bdbd..2c30bb00 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderDeliveryAddressServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderDeliveryAddressServiceImpl.java @@ -3,7 +3,8 @@ package com.suisung.mall.shop.order.service.impl; import cn.hutool.core.util.StrUtil; import com.suisung.mall.common.modules.order.ShopOrderDeliveryAddress; import com.suisung.mall.common.pojo.dto.StandardAddressDTO; -import com.suisung.mall.common.utils.StringUtils; +import com.suisung.mall.common.pojo.to.AddressParseResultTO; +import com.suisung.mall.common.utils.AddressUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.order.mapper.ShopOrderDeliveryAddressMapper; import com.suisung.mall.shop.order.service.ShopOrderDeliveryAddressService; @@ -59,10 +60,10 @@ public class ShopOrderDeliveryAddressServiceImpl extends BaseServiceImpl emitters = new CopyOnWriteArrayList<>(); @Lazy @Autowired private SFExpressApiService sfExpressApiService; + @ApiOperation(value = "创建顺丰同城店铺-连锁店铺回调", notes = "创建顺丰同城店铺-连锁店铺回调") + @RequestMapping(value = "/create-shop/notify", method = RequestMethod.POST) + public ThirdApiRes createSfExpressShopNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { + return sfExpressApiService.createSfExpressShopNotify(requestBody, sign); + } + @ApiOperation(value = "顺丰原因订单取消回调", notes = "顺丰原因订单取消回调") @RequestMapping(value = "/cancel-order/notify", method = RequestMethod.POST) public ThirdApiRes cancelOrderNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java index 3a7dfe0c..8d780a39 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java @@ -31,6 +31,16 @@ public interface SFExpressApiService { */ Pair createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude); + /** + * 创建顺丰同城店铺-连锁店铺回调 + * + * @param jsonData + * @param sign + * @return + */ + ThirdApiRes createSfExpressShopNotify(String jsonData, String sign); + + ThirdApiRes createOrder(String shopOrderId); /** 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 45f9a09a..e0906ce8 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 @@ -108,15 +108,16 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { */ @Override public Pair createSfExpressShop(Integer storeId, String shopName, String cityName, - String shopAddress, String contactName, String contactPhone, String longitude, String latitude) { + String shopAddress, String contactName, String contactPhone, + String longitude, String latitude) { logger.info("开始创建顺丰同城店铺, storeId: {}", storeId); - // 验证必要参数 + // 1. 验证必要参数 if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) { return Pair.of(false, "顺丰同城店铺,缺少必要参数!"); } - // 获取或初始化商家配送信息 + // 2. 获取或初始化商家配送信息 ShopStoreSameCityTransportBase transportBase = shopStoreSameCityTransportBaseService .getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); @@ -124,29 +125,33 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 如果没有商家配送运费设置,则初始化 Pair initResult = shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId); if (!initResult.getFirst()) { + logger.error("初始化商家配送运费设置失败!"); return initResult; } transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); } - // 如果已存在顺丰店铺ID,验证其有效性 -// if (CheckUtil.isNotEmpty(transportBase.getShop_id())) { -// ThirdApiRes shopInfo = getSfShopInfo(transportBase.getShop_id()); -// if (shopInfo != null && shopInfo.getError_code().equals(0)) { -// return Pair.of(true, transportBase.getShop_id()); -// } -// } + // 3. 如果已存在顺丰店铺ID,验证其有效性 + if (CheckUtil.isNotEmpty(transportBase.getShop_id())) { + ThirdApiRes shopInfo = getSfShopInfo(transportBase.getShop_id()); + if (shopInfo != null && shopInfo.getError_code().equals(0)) { + logger.info("已成功创建顺丰同城店铺!"); + return Pair.of(true, transportBase.getShop_id()); + } + } - // 构建请求参数: + // 4. 构建请求参数 Map params = buildCommonParams(); params.put("supplier_id", supplierId); // 店铺所属商家id params.put("out_shop_id", storeId); // 外部店铺ID params.put("shop_name", shopName); // 店铺名称 params.put("city_name", cityName); // 城市名称 - //1:快餐 2:药品 3:百货 4:脏衣服收 5:干净衣服派 6:生鲜 8:高端饮品 9:现场勘验 10:快递 12:文件 13:蛋糕 14:鲜花 15:数码 16:服装 17: + + // RMK 1:快餐 2:药品 3:百货 4:脏衣服收 5:干净衣服派 6:生鲜 8:高端饮品 9:现场勘验 10:快递 12:文件 13:蛋糕 14:鲜花 15:数码 16:服装 17: //汽配 18:珠宝 20:披萨 21:中餐 22:水产 27:专人直送 32:中端饮品 33:便利店 34:面包糕点 35:火锅 36:证照 40:烧烤小龙虾 41:外部落地配 47:烟酒 //行 48:成人用品 99:其他 - params.put("shop_product_types", "1,3,6,8,13,14,15,16,20,22,32,33,34,47,99"); // 经营类型: 快餐,百货,生鲜,便利店 + // 经营类型: 快餐,百货,生鲜,高端饮品,蛋糕,鲜花,数码,服装,披萨,水产,中端饮品,便利店,面包糕点,烟酒,其他 + params.put("shop_product_types", "1,3,6,8,13,14,15,16,20,22,32,33,34,47,99"); params.put("shop_type", 1); // 店铺类型: 1-普通型 2-平台型 params.put("shop_address", shopAddress); // 店铺地址 params.put("longitude", longitude); // 经度 @@ -154,33 +159,35 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { params.put("shop_contact_name", contactName); // 联系人姓名 params.put("shop_contact_phone", contactPhone); // 联系电话 - // 发送请求到顺丰接口 + // 5. 发送请求到顺丰接口 String paramJSON = JsonUtil.toJSONString(params); String sendUrl = buildUrl("createShop", paramJSON); String responseStr = HttpUtil.post(sendUrl, paramJSON); if (StrUtil.isBlank(responseStr)) { - logger.error("创建顺丰同城店铺异常,无返回值!"); - return Pair.of(false, "创建顺丰同城店铺异常,无返回值!"); + logger.error("创建顺丰店铺异常,无返回值!"); + return Pair.of(false, "创建顺丰店铺异常,无返回值!"); } ThirdApiRes apiRes = JSONUtil.toBean(responseStr, ThirdApiRes.class); if (apiRes == null) { - logger.error("创建顺丰同城店铺异常,返回值有误!!"); - return Pair.of(false, "创建顺丰同城店铺异常,返回值有误!"); + logger.error("创建顺丰店铺异常,返回值有误!!"); + return Pair.of(false, "创建顺丰店铺异常,返回值有误!"); } - // 检查接口调用结果 + // 6. 检查接口调用结果 if (!apiRes.getError_code().equals(0) || apiRes.getResult() == null) { - String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰同城店铺失败!" : apiRes.getError_msg(); - logger.error("创建顺丰同城店铺失败: {}", errMsg); + String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰店铺失败!" : "创建顺丰店铺失败: " + apiRes.getError_msg(); + logger.error("创建顺丰店铺失败: {}", errMsg); return Pair.of(false, errMsg); } - // 提取顺丰店铺ID并更新数据库 + // 7. 提取顺丰店铺ID并更新数据库 JSONObject result = (JSONObject) apiRes.getResult(); String sfShopId = result.getStr("shop_id"); transportBase.setShop_id(sfShopId); + transportBase.setShop_state(CommonConstant.Enable);// 顺丰同城快递商品特惠 + transportBase.setDelivery_brand(CommonConstant.DELIVERY_BRAND_SF); Pair updateResult = shopStoreSameCityTransportBaseService .saveOrUpdateShopStoreSameCityTransportBase(transportBase); @@ -190,9 +197,35 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return Pair.of(false, "更新店铺信息失败"); } + logger.info("成功创建顺丰店铺,店铺ID: {}", sfShopId); return Pair.of(true, sfShopId); } + /** + * 创建顺丰同城店铺异步通知回调 + * + * @param jsonData + * @param sign + * @return + */ + public ThirdApiRes createSfExpressShopNotify(String jsonData, String sign) { + logger.info("开始创建顺丰店铺异步通知回调"); + + if (StrUtil.isBlank(jsonData) || StrUtil.isBlank(sign)) { + return new ThirdApiRes().fail(1003, "缺少必要参数!"); + } + + if (!checkOpenSign(sign, jsonData)) { + return new ThirdApiRes().fail(2002, "请求签名sign校验失败!"); + } + + logger.info("接收创建顺丰店铺异步通知回调返回的 JSON 数据:{}", jsonData); + +// return new ThirdApiRes().success("处理成功"); + + return new ThirdApiRes().fail(1003, "处理成功"); + } + @Override public ThirdApiRes createOrder(String shopOrderId) { // 组织请求参数 @@ -373,7 +406,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { payload.put("orderId", shopOrderId); pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "您有一笔新的订单", "您有一笔同城订单[" + shopOrderId + "],请及时处理。", payload); - return Pair.of(true, "顺丰同城下单成功!"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreBizCategoryAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreBizCategoryAdminController.java deleted file mode 100644 index 22328dcc..00000000 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreBizCategoryAdminController.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.core.util.StrUtil; -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.ShopStoreBizCategoryService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -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; - -@Api(tags = "店铺分类(类目),此类决定商家分成比例") -@RestController -@RequestMapping("/admin/shop/store/biz-category") -public class ShopStoreBizCategoryAdminController extends BaseControllerImpl { - - @Resource - private ShopStoreBizCategoryService shopStoreBizCategoryService; - - @ApiOperation(value = "搜索店铺分类(类目)", notes = "搜索店铺分类(类目)") - @RequestMapping(value = "/search", method = RequestMethod.POST) - public CommonResult shopStoreBizCategorySearchList(@RequestBody(required = false) JSONObject params) { - String keyword = ""; - if (params != null && StrUtil.isNotBlank(params.getStr("keyword"))) { - keyword = params.getStr("keyword"); - } - return CommonResult.success(shopStoreBizCategoryService.selectParentListWithChildren(keyword)); - } - - @ApiOperation(value = "新增店铺分类(类目)", notes = "新增店铺分类(类目)") - @RequestMapping(value = "/add/new", method = RequestMethod.POST) - public CommonResult shopStoreBusinessCategoryAddNew(@RequestBody JSONObject params) { - return shopStoreBizCategoryService.addNew(params); - } - - @ApiOperation(value = "修改店铺分类(类目)", notes = "修改店铺分类(类目)") - @RequestMapping(value = "/modify", method = RequestMethod.POST) - public CommonResult shopStoreBusinessCategoryModify(@RequestBody JSONObject params) { - return shopStoreBizCategoryService.modify(params); - } - - @ApiOperation(value = "屏蔽/开启店铺分类(类目)", notes = "屏蔽/开启店铺分类(类目)") - @RequestMapping(value = "/status/modify", method = RequestMethod.POST) - public CommonResult shopStoreBusinessCategoryDisable(@RequestBody JSONObject params) { - return shopStoreBizCategoryService.modifyStatus(params); - } - -} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreBizCategoryController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreBizCategoryController.java deleted file mode 100644 index cdbaa5f8..00000000 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreBizCategoryController.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.mobile; - - -import cn.hutool.core.util.StrUtil; -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.ShopStoreBizCategoryService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -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; - -@Api(tags = "店铺分类(类目),此类决定商家分成比例") -@RestController -@RequestMapping("/mobile/shop/store/biz-category") -public class ShopStoreBizCategoryController extends BaseControllerImpl { - - @Resource - private ShopStoreBizCategoryService shopStoreBizCategoryService; - - @ApiOperation(value = "店铺分类(类目)", notes = "店铺分类(类目)") - @RequestMapping(value = "/list", method = RequestMethod.POST) - public CommonResult shopStoreBusinessCategoryList(@RequestBody(required = false) JSONObject params) { - String keyword = ""; - if (params != null && StrUtil.isNotBlank(params.getStr("keyword"))) { - keyword = params.getStr("keyword"); - } - return CommonResult.success(shopStoreBizCategoryService.selectParentListWithChildren(keyword)); - } - -} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStoreBizCategoryMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStoreBizCategoryMapper.java deleted file mode 100644 index 9586a7ba..00000000 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/mapper/ShopStoreBizCategoryMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.suisung.mall.shop.store.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.suisung.mall.common.modules.store.ShopStoreBizCategory; -import com.suisung.mall.common.modules.store.dto.ShopStoreBizCategoryDTO; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -/** - *

- * 店铺营业分类表,用于存储超市商品的分类信息,支持二级分类 Mapper 接口 - *

- * - * @author panjunjie - * @since 2025-03-17 - */ -@Repository -public interface ShopStoreBizCategoryMapper extends BaseMapper { - - /** - * 根据关键字查询店铺一级营业分类信息 - * - * @param keyword - * @return - */ - List selectParentListWithChildren(@Param("keyword") String keyword); -} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBizCategoryService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBizCategoryService.java deleted file mode 100644 index a6c141bc..00000000 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBizCategoryService.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.suisung.mall.shop.store.service; - -import cn.hutool.json.JSONObject; -import com.suisung.mall.common.api.CommonResult; -import com.suisung.mall.common.modules.store.ShopStoreBizCategory; -import com.suisung.mall.common.modules.store.dto.ShopStoreBizCategoryDTO; -import com.suisung.mall.core.web.service.IBaseService; - -import java.util.List; - - -/** - *

- * 店铺营业分类表,用于存储超市商品的分类信息,支持二级分类,会影响分成比例 服务类 - *

- * - * @author panjunjie - * @since 2025-03-17 - */ -public interface ShopStoreBizCategoryService extends IBaseService { - - /** - * 根据关键字查询店铺一级营业分类信息 - * - * @param keyword - * @return - */ - List selectParentListWithChildren(String keyword); - - /** - * 新增店铺营业分类信息 - * - * @param params - * @return - */ - CommonResult addNew(JSONObject params); - - /** - * 修改店铺营业分类信息 - * - * @param params - * @return - */ - CommonResult modify(JSONObject params); - - /** - * 删除店铺营业分类信息 - * - * @param params - * @return - */ - CommonResult modifyStatus(JSONObject params); - - /** - * 根据分类编号查询店铺营业分类信息是否存在 - * - * @param categoryCode - * @return - */ - Boolean isExists(String categoryCode); -} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBizCategoryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBizCategoryServiceImpl.java deleted file mode 100644 index 220e380a..00000000 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBizCategoryServiceImpl.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.suisung.mall.shop.store.service.impl; - -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.suisung.mall.common.api.CommonResult; -import com.suisung.mall.common.constant.CommonConstant; -import com.suisung.mall.common.modules.store.ShopStoreBizCategory; -import com.suisung.mall.common.modules.store.dto.ShopStoreBizCategoryDTO; -import com.suisung.mall.common.utils.I18nUtil; -import com.suisung.mall.core.web.service.impl.BaseServiceImpl; -import com.suisung.mall.shop.store.mapper.ShopStoreBizCategoryMapper; -import com.suisung.mall.shop.store.service.ShopStoreBizCategoryService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - - -/** - *

- * 店铺营业分类表,用于存储超市商品的分类信息,支持二级分类,会影响分成比例 服务实现类 - *

- * - * @author panjunjie - * @since 2025-03-17 - */ -@Service -public class ShopStoreBizCategoryServiceImpl extends BaseServiceImpl implements ShopStoreBizCategoryService { - - @Resource - private ShopStoreBizCategoryMapper shopStoreBizCategoryMapper; - - /** - * 根据关键字查询店铺一级营业分类信息 - * - * @param keyword - * @return - */ - @Override - public List selectParentListWithChildren(String keyword) { - return shopStoreBizCategoryMapper.selectParentListWithChildren(keyword); - } - - /** - * 新增店铺营业分类信息 - * - * @param params - * @return - */ - @Override - public CommonResult addNew(JSONObject params) { - String userId = "0"; - -// UserDto user = getCurrentUser(); -// if (!user.isAdmin()) { -// return CommonResult.failed("权限不足!"); -// } -// userId = user.getId().toString(); - - if (params == null) { - return CommonResult.failed(I18nUtil._("参数不能为空")); - } - - if (!params.containsKey("category_code") || !params.containsKey("category_name")) { - return CommonResult.failed(I18nUtil._("缺少必要参数")); - } - - ShopStoreBizCategory record = JSONUtil.toBean(params, ShopStoreBizCategory.class); - if (record == null) { - return CommonResult.failed(I18nUtil._("参数转化错误")); - } - - if (!params.containsKey("parent_category_code") || StrUtil.isBlank(params.getStr("parent_category_code"))) { - record.setParent_category_code("0"); - } - - // 判断 category_code 是不是存在? - if (isExists(record.getCategory_code())) { - return CommonResult.failed(I18nUtil._("分类编号已存在!")); - } - - record.setCreated_by(userId); - record.setUpdated_by(userId); - - boolean success = save(record); - if (!success) { - return CommonResult.failed(I18nUtil._("保存失败!")); - } - - return CommonResult.success(); - } - - /** - * 修改店铺营业分类信息 - * - * @param params - * @return - */ - @Override - public CommonResult modify(JSONObject params) { - String userId = "0"; - -// UserDto user = getCurrentUser(); -// if (!user.isAdmin()) { -// return CommonResult.failed("权限不足!"); -// } -// userId = user.getId().toString(); - - if (params == null) { - return CommonResult.failed(I18nUtil._("参数不能为空")); - } - - if (!params.containsKey("id")) { - return CommonResult.failed(I18nUtil._("缺少必要参数")); - } - - ShopStoreBizCategory record = JSONUtil.toBean(params, ShopStoreBizCategory.class); - if (record == null) { - return CommonResult.failed(I18nUtil._("参数转化错误")); - } - - record.setUpdated_by(userId); - if (record.getStatus().equals(CommonConstant.Enable)) { - record.setStatus(CommonConstant.Disable2); - } - - boolean success = updateById(record); - if (!success) { - return CommonResult.failed(I18nUtil._("保存失败!")); - } - - return CommonResult.success(); - } - - /** - * 删除店铺营业分类信息 - * - * @param params - * @return - */ - @Override - public CommonResult modifyStatus(JSONObject params) { - String userId = "0"; - -// UserDto user = getCurrentUser(); -// if (!user.isAdmin()) { -// return CommonResult.failed("权限不足!"); -// } -// userId = user.getId().toString(); - - if (params == null) { - return CommonResult.failed(I18nUtil._("参数不能为空")); - } - - if (!params.containsKey("id") || !params.containsKey("status")) { - return CommonResult.failed(I18nUtil._("缺少必要参数")); - } - - Long id = params.getLong("id"); - Integer status = params.getInt("status"); - if (!CommonConstant.Enable.equals(status)) { - status = CommonConstant.Disable2; - } - - ShopStoreBizCategory record = new ShopStoreBizCategory(); - record.setStatus(status); - record.setUpdated_by(userId); - record.setId(id); - - boolean success = updateById(record); - if (!success) { - return CommonResult.failed(I18nUtil._("保存失败!")); - } - - return CommonResult.success(); - } - - /** - * 根据分类编号查询店铺营业分类信息是否存在 - * - * @param categoryCode - * @return - */ - @Override - public Boolean isExists(String categoryCode) { - if (StrUtil.isBlank(categoryCode)) { - return true; - } - - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("category_code", categoryCode).select("id"); - return count(queryWrapper) > 0; - } -} diff --git a/mall-shop/src/main/resources/mapper/store/ShopStoreBizCategoryMapper.xml b/mall-shop/src/main/resources/mapper/store/ShopStoreBizCategoryMapper.xml deleted file mode 100644 index e09bd99b..00000000 --- a/mall-shop/src/main/resources/mapper/store/ShopStoreBizCategoryMapper.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - id - , category_code, category_name, parent_category_code, description,split_ratio,seq,status,created_by,updated_by,created_at,updated_at - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index 7870e47d..2d497d61 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,7 @@ 3306 mall_dev root - 123456 + 12345678 com.mysql.cj.jdbc.Driver 114.132.210.208