记录日期:2026-10-17。迁移阶段仅记录以下原有问题。后续用户明确授权修复 1、2、3,现已完成 Web 前端修复;未修改后端业务。
web-admin/src/views/crm/customer/FollowFormDialog.vue,loadContactList。fetchContactByCustomerId 后读取 res.data || [];该 API 直接使用统一 request.post,HTTP 包装层已经返回 res.data.data;后端 byCustomer 返回数组。因此正常数组响应会被错误替换为空数组。{ data: [...] } 响应;空响应或请求失败时清空列表。customer/components/ContactList.vue 使用的 API 同样返回已解包数组,已修复同类解析问题。web-admin/src/views/crm/customer/CustomerDetailDialog.vue,handleViewLogDetail。row.operParam 等值,并启用 dangerouslyUseHTMLString: true,未见相应 HTML 转义。dangerouslyUseHTMLString。模块、人员、时间、URL 和请求参数均不再按 HTML 解释;保留分段、参数换行和滚动展示。web-admin/src/views/crm/opportunity/components/FollowDialog.vue,打开新增弹窗时的 new Date().toISOString().slice(0, 19).replace('T', ' ')。toISOString() 输出 UTC,截去时区标记后又作为本地日期显示/提交。在 Asia/Shanghai 中比本地时间早 8 小时。followTime 自动默认值,不是客户跟进卡片顶部的 createTime,也不影响手动选择的“下次联系时间” nextTime。parseTime(new Date()) 生成本地时间。编辑已有记录的跟进时间与下次联系时间不变。pnpm exec tsx --test scripts/crm-existing-issues.test.ts:6 项通过。修复前 4 项失败,覆盖两个联系人入口、失败清空、全部日志字段的 HTML 转义、本地时间跨日、编辑时间不覆盖。pnpm build 通过;全量 vue-tsc 与修复前 675 条错误基线对比无新增。已同步代码图谱,尚未发布生产。vue-tsc --noEmit 基线已有 675 条错误(输出 1514 行);本次新增客户模块的最终检查必须与基线比较,不能将全项目类型检查描述为通过。scripts/check_field_consistency.py 在仓库中不存在;使用可用 Python 执行得到文件不存在错误。此次未新增/修改后端 CRUD、Pydantic 或业务表字段,因此通过逐项核对既有 schema 与新移动 payload 补充检查,但不宣称该脚本通过。