From d8cd74b0d6214f827a578d5075a20999079f99e1 Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Tue, 1 Sep 2026 06:32:07 +0800 Subject: [PATCH] commit --- .../api-docs-reorg/issues/04-execute-reorg.md | 16 +- .scratch/api-docs-reorg/map.md | 3 +- .scratch/api-docs-reorg/tmp_app_run.log | Bin 0 -> 70424 bytes .scratch/api-docs-reorg/tmp_close_ticket.py | 56 + .scratch/api-docs-reorg/tmp_knife4j_check.py | 43 + .scratch/api-docs-reorg/tmp_mvn_test.log | Bin 0 -> 647210 bytes .scratch/api-docs-reorg/tmp_patch_adr0024.py | 29 + .scratch/api-docs-reorg/tmp_reorg_audit.py | 4 +- .scratch/api-docs-reorg/tmp_tree_dump.py | 20 + .scratch/api-docs-reorg/tmp_verify_tree.py | 57 + .scratch/api-docs-reorg/tmp_write_readmes.py | 205 + .scratch/lanhu-latest/dump-2-4-selects.mjs | 41 + .scratch/lanhu-latest/dump-form-section.mjs | 33 + .../lanhu-latest/extract-2-4-annotations.mjs | 17 + .scratch/lanhu-latest/extract-annotations.mjs | 22 + .../lanhu-latest/fetch-v29-customer-pages.mjs | 75 + .scratch/lanhu-latest/list-a3-pages.mjs | 8 + .scratch/lanhu-latest/list-customer-pages.mjs | 18 + .scratch/lanhu-latest/list-u665-fields.mjs | 19 + ...-1-1-1_(个人)商机详情_概览.txt | 343 + ...2(个人)商机详情_客户信息.txt | 198 + .../v29-customer-pages/a3-1-1-1-3-1______.txt | 403 + ...-1-3(个人)商机详情_方案卡.txt | 297 + .../a3-1-1-2-1__新增_编辑商机.txt | 302 + .../a3-1-1-2-1_form-dump.txt | Bin 0 -> 59702 bytes .../v29-customer-pages/a3-1-1-2-1_raw.html | 6583 +++++++++++++++++ .../v29-customer-pages/a3-1-1-2-2_____.txt | 397 + .../v29-customer-pages/a3-1-1-2-3_______.txt | 343 + .../v29-customer-pages/a3-1-1-2-4________.txt | 252 + .../v29-customer-pages/a3-1-1-2-4_raw.html | 3832 ++++++++++ .../a3-1-1_销售机会列表.txt | 334 + .../a4-4-1_客户详情(客户信息).txt | 223 + ...块前置客户接口依赖分析报告.md | 205 + docs/adr/0024-bruno-docs-grouping-by-menu.md | 11 + logs/crm-app.log | 181 + logs/t04-run.log | 1 + 36 files changed, 14566 insertions(+), 5 deletions(-) create mode 100644 .scratch/api-docs-reorg/tmp_app_run.log create mode 100644 .scratch/api-docs-reorg/tmp_close_ticket.py create mode 100644 .scratch/api-docs-reorg/tmp_knife4j_check.py create mode 100644 .scratch/api-docs-reorg/tmp_mvn_test.log create mode 100644 .scratch/api-docs-reorg/tmp_patch_adr0024.py create mode 100644 .scratch/api-docs-reorg/tmp_tree_dump.py create mode 100644 .scratch/api-docs-reorg/tmp_verify_tree.py create mode 100644 .scratch/api-docs-reorg/tmp_write_readmes.py create mode 100644 .scratch/lanhu-latest/dump-2-4-selects.mjs create mode 100644 .scratch/lanhu-latest/dump-form-section.mjs create mode 100644 .scratch/lanhu-latest/extract-2-4-annotations.mjs create mode 100644 .scratch/lanhu-latest/extract-annotations.mjs create mode 100644 .scratch/lanhu-latest/fetch-v29-customer-pages.mjs create mode 100644 .scratch/lanhu-latest/list-a3-pages.mjs create mode 100644 .scratch/lanhu-latest/list-customer-pages.mjs create mode 100644 .scratch/lanhu-latest/list-u665-fields.mjs create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-1-1_(个人)商机详情_概览.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-1-2(个人)商机详情_客户信息.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-1-3-1______.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-1-3(个人)商机详情_方案卡.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-1__新增_编辑商机.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-1_form-dump.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-1_raw.html create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-2_____.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-3_______.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4________.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4_raw.html create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a3-1-1_销售机会列表.txt create mode 100644 .scratch/lanhu-latest/v29-customer-pages/a4-4-1_客户详情(客户信息).txt create mode 100644 .scratch/opp-customer-dependency/商机模块前置客户接口依赖分析报告.md diff --git a/.scratch/api-docs-reorg/issues/04-execute-reorg.md b/.scratch/api-docs-reorg/issues/04-execute-reorg.md index 3d80267..2be2911 100644 --- a/.scratch/api-docs-reorg/issues/04-execute-reorg.md +++ b/.scratch/api-docs-reorg/issues/04-execute-reorg.md @@ -1,7 +1,7 @@ # 04 文档仓重排执行落地 Type: task -Status: claimed +Status: resolved Blocked by: 01, 03 ## Question @@ -17,4 +17,16 @@ Blocked by: 01, 03 ## Answer - +## Answer + +**(2026-08-31 解决;t1-t9 旧机会话完成,t10-t12 换机后续跑收尾,全绿关票。)** + +1. **源码 tags 重构(完成)**:25 个 Controller 按映射表 §2 逐行落地(类级 @Tag 改全路径 / 方法级 @Operation(tags) 深路径 / LeadPool 5 端点双值 tags / SystemController 10 端点补显式 tag / Query 收敛 6→3 / Collab+Sub 分挂),Grep 复核旧前缀零残留。回归:`mvn test` 全仓 **873 测试 0 失败 0 错误**(base 38 / file 84 / auth 210 / dict 51 / rule 134 / preference 16 / lead 131 / opportunity 209),BUILD SUCCESS。 +2. **文档仓重建(完成)**:§4 git-mv 清单全部落地;空分区 A1 / A1X / A4 / A5 / A6 folder.bru 占位(seq 2/3/6/7/8);公共依赖合并(文件 + 行政区划);调试(验证专用) 保留顶层。全量对账(tmp_reorg_audit.py,本机复跑):**src keys 196 / doc keys 196,双向差集均 0**。 +3. **分区索引 README(完成)**:生成方式落地裁决 = **手写**(叙述性导航,bruno-sync 不生成 README,人工维护)。11 个分区 README.md 已落盘:已落地 .bru 清单按二级目录列 + 空缺标注 + 对接工程师示位,空分区只写占位说明。文档仓 git status = 恰 11 个 untracked README。 +4. **ADR-0024 修订(完成)**:文末追加「修订(2026-08-31,api-docs-reorg effort)」段——一级对齐 v29 权威树(引用 lanhu-tree-v29.md)、深 tag 纪律、商机规则归 A7 与线索规则双归属、URL 回退关闭、双归属 = 方法级多值 tags、新接口挂载纪律,另记机制联动(生成器家族退役 / menuBindings 前缀 / 文档仓换机路径)。回读逐字一致、无 BOM。 +5. **机制联动(完成)**:bruno-sync.config.json menuBindings 四键前缀换 `A2 线索管理/…`(viewType/scopeKey 未动);手工生成器家族(gen_bruno.py / gen_opp_*.py / gen_v2_*.py / bru_lib.py)退役留档;bruno-sync 注解驱动通道为唯一权威机制。 +6. **验收(通过)**:§6 基线目录树逐目录对照全 OK(38 目录计数一致 + 5 空分区 folder.bru/README 齐 + 接口 .bru 总数 196 = 191 + 5 LeadPool 副本);knife4j 抽查(起 crm-app 取 /v3/api-docs):`A0 登录界面` / `A3 商机管理/商机详情/客户` / `A7 后台管理/权限管理/角色管理` / `公共依赖/文件` 4 组 + LeadPool 5 端点双归属 tags 全部命中;按分区索引 README 即可确认各分区接口全集与空缺状态(A7 分区空缺:客户规则 / 项目规则 / 日志管理)。 + +遗留提醒(不阻塞关票):`A7 后台管理/权限点管理/资源树列表.bru` url 行为历史绝对地址,对账脚本已归一化识别;下次 bruno-sync 真跑时按「结构听源码」patch 为 `{{baseUrl}}` 形式。换机注记:对账脚本 REPO/DOCS 常量已改本机路径;bruno-sync.local.json = `{"docsRepoPath": "e:/code/crm-api-docs"}`;两仓改动均未提交,由用户审查后自行 commit。 + diff --git a/.scratch/api-docs-reorg/map.md b/.scratch/api-docs-reorg/map.md index 71d7846..60bed08 100644 --- a/.scratch/api-docs-reorg/map.md +++ b/.scratch/api-docs-reorg/map.md @@ -38,10 +38,11 @@ Label: wayfinder:map - [线索规则接口归属裁决](issues/02-lead-rule-home.md) — 线索公海池接口(LeadPoolController,/api/rule/pool/*)**双归属**:A2 线索管理/线索设置(主本)+ A7 后台管理/线索规则(副本);两份必须由生成器从同一 tag 幂等双输出。依据:A7-3-1 原型页是 A2-1-5 的引用副本(面包屑与数据逐字相同),两页消费同一组接口。 - [一级目录改造机制选型](issues/01-mechanism-choice.md) — **候选 1:A 区路径进源码 tags**。tag = 完整页面路径(深 tag,最深 4 级);双归属用方法级多值 `@Operation(tags)` 原生表达(票内「@Tag 单值无法双归属」断言经勘误不成立);类级 `@Tag` 与方法级 tags 互斥使用;URL 回退通道关闭(无 tag 端点全补显式深 tag,`system/` 游离目录消灭);bruno-sync 身份映射为唯一权威通道,swagger 同步 A 区分组;手工生成器家族退役;现有 .bru 表述经「git-mv 先行 + bruno-sync 对账」保留。 - [蓝湖一级目录树冻结与全量接口映射表](issues/03-mapping-table.md) — 两工件落盘:[lanhu-tree-v29.md](lanhu-tree-v29.md)(A0-A7 权威树 + v20→v29 差异 7 条)与 [mapping-table.md](mapping-table.md)(161 端点 ↔ 191 .bru **双向零孤儿**;25 控制器 tag 重构表、端点级明细、git-mv 清单、menuBindings 改名、验收基线目录树、判断点 7 条)。部门管理归属为判断行,执行时可调整。 +- [04 文档仓重排执行落地](issues/04-execute-reorg.md) — **resolved(2026-08-31,换机续跑 t10-t12 收尾)**:25 Controller 深 tag 重构 + menuBindings 四键换前缀;文档仓 A 区一级重排(git-mv / 空分区占位 / LeadPool 双归属副本);11 分区索引 README(手写人工维护);ADR-0024 追加 2026-08-31 修订段。验收:对账 196/196 双向零差、§6 基线 38 目录逐项一致、knife4j 抽查 4 组 + LeadPool 双归属全 OK、全仓 873 单测 0 失败。文档仓路径换机后为 `E:\code\crm-api-docs`。 ## Not yet specified -- 分区索引 README 的生成方式与更新纪律(手写 vs 小脚本幂等产出;bruno-sync 本身不生成 README)——执行票落地时定。 +- (已随票 04 落地解决,2026-08-31)分区索引 README:11 个分区手写落盘、人工维护,bruno-sync 不生成;更新纪律 = 分区接口落地/变化后人工同步 README 清单与空缺标注。 (原雾区三项随票 01 毕业并入执行票 04 清单:menuBindings 四键前缀同步、空分区占位形态 = folder.bru + README 手工放置、swagger 验收口径 = knife4j 分组即深 tag 原文。) diff --git a/.scratch/api-docs-reorg/tmp_app_run.log b/.scratch/api-docs-reorg/tmp_app_run.log new file mode 100644 index 0000000000000000000000000000000000000000..ede95401677c67cf30da250edcbcd606321f252c GIT binary patch literal 70424 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 V)gx^ieP;d}y_S {got} (期望 {expect})') +# 双归属抽查:LeadPool 5 端点应同时挂两个 tag +pool = [p for p in paths if p.startswith('/api/rule/pool/')] +for p in sorted(pool): + for m, node in paths[p].items(): + if m in ('get', 'post', 'put', 'delete', 'patch'): + got = node.get('tags', []) + hit = ('A2 线索管理/线索设置' in got) and ('A7 后台管理/线索规则' in got) + ok = ok and hit + print(f'{"OK " if hit else "DIFF"} {m.upper()} {p} -> {got}') +print('RESULT:', 'ALL MATCH' if ok else 'HAS DIFF') diff --git a/.scratch/api-docs-reorg/tmp_mvn_test.log b/.scratch/api-docs-reorg/tmp_mvn_test.log new file mode 100644 index 0000000000000000000000000000000000000000..d709eab1f6617e450fb5492cecab46ff98c990d1 GIT binary patch literal 647210 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 N4>CV*Z{ySZ{{a`bg53ZB literal 0 HcmV?d00001 diff --git a/.scratch/api-docs-reorg/tmp_patch_adr0024.py b/.scratch/api-docs-reorg/tmp_patch_adr0024.py new file mode 100644 index 0000000..94e7d9a --- /dev/null +++ b/.scratch/api-docs-reorg/tmp_patch_adr0024.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# 票 04 / t11:ADR-0024 文末追加 2026-08-31 修订段(六要点 + 机制联动),回读校验 +import sys, io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') +TARGET = r'E:\code\crm-backend-matt\docs\adr\0024-bruno-docs-grouping-by-menu.md' + +SECTION = """## 修订(2026-08-31,api-docs-reorg effort) + +**一级目录对齐蓝湖原型 A 区**:v29 快照(2026-08-31)冻结为权威树(`.scratch/api-docs-reorg/lanhu-tree-v29.md`),文档仓一级目录改为 A0 登录界面 / A1 销售工作台(首页)/ A1X 工作计划 / A2 线索管理 / A3 商机管理 / A4 客户管理 / A5 项目管理 / A6 数据看板 / A7 后台管理 / 公共依赖 / 调试(验证专用),与原型 A 区分区一一对应;二级及更深目录不做重排。 + +1. **深 tag 纪律**:tag = 完整页面路径——一级 = 分区原文,二级 = 页面,更深 = 页面内分组(最深 4 级,如 `A7 后台管理/商机规则/公海规则`)。tag 原文即文档目录路径(bruno-sync 身份映射),swagger/knife4j 分组同构。决策 2 的 `menuBindings`(viewType/scopeKey 绑定)不变,四键前缀随本修订换为 `A2 线索管理/…`。 +2. **商机规则归 A7**(决策 1 页面归属修正):v29 将 A3-4 商机管理设置整体迁至 A7-3-2 商机规则,后台为唯一入口,阶段模板 / 方案卡模板 / 公海规则三组接口改挂 `A7 后台管理/商机规则/{阶段模板,方案卡模板,公海规则}`。线索规则接口(LeadPoolController)对称裁决为**双归属**:`A2 线索管理/线索设置`(主本,功能页所在)+ `A7 后台管理/线索规则`(副本,A7-3-1 为 A2-1-5 的引用页)。 +3. **双归属 = 方法级多值 `@Operation(tags)`**:单接口挂 N 个 tag 即在 N 个页面文件夹各有一份副本,由 bruno-sync「多值全取」幂等输出,无需生成器特判。 +4. **URL 回退通道关闭**:无 tag 端点不再按 URL 兜底分组——全部端点必须显式挂深 tag(SystemController 10 端点已补挂,`system/` 游离顶级目录消灭);「进集合的端点必挂 tag」成为一眼可审纪律。 +5. **新接口挂载纪律**:新 Controller 一律按页面全路径挂 tag——1:1 页面控制器可用类级 `@Tag`,跨页 / 双归属用方法级多值 tags;类级 `@Tag` 与方法级 `@Operation(tags)` 互斥,并存会因「多值全取」产生双份副本;无真实页面入口的接口不挂页签(2026-08-17 修订纪律延续)。 +6. **机制联动**:bruno-sync 注解驱动通道为唯一权威机制;手工生成器家族(`gen_bruno.py` / `gen_opp_*.py` / `gen_v2_*.py` / `bru_lib.py`)退役留档、不再运行,其 `MENUS` 常量同源义务随之作废;分区索引 README 为人工维护件(bruno-sync 不生成 README)。文档仓现路径 `E:\\code\\crm-api-docs`(2026-08-31 换机记录,前值 `D:\\code\\crm-api-docs` 作废)。 +""" + +txt = open(TARGET, encoding='utf-8').read() +txt = txt.rstrip() +new = txt + '\n\n' + SECTION +with open(TARGET, 'w', encoding='utf-8', newline='\n') as f: + f.write(new) +back = open(TARGET, encoding='utf-8').read() +assert back == new, 'MISMATCH after append' +raw = open(TARGET, 'rb').read() +print('OK appended; total chars=', len(back), ' BOM=', raw[:3] == b'\xef\xbb\xbf') +print('--- tail ---') +print('\n'.join(back.splitlines()[-6:])) diff --git a/.scratch/api-docs-reorg/tmp_reorg_audit.py b/.scratch/api-docs-reorg/tmp_reorg_audit.py index b66939c..96378e0 100644 --- a/.scratch/api-docs-reorg/tmp_reorg_audit.py +++ b/.scratch/api-docs-reorg/tmp_reorg_audit.py @@ -5,8 +5,8 @@ # @PreAuthorize 嵌套括号 / 裸字符串 tags / 无括号 @PostMapping / @Operation 在 @PostMapping 之后 import os, sys, io, re sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') -REPO = r'D:\code\crm-backend-matt' -DOCS = r'D:\code\crm-api-docs' +REPO = r'E:\code\crm-backend-matt' +DOCS = r'E:\code\crm-api-docs' MODS = ['crm-auth','crm-file','crm-lead','crm-opportunity','crm-rule','crm-preference','crm-dict'] BT = chr(96) src = {} diff --git a/.scratch/api-docs-reorg/tmp_tree_dump.py b/.scratch/api-docs-reorg/tmp_tree_dump.py new file mode 100644 index 0000000..38ef70b --- /dev/null +++ b/.scratch/api-docs-reorg/tmp_tree_dump.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# t10 前置:导出文档仓明细树(目录 → folder.bru 有无 → .bru 名清单),供分区 README 撰写 +import os, sys, io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') +DOCS = r'E:\code\crm-api-docs' + +rows = [] +for dp, dns, fns in os.walk(DOCS): + dns[:] = [d for d in dns if d.lower() != 'environments' and d != '.git'] + rel = os.path.relpath(dp, DOCS).replace('\\', '/') + brus = sorted(fn for fn in fns if fn.endswith('.bru') and fn not in ('folder.bru', 'collection.bru')) + rows.append((rel, 'folder.bru' in fns, brus)) + +rows.sort() +for rel, has_folder, brus in rows: + depth = 0 if rel == '.' else rel.count('/') + 1 + indent = '' if rel == '.' else ' ' * depth + print(f'{indent}{rel} [folder.bru={has_folder}] [n={len(brus)}]') + for b in brus: + print(f'{indent} {b}') diff --git a/.scratch/api-docs-reorg/tmp_verify_tree.py b/.scratch/api-docs-reorg/tmp_verify_tree.py new file mode 100644 index 0000000..94f4844 --- /dev/null +++ b/.scratch/api-docs-reorg/tmp_verify_tree.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# 票 04 / t12 验收:文档仓目录树 ↔ mapping-table §6 基线 逐目录 .bru 数对照 +import os, sys, io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') +DOCS = r'E:\code\crm-api-docs' + +BASELINE = { + 'A0 登录界面': 5, + 'A2 线索管理/我的关注': 10, 'A2 线索管理/我的线索': 14, 'A2 线索管理/线索公海': 12, + 'A2 线索管理/线索管理': 15, 'A2 线索管理/线索设置': 5, + 'A3 商机管理/商机公海': 1, 'A3 商机管理/商机公海/看板列表': 2, + 'A3 商机管理/商机管理': 1, 'A3 商机管理/商机管理/看板列表': 2, + 'A3 商机管理/商机详情/主体': 9, 'A3 商机管理/商机详情/勘察': 3, + 'A3 商机管理/商机详情/团队': 4, 'A3 商机管理/商机详情/客户': 4, + 'A3 商机管理/商机详情/工作计划': 4, 'A3 商机管理/商机详情/方案卡': 5, + 'A3 商机管理/商机详情/日志': 1, 'A3 商机管理/商机详情/跟进': 3, + 'A3 商机管理/商机详情/附件': 3, 'A3 商机管理/新建商机': 2, + 'A3 商机管理/状态流转': 11, 'A3 商机管理/销售机会': 1, + 'A3 商机管理/销售机会/看板列表': 2, 'A3 商机管理/销售机会/自定义视图': 4, + 'A7 后台管理/商机规则/公海规则': 8, 'A7 后台管理/商机规则/方案卡模板': 9, + 'A7 后台管理/商机规则/阶段模板': 8, 'A7 后台管理/数据字典-分组': 5, + 'A7 后台管理/数据字典-字典项': 7, 'A7 后台管理/权限点管理': 4, + 'A7 后台管理/权限管理/角色管理': 6, 'A7 后台管理/用户管理': 4, + 'A7 后台管理/线索规则': 5, 'A7 后台管理/运维': 2, 'A7 后台管理/部门管理': 3, + '公共依赖/文件': 9, '公共依赖/行政区划': 2, + '调试(验证专用)': 1, +} +EMPTY = ['A1 销售工作台(首页)', 'A1X 工作计划', 'A4 客户管理', 'A5 项目管理', 'A6 数据看板'] + +actual = {} +for dp, dns, fns in os.walk(DOCS): + dns[:] = [d for d in dns if d.lower() != 'environments' and d != '.git'] + rel = os.path.relpath(dp, DOCS).replace('\\', '/') + if rel == '.': + continue + n = sum(1 for fn in fns if fn.endswith('.bru') and fn not in ('folder.bru', 'collection.bru')) + if n or rel in BASELINE or rel in EMPTY: + actual[rel] = n + +ok = True +for k in sorted(set(BASELINE) | set(actual)): + b, a = BASELINE.get(k), actual.get(k, 0) + flag = 'OK ' if b == a else 'DIFF' + if b != a: + ok = False + print(f'{flag} {k}: baseline={b} actual={a}') +for d in EMPTY: + p = os.path.join(DOCS, d, 'folder.bru') + r = os.path.join(DOCS, d, 'README.md') + print(f'{"OK " if os.path.isfile(p) and os.path.isfile(r) else "DIFF"} 空分区 {d}: folder.bru={os.path.isfile(p)} README={os.path.isfile(r)}') + if not (os.path.isfile(p) and os.path.isfile(r)): + ok = False +total = sum(actual.values()) +print(f'total .bru (接口文件) = {total} (期望 196 = 191 + 5 LeadPool 副本)') +if total != 196: + ok = False +print('RESULT:', 'ALL MATCH' if ok else 'HAS DIFF') diff --git a/.scratch/api-docs-reorg/tmp_write_readmes.py b/.scratch/api-docs-reorg/tmp_write_readmes.py new file mode 100644 index 0000000..3ce6a13 --- /dev/null +++ b/.scratch/api-docs-reorg/tmp_write_readmes.py @@ -0,0 +1,205 @@ +# -*- coding: utf-8 -*- +# 票 04 / t10:11 个分区索引 README 程序化落盘(文档仓在 workspace 外,Bash+python 写入) +# 自校验:写后回读逐字比对,任何丢载荷当场报错 +import os, sys, io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') +DOCS = r'E:\code\crm-api-docs' + +FOOTER = ( + "\n---\n\n" + "> 维护纪律:本 README 为人工维护的分区索引;`.bru` 接口文件由 bruno-sync 依据后端 " + "Controller tag 自动同步(只动带 `generated` 标记的文件,结构听源码、表述听人),请勿手改。" + "新接口按页面全路径挂 tag 即自动归位对应目录;一级目录与蓝湖原型 A 区分区一一对应," + "二级及更深目录不做重排。\n" +) + +READMES = {} + +READMES['A0 登录界面'] = """# A0 登录界面 + +> 对应蓝湖原型「A0 登录界面」分区(A0-1 登录、A0-3 个人信息)。 + +## 已落地接口(5 个,均在分区根目录) + +- 钉钉登录 —— 钉钉扫码登录 +- 确认顶号登录 —— 单设备登录顶号后的确认 +- 注销 —— 退出登录 +- 获取当前用户信息 —— 登录态下取当前用户 +- 菜单树 —— 登录后拉取前端菜单树(随原「登录」分组整体并入本分区) + +## 空缺标注 + +- A0-1 登录页:接口已齐。 +- A0-3 个人信息页:暂无独立接口目录,当前用户信息经「获取当前用户信息」获取。 + +## 对接工程师示位 + +负责登录页与全局壳(菜单 / 当前用户)的前端工程师只对接本分区 5 个接口;其余全部业务接口均需登录后携带 token 调用。 +""" + +READMES['A1 销售工作台(首页)'] = """# A1 销售工作台(首页) + +> 对应蓝湖原型「A1 销售工作台(首页)」分区(A1-1 工作台、A1-2 消息中心)。 + +**占位分区:暂无接口落地。** 原型两页对应的后端接口尚未开发;接口落地后由 bruno-sync 按源码 tag 自动同步至本分区,并同步更新本 README。 +""" + +READMES['A1X 工作计划'] = """# A1X 工作计划 + +> 对应蓝湖原型「A1X 工作计划」分区(v29 新增:A1X-1 工作日历、A1X-2 计划管理、A1X-3 出差与拜访)。 + +**占位分区:暂无接口落地。** 原型页面为 v29 新增,后端接口尚未开发。 + +注意:现有「工作计划」类接口(新增 / 编辑 / 删除 / 列表)当前归属商机详情页,见 `A3 商机管理/商机详情/工作计划/`;A1X 页面联调如需独立的工作计划接口,另行裁决挂载。 +""" + +READMES['A2 线索管理'] = """# A2 线索管理 + +> 对应蓝湖原型「A2 线索管理」分区(A2-1 线索:公海 / 我的线索 / 我的关注 / 线索管理 / 线索设置)。 + +## 已落地接口(56 个 / 5 个页面目录) + +- **我的线索/**(14):新建线索、编辑线索、删除线索、转商机、释放线索、批量释放、提交反馈、保存反馈草稿、线索分页、线索详情、历史记录、视图统计卡片、读取列偏好、保存列偏好 +- **线索公海/**(12):领取线索、批量领取、关注线索、批量关注、取消关注、释放线索、线索分页、线索详情、历史记录、视图统计卡片、读取列偏好、保存列偏好 +- **我的关注/**(10):领取线索、批量领取、取消关注、批量取关、线索分页、线索详情、历史记录、视图统计卡片、读取列偏好、保存列偏好 +- **线索管理/**(15):新建线索、激活线索、批量激活、分配线索到池、批量分配到池、分配线索到销售、批量分配到销售、删除线索、批量删除、线索分页、线索详情、历史记录、视图统计卡片、读取列偏好、保存列偏好 +- **线索设置/**(5):公海池分页列表、公海池详情、新建编辑公海池、删除公海池、批量删除公海池 + +## 空缺标注 + +无 —— 原型 A2-1 下五个功能页均有接口落地。 + +## 对接工程师示位 + +线索模块前端按页面目录联调:列表页四选一(我的线索 / 线索公海 / 我的关注 / 线索管理),每个目录内含该页全集(分页、详情、历史、统计卡片与列偏好);公海池配置页用「线索设置」。同一接口出现在多个目录是按页面归属的多副本(内容一致),取所在页面那份联调即可。「线索设置」在 `A7 后台管理/线索规则/` 另有后台入口副本(双归属,同源自动同步)。 +""" + +READMES['A3 商机管理'] = """# A3 商机管理 + +> 对应蓝湖原型「A3 商机管理」分区(A3-0 最近访问 / A3-1 销售机会 / A3-2 商机管理 / A3-3 商机公海 + 说明页)。 + +## 已落地接口(62 个) + +- **新建商机/**(2):新建商机、可关联线索下拉 +- **销售机会/**(1):商机分页 + - 销售机会/看板列表/(2):看板阶段卡片、看板阶段汇总 + - 销售机会/自定义视图/(4):自定义视图列表、保存自定义视图、删除自定义视图、设为默认视图 +- **商机管理/**(1):商机分页 + - 商机管理/看板列表/(2):看板阶段卡片、看板阶段汇总 +- **商机公海/**(1):商机分页 + - 商机公海/看板列表/(2):看板阶段卡片、看板阶段汇总 +- **状态流转/**(11):领取商机、批量领取、分配商机、批量分配、移交商机、抛公海、暂缓、取消暂缓、关闭商机、批量关闭、重启商机 +- **商机详情/**(根目录无文件,接口全在子目录) + - 主体/(9):商机详情、编辑商机、切换阶段、阶段推进历史、阶段推进指引、关注商机、批量关注、取关商机、上报访问 + - 客户/(4):客户列表、候选客户搜索、添加关联客户、设为主要意向客户 + - 团队/(4):团队成员列表、批量添加团队成员、移除团队成员、编辑团队成员 + - 方案卡/(5):方案卡列表、方案卡详情、保存方案卡、提交方案卡、可选模板版本 + - 跟进/(3):新增跟进、删除跟进、跟进分页 + - 附件/(3):新增附件、删除附件、附件列表 + - 日志/(1):操作日志分页 + - 勘察/(3):新增勘察、删除勘察、勘察分页 + - 工作计划/(4):新增工作计划、编辑工作计划、删除工作计划、工作计划列表 + +## 空缺标注 + +无 —— 原型 A3 各功能页均有接口落地。说明:原型「A3-0 最近访问」复用销售机会分页端点(viewType=RECENT),不设独立接口目录。 + +## 对接工程师示位 + +商机模块前端按页面目录联调:三个列表页(销售机会 / 商机管理 / 商机公海)各自含分页与看板子目录;商机详情页接口集中在「商机详情/」下按页签分目录(主体 / 客户 / 团队 / 方案卡 / 跟进 / 附件 / 日志 / 勘察 / 工作计划);商机全生命周期操作(领取 / 分配 / 移交 / 关闭等)在「状态流转/」。 +""" + +READMES['A4 客户管理'] = """# A4 客户管理 + +> 对应蓝湖原型「A4 客户管理」分区(A4-1 客户公海 / A4-2 客户总览 / A4-3 我的客户 / A4-4 客户详情 / A4-5 联系人 / A4-6 客户查重 / A4-7 客户交割)。 + +**占位分区:暂无接口落地。** 原型七个页面组对应的后端接口尚未开发;接口落地后由 bruno-sync 按源码 tag 自动同步至本分区,并同步更新本 README。 +""" + +READMES['A5 项目管理'] = """# A5 项目管理 + +> 对应蓝湖原型「A5 项目管理」分区(A5-1 项目管理:看板 / 分屏 / 列表视图、我的项目、项目统计)。 + +**占位分区:暂无接口落地。** 原型页面对应的后端接口尚未开发;接口落地后由 bruno-sync 按源码 tag 自动同步至本分区,并同步更新本 README。 +""" + +READMES['A6 数据看板'] = """# A6 数据看板 + +> 对应蓝湖原型「A6 数据看板」分区(A6-1 数据看板:运营看板 / 客户看板 / 营销看板)。 + +**占位分区:暂无接口落地。** 原型三个看板对应的后端接口尚未开发;接口落地后由 bruno-sync 按源码 tag 自动同步至本分区,并同步更新本 README。 +""" + +READMES['A7 后台管理'] = """# A7 后台管理 + +> 对应蓝湖原型「A7 后台管理」分区(A7-1 用户管理 / A7-2 权限管理 / A7-3 业务规则 / A7-4 日志管理 / A7-5 系统设置)。 + +## 已落地接口(61 个) + +- **用户管理/**(4):用户分页、用户统计、分配用户角色、分配用户部门 +- **部门管理/**(3):部门树、保存部门、删除部门 +- **权限管理/角色管理/**(6):角色分页、角色详情、新增编辑角色、删除角色、分配角色权限、可配数据权限模块 +- **权限点管理/**(4):资源树列表、新增编辑资源节点、删除资源节点、上传图标 +- **线索规则/**(5):公海池分页列表、公海池详情、新建编辑公海池、删除公海池、批量删除公海池(`A2 线索管理/线索设置/` 的后台入口副本,双归属同源同步) +- **商机规则/公海规则/**(8):公海规则分页、公海规则详情、保存公海规则草稿、发布公海规则、停用公海规则、删除公海规则、复制公海规则、公海规则版本列表 +- **商机规则/方案卡模板/**(9):方案卡模板分页、方案卡模板详情、保存方案卡模板草稿、发布方案卡模板、停用方案卡模板、删除方案卡模板、复制方案卡模板、方案卡模板版本列表、系统字段库列表 +- **商机规则/阶段模板/**(8):阶段模板分页、阶段模板详情、保存阶段模板草稿、发布阶段模板、停用阶段模板、删除阶段模板、复制阶段模板、阶段模板版本列表 +- **数据字典-分组/**(5):分组分页、新建编辑分组、分组启停、删除分组、启用分组列表 +- **数据字典-字典项/**(7):字典项分页、新建编辑字典项、字典项启停、设为默认项、删除字典项、强制删除字典项、启用项列表 +- **运维/**(2):管理员角色配置、钉钉组织同步 + +## 空缺标注 + +- A7-3 业务规则的「客户规则」「项目规则」两页暂无接口。 +- A7-4 日志管理(用户操作日志 / 登录日志 / 批量操作日志)暂无接口。 + +## 对接工程师示位 + +后台管理端前端按二级目录联调:用户 / 部门 / 权限(角色 + 权限点)为账号权限体系;商机规则三目录对应原型 A7-3-2(自 v29 起由 A3 迁入,后台为唯一入口);数据字典两目录对应 A7-5-1;「运维」含管理员角色配置与钉钉组织同步(对应 A7-1-2 同步任务)。部门管理无独立原型页,接口供用户管理「分配部门」与数据权限配置消费。 +""" + +READMES['公共依赖'] = """# 公共依赖 + +> 跨业务模块共用的基础资源接口(文件、行政区划),供各分区页面组合调用。 + +## 已落地接口(11 个) + +- **文件/**(9):直传上传、分片初始化、上传分片、完成分片、删除文件、下载文件、文件详情、预览地址、缩略图 +- **行政区划/**(2):按层级查区划、按上级查子区划 + +## 空缺标注 + +无 —— 文件与行政区划即当前全部公共资源。 + +## 对接工程师示位 + +不需要单独对接本分区;各业务页面(附件上传 / 下载 / 预览、地址选择等)按需引用。文件接口含直传与分片两条上传通路,在线预览经「预览地址」接口取跳转地址。 +""" + +READMES['调试(验证专用)'] = """# 调试(验证专用) + +> 验证环境专用辅助接口,不对应任何原型页面,生产前端请勿调用。 + +## 已落地接口(1 个) + +- 签发调试token —— 为自动化验证 / 联调签发调试用 token(仅在 verify 运行 profile 下开放) + +## 空缺标注 + +不适用。 +""" + +count = 0 +for d, body in READMES.items(): + path = os.path.join(DOCS, d, 'README.md') + full = body + FOOTER + with open(path, 'w', encoding='utf-8', newline='\n') as f: + f.write(full) + back = open(path, encoding='utf-8-sig').read() # -sig 顺带暴露意外 BOM(BOM 会被读掉但不等于存在) + raw = open(path, 'rb').read() + bom = raw[:3] == b'\xef\xbb\xbf' + if back != full: + raise SystemExit('MISMATCH: ' + path) + print('OK ', d, ' chars=', len(full), ' BOM=', bom) + count += 1 +print('total README files written:', count) diff --git a/.scratch/lanhu-latest/dump-2-4-selects.mjs b/.scratch/lanhu-latest/dump-2-4-selects.mjs new file mode 100644 index 0000000..d21ade4 --- /dev/null +++ b/.scratch/lanhu-latest/dump-2-4-selects.mjs @@ -0,0 +1,41 @@ +// 提取 a3-1-1-2-4 添加关联客户弹窗全部 select 选项 + 快速创建客户区结构 +import fs from 'node:fs'; + +const OSS = 'https://lanhu-axure-file.oss-cn-beijing.aliyuncs.com/'; +const manifest = JSON.parse(fs.readFileSync('e:/code/crm-backend-matt/.scratch/lanhu-latest/axure-v29.json', 'utf8')); +const page = 'a3-1-1-2-4________.html'; +const html = await (await fetch(OSS + manifest.pages[page].html.sign_md5, { headers: { 'User-Agent': 'Mozilla/5.0' } })).text(); +fs.writeFileSync('e:/code/crm-backend-matt/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4_raw.html', html, 'utf8'); + +const decode = (s) => s + .replace(/&#x([0-9A-Fa-f]+);/g, (_, h) => String.fromCodePoint(parseInt(h, 16))) + .replace(/&#(\d+);/g, (_, d) => String.fromCodePoint(parseInt(d, 10))) + .replace(/ /g, ' '); + +// 1) 全部 select 及其选项 +const sels = html.match(/ + + + + + + + + + +
+
+ +
+ + +
+
+
+

查询

+
+
+ + +
+
+
+

重置

+
+
+ + +
+
+
+

+ 新增商机

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+
+

商机 > 销售机会

+
+
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+ + +
+
+ +
+ + +
+ + +
+
+
+

    销售机会

+
+
+ + +
+ + +
+
+ + +
+
+
+

我负责的销售机会  ▾

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

新建商机

+
+
+ + +
+
+
+

项目基础信息

+
+
+ + +
+
+
+

*商机名称

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机来源

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机行业

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机类型

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目阶段

+
+
+ + +
+
+ +
+ + +
+
+
+

*招标形式

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目详细地址

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目区域

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

客户信息

+
+
+ + +
+
+
+

*甲方是否明确

+
+
+ + +
+
+ +
+ + +
+
+
+

甲方名称

+
+
+ + +
+
+
+

商机关键联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*关联客户

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

关键人所在公司

+
+
+ + +
+
+ +
+ + +
+
+
+

客户联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*客户类型

+
+
+ + +
+
+ +
+ + +
+
+
+

*是否主要客户

+
+
+ + +
+
+ +
+ + +
+
+
+

    前端预留:用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入

+
+
+ + +
+ + +
+ + +
+
+
+

确认

+
+
+ + +
+
+
+

取消

+
+
+ + +
+
+
+

*项目属地

+
+
+ + +
+
+ +
+ + +
+
+
+

项目金额

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

编辑商机

+
+
+ + +
+
+
+

项目基础信息

+
+
+ + +
+
+
+

*商机名称

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机来源

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机行业

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机类型

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目阶段

+
+
+ + +
+
+ +
+ + +
+
+
+

*招标形式

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目详细地址

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目区域

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

客户信息

+
+
+ + +
+
+
+

*甲方是否明确

+
+
+ + +
+
+ +
+ + +
+
+
+

甲方名称

+
+
+ + +
+
+ +
+ + +
+
+
+

商机关键联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*关联客户

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

关键人所在公司

+
+
+ + +
+
+ +
+ + +
+
+
+

客户联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*客户角色

+
+
+ + +
+
+ +
+ + +
+
+
+

*是否主要客户

+
+
+ + +
+
+ +
+ + +
+
+
+

    前端预留:用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入

+
+
+ + +
+ + +
+ + +
+
+
+

确认

+
+
+ + +
+
+
+

取消

+
+
+ + +
+
+
+

*项目属地

+
+
+ + +
+
+ +
+ + +
+
+
+

项目金额

+
+
+ + +
+
+ +
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

1、开发说明

+
+
+ + +
+ +
+

【页面名称】

新增 / 编辑商机

 

【进入路径】

新增:CRM系统 > 商机管理 > 销售机会 > 我负责的销售机会 > 新增商机

 

编辑:CRM系统 > 商机管理 > 销售机会 > 商机详情 / 列表操作 > 编辑

 

【页面定位】

本页面用于新增销售机会或修改已有商机信息,包括项目基础信息、客户信息及关联联系人信息。

 

【核心说明】

新增和编辑共用同一套表单结构,通过不同入口进入时切换页面状态。

 

新增状态下,表单展示默认值或空值,用户确认后创建新的商机记录。

 

编辑状态下,系统自动加载当前商机已有数据,用户修改并确认后更新原商机记录,不新增重复数据。

+
+
+ + +
+ + +
+ + +
+ +
+

2、详细说明

+
+
+ + +
+ +
+

1. 页面遮罩区

新增或编辑商机弹窗打开后,底层页面保持展示并增加遮罩,避免用户同时操作背景页面。

 

2. 弹窗标题区

新增状态显示“新增商机”,编辑状态显示“编辑商机”。

 

3. 项目基础信息区

用于录入或修改商机名称、商机来源、商机类型、商机行业、项目阶段、招标形式、项目区域、详细地址、项目属地及项目金额等信息。

 

4. 客户信息区

用于录入或修改甲方信息、关联客户、客户角色、客户联系人及主要客户标记等信息。

 

5. 录入提示区

展示字段填写说明、业务提醒或录入注意事项。

 

6. 底部操作区

展示“取消”和“确认”按钮。

新增状态下用于创建商机,编辑状态下用于保存修改。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-商机_编辑/新增

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

3、字段说明

+
+
+ + +
+ +
+

1. 商机名称

字段类型:文本输入框。

字段说明:填写销售机会或项目名称。

字段规则:必填,不允许仅输入空格。

 

2. 商机来源

字段类型:下拉选择框。

字段说明:选择该商机的来源渠道。

字段规则:必填,选项来源于系统商机来源字典。


2A. 关联线索

字段类型:

 

3. 商机类型

字段类型:下拉选择框。

字段说明:选择商机类型。

字段规则:必填,选项来源于系统商机类型字典。

 

4. 商机行业

字段类型:下拉选择框。

字段说明:选择商机所属行业。

字段规则:必填,选项来源于系统行业字典。

 

5. 项目阶段

字段类型:下拉选择框。

字段说明:选择商机当前所处的业务阶段。

字段规则:必填,选项需与商机推进流程保持一致。

 

6. 招标形式

字段类型:下拉选择框。

字段说明:选择项目的招标或采购形式。

字段规则:必填,选项来源于系统招标形式字典。

 

7. 项目区域

字段类型:省、市、区三级联动选择。

字段说明:选择项目所在区域。

字段规则:必填,下级区域根据上级选项动态加载。

 

8. 项目详细地址

字段类型:文本输入框。

字段说明:填写项目的具体地址。

 

9. 项目属地

字段类型:下拉选择框。

字段说明:选择项目属地类型。

字段规则:必填,选项来源于系统配置。

 

10. 项目金额

字段类型:金额输入框。

字段说明:填写项目预计金额。

字段规则:仅支持有效数字,金额单位按系统统一规则处理。

 

11. 甲方是否明确

字段类型:下拉选择框。

字段说明:标识当前商机是否已经明确甲方单位。

字段规则:必填,选项为“是 / 否”。

 

12. 甲方名称

字段类型:文本输入框。

字段说明:填写项目甲方单位名称。

字段规则:当“甲方是否明确”为“是”时必填。

 

13. 商机关联联系人

字段类型:搜索选择框。

字段说明:搜索并选择与当前商机相关的联系人。

字段规则:选择后自动带出联系人所属公司等信息。

 

14. 关联人所在公司

字段类型:自动带出字段。

字段说明:展示已选联系人的所属公司。

字段规则:原则上不可手动修改。

 

15. 关联客户

字段类型:搜索选择框。

字段说明:选择当前商机关联的客户单位。

字段规则:必填,数据来源于客户管理模块。

 

16. 客户角色

字段类型:下拉选择框。

字段说明:选择客户在当前商机中的业务角色。

字段规则:必填,选项来源于客户角色字典。

 

17. 客户联系人

字段类型:搜索选择框。

字段说明:选择当前关联客户下的联系人。

字段规则:候选联系人需根据已选客户筛选。

 

18. 是否主要客户

字段类型:下拉选择框。

字段说明:标识该客户是否为当前商机的主要客户。

字段规则:必填,同一商机原则上只能存在一个主要客户。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-商机_编辑/新增

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

4、交互说明

+
+
+ + +
+ +
+

1. 打开新增商机

用户点击“新增商机”后,打开新增商机弹窗。

表单展示系统默认值或空值。

 

2. 打开编辑商机

用户点击“编辑”后,打开编辑商机弹窗。

系统自动加载当前商机已有数据并回填至对应字段。

 

3. 页面状态区分

新增和编辑使用同一套表单,但弹窗标题、初始数据及提交结果不同。

 

4. 项目区域联动

选择省份后刷新城市选项,选择城市后刷新区县选项。

编辑状态下需正确回显原项目区域。

 

5. 甲方信息联动

当“甲方是否明确”选择“是”时,甲方名称为必填。

选择“否”时,甲方名称按业务规则设置为非必填或清空。

 

6. 联系人搜索

点击“搜索”后打开联系人选择窗口。

确认后自动回填联系人、联系方式及所属公司。

 

7. 关联客户搜索

点击关联客户旁的“搜索”后打开客户选择窗口。

确认后回填客户名称,并刷新客户联系人候选范围。

 

8. 取消

点击“取消”后关闭弹窗,不保存本次新增或修改内容。

已填写或修改内容时,可提示用户确认是否放弃。

 

9. 确认

点击“确认”后校验必填字段和字段格式。

新增状态校验通过后创建商机;编辑状态校验通过后更新当前商机。

 

10. 操作成功

新增成功后关闭弹窗并刷新销售机会列表。

编辑成功后关闭弹窗,并同步刷新列表及商机详情中的相关信息。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-商机_编辑/新增

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

5、业务规则&功能逻辑

+
+
+ + +
+ +
+

1. 新增与编辑规则

新增操作生成新的商机记录及唯一商机标识。

编辑操作更新当前商机记录,不得生成重复商机。

 

2. 数据回显规则

进入编辑状态时,系统需完整回显当前商机已有信息。

暂无数据的字段按空值或默认值展示。

 

3. 必填规则

带红色星号的字段为必填字段,未填写时不得提交。

 

4. 数据字典规则

商机来源、类型、行业、阶段、招标形式、项目属地、客户角色等字段统一读取系统配置。

 

5. 商机归属规则

通过“我负责的销售机会”新增的商机,默认负责人为当前用户。

编辑商机时,不因修改普通字段自动改变负责人。

 

6. 客户关联规则

新增商机至少关联一个客户。

编辑时可调整关联客户,但需保证客户与联系人归属关系一致。

 

7. 主要客户规则

同一商机只能存在一个主要客户。

修改主要客户后,原主要客户需同步调整为普通关联客户。

 

8. 金额规则

项目金额仅允许输入大于或等于零的有效数字。

金额精度及单位按系统统一规范处理。

 

9. 重复校验

新增提交前,可根据商机名称、关联客户、项目区域等信息进行重复商机校验。

编辑当前商机时,重复校验需排除当前商机自身。

 

10. 字段修改权限

编辑状态下,部分关键字段是否允许修改,需根据商机状态及用户权限控制。

无权限字段应只读或不展示修改入口。

 

11. 数据同步

新增或编辑成功后,列表、商机详情、客户关系及相关业务数据需同步更新。

 

12. 操作日志

编辑商机导致关键字段发生变化时,需记录操作人、修改时间、旧值和新值。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-商机_编辑/新增

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

6、原型体验及

验收标准

+
+
+ + +
+ +
+

1. 点击“新增商机”后,可以正常打开新增状态弹窗,标题显示“新增商机”。

 

2. 点击“编辑”后,可以正常打开编辑状态弹窗,标题显示“编辑商机”。

 

3. 编辑状态下,当前商机已有信息需正确回显。

 

4. 新增和编辑页面的表单结构、字段顺序及视觉样式需保持一致。

 

5. 所有必填字段未填写时不得提交,并需给出明确提示。

 

6. 项目区域需支持省、市、区三级联动,并在编辑状态下正确回显。

 

7. 选择联系人后,联系方式及所属公司需正确带出。

 

8. 选择关联客户后,客户联系人范围需同步更新。

 

9. 点击“取消”后,不保存新增或修改内容。

 

10. 新增状态点击“确认”并校验通过后,系统需创建新的商机记录。

 

11. 编辑状态点击“确认”并校验通过后,系统需更新原商机记录,不产生重复数据。

 

12. 新增成功后,销售机会列表需同步刷新。

 

13. 编辑成功后,销售机会列表及商机详情中的相关字段需同步更新。

 

14. 编辑关键字段后,操作日志需正确记录字段旧值和新值。

 

15. 当前用户无新增或编辑权限时,不展示对应入口或给出无权限提示。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-商机_编辑/新增

+
+
+ + +
+
+
+

项目概况

+
+
+ + +
+
+ +
+ + +
+
+
+

项目概况

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

新建商机

+
+
+ + +
+
+
+

项目基础信息

+
+
+ + +
+
+
+

*商机名称

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机来源

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机行业

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机类型

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目阶段

+
+
+ + +
+
+ +
+ + +
+
+
+

*招标形式

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目详细地址

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目区域

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

客户信息

+
+
+ + +
+
+
+

*甲方是否明确

+
+
+ + +
+
+ +
+ + +
+
+
+

甲方名称

+
+
+ + +
+
+
+

商机关键联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*关联客户

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

关键人所在公司

+
+
+ + +
+
+ +
+ + +
+
+
+

客户联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*客户类型

+
+
+ + +
+
+ +
+ + +
+
+
+

*是否主要客户

+
+
+ + +
+
+ +
+ + +
+
+
+

    前端预留:用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入

+
+
+ + +
+ + +
+ + +
+
+
+

确认

+
+
+ + +
+
+
+

取消

+
+
+ + +
+
+
+

*项目属地

+
+
+ + +
+
+ +
+ + +
+
+
+

项目金额

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

编辑商机

+
+
+ + +
+
+
+

项目基础信息

+
+
+ + +
+
+
+

*商机名称

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机来源

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机行业

+
+
+ + +
+
+ +
+ + +
+
+
+

*商机类型

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目阶段

+
+
+ + +
+
+ +
+ + +
+
+
+

*招标形式

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目详细地址

+
+
+ + +
+
+ +
+ + +
+
+
+

*项目区域

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

客户信息

+
+
+ + +
+
+
+

*甲方是否明确

+
+
+ + +
+
+ +
+ + +
+
+
+

甲方名称

+
+
+ + +
+
+
+

商机关键联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*关联客户

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

关键人所在公司

+
+
+ + +
+
+ +
+ + +
+
+
+

客户联系人

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

*客户角色

+
+
+ + +
+
+ +
+ + +
+
+
+

*是否主要客户

+
+
+ + +
+
+ +
+ + +
+
+
+

    前端预留:用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入用于提示用户录入

+
+
+ + +
+ + +
+ + +
+
+
+

确认

+
+
+ + +
+
+
+

取消

+
+
+ + +
+
+
+

*项目属地

+
+
+ + +
+
+ +
+ + +
+
+
+

项目金额

+
+
+ + +
+
+ +
+ + +
+
+
+

项目概况

+
+
+ + +
+
+ +
+ + +
+
+
+

项目概况

+
+
+ + +
+
+ +
+ + +
+
+
+

*关联线索

+
+
+ + +
+
+ +
+ + +
+
+
+

*关联线索

+
+
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+
+

搜索

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + +
+
+ +
+ + +
+
+
+

搜索

+
+
+ + + + diff --git a/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-2_____.txt b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-2_____.txt new file mode 100644 index 0000000..f5aa062 --- /dev/null +++ b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-2_____.txt @@ -0,0 +1,397 @@ +# a3-1-1-2-2_____.html +# 控件 613,有文本 394 + +u3 | 矩形 | Unnamed | itc业务中台 +u10 | 矩形 | Unnamed | Panyu10109 +u14 | 矩形 | Unnamed | 16 +u16 | 矩形 | Unnamed | AI助手 +u20 | 矩形 | Unnamed | 商机管理 +u21 | 矩形 | Unnamed | 数据看板 +u27 | 矩形 | Unnamed | 销售机会 +u29 | 矩形 | Unnamed | 线索管理 +u30 | 矩形 | Unnamed | 客户管理 +u35 | 矩形 | Unnamed | 项目管理 +u38 | 矩形 | Unnamed | 首页 +u42 | 矩形 | Unnamed | 商机管理 +u45 | 矩形 | Unnamed | 商机公海 +u47 | 矩形 | Unnamed | 进入后台 +u49 | 矩形 | Unnamed | 线索管理 +u50 | 矩形 | Unnamed | 数据看板 +u55 | 矩形 | Unnamed | 线索管理设置 +u58 | 矩形 | Unnamed | 线索公海 +u60 | 矩形 | Unnamed | 客户管理 +u61 | 矩形 | Unnamed | 项目管理 +u62 | 矩形 | Unnamed | 商机管理 +u69 | 矩形 | Unnamed | 首页 +u72 | 矩形 | Unnamed | 进入后台 +u74 | 矩形 | Unnamed | 线索管理 +u77 | 矩形 | Unnamed | 我的关注 +u80 | 矩形 | Unnamed | 我的线索 +u83 | 矩形 | Unnamed | 首页 +u84 | 矩形 | Unnamed | 线索管理 +u85 | 矩形 | Unnamed | 客户管理 +u86 | 矩形 | Unnamed | 项目管理 +u87 | 矩形 | Unnamed | 系统设置 +u88 | 矩形 | Unnamed | 商机管理 +u89 | 矩形 | Unnamed | 数据看板 +u104 | 矩形 | Unnamed | 工作台 +u106 | 矩形 | Unnamed | 数据概览 +u108 | 矩形 | Unnamed | 工作计划 +u110 | 矩形 | Unnamed | <<收起菜单 +u112 | 矩形 | Unnamed | 线索管理 +u113 | 矩形 | Unnamed | 客户管理 +u114 | 矩形 | Unnamed | 系统设置 +u115 | 矩形 | Unnamed | 数据看板 +u125 | 矩形 | Unnamed | 我的客户 +u128 | 矩形 | Unnamed | 客户公海 +u130 | 矩形 | Unnamed | 项目管理 +u131 | 矩形 | Unnamed | 商机管理 +u136 | 矩形 | Unnamed | 首页 +u138 | 矩形 | Unnamed | 联系人管理 +u142 | 矩形 | Unnamed | 客户管理 +u145 | 矩形 | Unnamed | 客户管理设置 +u148 | 矩形 | Unnamed | 系统设置 +u149 | 矩形 | Unnamed | 数据看板 +u154 | 矩形 | Unnamed | 项目管理设置 +u155 | 矩形 | Unnamed | 首页 +u157 | 矩形 | Unnamed | 线索管理 +u158 | 矩形 | Unnamed | 客户管理 +u159 | 矩形 | Unnamed | 项目管理 +u160 | 矩形 | Unnamed | 商机管理 +u170 | 矩形 | Unnamed | 项目管理 +u175 | 矩形 | Unnamed | 项目统计 +u178 | 矩形 | Unnamed | 系统设置 +u179 | 矩形 | Unnamed | 数据看板 +u184 | 矩形 | Unnamed | -b +u185 | 矩形 | Unnamed | 首页 +u187 | 矩形 | Unnamed | 线索管理 +u188 | 矩形 | Unnamed | 客户管理 +u189 | 矩形 | Unnamed | 项目管理 +u190 | 矩形 | Unnamed | 商机管理 +u199 | 矩形 | Unnamed | -a +u204 | 矩形 | Unnamed | 系统设置 +u205 | 矩形 | Unnamed | 数据看板 +u210 | 矩形 | Unnamed | 首页 +u212 | 矩形 | Unnamed | 线索管理 +u213 | 矩形 | Unnamed | 客户管理 +u214 | 矩形 | Unnamed | 项目管理 +u215 | 矩形 | Unnamed | 商机管理 +u224 | 矩形 | Unnamed | -a +u227 | 矩形 | Unnamed | -b +u230 | 矩形 | Unnamed | -c +u232 | 矩形 | Unnamed | 金山谷智慧园区项目 +u233 | 矩形 | Unnamed | 招标形式: +u234 | 矩形 | Unnamed | ZC(政采标) +u235 | 矩形 | Unnamed | 责任人: +u236 | 矩形 | Unnamed | 张三 +u237 | 矩形 | Unnamed | 所属团队: +u238 | 矩形 | Unnamed | 特战团队 +u239 | 矩形 | Unnamed | 所属部门: +u240 | 矩形 | Unnamed | 粤疆战队-广东15部 +u241 | 矩形 | Unnamed | 返回 +u242 | 矩形 | Unnamed | 园区 +u243 | 矩形 | Unnamed | 项目阶段: +u244 | 矩形 | Unnamed | 标前设计 +u245 | 矩形 | Unnamed | 商机状态: +u246 | 矩形 | Unnamed | 推进中 +u247 | 矩形 | Unnamed | 方案预算: +u248 | 矩形 | Unnamed | 418.90 万元 +u249 | 矩形 | Unnamed | 写跟进 +u250 | 矩形 | Unnamed | 编辑 +u251 | 矩形 | Unnamed | 主要意向客户: +u252 | 矩形 | Unnamed | 广州亚东智能科技有限公司 +u253 | 矩形 | Unnamed | 新增方案卡 +u255 | 向右箭头按钮 | Unnamed | 客户圈定 +u256 | 圆形 | Unnamed | √ +u258 | 向右箭头按钮 | Unnamed | 关系摸排 +u260 | 圆形 | Unnamed | √ +u262 | 向右箭头按钮 | Unnamed | 资料采集 +u264 | 圆形 | Unnamed | √ +u266 | 向右箭头按钮 | Unnamed | 方案卡 +u268 | 圆形 | Unnamed | √ +u270 | 向右箭头按钮 | Unnamed | 已转项目 +u272 | 圆形 | Unnamed | √ +u274 | 矩形 | Unnamed | 概览 +u275 | 矩形 | Unnamed | 客户信息 +u276 | 矩形 | Unnamed | 现场勘察 +u277 | 矩形 | Unnamed | 相关附件 +u278 | 矩形 | Unnamed | 工作计划 +u279 | 矩形 | Unnamed | 团队成员 +u280 | 矩形 | Unnamed | 操作日志 +u281 | 矩形 | Unnamed | 方案卡 +u285 | 矩形 | Unnamed | 添加关联客户 +u286 | 矩形 | Unnamed | 推送方案 +u287 | 矩形 | Unnamed | 暂缓商机 +u288 | 矩形 | Unnamed | 抛公海 +u289 | 矩形 | Unnamed | 添加团队成员 +u290 | 矩形 | Unnamed | 关闭商机 +u291 | 矩形 | Unnamed | 跟进记录 +u294 | 矩形 | Unnamed | 新增跟进记录 +u296 | 矩形 | Unnamed | 确认 +u297 | 矩形 | Unnamed | 取消 +u300 | 矩形 | Unnamed | 跟进时间 +u306 | 矩形 | Month | August +u307 | 矩形 | Unnamed | S +u308 | 矩形 | Unnamed | M +u309 | 矩形 | Unnamed | 上 +u310 | 矩形 | Unnamed | W +u311 | 矩形 | Unnamed | 上 +u312 | 矩形 | Unnamed | F +u313 | 矩形 | Unnamed | S +u314 | 矩形 | Unnamed | 01 +u315 | 矩形 | Unnamed | 02 +u316 | 矩形 | Unnamed | 03 +u317 | 矩形 | Unnamed | 04 +u318 | 矩形 | Unnamed | 05 +u319 | 矩形 | Unnamed | 06 +u320 | 矩形 | Unnamed | 07 +u321 | 矩形 | Unnamed | 08 +u322 | 矩形 | Unnamed | 09 +u323 | 矩形 | Unnamed | 10 +u324 | 矩形 | Unnamed | 11 +u325 | 矩形 | Unnamed | 12 +u326 | 矩形 | Unnamed | 13 +u327 | 矩形 | Unnamed | 14 +u328 | 矩形 | Unnamed | 15 +u329 | 矩形 | Unnamed | 16 +u330 | 矩形 | Unnamed | 17 +u331 | 矩形 | Unnamed | 18 +u332 | 矩形 | Unnamed | 19 +u333 | 矩形 | Unnamed | 20 +u334 | 矩形 | Unnamed | 21 +u335 | 矩形 | Unnamed | 22 +u336 | 矩形 | Unnamed | 23 +u337 | 矩形 | Unnamed | 24 +u338 | 矩形 | Unnamed | 25 +u339 | 矩形 | Unnamed | 26 +u340 | 矩形 | Unnamed | 27 +u341 | 矩形 | Unnamed | 28 +u342 | 矩形 | Unnamed | 29 +u343 | 矩形 | Unnamed | 30 +u344 | 矩形 | Unnamed | 31 +u347 | 矩形 | Month | July +u348 | 矩形 | Unnamed | S +u349 | 矩形 | Unnamed | M +u350 | 矩形 | Unnamed | 上 +u351 | 矩形 | Unnamed | W +u352 | 矩形 | Unnamed | 上 +u353 | 矩形 | Unnamed | F +u354 | 矩形 | Unnamed | S +u355 | 矩形 | Unnamed | 01 +u356 | 矩形 | Unnamed | 02 +u357 | 矩形 | Unnamed | 03 +u358 | 矩形 | Unnamed | 04 +u359 | 矩形 | Unnamed | 05 +u360 | 矩形 | Unnamed | 06 +u361 | 矩形 | Unnamed | 07 +u362 | 矩形 | Unnamed | 08 +u363 | 矩形 | Unnamed | 09 +u364 | 矩形 | Unnamed | 10 +u365 | 矩形 | Unnamed | 11 +u366 | 矩形 | Unnamed | 12 +u367 | 矩形 | Unnamed | 13 +u368 | 矩形 | Unnamed | 14 +u369 | 矩形 | Unnamed | 15 +u370 | 矩形 | Unnamed | 16 +u371 | 矩形 | Unnamed | 17 +u372 | 矩形 | Unnamed | 18 +u373 | 矩形 | Unnamed | 19 +u374 | 矩形 | Unnamed | 20 +u375 | 矩形 | Unnamed | 21 +u376 | 矩形 | Unnamed | 22 +u377 | 矩形 | Unnamed | 23 +u378 | 矩形 | Unnamed | 24 +u379 | 矩形 | Unnamed | 25 +u380 | 矩形 | Unnamed | 26 +u381 | 矩形 | Unnamed | 27 +u382 | 矩形 | Unnamed | 28 +u383 | 矩形 | Unnamed | 29 +u384 | 矩形 | Unnamed | 30 +u385 | 矩形 | Unnamed | 31 +u388 | 矩形 | Month | June +u389 | 矩形 | Unnamed | S +u390 | 矩形 | Unnamed | M +u391 | 矩形 | Unnamed | 上 +u392 | 矩形 | Unnamed | W +u393 | 矩形 | Unnamed | 上 +u394 | 矩形 | Unnamed | F +u395 | 矩形 | Unnamed | S +u396 | 矩形 | Unnamed | 01 +u397 | 矩形 | Unnamed | 02 +u398 | 矩形 | Unnamed | 03 +u399 | 矩形 | Unnamed | 04 +u400 | 矩形 | Unnamed | 05 +u401 | 矩形 | Unnamed | 06 +u402 | 矩形 | Unnamed | 07 +u403 | 矩形 | Unnamed | 08 +u404 | 矩形 | Unnamed | 09 +u405 | 矩形 | Unnamed | 10 +u406 | 矩形 | Unnamed | 11 +u407 | 矩形 | Unnamed | 12 +u408 | 矩形 | Unnamed | 13 +u409 | 矩形 | Unnamed | 14 +u410 | 矩形 | Unnamed | 15 +u411 | 矩形 | Unnamed | 16 +u412 | 矩形 | Unnamed | 17 +u413 | 矩形 | Unnamed | 18 +u414 | 矩形 | Unnamed | 19 +u415 | 矩形 | Unnamed | 20 +u416 | 矩形 | Unnamed | 21 +u417 | 矩形 | Unnamed | 22 +u418 | 矩形 | Unnamed | 23 +u419 | 矩形 | Unnamed | 24 +u420 | 矩形 | Unnamed | 25 +u421 | 矩形 | Unnamed | 26 +u422 | 矩形 | Unnamed | 27 +u423 | 矩形 | Unnamed | 28 +u424 | 矩形 | Unnamed | 29 +u425 | 矩形 | Unnamed | 30 +u432 | 矩形 | Unnamed | 客户联系人 +u433 | 矩形 | Unnamed | 客户联系电话 +u435 | 矩形 | Unnamed | 跟进结果标签 +u437 | 矩形 | Unnamed | 计划下次跟进时间 +u443 | 矩形 | Month | August +u444 | 矩形 | Unnamed | S +u445 | 矩形 | Unnamed | M +u446 | 矩形 | Unnamed | 上 +u447 | 矩形 | Unnamed | W +u448 | 矩形 | Unnamed | 上 +u449 | 矩形 | Unnamed | F +u450 | 矩形 | Unnamed | S +u451 | 矩形 | Unnamed | 01 +u452 | 矩形 | Unnamed | 02 +u453 | 矩形 | Unnamed | 03 +u454 | 矩形 | Unnamed | 04 +u455 | 矩形 | Unnamed | 05 +u456 | 矩形 | Unnamed | 06 +u457 | 矩形 | Unnamed | 07 +u458 | 矩形 | Unnamed | 08 +u459 | 矩形 | Unnamed | 09 +u460 | 矩形 | Unnamed | 10 +u461 | 矩形 | Unnamed | 11 +u462 | 矩形 | Unnamed | 12 +u463 | 矩形 | Unnamed | 13 +u464 | 矩形 | Unnamed | 14 +u465 | 矩形 | Unnamed | 15 +u466 | 矩形 | Unnamed | 16 +u467 | 矩形 | Unnamed | 17 +u468 | 矩形 | Unnamed | 18 +u469 | 矩形 | Unnamed | 19 +u470 | 矩形 | Unnamed | 20 +u471 | 矩形 | Unnamed | 21 +u472 | 矩形 | Unnamed | 22 +u473 | 矩形 | Unnamed | 23 +u474 | 矩形 | Unnamed | 24 +u475 | 矩形 | Unnamed | 25 +u476 | 矩形 | Unnamed | 26 +u477 | 矩形 | Unnamed | 27 +u478 | 矩形 | Unnamed | 28 +u479 | 矩形 | Unnamed | 29 +u480 | 矩形 | Unnamed | 30 +u481 | 矩形 | Unnamed | 31 +u484 | 矩形 | Month | July +u485 | 矩形 | Unnamed | S +u486 | 矩形 | Unnamed | M +u487 | 矩形 | Unnamed | 上 +u488 | 矩形 | Unnamed | W +u489 | 矩形 | Unnamed | 上 +u490 | 矩形 | Unnamed | F +u491 | 矩形 | Unnamed | S +u492 | 矩形 | Unnamed | 01 +u493 | 矩形 | Unnamed | 02 +u494 | 矩形 | Unnamed | 03 +u495 | 矩形 | Unnamed | 04 +u496 | 矩形 | Unnamed | 05 +u497 | 矩形 | Unnamed | 06 +u498 | 矩形 | Unnamed | 07 +u499 | 矩形 | Unnamed | 08 +u500 | 矩形 | Unnamed | 09 +u501 | 矩形 | Unnamed | 10 +u502 | 矩形 | Unnamed | 11 +u503 | 矩形 | Unnamed | 12 +u504 | 矩形 | Unnamed | 13 +u505 | 矩形 | Unnamed | 14 +u506 | 矩形 | Unnamed | 15 +u507 | 矩形 | Unnamed | 16 +u508 | 矩形 | Unnamed | 17 +u509 | 矩形 | Unnamed | 18 +u510 | 矩形 | Unnamed | 19 +u511 | 矩形 | Unnamed | 20 +u512 | 矩形 | Unnamed | 21 +u513 | 矩形 | Unnamed | 22 +u514 | 矩形 | Unnamed | 23 +u515 | 矩形 | Unnamed | 24 +u516 | 矩形 | Unnamed | 25 +u517 | 矩形 | Unnamed | 26 +u518 | 矩形 | Unnamed | 27 +u519 | 矩形 | Unnamed | 28 +u520 | 矩形 | Unnamed | 29 +u521 | 矩形 | Unnamed | 30 +u522 | 矩形 | Unnamed | 31 +u525 | 矩形 | Month | June +u526 | 矩形 | Unnamed | S +u527 | 矩形 | Unnamed | M +u528 | 矩形 | Unnamed | 上 +u529 | 矩形 | Unnamed | W +u530 | 矩形 | Unnamed | 上 +u531 | 矩形 | Unnamed | F +u532 | 矩形 | Unnamed | S +u533 | 矩形 | Unnamed | 01 +u534 | 矩形 | Unnamed | 02 +u535 | 矩形 | Unnamed | 03 +u536 | 矩形 | Unnamed | 04 +u537 | 矩形 | Unnamed | 05 +u538 | 矩形 | Unnamed | 06 +u539 | 矩形 | Unnamed | 07 +u540 | 矩形 | Unnamed | 08 +u541 | 矩形 | Unnamed | 09 +u542 | 矩形 | Unnamed | 10 +u543 | 矩形 | Unnamed | 11 +u544 | 矩形 | Unnamed | 12 +u545 | 矩形 | Unnamed | 13 +u546 | 矩形 | Unnamed | 14 +u547 | 矩形 | Unnamed | 15 +u548 | 矩形 | Unnamed | 16 +u549 | 矩形 | Unnamed | 17 +u550 | 矩形 | Unnamed | 18 +u551 | 矩形 | Unnamed | 19 +u552 | 矩形 | Unnamed | 20 +u553 | 矩形 | Unnamed | 21 +u554 | 矩形 | Unnamed | 22 +u555 | 矩形 | Unnamed | 23 +u556 | 矩形 | Unnamed | 24 +u557 | 矩形 | Unnamed | 25 +u558 | 矩形 | Unnamed | 26 +u559 | 矩形 | Unnamed | 27 +u560 | 矩形 | Unnamed | 28 +u561 | 矩形 | Unnamed | 29 +u562 | 矩形 | Unnamed | 30 +u565 | 矩形 | Unnamed | 附件 +u567 | 矩形 | Unnamed | 点击或拖拽文件至该处上传 +u568 | 矩形 | Unnamed | 附件支持txt \ doc \ docx \ jpg \ png \ jpeg \ xls \ xlsx \ ppt \ pptx \ pdf \ mp3 \ mp4 \ m4a \ aac等格式。最多支持上传10个附件。 +u570 | 单元格 | Unnamed | 需求 +u571 | 单元格 | Unnamed | 需求说明 +u572 | 单元格 | Unnamed | 变更记录 +u573 | 单元格 | Unnamed | 1、开发说明 +u576 | 单元格 | Unnamed | 2、详细说明 +u579 | 矩形 | Unnamed | 商机管理-商机_写跟进 +u581 | 单元格 | Unnamed | 需求 +u582 | 单元格 | Unnamed | 需求说明 +u583 | 单元格 | Unnamed | 变更记录 +u584 | 单元格 | Unnamed | 3、字段说明 +u587 | 矩形 | Unnamed | 商机管理-商机_写跟进 +u589 | 单元格 | Unnamed | 需求 +u590 | 单元格 | Unnamed | 需求说明 +u591 | 单元格 | Unnamed | 变更记录 +u592 | 单元格 | Unnamed | 4、交互说明 +u595 | 矩形 | Unnamed | 商机管理-商机_写跟进 +u597 | 单元格 | Unnamed | 需求 +u598 | 单元格 | Unnamed | 需求说明 +u599 | 单元格 | Unnamed | 变更记录 +u600 | 单元格 | Unnamed | 5、业务规则&功能逻辑 +u603 | 矩形 | Unnamed | 商机管理-商机_写跟进 +u605 | 单元格 | Unnamed | 需求 +u606 | 单元格 | Unnamed | 需求说明 +u607 | 单元格 | Unnamed | 变更记录 +u608 | 单元格 | Unnamed | 6、原型体验及 | 验收标准 +u611 | 矩形 | Unnamed | 商机管理-商机_写跟进 diff --git a/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-3_______.txt b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-3_______.txt new file mode 100644 index 0000000..4823365 --- /dev/null +++ b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-3_______.txt @@ -0,0 +1,343 @@ +# a3-1-1-2-3_______.html +# 控件 742,有文本 340 + +u3 | 矩形 | Unnamed | itc业务中台 +u10 | 矩形 | Unnamed | Panyu10109 +u14 | 矩形 | Unnamed | 16 +u16 | 矩形 | Unnamed | AI助手 +u20 | 矩形 | Unnamed | 商机管理 +u21 | 矩形 | Unnamed | 数据看板 +u27 | 矩形 | Unnamed | 销售机会 +u29 | 矩形 | Unnamed | 线索管理 +u30 | 矩形 | Unnamed | 客户管理 +u35 | 矩形 | Unnamed | 项目管理 +u38 | 矩形 | Unnamed | 首页 +u42 | 矩形 | Unnamed | 商机管理 +u45 | 矩形 | Unnamed | 商机公海 +u47 | 矩形 | Unnamed | 进入后台 +u49 | 矩形 | Unnamed | 线索管理 +u50 | 矩形 | Unnamed | 数据看板 +u55 | 矩形 | Unnamed | 线索管理设置 +u58 | 矩形 | Unnamed | 线索公海 +u60 | 矩形 | Unnamed | 客户管理 +u61 | 矩形 | Unnamed | 项目管理 +u62 | 矩形 | Unnamed | 商机管理 +u69 | 矩形 | Unnamed | 首页 +u72 | 矩形 | Unnamed | 进入后台 +u74 | 矩形 | Unnamed | 线索管理 +u77 | 矩形 | Unnamed | 我的关注 +u80 | 矩形 | Unnamed | 我的线索 +u83 | 矩形 | Unnamed | 首页 +u84 | 矩形 | Unnamed | 线索管理 +u85 | 矩形 | Unnamed | 客户管理 +u86 | 矩形 | Unnamed | 项目管理 +u87 | 矩形 | Unnamed | 系统设置 +u88 | 矩形 | Unnamed | 商机管理 +u89 | 矩形 | Unnamed | 数据看板 +u104 | 矩形 | Unnamed | 工作台 +u106 | 矩形 | Unnamed | 数据概览 +u108 | 矩形 | Unnamed | 工作计划 +u110 | 矩形 | Unnamed | <<收起菜单 +u112 | 矩形 | Unnamed | 线索管理 +u113 | 矩形 | Unnamed | 客户管理 +u114 | 矩形 | Unnamed | 系统设置 +u115 | 矩形 | Unnamed | 数据看板 +u125 | 矩形 | Unnamed | 我的客户 +u128 | 矩形 | Unnamed | 客户公海 +u130 | 矩形 | Unnamed | 项目管理 +u131 | 矩形 | Unnamed | 商机管理 +u136 | 矩形 | Unnamed | 首页 +u138 | 矩形 | Unnamed | 联系人管理 +u142 | 矩形 | Unnamed | 客户管理 +u145 | 矩形 | Unnamed | 客户管理设置 +u148 | 矩形 | Unnamed | 系统设置 +u149 | 矩形 | Unnamed | 数据看板 +u154 | 矩形 | Unnamed | 项目管理设置 +u155 | 矩形 | Unnamed | 首页 +u157 | 矩形 | Unnamed | 线索管理 +u158 | 矩形 | Unnamed | 客户管理 +u159 | 矩形 | Unnamed | 项目管理 +u160 | 矩形 | Unnamed | 商机管理 +u170 | 矩形 | Unnamed | 项目管理 +u175 | 矩形 | Unnamed | 项目统计 +u178 | 矩形 | Unnamed | 系统设置 +u179 | 矩形 | Unnamed | 数据看板 +u184 | 矩形 | Unnamed | -b +u185 | 矩形 | Unnamed | 首页 +u187 | 矩形 | Unnamed | 线索管理 +u188 | 矩形 | Unnamed | 客户管理 +u189 | 矩形 | Unnamed | 项目管理 +u190 | 矩形 | Unnamed | 商机管理 +u199 | 矩形 | Unnamed | -a +u204 | 矩形 | Unnamed | 系统设置 +u205 | 矩形 | Unnamed | 数据看板 +u210 | 矩形 | Unnamed | 首页 +u212 | 矩形 | Unnamed | 线索管理 +u213 | 矩形 | Unnamed | 客户管理 +u214 | 矩形 | Unnamed | 项目管理 +u215 | 矩形 | Unnamed | 商机管理 +u224 | 矩形 | Unnamed | -a +u227 | 矩形 | Unnamed | -b +u230 | 矩形 | Unnamed | -c +u232 | 矩形 | Unnamed | 金山谷智慧园区项目 +u233 | 矩形 | Unnamed | 招标形式: +u234 | 矩形 | Unnamed | ZC(政采标) +u235 | 矩形 | Unnamed | 责任人: +u236 | 矩形 | Unnamed | 张三 +u237 | 矩形 | Unnamed | 所属团队: +u238 | 矩形 | Unnamed | 特战团队 +u239 | 矩形 | Unnamed | 所属部门: +u240 | 矩形 | Unnamed | 粤疆战队-广东15部 +u241 | 矩形 | Unnamed | 返回 +u242 | 矩形 | Unnamed | 园区 +u243 | 矩形 | Unnamed | 项目阶段: +u244 | 矩形 | Unnamed | 标前设计 +u245 | 矩形 | Unnamed | 商机状态: +u246 | 矩形 | Unnamed | 推进中 +u247 | 矩形 | Unnamed | 方案预算: +u248 | 矩形 | Unnamed | 418.90 万元 +u249 | 矩形 | Unnamed | 写跟进 +u250 | 矩形 | Unnamed | 编辑 +u251 | 矩形 | Unnamed | 主要意向客户: +u252 | 矩形 | Unnamed | 广州亚东智能科技有限公司 +u253 | 矩形 | Unnamed | 新增方案卡 +u255 | 向右箭头按钮 | Unnamed | 客户圈定 +u256 | 圆形 | Unnamed | √ +u258 | 向右箭头按钮 | Unnamed | 关系摸排 +u260 | 圆形 | Unnamed | √ +u262 | 向右箭头按钮 | Unnamed | 资料采集 +u264 | 圆形 | Unnamed | √ +u266 | 向右箭头按钮 | Unnamed | 方案卡 +u268 | 圆形 | Unnamed | √ +u270 | 向右箭头按钮 | Unnamed | 已转项目 +u272 | 圆形 | Unnamed | √ +u274 | 矩形 | Unnamed | 概览 +u275 | 矩形 | Unnamed | 客户信息 +u276 | 矩形 | Unnamed | 现场勘察 +u277 | 矩形 | Unnamed | 相关附件 +u278 | 矩形 | Unnamed | 工作计划 +u279 | 矩形 | Unnamed | 团队成员 +u280 | 矩形 | Unnamed | 操作日志 +u281 | 矩形 | Unnamed | 方案卡 +u285 | 矩形 | Unnamed | 添加关联客户 +u286 | 矩形 | Unnamed | 推送方案 +u287 | 矩形 | Unnamed | 暂缓商机 +u288 | 矩形 | Unnamed | 抛公海 +u289 | 矩形 | Unnamed | 添加团队成员 +u290 | 矩形 | Unnamed | 关闭商机 +u291 | 矩形 | Unnamed | 跟进记录 +u293 | 单元格 | Unnamed | 需求 +u294 | 单元格 | Unnamed | 需求说明 +u295 | 单元格 | Unnamed | 变更记录 +u296 | 单元格 | Unnamed | 1、开发说明 +u299 | 单元格 | Unnamed | 2、详细说明 +u302 | 矩形 | Unnamed | 商机管理-商机_新增方案卡 +u304 | 单元格 | Unnamed | 需求 +u305 | 单元格 | Unnamed | 需求说明 +u306 | 单元格 | Unnamed | 变更记录 +u307 | 单元格 | Unnamed | 3、字段说明 +u310 | 矩形 | Unnamed | 商机管理-商机_新增方案卡 +u312 | 单元格 | Unnamed | 需求 +u313 | 单元格 | Unnamed | 需求说明 +u314 | 单元格 | Unnamed | 变更记录 +u315 | 单元格 | Unnamed | 4、交互说明 +u319 | 单元格 | Unnamed | 需求 +u320 | 单元格 | Unnamed | 需求说明 +u321 | 单元格 | Unnamed | 变更记录 +u322 | 单元格 | Unnamed | 5、业务规则&功能逻辑 +u325 | 矩形 | Unnamed | 商机管理-商机_新增方案卡 +u327 | 单元格 | Unnamed | 需求 +u328 | 单元格 | Unnamed | 需求说明 +u329 | 单元格 | Unnamed | 变更记录 +u330 | 单元格 | Unnamed | 6、原型体验及 | 验收标准 +u333 | 矩形 | Unnamed | 商机管理-商机_新增方案卡 +u337 | 矩形 | Unnamed | itc业务中台 +u344 | 矩形 | Unnamed | Panyu10109 +u348 | 矩形 | Unnamed | 16 +u350 | 矩形 | Unnamed | AI助手 +u354 | 矩形 | Unnamed | 商机管理 +u355 | 矩形 | Unnamed | 数据看板 +u361 | 矩形 | Unnamed | 销售机会 +u363 | 矩形 | Unnamed | 线索管理 +u364 | 矩形 | Unnamed | 客户管理 +u369 | 矩形 | Unnamed | 项目管理 +u372 | 矩形 | Unnamed | 首页 +u376 | 矩形 | Unnamed | 商机管理 +u379 | 矩形 | Unnamed | 商机公海 +u381 | 矩形 | Unnamed | 进入后台 +u383 | 矩形 | Unnamed | 线索管理 +u384 | 矩形 | Unnamed | 数据看板 +u389 | 矩形 | Unnamed | 线索管理设置 +u392 | 矩形 | Unnamed | 线索公海 +u394 | 矩形 | Unnamed | 客户管理 +u395 | 矩形 | Unnamed | 项目管理 +u396 | 矩形 | Unnamed | 商机管理 +u403 | 矩形 | Unnamed | 首页 +u406 | 矩形 | Unnamed | 进入后台 +u408 | 矩形 | Unnamed | 线索管理 +u411 | 矩形 | Unnamed | 我的关注 +u414 | 矩形 | Unnamed | 我的线索 +u417 | 矩形 | Unnamed | 首页 +u418 | 矩形 | Unnamed | 线索管理 +u419 | 矩形 | Unnamed | 客户管理 +u420 | 矩形 | Unnamed | 项目管理 +u421 | 矩形 | Unnamed | 系统设置 +u422 | 矩形 | Unnamed | 商机管理 +u423 | 矩形 | Unnamed | 数据看板 +u438 | 矩形 | Unnamed | 工作台 +u440 | 矩形 | Unnamed | 数据概览 +u442 | 矩形 | Unnamed | 工作计划 +u444 | 矩形 | Unnamed | <<收起菜单 +u446 | 矩形 | Unnamed | 线索管理 +u447 | 矩形 | Unnamed | 客户管理 +u448 | 矩形 | Unnamed | 系统设置 +u449 | 矩形 | Unnamed | 数据看板 +u459 | 矩形 | Unnamed | 我的客户 +u462 | 矩形 | Unnamed | 客户公海 +u464 | 矩形 | Unnamed | 项目管理 +u465 | 矩形 | Unnamed | 商机管理 +u470 | 矩形 | Unnamed | 首页 +u472 | 矩形 | Unnamed | 联系人管理 +u476 | 矩形 | Unnamed | 客户管理 +u479 | 矩形 | Unnamed | 客户管理设置 +u482 | 矩形 | Unnamed | 系统设置 +u483 | 矩形 | Unnamed | 数据看板 +u488 | 矩形 | Unnamed | 项目管理设置 +u489 | 矩形 | Unnamed | 首页 +u491 | 矩形 | Unnamed | 线索管理 +u492 | 矩形 | Unnamed | 客户管理 +u493 | 矩形 | Unnamed | 项目管理 +u494 | 矩形 | Unnamed | 商机管理 +u504 | 矩形 | Unnamed | 项目管理 +u509 | 矩形 | Unnamed | 项目统计 +u512 | 矩形 | Unnamed | 系统设置 +u513 | 矩形 | Unnamed | 数据看板 +u518 | 矩形 | Unnamed | -b +u519 | 矩形 | Unnamed | 首页 +u521 | 矩形 | Unnamed | 线索管理 +u522 | 矩形 | Unnamed | 客户管理 +u523 | 矩形 | Unnamed | 项目管理 +u524 | 矩形 | Unnamed | 商机管理 +u533 | 矩形 | Unnamed | -a +u538 | 矩形 | Unnamed | 系统设置 +u539 | 矩形 | Unnamed | 数据看板 +u544 | 矩形 | Unnamed | 首页 +u546 | 矩形 | Unnamed | 线索管理 +u547 | 矩形 | Unnamed | 客户管理 +u548 | 矩形 | Unnamed | 项目管理 +u549 | 矩形 | Unnamed | 商机管理 +u558 | 矩形 | Unnamed | -a +u561 | 矩形 | Unnamed | -b +u564 | 矩形 | Unnamed | -c +u566 | 矩形 | Unnamed | 金山谷智慧园区项目 +u567 | 矩形 | Unnamed | 招标形式: +u568 | 矩形 | Unnamed | ZC(政采标) +u569 | 矩形 | Unnamed | 责任人: +u570 | 矩形 | Unnamed | 张三 +u571 | 矩形 | Unnamed | 所属团队: +u572 | 矩形 | Unnamed | 特战团队 +u573 | 矩形 | Unnamed | 所属部门: +u574 | 矩形 | Unnamed | 粤疆战队-广东15部 +u575 | 矩形 | Unnamed | 返回 +u576 | 矩形 | Unnamed | 园区 +u577 | 矩形 | Unnamed | 项目阶段: +u578 | 矩形 | Unnamed | 标前设计 +u579 | 矩形 | Unnamed | 商机状态: +u580 | 矩形 | Unnamed | 推进中 +u581 | 矩形 | Unnamed | 方案预算: +u582 | 矩形 | Unnamed | 418.90 万元 +u583 | 矩形 | Unnamed | 写跟进 +u584 | 矩形 | Unnamed | 编辑 +u585 | 矩形 | Unnamed | 主要意向客户: +u586 | 矩形 | Unnamed | 广州亚东智能科技有限公司 +u587 | 矩形 | Unnamed | 新增方案卡 +u589 | 向右箭头按钮 | Unnamed | 客户圈定 +u590 | 圆形 | Unnamed | √ +u592 | 向右箭头按钮 | Unnamed | 关系摸排 +u594 | 圆形 | Unnamed | √ +u596 | 向右箭头按钮 | Unnamed | 资料采集 +u598 | 圆形 | Unnamed | √ +u600 | 向右箭头按钮 | Unnamed | 方案卡 +u602 | 圆形 | Unnamed | √ +u604 | 向右箭头按钮 | Unnamed | 已转项目 +u606 | 圆形 | Unnamed | √ +u608 | 矩形 | Unnamed | 概览 +u609 | 矩形 | Unnamed | 客户信息 +u610 | 矩形 | Unnamed | 现场勘察 +u611 | 矩形 | Unnamed | 相关附件 +u612 | 矩形 | Unnamed | 工作计划 +u613 | 矩形 | Unnamed | 团队成员 +u614 | 矩形 | Unnamed | 操作日志 +u615 | 矩形 | Unnamed | 方案卡 +u619 | 矩形 | Unnamed | 添加关联客户 +u620 | 矩形 | Unnamed | 推送方案 +u621 | 矩形 | Unnamed | 暂缓商机 +u622 | 矩形 | Unnamed | 抛公海 +u623 | 矩形 | Unnamed | 添加团队成员 +u624 | 矩形 | Unnamed | 关闭商机 +u625 | 矩形 | Unnamed | 跟进记录 +u628 | 矩形 | Unnamed | 方案卡内容 +u631 | 矩形 | Unnamed | 保存草稿 +u633 | 矩形 | Unnamed | 确认 +u635 | 矩形 | Unnamed | 公司通用方案卡 +u637 | 矩形 | Unnamed | 公司推荐 +u638 | 矩形 | Unnamed | 模板版本 V1.1 · 所有部门通用 +u641 | 矩形 | Unnamed | 切换模板 +u643 | 矩形 | Unnamed | 新增方案卡 +u644 | 矩形 | Unnamed | 客户名称 +u645 | 矩形 | Unnamed | * +u646 | 矩形 | Unnamed | 客户类型 +u647 | 矩形 | Unnamed | * +u648 | 矩形 | Unnamed | 战略VIP客户等级 +u649 | 矩形 | Unnamed | 已成交VIP客户等级 +u650 | 矩形 | Unnamed | 客户联系人 +u652 | 矩形 | Unnamed | 搜索 +u653 | 矩形 | Unnamed | 客户联系电话 +u654 | 矩形 | Unnamed | 项目阶段 +u655 | 矩形 | Unnamed | * +u656 | 矩形 | Unnamed | 招标形式 +u657 | 矩形 | Unnamed | * +u658 | 矩形 | Unnamed | 是否有看现场 +u659 | 矩形 | Unnamed | 是否与客户电话沟通 +u660 | 矩形 | Unnamed | 现场勘察资料 +u662 | 矩形 | Unnamed | 添加 +u663 | 矩形 | Unnamed | 是否百万级项目 +u664 | 矩形 | Unnamed | 方案预算是否明确 +u665 | 矩形 | Unnamed | 方案预算金额 +u666 | 矩形 | Unnamed | 预计成交概率 +u667 | 矩形 | Unnamed | 预计投标时间 +u668 | 矩形 | Unnamed | 设计配置 +u669 | 矩形 | Unnamed | 品牌要求 +u670 | 矩形 | Unnamed | 是否可换品牌 +u671 | 矩形 | Unnamed | 标底方 +u672 | 矩形 | Unnamed | 客户需求描述 +u673 | 矩形 | Unnamed | * +u675 | 矩形 | Unnamed | 根据现有清单匹配产品参数并提供调整建议。 +u676 | 矩形 | Unnamed | 对方要求的先进性及前瞻性的要求 +u678 | 矩形 | Unnamed | -- +u679 | 矩形 | Unnamed | 清单参数(是否是我司产品参数、工程师需要确认,是否有品牌?) +u681 | 矩形 | Unnamed | 是否是我司产品参数、工程师需要确认,是否有品牌。 +u682 | 矩形 | Unnamed | 清单参数是否能改 +u684 | 矩形 | Unnamed | 可改,按深化方案处理。 +u685 | 矩形 | Unnamed | 客户特殊要求(补充说明、备注说明) +u687 | 矩形 | Unnamed | -- +u688 | 矩形 | Unnamed | 方案卡填写时间 +u690 | 矩形 | Unnamed | 期望方案设计完成时间 +u692 | 矩形 | Unnamed | 业务需求 +u693 | 矩形 | Unnamed | * +u695 | 矩形 | Unnamed | 中配,主要从参数基础上控制配置成本,支持后续报价。 +u715 | 矩形 | Unnamed | 招标编号 +u724 | 矩形 | Unnamed | 选择方案卡模板 +u726 | 矩形 | Unnamed | 请选择本次方案卡使用的填写模板。公司通用方案卡默认推荐,仍可切换为其他有权使用的模板。 +u728 | 矩形 | Unnamed | 公司通用方案卡 +u730 | 矩形 | Unnamed | 公司推荐 +u731 | 矩形 | Unnamed | 公司标准统一方案卡模板,适用于全部有方案卡维护权限的用户。 +u732 | 矩形 | Unnamed | 适用范围:所有部门通用 +u733 | 矩形 | Unnamed | V1.1 · 已发布 +u735 | 矩形 | Unnamed | 桂冠天夏战队方案卡 +u736 | 矩形 | Unnamed | 独立维护的完整方案卡模板,适用于满足当前模板权限条件的用户。 +u737 | 矩形 | Unnamed | 适用范围:满足模板适用权限的用户 +u738 | 矩形 | Unnamed | V2.0 · 已发布 +u741 | 矩形 | Unnamed | 取消 +u743 | 矩形 | Unnamed | 下一步:填写方案卡 +u745 | 矩形 | Unnamed | 取消 diff --git a/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4________.txt b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4________.txt new file mode 100644 index 0000000..074e186 --- /dev/null +++ b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4________.txt @@ -0,0 +1,252 @@ +# a3-1-1-2-4________.html +# 控件 464,有文本 249 + +u3 | 矩形 | Unnamed | itc业务中台 +u10 | 矩形 | Unnamed | Panyu10109 +u14 | 矩形 | Unnamed | 16 +u16 | 矩形 | Unnamed | AI助手 +u20 | 矩形 | Unnamed | 商机管理 +u21 | 矩形 | Unnamed | 数据看板 +u27 | 矩形 | Unnamed | 销售机会 +u29 | 矩形 | Unnamed | 线索管理 +u30 | 矩形 | Unnamed | 客户管理 +u35 | 矩形 | Unnamed | 项目管理 +u38 | 矩形 | Unnamed | 首页 +u42 | 矩形 | Unnamed | 商机管理 +u45 | 矩形 | Unnamed | 商机公海 +u47 | 矩形 | Unnamed | 进入后台 +u49 | 矩形 | Unnamed | 线索管理 +u50 | 矩形 | Unnamed | 数据看板 +u55 | 矩形 | Unnamed | 线索管理设置 +u58 | 矩形 | Unnamed | 线索公海 +u60 | 矩形 | Unnamed | 客户管理 +u61 | 矩形 | Unnamed | 项目管理 +u62 | 矩形 | Unnamed | 商机管理 +u69 | 矩形 | Unnamed | 首页 +u72 | 矩形 | Unnamed | 进入后台 +u74 | 矩形 | Unnamed | 线索管理 +u77 | 矩形 | Unnamed | 我的关注 +u80 | 矩形 | Unnamed | 我的线索 +u83 | 矩形 | Unnamed | 首页 +u84 | 矩形 | Unnamed | 线索管理 +u85 | 矩形 | Unnamed | 客户管理 +u86 | 矩形 | Unnamed | 项目管理 +u87 | 矩形 | Unnamed | 系统设置 +u88 | 矩形 | Unnamed | 商机管理 +u89 | 矩形 | Unnamed | 数据看板 +u104 | 矩形 | Unnamed | 工作台 +u106 | 矩形 | Unnamed | 数据概览 +u108 | 矩形 | Unnamed | 工作计划 +u110 | 矩形 | Unnamed | <<收起菜单 +u112 | 矩形 | Unnamed | 线索管理 +u113 | 矩形 | Unnamed | 客户管理 +u114 | 矩形 | Unnamed | 系统设置 +u115 | 矩形 | Unnamed | 数据看板 +u125 | 矩形 | Unnamed | 我的客户 +u128 | 矩形 | Unnamed | 客户公海 +u130 | 矩形 | Unnamed | 项目管理 +u131 | 矩形 | Unnamed | 商机管理 +u136 | 矩形 | Unnamed | 首页 +u138 | 矩形 | Unnamed | 联系人管理 +u142 | 矩形 | Unnamed | 客户管理 +u145 | 矩形 | Unnamed | 客户管理设置 +u148 | 矩形 | Unnamed | 系统设置 +u149 | 矩形 | Unnamed | 数据看板 +u154 | 矩形 | Unnamed | 项目管理设置 +u155 | 矩形 | Unnamed | 首页 +u157 | 矩形 | Unnamed | 线索管理 +u158 | 矩形 | Unnamed | 客户管理 +u159 | 矩形 | Unnamed | 项目管理 +u160 | 矩形 | Unnamed | 商机管理 +u170 | 矩形 | Unnamed | 项目管理 +u175 | 矩形 | Unnamed | 项目统计 +u178 | 矩形 | Unnamed | 系统设置 +u179 | 矩形 | Unnamed | 数据看板 +u184 | 矩形 | Unnamed | -b +u185 | 矩形 | Unnamed | 首页 +u187 | 矩形 | Unnamed | 线索管理 +u188 | 矩形 | Unnamed | 客户管理 +u189 | 矩形 | Unnamed | 项目管理 +u190 | 矩形 | Unnamed | 商机管理 +u199 | 矩形 | Unnamed | -a +u204 | 矩形 | Unnamed | 系统设置 +u205 | 矩形 | Unnamed | 数据看板 +u210 | 矩形 | Unnamed | 首页 +u212 | 矩形 | Unnamed | 线索管理 +u213 | 矩形 | Unnamed | 客户管理 +u214 | 矩形 | Unnamed | 项目管理 +u215 | 矩形 | Unnamed | 商机管理 +u224 | 矩形 | Unnamed | -a +u227 | 矩形 | Unnamed | -b +u230 | 矩形 | Unnamed | -c +u232 | 矩形 | Unnamed | 金山谷智慧园区项目 +u233 | 矩形 | Unnamed | 招标形式: +u234 | 矩形 | Unnamed | ZC(政采标) +u235 | 矩形 | Unnamed | 责任人: +u236 | 矩形 | Unnamed | 张三 +u237 | 矩形 | Unnamed | 所属团队: +u238 | 矩形 | Unnamed | 特战团队 +u239 | 矩形 | Unnamed | 所属部门: +u240 | 矩形 | Unnamed | 粤疆战队-广东15部 +u241 | 矩形 | Unnamed | 返回 +u242 | 矩形 | Unnamed | 园区 +u243 | 矩形 | Unnamed | 项目阶段: +u244 | 矩形 | Unnamed | 标前设计 +u245 | 矩形 | Unnamed | 商机状态: +u246 | 矩形 | Unnamed | 推进中 +u247 | 矩形 | Unnamed | 方案预算: +u248 | 矩形 | Unnamed | 418.90 万元 +u249 | 矩形 | Unnamed | 写跟进 +u250 | 矩形 | Unnamed | 编辑 +u251 | 矩形 | Unnamed | 主要意向客户: +u252 | 矩形 | Unnamed | 广州亚东智能科技有限公司 +u253 | 矩形 | Unnamed | 新增方案卡 +u255 | 向右箭头按钮 | Unnamed | 客户圈定 +u256 | 圆形 | Unnamed | √ +u258 | 向右箭头按钮 | Unnamed | 关系摸排 +u260 | 圆形 | Unnamed | √ +u262 | 向右箭头按钮 | Unnamed | 资料采集 +u264 | 圆形 | Unnamed | √ +u266 | 向右箭头按钮 | Unnamed | 方案卡 +u268 | 圆形 | Unnamed | √ +u270 | 向右箭头按钮 | Unnamed | 已转项目 +u272 | 圆形 | Unnamed | √ +u274 | 矩形 | Unnamed | 概览 +u275 | 矩形 | Unnamed | 客户信息 +u276 | 矩形 | Unnamed | 现场勘察 +u277 | 矩形 | Unnamed | 相关附件 +u278 | 矩形 | Unnamed | 工作计划 +u279 | 矩形 | Unnamed | 团队成员 +u280 | 矩形 | Unnamed | 操作日志 +u281 | 矩形 | Unnamed | 方案卡 +u285 | 矩形 | Unnamed | 添加关联客户 +u286 | 矩形 | Unnamed | 推送方案 +u287 | 矩形 | Unnamed | 暂缓商机 +u288 | 矩形 | Unnamed | 抛公海 +u289 | 矩形 | Unnamed | 添加团队成员 +u290 | 矩形 | Unnamed | 关闭商机 +u291 | 矩形 | Unnamed | 跟进记录 +u294 | 矩形 | Unnamed | 新增关联客户 +u296 | 矩形 | Unnamed | 重置 +u297 | 矩形 | Unnamed | 查询 +u299 | 矩形 | Unnamed | 客户搜索结果 +u301 | 单元格 | Unnamed | 选择 +u302 | 单元格 | Unnamed | 客户名称 +u303 | 单元格 | Unnamed | 客户类型 +u304 | 单元格 | Unnamed | 地区 +u305 | 单元格 | Unnamed | 联系人 +u306 | 单元格 | Unnamed | 联系电话 +u307 | 单元格 | Unnamed | 客户负责人 +u309 | 单元格 | Unnamed | 广州新联智能工程有限公司 +u310 | 单元格 | Unnamed | 集成商 +u311 | 单元格 | Unnamed | 广州市番禺区 +u312 | 单元格 | Unnamed | 陈** +u313 | 单元格 | Unnamed | 138****6612 +u314 | 单元格 | Unnamed | 张三 +u316 | 单元格 | Unnamed | 深圳华创系统集成有限公司 +u317 | 单元格 | Unnamed | 总包 +u318 | 单元格 | Unnamed | 深圳市龙岗区 +u319 | 单元格 | Unnamed | 李** +u320 | 单元格 | Unnamed | 136****2208 +u321 | 单元格 | Unnamed | 李四 +u323 | 单元格 | Unnamed | 广州新联智能工程有限公司 +u324 | 单元格 | Unnamed | 集成商 +u325 | 单元格 | Unnamed | 广州市番禺区 +u326 | 单元格 | Unnamed | 陈** +u327 | 单元格 | Unnamed | 138****6612 +u328 | 单元格 | Unnamed | 张三 +u330 | 单元格 | Unnamed | 深圳华创系统集成有限公司 +u331 | 单元格 | Unnamed | 总包 +u332 | 单元格 | Unnamed | 深圳市龙岗区 +u333 | 单元格 | Unnamed | 李** +u334 | 单元格 | Unnamed | 136****2208 +u335 | 单元格 | Unnamed | 李四 +u337 | 单元格 | Unnamed | 广州新联智能工程有限公司 +u338 | 单元格 | Unnamed | 集成商 +u339 | 单元格 | Unnamed | 广州市番禺区 +u340 | 单元格 | Unnamed | 陈** +u341 | 单元格 | Unnamed | 138****6612 +u342 | 单元格 | Unnamed | 张三 +u344 | 单元格 | Unnamed | 深圳华创系统集成有限公司 +u345 | 单元格 | Unnamed | 总包 +u346 | 单元格 | Unnamed | 深圳市龙岗区 +u347 | 单元格 | Unnamed | 李** +u348 | 单元格 | Unnamed | 136****2208 +u349 | 单元格 | Unnamed | 李四 +u354 | 矩形 | Unnamed | 共XXX条 +u356 | 矩形 | Unnamed | < +u357 | 矩形 | Unnamed | 1 +u358 | 矩形 | Unnamed | 2 +u359 | 矩形 | Unnamed | 3 +u360 | 矩形 | Unnamed | 4 +u361 | 矩形 | Unnamed | 5 +u362 | 矩形 | Unnamed | 6 +u364 | 矩形 | Unnamed | ... +u365 | 矩形 | Unnamed | 》 +u366 | 矩形 | Unnamed | XXX +u367 | 矩形 | Unnamed | > +u368 | 矩形 | Unnamed | 跳至 +u370 | 矩形 | Unnamed | 页 +u371 | 矩形 | Unnamed | 共XXX条 +u373 | 矩形 | Unnamed | 跳至 +u375 | 矩形 | Unnamed | 页 +u376 | 矩形 | Unnamed | < +u377 | 矩形 | Unnamed | 1 +u378 | 矩形 | Unnamed | 4 +u379 | 矩形 | Unnamed | 5 +u380 | 矩形 | Unnamed | 6 +u381 | 矩形 | Unnamed | 7 +u382 | 矩形 | Unnamed | 8 +u383 | 矩形 | Unnamed | XXX +u384 | 矩形 | Unnamed | > +u386 | 矩形 | Unnamed | ... +u387 | 矩形 | Unnamed | 》 +u389 | 矩形 | Unnamed | ... +u390 | 矩形 | Unnamed | 《 +u391 | 矩形 | Unnamed | 共XXX条 +u393 | 矩形 | Unnamed | 跳至 +u395 | 矩形 | Unnamed | 页 +u396 | 矩形 | Unnamed | < +u397 | 矩形 | Unnamed | 1 +u398 | 矩形 | Unnamed | 9 +u399 | 矩形 | Unnamed | 10 +u400 | 矩形 | Unnamed | 11 +u401 | 矩形 | Unnamed | 12 +u402 | 矩形 | Unnamed | 13 +u403 | 矩形 | Unnamed | XXX +u404 | 矩形 | Unnamed | > +u406 | 矩形 | Unnamed | ... +u407 | 矩形 | Unnamed | 》 +u409 | 矩形 | Unnamed | ... +u410 | 矩形 | Unnamed | 《 +u411 | 矩形 | Unnamed | 客户联系人 +u412 | 矩形 | Unnamed | 是否主要意向客户 +u416 | 矩形 | Unnamed | 确认 +u417 | 矩形 | Unnamed | 取消 +u418 | 矩形 | Unnamed | +  快速创建客户 +u424 | 单元格 | Unnamed | 需求 +u425 | 单元格 | Unnamed | 需求说明 +u426 | 单元格 | Unnamed | 变更记录 +u427 | 单元格 | Unnamed | 1、开发说明 +u430 | 单元格 | Unnamed | 2、详细说明 +u433 | 矩形 | Unnamed | 商机管理-添加关联客户 +u435 | 单元格 | Unnamed | 需求 +u436 | 单元格 | Unnamed | 需求说明 +u437 | 单元格 | Unnamed | 变更记录 +u438 | 单元格 | Unnamed | 3、字段说明 +u441 | 矩形 | Unnamed | 商机管理-添加关联客户 +u443 | 单元格 | Unnamed | 需求 +u444 | 单元格 | Unnamed | 需求说明 +u445 | 单元格 | Unnamed | 变更记录 +u446 | 单元格 | Unnamed | 4、交互说明 +u449 | 矩形 | Unnamed | 商机管理-添加关联客户 +u451 | 单元格 | Unnamed | 需求 +u452 | 单元格 | Unnamed | 需求说明 +u453 | 单元格 | Unnamed | 变更记录 +u454 | 单元格 | Unnamed | 5、业务规则&功能逻辑 +u457 | 矩形 | Unnamed | 商机管理-添加关联客户 +u459 | 单元格 | Unnamed | 需求 +u460 | 单元格 | Unnamed | 需求说明 +u461 | 单元格 | Unnamed | 变更记录 +u462 | 单元格 | Unnamed | 6、原型体验及 | 验收标准 +u465 | 矩形 | Unnamed | 商机管理-添加关联客户 diff --git a/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4_raw.html b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4_raw.html new file mode 100644 index 0000000..0b88108 --- /dev/null +++ b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4_raw.html @@ -0,0 +1,3832 @@ + + + + A3-1-1-2-4  添加关联客户 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ + +
+
+ +
+ + +
+ +
+

      itc业务中台

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+

Panyu10109

+
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+

16

+
+
+
+ + +
+ + +
+ +
+

        AI助手

+
+
+ + +
+ + +
+
+ + + + +
+
+
+ + +
+
+
+

商机管理

+
+
+ + +
+
+
+

数据看板

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+

    销售机会

+
+
+ + +
+ + +
+
+ + +
+
+
+

线索管理

+
+
+ + +
+
+
+

客户管理

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+

项目管理

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+

首页

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+

    商机管理

+
+
+ + +
+ + +
+
+ + +
+ + +
+
+
+

    商机公海

+
+
+ + +
+ + +
+
+ + +
+
+
+

进入后台

+
+
+
+
+ + + + + + +
+ + + +
+
+
+

金山谷智慧园区项目

+
+
+ + +
+
+
+

招标形式:

+
+
+ + +
+
+
+

ZC(政采标)

+
+
+ + +
+
+
+

责任人:

+
+
+ + +
+
+
+

张三

+
+
+ + +
+
+
+

所属团队:

+
+
+ + +
+
+
+

特战团队

+
+
+ + +
+
+
+

所属部门:

+
+
+ + +
+
+
+

粤疆战队-广东15部

+
+
+ + +
+
+
+

返回

+
+
+ + +
+
+
+

园区

+
+
+ + +
+
+
+

项目阶段:

+
+
+ + +
+
+
+

标前设计

+
+
+ + +
+
+
+

商机状态:

+
+
+ + +
+
+
+

推进中

+
+
+ + +
+
+
+

方案预算:

+
+
+ + +
+
+
+

418.90 万元

+
+
+ + +
+
+
+

写跟进

+
+
+ + +
+
+
+

编辑

+
+
+ + +
+
+
+

主要意向客户:

+
+
+ + +
+
+
+

广州亚东智能科技有限公司

+
+
+ + +
+
+
+

新增方案卡

+
+
+ + +
+ + +
+ +
+

  客户圈定

+
+
+ + +
+ +
+

+
+
+
+ + +
+ + +
+ +
+

  关系摸排

+
+
+ + +
+ + +
+ + +
+ +
+

+
+
+
+ + +
+ + +
+ +
+

  资料采集

+
+
+ + +
+ + +
+ + +
+ +
+

+
+
+
+ + +
+ + +
+ +
+

  方案卡

+
+
+ + +
+ + +
+ + +
+ +
+

+
+
+
+ + +
+ + +
+ +
+

  已转项目

+
+
+ + +
+ + +
+ + +
+ +
+

+
+
+
+ + +
+ + +
+ + +
+
+
+

概览

+
+
+ + +
+
+
+

客户信息

+
+
+ + +
+
+
+

现场勘察

+
+
+ + +
+
+
+

相关附件

+
+
+ + +
+
+
+

工作计划

+
+
+ + +
+
+
+

团队成员

+
+
+ + +
+
+
+

操作日志

+
+
+ + +
+
+
+

方案卡

+
+
+ + +
+
+ +
+ + +
+
+
+

商机 > 销售机会 > 金山谷智慧园区项目

+
+
+ + +
+
+
+

商机推进指引   按照公司标准打法,对商机定义当前进度及明确节点工作

+
+
+ + +
+
+
+

添加关联客户

+
+
+ + +
+
+
+

推送方案

+
+
+ + +
+
+
+

暂缓商机

+
+
+ + +
+
+
+

抛公海

+
+
+ + +
+
+
+

添加团队成员

+
+
+ + +
+
+
+

关闭商机

+
+
+ + +
+
+
+

跟进记录

+
+
+ + + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

新增关联客户

+
+
+ + +
+
+ +
+ + +
+
+
+

重置

+
+
+ + +
+
+
+

查询

+
+
+ + +
+
+ +
+ + +
+
+
+

客户搜索结果

+
+
+ + +
+ + +
+ +
+

选择

+
+
+ + +
+ +
+

客户名称

+
+
+ + +
+ +
+

客户类型

+
+
+ + +
+ +
+

地区

+
+
+ + +
+ +
+

联系人

+
+
+ + +
+ +
+

联系电话

+
+
+ + +
+ +
+

客户负责人

+
+
+ + +
+ + +
+ + +
+ +
+

广州新联智能工程有限公司

+
+
+ + +
+ +
+

集成商

+
+
+ + +
+ +
+

广州市番禺区

+
+
+ + +
+ +
+

陈**

+
+
+ + +
+ +
+

138****6612

+
+
+ + +
+ +
+

张三

+
+
+ + +
+ + +
+ + +
+ +
+

深圳华创系统集成有限公司

+
+
+ + +
+ +
+

总包

+
+
+ + +
+ +
+

深圳市龙岗区

+
+
+ + +
+ +
+

李**

+
+
+ + +
+ +
+

136****2208

+
+
+ + +
+ +
+

李四

+
+
+ + +
+ + +
+ + +
+ +
+

广州新联智能工程有限公司

+
+
+ + +
+ +
+

集成商

+
+
+ + +
+ +
+

广州市番禺区

+
+
+ + +
+ +
+

陈**

+
+
+ + +
+ +
+

138****6612

+
+
+ + +
+ +
+

张三

+
+
+ + +
+ + +
+ + +
+ +
+

深圳华创系统集成有限公司

+
+
+ + +
+ +
+

总包

+
+
+ + +
+ +
+

深圳市龙岗区

+
+
+ + +
+ +
+

李**

+
+
+ + +
+ +
+

136****2208

+
+
+ + +
+ +
+

李四

+
+
+ + +
+ + +
+ + +
+ +
+

广州新联智能工程有限公司

+
+
+ + +
+ +
+

集成商

+
+
+ + +
+ +
+

广州市番禺区

+
+
+ + +
+ +
+

陈**

+
+
+ + +
+ +
+

138****6612

+
+
+ + +
+ +
+

张三

+
+
+ + +
+ + +
+ + +
+ +
+

深圳华创系统集成有限公司

+
+
+ + +
+ +
+

总包

+
+
+ + +
+ +
+

深圳市龙岗区

+
+
+ + +
+ +
+

李**

+
+
+ + +
+ +
+

136****2208

+
+
+ + +
+ +
+

李四

+
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+ + +
+
+
+

XXX

+
+
+ + +
+
+ +
+ + +
+
+
+

<

+
+
+ + +
+
+
+

1

+
+
+ + +
+
+
+

2

+
+
+ + +
+
+
+

3

+
+
+ + +
+
+
+

4

+
+
+ + +
+
+
+

5

+
+
+ + +
+
+
+

6

+
+
+ + +
+
+
+ + +
+
+
+

...

+
+
+
+
+ +
+ + +
+
+
+

XXX

+
+
+ + +
+
+
+

>

+
+
+ + +
+
+
+

跳至

+
+
+ + +
+
+ +
+ + +
+
+
+

+
+
+
+
+ + +
+ + +
+
+
+

客户联系人

+
+
+ + +
+
+
+

是否主要意向客户

+
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + +
+
+
+

确认

+
+
+ + +
+
+
+

取消

+
+
+ + +
+
+
+

+  快速创建客户

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

1、开发说明

+
+
+ + +
+ +
+

【页面名称】

新增关联客户

 

【进入路径】

CRM系统 > 商机管理 > 销售机会 > 商机详情 > 客户信息 > 添加关联客户

 

【页面定位】

本页面用于从客户库中选择客户,并将其关联至当前商机,同时设置客户角色、客户联系人及是否为主要客户。

 

【核心说明】

用户点击“添加关联客户”后,以弹窗形式打开本页面。

 

用户需先选择一个客户,再补充该客户在当前商机中的业务角色、联系人及主要客户标记。确认后,系统建立商机与客户之间的关联关系。

 

若客户库中不存在目标客户,可通过“快速创建客户”进入客户创建流程。

+
+
+ + +
+ + +
+ + +
+ +
+

2、详细说明

+
+
+ + +
+ +
+

1. 页面遮罩区

弹窗打开后,底层商机详情页面保持展示并增加遮罩,避免用户同时操作背景页面。

 

2. 弹窗标题区

展示“新增关联客户”,用于说明当前操作内容。

 

3. 客户查询区

支持按客户名称、联系人、联系电话及客户类型查询客户。

 

4. 快速创建客户入口

当客户库中不存在目标客户时,用于进入客户快速创建流程。

 

5. 客户搜索结果区

以表格形式展示符合查询条件的客户信息,并支持单选。

 

6. 分页区

当客户数量较多时,支持切换页码、每页条数及页码跳转。

 

7. 关联信息设置区

用于设置客户角色、客户联系人及是否主要客户。

 

8. 底部操作区

展示“取消”和“确认”按钮,用于放弃或提交客户关联操作。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-添加关联客户

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

3、字段说明

+
+
+ + +
+ +
+

1. 客户名称 / 联系人 / 联系电话

字段类型:文本输入框。

字段说明:用于按客户名称、联系人姓名或联系电话模糊查询客户。

 

2. 客户类型

字段类型:下拉选择框。

字段说明:用于按客户类型筛选客户。

字段规则:选项来源于客户类型字典。

 

3. 快速创建客户

字段类型:复选框或快捷入口。

字段说明:当客户库中不存在目标客户时,用于进入客户快速创建流程。

 

4. 选择

字段类型:单选框。

字段说明:选择需要关联至当前商机的客户。

字段规则:每次只能选择一个客户。

 

5. 客户名称

字段类型:列表展示字段。

字段说明:展示客户单位名称。

 

6. 客户类型

字段类型:列表展示字段。

字段说明:展示客户所属类型,例如总包、集成商等。

 

7. 地区

字段类型:列表展示字段。

字段说明:展示客户所在省、市、区。

 

8. 联系人

字段类型:列表展示字段。

字段说明:展示客户默认或主要联系人。

 

9. 联系电话

字段类型:列表展示字段。

字段说明:展示客户联系人电话。

字段规则:根据系统权限进行脱敏展示。

 

10. 客户负责人

字段类型:列表展示字段。

字段说明:展示当前负责维护该客户的人员。

 

11. 客户角色

字段类型:下拉选择框。

字段说明:设置该客户在当前商机中的业务角色,例如投标公司、总包、工程商等。

字段规则:必填,选项来源于客户角色字典。

 

12. 客户联系人

字段类型:下拉选择框。

字段说明:选择当前商机主要对接的客户联系人。

字段规则:候选范围为当前选中客户下的联系人。

 

13. 是否主要客户

字段类型:下拉选择框。

字段说明:标识该客户是否为当前商机的主要客户。

字段规则:必填,同一商机原则上只能存在一个主要客户。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-添加关联客户

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

4、交互说明

+
+
+ + +
+ +
+

1. 打开弹窗

用户点击“添加关联客户”后,打开新增关联客户弹窗。

 

2. 查询客户

用户输入查询条件后点击“查询”,客户列表刷新并展示符合条件的数据。

 

3. 重置查询

点击“重置”后,清空查询条件并恢复默认客户列表。

 

4. 选择客户

用户点击客户行前的单选框后,选中该客户。

选中客户后,客户联系人下拉选项需同步刷新。

 

5. 设置客户角色

用户选择该客户在当前商机中的业务角色。

 

6. 选择客户联系人

客户联系人只能从当前选中客户的联系人范围中选择。

切换客户后,原客户联系人需清空并重新选择。

 

7. 设置主要客户

用户选择是否将该客户设置为当前商机的主要客户。

 

8. 快速创建客户

用户勾选或点击“快速创建客户”后,进入快速创建客户页面或弹窗。

客户创建成功后,可返回当前页面并自动选中新建客户。

 

9. 取消

点击“取消”后关闭弹窗,不建立客户关联关系。

 

10. 确认

点击“确认”后,系统校验客户选择、客户角色及其他必填信息。

校验通过后建立关联关系;校验失败时保留当前内容并提示具体问题。

 

11. 关联成功

关联成功后关闭弹窗,并刷新商机详情中的客户信息列表。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-添加关联客户

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

5、业务规则&功能逻辑

+
+
+ + +
+ +
+

1. 客户选择规则

每次新增关联操作只能选择一个客户。

 

2. 客户来源规则

可关联客户来源于客户管理模块中的有效客户数据。

 

3. 重复关联规则

同一客户原则上不得重复关联至同一商机。

若客户已经关联,系统需提示用户,不得重复新增。

 

4. 客户联系人规则

客户联系人必须归属于当前选中的客户。

 

5. 客户角色规则

客户角色用于标识客户在当前商机中的业务身份,选项统一读取系统配置。

 

6. 主要客户规则

同一商机只能存在一个主要客户。

将新客户设置为主要客户后,原主要客户需自动调整为普通关联客户。

 

7. 快速创建规则

快速创建的客户需先写入客户管理模块,再与当前商机建立关联。

 

8. 联系方式脱敏规则

客户联系电话根据当前用户权限展示完整号码或脱敏号码。

 

9. 权限规则

只有具备客户关联权限的用户可以使用“添加关联客户”功能。

 

10. 数据同步规则

关联成功后,客户信息页签、商机概览及相关方案卡中的客户候选范围需同步更新。

 

11. 操作日志规则

新增关联客户成功后,系统需记录操作人、操作时间、关联客户及客户角色。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-添加关联客户

+
+
+ + +
+ + +
+ +
+

需求

+
+
+ + +
+ +
+

需求说明

+
+
+ + +
+ +
+

变更记录

+
+
+ + +
+ +
+

6、原型体验及

验收标准

+
+
+ + +
+ +
+

1. 点击“添加关联客户”后,可以正常打开新增关联客户弹窗。

 

2. 页面需展示客户查询区、搜索结果区、分页区、关联信息设置区及底部操作区。

 

3. 用户可以通过客户名称、联系人、联系电话及客户类型查询客户。

 

4. 点击“重置”后,查询条件需清空并恢复默认客户列表。

 

5. 客户列表需展示客户名称、客户类型、地区、联系人、联系电话、客户负责人等信息。

 

6. 客户列表每次只能选择一条数据。

 

7. 选择客户后,客户联系人范围需根据该客户同步刷新。

 

8. 未选择客户或未填写必填信息时,系统不得提交。

 

9. 同一客户已关联当前商机时,系统需阻止重复关联并给出提示。

 

10. 将客户设置为主要客户后,原主要客户状态需同步调整。

 

11. 点击“快速创建客户”后,可以正常进入客户快速创建流程。

 

12. 快速创建客户成功后,可返回当前页面并继续完成关联操作。

 

13. 点击“取消”后,弹窗正常关闭且不建立客户关联。

 

14. 点击“确认”并通过校验后,系统需成功建立商机与客户的关联关系。

 

15. 关联成功后,商机详情中的客户信息列表需同步刷新。

 

16. 当前用户无关联客户权限时,不展示相关入口或给出无权限提示。

 

17. 新增关联客户成功后,操作日志需生成对应记录。

+
+
+ + +
+ + +
+
+ + +
+ +
+

商机管理-添加关联客户

+
+
+
+ + + diff --git a/.scratch/lanhu-latest/v29-customer-pages/a3-1-1_销售机会列表.txt b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1_销售机会列表.txt new file mode 100644 index 0000000..cfd1656 --- /dev/null +++ b/.scratch/lanhu-latest/v29-customer-pages/a3-1-1_销售机会列表.txt @@ -0,0 +1,334 @@ +# a3-1-1_销售机会列表.html +# 控件 595,有文本 331 + +u0 | 矩形 | Unnamed | ` +u3 | 矩形 | Unnamed | itc业务中台 +u7 | 矩形 | Unnamed | Panyu10109 +u12 | 矩形 | Unnamed | 16 +u14 | 矩形 | Unnamed | AI助手 +u18 | 矩形 | Unnamed | 商机管理 +u19 | 矩形 | Unnamed | 数据看板 +u25 | 矩形 | Unnamed | 销售机会 +u27 | 矩形 | Unnamed | 线索管理 +u28 | 矩形 | Unnamed | 客户管理 +u33 | 矩形 | Unnamed | 项目管理 +u36 | 矩形 | Unnamed | 首页 +u40 | 矩形 | Unnamed | 商机管理 +u43 | 矩形 | Unnamed | 商机公海 +u45 | 矩形 | Unnamed | 进入后台 +u47 | 矩形 | Unnamed | 线索管理 +u48 | 矩形 | Unnamed | 数据看板 +u53 | 矩形 | Unnamed | 线索管理设置 +u56 | 矩形 | Unnamed | 线索公海 +u58 | 矩形 | Unnamed | 客户管理 +u59 | 矩形 | Unnamed | 项目管理 +u60 | 矩形 | Unnamed | 商机管理 +u67 | 矩形 | Unnamed | 首页 +u70 | 矩形 | Unnamed | 进入后台 +u72 | 矩形 | Unnamed | 线索管理 +u75 | 矩形 | Unnamed | 我的关注 +u78 | 矩形 | Unnamed | 我的线索 +u81 | 矩形 | Unnamed | 首页 +u82 | 矩形 | Unnamed | 线索管理 +u83 | 矩形 | Unnamed | 客户管理 +u84 | 矩形 | Unnamed | 项目管理 +u85 | 矩形 | Unnamed | 系统设置 +u86 | 矩形 | Unnamed | 商机管理 +u87 | 矩形 | Unnamed | 数据看板 +u102 | 矩形 | Unnamed | 工作台 +u104 | 矩形 | Unnamed | 数据概览 +u106 | 矩形 | Unnamed | 工作计划 +u108 | 矩形 | Unnamed | <<收起菜单 +u110 | 矩形 | Unnamed | 线索管理 +u111 | 矩形 | Unnamed | 客户管理 +u112 | 矩形 | Unnamed | 系统设置 +u113 | 矩形 | Unnamed | 数据看板 +u123 | 矩形 | Unnamed | 我的客户 +u126 | 矩形 | Unnamed | 客户公海 +u128 | 矩形 | Unnamed | 项目管理 +u129 | 矩形 | Unnamed | 商机管理 +u134 | 矩形 | Unnamed | 首页 +u136 | 矩形 | Unnamed | 联系人管理 +u140 | 矩形 | Unnamed | 客户管理 +u143 | 矩形 | Unnamed | 客户管理设置 +u146 | 矩形 | Unnamed | 系统设置 +u147 | 矩形 | Unnamed | 数据看板 +u152 | 矩形 | Unnamed | 项目管理设置 +u153 | 矩形 | Unnamed | 首页 +u155 | 矩形 | Unnamed | 线索管理 +u156 | 矩形 | Unnamed | 客户管理 +u157 | 矩形 | Unnamed | 项目管理 +u158 | 矩形 | Unnamed | 商机管理 +u168 | 矩形 | Unnamed | 项目管理 +u173 | 矩形 | Unnamed | 项目统计 +u176 | 矩形 | Unnamed | 系统设置 +u177 | 矩形 | Unnamed | 数据看板 +u182 | 矩形 | Unnamed | -b +u183 | 矩形 | Unnamed | 首页 +u185 | 矩形 | Unnamed | 线索管理 +u186 | 矩形 | Unnamed | 客户管理 +u187 | 矩形 | Unnamed | 项目管理 +u188 | 矩形 | Unnamed | 商机管理 +u197 | 矩形 | Unnamed | -a +u202 | 矩形 | Unnamed | 系统设置 +u203 | 矩形 | Unnamed | 数据看板 +u208 | 矩形 | Unnamed | 首页 +u210 | 矩形 | Unnamed | 线索管理 +u211 | 矩形 | Unnamed | 客户管理 +u212 | 矩形 | Unnamed | 项目管理 +u213 | 矩形 | Unnamed | 商机管理 +u222 | 矩形 | Unnamed | -a +u225 | 矩形 | Unnamed | -b +u228 | 矩形 | Unnamed | -c +u232 | 矩形 | Unnamed | 查询 +u233 | 矩形 | Unnamed | 重置 +u234 | 矩形 | Unnamed | + 新增商机 +u249 | 矩形 | Unnamed | 共 33 条 +u251 | 矩形 | Unnamed | < +u252 | 矩形 | Unnamed | 1 +u253 | 矩形 | Unnamed | 2 +u254 | 矩形 | Unnamed | 3 +u255 | 矩形 | Unnamed | 4 +u256 | 矩形 | Unnamed | 5 +u257 | 矩形 | Unnamed | 6 +u259 | 矩形 | Unnamed | ... +u260 | 矩形 | Unnamed | 》 +u261 | 矩形 | Unnamed | XXX +u262 | 矩形 | Unnamed | > +u263 | 矩形 | Unnamed | 跳至 +u265 | 矩形 | Unnamed | 页 +u266 | 矩形 | Unnamed | 共XXX条 +u268 | 矩形 | Unnamed | 跳至 +u270 | 矩形 | Unnamed | 页 +u271 | 矩形 | Unnamed | < +u272 | 矩形 | Unnamed | 1 +u273 | 矩形 | Unnamed | 4 +u274 | 矩形 | Unnamed | 5 +u275 | 矩形 | Unnamed | 6 +u276 | 矩形 | Unnamed | 7 +u277 | 矩形 | Unnamed | 8 +u278 | 矩形 | Unnamed | XXX +u279 | 矩形 | Unnamed | > +u281 | 矩形 | Unnamed | ... +u282 | 矩形 | Unnamed | 》 +u284 | 矩形 | Unnamed | ... +u285 | 矩形 | Unnamed | 《 +u286 | 矩形 | Unnamed | 共XXX条 +u288 | 矩形 | Unnamed | 跳至 +u290 | 矩形 | Unnamed | 页 +u291 | 矩形 | Unnamed | < +u292 | 矩形 | Unnamed | 1 +u293 | 矩形 | Unnamed | 9 +u294 | 矩形 | Unnamed | 10 +u295 | 矩形 | Unnamed | 11 +u296 | 矩形 | Unnamed | 12 +u297 | 矩形 | Unnamed | 13 +u298 | 矩形 | Unnamed | XXX +u299 | 矩形 | Unnamed | > +u301 | 矩形 | Unnamed | ... +u302 | 矩形 | Unnamed | 》 +u304 | 矩形 | Unnamed | ... +u305 | 矩形 | Unnamed | 《 +u307 | 矩形 | Unnamed | 销售机会 +u309 | 矩形 | Unnamed | 我负责的销售机会  ▾ +u311 | 单元格 | Unnamed | 序号 +u312 | 单元格 | Unnamed | 商机名称 +u313 | 单元格 | Unnamed | 甲方 +u314 | 单元格 | Unnamed | 意向客户 +u315 | 单元格 | Unnamed | 行业 +u316 | 单元格 | Unnamed | 地区 +u317 | 单元格 | Unnamed | 方案预算 +u318 | 单元格 | Unnamed | 当前工作节点 +u319 | 单元格 | Unnamed | 节点停留时间 +u320 | 单元格 | Unnamed | 最近跟进 +u321 | 单元格 | Unnamed | 下一节点 +u322 | 单元格 | Unnamed | 方案卡状态 +u323 | 单元格 | Unnamed | 操作 +u324 | 单元格 | Unnamed | 1 +u326 | 单元格 | Unnamed | 广州市第三中学 +u327 | 单元格 | Unnamed | 广州亚东智能科技有限公司 +u329 | 单元格 | Unnamed | 广州市番禺区 +u330 | 单元格 | Unnamed | ¥418.9万元 +u332 | 单元格 | Unnamed | 6天 +u333 | 单元格 | Unnamed | 今天 10:30 +u334 | 单元格 | Unnamed | 已转项目 +u335 | 单元格 | Unnamed | 已推送 +u336 | 单元格 | Unnamed | 详情  写跟进 +u337 | 单元格 | Unnamed | 2 +u339 | 单元格 | Unnamed | 广州地铁集团 +u340 | 单元格 | Unnamed | 广东轨交通信工程有限公司 +u342 | 单元格 | Unnamed | 广州市 +u343 | 单元格 | Unnamed | ¥780.0万元 +u345 | 单元格 | Unnamed | 12天 +u346 | 单元格 | Unnamed | 5天前 +u347 | 单元格 | Unnamed | 资料采集 +u348 | 单元格 | Unnamed | 未创建 +u349 | 单元格 | Unnamed | 详情  写跟进 +u350 | 单元格 | Unnamed | 3 +u352 | 单元格 | Unnamed | 番禺区文旅中心 +u353 | 单元格 | Unnamed | 广州番禺文旅工程有限公司 +u355 | 单元格 | Unnamed | 广州市番禺区 +u356 | 单元格 | Unnamed | ¥234.1万元 +u358 | 单元格 | Unnamed | 4天 +u359 | 单元格 | Unnamed | 2天前 +u360 | 单元格 | Unnamed | 方案卡 +u361 | 单元格 | Unnamed | 填写中 +u362 | 单元格 | Unnamed | 详情  写跟进 +u363 | 单元格 | Unnamed | 4 +u365 | 单元格 | Unnamed | 天河区教育局 +u366 | 单元格 | Unnamed | 广东智慧教育科技有限公司 +u368 | 单元格 | Unnamed | 广州市天河区 +u369 | 单元格 | Unnamed | ¥120.0万元 +u371 | 单元格 | Unnamed | 2天 +u372 | 单元格 | Unnamed | 1天前 +u373 | 单元格 | Unnamed | 关系摸排 +u374 | 单元格 | Unnamed | 未创建 +u375 | 单元格 | Unnamed | 详情  写跟进 +u376 | 单元格 | Unnamed | 5 +u378 | 单元格 | Unnamed | 白云国际会议中心 +u379 | 单元格 | Unnamed | 广州白云会展工程有限公司 +u381 | 单元格 | Unnamed | 广州市白云区 +u382 | 单元格 | Unnamed | ¥365.0万元 +u384 | 单元格 | Unnamed | 8天 +u385 | 单元格 | Unnamed | 今天 10:30 +u386 | 单元格 | Unnamed | 已转项目 +u387 | 单元格 | Unnamed | 已推送 +u388 | 单元格 | Unnamed | 详情  写跟进 +u389 | 单元格 | Unnamed | 6 +u391 | 单元格 | Unnamed | 海珠区人民医院 +u392 | 单元格 | Unnamed | 广东康联医疗科技有限公司 +u394 | 单元格 | Unnamed | 广州市海珠区 +u395 | 单元格 | Unnamed | ¥961.0万元 +u397 | 单元格 | Unnamed | 3天 +u398 | 单元格 | Unnamed | 5天前 +u399 | 单元格 | Unnamed | 资料采集 +u400 | 单元格 | Unnamed | 未创建 +u401 | 单元格 | Unnamed | 详情  写跟进 +u402 | 单元格 | Unnamed | 7 +u404 | 单元格 | Unnamed | 南沙港集团 +u405 | 单元格 | Unnamed | 广州南沙港信息工程有限公司 +u407 | 单元格 | Unnamed | 广州市南沙区 +u408 | 单元格 | Unnamed | ¥1120.0万元 +u410 | 单元格 | Unnamed | 9天 +u411 | 单元格 | Unnamed | 2天前 +u412 | 单元格 | Unnamed | 方案卡 +u413 | 单元格 | Unnamed | 填写中 +u414 | 单元格 | Unnamed | 详情  写跟进 +u415 | 单元格 | Unnamed | 8 +u417 | 单元格 | Unnamed | 花都区文旅集团 +u418 | 单元格 | Unnamed | 广东花都演艺设备有限公司 +u420 | 单元格 | Unnamed | 广州市花都区 +u421 | 单元格 | Unnamed | ¥288.0万元 +u423 | 单元格 | Unnamed | 11天 +u424 | 单元格 | Unnamed | 1天前 +u425 | 单元格 | Unnamed | 关系摸排 +u426 | 单元格 | Unnamed | 未创建 +u427 | 单元格 | Unnamed | 详情  写跟进 +u428 | 单元格 | Unnamed | 9 +u430 | 单元格 | Unnamed | 黄埔产业园运营公司 +u431 | 单元格 | Unnamed | 广州黄埔智联科技有限公司 +u433 | 单元格 | Unnamed | 广州市黄埔区 +u434 | 单元格 | Unnamed | ¥480.0万元 +u436 | 单元格 | Unnamed | 7天 +u437 | 单元格 | Unnamed | 2天前 +u438 | 单元格 | Unnamed | 方案卡 +u439 | 单元格 | Unnamed | 填写中 +u440 | 单元格 | Unnamed | 详情  写跟进 +u441 | 单元格 | Unnamed | 10 +u443 | 单元格 | Unnamed | 增城区教育局 +u444 | 单元格 | Unnamed | 广东增城教育装备有限公司 +u446 | 单元格 | Unnamed | 广州市增城区 +u447 | 单元格 | Unnamed | ¥680.0万元 +u449 | 单元格 | Unnamed | 2天 +u450 | 单元格 | Unnamed | 1天前 +u451 | 单元格 | Unnamed | 关系摸排 +u452 | 单元格 | Unnamed | 填写中 +u453 | 单元格 | Unnamed | 详情  写跟进 +u454 | 矩形 | Unnamed | 广州三中校园广播改造 +u455 | 矩形 | Unnamed | 教育 +u456 | 矩形 | Unnamed | 交通 +u457 | 矩形 | Unnamed | 文旅 +u458 | 矩形 | Unnamed | 教育 +u459 | 矩形 | Unnamed | 地铁站点视频会议系统升级 +u460 | 矩形 | Unnamed | 番禺文旅中心多功能厅 +u461 | 矩形 | Unnamed | 天河区智慧教室改造 +u466 | 矩形 | Unnamed | 方案卡 +u467 | 矩形 | Unnamed | 关系摸排 +u468 | 矩形 | Unnamed | 资料采集 +u469 | 矩形 | Unnamed | 客户圈定 +u470 | 矩形 | Unnamed | 白云区国际会议中心升级 +u471 | 矩形 | Unnamed | 海珠区医院会议系统采购 +u472 | 矩形 | Unnamed | 南沙港船舶调度中心改造升级 +u473 | 矩形 | Unnamed | 花都文旅剧场扩声系统升级 +u474 | 矩形 | Unnamed | 黄浦区产业园多媒体升级 +u475 | 矩形 | Unnamed | 增城区学校报告厅建设 +u476 | 矩形 | Unnamed | 展厅 +u477 | 矩形 | Unnamed | 医疗 +u478 | 矩形 | Unnamed | 交通 +u479 | 矩形 | Unnamed | 文旅 +u480 | 矩形 | Unnamed | 园区 +u481 | 矩形 | Unnamed | 教育 +u482 | 矩形 | Unnamed | 方案卡 +u483 | 矩形 | Unnamed | 关系摸排 +u484 | 矩形 | Unnamed | 资料采集 +u485 | 矩形 | Unnamed | 客户圈定 +u486 | 矩形 | Unnamed | 资料采集 +u487 | 矩形 | Unnamed | 客户圈定 +u488 | 矩形 | Unnamed | 结构完全一致的页面 | · 【我负责的销售机会】 | · 【我参与的销售机会】 +u493 | 单元格 | Unnamed | 需求 +u494 | 单元格 | Unnamed | 需求说明 +u495 | 单元格 | Unnamed | 变更记录 +u496 | 单元格 | Unnamed | 1、开发说明 +u499 | 单元格 | Unnamed | 2、详细说明 +u502 | 矩形 | Unnamed | 销售机会列表(需求批注)-详版 +u504 | 单元格 | Unnamed | 需求 +u505 | 单元格 | Unnamed | 需求说明 +u506 | 单元格 | Unnamed | 变更记录 +u507 | 单元格 | Unnamed | 3、字段说明 +u510 | 矩形 | Unnamed | 商机管理-销售机会列表 +u512 | 单元格 | Unnamed | 需求 +u513 | 单元格 | Unnamed | 需求说明 +u514 | 单元格 | Unnamed | 变更记录 +u515 | 单元格 | Unnamed | 4、交互说明 +u518 | 矩形 | Unnamed | 商机管理-销售机会列表 +u520 | 单元格 | Unnamed | 需求 +u521 | 单元格 | Unnamed | 需求说明 +u522 | 单元格 | Unnamed | 变更记录 +u523 | 单元格 | Unnamed | 5、业务规则&功能逻辑 +u526 | 矩形 | Unnamed | 商机管理-销售机会列表 +u528 | 单元格 | Unnamed | 需求 +u529 | 单元格 | Unnamed | 需求说明 +u530 | 单元格 | Unnamed | 变更记录 +u531 | 单元格 | Unnamed | 6、原型体验及 | 验收标准 +u534 | 矩形 | Unnamed | 商机管理-销售机会列表 +u535 | 矩形 | Unnamed | 1、详情:点击后跳A-3-1-1-1-1页面 |
| 2、写跟进:点击后当前页面跳弹窗——A3-1-1-2-2 +u538 | 矩形 | Unnamed | 常用检索 +u539 | 矩形 | Unnamed | 自定义检索 +u540 | 矩形 | Unnamed | 最近访问 +u541 | 矩形 | Unnamed | 我负责的销售机会 +u542 | 矩形 | Unnamed | 我参与的销售机会 +u543 | 矩形 | Unnamed | 我关注的销售机会 +u544 | 矩形 | Unnamed | 未命名的自定义检索 +u550 | 矩形 | Unnamed | ··· +u552 | 矩形 | Unnamed | 常用检索 +u553 | 矩形 | Unnamed | 自定义检索 +u554 | 矩形 | Unnamed | 检索名称 +u556 | 矩形 | Unnamed | 检索条件 +u557 | 矩形 | Unnamed | 检索条件,支持复合查询 +u558 | 矩形 | Unnamed | 1. +u559 | 矩形 | Unnamed | + 添加更多条件 +u562 | 矩形 | Unnamed | 2. +u565 | 矩形 | Unnamed | 排序条件 +u569 | 菜单项 | Unnamed | 升序 +u570 | 菜单项 | Unnamed | 降序 +u572 | 矩形 | Unnamed | 保存为常用检索 +u573 | 矩形 | Unnamed | 搜索 +u577 | 单元格 | Unnamed | 需求 +u578 | 单元格 | Unnamed | 需求说明 +u579 | 单元格 | Unnamed | 变更记录 +u580 | 单元格 | Unnamed | 1、视图定位与 | 数据过滤范围 +u583 | 单元格 | Unnamed | 2、顶部查询与 | 批量操作区 +u586 | 单元格 | Unnamed | 3、核心字段与 | 业务展示规则 +u589 | 单元格 | Unnamed | 4、交互联动与 | 数据一致性 +u592 | 单元格 | Unnamed | 5、操作栏逻辑与权限控制 +u595 | 形状 | Unnamed | 销售机会列表(需求批注)-简版 diff --git a/.scratch/lanhu-latest/v29-customer-pages/a4-4-1_客户详情(客户信息).txt b/.scratch/lanhu-latest/v29-customer-pages/a4-4-1_客户详情(客户信息).txt new file mode 100644 index 0000000..23e381b --- /dev/null +++ b/.scratch/lanhu-latest/v29-customer-pages/a4-4-1_客户详情(客户信息).txt @@ -0,0 +1,223 @@ +# a4-4-1_客户详情(客户信息).html +# 控件 408,有文本 220 + +u2 | 矩形 | Unnamed | ` +u4 | 矩形 | Unnamed | itc业务中台 +u8 | 矩形 | Unnamed | Panyu10109 +u14 | 矩形 | Unnamed | 线索管理 +u15 | 矩形 | Unnamed | 客户管理 +u16 | 矩形 | Unnamed | 数据看板 +u23 | 矩形 | Unnamed | 客户管理设置 +u24 | 矩形 | Unnamed | 客户总览 +u27 | 矩形 | Unnamed | 项目管理 +u28 | 矩形 | Unnamed | 商机管理 +u33 | 矩形 | Unnamed | 首页 +u36 | 矩形 | Unnamed | 联系人 +u38 | 矩形 | Unnamed | 进入后台 +u39 | 矩形 | Unnamed | 我的客户 +u41 | 矩形 | Unnamed | 客户公海 +u43 | 矩形 | Unnamed | 客户查重 +u45 | 矩形 | Unnamed | 客户交割 +u48 | 矩形 | Unnamed | 首页 +u49 | 矩形 | Unnamed | 线索管理 +u50 | 矩形 | Unnamed | 客户管理 +u51 | 矩形 | Unnamed | 项目管理 +u52 | 矩形 | Unnamed | 系统设置 +u53 | 矩形 | Unnamed | 商机管理 +u54 | 矩形 | Unnamed | 数据看板 +u69 | 矩形 | Unnamed | 工作台 +u71 | 矩形 | Unnamed | 数据概览 +u73 | 矩形 | Unnamed | 工作计划 +u75 | 矩形 | Unnamed | <<收起菜单 +u77 | 矩形 | Unnamed | 线索管理 +u78 | 矩形 | Unnamed | 系统设置 +u79 | 矩形 | Unnamed | 数据看板 +u86 | 矩形 | Unnamed | 线索公海 +u87 | 矩形 | Unnamed | 我的线索 +u90 | 矩形 | Unnamed | 客户管理 +u91 | 矩形 | Unnamed | 项目管理 +u92 | 矩形 | Unnamed | 商机管理 +u99 | 矩形 | Unnamed | 首页 +u103 | 矩形 | Unnamed | 系统设置 +u104 | 矩形 | Unnamed | 数据看板 +u109 | 矩形 | Unnamed | -b +u110 | 矩形 | Unnamed | 首页 +u112 | 矩形 | Unnamed | 线索管理 +u113 | 矩形 | Unnamed | 客户管理 +u114 | 矩形 | Unnamed | 项目管理 +u115 | 矩形 | Unnamed | 商机管理 +u124 | 矩形 | Unnamed | -a +u129 | 矩形 | Unnamed | 系统设置 +u130 | 矩形 | Unnamed | 商机管理 +u131 | 矩形 | Unnamed | 数据看板 +u138 | 矩形 | Unnamed | 商机公海 +u139 | 矩形 | Unnamed | 我的商机 +u140 | 矩形 | Unnamed | 线索管理 +u141 | 矩形 | Unnamed | 客户管理 +u146 | 矩形 | Unnamed | 项目管理 +u149 | 矩形 | Unnamed | 首页 +u155 | 矩形 | Unnamed | 系统设置 +u156 | 矩形 | Unnamed | 数据看板 +u161 | 矩形 | Unnamed | -b +u162 | 矩形 | Unnamed | 首页 +u164 | 矩形 | Unnamed | 线索管理 +u165 | 矩形 | Unnamed | 客户管理 +u166 | 矩形 | Unnamed | 项目管理 +u167 | 矩形 | Unnamed | 商机管理 +u176 | 矩形 | Unnamed | -a +u180 | 矩形 | Unnamed | 我的客户 +u181 | 矩形 | Unnamed | 客户 > 我的客户 > 客户详情 +u185 | 矩形 | Unnamed | 广州宏远智能电子科技有限公司 +u186 | 矩形 | Unnamed | 最近跟进 +u187 | 矩形 | Unnamed | 2026-06-28  09:30 +u188 | 矩形 | Unnamed | 电话沟通年度合作续签事宜,客户表示内部审批流程进行中,预计7月初完成。 +u189 | 矩形 | Unnamed | 小李 +u190 | 矩形 | Unnamed | 广东1部 +u192 | 矩形 | Unnamed | 跟进 +u193 | 矩形 | Unnamed | 关注 +u194 | 矩形 | Unnamed | 添加联系人 +u195 | 矩形 | Unnamed | 新增商机 +u196 | 矩形 | Unnamed | 新增项目 +u197 | 矩形 | Unnamed | 工商信息更新 +u198 | 矩形 | Unnamed | 客户星级 +u203 | 矩形 | Unnamed | 合作 +u204 | 矩形 | Unnamed | 销售负责人 +u205 | 矩形 | Unnamed | 小李   广东1部 +u206 | 矩形 | Unnamed | 战略协议等级 +u207 | 矩形 | Unnamed | 关系星级 +u212 | 矩形 | Unnamed | 客户档案状态 +u213 | 矩形 | Unnamed | 有效 +u214 | 矩形 | Unnamed | -- +u216 | 向右箭头按钮 | Unnamed | 潜在客户 +u217 | 圆形 | Unnamed | √ +u219 | 向右箭头按钮 | Unnamed | 重潜客户 +u221 | 圆形 | Unnamed | √ +u223 | 向右箭头按钮 | Unnamed | 已成交客户 +u225 | 圆形 | Unnamed | √ +u226 | 矩形 | Unnamed | 下周一 15:00  待跟进 +u227 | 矩形 | Unnamed | 电话 +u228 | 矩形 | Unnamed | 新增战略协议 +u230 | 矩形 | Unnamed | 关联业务 +u232 | 矩形 | Unnamed | 已中标项目总额 +u233 | 矩形 | Unnamed | 238.00万元 +u235 | 矩形 | Unnamed | 跟进中方案预估总额 +u236 | 矩形 | Unnamed | 486.00万元 +u238 | 矩形 | Unnamed | 进行中商机总额 +u239 | 矩形 | Unnamed | 999.00万元 +u241 | 矩形 | Unnamed | 合同总额 | (预留) +u243 | 矩形 | Unnamed | 累计回款 | (预留) +u244 | 矩形 | Unnamed | 归档 +u245 | 矩形 | Unnamed | 已成交VIP | 客户等级 +u246 | 矩形 | Unnamed | -- +u247 | 矩形 | Unnamed | 返回 +u248 | 矩形 | Unnamed | 标记重点客户 +u250 | 矩形 | Unnamed | 客户信息 +u251 | 矩形 | Unnamed | 跟进记录 +u252 | 矩形 | Unnamed | 关联商机 +u253 | 矩形 | Unnamed | 关联项目 +u254 | 矩形 | Unnamed | 团队成员 +u255 | 矩形 | Unnamed | 操作日志 +u256 | 矩形 | Unnamed | 联系人 +u257 | 矩形 | Unnamed | 编辑客户信息 +u258 | 矩形 | Unnamed | 战略协议 +u260 | 单元格 | Unnamed | 客户名称 +u261 | 单元格 | Unnamed | 广州宏远智能电子科技有限公司 +u262 | 单元格 | Unnamed | 客户编号 +u263 | 单元格 | Unnamed | KH20260624001 +u264 | 单元格 | Unnamed | 客户类型 +u265 | 单元格 | Unnamed | 甲方(企业用户) +u266 | 单元格 | Unnamed | 所属地区 +u267 | 单元格 | Unnamed | 广东省 - 广州市 - 番禺区 +u268 | 单元格 | Unnamed | 行业 +u275 | 矩形 | Unnamed | 基本信息 +u276 | 矩形 | Unnamed | ▴ 折叠 +u277 | 矩形 | Unnamed | 集团大楼 +u279 | 单元格 | Unnamed | 销售负责人 +u280 | 单元格 | Unnamed | 小李 +u281 | 单元格 | Unnamed | 销售部门 +u282 | 单元格 | Unnamed | 广东1部 +u283 | 单元格 | Unnamed | 协同人 +u284 | 单元格 | Unnamed | 小吴 +u290 | 矩形 | Unnamed | 跟进人员 +u291 | 矩形 | Unnamed | ▴ 折叠 +u292 | 矩形 | Unnamed | 小吴-广东1部 +u294 | 单元格 | Unnamed | 公司决策人 +u295 | 单元格 | Unnamed | 张总 +u296 | 单元格 | Unnamed | 是否商机勾兑 +u297 | 单元格 | Unnamed | 是 +u298 | 单元格 | Unnamed | 是否签订战略协议 +u299 | 单元格 | Unnamed | 否 +u300 | 单元格 | Unnamed | 总监近期拜访时间 +u301 | 单元格 | Unnamed | -- +u302 | 单元格 | Unnamed | 是否子客户 +u303 | 单元格 | Unnamed | 是 +u304 | 单元格 | Unnamed | 父客户关联 +u305 | 单元格 | Unnamed | 广州宏远 +u306 | 单元格 | Unnamed | 合作系统 +u307 | 单元格 | Unnamed | 全系统 +u308 | 单元格 | Unnamed | 不合作原因 +u309 | 单元格 | Unnamed | -- +u310 | 单元格 | Unnamed | 是否参加总裁班 +u311 | 单元格 | Unnamed | 是 +u312 | 单元格 | Unnamed | 是否参加产品经理班 +u313 | 单元格 | Unnamed | 否 +u314 | 单元格 | Unnamed | 总裁班参加人 +u315 | 单元格 | Unnamed | 吴立 +u316 | 单元格 | Unnamed | 产品班参加人 +u317 | 单元格 | Unnamed | -- +u318 | 单元格 | Unnamed | 总裁班参加人电话 +u319 | 单元格 | Unnamed | 139****2361 +u320 | 单元格 | Unnamed | 产品班参加人电话 +u321 | 单元格 | Unnamed | -- +u325 | 矩形 | Unnamed | 关联信息 +u326 | 矩形 | Unnamed | ▴ 折叠 +u328 | 矩形 | Unnamed | 备注 +u329 | 矩形 | Unnamed | -- +u330 | 矩形 | Unnamed | 附件 +u336 | 矩形 | Unnamed | 补充资料 +u337 | 矩形 | Unnamed | ▴ 折叠 +u339 | 单元格 | Unnamed | 统一社会信用代码 +u340 | 单元格 | Unnamed | 91440106123123587X +u341 | 单元格 | Unnamed | 法定代表人 +u342 | 单元格 | Unnamed | 张三 +u343 | 单元格 | Unnamed | 成立时间 +u344 | 单元格 | Unnamed | 2018-03-15 +u345 | 单元格 | Unnamed | 注册资本 +u346 | 单元格 | Unnamed | 1000万元 +u347 | 单元格 | Unnamed | 经营范围 +u348 | 单元格 | Unnamed | 弱电工程施工 +u349 | 单元格 | Unnamed | 年产值 +u350 | 单元格 | Unnamed | -- +u351 | 单元格 | Unnamed | 人员规模 +u355 | 单元格 | Unnamed | 公司地址 +u362 | 矩形 | Unnamed | 工商信息 +u363 | 矩形 | Unnamed | ▴ 折叠 +u364 | 矩形 | Unnamed | -- +u365 | 矩形 | Unnamed | 广东省广州市番禺区东环街1号 +u367 | 单元格 | Unnamed | 创建人 +u368 | 单元格 | Unnamed | 小李 +u369 | 单元格 | Unnamed | 创建时间 +u370 | 单元格 | Unnamed | 2026-06-05  17:42 +u371 | 单元格 | Unnamed | 最后修改人 +u372 | 单元格 | Unnamed | 小李 +u373 | 单元格 | Unnamed | 最后修改时间 +u374 | 单元格 | Unnamed | 2026-06-30  12:34 +u378 | 矩形 | Unnamed | 系统信息 +u379 | 矩形 | Unnamed | ▴ 折叠 +u381 | 矩形 | Unnamed | 人脉关系单位 +u383 | 矩形 | Unnamed | 湖南警官学院 +u384 | 矩形 | Unnamed | 湖南工业大学 +u385 | 矩形 | Unnamed | 长沙航天学校 +u387 | 单元格 | Unnamed | 需求 +u388 | 单元格 | Unnamed | 需求说明 +u389 | 单元格 | Unnamed | 变更记录 +u390 | 单元格 | Unnamed | 1. 页面说明 +u393 | 单元格 | Unnamed | 2. 公共规则 +u396 | 单元格 | Unnamed | 3. 公共头部与业务概览 +u399 | 单元格 | Unnamed | 4. 跟进弹窗 +u402 | 单元格 | Unnamed | 5. 客户信息页签 +u405 | 矩形 | Unnamed | 关注 +u406 | 矩形 | Unnamed | 标记重点客户 +u407 | 矩形 | Unnamed | 按钮变化 +u408 | 矩形 | Unnamed | 取消关注 +u409 | 矩形 | Unnamed | 取消标记重点客户 diff --git a/.scratch/opp-customer-dependency/商机模块前置客户接口依赖分析报告.md b/.scratch/opp-customer-dependency/商机模块前置客户接口依赖分析报告.md new file mode 100644 index 0000000..665f25e --- /dev/null +++ b/.scratch/opp-customer-dependency/商机模块前置客户接口依赖分析报告.md @@ -0,0 +1,205 @@ +# 商机模块前置客户接口依赖分析报告 + +> **生成日期**:2026-08-31 +> **原型基准**:蓝湖 Axure「itc信息化业务中台web端 V1.0」**v29**(2026-08-28 14:39 GMT 最新版),OSS 公开直拉一手提取(非 MCP、非旧缓存) +> **分析焦点**:**A3-1-1-2-1 新增/编辑商机**页「客户信息」区(用户指定页,pageId `926458f1...`),辅证同族页 A3-1-1-2-4 添加关联客户弹窗、A3-1-1-1-2 客户信息 Tab +> **目的**:客户模块(A4,未建)开发**提前排期**,保证商机模块工程师**可正常联调**后端接口 +> **范围纪律**:仅覆盖商机模块实际用到的客户能力,A4 完整功能(公海/总览/导入/合并/交割等 30+ 页)不在本报告 + +--- + +## 0. 结论速览 + +| 优先级 | 接口 | 一句话用途 | +|---|---|---| +| **P0** | `POST /api/customer/search` | 新增商机「关联客户*」搜索选择框的数据源(弹窗四维查询同源) | +| **P0** | `GET /api/customer/{id}/contacts` | 选中客户后「客户联系人」候选列表(按客户筛选) | +| **P0** | `GET /api/customer/{id}` | 选中客户/编辑回显时的客户基础信息带出 | +| **P1** | `GET /api/customer/contact/search` | 「商机关键联系人」全局搜索(带出所属公司) | +| **P1** | `POST /api/customer/quick-create` | 弹窗「+ 快速创建客户」入口 | +| **P2** | `GET /api/customer/{id}/detail` | 客户信息 Tab「查看客户详情」新窗口跳转 | +| 配套 | crm-dict 两个分组:`客户类型` / `客户角色` | 下拉选项数据(语义不同,勿合并) | + +**P0 三件 = 新增商机表单提交主链路的硬依赖**:缺一,商机工程师无法走通「选客户 → 选联系人 → 提交」联调闭环。 + +--- + +## 1. 原型解析(一手证据) + +### 1.1 A3-1-1-2-1 新增/编辑商机 · 客户信息区(用户指定页) + +表单共 18 个字段(原型自带需求批注「3、字段说明」逐条登记),其中**客户信息区占 6 个**: + +| # | 原型字段 | 控件类型 | 原型规则(批注原文摘要) | 依赖客户模块? | +|---|---|---|---|---| +| 13 | **商机关联联系人** | 搜索选择框 | 搜索并选择与当前商机相关的联系人;**选择后自动带出联系人所属公司等信息** | ✅ 联系人全局搜索 | +| 14 | **关联人所在公司** | 自动带出字段 | 展示已选联系人的所属公司;原则上不可手动修改 | ✅(随 13 带出) | +| 15 | **关联客户** | 搜索选择框 | **必填\***,「数据来源于客户管理模块」 | ✅ 客户搜索 ★核心 | +| 16 | **客户角色**(表单 label 写「客户类型」) | 下拉选择框 | **必填\***,选项来源于**客户角色字典** | ✅ 字典(crm-dict) | +| 17 | **客户联系人** | 搜索选择框 | 「候选联系人需**根据已选客户筛选**」 | ✅ 按客户查联系人 | +| 18 | **是否主要客户** | 下拉选择框 | **必填\***(是/否);同一商机原则上只能存在一个主要客户 | ✗ 商机侧逻辑 | + +> 字段 12「甲方名称」为纯文本框(甲方是否明确=是时必填),**不依赖**客户模块,不入清单。 + +**交互联动**(批注「4、交互说明」): +- 交互 6「联系人搜索」:点击搜索打开联系人选择窗口,确认后自动回填**联系人、联系方式及所属公司**(服务字段 13/14) +- 交互 7「关联客户搜索」:点击搜索打开客户选择窗口,确认后回填客户名称,**并刷新客户联系人候选范围**(服务字段 15→17 级联) + +**业务规则**(批注「5、业务规则&功能逻辑」): +- 规则 6:新增商机**至少关联一个客户**;编辑时可调整,需保证客户与联系人归属关系一致 +- 规则 7:同一商机只能存在一个主要客户;修改后原主要客户自动降为普通关联 +- 规则 9:重复商机校验可依据商机名称、**关联客户**、项目区域(商机侧逻辑,消费客户名) + +**验收标准**(批注「6、原型体验及验收标准」):7「选择联系人后,联系方式及所属公司需正确带出」;8「选择关联客户后,客户联系人范围需同步更新」。 + +### 1.2 A3-1-1-2-4 添加关联客户弹窗(同族复用场景,商机详情·客户信息 Tab 入口) + +与新增商机表单共用同一组客户接口,但查询维度更宽: + +- **客户查询区**:客户名称 / 联系人 / 联系电话(模糊)+ 客户类型下拉(选项:全部客户类型/总包/工程商/投资方/设计院/集成商/投标公司,来源于**客户类型字典**) +- **搜索结果表 7 列**:选择(单选) / 客户名称 / 客户类型 / 地区(省市区) / 联系人(默认或主要联系人) / 联系电话(**按权限脱敏**) / 客户负责人 +- **关联信息设置区**:客户角色\*(客户角色字典)/ 客户联系人(下拉,候选=**当前选中客户下的联系人**,切换客户后清空重选)/ 是否主要客户\* +- **「+ 快速创建客户」**:客户库不存在目标客户时进入快速创建流程,**创建成功后返回当前页并自动选中新建客户**(规则 7:快速创建的客户需**先写入客户管理模块**,再与商机建立关联) +- 规则 3:同一客户不得重复关联同一商机(商机侧已有错误码 66011 拦截) + +### 1.3 A3-1-1-1-2 客户信息 Tab(展示场景,佐证出参列) + +列:客户名称 / 客户类型 / 关键联系人 / 联系方式(脱敏) / 联系人职务 / 关系标记(主要意向客户/普通关联) / 操作(**查看客户详情**〔新窗口跳转〕/ 设为主要)。 + +--- + +## 2. 依赖识别汇总 + +| 商机侧触点 | 需要的客户模块能力 | +|---|---| +| 新增商机字段 15「关联客户\*」搜索 | 客户搜索(名称模糊,P0) | +| 新增商机字段 17「客户联系人」按客户筛选 | 按客户查联系人(P0) | +| 新增商机字段 13/14「商机关键联系人/关联人所在公司」 | 联系人全局搜索 + 带出公司(P1) | +| 弹窗查询区四维搜索(名/联系人/电话/类型) | 客户搜索扩展参数(并入 P0 接口) | +| 弹窗「+ 快速创建客户」 | 客户快速创建(P1) | +| Tab「查看客户详情」跳转 | 客户详情(P2) | +| 字段 16 + 弹窗「客户角色\*」 | crm-dict「客户角色」分组 | +| 弹窗「客户类型」筛选 + 结果列 | crm-dict「客户类型」分组 + 客户主数据属性 | + +> **两个字典勿混淆**(原型即分开建模):**客户类型** = A4 客户主数据属性(客户是什么);**客户角色** = 客户在某个商机中的业务身份(客户在这个单子里干什么)。商机侧 `OpportunityCustomer.customerRole` 已建模为字典 code,选项值由产品录入。 + +--- + +## 3. 客户模块接口清单(提前开发项) + +> 路径风格对齐现有工程(`/api/dict/group`、`/api/opportunity/customer` 均为 `/api/<域>/<资源>`);最终路径以客户模块立项时平台规范为准。 + +### P0-1 客户搜索(分页) + +| 项 | 内容 | +|---|---| +| 接口 | `POST /api/customer/search` | +| 入参 | `keyword`(客户名称/联系人/联系电话,模糊,弹窗查询区三输入合一或拆分均可)、`customerType`(客户类型字典 code,筛选)、`page`/`size` | +| 出参 | `customerId`、`customerName`、`customerType`(code+名)、`regionName`(省市区拼接)、`contactName`(默认/主要联系人)、`contactPhone`(**按权限脱敏**)、`ownerName`(客户负责人)、`total` | +| 场景来源 | ① A3-1-1-2-1 字段 15「关联客户\*」搜索选择框(必填,批注明写「数据来源于客户管理模块」);② A3-1-1-2-4 弹窗客户查询区 + 搜索结果表 7 列 | +| 联调说明 | 商机侧现有 `POST /api/opportunity/customer/search` 为**快照池降级实现**(A4 未建,仅返回 customerId+customerName,SQL 从 opportunity_customer 自身去重取数,见 `OpportunityCustomerMapper.searchCandidatePool`)。客户模块本接口就位后商机侧**切真源、接口签名不变、出参列补齐**(代码注释已预留该口径,20260829 拍板)——前端联调路径不变 | + +### P0-2 按客户查联系人 + +| 项 | 内容 | +|---|---| +| 接口 | `GET /api/customer/{customerId}/contacts` | +| 入参 | 路径参数 customerId | +| 出参 | 列表:`contactId`、`name`、`phone`(按权限脱敏)、`company`(所属公司)、`position`(职务,客户信息 Tab 有「联系人职务」列) | +| 场景来源 | ① A3-1-1-2-1 字段 17「客户联系人」——「候选联系人需根据已选客户筛选」+ 交互 7「选关联客户后刷新客户联系人候选范围」;② A3-1-1-2-4 弹窗「客户联系人」下拉——「候选范围为当前选中客户下的联系人」「切换客户后原客户联系人需清空并重新选择」 | +| 联调说明 | 空客户时前端不发请求(字段 17 依赖字段 15 先选中);返回的 `company` 同时可服务字段 14 的展示 | + +### P0-3 客户基础信息查询 + +| 项 | 内容 | +|---|---| +| 接口 | `GET /api/customer/{customerId}` | +| 入参 | 路径参数 customerId | +| 出参 | `customerId`、`customerName`、`customerType`(code+名)、`regionName`、`defaultContactName`、`defaultContactPhone`(脱敏) | +| 场景来源 | ① A3-1-1-2-1 选中关联客户后带出客户维度(类型/地区回显);② **编辑回显**——批注交互 2「系统自动加载当前商机已有数据并回填至对应字段」;③ 商机侧 `customer/add` 服务端校验 customerId 有效性(快照池模式下无校验对象,A4 后补强校验) | +| 联调说明 | 出参最小集 = 新增商机客户信息区需要带出的全部客户维度;不必返回 A4 全量 9-tab 详情 | + +### P1-1 联系人全局搜索 + +| 项 | 内容 | +|---|---| +| 接口 | `GET /api/customer/contact/search?keyword=` | +| 入参 | `keyword`(联系人姓名/电话模糊) | +| 出参 | 列表:`contactId`、`name`、`phone`(脱敏)、`company`(所属公司名)、`customerId` | +| 场景来源 | A3-1-1-2-1 字段 13「商机关联联系人」搜索选择框——**不依赖先选客户**,独立搜索;批注「选择后自动带出联系人所属公司等信息」+ 交互 6「确认后自动回填联系人、联系方式及所属公司」+ 字段 14「关联人所在公司」自动带出不可手改 | +| 备注 | 该字段为 **v29 原型新增,PRD(基于旧版)无对应物**——商机主表也需补建模(见附录 A-3),客户模块侧仅保证接口可查 | +| 定级理由 | 新增商机主链路(选客户→选客户联系人→提交)不含此字段也走得通(非必填),完整交互需要,故 P1 | + +### P1-2 快速创建客户 + +| 项 | 内容 | +|---|---| +| 接口 | `POST /api/customer/quick-create` | +| 入参 | `customerName`\*、`customerType`\*(字典 code)、`contactName`?、`contactPhone`?、`regionCode`? | +| 出参 | `customerId`、`customerName`(供弹窗自动选中并回填) | +| 场景来源 | A3-1-1-2-4 弹窗「+ 快速创建客户」——批注字段 3「当客户库中不存在目标客户时,用于进入客户快速创建流程」、交互 8「创建成功后可返回当前页面并自动选中新建客户」、规则 7「快速创建的客户需先写入客户管理模块,再与当前商机建立关联」 | +| 定级理由 | 新增商机**表单本身无快速创建入口**(仅弹窗有),不阻塞表单联调,故 P1。注意是最小字段集,**不要**实现成 A4 完整新增客户表单(a4-3-3-1,那套含查重/地区/行业等全量字段) | + +### P2-1 客户详情(跳转目标) + +| 项 | 内容 | +|---|---| +| 接口 | `GET /api/customer/{customerId}/detail`(或前端路由直达 A4 页面,后端出数据) | +| 场景来源 | A3-1-1-1-2 客户信息 Tab 操作列「查看客户详情」——批注明写「1、查看详情:新窗口,跳转客户详情」 | +| 定级理由 | 展示增强,不阻塞任何商机写链路联调,P2。可先用 P0-3 基础信息接口顶替过渡 | + +### 配套字典(crm-dict 侧,非客户模块接口但联调必需) + +| 字典分组 | 建议编码 | 选项(原型实样) | 消费方 | +|---|---|---|---| +| 客户类型 | `customer_type` | 总包 / 工程商 / 投资方 / 设计院 / 集成商 / 投标公司 | 弹窗客户类型筛选;客户主数据属性;客户信息 Tab「客户类型」列 | +| 客户角色 | `customer_role` | 投标公司 / 总包 / 工程商…(产品定) | 新增商机字段 16;弹窗「客户角色\*」;商机侧 `opportunity_customer.customer_role` 已建列 | + +--- + +## 4. 优先级总表 + +| 优先级 | 接口 | 判定依据 | +|---|---|---| +| **P0** | `POST /api/customer/search` | 新增商机表单必填项(关联客户\*)唯一数据源;无此接口表单无法提交 | +| **P0** | `GET /api/customer/{id}/contacts` | 字段 17 级联数据源(选客户后刷新联系人范围);验收标准 8 | +| **P0** | `GET /api/customer/{id}` | 选中回显 + 编辑回显 + 服务端 id 校验 | +| **P1** | `GET /api/customer/contact/search` | 字段 13/14(v29 增量,非必填)完整交互 | +| **P1** | `POST /api/customer/quick-create` | 弹窗快速创建入口(表单无此入口,不阻塞) | +| **P2** | `GET /api/customer/{id}/detail` | Tab 跳转详情,展示增强 | +| **P0\*** | crm-dict `customer_type` + `customer_role` 分组 | 字典无数据 = 必填下拉开天窗,与 P0 接口同批就位 | + +--- + +## 5. 商机侧配套缺口(联调双向对齐,附录) + +客户模块提前开发的同时,商机侧需同步对齐以下缺口(均为商机模块工作项,不占客户模块排期): + +1. **`POST /api/opportunity`(新增商机)入参扩展**:v29 表单要求客户族字段(customerId\* / customerRole\* / isPrimaryIntended\* / customerContactId / keyContact 相关);PRD §2.1 仅拍板「意向客户必填落 opportunity_customer 首条」,需按 v29 对齐入参契约。 +2. **`OpportunityCustomer` 子表/DTO 补「客户联系人」**:表单字段 17、弹窗字段 12 均选客户联系人;当前 `OpportunityCustomerAddDTO` 注释明写「客户联系人候选归客户域(A4 未建,暂不收)」——A4 就位后补 `customer_contact_id` + 快照列并收参。 +3. **「商机关键联系人/关联人所在公司」建模**(v29 增量,PRD 无):字段 13/14 在商机主表无对应列,需产品拍板落主表(key_contact_id + 公司快照)或独立子表。 +4. **快照池切真源**:`OpportunityCustomerMapper.searchCandidatePool` 切 `customer` 真表,接口签名不变(已拍板口径)。 +5. 线索→商机 port(`CreateOpportunityCmd.customerId`)已就位,无缺口。 + +## 6. 待确认项(⚠ 不阻塞接口排期) + +1. 字段 13「商机关联联系人」是否要求归属关联客户?(批注独立搜索框 vs 规则 6「客户与联系人归属关系一致」语义有歧义,建议按独立全局联系人实现,产品终审) +2. 客户联系人是否允许暂缺?(字段 17 及弹窗字段 12 均无必填红星,倾向可后补) +3. 电话脱敏口径:后端按权限出参脱敏 vs 出明文前端按权限脱敏(弹窗规则 8「根据当前用户权限展示完整号码或脱敏号码」)——建议后端出参脱敏(对齐现有工程联系方式脱敏惯例),需拍板 +4. 重复商机校验(规则 9)的触发时机与阈值(商机侧逻辑,联调时对齐) + +--- + +## 附:证据资产索引 + +| 资产 | 位置 | +|---|---| +| v29 清单(182 页) | `.scratch/lanhu-latest/axure-v29.json` | +| 新增/编辑商机页文本提取 | `.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-1__新增_编辑商机.txt` | +| 新增/编辑商机页原始 HTML + 需求批注全文 | `.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-1_raw.html`(批注提取脚本 `extract-annotations.mjs`) | +| 添加关联客户弹窗文本 + 原始 HTML + 批注全文 | `.scratch/lanhu-latest/v29-customer-pages/a3-1-1-2-4________.txt` / `a3-1-1-2-4_raw.html`(`extract-2-4-annotations.mjs`) | +| 客户信息 Tab / 其余 8 页文本 | `.scratch/lanhu-latest/v29-customer-pages/` | +| 批量拉取脚本(可复跑) | `.scratch/lanhu-latest/fetch-v29-customer-pages.mjs` | +| 商机侧现状代码 | `crm-opportunity/.../OpportunitySubController.java`、`OpportunityCustomerAddDTO.java`、`OpportunityCustomerMapper.java` | + +_报告基于 v29 原型一手提取 + 商机 PRD(冻结版)+ crm-opportunity 现状代码三方交叉核对;如原型再更新,重跑 `fetch-v29-customer-pages.mjs` 刷新证据。_ diff --git a/docs/adr/0024-bruno-docs-grouping-by-menu.md b/docs/adr/0024-bruno-docs-grouping-by-menu.md index 2d10dc0..54bfaf8 100644 --- a/docs/adr/0024-bruno-docs-grouping-by-menu.md +++ b/docs/adr/0024-bruno-docs-grouping-by-menu.md @@ -35,3 +35,14 @@ - 不设全量总览文件夹(全量副本复辟禁止)。 - 决策 2 强化:tags 即页面归属唯一真相源;gen_bruno.py 忠实读 tags(MENU_BIND 仅做参数值绑定,不再做副本展开)。 - 决策 1/4/5/6 不变。产物重建于 `D:\code\crm-api-docs`(Bruno 2 单仓,前端实际消费仓;e 盘 workspace 布局废弃)。 + +## 修订(2026-08-31,api-docs-reorg effort) + +**一级目录对齐蓝湖原型 A 区**:v29 快照(2026-08-31)冻结为权威树(`.scratch/api-docs-reorg/lanhu-tree-v29.md`),文档仓一级目录改为 A0 登录界面 / A1 销售工作台(首页)/ A1X 工作计划 / A2 线索管理 / A3 商机管理 / A4 客户管理 / A5 项目管理 / A6 数据看板 / A7 后台管理 / 公共依赖 / 调试(验证专用),与原型 A 区分区一一对应;二级及更深目录不做重排。 + +1. **深 tag 纪律**:tag = 完整页面路径——一级 = 分区原文,二级 = 页面,更深 = 页面内分组(最深 4 级,如 `A7 后台管理/商机规则/公海规则`)。tag 原文即文档目录路径(bruno-sync 身份映射),swagger/knife4j 分组同构。决策 2 的 `menuBindings`(viewType/scopeKey 绑定)不变,四键前缀随本修订换为 `A2 线索管理/…`。 +2. **商机规则归 A7**(决策 1 页面归属修正):v29 将 A3-4 商机管理设置整体迁至 A7-3-2 商机规则,后台为唯一入口,阶段模板 / 方案卡模板 / 公海规则三组接口改挂 `A7 后台管理/商机规则/{阶段模板,方案卡模板,公海规则}`。线索规则接口(LeadPoolController)对称裁决为**双归属**:`A2 线索管理/线索设置`(主本,功能页所在)+ `A7 后台管理/线索规则`(副本,A7-3-1 为 A2-1-5 的引用页)。 +3. **双归属 = 方法级多值 `@Operation(tags)`**:单接口挂 N 个 tag 即在 N 个页面文件夹各有一份副本,由 bruno-sync「多值全取」幂等输出,无需生成器特判。 +4. **URL 回退通道关闭**:无 tag 端点不再按 URL 兜底分组——全部端点必须显式挂深 tag(SystemController 10 端点已补挂,`system/` 游离顶级目录消灭);「进集合的端点必挂 tag」成为一眼可审纪律。 +5. **新接口挂载纪律**:新 Controller 一律按页面全路径挂 tag——1:1 页面控制器可用类级 `@Tag`,跨页 / 双归属用方法级多值 tags;类级 `@Tag` 与方法级 `@Operation(tags)` 互斥,并存会因「多值全取」产生双份副本;无真实页面入口的接口不挂页签(2026-08-17 修订纪律延续)。 +6. **机制联动**:bruno-sync 注解驱动通道为唯一权威机制;手工生成器家族(`gen_bruno.py` / `gen_opp_*.py` / `gen_v2_*.py` / `bru_lib.py`)退役留档、不再运行,其 `MENUS` 常量同源义务随之作废;分区索引 README 为人工维护件(bruno-sync 不生成 README)。文档仓现路径 `E:\code\crm-api-docs`(2026-08-31 换机记录,前值 `D:\code\crm-api-docs` 作废)。 diff --git a/logs/crm-app.log b/logs/crm-app.log index 3614cd6..3365681 100644 --- a/logs/crm-app.log +++ b/logs/crm-app.log @@ -12,6 +12,7 @@ 2026-08-31T02:00:00.405+08:00 INFO 37460 --- [crm-app] [scheduling-1] com.crm.lead.job.LeadMaintenanceJob : [άJob] ʧЧɣ0 ʧЧ 2026-08-31T02:00:00.442+08:00 INFO 37460 --- [crm-app] [scheduling-1] com.crm.lead.job.LeadMaintenanceJob : [άJob] ɣ0 ѻ 2026-08-31T02:00:00.443+08:00 INFO 37460 --- [crm-app] [scheduling-1] com.crm.lead.job.LeadMaintenanceJob : [άJob] ȫ +<<<<<<< Updated upstream 2026-08-31T09:29:05.298+08:00 INFO 41888 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.15 with PID 41888 (D:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by luowj in D:\code\crm-backend-matt) 2026-08-31T09:29:05.315+08:00 INFO 41888 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" 2026-08-31T09:29:07.550+08:00 INFO 41888 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode @@ -862,3 +863,183 @@ This generated password is for development use only. Your security configuration 2026-08-31T16:10:22.350+08:00 WARN 26744 --- [crm-app] [http-nio-8080-exec-6] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token 2026-08-31T16:10:48.067+08:00 WARN 26744 --- [crm-app] [http-nio-8080-exec-2] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=744842565802524672 ǩ token 2026-08-31T17:18:02.318+08:00 WARN 26744 --- [crm-app] [http-nio-8080-exec-9] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=744842565802524672 ǩ token +======= +2026-08-31T03:00:00.000+08:00 INFO 37460 --- [crm-app] [scheduling-1] c.c.o.job.OpportunityMaintenanceJob : [̻άJob] ʼnow=2026-08-31T03:00:00.000911700 +2026-08-31T03:00:00.058+08:00 INFO 37460 --- [crm-app] [scheduling-1] c.c.o.job.OpportunityMaintenanceJob : [̻άJob] ɣ0 ¼ +2026-08-31T03:00:00.060+08:00 INFO 37460 --- [crm-app] [scheduling-1] c.c.o.job.OpportunityMaintenanceJob : [̻άJob] ɣ0 ̻ +2026-08-31T03:00:00.062+08:00 INFO 37460 --- [crm-app] [scheduling-1] c.c.o.job.OpportunityMaintenanceJob : [̻άJob] ȫ +2026-08-31T03:00:00.101+08:00 INFO 37460 --- [crm-app] [scheduling-1] c.crm.file.task.OrphanChunkCleanupTask : ¶ʱƬɣɾ 0 +>>>>>>> Stashed changes +2026-08-31T21:19:51.582+08:00 INFO 31368 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.13 with PID 31368 (E:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by Administrator in E:\code\crm-backend-matt) +2026-08-31T21:19:51.585+08:00 INFO 31368 --- [crm-app] [main] com.crm.app.CrmAppApplication : No active profile set, falling back to 1 default profile: "default" +2026-08-31T21:19:53.006+08:00 INFO 31368 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode +2026-08-31T21:19:53.008+08:00 INFO 31368 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-08-31T21:19:53.041+08:00 INFO 31368 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 24 ms. Found 0 JPA repository interfaces. +2026-08-31T21:19:53.060+08:00 INFO 31368 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode +2026-08-31T21:19:53.062+08:00 INFO 31368 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2026-08-31T21:19:53.076+08:00 INFO 31368 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. +2026-08-31T21:19:53.238+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.239+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.239+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.239+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.239+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.239+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.239+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.240+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.241+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.241+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.241+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.241+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.241+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.241+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.242+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.243+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.244+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. +2026-08-31T21:19:53.249+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.250+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.250+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.250+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.250+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.251+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.252+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.253+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.254+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! +2026-08-31T21:19:53.255+08:00 WARN 31368 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. +2026-08-31T21:19:54.112+08:00 INFO 31368 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) +2026-08-31T21:19:54.134+08:00 INFO 31368 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-08-31T21:19:54.135+08:00 INFO 31368 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] +2026-08-31T21:19:54.185+08:00 INFO 31368 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2026-08-31T21:19:54.185+08:00 INFO 31368 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2531 ms +2026-08-31T21:19:54.634+08:00 INFO 31368 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : Ȩܿرɨɣ0 +2026-08-31T21:19:54.753+08:00 INFO 31368 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : ѩIDʼɣworkerId=0, datacenterId=0 +2026-08-31T21:19:55.390+08:00 INFO 31368 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2026-08-31T21:19:55.460+08:00 INFO 31368 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final +2026-08-31T21:19:55.500+08:00 INFO 31368 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled +2026-08-31T21:19:55.831+08:00 INFO 31368 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer +2026-08-31T21:19:55.868+08:00 INFO 31368 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-08-31T21:19:56.525+08:00 INFO 31368 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@22195d06 +2026-08-31T21:19:56.527+08:00 INFO 31368 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-08-31T21:19:56.607+08:00 WARN 31368 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) +2026-08-31T21:19:58.218+08:00 INFO 31368 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-08-31T21:20:08.633+08:00 INFO 31368 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-08-31T21:20:09.015+08:00 WARN 31368 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ +2026-08-31T21:20:09.015+08:00 WARN 31368 --- [crm-app] [main] c.c.a.controller.DebugTokenController : token ӿ /api/auth/debug/token ãverify profile +2026-08-31T21:20:09.015+08:00 WARN 31368 --- [crm-app] [main] c.c.a.controller.DebugTokenController : Ͻκ֪ userId ˿ðû +2026-08-31T21:20:09.016+08:00 WARN 31368 --- [crm-app] [main] c.c.a.controller.DebugTokenController : μ docs/adr/0014-verify-profile-debug-token-endpoint.md +2026-08-31T21:20:09.016+08:00 WARN 31368 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ +2026-08-31T21:20:10.780+08:00 WARN 31368 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: ba6f77c8-2da1-4c5a-92f4-ad3908fc255a + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-08-31T21:20:10.800+08:00 INFO 31368 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager +2026-08-31T21:20:11.878+08:00 INFO 31368 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : ȨģУͨ0 ܿر4 עģ +2026-08-31T21:20:11.914+08:00 INFO 31368 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' +2026-08-31T21:20:11.947+08:00 INFO 31368 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 20.91 seconds (process running for 21.492) +2026-08-31T21:20:11.952+08:00 INFO 31368 --- [crm-app] [main] com.crm.auth.config.DataInitializer : ִȨݳʼ... +2026-08-31T21:20:12.766+08:00 INFO 31368 --- [crm-app] [main] com.crm.auth.config.DataInitializer : Ȩݳʼ +2026-08-31T21:20:12.767+08:00 INFO 31368 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ִֵȨӻ... +2026-08-31T21:20:13.191+08:00 INFO 31368 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ֵȨӻɣ10 Ȩ޵ +2026-08-31T21:20:13.191+08:00 INFO 31368 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : ִȨӻ飨˵... +2026-08-31T21:20:13.305+08:00 INFO 31368 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : Ȩӻɣ˵0 button +2026-08-31T21:20:13.305+08:00 INFO 31368 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : ִȨӻ飨˵... +2026-08-31T21:20:13.735+08:00 INFO 31368 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : Ȩӻɣ4 ˵0 button +2026-08-31T21:20:13.735+08:00 INFO 31368 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ִȫӵ... +2026-08-31T21:20:14.724+08:00 INFO 31368 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ӵɣ 3432 Уʡ 34 / 342 / 3056 3432 У 0 +2026-08-31T21:20:14.724+08:00 INFO 31368 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ִ̻Ȩӻ飨˵... +2026-08-31T21:20:15.053+08:00 INFO 31368 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ̻Ȩӻɣ˵0 button +2026-08-31T21:20:15.053+08:00 INFO 31368 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ִ̻׶ģȨӻ飨˵... +2026-08-31T21:20:15.158+08:00 INFO 31368 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ̻׶ģȨӻɣ˵0 button +2026-08-31T21:20:15.158+08:00 INFO 31368 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ִзϵͳֶοӻ... +2026-08-31T21:20:15.174+08:00 INFO 31368 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ϵͳֶοӻɣִ 16 0 +2026-08-31T21:20:15.188+08:00 INFO 31368 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ģѴڣcode=OPP_SCHEME_TPL_01ͣãӻ +2026-08-31T21:20:15.189+08:00 INFO 31368 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ִзģȨӻ飨˵... +2026-08-31T21:20:15.294+08:00 INFO 31368 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ģȨӻɣ˵0 button +2026-08-31T21:20:15.309+08:00 INFO 31368 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : ĬϽ׶ģѴڣcode=OPP_STAGE_TPL_01ͣãӻ +2026-08-31T21:20:15.309+08:00 INFO 31368 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ִֵݵȳʼ... +2026-08-31T21:20:25.517+08:00 INFO 31368 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵݵȳʼɣ22 +2026-08-31T21:20:25.708+08:00 WARN 31368 --- [crm-app] [main] com.crm.file.config.MinioConfig : MinIO bucket [crm] ʼʧܣļܿܲãThe Access Key Id you provided does not exist in our records. +2026-08-31T21:21:02.746+08:00 INFO 31368 --- [crm-app] [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-08-31T21:21:02.746+08:00 INFO 31368 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-08-31T21:21:02.747+08:00 INFO 31368 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2026-08-31T21:21:04.398+08:00 INFO 31368 --- [crm-app] [http-nio-8080-exec-1] o.springdoc.api.AbstractOpenApiResource : Init duration for springdoc-openapi is: 1596 ms diff --git a/logs/t04-run.log b/logs/t04-run.log index e69de29..3438401 100644 --- a/logs/t04-run.log +++ b/logs/t04-run.log @@ -0,0 +1 @@ +^C \ No newline at end of file