You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
18 KiB
166 lines
18 KiB
|
24 hours ago
|
# A5 项目管理 demo 逐页对照台账(票 16 · 黑盒 e2e 审计)
|
||
|
|
|
||
|
|
- 审计人:全新会话黑盒审计员,无开发背景;仅凭原型抽取件 + spec 口径仲裁 + demo 实际操作。
|
||
|
|
- 被测:`.scratch/crm-project/demo/index.html`(API=http://localhost:8080,verify profile fat jar)。
|
||
|
|
- 原型底稿:`.scratch/opportunity-bugfix/lanhu-pages/A5-*.md` 共 17 页(已逐页读完)。
|
||
|
|
- 口径仲裁:`deliverable-spec.md` §0(12 项拍板)。spin-out 六项不计缺陷(冲突检测五维匹配+拉群 / 商机推送自动转项目 / 群聊页签 / 阶段提醒推送 / 标底分成计算 / 赢单后合同订单回款)。
|
||
|
|
- 证据:`screenshots/` 28 张、`probe-result.json`、`ui-result.json`、`ui-result2~4.json`、DB 直查(crm@8.129.84.155,只读)。
|
||
|
|
- 结论标记:✅一致 · ⚠️偏差 · ❌缺失 · 🚫spin-out(不做不算缺陷) · 📝spec 裁剪(原型有、spec 端点/模型未纳入)。
|
||
|
|
|
||
|
|
## 0. 总对照规模
|
||
|
|
|
||
|
|
| 维度 | 数量 |
|
||
|
|
|---|---|
|
||
|
|
| 对照原型页 | 17 |
|
||
|
|
| 字段/交互对照点 | 142(✅ 92 · ⚠️偏差 28 · ❌缺失 9 · 🚫spin-out 10 · 📝spec 裁剪 3) |
|
||
|
|
| 接口抽查用例 | 70+33(probe_api / probe2_api)+ UI 用例 50+11 |
|
||
|
|
| 缺陷计数 | P0=0 · P1=3 · P2=12 · P3=10(见 audit-defects.md) |
|
||
|
|
|
||
|
|
## 1. A5-1-1 项目管理(看板视图)
|
||
|
|
|
||
|
|
| # | 原型字段/交互 | demo 实现 | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 1-1 | 7 列列头:冲突待处理/方案设计/商务报价/招投标准备/结项/赢单输单(圆形计数) | `GET /project/board` 固定 7 列 stage0~6,列头=stageName,每列 `共 N 条` | ✅(列名用规范 7 阶段名,符合 spec grill#9) |
|
||
|
|
| 1-2 | 顶部统计卡:全部项目/各阶段计数(点击卡片按阶段筛选) | 仅「冲突待处理」一张统计卡;无 7 阶段计数卡、点击只跳 stage0 列表 | ⚠️ D-10(spec §4 也写明「顶部统计卡 7 阶段计数」) |
|
||
|
|
| 1-3 | 「冲突待处理」badge(=stage0 项目数) | `conflictPendingCount`,点击跳列表 stage=0 | ⚠️ D-01:把已关闭(stage0,status=2)项目也计入(见截图 14:badge=5 中 4 个已关闭) |
|
||
|
|
| 1-4 | stage0 卡冲突处理入口(原型为拉群沟通,spin-out) | 卡上「冲突解除」按钮 → 报备审核弹窗 | ✅(拉群部分 🚫;但已关闭卡也渲染入口 → D-01) |
|
||
|
|
| 1-5 | 卡片字段:项目名称/客户名称/负责人(部门+姓名)/金额/阶段标签 | bcard:名称/客户/负责人/金额/赢单输单标签 | ⚠️ D-11:缺 最近跟进时间、中标时间、超期状态;负责人无部门前缀 |
|
||
|
|
| 1-6 | 卡片子状态标签(合同审核/下单/交付) | 无 | 📝(跟进/履约子态,本期无数据源) |
|
||
|
|
| 1-7 | 筛选:查询/重置、多维度(名称/销售经理/客户/阶段/品牌) | 看板 tab 无任何筛选(筛选在列表 tab) | ⚠️(列表 tab 可用同名筛选,功能可达;看板页内无) |
|
||
|
|
| 1-8 | 导入/导出/+新增项目按钮 | 仅 +新建项目;无导入导出 | 📝(spec 端点清单无 import/export) |
|
||
|
|
| 1-9 | manage/mine 双工作区(项目管理/我的项目) | scope=manage/mine 切换,服务端过滤 | ✅(mine=owner_user_id 当前用户;manage=部门 DataScope,种子两用户同部门互见合法——DB 证据 dept_id 相同) |
|
||
|
|
| 1-10 | 赢单停 stage5、stage6 仅输单 | 赢单卡在 stage5 列带「赢单」标签;stage6 列全为输单卡 | ✅(截图 14) |
|
||
|
|
|
||
|
|
## 2. A5-1-1 项目管理(列表视图)+ A5-1-2 我的项目
|
||
|
|
|
||
|
|
| # | 原型字段/交互 | demo 实现 | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 2-1 | 列:NO./地区/项目名称/销售经理/客户信息/来源商机/当前节点/品牌/项目金额/中标时间/当前负责人/创建时间/操作(查看) | 列:项目名称/阶段/状态/报备/赢输/客户/负责人/项目金额/创建时间 | ⚠️ D-08:缺 NO./地区/销售经理/客户信息(联系人+脱敏手机)/来源商机/品牌/中标时间/操作 共 8 列;行点击进详情替代「查看」;多出 状态/报备/赢输 3 列(原型列表无,属合理增强);列名 当前节点→阶段、当前负责人→负责人 |
|
||
|
|
| 2-2 | 顶部统计卡(同看板) | 无 | ⚠️ 同 D-10 |
|
||
|
|
| 2-3 | 阶段筛选 7 值(spec grill#10:剔除「报备中」混轴笔误) | `#fStage` = 全部+0~6 共 8 项,无「报备中」 | ✅ |
|
||
|
|
| 2-4 | 报备独立筛 | `#fFiling` = 审核中/通过/驳回 | ✅ |
|
||
|
|
| 2-5 | 关键词检索(名称/销售经理/客户) | keyword 仅项目名称 | ⚠️(单字段;销售经理/客户名不可检索) |
|
||
|
|
| 2-6 | 分页(页码/跳至/共 N 条) | current/size + 上一页/下一页 + 共 N 条;无页码/跳至 | ⚠️ P3(功能可用,缺跳页) |
|
||
|
|
| 2-7 | 常用检索/自定义检索/最近访问、字段设置(列配置) | 无 | 📝(spec 未定义端点) |
|
||
|
|
| 2-8 | mine 工作区=我负责的项目 | scope=mine(owner 过滤,API total=0/17 正确) | ✅ |
|
||
|
|
| 2-9 | 新增方案卡入口 | 无(方案卡域归商机/卡管理) | ✅(超出 A5 职责) |
|
||
|
|
| 2-10 | 数据权限:销售仅见自己、总监见本部门等 | 普通销售 manage 可见同部门总监项目(DB:两种子用户同 dept_id) | ✅(DataScope 部门级合法;跨部门场景未备数据,待复核但非缺陷) |
|
||
|
|
|
||
|
|
## 3. 新建项目(列表/看板页「+新增项目」弹窗,原型 3 步向导)
|
||
|
|
|
||
|
|
| # | 原型字段/交互 | demo 实现 | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 3-1 | 步骤1 填写信息:*销售经理/*项目名称/*关联客户(目录选)/*所属地区(级联)/*品牌/*项目金额(万元)/关联方案卡/*项目类型 | 单步弹窗:项目名称*/客户ID*/方案卡ID*/来源商机/项目金额/地区/品牌(后 4 可空) | ⚠️ D-17:无销售经理选择(owner=创建人)、无项目类型字段;品牌/金额/地区必填性放宽(spec §5.1 只定客户+卡必填,必填口径以 spec 为准→字段缺失记 P3);客户为裸 id 输入非目录选 |
|
||
|
|
| 3-2 | 步骤2 冲突检测(六维表) | 无(后端留桩「无冲突」,动态描述明示) | 🚫 spin-out |
|
||
|
|
| 3-3 | 步骤3 新建项目(拉群/自动推进文案) | 创建成功 toast + 自动跳详情 | 🚫(拉群/自动推进部分);✅(落库 stage=0/status=1/filing=1,grill#12) |
|
||
|
|
| 3-4 | 校验:缺名称/缺客户/缺卡 → 拒 | 68001 项目名称必填 / 关联客户必填(目录选提示)/ 关联方案卡必填 | ✅ |
|
||
|
|
| 3-5 | 校验:卡客户不匹配 | 68007 方案卡客户与项目客户不一致(一项目一客户一卡)——用真实异客户卡验证 3 例 | ✅ |
|
||
|
|
| 3-6 | 校验:客户不存在/卡不存在 | 68001 客户不可用 / 68007 方案卡不存在或已被删除 | ✅ |
|
||
|
|
| 3-7 | PROJECT 卡重复绑定互斥 | 同卡可被多项目重复引用(code=0;卡 owner 未被抢占,DB:卡 99021008 owner_type=1 归商机) | ⚠️ P3 待复核(引用语义无数据损坏,是否需互斥待产品确认) |
|
||
|
|
|
||
|
|
## 4. A5-1-2-2 / 各阶段项目详情(页签详情与操作)
|
||
|
|
|
||
|
|
### 4.1 头部主档区
|
||
|
|
|
||
|
|
| # | 原型字段 | demo 实现 | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 4-1-1 | 项目名称 + 项目编号(FBB-…) | 名称 + id | ⚠️ D-09(无项目编号字段) |
|
||
|
|
| 4-1-2 | 负责人(部门+姓名) | ownerNameSnapshot | ⚠️(无部门) |
|
||
|
|
| 4-1-3 | 关联客户/客户联系人/甲方单位 | 客户名 | ⚠️ D-09(联系人、甲方单位缺) |
|
||
|
|
| 4-1-4 | 合同金额/回款进度 | 无 | 🚫(赢单后履约 spin-out) |
|
||
|
|
| 4-1-5 | 来源商机(名称) | DTO 有 sourceOppId,头部不展示 | ⚠️ D-09 |
|
||
|
|
| 4-1-6 | 项目类型/生态关系六维 | 无 | 📝(生态关系 spec 无端点);项目类型 ⚠️ 并入 D-17 |
|
||
|
|
| 4-1-7 | 阶段导航条(横向 stepper 高亮当前阶段) | 阶段 badge 单枚 | ⚠️ D-09 |
|
||
|
|
| 4-1-8 | 阶段/状态/赢单输单徽章 | stage/status/filing/bidResult 四徽章 | ✅(报备徽章为 demo 增强) |
|
||
|
|
| 4-1-9 | 关闭信息(关闭类型/时间) | 头部「关闭」行 | ⚠️ D-15(closeType 显示原始枚举 MANUAL) |
|
||
|
|
|
||
|
|
### 4.2 八页签(demo 页签 ↔ 原型页签映射:跟进↔跟进记录、附件↔项目文件、客户↔关联客户、动态↔项目动态+操作日志、方案设计/商务报价/招投标↔概览分阶段内容+方案卡/报价清单/招投标文件、开标↔赢单输单页)
|
||
|
|
|
||
|
|
| # | 原型页签/字段 | demo(Tab + 端点) | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 4-2-1 | 跟进记录:时间/内容/方式/跟进人/部门;写跟进弹窗(*内容/*方式(字典)/*客户名称/联系人/电话/结果标签/计划下次跟进时间/附件≤10) | `GET /project/follow/list`(时间/内容/方式)+ `POST /follow/add`(内容*/时间*/方式选填自由文本) | ⚠️ D-12(列表缺跟进人/部门;弹窗缺 5 字段,方式无字典校验) |
|
||
|
|
| 4-2-2 | 项目文件:方案清单/报价清单/招标/投标/控标文件 + 预览下载 | `GET /project/attachment/list` + `POST /attachment/add`(fileId+bizType) + `POST /attachment/delete`(软删,DB deleted/delete_key 验证) | 📝(清单文件归场景平台引用,spec 硬边界:明细行不落 CRM;demo 通用附件形态符合 spec) |
|
||
|
|
| 4-2-3 | 关联客户:名称/类型/等级/联系人/电话 + 生态关系图谱 | `GET /project/customer/list` 单客户:名称/编号/类型(原始枚举)/销售负责人 | ⚠️ D-13(缺联系人/电话/等级;类型未译名);生态关系 📝 |
|
||
|
|
| 4-2-4 | 项目动态(系统通知/阶段变更/跟进条目)+ 操作日志 tab | `GET /project/timeline/list`:时间/动作名/描述/操作人 + from→to | ✅(动作名中文、双轴投影齐全;操作日志并入动态,spec 口径) |
|
||
|
|
| 4-2-5 | 方案设计(设计师/认领时间/版本/状态/设备清单/概算/历史版本/需求变更记录) | `GET /project/scheme`:概算金额/方案版本/设计任务状态 | 📝(主表扩展列=spec grill#11;设计师/变更记录等平台数据无同步源,恒空展示) |
|
||
|
|
| 4-2-6 | 商务报价(报价专员/设计师/版本/状态/报价清单/报价总价/历史版本) | `GET /project/quote`:报价总价/报价状态 | 📝 同上 |
|
||
|
|
| 4-2-7 | 招投标:招标文件(招标状态/预计发标/投标截止/采购方式/预算金额)/标底认定/招标策略(品牌控制/参数/商务条款/技术偏离/资质/控标文件)/投标公司(主体/授权品牌/保证金/投标文件/开标时间地点) | `GET /project/bidding`:投标截止/投标预算/品牌控制/标底类型/标底等级/分配比例/投标保证金/投标文件/投标主体 | 📝(spec §2.3 恰好这 8 标量;原型其余字段被 spec 裁剪);标底等级名走 ProjectRule ✅(票 13) |
|
||
|
|
| 4-2-8 | 赢单/输单:开标时间/地点/中标方式/单位/金额 + 标记赢单弹窗(*中标时间/*金额/*单位/*方式/*合同扫描件)+ 标记输单弹窗(*输单原因/竞品品牌/竞品单位/双方报价/失败分析) | `GET /project/bid-open`:开标时间/地点/中标方式/中标金额/赢输/中标时间;标记动作在头部动作区 | ⚠️ D-03:缺中标单位字段;标记动作为裸 confirm,不采集任何快照 → 快照字段恒空 |
|
||
|
|
| 4-2-9 | 结项页(输单复盘只读:开标信息+输单原因/竞品/失败分析) | stage6 详情=头部徽章+各页签(开标页签有输单标记,复盘字段无) | ⚠️(复盘字段属 D-03 快照缺口) |
|
||
|
|
| 4-2-10 | 已关闭页(关闭类型/时间/原因类型/备注 只读 + 全按钮禁用) | 关闭后头部徽章+关闭行+动作区「终态锁死」提示 | ✅(动作禁用 ✅;关闭类型枚举未译名 ⚠️ D-15) |
|
||
|
|
| 4-2-11 | 群聊详情 tab | 无 | 🚫 spin-out |
|
||
|
|
| 4-2-12 | 合同与订单 tab | 无 | 🚫 spin-out |
|
||
|
|
| 4-2-13 | 团队成员 tab | 无 | 📝(spec 端点清单未定义) |
|
||
|
|
| 4-2-14 | 操作日志 tab(含旧值/新值/敏感信息查看) | 并入动态(无旧值/新值明细) | ⚠️ P3 |
|
||
|
|
|
||
|
|
### 4.3 状态机动作(右上角操作区)
|
||
|
|
|
||
|
|
| # | 原型交互 | demo | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 4-3-1 | 冲突解除(stage0,报备审核通过 → 0→1;驳回停 0 可再审) | 动作区「冲突解除(报备审核中/驳回)」→ 弹窗通过/驳回+意见;一次动作双写 filing_status+stage(API 验证 (2,1)/(3,0)) | ✅(grill#12);权限 ⚠️ D-02 |
|
||
|
|
| 4-3-2 | 推进:确认通过 1→2、2→3、3→4、4→5(各阶段确认弹窗) | 「推进(A → B)」按钮逐级,无确认弹窗直接执行 | ✅(口径);⚠️ P3(无二次确认) |
|
||
|
|
| 4-3-3 | 3→5 唯一连跳(无需招投标,带确认弹窗) | 「无需招投标(3→5 连跳)」按钮;skipBidding 在非 stage3 无效(API B1) | ✅ |
|
||
|
|
| 4-3-4 | 阶段回退:仅管理员+销售总监可见可操作;弹窗=回退至阶段(当前之前任意/下限 stage1)+*原因类型(按目标阶段字典)+*详细说明 | 「回退…」按钮所有活跃项目 stage≥2 可见 → 弹窗仅「回退到」单选;targets=动态投影∪{stage1},3→5 连跳后={1,2,3} ✅;target 0 拒 68006 ✅;销售提交 68005 ✅ | ⚠️ D-04(缺原因类型+说明);⚠️ D-05(销售可见按钮);权限服务端强制 ✅ |
|
||
|
|
| 4-3-5 | 标记赢单:stage5 闭环锁死(状态锁定,改需管理员) | bid-result/mark=1 → (stage5,status1,bid1);回退 68003;重复标记 68009 | ✅(快照采集缺失 → D-03) |
|
||
|
|
| 4-3-6 | 标记输单:进结项(stage6/status=3) | bid-result/mark=2 → (6,3,2);终态回退/关闭/审核全拒 68003 | ✅ |
|
||
|
|
| 4-3-7 | 关闭:任意 stage、记因(类型/时间/原因/备注),关后只读 | close 弹窗(类型必填枚举校验/原因/备注)→ status=2;重复关闭/推进/标记全拒 | ✅ |
|
||
|
|
| 4-3-8 | 暂停/恢复、终止项目、编辑项目、移交负责人 | 无 | ⚠️ D-16(spec 未定义端点,原型明确有;移交 Port spec §5 有间接依据——待复核) |
|
||
|
|
| 4-3-9 | 写跟进/一键拉群 | 写跟进 ✅(字段缺口 D-12);一键拉群 🚫 | — |
|
||
|
|
| 4-3-10 | stage5 未标记不可直接推进 | 68004「请使用标记赢单/输单」 | ✅ |
|
||
|
|
| 4-3-11 | 三终态锁(结项/已关闭/赢单) | 回退/推进/关闭/标记/审核全被 68003 拒;动作区隐藏+「终态锁死」文案 | ✅(D-01 看板入口除外) |
|
||
|
|
|
||
|
|
### 4.4 动态事件流完整性
|
||
|
|
|
||
|
|
| 事件 | 留痕(action/actionName) | 结论 |
|
||
|
|
|---|---|---|
|
||
|
|
| 建项 | CREATE/建项目(含「冲突检测:无冲突(留桩)」说明) | ✅ |
|
||
|
|
| 报备发起 | FILING_SUBMIT/报备发起 | ✅ |
|
||
|
|
| 报备驳回 | FILING_REJECT | ✅ |
|
||
|
|
| 冲突解除 | CONFLICT_RELEASE(0→1) | ✅ |
|
||
|
|
| 推进(含连跳) | STAGE_ADVANCE(from→to) | ✅ |
|
||
|
|
| 回退 | STAGE_ROLLBACK(from→to) | ✅(无回退原因 → D-04 关联) |
|
||
|
|
| 赢单/输单 | BID_WIN / BID_LOSE(5→6) | ✅ |
|
||
|
|
| 关闭 | CLOSE/关闭 | ✅ |
|
||
|
|
| 跟进新增 | FOLLOW_ADD/新增跟进 | ✅ |
|
||
|
|
| 移交负责人 | 无移交功能 | ⚠️ D-16 |
|
||
|
|
|
||
|
|
## 5. A5-1-1-1 / A5-1-1-1b 处理冲突(本地/异地)
|
||
|
|
|
||
|
|
| # | 原型内容 | demo | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 5-1 | 冲突检测详情(检测时间/结论/类型本地·异地/六维+异地判定明细/处理时限) | 无 | 🚫 spin-out(检测留桩) |
|
||
|
|
| 5-2 | 前置操作拉群沟通/冲突方处理明细(不动/错开/承认标底/放弃)/撤销冲突 | 无 | 🚫 spin-out |
|
||
|
|
| 5-3 | 冲突处理权限:仅报备专员+管理员可操作 | 任意登录用户可提交 filing/review(服务端无角色校验) | ⚠️ D-02 |
|
||
|
|
| 5-4 | 冲突解除动作本身(解除锁定→推进) | ✅ 通过→0→1,驳回→停 0 可再审 | ✅ |
|
||
|
|
|
||
|
|
## 6. A5-1-4 项目统计
|
||
|
|
|
||
|
|
| # | 原型内容 | demo | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 6-1 | 统计大屏:项目总数/赢单率/方案设计数/报价总额/待处理冲突/待确认方案/待确认报价/跟进中/阶段分布图 | 无此 tab | ❌ D-16b(📝 spec 端点清单未定义统计端点——按 spec 裁剪,建议后补) |
|
||
|
|
|
||
|
|
## 7. 接口层抽查(GET 读 / POST 写 / 信封 / 错误码)
|
||
|
|
|
||
|
|
| # | 检查项 | 结果 | 结论 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 7-1 | 响应信封 {code,success,message,data} | 全端点一致;code=0 成功 | ✅ |
|
||
|
|
| 7-2 | GET 读(board/list/detail/follow/attachment/customer/timeline/scheme/quote/bidding/bid-open/rollback-targets)、POST 写(create/filing/stage/rollback/bid-result/close/follow-add/attachment-add/delete) | 全部符合 | ✅ |
|
||
|
|
| 7-3 | 禁 @PathVariable | `/project/detail/{id}` → 40401 接口不存在 | ✅ |
|
||
|
|
| 7-4 | 禁 PUT/DELETE | 40501 错误的请求方式;UI 网络层零 PUT/DELETE(U42) | ✅ |
|
||
|
|
| 7-5 | 分页结构 {content,current,pages,size,total};size=2 生效;current=0/size=0 不炸 | ✅ | ✅ |
|
||
|
|
| 7-6 | 错误码语义:68001 必填/非法参数、68002 项目不存在、68003 终态锁、68004 stage5 不可直推、68005 回退权限、68006 回退目标越界、68007 卡不存在/卡客户不一致、68009 bidResult 非法/重复标记;40001 缺参;40103 未登录;40401/40501 | 语义准确、文案带口径说明 | ✅ |
|
||
|
|
| 7-7 | 未登录读 → 40103 信封;demo 前端 toast 引导 uid 登录 | ✅ | ✅ |
|
||
|
|
| 7-8 | board/list 计数与 id 为字符串类型 | 前端宽松兼容 | ⚠️ P3 |
|
||
|
|
| 7-9 | 非法 followTime → 40001 message 泄露 Java 类型转换细节 | — | ⚠️ P3 |
|
||
|
|
|
||
|
|
## 8. spin-out 台账(本期不做,做了要记录——本期均未做,符合范围)
|
||
|
|
|
||
|
|
| spin-out 项 | 状态 |
|
||
|
|
|---|---|
|
||
|
|
| 冲突检测五维匹配 + 拉群 | 未做;建档动态明示「冲突检测:无冲突(检测逻辑本期留桩)」✅ 姿态正确 |
|
||
|
|
| 商机推送自动转项目 | 未做;唯一入口=POST /project/create ✅ |
|
||
|
|
| 群聊页签 | 未做 |
|
||
|
|
| 阶段提醒推送 | 未做 |
|
||
|
|
| 标底分成计算 | 未做(分配比例仅字段展示,无计算) |
|
||
|
|
| 赢单后合同/订单/回款履约 | 未做;赢单 stage5 闭环 status=1,未误进结项 ✅ |
|