diff --git a/.agents/skills/hyb-oa-delivery/SKILL.md b/.agents/skills/hyb-oa-delivery/SKILL.md index 43022533..fca1cc88 100644 --- a/.agents/skills/hyb-oa-delivery/SKILL.md +++ b/.agents/skills/hyb-oa-delivery/SKILL.md @@ -40,9 +40,10 @@ Default behavior: 5. Prefer existing project patterns, official SDKs, and principles from documented domestic OA/approval/mobile references; do not copy competitor flows or text directly. 6. Verify with the narrowest relevant automated tests, then expand by risk. 7. Use Playwright screenshots or visual metrics for PC/mobile/WeCom UI changes. New or changed mobile pages must join the unified responsive system and the 320/360/375/390/393/414/430px 统一视觉矩阵 rather than adding page-specific layout fixes. -8. Update Issue CSV statuses only after the stated `Test_Method` passes. -9. Commit in Chinese batches with Issue IDs. -10. 面向用户可测试的改动,最终必须明确“是否已部署”。只有部署与公网检查通过后,才能告知用户可以去企业微信或公网试运行环境测试。 +8. Dedicated `/mobile` pages must use the shared mobile slot/card/list/sticky-action system from `docs/product-design-rules.md`: fixed icon/avatar/status slots, `minmax(0, 1fr)` copy slots, `mobile-card`/mobile list cards, mobile tokens, and no desktop `card-std p-4` as a mobile main container. +9. Update Issue CSV statuses only after the stated `Test_Method` passes. +10. Commit in Chinese batches with Issue IDs. +11. 面向用户可测试的改动,最终必须明确“是否已部署”。只有部署与公网检查通过后,才能告知用户可以去企业微信或公网试运行环境测试。 ## Default Verification Matrix @@ -104,3 +105,4 @@ Final responses should include: - Approval-chain correctness can be proven by PC or automation, while Enterprise WeChat validates entry, binding,免登录, notification, deeplink, and mobile layout. - If real-device mobile validation is paused after automation passes, record the gate as `PAUSED`; do not close RS6/UI6/R6 mobile blockers until representative real-device confirmation is recorded. - Role-specific pages should use one shared OA/mobile framework and tailor summaries, entries, actions, and sensitive fields by role. Do not create unrelated UI systems for employee, approver, finance, admin, or CEO views. +- After MUD6, `R6-ISSUE-001` is treated as resolved based on representative real-device confirmation; future mobile regressions should be recorded as new Issues rather than reopening the old WCM6/MME6 gate unless the same production behavior returns. diff --git a/client/src/components/mobile/BarcodeScannerPanel.tsx b/client/src/components/mobile/BarcodeScannerPanel.tsx index 40549bbb..6be666cb 100644 --- a/client/src/components/mobile/BarcodeScannerPanel.tsx +++ b/client/src/components/mobile/BarcodeScannerPanel.tsx @@ -183,7 +183,7 @@ export function BarcodeScannerPanel({ disabled = false, onDetected }: BarcodeSca }, [startWithBarcodeDetector, startWithZxing, stopScanner]); return ( -
+

相机扫码

diff --git a/client/src/pages/MobileApprovalsPage.tsx b/client/src/pages/MobileApprovalsPage.tsx index 5f26308a..418131ba 100644 --- a/client/src/pages/MobileApprovalsPage.tsx +++ b/client/src/pages/MobileApprovalsPage.tsx @@ -811,7 +811,7 @@ export function MobileApprovalsPage() {

{message}

) : null} -
+

{listTitle}

@@ -835,7 +835,7 @@ export function MobileApprovalsPage() { placeholder="搜索待办" /> -
+
筛选与批量 @@ -891,7 +891,7 @@ export function MobileApprovalsPage() {
{batchMode ? ( -
+
已选 {selectedBatchTaskIds.length} 条
@@ -964,7 +964,7 @@ export function MobileApprovalsPage() { return (
@@ -999,7 +999,7 @@ export function MobileApprovalsPage() { return (
-
+

处理

{!selectedTaskId ?

请先选择任务。

: null} @@ -1045,7 +1045,7 @@ export function MobileApprovalsPage() { {selectedTask ? ( <> -
+
任务状态:{workflowStatusLabel(selectedTask.task.status)}
步骤:{selectedTask.task.stepName}
对象类型:{entityLabel(selectedTask.workflowInstance?.entityType)}
@@ -1105,7 +1105,7 @@ export function MobileApprovalsPage() {

离线仅保存通过 / 驳回草稿,联网同步成功后才会正式提交。

) : null} -
+
-
-
状态:{statusLabel(selectedAsset.status)}
-
法体:{selectedAsset.legalEntity?.name ?? "-"}
-
成本中心:{selectedAsset.costCenter?.name ?? "-"}
-
位置:{selectedAsset.location ?? "-"}
-
归属人:{selectedAsset.assignee?.name ?? "未分配"}
-
序列号:{selectedAsset.serialNo ?? "-"}
+
+
状态:{statusLabel(selectedAsset.status)}
+
法体:{selectedAsset.legalEntity?.name ?? "-"}
+
成本中心:{selectedAsset.costCenter?.name ?? "-"}
+
位置:{selectedAsset.location ?? "-"}
+
归属人:{selectedAsset.assignee?.name ?? "未分配"}
+
序列号:{selectedAsset.serialNo ?? "-"}
{isInventoryMode && canRecordInventory && selectedInventoryCheck ? ( -
+

盘点录入

仅在盘点中的任务可提交或离线缓存结果。

-
+
-
+
接入状态
{wecomStatus.label}
{wecomStatus.description}
-
+
当前绑定
@@ -181,7 +181,7 @@ export function MobileProfilePage() { ) : null}
-
+