酒店
This commit is contained in:
1 parent
0c17f14505
commit
44ac3a8b9c
1 file changed
+48
-46
+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;
|
||||
|
||||
Reference in new issue
Block a user