城市合伙人端的修改(后台)
This commit is contained in:
@@ -2,14 +2,35 @@ import { codeToText, regionData } from 'element-china-area-data';
|
||||
|
||||
export { regionData as CHINA_REGION_OPTIONS };
|
||||
|
||||
export type ProvinceCityOption = {
|
||||
value: string;
|
||||
label: string;
|
||||
children?: Array<{ value: string; label: string }>;
|
||||
};
|
||||
|
||||
/** 省 / 市二级(不含区县) */
|
||||
export const PROVINCE_CITY_OPTIONS: ProvinceCityOption[] = regionData.map((province) => ({
|
||||
value: province.value,
|
||||
label: province.label,
|
||||
children: province.children?.map((city) => ({
|
||||
value: city.value,
|
||||
label: city.label,
|
||||
})),
|
||||
}));
|
||||
|
||||
export type OpenCityRef = {
|
||||
id: string;
|
||||
name: string;
|
||||
code: string;
|
||||
partnerId?: string | null;
|
||||
partner?: { id: string };
|
||||
partnerBindings?: Array<{ partnerAccountId: string }>;
|
||||
boundPartnerIds?: string[];
|
||||
};
|
||||
|
||||
function cityBoundPartnerIds(city: OpenCityRef): string[] {
|
||||
if (city.boundPartnerIds?.length) return city.boundPartnerIds.map(String);
|
||||
return (city.partnerBindings ?? []).map((b) => String(b.partnerAccountId));
|
||||
}
|
||||
|
||||
export type ParsedChinaRegion = {
|
||||
province: string;
|
||||
city: string;
|
||||
@@ -19,6 +40,39 @@ export type ParsedChinaRegion = {
|
||||
districtCode: string;
|
||||
};
|
||||
|
||||
export type ParsedProvinceCity = {
|
||||
province: string;
|
||||
city: string;
|
||||
provinceCode: string;
|
||||
cityCode: string;
|
||||
};
|
||||
|
||||
/** element-china-area-data 市级码(如 4101)→ 国标 6 位 adcode(410100) */
|
||||
export function normalizeCityAdcode(code: string): string {
|
||||
const raw = code.trim();
|
||||
if (/^\d{6}$/.test(raw)) return raw;
|
||||
if (/^\d{4}$/.test(raw)) return `${raw}00`;
|
||||
if (/^\d{2}$/.test(raw)) return `${raw}0100`;
|
||||
return raw.padEnd(6, '0').slice(0, 6);
|
||||
}
|
||||
|
||||
export function parseProvinceCityCodes(codes?: string[]): ParsedProvinceCity | null {
|
||||
if (!codes || codes.length < 2) return null;
|
||||
const [provinceCode, cityCode] = codes;
|
||||
const province = codeToText[provinceCode];
|
||||
let city = codeToText[cityCode];
|
||||
if (!province || !city) return null;
|
||||
if (city === '市辖区' || city === '县' || city === '省直辖县级行政区划') {
|
||||
city = province.endsWith('市') ? province : city;
|
||||
}
|
||||
return {
|
||||
province,
|
||||
city,
|
||||
provinceCode,
|
||||
cityCode: normalizeCityAdcode(cityCode),
|
||||
};
|
||||
}
|
||||
|
||||
/** 区县 adcode → 地级市 adcode(如 410105 → 410100) */
|
||||
export function districtCodeToCityCode(districtCode: string): string {
|
||||
if (districtCode.length < 6) return districtCode;
|
||||
@@ -42,14 +96,11 @@ export function formatRegionLabel(region: ParsedChinaRegion): string {
|
||||
export function matchOpenCityId(
|
||||
cities: OpenCityRef[],
|
||||
districtCode: string,
|
||||
partnerId?: string,
|
||||
partnerAccountId?: string,
|
||||
): string | undefined {
|
||||
const cityCode = districtCodeToCityCode(districtCode);
|
||||
const scoped = partnerId
|
||||
? cities.filter((c) => {
|
||||
const pid = c.partnerId ?? c.partner?.id;
|
||||
return !pid || String(pid) === partnerId;
|
||||
})
|
||||
const scoped = partnerAccountId
|
||||
? cities.filter((c) => cityBoundPartnerIds(c).includes(String(partnerAccountId)))
|
||||
: cities;
|
||||
return (
|
||||
scoped.find((c) => c.code === cityCode)?.id
|
||||
@@ -61,11 +112,11 @@ export function matchOpenCityId(
|
||||
export function resolveRegionBinding(
|
||||
codes: string[],
|
||||
cities: OpenCityRef[],
|
||||
partnerId?: string,
|
||||
partnerAccountId?: string,
|
||||
) {
|
||||
const region = parseRegionCodes(codes);
|
||||
if (!region) return null;
|
||||
const cityId = matchOpenCityId(cities, region.districtCode, partnerId);
|
||||
const cityId = matchOpenCityId(cities, region.districtCode, partnerAccountId);
|
||||
const matchedCity = cityId ? cities.find((c) => c.id === cityId) : undefined;
|
||||
return {
|
||||
region,
|
||||
|
||||
Reference in New Issue
Block a user