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.
 
 
 
 
 

18 KiB

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.jsonui-result.jsonui-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,未误进结项