This commit is contained in:
zjf committed 2026-11-12 22:20:15 +08:00
1 parent 0c17f14505
commit 44ac3a8b9c
1 file changed
+48 -46
@@ -1197,10 +1197,7 @@ public class SmHotelMidServiceImpl implements SmHotelMidService {
Map<String, Object> 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<String, Object> 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 {
}
/**
* 从位置区域文案取「市级」层名称并去掉「市」。
* <p>
* 规则:先按省/市/州/区县拆层;优先取以「市」结尾的那一层(县级市如恩施市也算);
* 若只有区县(如城阳区),则退回上一层地级市(青岛市)。
* </p>
* 环启 cityName:
* <ol>
* <li>优先从「位置区域」district 取带「市」的那一层(天津市津南区 → 天津市)</li>
* <li>没有再从其它字段(如 remark 的 city=、调用方传入值)取</li>
* <li>仍取不到带「市」的名称则返回空,不编造</li>
* </ol>
*/
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 "";
}
/**
* 从文案中只取以「市」结尾的一层;没有则返回空。
* <ul>
* <li>湖北省恩施土家族苗族自治州恩施市 → 恩施</li>
* <li>山东省青岛市城阳区 → 青岛</li>
* <li>北京市朝阳区 → 北京</li>
* <li>天津市津南区 → 天津市</li>
* <li>山东省青岛市城阳区 → 青岛市</li>
* <li>湖北省恩施土家族苗族自治州恩施市 → 恩施市</li>
* <li>津南区 / 天津城区 → 空(没有「xx市」就不取)</li>
* </ul>
*/
static String extractHuanqiCityNameFromDistrict(String district) {
if (StrUtil.isBlank(district)) {
return "";
}
String s = district.trim().replace(" ", "");
String s = district.trim().replace(" ", "").replace("/", "");
List<String> 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;