diff --git a/klp-ui/src/components/ChinaAreaSelect/data.js b/klp-ui/src/components/ChinaAreaSelect/data.js index 915ed879..a478749c 100644 --- a/klp-ui/src/components/ChinaAreaSelect/data.js +++ b/klp-ui/src/components/ChinaAreaSelect/data.js @@ -3,7 +3,7 @@ // 行政区划的层级与一个国家的中央地方关系模式、国土面积的大小、政府与公众的关系状况等因素有关。 // 行政区划代码,也称行政代码,它是国家行政机关的识别符号,一般执行两项国家标准 -// :《中华人民共和国行政区划代码》(GB/T2260-2007)和《县以下行政区划代码编制规则》(GB/T10114-2003)。 +// 《中华人民共和国行政区划代码》(GB/T2260-2007)和《县以下行政区划代码编制规则》(GB/T10114-2003)。 // 由9位阿拉伯数字组成,相当于机关单位的身份号码。按照国务院《行政区划管理条例》规定,行政区划代码由民政部门确定、发布。 // 该标准对我国县以上行政区划的代码做了规定,用六位阿拉伯数字分层次代表我国的省(自治区、直辖市)、地区(市、州、盟)、县(区、市、旗)的名称。 diff --git a/klp-ui/src/components/ChinaAreaSelect/index.js b/klp-ui/src/components/ChinaAreaSelect/index.js new file mode 100644 index 00000000..283aa378 --- /dev/null +++ b/klp-ui/src/components/ChinaAreaSelect/index.js @@ -0,0 +1,85 @@ +import areaData from './data.js'; + +/** + * 辅助函数:将code数组/字符串转为name字符串 + * @param {String|Array} codeVal - 如 "110000/110101" 或 ["110000", "110101"] + * @returns {String} 如 "北京市/东城区" + */ +function convertCodeToName(codeVal) { + if (!codeVal) return ''; + const codeArr = Array.isArray(codeVal) ? codeVal : codeVal.split('/').filter(Boolean); + return codeArr.map(code => areaData[code] || '').filter(Boolean).join('/'); +} + +/** + * 格式化/解析区域地址文本(兼容「[标准地址](自定义地址)」格式) + * @param {String|Object} value - 输入值: + * - 字符串:如 "[北京市/东城区](XX街道1号)"、"北京市/东城区"、"" 等 + * - 对象:{ standard: '北京市/东城区', custom: 'XX街道1号' } + * @returns {Object|String} 输出规则: + * - 输入为字符串 → 返回结构化对象 { standard: '', custom: '' } + * - 输入为对象 → 返回格式化后的组合字符串 "[标准地址](自定义地址)" + * - 输入为空/非预期类型 → 返回空字符串(对象模式)或空结构(字符串模式) + */ +function formatAreaText(value) { + // 核心正则:匹配「[标准地址](自定义地址)」格式,分组提取标准地址和自定义地址 + const areaReg = /^\[([^\]]*)\]\(([^)]*)\)$/; + + // ========== 场景1:输入为空/非预期类型 → 容错返回 ========== + if (!value || (typeof value !== 'string' && typeof value !== 'object')) { + // 输入非字符串/对象 → 按类型返回默认值 + return typeof value === 'object' ? '' : { standard: '', custom: '' }; + } + + // ========== 场景2:输入是字符串 → 解析为结构化对象 ========== + if (typeof value === 'string') { + // 去除首尾空格 + const trimVal = value.trim(); + // 空字符串 → 返回空结构 + if (!trimVal) return { standard: '', custom: '' }; + + // 匹配「[标准地址](自定义地址)」格式 + const matchResult = trimVal.match(areaReg); + if (matchResult) { + // 提取分组值并去空格 + const standard = matchResult[1]?.trim() || ''; + const custom = matchResult[2]?.trim() || ''; + return { standard, custom }; + } + + // 非组合格式(纯标准地址/纯自定义地址)→ 默认归为standard + return { standard: trimVal, custom: '' }; + } + + // ========== 场景3:输入是对象 → 格式化为组合字符串 ========== + if (typeof value === 'object' && !Array.isArray(value)) { + const { standard = '', custom = '' } = value; + // 转字符串并去空格 + const standardStr = String(standard).trim(); + const customStr = String(custom).trim(); + + // 组合为「[标准地址](自定义地址)」格式 + return `[${standardStr}](${customStr})`; + } + + // 兜底:其他情况返回空(如数组输入) + return typeof value === 'object' ? '' : { standard: '', custom: '' }; +} + +/** + * 增强版:支持code自动转name的格式化函数 + */ +function formatAreaTextEnhanced(value, keyType = 'name') { + // 先调用基础版解析/格式化 + const result = formatAreaText(value); + + // 如果是解析模式(返回对象)且keyType为name,转换code为name + if (typeof result === 'object' && keyType === 'name') { + result.standard = convertCodeToName(result.standard); + } + + return result; +} + +// 输出:{ standard: "北京市/东城区", custom: "XX街道1号" } +export { formatAreaTextEnhanced }; \ No newline at end of file diff --git a/klp-ui/src/views/crm/components/CustomerInfo.vue b/klp-ui/src/views/crm/components/CustomerInfo.vue index 5c92bac0..77bf540b 100644 --- a/klp-ui/src/views/crm/components/CustomerInfo.vue +++ b/klp-ui/src/views/crm/components/CustomerInfo.vue @@ -16,11 +16,15 @@ - {{ customer.address || '-' }} + + {{ formattedAddress || '-' }} + \ No newline at end of file