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