OAFRONT4 清理票据中心PC展示

这个提交包含在:
2026-05-25 08:09:00 +08:00
父节点 5519c3d240
当前提交 54d6e32171
共修改 3 个文件,包含 19 行新增和 12 行删除
@@ -6,6 +6,8 @@ import { Button } from "../../components/ui/button";
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../../components/ui/dialog";
import { Input } from "../../components/ui/input";
import { Textarea } from "../../components/ui/textarea";
import { DateTextInput } from "../../components/common/DateTextInput";
import { formatDisplayDate, formatDisplayDateTime } from "../../lib/displayFormat";
import { formatInvoiceOcrErrorMessage } from "../../lib/invoiceOcr";
export type InvoiceDetailPanelProps = {
@@ -186,7 +188,7 @@ export function InvoiceDetailPanel({
<span className="text-zinc-500">总金额:</span>
{detail.totalAmount ? new Intl.NumberFormat("zh-CN", { style: "currency", currency: "CNY" }).format(Number(detail.totalAmount)) : "-"}
</div>
<div><span className="text-zinc-500">开票日期:</span>{detail.invoiceDate || "-"}</div>
<div><span className="text-zinc-500">开票日期:</span>{formatDisplayDate(detail.invoiceDate)}</div>
<div><span className="text-zinc-500">文件名:</span>{detail.originalName || "-"}</div>
<div className="col-span-2 flex flex-col gap-1">
<div>
@@ -335,7 +337,7 @@ export function InvoiceDetailPanel({
<div className="text-zinc-600 break-words">
来源: <strong className="font-medium text-zinc-800">{verificationProviderLabel(record.provider)}</strong> |
重试次数: <strong className="font-medium text-zinc-800">{record.attempts}</strong> |
核验时间: <strong className="font-medium text-zinc-800">{record.requestedAt || "-"}</strong>
核验时间: <strong className="font-medium text-zinc-800">{formatDisplayDateTime(record.requestedAt)}</strong>
</div>
{record.resultMessage ? <div className="mt-1 text-zinc-800 py-1 px-2 bg-zinc-50 rounded italic">{verificationMessage(record.resultMessage)}</div> : null}
{record.errorMessage ? <div className="mt-1 text-red-600 font-medium py-1 px-2 border border-red-100 bg-red-50 rounded">{verificationMessage(record.errorMessage)}</div> : null}
@@ -394,12 +396,11 @@ export function InvoiceDetailPanel({
<label className="text-xs font-medium text-zinc-600" htmlFor="invoiceDate">
开票日期
</label>
<input
<DateTextInput
className="input-std"
data-testid="invoice-edit-date"
id="invoiceDate"
onChange={(event) => setEditInvoiceDate(event.target.value)}
type="date"
value={editInvoiceDate}
/>
</div>
@@ -5,6 +5,7 @@ import { TableSkeleton } from "../../components/common/TableSkeleton";
import { Pagination } from "../../components/common/Pagination";
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../../components/ui/dropdown-menu";
import { Button } from "../../components/ui/button";
import { formatDisplayDate } from "../../lib/displayFormat";
import { formatInvoiceOcrErrorMessage } from "../../lib/invoiceOcr";
export type InvoiceListCardProps = {
@@ -22,8 +23,13 @@ export type InvoiceListCardProps = {
};
function invoiceDisplayName(item: InvoicePoolListResponse["items"][number]) {
const invoiceNo = [item.invoiceCode, item.invoiceNumber].filter(Boolean).join("-");
return item.originalName || invoiceNo || "待识别票据";
if (item.originalName) return item.originalName;
if (item.invoiceCode || item.invoiceNumber) return "已识别票据";
return "待识别票据";
}
function invoiceNumberDisplay(item: InvoicePoolListResponse["items"][number]) {
return [item.invoiceCode, item.invoiceNumber].filter(Boolean).join("-") || "-";
}
export function InvoiceListCard({
@@ -85,7 +91,7 @@ export function InvoiceListCard({
<div className="flex items-start justify-between gap-3">
<div className="min-w-0">
<div className="truncate text-sm font-semibold text-zinc-900">{invoiceDisplayName(item)}</div>
<div className="mt-1 text-xs text-zinc-500">{item.invoiceDate || "待识别"}</div>
<div className="mt-1 text-xs text-zinc-500">{item.invoiceDate ? formatDisplayDate(item.invoiceDate) : "待识别"}</div>
</div>
<StatusBadge className="shrink-0" status={item.status} />
</div>
@@ -94,7 +100,7 @@ export function InvoiceListCard({
<div>
<div className="text-xs text-zinc-500">发票号码</div>
<div className="truncate font-medium text-zinc-900">
{item.invoiceCode || "-"}-{item.invoiceNumber || "-"}
{invoiceNumberDisplay(item)}
</div>
</div>
<div>
@@ -159,11 +165,11 @@ export function InvoiceListCard({
<tr className="table-row" data-testid="invoice-row" key={item.id}>
<td className="table-td">
<div className="max-w-[260px] truncate font-medium text-zinc-900">{invoiceDisplayName(item)}</div>
<div className="mt-1 text-xs text-zinc-500">{item.invoiceDate || "待识别"}</div>
<div className="mt-1 text-xs text-zinc-500">{item.invoiceDate ? formatDisplayDate(item.invoiceDate) : "待识别"}</div>
</td>
<td className="table-td"><StatusBadge status={item.status} /></td>
<td className="table-td font-medium text-zinc-900">
{item.invoiceCode || "-"}-{item.invoiceNumber || "-"}
{invoiceNumberDisplay(item)}
</td>
<td className="table-td">
{item.status === "pending_ocr" ? (
@@ -5,7 +5,7 @@
"OAFRONT4-3","PC 导航 Portal 本地化最小修复","将 PC 主导航和页面主展示中的 Portal 英文称呼收口为“工作台”,同时避免把 smoke 账号英文角色名作为普通用户首页主称呼;不重排 Portal 首屏 hero。","左侧导航、面包屑/标题、可见主入口不再以 Portal 作为普通用户主展示;测试账号在 UI 中优先显示中文姓名或中文职能名;管理员排障页可保留 role code。","受影响流程:员工/主管/财务/管理员登录 PC -> 左侧导航 -> 工作台 -> 顶栏账号展示;验证步骤:rg -n 'Portal' client/src;cd client && npm run typecheck && npm run build;OAFRONT3 PC 矩阵中 A/B 页面 Portal 英文主展示 finding 清零或仅剩 C 类后台例外。","typescript|playwright|rg","DONE","DONE","TODO","client/src/components/navigation/NavLinks.tsx;client/src/features/navigation/schema.ts;client/src/pages/PortalHomePage.tsx;server/scripts|server/src/seeds","[""OAFRONT4-1""]","已完成本地实现:主导航、系统导航配置、工作区设置、功能开关、周报提示和工作台加载文案收口为“工作台”;类型名和 Radix Portal 组件名保留。Regression 待公网 OAFRONT3 只读矩阵复跑后关闭。"
"OAFRONT4-4","合同台账 PC 表单与状态中文化收口","修复合同台账 active/draft/archived 英文状态、日期控件英文占位、输入裁切和过长表单首屏压力;维持合同正文不上传 OA 的边界。","合同状态、操作和筛选展示中文;日期字段提供中文标签/格式提示或自定义展示;疑似裁切输入修复;新建合同表单保留必要字段,归档/续约/敏感字段可折叠或分区。","受影响流程:管理员录入合同摘要 -> 设置状态/日期/责任人/归档位置 -> 列表筛选 -> 查看/编辑 -> 权限负例普通员工不可见敏感入口;验证步骤:client typecheck/build;OAFRONT3 矩阵 admin /contracts-registry 英文状态、日期占位、裁切 finding 下降;手工确认不上传合同正文。","typescript|playwright|manual","DONE","DONE","TODO","client/src/pages/ContractsRegistryPage.tsx;client/src/api/contractsRegistry.ts","[""OAFRONT4-1""]","已完成本地实现:合同编辑状态、过期提示、列表状态、日期展示和归档动作中文化;未新增合同正文上传或电子签章能力。Regression 待公网 OAFRONT3 只读矩阵复跑后关闭。"
"OAFRONT4-5","资产台账 PC 首屏与字段密度治理","结合 ASSET1D 试录和 OAFRONT3 截图,调整资产台账首屏主次:建卡、筛选、列表、详情优先,分类维护降级;清理资产状态码、长内部流水、日期英文占位和过密扩展字段展示。","管理员能清楚完成 FA/EA-SYS/EA-REPO/EA-BKP 建卡和查看;资产列表主列不显示内部长流水为主标识;电子资产扩展 JSON 不作为普通主展示,改为摘要/折叠/调试区;日期字段中文化。","受影响流程:管理员资产建卡 -> 筛选 -> 查看详情 -> 领用/归还/盘点入口;普通员工查看自己相关资产;验证步骤:client typecheck/build;OAFRONT3 矩阵 admin /assets finding 下降;ASSET1D 手工试录路径不回归。","typescript|playwright|manual","DONE","DONE","TODO","client/src/pages/AssetRegistryPage.tsx;client/src/api/assets.ts","[""OAFRONT4-1""]","已完成本地实现:资产日期输入中文化,ERP 更新时间中文格式化;继续保持不录入账号密码、token、Secret、源码包或完整路径。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。"
"OAFRONT4-6","票据/采购/项目 PC 长内部流水与日期控件清理","处理 OAFRONT3 中票据中心、采购申请和项目页的长内部流水、日期英文占位和空态弱提示;不改变 OCR、采购审批、项目关联或后端接口语义。","票据、采购、项目列表/详情主展示使用业务编号、摘要、申请人、金额/日期和中文状态;长内部流水不作为主文案;日期输入和展示中文化;空态给出下一步动作且不重复大段解释。","受影响流程:员工查看票据中心 -> 采购申请列表/详情 -> 主管查看项目列表;验证步骤:client typecheck/build;OAFRONT3 矩阵 /invoice-pool、/purchase-requests、/projects 相关 P2 finding 下降;真实 OCR/采购流程回归不变。","typescript|playwright|manual","DONE","DONE","TODO","client/src/pages/InvoicePoolPage.tsx;client/src/pages/invoice-pool/*;client/src/pages/PurchaseRequestsPage.tsx;client/src/pages/ProjectsPage.tsx;client/src/pages/ProjectDetailPage.tsx","[""OAFRONT4-1""]","已完成本地实现:采购和项目日期输入中文化,采购附件/归档/ERP 时间中文格式化,项目列表日期中文化,项目详情角色/里程碑/任务/风险状态中文化;未改变 OCR、采购审批或项目接口语义。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。"
"OAFRONT4-6","票据/采购/项目 PC 长内部流水与日期控件清理","处理 OAFRONT3 中票据中心、采购申请和项目页的长内部流水、日期英文占位和空态弱提示;不改变 OCR、采购审批、项目关联或后端接口语义。","票据、采购、项目列表/详情主展示使用业务编号、摘要、申请人、金额/日期和中文状态;长内部流水不作为主文案;日期输入和展示中文化;空态给出下一步动作且不重复大段解释。","受影响流程:员工查看票据中心 -> 采购申请列表/详情 -> 主管查看项目列表;验证步骤:client typecheck/build;OAFRONT3 矩阵 /invoice-pool、/purchase-requests、/projects 相关 P2 finding 下降;真实 OCR/采购流程回归不变。","typescript|playwright|manual","DONE","DONE","TODO","client/src/pages/InvoicePoolPage.tsx;client/src/pages/invoice-pool/*;client/src/pages/PurchaseRequestsPage.tsx;client/src/pages/ProjectsPage.tsx;client/src/pages/ProjectDetailPage.tsx","[""OAFRONT4-1""]","已完成本地实现:采购和项目日期输入中文化,采购附件/归档/ERP 时间中文格式化,项目列表日期中文化,项目详情角色/里程碑/任务/风险状态中文化;票据列表主标题不再用发票号兜底,票据详情/核验记录日期中文化,人工修正日期改用统一 DateTextInput;未改变 OCR、采购审批或项目接口语义。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。"
"OAFRONT4-7","PC 日期与状态展示小组件化","若 OAFRONT4-2/4/5/6 出现重复实现,抽出轻量前端 helper 或小组件统一日期展示、中文状态标签和内部 ID 折叠规则;避免每页手写不同 label。","存在可复用的 status/date/display helper;付款、合同、资产、票据/采购至少两个页面复用;不引入新 UI 框架;C 类后台仍可显示必要内部码值但 A/B 类默认隐藏。","受影响流程:PC A/B 类页面展示业务对象 -> 状态/日期/内部 ID 一致;验证步骤:client typecheck/build;check-ui-design-rules;OAFRONT3 矩阵 P1/P2 下降;无 circular chunk warning。","typescript|node|playwright","DONE","DONE","TODO","client/src/lib/*;client/src/components/common/*;client/src/pages/PaymentBatchesPage.tsx;client/src/pages/ContractsRegistryPage.tsx;client/src/pages/AssetRegistryPage.tsx","[""OAFRONT4-2"",""OAFRONT4-4"",""OAFRONT4-5""]","已新增 client/src/lib/displayFormat.ts 与 DateTextInput,付款、合同、资产、采购、项目页已复用日期展示/输入;StatusBadge 补充 reviewed/executed。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。"
"OAFRONT4-8","PC 修复后自动回归与截图证据","在完成任一实施批次后,执行前端构建、设计规则、PC 只读视觉矩阵和必要业务回归;输出脱敏截图和 summary,并回填本 CSV 状态。","相关实施项的 Test_Method 均执行通过;OAFRONT3 矩阵 P1 清零,P2 有明确剩余解释;报告无密码、token、Secret、完整邮箱/手机号、完整本地路径、票据原图、合同正文、银行流水或原始 payload。","受影响流程:PC 修复实现 -> 前端构建 -> 设计规则 -> 公网只读视觉矩阵 -> Issue 状态回填;验证步骤:cd client && npm run typecheck && npm run build;node scripts/qa/check-ui-design-rules.mjs --json;bash scripts/qa/run-oafront3-pc-readonly-visual.sh;git diff --check;必要时跑 bash scripts/check-minimal.sh。","npm|node|playwright|bash|git","DOING","TODO","TODO","client/tests/e2e/oafront3-pc-readonly-visual.spec.ts;scripts/qa/run-oafront3-pc-readonly-visual.sh;artifacts/qa-flow","[""OAFRONT4-2"",""OAFRONT4-3"",""OAFRONT4-4"",""OAFRONT4-5"",""OAFRONT4-6""]","已完成本地 typecheck、build、check-ui-design-rules 和 check-minimal;build 无 Vite circular chunk warning。已跑公网只读 baseline:artifacts/qa-flow/oafront3-pc-readonly-visual-20260525-074424/summary.json 为 PASS_WITH_FINDINGS,但它验证的是尚未部署的现网旧版本;第二批本地 build 同样通过。Regression 待部署后复跑关闭。回滚路径:只读公网矩阵不写业务数据、不需清理;若部署后 UI 回归,回滚 OAFRONT4 前端提交并复跑矩阵。"
"OAFRONT4-8","PC 修复后自动回归与截图证据","在完成任一实施批次后,执行前端构建、设计规则、PC 只读视觉矩阵和必要业务回归;输出脱敏截图和 summary,并回填本 CSV 状态。","相关实施项的 Test_Method 均执行通过;OAFRONT3 矩阵 P1 清零,P2 有明确剩余解释;报告无密码、token、Secret、完整邮箱/手机号、完整本地路径、票据原图、合同正文、银行流水或原始 payload。","受影响流程:PC 修复实现 -> 前端构建 -> 设计规则 -> 公网只读视觉矩阵 -> Issue 状态回填;验证步骤:cd client && npm run typecheck && npm run build;node scripts/qa/check-ui-design-rules.mjs --json;bash scripts/qa/run-oafront3-pc-readonly-visual.sh;git diff --check;必要时跑 bash scripts/check-minimal.sh。","npm|node|playwright|bash|git","DOING","TODO","TODO","client/tests/e2e/oafront3-pc-readonly-visual.spec.ts;scripts/qa/run-oafront3-pc-readonly-visual.sh;artifacts/qa-flow","[""OAFRONT4-2"",""OAFRONT4-3"",""OAFRONT4-4"",""OAFRONT4-5"",""OAFRONT4-6""]","已完成本地 typecheck、build、check-ui-design-rules 和 check-minimal;build 无 Vite circular chunk warning。已跑公网只读 baseline:artifacts/qa-flow/oafront3-pc-readonly-visual-20260525-074424/summary.json 为 PASS_WITH_FINDINGS,但它验证的是尚未部署的现网旧版本;第二批和第三批本地 build 同样通过,第三批补票据中心日期/标题清理。Regression 待部署后复跑关闭。回滚路径:只读公网矩阵不写业务数据、不需清理;若部署后 UI 回归,回滚 OAFRONT4 前端提交并复跑矩阵。"
"OAFRONT4-9","用户采纳与实施顺序门禁","把本合同提交给用户审查,明确先做哪组、哪些后置;未被采纳的 UI 改动不得进入实现。","用户对实施顺序给出 A/B/C 选择并回填 Notes;采纳后才进入代码修改;若选择暂停,则保留本合同为建议证据,不改页面。","受影响流程:PC 证据 -> 用户决策 -> 采纳项进入实现 -> 未采纳项后置;验证步骤:人工问答 A=按推荐顺序先修付款批次+Portal本地化+合同资产;B=只修 P1 付款批次,其他等 7 天反馈;C=暂停 PC UI 修复,继续真实使用稳定化;回填选择并 validate CSV。","manual|python3","DONE","DONE","DONE","issues/2026-05-25_00-55-14-oa-pc-launch-ui-cleanup-v1.csv","[""OAFRONT4-0""]","用户已批准开始实施,按默认推荐 A 先执行第一批 OAFRONT4-2+3+4;第二批 OAFRONT4-5+6 后置,Portal hero/视觉 token/大页面拆分继续后置。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
5 OAFRONT4-3 PC 导航 Portal 本地化最小修复 将 PC 主导航和页面主展示中的 Portal 英文称呼收口为“工作台”,同时避免把 smoke 账号英文角色名作为普通用户首页主称呼;不重排 Portal 首屏 hero。 左侧导航、面包屑/标题、可见主入口不再以 Portal 作为普通用户主展示;测试账号在 UI 中优先显示中文姓名或中文职能名;管理员排障页可保留 role code。 受影响流程:员工/主管/财务/管理员登录 PC -> 左侧导航 -> 工作台 -> 顶栏账号展示;验证步骤:rg -n 'Portal' client/src;cd client && npm run typecheck && npm run build;OAFRONT3 PC 矩阵中 A/B 页面 Portal 英文主展示 finding 清零或仅剩 C 类后台例外。 typescript|playwright|rg DONE DONE TODO client/src/components/navigation/NavLinks.tsx;client/src/features/navigation/schema.ts;client/src/pages/PortalHomePage.tsx;server/scripts|server/src/seeds ["OAFRONT4-1"] 已完成本地实现:主导航、系统导航配置、工作区设置、功能开关、周报提示和工作台加载文案收口为“工作台”;类型名和 Radix Portal 组件名保留。Regression 待公网 OAFRONT3 只读矩阵复跑后关闭。
6 OAFRONT4-4 合同台账 PC 表单与状态中文化收口 修复合同台账 active/draft/archived 英文状态、日期控件英文占位、输入裁切和过长表单首屏压力;维持合同正文不上传 OA 的边界。 合同状态、操作和筛选展示中文;日期字段提供中文标签/格式提示或自定义展示;疑似裁切输入修复;新建合同表单保留必要字段,归档/续约/敏感字段可折叠或分区。 受影响流程:管理员录入合同摘要 -> 设置状态/日期/责任人/归档位置 -> 列表筛选 -> 查看/编辑 -> 权限负例普通员工不可见敏感入口;验证步骤:client typecheck/build;OAFRONT3 矩阵 admin /contracts-registry 英文状态、日期占位、裁切 finding 下降;手工确认不上传合同正文。 typescript|playwright|manual DONE DONE TODO client/src/pages/ContractsRegistryPage.tsx;client/src/api/contractsRegistry.ts ["OAFRONT4-1"] 已完成本地实现:合同编辑状态、过期提示、列表状态、日期展示和归档动作中文化;未新增合同正文上传或电子签章能力。Regression 待公网 OAFRONT3 只读矩阵复跑后关闭。
7 OAFRONT4-5 资产台账 PC 首屏与字段密度治理 结合 ASSET1D 试录和 OAFRONT3 截图,调整资产台账首屏主次:建卡、筛选、列表、详情优先,分类维护降级;清理资产状态码、长内部流水、日期英文占位和过密扩展字段展示。 管理员能清楚完成 FA/EA-SYS/EA-REPO/EA-BKP 建卡和查看;资产列表主列不显示内部长流水为主标识;电子资产扩展 JSON 不作为普通主展示,改为摘要/折叠/调试区;日期字段中文化。 受影响流程:管理员资产建卡 -> 筛选 -> 查看详情 -> 领用/归还/盘点入口;普通员工查看自己相关资产;验证步骤:client typecheck/build;OAFRONT3 矩阵 admin /assets finding 下降;ASSET1D 手工试录路径不回归。 typescript|playwright|manual DONE DONE TODO client/src/pages/AssetRegistryPage.tsx;client/src/api/assets.ts ["OAFRONT4-1"] 已完成本地实现:资产日期输入中文化,ERP 更新时间中文格式化;继续保持不录入账号密码、token、Secret、源码包或完整路径。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。
8 OAFRONT4-6 票据/采购/项目 PC 长内部流水与日期控件清理 处理 OAFRONT3 中票据中心、采购申请和项目页的长内部流水、日期英文占位和空态弱提示;不改变 OCR、采购审批、项目关联或后端接口语义。 票据、采购、项目列表/详情主展示使用业务编号、摘要、申请人、金额/日期和中文状态;长内部流水不作为主文案;日期输入和展示中文化;空态给出下一步动作且不重复大段解释。 受影响流程:员工查看票据中心 -> 采购申请列表/详情 -> 主管查看项目列表;验证步骤:client typecheck/build;OAFRONT3 矩阵 /invoice-pool、/purchase-requests、/projects 相关 P2 finding 下降;真实 OCR/采购流程回归不变。 typescript|playwright|manual DONE DONE TODO client/src/pages/InvoicePoolPage.tsx;client/src/pages/invoice-pool/*;client/src/pages/PurchaseRequestsPage.tsx;client/src/pages/ProjectsPage.tsx;client/src/pages/ProjectDetailPage.tsx ["OAFRONT4-1"] 已完成本地实现:采购和项目日期输入中文化,采购附件/归档/ERP 时间中文格式化,项目列表日期中文化,项目详情角色/里程碑/任务/风险状态中文化;未改变 OCR、采购审批或项目接口语义。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。 已完成本地实现:采购和项目日期输入中文化,采购附件/归档/ERP 时间中文格式化,项目列表日期中文化,项目详情角色/里程碑/任务/风险状态中文化;票据列表主标题不再用发票号兜底,票据详情/核验记录日期中文化,人工修正日期改用统一 DateTextInput;未改变 OCR、采购审批或项目接口语义。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。
9 OAFRONT4-7 PC 日期与状态展示小组件化 若 OAFRONT4-2/4/5/6 出现重复实现,抽出轻量前端 helper 或小组件统一日期展示、中文状态标签和内部 ID 折叠规则;避免每页手写不同 label。 存在可复用的 status/date/display helper;付款、合同、资产、票据/采购至少两个页面复用;不引入新 UI 框架;C 类后台仍可显示必要内部码值但 A/B 类默认隐藏。 受影响流程:PC A/B 类页面展示业务对象 -> 状态/日期/内部 ID 一致;验证步骤:client typecheck/build;check-ui-design-rules;OAFRONT3 矩阵 P1/P2 下降;无 circular chunk warning。 typescript|node|playwright DONE DONE TODO client/src/lib/*;client/src/components/common/*;client/src/pages/PaymentBatchesPage.tsx;client/src/pages/ContractsRegistryPage.tsx;client/src/pages/AssetRegistryPage.tsx ["OAFRONT4-2","OAFRONT4-4","OAFRONT4-5"] 已新增 client/src/lib/displayFormat.ts 与 DateTextInput,付款、合同、资产、采购、项目页已复用日期展示/输入;StatusBadge 补充 reviewed/executed。Regression 待部署后公网 OAFRONT3 矩阵复跑关闭。
10 OAFRONT4-8 PC 修复后自动回归与截图证据 在完成任一实施批次后,执行前端构建、设计规则、PC 只读视觉矩阵和必要业务回归;输出脱敏截图和 summary,并回填本 CSV 状态。 相关实施项的 Test_Method 均执行通过;OAFRONT3 矩阵 P1 清零,P2 有明确剩余解释;报告无密码、token、Secret、完整邮箱/手机号、完整本地路径、票据原图、合同正文、银行流水或原始 payload。 受影响流程:PC 修复实现 -> 前端构建 -> 设计规则 -> 公网只读视觉矩阵 -> Issue 状态回填;验证步骤:cd client && npm run typecheck && npm run build;node scripts/qa/check-ui-design-rules.mjs --json;bash scripts/qa/run-oafront3-pc-readonly-visual.sh;git diff --check;必要时跑 bash scripts/check-minimal.sh。 npm|node|playwright|bash|git DOING TODO TODO client/tests/e2e/oafront3-pc-readonly-visual.spec.ts;scripts/qa/run-oafront3-pc-readonly-visual.sh;artifacts/qa-flow ["OAFRONT4-2","OAFRONT4-3","OAFRONT4-4","OAFRONT4-5","OAFRONT4-6"] 已完成本地 typecheck、build、check-ui-design-rules 和 check-minimal;build 无 Vite circular chunk warning。已跑公网只读 baseline:artifacts/qa-flow/oafront3-pc-readonly-visual-20260525-074424/summary.json 为 PASS_WITH_FINDINGS,但它验证的是尚未部署的现网旧版本;第二批本地 build 同样通过。Regression 待部署后复跑关闭。回滚路径:只读公网矩阵不写业务数据、不需清理;若部署后 UI 回归,回滚 OAFRONT4 前端提交并复跑矩阵。 已完成本地 typecheck、build、check-ui-design-rules 和 check-minimal;build 无 Vite circular chunk warning。已跑公网只读 baseline:artifacts/qa-flow/oafront3-pc-readonly-visual-20260525-074424/summary.json 为 PASS_WITH_FINDINGS,但它验证的是尚未部署的现网旧版本;第二批和第三批本地 build 同样通过,第三批补票据中心日期/标题清理。Regression 待部署后复跑关闭。回滚路径:只读公网矩阵不写业务数据、不需清理;若部署后 UI 回归,回滚 OAFRONT4 前端提交并复跑矩阵。
11 OAFRONT4-9 用户采纳与实施顺序门禁 把本合同提交给用户审查,明确先做哪组、哪些后置;未被采纳的 UI 改动不得进入实现。 用户对实施顺序给出 A/B/C 选择并回填 Notes;采纳后才进入代码修改;若选择暂停,则保留本合同为建议证据,不改页面。 受影响流程:PC 证据 -> 用户决策 -> 采纳项进入实现 -> 未采纳项后置;验证步骤:人工问答 A=按推荐顺序先修付款批次+Portal本地化+合同资产;B=只修 P1 付款批次,其他等 7 天反馈;C=暂停 PC UI 修复,继续真实使用稳定化;回填选择并 validate CSV。 manual|python3 DONE DONE DONE issues/2026-05-25_00-55-14-oa-pc-launch-ui-cleanup-v1.csv ["OAFRONT4-0"] 用户已批准开始实施,按默认推荐 A 先执行第一批 OAFRONT4-2+3+4;第二批 OAFRONT4-5+6 后置,Portal hero/视觉 token/大页面拆分继续后置。