dsh-data-cleaning-agent 0.9.16 → 0.9.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.en.md +3 -1
- package/README.md +4 -2
- package/docs/CORE-FIELDS-20260918.md +50 -0
- package/docs/UI-WORKFLOW-V2.md +5 -4
- package/lib/client.js +24 -4
- package/lib/qcc-field-catalog.js +14 -0
- package/lib/qcc.js +33 -5
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# 0.9.17 · 2026-09-18
|
|
2
|
+
|
|
3
|
+
- 工商与简介新增 14 项一企一行字段:省市区及地区代码、四级国标行业、四级企查查行业、主营产品、企业规模;不改变默认选择。
|
|
4
|
+
- 兼容行业由文本改为对象的返回结构,保留旧文本且不推测缺失层级,避免输出对象字符串;主营产品按源顺序合并一格。
|
|
5
|
+
- 向导与工作台同步字段目录、别名搜索、层级/规模说明及动态数量,保留原列回填和客户结果/任务报告分层。
|
|
6
|
+
|
|
1
7
|
# 0.9.16 · 2026-09-15
|
|
2
8
|
|
|
3
9
|
- UX-49:仅清洗入口新建的独立 Session,通过 Host 原生草稿接口预填一次;空草稿、附件/引用、输入就绪、IME、草稿版本与晚到竞态二次核验,不自动发送、建业务任务或展开工作台。
|
package/README.en.md
CHANGED
|
@@ -10,7 +10,9 @@ Related agents: [数据清洗补全](https://github.com/duhu2000/dsh-data-cleani
|
|
|
10
10
|
|
|
11
11
|
> A data cleaning & completion agent plugin for DeepSeek Harness: local CSV/XLSX/JSON engine plus optional Qichacha (QCC) MCP enterprise-data enrichment. Initiated and maintained by the Qichacha (QCC) team.
|
|
12
12
|
>
|
|
13
|
-
> Current source version / 当前源码版本: **0.9.
|
|
13
|
+
> Current source version / 当前源码版本: **0.9.17** (stable release)
|
|
14
|
+
|
|
15
|
+
0.9.17 adds 14 region, industry-level, product and enterprise-size fields (150 total), supports both legacy industry text and nested responses, and improves field search and column mapping. Defaults remain unchanged; missing levels are never inferred. Products reflect only the upstream first 10 entries. See [field expansion and verification boundaries](docs/CORE-FIELDS-20260918.md).
|
|
14
16
|
|
|
15
17
|
0.9.16 implements UX-49: a one-time editable native guide for new cleaning-entry Sessions, with existing text, attachment, IME and asynchronous-race guards. Clearing, refreshing or returning never restores it. Initialization does not send, call tools or open the workbench. Incomplete templates request the missing list and fields first. See the [adoption record](docs/UNIFIED-HOME-1.5.4-ADOPTION.md) for isolated DSH evidence and unverified boundaries.
|
|
16
18
|
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
数据清洗补全智能体:面向 Excel/CSV/JSON 企业名单,提供数据清洗、表格清洗、清洗补全、去重、企业数据补全与字段补全,支持企查查 MCP 和结果导出。
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
dsh plugin --profile web add dsh-data-cleaning-agent@0.9.
|
|
12
|
+
dsh plugin --profile web add dsh-data-cleaning-agent@0.9.17
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
请先满足下文的 DSH、连接器及侧边栏依赖要求;安装后完整停止并重启对应 Profile。
|
|
@@ -27,7 +27,9 @@ dsh plugin --profile web add dsh-data-cleaning-agent@0.9.16
|
|
|
27
27
|
|
|
28
28
|
> 在 DeepSeek Harness 中清洗、补全、画像企业名单数据的智能体插件:本地 CSV/XLSX/JSON 引擎 + 可选企查查(Qichacha/QCC)MCP 企业数据补全,由企查查(Qichacha/QCC)团队发起并维护。
|
|
29
29
|
>
|
|
30
|
-
> 当前源码版本 / Current source version: **0.9.
|
|
30
|
+
> 当前源码版本 / Current source version: **0.9.17**(正式版本)
|
|
31
|
+
|
|
32
|
+
0.9.17 新增省市区、地区代码、四级国标行业、四级企查查行业、主营产品与企业规模共 14 项字段,目录共 150 项;兼容行业由文本改为分层对象,优化字段搜索与原列映射。默认选择不扩大,缺失层级不推测;主营产品最多为上游返回的前 10 项。详见[字段扩展与验证边界](docs/CORE-FIELDS-20260918.md)。
|
|
31
33
|
|
|
32
34
|
0.9.16 实施 UX-49:首页仅为清洗入口新建的会话预填一次原生可编辑引导,保护已有文字、附件、中文组合输入与异步竞态。主动清空、刷新或切回不会补回;不自动发送、调用工具或展开工作台。未补全模板先澄清名单和字段。真实 DSH 隔离验收及未验证边界见[规范采用记录](docs/UNIFIED-HOME-1.5.4-ADOPTION.md)。
|
|
33
35
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# V3.25 核心字段扩展评估与实现(0.9.17,2026-09-18)
|
|
2
|
+
|
|
3
|
+
## 一手依据
|
|
4
|
+
|
|
5
|
+
- 2026-09-17 V3.25.0 发版通知及核对说明:工商地区/国标行业、简介企查查行业/主营产品/企业规模。
|
|
6
|
+
- qcc_mcp_new 本地 dev@fabceff:apps/mcp/src/tools/company_registration_info.tool.ts、company_profile.tool.ts;工商变更 cf4cfe1,简介 9203e20/f9719a0/a538e16/3b672ec。
|
|
7
|
+
- mcp_web 本地 dev@f2b85a79:apps/web/lib/demo-data.ts 及两个对应 example tests;913882d4、c9fb123a 和 109c9216。两个源仓只读,未修改工作树。
|
|
8
|
+
- 清洗插件基线 origin/main@794201b / npm latest 0.9.16,无在途 PR。独立分支 feat/core-fields-20260918;不变更共享字段包或默认选择。
|
|
9
|
+
- 发版核对说明明确未独立验证生产部署;本次亦未发起收费 MCP 请求。代码/官网示例对齐不能替代线上验收。
|
|
10
|
+
|
|
11
|
+
## 新增 14 项一对一字段
|
|
12
|
+
|
|
13
|
+
| 来源工具 | 精确返回路径 | 补全字段 ID | 显示名 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| get_company_registration_info | 地区信息.省份 | province | 省份 |
|
|
16
|
+
| 同上 | 地区信息.城市 | city | 城市 |
|
|
17
|
+
| 同上 | 地区信息.区域 | district | 区域 |
|
|
18
|
+
| 同上 | 地区信息.地区代码 | area_code | 地区代码 |
|
|
19
|
+
| 同上 | 国标行业.门类 | industry_section | 国标行业门类 |
|
|
20
|
+
| 同上 | 国标行业.大类 | industry_large | 国标行业大类 |
|
|
21
|
+
| 同上 | 国标行业.中类 | industry_middle | 国标行业中类 |
|
|
22
|
+
| 同上 | 国标行业.小类 | industry_small | 国标行业小类 |
|
|
23
|
+
| get_company_profile | 企查查行业.一级 | qcc_industry_level1 | 企查查行业一级 |
|
|
24
|
+
| 同上 | 企查查行业.二级 | qcc_industry_level2 | 企查查行业二级 |
|
|
25
|
+
| 同上 | 企查查行业.三级 | qcc_industry_level3 | 企查查行业三级 |
|
|
26
|
+
| 同上 | 企查查行业.四级 | qcc_industry_level4 | 企查查行业四级 |
|
|
27
|
+
| 同上 | 主营产品 | main_products | 主营产品 |
|
|
28
|
+
| 同上 | 企业规模 | company_scale | 企业规模 |
|
|
29
|
+
|
|
30
|
+
两个工具均来自 qcc-company。目录 136→150;工商 27→35、简介 3→9。仍按企业+工具去重调用,不为每个层级重复查同一工具。
|
|
31
|
+
|
|
32
|
+
## 兼容性与数据边界
|
|
33
|
+
|
|
34
|
+
- 旧 industry_category / qcc_industry ID 保留:旧文本原样输出;新对象按明确层级标注串联,禁止直接 String(object)。独立层级只取对应叶子,不把旧文本认定为某层级,也不从其他层级补缺。
|
|
35
|
+
- 地区字段来自嵌套“地区信息”,不从所属地区/注册地址拆分;地区代码保留字符串与前导零。不同主体可能不返回这些字段,缺失留空。
|
|
36
|
+
- 企业规模取简介“企业规模”(上游大型/中型/小型/微型);原 company_size 仍是工商“人员规模”,不能互相回填。
|
|
37
|
+
- 主营产品是名称数组,按原顺序以中文分号合并单元格,不展开企业行、不重排、不去重。当前服务只请求前 10 项,空数组也可能来自不支持主体或补充接口异常,不能据此判断企业没有产品。
|
|
38
|
+
- 原表非空值保护、只回填选定字段、来源审计和客户 XLSX/任务报告分层保持不变;主结果不增加本次未选字段。
|
|
39
|
+
|
|
40
|
+
## 选择界面
|
|
41
|
+
|
|
42
|
+
保持两大来源分组及现有全选/清空交互;增加层级、规模和产品边界说明。新增省/市/区县、区域编码、企查查一级行业等别名,搜索和表头映射共用;不把笼统“行业”自动绑定到某级。数量取当前目录,移除过时固定批次数字。默认字段不扩大。
|
|
43
|
+
|
|
44
|
+
## 验证
|
|
45
|
+
|
|
46
|
+
自动化覆盖:新结构/旧文本、缺层级、畸形对象、零值和前导零、产品原顺序、两个工具去重、原值保留、未选择字段不输出、前后端目录映射及 UI 数量/搜索。
|
|
47
|
+
|
|
48
|
+
本地验收:npm run check 全部通过(302 项测试及语法、文档、打包门禁);真实 React/Chromium 亮/暗主题 × 5 种尺寸共 10 组回归通过,包括新增别名搜索、行业层级、银行模板省市区自动映射。XLSX 合成往返测试验证中文列名、前导零、产品单元格和报告分层;未在客户已登录的 3080 会话上发起业务调用。
|
|
49
|
+
|
|
50
|
+
未验证:生产 MCP 实际部署与权限、真实企业返回完整度;不将合成 fixture 当作真实业务验收。用户后续已授权 commit、push、tag 与 npm 发布,0.9.17 按 PR 检查、合并默认分支、tag/OIDC 流程发布;发布状态以 registry 回读为准。
|
package/docs/UI-WORKFLOW-V2.md
CHANGED
|
@@ -18,14 +18,15 @@
|
|
|
18
18
|
|
|
19
19
|
## 2. 当前范围
|
|
20
20
|
|
|
21
|
-
当前字段目录共
|
|
21
|
+
当前字段目录共 150 项,UI/Host/XLSX 按 11 个来源工具分组(0.9.17,2026-09-18 扩展):
|
|
22
22
|
|
|
23
|
-
- 基础
|
|
23
|
+
- 基础 44 项:`get_company_registration_info`(企业工商信息,35 项)和 `get_company_profile`(企业简介,9 项)。
|
|
24
|
+
- 实际控制人 4 项、受益所有人首条 1 项、主要财务指标 3 项,沿用共享字段契约。
|
|
24
25
|
- 第一批 40 项:`get_contact_info`(联系方式,6 项)、`get_listing_info`(上市信息,15 项)、`get_tax_invoice_info`(税务开票,8 项)、`get_import_export_credit`(进出口信用,11 项)。
|
|
25
26
|
- 第二批 58 项:`get_company_risk_scan`(企业自身风险扫描,38 项)和 `get_company_related_risk_scan`(企业关联风险扫描,20 项)。
|
|
26
27
|
- 基础工商:企业名称、统一社会信用代码、注册号、组织机构代码、纳税人识别号、登记状态、法定代表人、注册/实缴资本、成立日期、企业类型、核准日期、登记机关、纳税人资质、支付系统行号、进出口企业代码、企业简称、英文名。
|
|
27
|
-
-
|
|
28
|
-
-
|
|
28
|
+
- 地址与地区:注册地址、通信地址、所属地区原值及明确返回的省份、城市、区域、地区代码;不拆地址推测。
|
|
29
|
+
- 经营信息:经营范围、国标行业/企查查行业展示值及各自四级独立字段、主营产品、企业规模、营业期限、人员规模、参保人数、分支机构参保人数、企业简介、产业链概览。企业规模与人员规模独立;主营产品按源顺序合并一格,当前上游最多 10 项,并非完整产品库。详见 [字段扩展核对](CORE-FIELDS-20260918.md)。
|
|
29
30
|
- 上传列“联系电话”仍可作为本地质量检查字段;QCC 联系方式另以“首选联系电话/邮箱/官网”等字段输出。电话、邮箱和网址全集不拼接进单元格。
|
|
30
31
|
- 风险字段只输出扫描工具已返回的聚合计数、命中摘要与重点维度命中关联方数;风险明细、关联方名单和下钻结果不进入一企一行主表。
|
|
31
32
|
- 一级行业、二级行业、省、市、区县、曾用名和知识产权摘要不在当前目录;不得推断、拼接或用其他字段冒充。
|
package/lib/client.js
CHANGED
|
@@ -1800,12 +1800,19 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
|
|
|
1800
1800
|
['taxpayer_qualification', '纳税人资质'], ['payment_line_no', '支付系统行号'],
|
|
1801
1801
|
['import_export_company_code', '进出口企业代码'], ['short_name', '企业简称'], ['english_name', '英文名'],
|
|
1802
1802
|
['registered_address', '注册地址'], ['mailing_address', '通信地址'], ['region', '所属地区'],
|
|
1803
|
+
['province', '省份'], ['city', '城市'], ['district', '区域'], ['area_code', '地区代码'],
|
|
1803
1804
|
['business_scope', '经营范围'], ['industry_category', '国标行业'],
|
|
1805
|
+
['industry_section', '国标行业门类'], ['industry_large', '国标行业大类'],
|
|
1806
|
+
['industry_middle', '国标行业中类'], ['industry_small', '国标行业小类'],
|
|
1804
1807
|
['operating_period', '营业期限'], ['company_size', '人员规模'], ['insured_count', '参保人数'],
|
|
1805
1808
|
['branch_insured_count', '分支机构参保人数'],
|
|
1806
1809
|
], 'get_company_registration_info'],
|
|
1807
1810
|
['company_profile', '企业简介', [
|
|
1808
|
-
['qcc_industry', '企查查行业'],
|
|
1811
|
+
['qcc_industry', '企查查行业'],
|
|
1812
|
+
['qcc_industry_level1', '企查查行业一级'], ['qcc_industry_level2', '企查查行业二级'],
|
|
1813
|
+
['qcc_industry_level3', '企查查行业三级'], ['qcc_industry_level4', '企查查行业四级'],
|
|
1814
|
+
['main_products', '主营产品'], ['company_scale', '企业规模'],
|
|
1815
|
+
['company_profile', '企业简介'],
|
|
1809
1816
|
['industry_chain_overview', '产业链概览'],
|
|
1810
1817
|
], 'get_company_profile'],
|
|
1811
1818
|
['contact_info', '联系方式', [
|
|
@@ -1848,6 +1855,7 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
|
|
|
1848
1855
|
];
|
|
1849
1856
|
FIELD_GROUPS.sort((a, b) => FIELD_GROUP_ORDER.indexOf(a[0]) - FIELD_GROUP_ORDER.indexOf(b[0]));
|
|
1850
1857
|
const ENRICHMENT_OPTIONS = FIELD_GROUPS.flatMap(([, , fields]) => fields);
|
|
1858
|
+
const CORE_FIELD_GUIDE = '可分别选择省市区、地区代码、四级国标行业与四级企查查行业;未分级行业列保留完整层级展示。企业规模不等于人员规模;主营产品按原顺序合并一格(上游最多返回 10 项,非完整产品库)。缺失值留空,不推测。';
|
|
1851
1859
|
const INPUT_ONLY_MAPPING_OPTIONS = [['phone', '联系电话']];
|
|
1852
1860
|
const RESULT_FIELD_LABELS = new Map([
|
|
1853
1861
|
...ENRICHMENT_OPTIONS,
|
|
@@ -2086,6 +2094,17 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
|
|
|
2086
2094
|
}
|
|
2087
2095
|
|
|
2088
2096
|
const MAPPING_ALIASES = {
|
|
2097
|
+
province: ['省', '所属省份'], city: ['市', '所属市', '所属城市'],
|
|
2098
|
+
district: ['区县', '所属区县', '所属区域'], area_code: ['区域编码', '地区编码', '行政区划代码'],
|
|
2099
|
+
industry_section: ['国标行业一级', '国标行业门类名称'],
|
|
2100
|
+
industry_large: ['国标行业二级', '国标行业大类名称'],
|
|
2101
|
+
industry_middle: ['国标行业三级', '国标行业中类名称'],
|
|
2102
|
+
industry_small: ['国标行业四级', '国标行业小类名称'],
|
|
2103
|
+
qcc_industry_level1: ['企查查一级行业', '企查查行业一级分类'],
|
|
2104
|
+
qcc_industry_level2: ['企查查二级行业', '企查查行业二级分类'],
|
|
2105
|
+
qcc_industry_level3: ['企查查三级行业', '企查查行业三级分类'],
|
|
2106
|
+
qcc_industry_level4: ['企查查四级行业', '企查查行业四级分类'],
|
|
2107
|
+
main_products: ['主要产品'], company_scale: ['企业规模分类'],
|
|
2089
2108
|
beneficial_owner_first_name: ['首条受益所有人名称'],
|
|
2090
2109
|
actual_controller_name: ['实控人', '实际控制人', '企业实控人名称', '企业实际控制人', '企业实控人名称(自然人请填写姓名)'],
|
|
2091
2110
|
actual_controller_direct_ratio: ['实际控制人直接持股比例'],
|
|
@@ -4123,6 +4142,7 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
|
|
|
4123
4142
|
),
|
|
4124
4143
|
h('details', { className: 'dcAgentExtraFields', open: mode !== 'excel' },
|
|
4125
4144
|
h('summary', null, `可选:追加补全字段(共 ${ENRICHMENT_OPTIONS.length} 项)`),
|
|
4145
|
+
h('p', { className: 'dcAgentHint' }, CORE_FIELD_GUIDE),
|
|
4126
4146
|
h('label', { className: 'dcAgentPromptField' },
|
|
4127
4147
|
h('span', null, `查找补全字段 · 已选 ${enrichmentKeys.length}`),
|
|
4128
4148
|
h('input', { type: 'search', className: 'dcAgentField', value: fieldQuery, 'aria-label': '查找补全字段',
|
|
@@ -5437,10 +5457,10 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
|
|
|
5437
5457
|
h('details', { className: 'dcAgentExtraFields' },
|
|
5438
5458
|
h('summary', null, `可选:追加补全字段(共 ${targetFields.filter(([id]) => id !== 'phone').length} 项)`),
|
|
5439
5459
|
h('div', { className: 'dcAgentRow', 'aria-label': '补全字段批次概览' },
|
|
5440
|
-
h('span', { className: 'dcAgentChip' }, '
|
|
5441
|
-
h('span', { className: 'dcAgentChip' },
|
|
5442
|
-
h('span', { className: 'dcAgentChip' }, '第二批 58'),
|
|
5460
|
+
h('span', { className: 'dcAgentChip' }, `工商与简介 ${uiFieldGroups.filter(([id]) => ['company_registration', 'company_profile'].includes(id)).reduce((sum, [, , fields]) => sum + fields.length, 0)} 项`),
|
|
5461
|
+
h('span', { className: 'dcAgentChip' }, `共 ${targetFields.filter(([id]) => id !== 'phone').length} 项可选字段`),
|
|
5443
5462
|
),
|
|
5463
|
+
h('p', { className: 'dcAgentHint' }, CORE_FIELD_GUIDE),
|
|
5444
5464
|
h('label', { className: 'dcAgentPromptField' }, h('span', null, '查找补全字段'),
|
|
5445
5465
|
h('input', { type: 'search', className: 'dcAgentField', value: fieldQuery, 'aria-label': '查找补全字段',
|
|
5446
5466
|
placeholder: '搜索维度、字段或工具名称', onChange: (event) => setFieldQuery(event.target.value) })),
|
package/lib/qcc-field-catalog.js
CHANGED
|
@@ -102,8 +102,16 @@ export const QCC_FIELD_CATALOG = Object.freeze([
|
|
|
102
102
|
field('registered_address', '注册地址', { defaultSelected: true }),
|
|
103
103
|
field('mailing_address', '通信地址'),
|
|
104
104
|
field('region', '所属地区', { matchAuxiliary: true }),
|
|
105
|
+
field('province', '省份', { sourcePath: '地区信息.省份' }),
|
|
106
|
+
field('city', '城市', { sourcePath: '地区信息.城市' }),
|
|
107
|
+
field('district', '区域', { sourcePath: '地区信息.区域' }),
|
|
108
|
+
field('area_code', '地区代码', { sourcePath: '地区信息.地区代码' }),
|
|
105
109
|
field('business_scope', '经营范围'),
|
|
106
110
|
field('industry_category', '国标行业'),
|
|
111
|
+
field('industry_section', '国标行业门类', { sourcePath: '国标行业.门类' }),
|
|
112
|
+
field('industry_large', '国标行业大类', { sourcePath: '国标行业.大类' }),
|
|
113
|
+
field('industry_middle', '国标行业中类', { sourcePath: '国标行业.中类' }),
|
|
114
|
+
field('industry_small', '国标行业小类', { sourcePath: '国标行业.小类' }),
|
|
107
115
|
field('operating_period', '营业期限'),
|
|
108
116
|
field('company_size', '人员规模'),
|
|
109
117
|
field('insured_count', '参保人数'),
|
|
@@ -111,6 +119,12 @@ export const QCC_FIELD_CATALOG = Object.freeze([
|
|
|
111
119
|
], { releaseBatch: 'current' }),
|
|
112
120
|
group('company_profile', '企业简介', 'get_company_profile', [
|
|
113
121
|
field('qcc_industry', '企查查行业'),
|
|
122
|
+
field('qcc_industry_level1', '企查查行业一级', { sourcePath: '企查查行业.一级' }),
|
|
123
|
+
field('qcc_industry_level2', '企查查行业二级', { sourcePath: '企查查行业.二级' }),
|
|
124
|
+
field('qcc_industry_level3', '企查查行业三级', { sourcePath: '企查查行业.三级' }),
|
|
125
|
+
field('qcc_industry_level4', '企查查行业四级', { sourcePath: '企查查行业.四级' }),
|
|
126
|
+
field('main_products', '主营产品', { sourcePath: '主营产品' }),
|
|
127
|
+
field('company_scale', '企业规模', { sourcePath: '企业规模' }),
|
|
114
128
|
field('company_profile', '企业简介'),
|
|
115
129
|
field('industry_chain_overview', '产业链概览'),
|
|
116
130
|
], { releaseBatch: 'current' }),
|
package/lib/qcc.js
CHANGED
|
@@ -375,8 +375,16 @@ export function mapRegistrationFields(value, fallback = {}) {
|
|
|
375
375
|
registered_address: text('注册地址', '住所', '经营场所'),
|
|
376
376
|
mailing_address: text('通信地址'),
|
|
377
377
|
region: text('所属地区'),
|
|
378
|
+
province: coreFieldText(value.地区信息?.省份),
|
|
379
|
+
city: coreFieldText(value.地区信息?.城市),
|
|
380
|
+
district: coreFieldText(value.地区信息?.区域),
|
|
381
|
+
area_code: coreFieldText(value.地区信息?.地区代码),
|
|
378
382
|
business_scope: text('经营范围'),
|
|
379
|
-
industry_category:
|
|
383
|
+
industry_category: industryDisplay(value.国标行业, ['门类', '大类', '中类', '小类']),
|
|
384
|
+
industry_section: coreFieldText(value.国标行业?.门类),
|
|
385
|
+
industry_large: coreFieldText(value.国标行业?.大类),
|
|
386
|
+
industry_middle: coreFieldText(value.国标行业?.中类),
|
|
387
|
+
industry_small: coreFieldText(value.国标行业?.小类),
|
|
380
388
|
operating_period: text('营业期限', '经营期限'),
|
|
381
389
|
company_size: text('人员规模'),
|
|
382
390
|
insured_count: text('参保人数'),
|
|
@@ -384,16 +392,36 @@ export function mapRegistrationFields(value, fallback = {}) {
|
|
|
384
392
|
};
|
|
385
393
|
}
|
|
386
394
|
|
|
395
|
+
// Explicit leaves only: old flat text must not be guessed into industry levels.
|
|
396
|
+
function coreFieldText(value) {
|
|
397
|
+
return typeof value === 'string' || typeof value === 'number' ? String(value) : '';
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function industryDisplay(value, levels) {
|
|
401
|
+
if (!isRecord(value)) return coreFieldText(value);
|
|
402
|
+
return levels.map(level => {
|
|
403
|
+
const text = coreFieldText(value[level]);
|
|
404
|
+
return text.trim() ? `${level}:${text}` : '';
|
|
405
|
+
}).filter(Boolean).join(';');
|
|
406
|
+
}
|
|
407
|
+
|
|
387
408
|
export function mapProfileFields(value) {
|
|
388
409
|
if (!isRecord(value)) {
|
|
389
410
|
throw new QccBridgeError('QCC_CONTRACT_MISMATCH', 'QCC profile tool returned a non-object result');
|
|
390
411
|
}
|
|
391
412
|
if (value.无匹配项 !== undefined) return {};
|
|
392
413
|
return {
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
414
|
+
qcc_industry: industryDisplay(value.企查查行业, ['一级', '二级', '三级', '四级']),
|
|
415
|
+
qcc_industry_level1: coreFieldText(value.企查查行业?.一级),
|
|
416
|
+
qcc_industry_level2: coreFieldText(value.企查查行业?.二级),
|
|
417
|
+
qcc_industry_level3: coreFieldText(value.企查查行业?.三级),
|
|
418
|
+
qcc_industry_level4: coreFieldText(value.企查查行业?.四级),
|
|
419
|
+
main_products: Array.isArray(value.主营产品)
|
|
420
|
+
? value.主营产品.filter(item => typeof item === 'string' && item.trim()).join(';')
|
|
421
|
+
: coreFieldText(value.主营产品),
|
|
422
|
+
company_scale: coreFieldText(value.企业规模),
|
|
423
|
+
company_profile: coreFieldText(value.企业简介 ?? value.简介),
|
|
424
|
+
industry_chain_overview: coreFieldText(value.产业链概览),
|
|
397
425
|
};
|
|
398
426
|
}
|
|
399
427
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-data-cleaning-agent",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.17",
|
|
4
4
|
"description": "Data cleaning and data enrichment for CSV/XLSX/JSON enterprise lists in DeepSeek Harness, including spreadsheet cleaning, deduplication, profiling, optional Qichacha MCP and exports.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"./package.json": "./package.json"
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
|
+
"docs/CORE-FIELDS-20260918.md",
|
|
13
14
|
"lib",
|
|
14
15
|
"cordis.patch.yml",
|
|
15
16
|
"README.md",
|