From 44ac3a8b9cfb03e6ff633f6a0cc1653553a1f687 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Thu, 12 Nov 2026 22:20:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=92=E5=BA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SmHotelMidServiceImpl.java | 94 ++++++++++--------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmHotelMidServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmHotelMidServiceImpl.java index 02ae1950e..e8a8d2b8d 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmHotelMidServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmHotelMidServiceImpl.java @@ -1197,10 +1197,7 @@ public class SmHotelMidServiceImpl implements SmHotelMidService { Map hotelObj = new LinkedHashMap<>(); hotelObj.put("hotelId", supplierHotelId); hotelObj.put("hotelName", StrUtil.blankToDefault(hotel.getHotelName(), supplierHotelId)); - String cityName = extractHuanqiCityNameFromDistrict(StrUtil.trim(hotel.getDistrict())); - if (StrUtil.isBlank(cityName)) { - cityName = StrUtil.trim(hotel.getDistrict()); - } + String cityName = resolveHuanqiCityName(hotel, null); hotelObj.put("cityName", StrUtil.blankToDefault(cityName, "未知")); hotelObj.put("address", StrUtil.blankToDefault(buildHuanqiFullAddress(hotel.getDistrict(), hotel.getAddress()), "-")); @@ -1593,13 +1590,17 @@ public class SmHotelMidServiceImpl implements SmHotelMidService { hotelBody.put("cityName", hotel.getDistrict()); } parseRemarkAddress(hotel.getRemark(), hotelBody); - // 环启必填:cityName / address / receptionPhone;缺一则本店推送失败 - String cityName = StrUtil.trim(strObj(hotelBody.get("cityName"))); + // cityName:只从位置区域取「xx市」,没有再看其它字段;取不到则不调环启,只记跳过流水 + String cityName = resolveHuanqiCityName(hotel, StrUtil.trim(strObj(hotelBody.get("cityName")))); if (StrUtil.isBlank(cityName)) { - cityName = StrUtil.trim(hotel.getDistrict()); + String reason = "位置区域未解析到市级(需含 xx市),跳过环启推送;district=" + + StrUtil.blankToDefault(hotel.getDistrict(), "空"); + recordDownstreamPushSkip(partnerCode, hotel, reason); + Map skip = new HashMap<>(6); + skip.put("skipped", true); + skip.put("skipReason", reason); + return skip; } - // 环启:只取位置区域里「市级」那一层,再去掉「市」(恩施市→恩施;青岛市城阳区→青岛) - cityName = extractHuanqiCityNameFromDistrict(cityName); String address = StrUtil.trim(strObj(hotelBody.get("address"))); if (StrUtil.isBlank(address)) { address = buildHuanqiFullAddress(hotel.getDistrict(), hotel.getAddress()); @@ -1612,9 +1613,9 @@ public class SmHotelMidServiceImpl implements SmHotelMidService { if (StrUtil.isBlank(phone)) { phone = StrUtil.trim(hotel.getPhone()); } - if (StrUtil.isBlank(cityName) || StrUtil.isBlank(address) || StrUtil.isBlank(phone)) { - throw new IllegalArgumentException("环启酒店必填缺失:cityName/address/receptionPhone(hotelId=" + hotelId - + ",请补全城市/地址/电话后再推)"); + if (StrUtil.isBlank(address) || StrUtil.isBlank(phone)) { + throw new IllegalArgumentException("环启酒店必填缺失:address/receptionPhone(hotelId=" + hotelId + + ",请补全地址/电话后再推)"); } hotelBody.put("cityName", cityName); hotelBody.put("address", address); @@ -3237,42 +3238,56 @@ public class SmHotelMidServiceImpl implements SmHotelMidService { } /** - * 从位置区域文案取「市级」层名称并去掉「市」。 - *

- * 规则:先按省/市/州/区县拆层;优先取以「市」结尾的那一层(县级市如恩施市也算); - * 若只有区县(如城阳区),则退回上一层地级市(青岛市)。 - *

+ * 环启 cityName: + *
    + *
  1. 优先从「位置区域」district 取带「市」的那一层(天津市津南区 → 天津市)
  2. + *
  3. 没有再从其它字段(如 remark 的 city=、调用方传入值)取
  4. + *
  5. 仍取不到带「市」的名称则返回空,不编造
  6. + *
+ */ + static String resolveHuanqiCityName(SmHotelEntity hotel, String preferredRaw) { + // 1) 位置区域 + String fromDistrict = extractHuanqiCityNameFromDistrict(hotel == null ? null : hotel.getDistrict()); + if (StrUtil.isNotBlank(fromDistrict)) { + return fromDistrict; + } + // 2) 其它字段(remark 解析结果等) + String fromOther = extractHuanqiCityNameFromDistrict(preferredRaw); + if (StrUtil.isNotBlank(fromOther)) { + return fromOther; + } + // 3) 没有市就不用了 + return ""; + } + + /** + * 从文案中只取以「市」结尾的一层;没有则返回空。 * */ static String extractHuanqiCityNameFromDistrict(String district) { if (StrUtil.isBlank(district)) { return ""; } - String s = district.trim().replace(" ", ""); + String s = district.trim().replace(" ", "").replace("/", ""); List segments = splitAreaSegments(s); if (segments.isEmpty()) { - return stripCitySuffix(s); + return s.endsWith("市") && !s.endsWith("市辖区") ? s : ""; } - // 1) 优先:名称以「市」结尾的层(青岛市 / 恩施市 / 北京市) for (int i = segments.size() - 1; i >= 0; i--) { String seg = segments.get(i); + if ("市辖区".equals(seg)) { + continue; + } if (seg.endsWith("市") && !seg.endsWith("市辖区")) { - return stripCitySuffix(seg); + return seg; } } - // 2) 次选:地级「地区/盟」(极少);自治州不作为环启 cityName(对方要的是市短名) - for (int i = segments.size() - 1; i >= 0; i--) { - String seg = segments.get(i); - if (seg.endsWith("地区") || seg.endsWith("盟")) { - return seg.replaceAll("(地区|盟)$", ""); - } - } - // 3) 兜底:最后一层去掉区县后缀 - return stripCitySuffix(segments.get(segments.size() - 1)); + return ""; } /** 湖北省恩施土家族苗族自治州恩施市 → [湖北省, 恩施土家族苗族自治州, 恩施市] */ @@ -3288,19 +3303,6 @@ public class SmHotelMidServiceImpl implements SmHotelMidService { return list; } - /** 去掉末尾「市」(仅去一层后缀,不碰自治州等) */ - static String stripCitySuffix(String name) { - if (StrUtil.isBlank(name)) { - return ""; - } - String n = name.trim(); - if (n.endsWith("市") && !n.endsWith("市辖区") && n.length() > 1) { - return n.substring(0, n.length() - 1); - } - n = n.replaceAll("(区|县|旗)$", ""); - return n.trim(); - } - private static class DailyDraft { private String productCode; private String roomTypeCode;