WROAD2 增加受控上线每日巡检
这个提交包含在:
@@ -17,9 +17,9 @@ Read only what is relevant:
|
|||||||
- For approval workflow, roles, self-approval, notification, deeplink, reminder, or escalation work, read `docs/需求-统一审批中心规约.md`.
|
- For approval workflow, roles, self-approval, notification, deeplink, reminder, or escalation work, read `docs/需求-统一审批中心规约.md`.
|
||||||
- For HR lifecycle, employee onboarding/offboarding, Enterprise WeChat directory sync, account disablement, or Enterprise WeChat API work, read `docs/需求-企业微信基础设施规约.md`, `docs/企微API能力目录.md`, `docs/管理员手册.md`, and the latest HCLT/HRWD/WAPI/WRRA Issue CSV evidence first.
|
- For HR lifecycle, employee onboarding/offboarding, Enterprise WeChat directory sync, account disablement, or Enterprise WeChat API work, read `docs/需求-企业微信基础设施规约.md`, `docs/企微API能力目录.md`, `docs/管理员手册.md`, and the latest HCLT/HRWD/WAPI/WRRA Issue CSV evidence first.
|
||||||
- For any Enterprise WeChat capability, Secret, callback, approval, check-in, HR assistant, or contact-directory task, read `docs/企微API能力目录.md` before planning or coding. WAPI fixes the current Secret matrix: contacts use `WECOM_CONTACT_SECRET`; workbench/OAuth/messages/HR assistant/roster/check-in/approval use `WECOM_AGENT_SECRET`; `WECOM_CHECKIN_SECRET` is only an explicit check-in override; `WECOM_HR_ASSISTANT_SECRET` is historical compatibility and not a default. Do not write runtime code that tries multiple Secrets to guess the correct one.
|
- For any Enterprise WeChat capability, Secret, callback, approval, check-in, HR assistant, or contact-directory task, read `docs/企微API能力目录.md` before planning or coding. WAPI fixes the current Secret matrix: contacts use `WECOM_CONTACT_SECRET`; workbench/OAuth/messages/HR assistant/roster/check-in/approval use `WECOM_AGENT_SECRET`; `WECOM_CHECKIN_SECRET` is only an explicit check-in override; `WECOM_HR_ASSISTANT_SECRET` is historical compatibility and not a default. Do not write runtime code that tries multiple Secrets to guess the correct one.
|
||||||
- For Enterprise WeChat-first HR/attendance runtime migration, read `docs/企微优先开发路线图.md` before planning or coding. WDRG makes the roadmap authoritative for stage order; WAPI adds the runtime-first stage before deep mirror work; WRRA states that WOUA `PASS_WITH_FINDINGS` does not clear deep mirror work; WOUA-FIX has now soft-archived the 7 OA active test accounts missing in WeCom, fixed the `T0000` seed reactivation behavior, transferred the `SMOKE201` test-manager side effects, and rerun WOUA with `oaActiveMissingInWecom=0`. WCPC has rerun the capability POC with an existing active test account and reached `GO_TO_HR_MASTER_SYNC`; WHMS/WHMSLIVE has implemented, deployed, and publicly verified `wecom_hr_master_sync_v1`, with the production flag restored to `force_off` and production real-employee batch apply not approved. WMSG1 proves real app-message delivery and Deeplink return only; WAPC1 fixes the approval configuration preparation checklist before mirror work; WAPC2 adds the leave/missed-punch approval template and low-risk `sp_no` read-only POC runner. WPROC1/WPROC2 fixed the engineering process gate; WEGOV1 is the route gate, and WACP3R has now rerun the compensation-pull POC by automatically discovering OA-POC leave/missed-punch template IDs from `SMOKE002` creator. Public report `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` is `PASS_WITH_FINDINGS`: compensation pull and detail read work, with finding that callback evidence files are not persisted across deploys. WREAD1/WREAD1F have now completed real-device readability confirmation for leave and missed-punch: public report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`; the user confirmed cards/lists/details are readable, reject has second confirmation, and approve is single-tap. WADM1 has completed the self-owned archive/mirror data-model design. WARCH1 has implemented and publicly verified the minimum leave/missed-punch archive slice: Prisma archive/callback/compensation/finding tables, callback DB persistence with non-200 retry on DB failure, compensation persistence behind `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1`, and offline `npm run check:wecom-approval-archive`; public reports `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` and `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` are `PASS_WITH_FINDINGS`, with 2 archived histories readable and only a historical pre-WARCH1 callback gap finding. WARCH2 has now added the formal OA read-only archive API/page locally: `/api/wecom/approval-archive`, `/wecom-approval-archive`, and `/mobile/wecom-approval-archive` read OA DB only, do not call WeCom API or read WeCom Secrets, and enforce self/direct-report/HR-admin visibility with unmapped applicant records HR/admin-only. It still does not implement full mirror, outing/overtime, emergency mode, writeback, or RuleOps. WPROC2 adds the executable `process gate`: before WAPC2F or other high-risk WeCom work, run `node scripts/qa/check-process-contract.mjs --baseline` and the issue-specific profile check to enforce DoR/DoD, fixed Secret source, non-self approval, live write switches, missing-config classification, and redaction boundaries. Do not start `wecom_attendance_approval_mirror_v1`, `oa_hr_emergency_mode_v1`, `wecom_recovery_writeback_v1`, or `wecom_ruleops_v1` without the next stage's own Issue CSV and acceptance gates.
|
- For Enterprise WeChat-first HR/attendance runtime migration, read `docs/企微优先开发路线图.md` before planning or coding. WDRG makes the roadmap authoritative for stage order; WAPI adds the runtime-first stage before deep mirror work; WRRA states that WOUA `PASS_WITH_FINDINGS` does not clear deep mirror work; WOUA-FIX has now soft-archived the 7 OA active test accounts missing in WeCom, fixed the `T0000` seed reactivation behavior, transferred the `SMOKE201` test-manager side effects, and rerun WOUA with `oaActiveMissingInWecom=0`. WCPC has rerun the capability POC with an existing active test account and reached `GO_TO_HR_MASTER_SYNC`; WHMS/WHMSLIVE has implemented, deployed, and publicly verified `wecom_hr_master_sync_v1`, with the production flag restored to `force_off` and production real-employee batch apply not approved. WMSG1 proves real app-message delivery and Deeplink return only; WAPC1 fixes the approval configuration preparation checklist before mirror work; WAPC2 adds the leave/missed-punch approval template and low-risk `sp_no` read-only POC runner. WPROC1/WPROC2 fixed the engineering process gate; WEGOV1 is the route gate, and WACP3R has now rerun the compensation-pull POC by automatically discovering OA-POC leave/missed-punch template IDs from `SMOKE002` creator. Public report `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` is `PASS_WITH_FINDINGS`: compensation pull and detail read work, with finding that callback evidence files are not persisted across deploys. WREAD1/WREAD1F have now completed real-device readability confirmation for leave and missed-punch: public report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`; the user confirmed cards/lists/details are readable, reject has second confirmation, and approve is single-tap. WADM1 has completed the self-owned archive/mirror data-model design. WARCH1 has implemented and publicly verified the minimum leave/missed-punch archive slice: Prisma archive/callback/compensation/finding tables, callback DB persistence with non-200 retry on DB failure, compensation persistence behind `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1`, and offline `npm run check:wecom-approval-archive`; public reports `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` and `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` are `PASS_WITH_FINDINGS`, with 2 archived histories readable and only a historical pre-WARCH1 callback gap finding. WARCH2 has now added the formal OA read-only archive API/page: `/api/wecom/approval-archive`, `/wecom-approval-archive`, and `/mobile/wecom-approval-archive` read OA DB only, do not call WeCom API or read WeCom Secrets, and enforce self/direct-report/HR-admin visibility with unmapped applicant records HR/admin-only. WROAD2+OPS is the current controlled launch gate: use test accounts `SMOKE002 -> SMOKE101 + wangshunli`, run `scripts/qa/run-wroad2-ops-daily.sh` manually once per day for 3 days, allow only compensation archive writes to OA DB via `WECOM_ARCHIVE_WRITE=1`, and do not create WeCom templates/approvals, write WeCom, install timers, or expand real users. Day 0 public report `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` is `PASS_WITH_FINDINGS`: WeCom runtime, compensation archive persistence, offline archive read, and privacy smoke pass; findings are missing live-smoke login credentials/pending OCR subcheck and historical callback gap. It still does not implement full mirror, outing/overtime, emergency mode, writeback, or RuleOps. WPROC2 adds the executable `process gate`: before WAPC2F or other high-risk WeCom work, run `node scripts/qa/check-process-contract.mjs --baseline` and the issue-specific profile check to enforce DoR/DoD, fixed Secret source, non-self approval, live write switches, missing-config classification, and redaction boundaries. Do not start `wecom_attendance_approval_mirror_v1`, `oa_hr_emergency_mode_v1`, `wecom_recovery_writeback_v1`, or `wecom_ruleops_v1` without WROAD2+OPS, WARCH3, WCHECK1, WEXT1 decision, and the next stage's own Issue CSV and acceptance gates.
|
||||||
- WAPC2FLIVE supersedes the WAPC2F dry-run gap for OA-POC samples: after user approval, the runner was corrected to the official `template_name` + `property` controls create-template payload, deployed with `SYNC_ENV=0`, and the public live report `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` reached `PASS_FIXTURE_CREATED`; leave/missed-punch OA-POC templates and low-risk test approvals were created and retained for audit, with WAPC2 auto-rerun `PASS_APPROVAL_POC`. WCBK1 has added and deployed read-only `GET/POST /api/wecom/approval/callback`, `wecomCallbackCrypto`, `npm run check:wecom-approval-callback-poc`, and the `wecom-callback` process gate. After remote callback config was set, public report `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T083422Z/summary.json` reached `PASS_CALLBACK_URL_VERIFIED`; after `SMOKE101` approved an existing OA-POC missed-punch test approval, `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` reached `PASS_CALLBACK_EVENT_CONFIRMED` with one redacted event. WACP3/WACP3R has added and deployed `npm run check:wecom-approval-compensation-poc`, `POST /cgi-bin/oa/getapprovalinfo` read support, and automatic template discovery by `SMOKE002` creator; WREAD1 deploy reran WACP3R at `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T125515Z/summary.json` and then generated `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T125532Z/summary.json` as `PAUSED_MANUAL_CONFIRMATION`. WREAD1F then fixed duplicate OA-POC template names by adding timestamp uniqueness and created fresh leave/missed-punch approvals at `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T131958Z/summary.json`; final WREAD1 manual report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`. This clears leave/missed-punch readability only; mirror data model, minimum archive, emergency mode, writeback, RuleOps, and outing/overtime sample decisions remain later gates.
|
- WAPC2FLIVE supersedes the WAPC2F dry-run gap for OA-POC samples: after user approval, the runner was corrected to the official `template_name` + `property` controls create-template payload, deployed with `SYNC_ENV=0`, and the public live report `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` reached `PASS_FIXTURE_CREATED`; leave/missed-punch OA-POC templates and low-risk test approvals were created and retained for audit, with WAPC2 auto-rerun `PASS_APPROVAL_POC`. WCBK1 has added and deployed read-only `GET/POST /api/wecom/approval/callback`, `wecomCallbackCrypto`, `npm run check:wecom-approval-callback-poc`, and the `wecom-callback` process gate. After remote callback config was set, public report `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T083422Z/summary.json` reached `PASS_CALLBACK_URL_VERIFIED`; after `SMOKE101` approved an existing OA-POC missed-punch test approval, `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` reached `PASS_CALLBACK_EVENT_CONFIRMED` with one redacted event. WACP3/WACP3R has added and deployed `npm run check:wecom-approval-compensation-poc`, `POST /cgi-bin/oa/getapprovalinfo` read support, and automatic template discovery by `SMOKE002` creator; WREAD1 deploy reran WACP3R at `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T125515Z/summary.json` and then generated `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T125532Z/summary.json` as `PAUSED_MANUAL_CONFIRMATION`. WREAD1F then fixed duplicate OA-POC template names by adding timestamp uniqueness and created fresh leave/missed-punch approvals at `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T131958Z/summary.json`; final WREAD1 manual report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`. This clears leave/missed-punch readability only; mirror data model, minimum archive, emergency mode, writeback, RuleOps, and outing/overtime sample decisions remain later gates.
|
||||||
- WEGOV1 changes the current WeCom route to "Enterprise WeChat owns mature HR/attendance flows; OA stores self-owned history, audit, entry, messages, and emergency fallback." Treat four domains explicitly: WeCom-owned domain is check-in, leave, missed punch, outing, overtime, leave balance, and HR assistant; OA-owned domain remains reimbursement, procurement, contracts, projects, payments, invoices, bank receipts, sensitive attachments, and operating audit; OA archive domain stores WeCom business history, full external keys, and necessary snapshots; OA emergency domain is manually enabled only when WeCom is unavailable. Do not assume a full isolated WeCom sandbox; use the controlled test domain `SMOKE002 -> SMOKE101`, `OA-POC` templates, low-risk approvals, synthetic tests, public live runners, and limited real-device confirmation. WARCH1 now supplies the minimum leave/missed-punch archive implementation and WARCH2 supplies the formal read-only history query surface; do not start deep mirror until WARCH2 public verification is accepted and the mirror stage has its own contract.
|
- WEGOV1 changes the current WeCom route to "Enterprise WeChat owns mature HR/attendance flows; OA stores self-owned history, audit, entry, messages, and emergency fallback." Treat four domains explicitly: WeCom-owned domain is check-in, leave, missed punch, outing, overtime, leave balance, and HR assistant; OA-owned domain remains reimbursement, procurement, contracts, projects, payments, invoices, bank receipts, sensitive attachments, and operating audit; OA archive domain stores WeCom business history, full external keys, and necessary snapshots; OA emergency domain is manually enabled only when WeCom is unavailable. Do not assume a full isolated WeCom sandbox; use the controlled test domain `SMOKE002 -> SMOKE101`, `OA-POC` templates, low-risk approvals, synthetic tests, public live runners, and limited real-device confirmation. WARCH1 now supplies the minimum leave/missed-punch archive implementation, WARCH2 supplies the formal read-only history query surface, and WROAD2 supplies controlled ops daily checks. Do not start deep mirror until WROAD2+OPS, WARCH3, WCHECK1, WEXT1 decision, and the mirror stage's own contract are complete.
|
||||||
- For reimbursement, invoice, OCR, duplicate invoice, or attachment work, read `docs/报销发票附件规则.md` and `references/reimbursement.md`.
|
- For reimbursement, invoice, OCR, duplicate invoice, or attachment work, read `docs/报销发票附件规则.md` and `references/reimbursement.md`.
|
||||||
- For local/WeCom/public trial-run, OCR runtime, Caddy, or DB drift work, read `docs/试运行与自动化验证手册.md` and `references/trialrun.md`.
|
- For local/WeCom/public trial-run, OCR runtime, Caddy, or DB drift work, read `docs/试运行与自动化验证手册.md` and `references/trialrun.md`.
|
||||||
- For how this skill should evolve, read `docs/Agent开发交付实践.md`.
|
- For how this skill should evolve, read `docs/Agent开发交付实践.md`.
|
||||||
@@ -108,7 +108,7 @@ Final responses should include:
|
|||||||
- R6 scope defaults to reimbursement, leave, procurement, approval, Enterprise WeChat entry/notification, finance payment/export.
|
- R6 scope defaults to reimbursement, leave, procurement, approval, Enterprise WeChat entry/notification, finance payment/export.
|
||||||
- Do not expand to budget, ERP, AI, full travel, or complex BPM during R6; record those as follow-up Issues.
|
- Do not expand to budget, ERP, AI, full travel, or complex BPM during R6; record those as follow-up Issues.
|
||||||
- Enterprise WeChat personal app message is the formal approval notification channel after R5; mock and group bots are not acceptance evidence for R6 business notification.
|
- Enterprise WeChat personal app message is the formal approval notification channel after R5; mock and group bots are not acceptance evidence for R6 business notification.
|
||||||
- After WAPI, ERP is not a future OA integration target. HR/attendance employee daily approvals (leave, missed punch, outing, overtime) should reuse mature Enterprise WeChat capabilities first, while OA provides self-owned archive, domain-based mirror, manual takeover, recovery writeback, finance closeout, and audit. Reimbursement, payment batches, AP, accounting handoff, procurement, expenses, contracts, projects, sensitive attachments, invoices, bank receipts, and accounting handoff materials remain OA-primary unless a later Issue changes that domain explicitly. OA-primary approvals may send Enterprise WeChat personal-app notifications, but messages must contain only dehydrated title/type/no/status/deeplink; do not upload procurement forms, contract bodies, quotes, supplier files, invoices, bank receipts, or accounting materials to WeCom native approvals or WeCom attachments. Before runtime migration, read `docs/企微API能力目录.md` and `docs/企微优先开发路线图.md`, run or check `WECOM-CAPABILITY-POC-V1`/WCPC, and classify each capability as `CAN_REUSE_NOW`, `NEEDS_CONFIG`, `NEEDS_API_POC`, `KEEP_OA_PRIMARY`, or `NOT_SUPPORTED_BY_API`; missing Secret, callback, template, trusted IP, visible scope, or API permission must be recorded as `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`, not PASS. Current WAPI rule: contacts read with `WECOM_CONTACT_SECRET` and `POST /cgi-bin/user/list_id`; HR assistant/roster uses `WECOM_AGENT_SECRET` and `POST /cgi-bin/hr/get_staff_info`; check-in defaults to `WECOM_AGENT_SECRET` with optional explicit `WECOM_CHECKIN_SECRET`; approval template/detail reads use `WECOM_AGENT_SECRET`; no runtime Secret guessing. WARCH1 now implements the minimum leave/missed-punch archive slice: callback events and compensation details can persist to OA DB, report/log output stays redacted, and `npm run check:wecom-approval-archive -- --offline --format=json` proves saved history can be read without WeCom API. WARCH2 now exposes that saved history through OA read-only API and PC/mobile pages with redacted output and HR/admin-only access for unmapped applicant records. Attendance/approval deep mirror, emergency mode, recovery writeback, RuleOps, outing/overtime samples, and HR write APIs remain later-stage gaps. Do not skip stage order: `WECOM-CAPABILITY-POC-V1`/WCPC -> `wecom_hr_master_sync_v1`/WHMSLIVE -> `runtime_first_wecom_enablement`/WAPI+WOUA rerun -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`. UI and API work must distinguish `OA 主办`, `企微主办`, `OA 自建留存`, and `OA 应急接管`. OA-driven Enterprise WeChat directory create/update/disable is live verified; for later HR/WeCom directory issues, first check configuration, permission, department, and data-specific causes before treating the capability as unfinished.
|
- After WAPI, ERP is not a future OA integration target. HR/attendance employee daily approvals (leave, missed punch, outing, overtime) should reuse mature Enterprise WeChat capabilities first, while OA provides self-owned archive, domain-based mirror, manual takeover, recovery writeback, finance closeout, and audit. Reimbursement, payment batches, AP, accounting handoff, procurement, expenses, contracts, projects, sensitive attachments, invoices, bank receipts, and accounting handoff materials remain OA-primary unless a later Issue changes that domain explicitly. OA-primary approvals may send Enterprise WeChat personal-app notifications, but messages must contain only dehydrated title/type/no/status/deeplink; do not upload procurement forms, contract bodies, quotes, supplier files, invoices, bank receipts, or accounting materials to WeCom native approvals or WeCom attachments. Before runtime migration, read `docs/企微API能力目录.md` and `docs/企微优先开发路线图.md`, run or check `WECOM-CAPABILITY-POC-V1`/WCPC, and classify each capability as `CAN_REUSE_NOW`, `NEEDS_CONFIG`, `NEEDS_API_POC`, `KEEP_OA_PRIMARY`, or `NOT_SUPPORTED_BY_API`; missing Secret, callback, template, trusted IP, visible scope, or API permission must be recorded as `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`, not PASS. Current WAPI rule: contacts read with `WECOM_CONTACT_SECRET` and `POST /cgi-bin/user/list_id`; HR assistant/roster uses `WECOM_AGENT_SECRET` and `POST /cgi-bin/hr/get_staff_info`; check-in defaults to `WECOM_AGENT_SECRET` with optional explicit `WECOM_CHECKIN_SECRET`; approval template/detail reads use `WECOM_AGENT_SECRET`; no runtime Secret guessing. WARCH1 now implements the minimum leave/missed-punch archive slice: callback events and compensation details can persist to OA DB, report/log output stays redacted, and `npm run check:wecom-approval-archive -- --offline --format=json` proves saved history can be read without WeCom API. WARCH2 now exposes that saved history through OA read-only API and PC/mobile pages with redacted output and HR/admin-only access for unmapped applicant records. WROAD2+OPS is the current controlled launch and daily ops gate; its script may write only OA archive persistence and must not write WeCom. Attendance/approval deep mirror, emergency mode, recovery writeback, RuleOps, outing/overtime samples, and HR write APIs remain later-stage gaps. Do not skip stage order: `WECOM-CAPABILITY-POC-V1`/WCPC -> `wecom_hr_master_sync_v1`/WHMSLIVE -> `runtime_first_wecom_enablement`/WAPI+WOUA rerun -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班延期决策` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`. UI and API work must distinguish `OA 主办`, `企微主办`, `OA 自建留存`, and `OA 应急接管`. OA-driven Enterprise WeChat directory create/update/disable is live verified; for later HR/WeCom directory issues, first check configuration, permission, department, and data-specific causes before treating the capability as unfinished.
|
||||||
- WMSG1 has verified real Enterprise WeChat personal-app delivery and Deeplink return: report `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` has `checks.message.status=OK`, `errcode=0`, and `recipientCount=1`; the user confirmed receiving "OA 运行就绪检查" and opening the OA notifications page from the message. This only clears message/deeplink runtime evidence; template/detail, callback evidence, compensation pull, readability, self-owned archive model design, and minimum archive implementation are covered by WAPC2FLIVE/WCBK1/WACP3R/WREAD1/WADM1/WARCH1 in the OA-POC leave/missed-punch scope, while deep mirror work remains a separate later gate.
|
- WMSG1 has verified real Enterprise WeChat personal-app delivery and Deeplink return: report `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` has `checks.message.status=OK`, `errcode=0`, and `recipientCount=1`; the user confirmed receiving "OA 运行就绪检查" and opening the OA notifications page from the message. This only clears message/deeplink runtime evidence; template/detail, callback evidence, compensation pull, readability, self-owned archive model design, and minimum archive implementation are covered by WAPC2FLIVE/WCBK1/WACP3R/WREAD1/WADM1/WARCH1 in the OA-POC leave/missed-punch scope, while deep mirror work remains a separate later gate.
|
||||||
- WAPC1 has fixed the WeCom approval configuration preparation gate: first templates are leave, missed punch, outing, and overtime; each needs template ID, scope, fields, approver rules, visible scope, and self-built app permission; low-risk test `sp_no` must not contain procurement, contract, reimbursement, invoice, bank receipt, sensitive attachment, or real sensitive business material; callback URL/Token/EncodingAESKey are deployment-only values and must not be written to repo docs or Issue CSV. Do not implement real approval callback handling, deep mirror, emergency mode, recovery writeback, or RuleOps until a later approved Issue covers the POC or implementation.
|
- WAPC1 has fixed the WeCom approval configuration preparation gate: first templates are leave, missed punch, outing, and overtime; each needs template ID, scope, fields, approver rules, visible scope, and self-built app permission; low-risk test `sp_no` must not contain procurement, contract, reimbursement, invoice, bank receipt, sensitive attachment, or real sensitive business material; callback URL/Token/EncodingAESKey are deployment-only values and must not be written to repo docs or Issue CSV. Do not implement real approval callback handling, deep mirror, emergency mode, recovery writeback, or RuleOps until a later approved Issue covers the POC or implementation.
|
||||||
- WAPC2 has added the WeCom approval template/detail read-only POC runner for leave and missed punch. Use `npm run check:wecom-approval-poc`; pass template IDs with `--template=leave:<id>` / `--template=missed_punch:<id>` and low-risk test approval numbers with `--sp-no=leave:<sp_no>` / `--sp-no=missed_punch:<sp_no>`. The runner must use only `WECOM_AGENT_SECRET`, redact full template IDs and `sp_no`, and never output form values, attachments, comments, full userid, token, Secret, or raw payload.
|
- WAPC2 has added the WeCom approval template/detail read-only POC runner for leave and missed punch. Use `npm run check:wecom-approval-poc`; pass template IDs with `--template=leave:<id>` / `--template=missed_punch:<id>` and low-risk test approval numbers with `--sp-no=leave:<sp_no>` / `--sp-no=missed_punch:<sp_no>`. The runner must use only `WECOM_AGENT_SECRET`, redact full template IDs and `sp_no`, and never output form values, attachments, comments, full userid, token, Secret, or raw payload.
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ FROM node:20-alpine AS base
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN apk add --no-cache bash curl
|
||||||
|
|
||||||
FROM base AS client_deps
|
FROM base AS client_deps
|
||||||
COPY client/package.json client/package-lock.json ./client/
|
COPY client/package.json client/package-lock.json ./client/
|
||||||
RUN cd client && npm ci
|
RUN cd client && npm ci
|
||||||
@@ -17,6 +19,7 @@ RUN cd server && npm ci
|
|||||||
|
|
||||||
FROM server_deps AS server_build
|
FROM server_deps AS server_build
|
||||||
COPY server ./server
|
COPY server ./server
|
||||||
|
COPY scripts ./scripts
|
||||||
COPY --from=client_build /app/client/dist ./client/dist
|
COPY --from=client_build /app/client/dist ./client/dist
|
||||||
|
|
||||||
WORKDIR /app/server
|
WORKDIR /app/server
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开
|
|||||||
- 2026-05-19 WADM1 完成企微自建留存/镜像数据模型设计:本轮只更新 Issue CSV 和事实源,不改 Prisma schema、不写业务代码、不部署、不写 OA/企微业务数据。设计固定 `WecomApprovalArchive`、参与人/动作/字段摘要、附件摘要、回调事件、补偿拉取 run/item、对账 finding、打卡/人事快照复用边界、隐私保留、权限和迁移回滚策略。WACP3R “回调证据文件未持久化”的 finding 进入 WARCH1 入库实现;同意单击即通过进入 WARCH1 历史留存、审批轨迹和操作规程提示。该阶段已由下一条 WARCH1 承接,仍不能直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。
|
- 2026-05-19 WADM1 完成企微自建留存/镜像数据模型设计:本轮只更新 Issue CSV 和事实源,不改 Prisma schema、不写业务代码、不部署、不写 OA/企微业务数据。设计固定 `WecomApprovalArchive`、参与人/动作/字段摘要、附件摘要、回调事件、补偿拉取 run/item、对账 finding、打卡/人事快照复用边界、隐私保留、权限和迁移回滚策略。WACP3R “回调证据文件未持久化”的 finding 进入 WARCH1 入库实现;同意单击即通过进入 WARCH1 历史留存、审批轨迹和操作规程提示。该阶段已由下一条 WARCH1 承接,仍不能直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。
|
||||||
- 2026-05-19 WARCH1 实现企微审批最小自建历史留存:新增审批留存 Prisma 表、回调事件表、补偿 run/item/finding、`wecomApprovalArchive` 规范化服务、回调 DB 入库默认路径、补偿拉取 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关和 `npm run check:wecom-approval-archive` 离线读取 runner。已以 `SYNC_ENV=0` 部署并应用 migration;远端补偿持久化报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 为 `PASS_WITH_FINDINGS`,`archivePersistence.status=OK`、`storedCount=2`;离线读取报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读请假/补卡 2 条已通过历史。finding 是 WARCH1 前旧回调未持久化到 DB 的历史 gap,已作为对账 finding 留存,不是当前写入链路阻断。范围仅请假/补卡;不写企微数据、不创建模板或审批单、不新增正式管理页、不进入完整镜像、应急接管、恢复回写或 RuleOps。报告和日志只输出脱敏 `sp_no`、template、userid 前缀,DB 内保存完整外部键用于审计和补偿。
|
- 2026-05-19 WARCH1 实现企微审批最小自建历史留存:新增审批留存 Prisma 表、回调事件表、补偿 run/item/finding、`wecomApprovalArchive` 规范化服务、回调 DB 入库默认路径、补偿拉取 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关和 `npm run check:wecom-approval-archive` 离线读取 runner。已以 `SYNC_ENV=0` 部署并应用 migration;远端补偿持久化报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 为 `PASS_WITH_FINDINGS`,`archivePersistence.status=OK`、`storedCount=2`;离线读取报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读请假/补卡 2 条已通过历史。finding 是 WARCH1 前旧回调未持久化到 DB 的历史 gap,已作为对账 finding 留存,不是当前写入链路阻断。范围仅请假/补卡;不写企微数据、不创建模板或审批单、不新增正式管理页、不进入完整镜像、应急接管、恢复回写或 RuleOps。报告和日志只输出脱敏 `sp_no`、template、userid 前缀,DB 内保存完整外部键用于审计和补偿。
|
||||||
- 2026-05-20 WARCH2 实现并部署企微审批历史正式只读查询:新增 `/api/wecom/approval-archive` 列表和详情 API、PC/移动共用历史页、备用模块入口和移动考勤卡片入口。查询只读 OA DB,不调用企微 API、不读取企微 Secret;普通员工看本人相关,主管看直属下属和本人相关,HR/admin/* 看全量;`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射、callback-only 或外部-only 记录仅 HR/admin/* 可见。页面固定“企业微信主办,OA 自建留存”“仅已归档记录”,不展示审批按钮或 pending 待办语义。已以 `SYNC_ENV=0` 部署,公网 `/ready` 正常,新 API 未登录返回 401;远端离线归档报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读 2 条请假/补卡历史,finding 仍为 WARCH1 前旧回调未入库历史 gap。
|
- 2026-05-20 WARCH2 实现并部署企微审批历史正式只读查询:新增 `/api/wecom/approval-archive` 列表和详情 API、PC/移动共用历史页、备用模块入口和移动考勤卡片入口。查询只读 OA DB,不调用企微 API、不读取企微 Secret;普通员工看本人相关,主管看直属下属和本人相关,HR/admin/* 看全量;`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射、callback-only 或外部-only 记录仅 HR/admin/* 可见。页面固定“企业微信主办,OA 自建留存”“仅已归档记录”,不展示审批按钮或 pending 待办语义。已以 `SYNC_ENV=0` 部署,公网 `/ready` 正常,新 API 未登录返回 401;远端离线归档报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读 2 条请假/补卡历史,finding 仍为 WARCH1 前旧回调未入库历史 gap。
|
||||||
|
- 2026-05-20 WROAD2+OPS 建立受控上线与每日巡检合同:当前不直接进入完整镜像,改为测试账号 `SMOKE002 -> SMOKE101 + wangshunli` 3 天受控试用,每日手动触发 `scripts/qa/run-wroad2-ops-daily.sh`。脚本复用公网 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;默认只读,唯一允许写入是补偿归档以进程级 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单、不安装 cron/systemd timer。Day 0 公网巡检报告待 WROAD2 部署执行后回填。
|
||||||
|
|
||||||
## 关键证据索引
|
## 关键证据索引
|
||||||
|
|
||||||
@@ -127,6 +128,7 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开
|
|||||||
| WADM1 | 已完成 docs-only 数据模型设计:固定企微审批留存、回调事件、补偿拉取、对账 finding、打卡/人事快照边界、隐私权限和 WARCH1 最小实现切片;不改 schema、不部署、不写业务数据 | `issues/2026-05-19_21-55-33-wecom-archive-mirror-data-model-design-v1.csv` |
|
| WADM1 | 已完成 docs-only 数据模型设计:固定企微审批留存、回调事件、补偿拉取、对账 finding、打卡/人事快照边界、隐私权限和 WARCH1 最小实现切片;不改 schema、不部署、不写业务数据 | `issues/2026-05-19_21-55-33-wecom-archive-mirror-data-model-design-v1.csv` |
|
||||||
| WARCH1 | 已实现并部署验证最小审批历史留存:新增 Prisma 留存表和 migration、回调 DB 入库、补偿拉取双开关入库、离线 OA DB 读取 runner;公网已写入 OA 留存 2 条请假/补卡历史并离线可读,历史回调 gap 已审计化 | `issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv`、`/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json`、`/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` |
|
| WARCH1 | 已实现并部署验证最小审批历史留存:新增 Prisma 留存表和 migration、回调 DB 入库、补偿拉取双开关入库、离线 OA DB 读取 runner;公网已写入 OA 留存 2 条请假/补卡历史并离线可读,历史回调 gap 已审计化 | `issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv`、`/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json`、`/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` |
|
||||||
| WARCH2 | 已实现并部署验证正式只读历史查询:新增企微审批历史 API、PC/移动历史页、分层权限和脱敏白名单;只读 OA DB,不调用企微 API;远端离线归档复跑可读 2 条请假/补卡历史,保留历史 callback gap finding | `issues/2026-05-20_00-26-04-wecom-approval-archive-query-v1.csv`、`/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json`、`server/src/routes/wecomApprovalArchive.js`、`client/src/pages/WecomApprovalArchivePage.tsx` |
|
| WARCH2 | 已实现并部署验证正式只读历史查询:新增企微审批历史 API、PC/移动历史页、分层权限和脱敏白名单;只读 OA DB,不调用企微 API;远端离线归档复跑可读 2 条请假/补卡历史,保留历史 callback gap finding | `issues/2026-05-20_00-26-04-wecom-approval-archive-query-v1.csv`、`/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json`、`server/src/routes/wecomApprovalArchive.js`、`client/src/pages/WecomApprovalArchivePage.tsx` |
|
||||||
|
| WROAD2+OPS | 当前受控上线与每日巡检合同:试用范围固定测试账号,3 天每日脚本化触发;巡检可写 OA 自建留存库但不写企业微信,不安装定时任务;Day 0 公网报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,企微 runtime、补偿归档、离线归档读取和隐私扫描通过,finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断受控试用 | `issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv`、`scripts/qa/run-wroad2-ops-daily.sh` |
|
||||||
|
|
||||||
## 当前门禁
|
## 当前门禁
|
||||||
|
|
||||||
|
|||||||
+10
-8
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
**文档状态**:当前企微 API 调研与本项目使用事实源。
|
**文档状态**:当前企微 API 调研与本项目使用事实源。
|
||||||
**分类**:集成事实源 / API 能力目录。
|
**分类**:集成事实源 / API 能力目录。
|
||||||
**适用时间**:WAPI / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE / WCBK1 / WEGOV1 / WACP3 / WACP3R / WREAD1 / WADM1 / WARCH1 之后。
|
**适用时间**:WAPI / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE / WCBK1 / WEGOV1 / WACP3 / WACP3R / WREAD1 / WADM1 / WARCH1 / WARCH2 / WROAD2 之后。
|
||||||
**关联 Issue**:`WAPI,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1`。
|
**关联 Issue**:`WAPI,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2`。
|
||||||
**最近核对**:2026-05-19。
|
**最近核对**:2026-05-20。
|
||||||
**不得误读**:本文只记录本项目会用到的企业微信官方 API 摘要、链接和项目决策,不复制官方文档全文,不保存 Secret、access token、完整 userid、手机号、邮箱或企微原始 payload。官方文档和企业微信后台权限配置始终是最终依据。
|
**不得误读**:本文只记录本项目会用到的企业微信官方 API 摘要、链接和项目决策,不复制官方文档全文,不保存 Secret、access token、完整 userid、手机号、邮箱或企微原始 payload。官方文档和企业微信后台权限配置始终是最终依据。
|
||||||
|
|
||||||
## 1. 固定规则
|
## 1. 固定规则
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
- 审批类 POC 默认禁止自审;WAPC2F 默认测试链为申请人 `SMOKE002`、审批人 `SMOKE101`,两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid。若 `SMOKE101` 不可用,不自动换人,返回配置缺口并问答确认。
|
- 审批类 POC 默认禁止自审;WAPC2F 默认测试链为申请人 `SMOKE002`、审批人 `SMOKE101`,两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid。若 `SMOKE101` 不可用,不自动换人,返回配置缺口并问答确认。
|
||||||
- WEGOV1 后不假设企业微信自建应用存在完整隔离 sandbox;企微开发默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
|
- WEGOV1 后不假设企业微信自建应用存在完整隔离 sandbox;企微开发默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
|
||||||
- OA 自建留存策略优先保存规范化业务数据、完整外部关联键和必要快照;报告和日志只输出脱敏前缀,不保存 Secret、token、EncodingAESKey、原始密文或无治理原始 payload。
|
- OA 自建留存策略优先保存规范化业务数据、完整外部关联键和必要快照;报告和日志只输出脱敏前缀,不保存 Secret、token、EncodingAESKey、原始密文或无治理原始 payload。
|
||||||
|
- WROAD2 后每日巡检只允许写 OA 自建留存库,不写企业微信;补偿归档写入必须同时具备进程级 `WECOM_ARCHIVE_WRITE=1` 和 runner 的 `--persist-to-db`,并固定使用 `WECOM_AGENT_SECRET`。
|
||||||
|
|
||||||
## 2. Secret 矩阵
|
## 2. Secret 矩阵
|
||||||
|
|
||||||
@@ -58,9 +59,9 @@
|
|||||||
| 打卡日报/月报/排班 | [日报](https://developer.work.weixin.qq.com/document/path/93374)、[月报](https://developer.work.weixin.qq.com/document/path/93387)、[排班](https://developer.work.weixin.qq.com/document/path/93380) | 官方打卡扩展接口 | `POST` 为主 | `WECOM_AGENT_SECRET` 或显式 `WECOM_CHECKIN_SECRET` | `NEEDS_API_POC` | 不进入当前运行优先主线;后续考勤镜像合同时再做只读 POC。 |
|
| 打卡日报/月报/排班 | [日报](https://developer.work.weixin.qq.com/document/path/93374)、[月报](https://developer.work.weixin.qq.com/document/path/93387)、[排班](https://developer.work.weixin.qq.com/document/path/93380) | 官方打卡扩展接口 | `POST` 为主 | `WECOM_AGENT_SECRET` 或显式 `WECOM_CHECKIN_SECRET` | `NEEDS_API_POC` | 不进入当前运行优先主线;后续考勤镜像合同时再做只读 POC。 |
|
||||||
| 审批概述 | [审批](https://developer.work.weixin.qq.com/document/path/91854) | 模板、实例、回调、假期 | 混合 | `WECOM_AGENT_SECRET` | `PARTIAL_NEEDS_CONFIG` | HR/考勤员工日常审批可优先在企微处理,但 OA 镜像尚未实现。 |
|
| 审批概述 | [审批](https://developer.work.weixin.qq.com/document/path/91854) | 模板、实例、回调、假期 | 混合 | `WECOM_AGENT_SECRET` | `PARTIAL_NEEDS_CONFIG` | HR/考勤员工日常审批可优先在企微处理,但 OA 镜像尚未实现。 |
|
||||||
| 审批模板详情 | [获取审批模板详情](https://developer.work.weixin.qq.com/document/path/91982) | `/cgi-bin/oa/gettemplatedetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_POC_FIXTURES` | WAPC2 runner 已可读模板详情;WAPC2FLIVE 已自动创建 OA-POC 请假/补卡测试模板并复跑得到 `PASS_APPROVAL_POC`。正式模板和外出/加班仍需单独配置或 POC。 |
|
| 审批模板详情 | [获取审批模板详情](https://developer.work.weixin.qq.com/document/path/91982) | `/cgi-bin/oa/gettemplatedetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_POC_FIXTURES` | WAPC2 runner 已可读模板详情;WAPC2FLIVE 已自动创建 OA-POC 请假/补卡测试模板并复跑得到 `PASS_APPROVAL_POC`。正式模板和外出/加班仍需单独配置或 POC。 |
|
||||||
| 审批申请详情 | [获取审批申请详情](https://developer.work.weixin.qq.com/document/path/91983) | `/cgi-bin/oa/getapprovaldetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WAPC2 runner 已可读审批详情;WAPC2FLIVE 已提交低风险请假/补卡测试审批单并自动复跑通过。WARCH1 复用该接口作为补偿拉取详情最终校准来源,可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 自建留存表;测试单不得包含采购、合同、报销、发票、银行回单或高敏附件。 |
|
| 审批申请详情 | [获取审批申请详情](https://developer.work.weixin.qq.com/document/path/91983) | `/cgi-bin/oa/getapprovaldetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WAPC2 runner 已可读审批详情;WAPC2FLIVE 已提交低风险请假/补卡测试审批单并自动复跑通过。WARCH1 复用该接口作为补偿拉取详情最终校准来源,可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 自建留存表;WROAD2 每日巡检只通过该路径补齐 OA 留存,不写企业微信。测试单不得包含采购、合同、报销、发票、银行回单或高敏附件。 |
|
||||||
| 审批状态回调 | [审批申请状态变化回调通知](https://developer.work.weixin.qq.com/document/path/91815) | 事件回调 | `GET` URL 验证 / `POST` 事件 | 自建应用回调 Token/EncodingAESKey | `CAN_REUSE_NOW_FOR_ARCHIVE` | WCBK1 已部署只读 `GET/POST /api/wecom/approval/callback` 和 `check:wecom-approval-callback-poc`;公网真实事件已确认。WARCH1 后 POST 回调默认把规范化事件写入 `WecomApprovalCallbackEvent` 和 `WecomApprovalArchive`,DB 写入失败返回非 200 触发企微重试;不保存 Token、EncodingAESKey、原始 XML、密文或原始 payload。 |
|
| 审批状态回调 | [审批申请状态变化回调通知](https://developer.work.weixin.qq.com/document/path/91815) | 事件回调 | `GET` URL 验证 / `POST` 事件 | 自建应用回调 Token/EncodingAESKey | `CAN_REUSE_NOW_FOR_ARCHIVE` | WCBK1 已部署只读 `GET/POST /api/wecom/approval/callback` 和 `check:wecom-approval-callback-poc`;公网真实事件已确认。WARCH1 后 POST 回调默认把规范化事件写入 `WecomApprovalCallbackEvent` 和 `WecomApprovalArchive`,DB 写入失败返回非 200 触发企微重试;不保存 Token、EncodingAESKey、原始 XML、密文或原始 payload。 |
|
||||||
| 批量获取审批单号 | [批量获取审批单号](https://developer.work.weixin.qq.com/document/path/91816) | `/cgi-bin/oa/getapprovalinfo` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WACP3/WACP3R 已新增 `check:wecom-approval-compensation-poc`,支持按 `creator` 自动发现 OA-POC 模板,再按 `template_id` filters 拉审批单号,并用 `getapprovaldetail` 拉详情;WARCH1 增加 OA DB 持久化双开关、补偿 run/item 和对账 finding,用于解决回调证据文件跨部署丢失问题。 |
|
| 批量获取审批单号 | [批量获取审批单号](https://developer.work.weixin.qq.com/document/path/91816) | `/cgi-bin/oa/getapprovalinfo` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WACP3/WACP3R 已新增 `check:wecom-approval-compensation-poc`,支持按 `creator` 自动发现 OA-POC 模板,再按 `template_id` filters 拉审批单号,并用 `getapprovaldetail` 拉详情;WARCH1 增加 OA DB 持久化双开关、补偿 run/item 和对账 finding,用于解决回调证据文件跨部署丢失问题。WROAD2+OPS 每日巡检复用该 runner;只允许以 `WECOM_ARCHIVE_WRITE=1` + `--persist-to-db` 写 OA 留存库,不写企微、不无过滤拉取高风险业务单据。 |
|
||||||
| 提交审批申请 | [提交审批申请](https://developer.work.weixin.qq.com/document/path/91853) | `/cgi-bin/oa/applyevent` | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | 已接入 WAPC2F QA-only runner;仅可用于 OA-POC 低风险请假/补卡测试审批单自动样件。默认 dry-run 不获取写入 token、不提交审批;live 写入需显式 CLI、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准,申请人/审批人必须非自审。WAPC2FLIVE 已提交请假/补卡测试审批单并保留审计;OA 主办报销、采购、合同、项目不迁到企微原生审批。 |
|
| 提交审批申请 | [提交审批申请](https://developer.work.weixin.qq.com/document/path/91853) | `/cgi-bin/oa/applyevent` | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | 已接入 WAPC2F QA-only runner;仅可用于 OA-POC 低风险请假/补卡测试审批单自动样件。默认 dry-run 不获取写入 token、不提交审批;live 写入需显式 CLI、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准,申请人/审批人必须非自审。WAPC2FLIVE 已提交请假/补卡测试审批单并保留审计;OA 主办报销、采购、合同、项目不迁到企微原生审批。 |
|
||||||
| 假期余额 | [获取成员假期余额](https://developer.work.weixin.qq.com/document/path/93376) | `/cgi-bin/oa/vacation/getuservacationquota` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_OR_NEEDS_PERMISSION` | WCPC 已证明可读但历史有权限错误;后续作为考勤镜像的只读项。 |
|
| 假期余额 | [获取成员假期余额](https://developer.work.weixin.qq.com/document/path/93376) | `/cgi-bin/oa/vacation/getuservacationquota` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_OR_NEEDS_PERMISSION` | WCPC 已证明可读但历史有权限错误;后续作为考勤镜像的只读项。 |
|
||||||
| 审批模板创建/更新 | [创建审批模板](https://developer.work.weixin.qq.com/document/path/97437)、[更新审批模板](https://developer.work.weixin.qq.com/document/path/97438) | `/cgi-bin/oa/approval/create_template` 等官方模板写接口 | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | WAPC2FLIVE 已用 `template_name` + `property` controls 结构创建 OA-POC 请假/补卡测试模板并保留审计。正式模板更新、外出/加班模板、RuleOps 写入仍留后期合同。 |
|
| 审批模板创建/更新 | [创建审批模板](https://developer.work.weixin.qq.com/document/path/97437)、[更新审批模板](https://developer.work.weixin.qq.com/document/path/97438) | `/cgi-bin/oa/approval/create_template` 等官方模板写接口 | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | WAPC2FLIVE 已用 `template_name` + `property` controls 结构创建 OA-POC 请假/补卡测试模板并保留审计。正式模板更新、外出/加班模板、RuleOps 写入仍留后期合同。 |
|
||||||
@@ -94,7 +95,7 @@ WAPC2 不代表真实回调、审批镜像、应急接管、恢复回写或 Rule
|
|||||||
|
|
||||||
WPROC1 将 WAPC2 之后的审批路线固定为:
|
WPROC1 将 WAPC2 之后的审批路线固定为:
|
||||||
|
|
||||||
`WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> wecom_attendance_approval_mirror_v1`
|
`WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班延期决策 -> wecom_attendance_approval_mirror_v1`
|
||||||
|
|
||||||
门禁要求:
|
门禁要求:
|
||||||
|
|
||||||
@@ -111,6 +112,7 @@ WPROC1 将 WAPC2 之后的审批路线固定为:
|
|||||||
- `WADM1` 必须先设计自建留存和镜像字段、状态机、幂等键、索引、隐私保留和迁移回滚方案,再进入 schema 或业务代码实现。
|
- `WADM1` 必须先设计自建留存和镜像字段、状态机、幂等键、索引、隐私保留和迁移回滚方案,再进入 schema 或业务代码实现。
|
||||||
- `WARCH1` 已把最小自建历史留存落到代码并完成公网验证:回调事件和补偿拉取可写 OA DB,离线 runner 可不调用企微 API 读取已保存历史。公网补偿持久化报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 为 `PASS_WITH_FINDINGS`,离线读取报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 为 `PASS_WITH_FINDINGS`;finding 是 WARCH1 前旧回调未入 DB 的历史 gap。该阶段仍只覆盖请假/补卡,不等于完整镜像增强。
|
- `WARCH1` 已把最小自建历史留存落到代码并完成公网验证:回调事件和补偿拉取可写 OA DB,离线 runner 可不调用企微 API 读取已保存历史。公网补偿持久化报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 为 `PASS_WITH_FINDINGS`,离线读取报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 为 `PASS_WITH_FINDINGS`;finding 是 WARCH1 前旧回调未入 DB 的历史 gap。该阶段仍只覆盖请假/补卡,不等于完整镜像增强。
|
||||||
- `WARCH2` 在 WARCH1 基础上新增 OA 正式只读历史查询:`GET /api/wecom/approval-archive` 和详情接口只读 OA DB,不调用企业微信 API、不读取企微 Secret、不新增企微写入。权限以 OA employee 关系为准:本人相关、直属下属、HR/admin/*;`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射或 callback-only 记录只允许 HR/admin/* 查看。
|
- `WARCH2` 在 WARCH1 基础上新增 OA 正式只读历史查询:`GET /api/wecom/approval-archive` 和详情接口只读 OA DB,不调用企业微信 API、不读取企微 Secret、不新增企微写入。权限以 OA employee 关系为准:本人相关、直属下属、HR/admin/*;`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射或 callback-only 记录只允许 HR/admin/* 查看。
|
||||||
|
- `WROAD2+OPS` 把 WARCH2 后能力先进入测试账号受控上线和 3 天每日巡检,使用 `scripts/qa/run-wroad2-ops-daily.sh` 编排现有 live runner。巡检默认只读,唯一允许写入是补偿归档写 OA DB;不创建企微模板、不提交审批单、不写企业微信、不安装 cron/systemd timer。Day 0 公网报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`:企微 runtime、补偿归档、离线归档读取和隐私扫描通过;finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。
|
||||||
|
|
||||||
### 6.1 WADM1 数据留存与 API 结果边界
|
### 6.1 WADM1 数据留存与 API 结果边界
|
||||||
|
|
||||||
@@ -125,8 +127,8 @@ WADM1/WARCH1 将已验证的审批能力固定为“可读可留存”的实现
|
|||||||
|
|
||||||
## 7. 运行优先结论
|
## 7. 运行优先结论
|
||||||
|
|
||||||
- 近期优先利用:企业微信工作台入口、OAuth/免登、绑定、个人应用消息、OA deeplink、通讯录 userid 清单、可选成员详情、人事助手花名册读取、打卡记录和打卡规则读取。
|
- 近期优先利用:企业微信工作台入口、OAuth/免登、绑定、个人应用消息、OA deeplink、通讯录 userid 清单、可选成员详情、人事助手花名册读取、打卡记录和打卡规则读取,以及 WROAD2 测试账号受控上线巡检。
|
||||||
- 暂缓深度镜像:WREAD1、WADM1、WARCH1 已完成请假/补卡可读性、模型设计和最小历史留存;`wecom_attendance_approval_mirror_v1`、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1`、`wecom_ruleops_v1` 仍需等正式查询/权限边界、外出/加班模板测试和打卡细项明确后再拆;WOUA-FIX、WAPC2FLIVE、WCBK1、WACP3R 和 WARCH1 只作为已完成前置证据,不直接放行深度镜像。
|
- 暂缓深度镜像:WREAD1、WADM1、WARCH1、WARCH2 已完成请假/补卡可读性、模型设计、最小历史留存和正式只读查询;`wecom_attendance_approval_mirror_v1`、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1`、`wecom_ruleops_v1` 仍需等 WROAD2+OPS、WARCH3、WCHECK1、外出/加班模板测试或延期决策完成后再拆;WOUA-FIX、WAPC2FLIVE、WCBK1、WACP3R 和 WARCH1 只作为已完成前置证据,不直接放行深度镜像。
|
||||||
- OA 主办边界不变:报销、采购、费用、合同、项目、付款批次、AP、代账交接、审计和高敏附件继续在 OA 内完成,只向企业微信发送脱敏提醒和 OA 链接。
|
- OA 主办边界不变:报销、采购、费用、合同、项目、付款批次、AP、代账交接、审计和高敏附件继续在 OA 内完成,只向企业微信发送脱敏提醒和 OA 链接。
|
||||||
|
|
||||||
## 8. 后续使用要求
|
## 8. 后续使用要求
|
||||||
|
|||||||
+35
-15
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
**文档状态**:当前开发路线图事实源。
|
**文档状态**:当前开发路线图事实源。
|
||||||
**分类**:开发治理 / 路线图。
|
**分类**:开发治理 / 路线图。
|
||||||
**适用时间**:WDRG / WCP1 / WHMSLIVE / WOUA / WAPI / WRRA / WOUA-FIX / WRV1 / WRA1 / WMSG1 / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE / WCBK1 / WEGOV1 / WACP3 / WACP3R / WREAD1 / WREAD1F / WADM1 / WARCH1 / WARCH2 之后。
|
**适用时间**:WDRG / WCP1 / WHMSLIVE / WOUA / WAPI / WRRA / WOUA-FIX / WRV1 / WRA1 / WMSG1 / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE / WCBK1 / WEGOV1 / WACP3 / WACP3R / WREAD1 / WREAD1F / WADM1 / WARCH1 / WARCH2 / WROAD2 之后。
|
||||||
**关联 Issue**:`WDRG,WCP1,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WARCH2`。
|
**关联 Issue**:`WDRG,WCP1,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WARCH2,WROAD2`。
|
||||||
**最近审计**:2026-05-20。
|
**最近审计**:2026-05-20。
|
||||||
**不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。WHMSLIVE 后只代表企微 HR 主数据镜像已部署并受控验证;WAPI 后进一步固定企微 API/Secret 口径并转为运行优先;WRRA 后明确 `PASS_WITH_FINDINGS` 只代表只读对账成功且存在差异,不代表企微考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成运行时实现。WMSG1 只证明企业微信应用消息可达和 Deeplink 可回到 OA;WAPC1 只固化审批配置准备清单;WAPC2 只新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC,不代表真实回调或镜像能力已完成。WPROC1 后,WAPC2 不直接放行深度镜像,必须先完成自动样件、回调、补偿拉取和镜像数据模型设计门禁。WPROC2 只新增可执行 process gate。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,并自动复跑 WAPC2 得到 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网报告为 `PASS_CALLBACK_EVENT_CONFIRMED`;WEGOV1 后路线明确为“企微成熟功能优先上线,OA 做自建留存、审计、入口、消息和应急兜底”。WACP3R 已将补偿拉取复跑修正为自动按 `SMOKE002` creator 发现 OA-POC 请假/补卡模板,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`。WREAD1F 新样例后,审批人真机确认请假和补卡消息卡片、列表、详情页均可看清;远端人工结果报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。但同意按钮单击即通过仍是操作风险,需在 WARCH1/WARCH2 的留存、审计、提示或操作规程中继续处理。WADM1 只完成自建留存/镜像数据模型设计;WARCH1 只实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和 QA-only 离线读取证明;WARCH2 只提供 OA DB 只读查询 API 和 PC/移动历史页,不调用企微 API、不读取企微 Secret、不代表完整镜像、外出/加班、应急接管、恢复回写或 RuleOps 已完成。
|
**不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。WHMSLIVE 后只代表企微 HR 主数据镜像已部署并受控验证;WAPI 后进一步固定企微 API/Secret 口径并转为运行优先;WRRA 后明确 `PASS_WITH_FINDINGS` 只代表只读对账成功且存在差异,不代表企微考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成运行时实现。WMSG1 只证明企业微信应用消息可达和 Deeplink 可回到 OA;WAPC1 只固化审批配置准备清单;WAPC2 只新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC,不代表真实回调或镜像能力已完成。WPROC1 后,WAPC2 不直接放行深度镜像,必须先完成自动样件、回调、补偿拉取和镜像数据模型设计门禁。WPROC2 只新增可执行 process gate。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,并自动复跑 WAPC2 得到 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网报告为 `PASS_CALLBACK_EVENT_CONFIRMED`;WEGOV1 后路线明确为“企微成熟功能优先上线,OA 做自建留存、审计、入口、消息和应急兜底”。WACP3R 已将补偿拉取复跑修正为自动按 `SMOKE002` creator 发现 OA-POC 请假/补卡模板,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`。WREAD1F 新样例后,审批人真机确认请假和补卡消息卡片、列表、详情页均可看清;远端人工结果报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。但同意按钮单击即通过仍是操作风险,需在 WARCH1/WARCH2 的留存、审计、提示或操作规程中继续处理。WADM1 只完成自建留存/镜像数据模型设计;WARCH1 只实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和 QA-only 离线读取证明;WARCH2 只提供 OA DB 只读查询 API 和 PC/移动历史页,不调用企微 API、不读取企微 Secret、不代表完整镜像、外出/加班、应急接管、恢复回写或 RuleOps 已完成。WROAD2 后当前策略是测试账号受控上线和每日脚本化巡检,允许补偿归档写 OA 自建留存库,但不写企业微信、不安装 cron/systemd timer、不扩大真实员工范围;`WARCH3` 归档稳定化和 `WCHECK1` 打卡摘要留存优先于完整深度镜像,外出/加班先延期。
|
||||||
|
|
||||||
## 1. 路线图原则
|
## 1. 路线图原则
|
||||||
|
|
||||||
@@ -14,9 +14,11 @@
|
|||||||
- 采购、费用、合同、项目、报销、付款批次、AP、代账交接、审计和高敏附件继续 OA 主办;企业微信只做脱敏消息、deeplink、入口和成熟能力参考。
|
- 采购、费用、合同、项目、报销、付款批次、AP、代账交接、审计和高敏附件继续 OA 主办;企业微信只做脱敏消息、deeplink、入口和成熟能力参考。
|
||||||
- WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。
|
- WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。
|
||||||
- OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。
|
- OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。
|
||||||
|
- WROAD2 后“可受控使用”和“完整镜像增强”分离:请假/补卡已归档历史可在 OA 查询,先用测试账号做 3 天每日脚本化巡检;完整镜像、应急接管、恢复回写和 RuleOps 继续后置。
|
||||||
|
- 外出/加班不作为当前受控上线阻断,默认延期到 `WEXT1`;打卡留存 V1 先做日/月摘要、异常摘要和规则快照,不保存完整位置、人脸、设备明文或原始 payload。
|
||||||
- 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
|
- 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
|
||||||
- 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。
|
- 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。
|
||||||
- ERP 未来不接入 OA;真实支付、图片 OCR、银行流水导入、复杂 BPM、审批设计器和重预算继续不进入当前路线。
|
- ERP 未来不接入 OA;真实支付、图片 OCR、银行流水导入、复杂 BPM、审批设计器、重预算和其他 P2 大功能继续冻结,试用期只处理阻断和真实反馈。
|
||||||
- WAPI 后所有企微开发必须先读 [企微 API 能力目录](./企微API能力目录.md),先确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界;运行时代码不得靠多个 Secret 试错。
|
- WAPI 后所有企微开发必须先读 [企微 API 能力目录](./企微API能力目录.md),先确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界;运行时代码不得靠多个 Secret 试错。
|
||||||
|
|
||||||
## 2. 当前阶段
|
## 2. 当前阶段
|
||||||
@@ -49,6 +51,7 @@
|
|||||||
| `WADM1` | 自建留存/镜像模型设计已固化 | docs-only 固定 OA 留存域数据模型:企微审批主表、参与人/节点/动作、字段摘要、附件摘要、回调事件、补偿拉取 run/item、对账 finding、打卡/人事快照边界、隐私保留、权限和 WARCH1 最小实现切片。WADM1 解决 WACP3R “回调证据文件未持久化”的模型设计缺口,但不创建迁移、不写入业务数据、不放行完整镜像。 |
|
| `WADM1` | 自建留存/镜像模型设计已固化 | docs-only 固定 OA 留存域数据模型:企微审批主表、参与人/节点/动作、字段摘要、附件摘要、回调事件、补偿拉取 run/item、对账 finding、打卡/人事快照边界、隐私保留、权限和 WARCH1 最小实现切片。WADM1 解决 WACP3R “回调证据文件未持久化”的模型设计缺口,但不创建迁移、不写入业务数据、不放行完整镜像。 |
|
||||||
| `WARCH1` | 最小审批历史留存已实现并公网验证 | 新增 `WecomApprovalArchive` 等审批留存表、回调事件表、补偿拉取 run/item/finding 表;回调 POST 默认写 OA DB,失败返回非 200 让企微重试;补偿 runner 支持 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关写 OA 留存;新增 `npm run check:wecom-approval-archive` 离线读取 OA DB 历史摘要。公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 与 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 均为 `PASS_WITH_FINDINGS`:请假/补卡 2 条历史可离线读取,finding 是 WARCH1 前旧回调未入 DB 的历史 gap,已作为对账 finding 留存。范围仅请假/补卡,不写企微、不做完整镜像、不做应急接管或恢复回写。 |
|
| `WARCH1` | 最小审批历史留存已实现并公网验证 | 新增 `WecomApprovalArchive` 等审批留存表、回调事件表、补偿拉取 run/item/finding 表;回调 POST 默认写 OA DB,失败返回非 200 让企微重试;补偿 runner 支持 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关写 OA 留存;新增 `npm run check:wecom-approval-archive` 离线读取 OA DB 历史摘要。公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 与 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 均为 `PASS_WITH_FINDINGS`:请假/补卡 2 条历史可离线读取,finding 是 WARCH1 前旧回调未入 DB 的历史 gap,已作为对账 finding 留存。范围仅请假/补卡,不写企微、不做完整镜像、不做应急接管或恢复回写。 |
|
||||||
| `WARCH2` | 已部署并公网只读验证 | 新增只读 `GET /api/wecom/approval-archive` 和 `GET /api/wecom/approval-archive/:id`,以及 PC/移动共用历史页 `/wecom-approval-archive`、`/mobile/wecom-approval-archive`。查询只读 OA DB,不调用企微 API、不读取企微 Secret;权限固定为本人相关、直属下属和 HR/admin/* 全量,`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射、callback-only、外部-only 记录只允许 HR/admin/* 查看。页面文案固定“企业微信主办,OA 自建留存”“仅已归档记录”,不提供审批动作。公网 `SYNC_ENV=0` 部署已完成,`/ready` 正常,新 API 未登录返回 401;远端离线归档报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读 2 条请假/补卡历史,finding 仍是 WARCH1 前旧回调未入库历史 gap。 |
|
| `WARCH2` | 已部署并公网只读验证 | 新增只读 `GET /api/wecom/approval-archive` 和 `GET /api/wecom/approval-archive/:id`,以及 PC/移动共用历史页 `/wecom-approval-archive`、`/mobile/wecom-approval-archive`。查询只读 OA DB,不调用企微 API、不读取企微 Secret;权限固定为本人相关、直属下属和 HR/admin/* 全量,`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射、callback-only、外部-only 记录只允许 HR/admin/* 查看。页面文案固定“企业微信主办,OA 自建留存”“仅已归档记录”,不提供审批动作。公网 `SYNC_ENV=0` 部署已完成,`/ready` 正常,新 API 未登录返回 401;远端离线归档报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读 2 条请假/补卡历史,finding 仍是 WARCH1 前旧回调未入库历史 gap。 |
|
||||||
|
| `WROAD2+OPS` | 受控上线和每日巡检 Day 0 已完成 | 当前进入测试账号受控上线:范围固定 `SMOKE002 -> SMOKE101 + wangshunli`,试用 3 天,每日手动触发一键巡检脚本。巡检复用 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;仅补偿归档步骤可用进程级 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单、不安装 cron/systemd timer。Day 0 报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。 |
|
||||||
|
|
||||||
## 3. 阶段路线
|
## 3. 阶段路线
|
||||||
|
|
||||||
@@ -67,10 +70,14 @@
|
|||||||
| 11 | `WADM1 自建留存/镜像数据模型设计` | 先设计 OA 留存字段、状态机、幂等键、索引、隐私保留、审计和迁移回滚方案。 | WACP3 证明补偿拉取可用;WREAD1 明确模板可读性或回退策略。 | 已完成 docs-only 设计:模型覆盖审批、打卡、人事关键快照、回调事件和补偿拉取记录;只允许在单独 WARCH1 合同批准后进入 schema 或业务代码实现。 |
|
| 11 | `WADM1 自建留存/镜像数据模型设计` | 先设计 OA 留存字段、状态机、幂等键、索引、隐私保留、审计和迁移回滚方案。 | WACP3 证明补偿拉取可用;WREAD1 明确模板可读性或回退策略。 | 已完成 docs-only 设计:模型覆盖审批、打卡、人事关键快照、回调事件和补偿拉取记录;只允许在单独 WARCH1 合同批准后进入 schema 或业务代码实现。 |
|
||||||
| 12 | `WARCH1 最小自建历史留存实现` | 先保存企微审批最小历史,满足企微 API 不可用时可查看已保存请假/补卡摘要。 | WADM1 完成并批准 schema/接口实现。 | 已新增 OA DB 审批留存、回调事件、补偿 run/item/finding、双开关补偿入库和离线读取 runner;公网已持久化现有请假/补卡详情并离线读取 2 条已通过历史。报告和日志只输出脱敏前缀;不保存 Secret、token、EncodingAESKey、原始密文或无治理原始 payload。 |
|
| 12 | `WARCH1 最小自建历史留存实现` | 先保存企微审批最小历史,满足企微 API 不可用时可查看已保存请假/补卡摘要。 | WADM1 完成并批准 schema/接口实现。 | 已新增 OA DB 审批留存、回调事件、补偿 run/item/finding、双开关补偿入库和离线读取 runner;公网已持久化现有请假/补卡详情并离线读取 2 条已通过历史。报告和日志只输出脱敏前缀;不保存 Secret、token、EncodingAESKey、原始密文或无治理原始 payload。 |
|
||||||
| 13 | `WARCH2 正式只读历史查询` | 把 WARCH1 runner 级离线证明升级为正式 OA API 和 PC/移动历史页。 | WARCH1 已持久化请假/补卡历史;权限与脱敏合同批准。 | 已完成:查询 API、PC/移动页面、`SYNC_ENV=0` 公网部署、`/ready`、未登录 401、离线归档 runner 均通过。V1 仍只覆盖请假/补卡,不调用企微 API,不提供审批动作。 |
|
| 13 | `WARCH2 正式只读历史查询` | 把 WARCH1 runner 级离线证明升级为正式 OA API 和 PC/移动历史页。 | WARCH1 已持久化请假/补卡历史;权限与脱敏合同批准。 | 已完成:查询 API、PC/移动页面、`SYNC_ENV=0` 公网部署、`/ready`、未登录 401、离线归档 runner 均通过。V1 仍只覆盖请假/补卡,不调用企微 API,不提供审批动作。 |
|
||||||
| 14 | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WARCH2 公网验证完成;外出/加班模板和打卡细项明确;运行优先门禁和用户一致性仍满足。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
|
| 14 | `WROAD2+OPS 受控上线与每日巡检` | 把 WARCH2 后的能力先放入测试账号受控使用,用每日脚本化巡检验证入口、运行、补偿归档和 OA 离线查询稳定性。 | WARCH2 公网验证完成;用户选择先受控上线、不直接深镜像;允许 `SYNC_ENV=0` 部署和补偿归档写 OA DB。 | Day 0 公网巡检已生成 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`;后续 3 天每日手动触发一次。脚本不写企业微信、不创建样件、不安装定时任务;发现缺配置时真实记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 |
|
||||||
| 15 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 |
|
| 15 | `WARCH3 归档稳定化` | 稳定每日补偿、归档对账 finding、历史查询可用性、旧 callback gap 解释和报告趋势。 | WROAD2+OPS Day 0 和试用反馈可用。 | 每日归档报告可解释;请假/补卡历史查询在企微 API 不可用时仍可读;重复、漏回调和状态不一致有对账记录。 |
|
||||||
| 16 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 |
|
| 16 | `WCHECK1 打卡摘要留存` | 只保存打卡日/月摘要、异常摘要和规则快照。 | WROAD2+OPS 或 WARCH3 证明审批归档稳定;打卡只读 API 和权限仍可用。 | OA 可查看必要打卡摘要和异常摘要;不保存完整位置、人脸、设备明文或原始 payload。 |
|
||||||
| 17 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 |
|
| 17 | `WEXT1 外出/加班延期决策` | 根据真实业务需要决定是否自动生成外出/加班低风险 POC 样件。 | 用户批准或真实业务提出需要。 | 若批准,按 WAPC2F/WREAD1 规则做非自审、低风险、脱敏 POC;若不批准,继续延期,不阻断受控使用。 |
|
||||||
|
| 18 | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WARCH3、WCHECK1 和外出/加班决策完成;运行优先门禁和用户一致性仍满足。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
|
||||||
|
| 19 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 |
|
||||||
|
| 20 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 |
|
||||||
|
| 21 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 |
|
||||||
|
|
||||||
## 4. 每阶段固定门禁
|
## 4. 每阶段固定门禁
|
||||||
|
|
||||||
@@ -147,7 +154,7 @@ POC 默认只读或低风险探测。任何生产写操作、企微规则写入
|
|||||||
- `callback.config=NEEDS_CONFIG`:本轮只读报告未证明真实回调配置存在。
|
- `callback.config=NEEDS_CONFIG`:本轮只读报告未证明真实回调配置存在。
|
||||||
- `hr.staff_update_classification=NEEDS_API_POC`:人事助手资料更新属于写接口,需单独批准后再做低风险 POC。
|
- `hr.staff_update_classification=NEEDS_API_POC`:人事助手资料更新属于写接口,需单独批准后再做低风险 POC。
|
||||||
|
|
||||||
WCPC 已允许进入 `wecom_hr_master_sync_v1`。WHMS 已承接该阶段,完成本地实现、部署和受控公网验证;考勤/审批镜像仍需先完成回调证据、补偿拉取、审批可读性、自建留存模型和最小历史留存。当前 WACP3/WREAD1 在请假/补卡范围已完成,但仍需 WADM1/WARCH1 后再另建 `wecom_attendance_approval_mirror_v1` 合同,不得把 WCPC、WHMS、WAPC2FLIVE、WCBK1 或 WREAD1 误读为考勤/审批运行时迁移已完成。
|
WCPC 已允许进入 `wecom_hr_master_sync_v1`。WHMS 已承接该阶段,完成本地实现、部署和受控公网验证;考勤/审批镜像仍需先完成回调证据、补偿拉取、审批可读性、自建留存模型、最小历史留存和正式只读查询。当前请假/补卡已完成 WACP3/WREAD1/WADM1/WARCH1/WARCH2,但下一步先做 WROAD2+OPS 受控上线和每日巡检;不得把 WCPC、WHMS、WAPC2FLIVE、WCBK1、WREAD1、WARCH1 或 WARCH2 误读为完整考勤/审批镜像已完成。
|
||||||
|
|
||||||
## 9. WHMS HR 主数据镜像状态
|
## 9. WHMS HR 主数据镜像状态
|
||||||
|
|
||||||
@@ -174,7 +181,7 @@ WCPC 已允许进入 `wecom_hr_master_sync_v1`。WHMS 已承接该阶段,完
|
|||||||
- 公网验证窗口中临时将 `wecom_hr_master_sync_v1` 设为 `force_on`,对既有低风险测试号 `SMOKE002/测试员工`(脱敏 `oa_smoke***`)执行 dry-run 和显式 userids apply;企微读取链路通过,因企微侧缺手机号、邮箱和部门,按规则记录 `missing_required_field` 并跳过,未写入 OA 主数据。
|
- 公网验证窗口中临时将 `wecom_hr_master_sync_v1` 设为 `force_on`,对既有低风险测试号 `SMOKE002/测试员工`(脱敏 `oa_smoke***`)执行 dry-run 和显式 userids apply;企微读取链路通过,因企微侧缺手机号、邮箱和部门,按规则记录 `missing_required_field` 并跳过,未写入 OA 主数据。
|
||||||
- 已验证普通员工访问同步 API 返回 403;验证结束后 `wecom_hr_master_sync_v1` 已恢复为 `force_off`。
|
- 已验证普通员工访问同步 API 返回 403;验证结束后 `wecom_hr_master_sync_v1` 已恢复为 `force_off`。
|
||||||
- 未执行生产真实员工批量 `apply`;后续若要正式批量同步真实员工,必须另行批准并先处理企微必填字段质量。
|
- 未执行生产真实员工批量 `apply`;后续若要正式批量同步真实员工,必须另行批准并先处理企微必填字段质量。
|
||||||
- 当前 WOUA 用户一致性差异已由 WOUA-FIX 收口,WAPC2FLIVE 自动样件、WAPC2 自动复跑、WCBK1 真实回调事件确认、WACP3R 补偿拉取和 WREAD1 请假/补卡可读性门禁已完成;`wecom_attendance_approval_mirror_v1` 仍暂缓到 WADM1 自建留存/镜像模型、WARCH1 最小历史留存、外出/加班处理决策和打卡细项明确后再另建合同。
|
- 当前 WOUA 用户一致性差异已由 WOUA-FIX 收口,WAPC2FLIVE 自动样件、WAPC2 自动复跑、WCBK1 真实回调事件确认、WACP3R 补偿拉取、WREAD1 请假/补卡可读性门禁、WADM1 模型、WARCH1 最小历史留存和 WARCH2 正式只读查询已完成;`wecom_attendance_approval_mirror_v1` 仍暂缓到 WROAD2+OPS 受控上线、WARCH3 归档稳定化、WCHECK1 打卡摘要留存、外出/加班处理决策和打卡细项明确后再另建合同。
|
||||||
|
|
||||||
## 10. WRRA 路线修正与下一阶段
|
## 10. WRRA 路线修正与下一阶段
|
||||||
|
|
||||||
@@ -235,12 +242,15 @@ WAPC2 通过后,下一步不是直接进入 `wecom_attendance_approval_mirror_
|
|||||||
2. `WAPC2 自动复跑`:已由 WAPC2FLIVE 自动传入生成的模板 ID 和 `sp_no`,只读复跑结论为 `PASS_APPROVAL_POC`。
|
2. `WAPC2 自动复跑`:已由 WAPC2FLIVE 自动传入生成的模板 ID 和 `sp_no`,只读复跑结论为 `PASS_APPROVAL_POC`。
|
||||||
3. `WCBK1 回调只读 POC`:已证明 URL 验证、验签、解密、幂等摘要和真实审批状态事件脱敏留证,结论 `PASS_CALLBACK_EVENT_CONFIRMED`。
|
3. `WCBK1 回调只读 POC`:已证明 URL 验证、验签、解密、幂等摘要和真实审批状态事件脱敏留证,结论 `PASS_CALLBACK_EVENT_CONFIRMED`。
|
||||||
4. `WEGOV1 企微主办治理与自建留存路线修正`:已明确企微主办域、OA 主办域、OA 留存域、OA 应急域和受控测试域。
|
4. `WEGOV1 企微主办治理与自建留存路线修正`:已明确企微主办域、OA 主办域、OA 留存域、OA 应急域和受控测试域。
|
||||||
5. `WACP3 补偿拉取 POC`:证明按时间窗口拿到审批单号并可拉取审批详情。
|
5. `WACP3 补偿拉取 POC`:已证明按时间窗口拿到审批单号并可拉取审批详情。
|
||||||
6. `WREAD1 审批可读性与误审批防护门禁`:真机确认审批消息、列表和详情页是否看得清,快捷同意/驳回是否存在误操作风险。
|
6. `WREAD1 审批可读性与误审批防护门禁`:已完成请假/补卡真机确认。
|
||||||
7. `WADM1 自建留存/镜像数据模型设计`:先设计字段、状态机、幂等键、索引和隐私保留边界。
|
7. `WADM1 自建留存/镜像数据模型设计`:已设计字段、状态机、幂等键、索引和隐私保留边界。
|
||||||
8. `WARCH1 最小自建历史留存实现`:先只读保存企微审批、打卡和人事关键快照,保证企微不可用时可查看历史。
|
8. `WARCH1 最小自建历史留存实现`:已保存请假/补卡企微审批历史、回调事件和补偿拉取记录。
|
||||||
|
9. `WARCH2 正式只读历史查询`:已提供 OA DB 只读 API 和 PC/移动历史页。
|
||||||
|
10. `WROAD2+OPS 受控上线与每日巡检`:下一步先做测试账号 3 天脚本化巡检,沉淀 Day 0/Day 1/Day 2/Day 3 脱敏报告。
|
||||||
|
11. `WARCH3 / WCHECK1 / WEXT1`:再做归档稳定化、打卡摘要留存和外出/加班延期决策。
|
||||||
|
|
||||||
上述门禁完成前,不拆 `wecom_attendance_approval_mirror_v1`。
|
WROAD2+OPS、WARCH3、WCHECK1 和外出/加班决策完成前,不拆 `wecom_attendance_approval_mirror_v1`。
|
||||||
|
|
||||||
## 13. WADM1 自建留存/镜像数据模型设计
|
## 13. WADM1 自建留存/镜像数据模型设计
|
||||||
|
|
||||||
@@ -314,3 +324,13 @@ WARCH2 把 WARCH1 的离线 runner 证明升级为 OA 内可查历史,但仍
|
|||||||
- 未映射边界:callback-only、申请人未映射、参与人未映射或仅外部 userid 的记录默认只允许 HR/admin/* 查看;普通员工和主管不得靠参与人/动作关系看到申请人未映射记录。
|
- 未映射边界:callback-only、申请人未映射、参与人未映射或仅外部 userid 的记录默认只允许 HR/admin/* 查看;普通员工和主管不得靠参与人/动作关系看到申请人未映射记录。
|
||||||
- 脱敏:API 和页面只返回脱敏 `sp_no` / template 前缀、字段名/字段类型/敏感级别、动作类型/时间/来源和 finding 摘要;不返回完整外部键、手机号、邮箱、原因全文、附件、评论、原始 XML、密文、token 或 Secret。
|
- 脱敏:API 和页面只返回脱敏 `sp_no` / template 前缀、字段名/字段类型/敏感级别、动作类型/时间/来源和 finding 摘要;不返回完整外部键、手机号、邮箱、原因全文、附件、评论、原始 XML、密文、token 或 Secret。
|
||||||
- 页面:PC `/wecom-approval-archive` 与移动 `/mobile/wecom-approval-archive` 固定文案“企业微信主办,OA 自建留存”“仅已归档记录”,入口在备用模块或考勤历史语境,不进入 `/workflow/tasks` 待办语境,不展示审批按钮或 pending 待办暗示。
|
- 页面:PC `/wecom-approval-archive` 与移动 `/mobile/wecom-approval-archive` 固定文案“企业微信主办,OA 自建留存”“仅已归档记录”,入口在备用模块或考勤历史语境,不进入 `/workflow/tasks` 待办语境,不展示审批按钮或 pending 待办暗示。
|
||||||
|
|
||||||
|
### 6.3 WROAD2+OPS 受控上线边界
|
||||||
|
|
||||||
|
WROAD2+OPS 把 WARCH2 后的可用能力先进入测试账号受控使用,不等同于完整镜像增强:
|
||||||
|
|
||||||
|
- 范围:`SMOKE002 -> SMOKE101 + wangshunli`,3 天试用,每日一次手动触发 `scripts/qa/run-wroad2-ops-daily.sh`。
|
||||||
|
- 巡检:复用公网 `/ready`、live smoke、feature flag、企微 runtime、审批补偿拉取和 OA 归档离线读取 runner,输出 `artifacts/qa-flow/wroad2-ops-<timestamp>/summary.json`。
|
||||||
|
- 写入边界:巡检默认只读;仅审批补偿归档步骤可用进程级 `WECOM_ARCHIVE_WRITE=1` 与 `--persist-to-db` 写 OA 自建留存库。不写企业微信、不创建模板、不提交审批单、不安装持久定时任务。
|
||||||
|
- 结果边界:结论只允许 `PASS_CONTROLLED_OPS_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或真实 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。
|
||||||
|
- 后续顺序:WROAD2+OPS 后优先 `WARCH3` 归档稳定化,再做 `WCHECK1` 打卡摘要留存;外出/加班进入 `WEXT1` 延期决策。上述阶段完成前,不启动完整深度镜像、应急接管、恢复回写或 RuleOps。
|
||||||
|
|||||||
+3
-3
@@ -22,7 +22,7 @@ WDRG 后,企微优先 HR/考勤改造增加一层路线图门禁;WAPI/WRRA
|
|||||||
|
|
||||||
`需求事实源 -> 设计门禁 -> 路线图门禁 -> 企微能力 POC -> 单功能 Issue CSV -> 方案批准 -> 开发实现 -> review -> QA 回归 -> 部署 / 公网验证`
|
`需求事实源 -> 设计门禁 -> 路线图门禁 -> 企微能力 POC -> 单功能 Issue CSV -> 方案批准 -> 开发实现 -> review -> QA 回归 -> 部署 / 公网验证`
|
||||||
|
|
||||||
路线图只控制顺序、边界、准入和退出条件;具体接口、schema、页面、权限、审计和测试仍必须在单功能 Issue CSV 中声明。阶段未退出前不得跳阶段:WOUA-FIX 已完成测试账号差异收口,但 `PASS_WITH_FINDINGS` 的剩余缺字段/归档绑定不直接放行深度镜像;WRA1 已完成 `WECOM-RUNTIME-READY-V1` 的运行入口、OAuth/绑定、脱敏消息、通讯录、人事助手和打卡只读门禁修正;WMSG1 已完成真实应用消息和 Deeplink 确认。当前 `PASS_WITH_CONFIG_GAPS` 只表示运行优先主链路可用,WAPC1 只表示审批配置准备清单已固化;WAPC2 只证明请假/补卡模板详情和审批详情只读 runner 已具备。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试样件并自动复跑 WAPC2 通过;WCBK1 已完成回调只读代码、synthetic 验签/解密/解析、真实 URL 验证和一条现有 OA-POC 测试审批单事件确认;WACP3R 已完成补偿拉取公网只读复跑,当时发现的回调证据未持久化已由 WARCH1 DB 回调事件承接;WREAD1 已完成请假/补卡真机可读性确认,结论 `PASS_READABLE`,同意单击风险进入后续设计。WEGOV1 后,WADM1/WARCH1 已完成模型设计和最小历史留存;完整审批镜像仍必须另建合同。
|
路线图只控制顺序、边界、准入和退出条件;具体接口、schema、页面、权限、审计和测试仍必须在单功能 Issue CSV 中声明。阶段未退出前不得跳阶段:WOUA-FIX 已完成测试账号差异收口,但 `PASS_WITH_FINDINGS` 的剩余缺字段/归档绑定不直接放行深度镜像;WRA1 已完成 `WECOM-RUNTIME-READY-V1` 的运行入口、OAuth/绑定、脱敏消息、通讯录、人事助手和打卡只读门禁修正;WMSG1 已完成真实应用消息和 Deeplink 确认。当前 `PASS_WITH_CONFIG_GAPS` 只表示运行优先主链路可用,WAPC1 只表示审批配置准备清单已固化;WAPC2 只证明请假/补卡模板详情和审批详情只读 runner 已具备。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试样件并自动复跑 WAPC2 通过;WCBK1 已完成回调只读代码、synthetic 验签/解密/解析、真实 URL 验证和一条现有 OA-POC 测试审批单事件确认;WACP3R 已完成补偿拉取公网只读复跑,当时发现的回调证据未持久化已由 WARCH1 DB 回调事件承接;WREAD1 已完成请假/补卡真机可读性确认,结论 `PASS_READABLE`,同意单击风险进入后续设计。WEGOV1 后,WADM1/WARCH1/WARCH2 已完成模型设计、最小历史留存和正式只读查询;WROAD2+OPS 只做测试账号受控上线和每日巡检,完整审批镜像仍必须另建合同。
|
||||||
|
|
||||||
## 2. Issue 生命周期
|
## 2. Issue 生命周期
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ WDRG 后,企微优先 HR/考勤路线采用“路线图门禁 + 单功能 Issu
|
|||||||
|
|
||||||
当前企微优先路线顺序固定为:
|
当前企微优先路线顺序固定为:
|
||||||
|
|
||||||
`WECOM-CAPABILITY-POC-V1 -> wecom_hr_master_sync_v1 -> runtime_first_wecom_enablement -> WOUA-FIX / WECOM-RUNTIME-READY-V1 -> WAPC1 审批配置准备 -> WAPC2 请假/补卡只读 POC -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC(真实事件已确认) -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> wecom_attendance_approval_mirror_v1 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1`
|
`WECOM-CAPABILITY-POC-V1 -> wecom_hr_master_sync_v1 -> runtime_first_wecom_enablement -> WOUA-FIX / WECOM-RUNTIME-READY-V1 -> WAPC1 审批配置准备 -> WAPC2 请假/补卡只读 POC -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC(真实事件已确认) -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班延期决策 -> wecom_attendance_approval_mirror_v1 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1`
|
||||||
|
|
||||||
允许并行处理线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护;但采购、合同、报销、付款、AP、代账和高敏附件等 OA 主办域必须另开合同,不得混入企微 HR/考勤路线。
|
允许并行处理线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护;但采购、合同、报销、付款、AP、代账和高敏附件等 OA 主办域必须另开合同,不得混入企微 HR/考勤路线。
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ WPROC2 后,三层门禁先由可执行 process gate 承接:
|
|||||||
|
|
||||||
- 真实回调先证明 URL 验证、验签、解密、幂等和重复投递。
|
- 真实回调先证明 URL 验证、验签、解密、幂等和重复投递。
|
||||||
- 补偿拉取先证明按时间窗口拿到审批单号并可拉取审批详情。
|
- 补偿拉取先证明按时间窗口拿到审批单号并可拉取审批详情。
|
||||||
- 镜像表先设计字段、状态机、幂等键、索引和隐私保留边界;WADM1 已固定审批留存、回调事件、补偿拉取、对账 finding、打卡/人事快照边界,WARCH1 已实现请假/补卡最小留存切片。
|
- 镜像表先设计字段、状态机、幂等键、索引和隐私保留边界;WADM1 已固定审批留存、回调事件、补偿拉取、对账 finding、打卡/人事快照边界,WARCH1 已实现请假/补卡最小留存切片,WARCH2 已提供正式只读查询。WROAD2+OPS 后仍需 WARCH3、WCHECK1 和 WEXT1 决策后再进入完整镜像。
|
||||||
- 应急接管和恢复回写必须等镜像稳定后再做。
|
- 应急接管和恢复回写必须等镜像稳定后再做。
|
||||||
|
|
||||||
## 3. 开发边界
|
## 3. 开发边界
|
||||||
|
|||||||
+13
-12
文件差异因一行或多行过长而隐藏
+7
-5
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
## 最近事实源链
|
## 最近事实源链
|
||||||
|
|
||||||
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE -> WCBK1 -> WEGOV1 -> WACP3/WACP3R -> WREAD1 自动汇总 -> WREAD1F 新样例 -> WREAD1 真机确认 -> WADM1 自建留存模型设计 -> WARCH1 最小审批历史留存 -> WARCH2 正式只读历史查询。
|
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE -> WCBK1 -> WEGOV1 -> WACP3/WACP3R -> WREAD1 自动汇总 -> WREAD1F 新样例 -> WREAD1 真机确认 -> WADM1 自建留存模型设计 -> WARCH1 最小审批历史留存 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检。
|
||||||
|
|
||||||
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
|
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
|
||||||
- ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。
|
- ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。
|
||||||
@@ -80,6 +80,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
|
|||||||
- WACP3 是 WEGOV1 后的企微审批补偿拉取 POC 合同:新增 `check:wecom-approval-compensation-poc` 和 `getapprovalinfo` 只读封装;初始公网报告缺模板 ID,WACP3R 已改为按 `SMOKE002` creator 自动发现 OA-POC 请假/补卡模板并复跑,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`,补偿拉取和详情读取可用,finding 为回调证据文件未持久化。
|
- WACP3 是 WEGOV1 后的企微审批补偿拉取 POC 合同:新增 `check:wecom-approval-compensation-poc` 和 `getapprovalinfo` 只读封装;初始公网报告缺模板 ID,WACP3R 已改为按 `SMOKE002` creator 自动发现 OA-POC 请假/补卡模板并复跑,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`,补偿拉取和详情读取可用,finding 为回调证据文件未持久化。
|
||||||
- WARCH1 是 WADM1 后的最小自建历史留存合同:新增审批留存 Prisma 表、回调事件入库、补偿拉取双开关入库和离线读取 runner;只覆盖请假/补卡历史留存,不写企微、不创建模板或审批单、不进入完整镜像、应急接管、恢复回写或 RuleOps。
|
- WARCH1 是 WADM1 后的最小自建历史留存合同:新增审批留存 Prisma 表、回调事件入库、补偿拉取双开关入库和离线读取 runner;只覆盖请假/补卡历史留存,不写企微、不创建模板或审批单、不进入完整镜像、应急接管、恢复回写或 RuleOps。
|
||||||
- WARCH2 是 WARCH1 后的正式只读历史查询合同:新增只读 OA DB 查询 API 和 PC/移动历史页,只覆盖请假/补卡已归档历史;页面不提供审批动作,不进入待办语境;已完成 `SYNC_ENV=0` 公网部署、`/ready`、未登录 401 和远端离线归档复跑。
|
- WARCH2 是 WARCH1 后的正式只读历史查询合同:新增只读 OA DB 查询 API 和 PC/移动历史页,只覆盖请假/补卡已归档历史;页面不提供审批动作,不进入待办语境;已完成 `SYNC_ENV=0` 公网部署、`/ready`、未登录 401 和远端离线归档复跑。
|
||||||
|
- WROAD2+OPS 是 WARCH2 后的受控上线与每日巡检合同:范围固定测试账号 `SMOKE002 -> SMOKE101 + wangshunli`,3 天每日手动触发脚本;巡检可用 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单、不安装 cron/systemd timer。Day 0 公网报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,主链路通过并保留可解释 finding。后续优先 `WARCH3` 归档稳定化和 `WCHECK1` 打卡摘要留存,外出/加班先延期。
|
||||||
|
|
||||||
## 当前活跃治理流
|
## 当前活跃治理流
|
||||||
|
|
||||||
@@ -150,6 +151,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
|
|||||||
| `WADM1` | `issues/2026-05-19_21-55-33-wecom-archive-mirror-data-model-design-v1.csv` | 当前模型设计:企微自建留存/镜像数据模型已固化 | 固定审批留存、回调事件、补偿拉取、对账 finding、打卡/人事快照边界、隐私权限和 WARCH1 最小实现切片;已由 WARCH1 承接实现请假/补卡最小历史留存 | docs-only;不改 Prisma schema、不部署、不写 OA/企微业务数据;完整镜像仍需单独 Issue CSV 和方案批准 |
|
| `WADM1` | `issues/2026-05-19_21-55-33-wecom-archive-mirror-data-model-design-v1.csv` | 当前模型设计:企微自建留存/镜像数据模型已固化 | 固定审批留存、回调事件、补偿拉取、对账 finding、打卡/人事快照边界、隐私权限和 WARCH1 最小实现切片;已由 WARCH1 承接实现请假/补卡最小历史留存 | docs-only;不改 Prisma schema、不部署、不写 OA/企微业务数据;完整镜像仍需单独 Issue CSV 和方案批准 |
|
||||||
| `WARCH1` | `issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv` | 当前最小历史留存实现:请假/补卡审批历史可入 OA DB 并离线读取 | 新增 `WecomApprovalArchive` 等 Prisma 表、回调事件持久化、补偿 run/item/finding、`check:wecom-approval-archive` 离线 runner;补偿入库需 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1`;公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 持久化 2 条详情,`/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 离线读取 2 条历史,finding 为旧回调未入库历史 gap | 不写企微数据;不创建模板或审批单;不新增正式管理页;不做外出/加班、完整镜像、应急接管、恢复回写或 RuleOps |
|
| `WARCH1` | `issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv` | 当前最小历史留存实现:请假/补卡审批历史可入 OA DB 并离线读取 | 新增 `WecomApprovalArchive` 等 Prisma 表、回调事件持久化、补偿 run/item/finding、`check:wecom-approval-archive` 离线 runner;补偿入库需 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1`;公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 持久化 2 条详情,`/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 离线读取 2 条历史,finding 为旧回调未入库历史 gap | 不写企微数据;不创建模板或审批单;不新增正式管理页;不做外出/加班、完整镜像、应急接管、恢复回写或 RuleOps |
|
||||||
| `WARCH2` | `issues/2026-05-20_00-26-04-wecom-approval-archive-query-v1.csv` | 当前正式只读历史查询:企微请假/补卡已归档历史可通过 OA API 和 PC/移动页面查看 | 新增 `/api/wecom/approval-archive` 列表/详情、`/wecom-approval-archive`、`/mobile/wecom-approval-archive`;只读 OA DB,不调用企微 API;分层权限为本人相关、直属下属、HR/admin/*,申请人未映射和 callback-only 记录仅 HR/admin/* 可见;页面固定“企业微信主办,OA 自建留存”“仅已归档记录”;公网报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 可读 2 条历史 | 不写 OA/企微数据;不读取企微 Secret;不提供审批动作;不做完整镜像、外出/加班、应急接管、恢复回写或 RuleOps |
|
| `WARCH2` | `issues/2026-05-20_00-26-04-wecom-approval-archive-query-v1.csv` | 当前正式只读历史查询:企微请假/补卡已归档历史可通过 OA API 和 PC/移动页面查看 | 新增 `/api/wecom/approval-archive` 列表/详情、`/wecom-approval-archive`、`/mobile/wecom-approval-archive`;只读 OA DB,不调用企微 API;分层权限为本人相关、直属下属、HR/admin/*,申请人未映射和 callback-only 记录仅 HR/admin/* 可见;页面固定“企业微信主办,OA 自建留存”“仅已归档记录”;公网报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 可读 2 条历史 | 不写 OA/企微数据;不读取企微 Secret;不提供审批动作;不做完整镜像、外出/加班、应急接管、恢复回写或 RuleOps |
|
||||||
|
| `WROAD2+OPS` | `issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv` | 当前受控上线与每日巡检:先用测试账号运行 3 天脚本化巡检,不直接深镜像 | 新增 `scripts/qa/run-wroad2-ops-daily.sh`,复用公网 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;仅补偿归档步骤可写 OA 留存库;Day 0 报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS` | 不写企业微信;不创建模板或审批单;不安装定时任务;外出/加班、完整镜像、应急、回写、RuleOps 和 P2 大功能继续冻结 |
|
||||||
|
|
||||||
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
|
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
|
||||||
|
|
||||||
@@ -169,17 +171,17 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
|
|||||||
|
|
||||||
| 文档 | 用途 |
|
| 文档 | 用途 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WAPC2FLIVE 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例和深度镜像前置口径 |
|
| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WROAD2 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例、自建留存、受控上线巡检和深度镜像前置口径 |
|
||||||
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 |
|
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 |
|
||||||
| [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 |
|
| [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 |
|
||||||
| [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WREAD1/WREAD1F/WARCH1/WARCH2 后企微优先 HR/考勤改造的阶段顺序、准入/退出门禁、并行规则、禁止跳阶段、API/Secret 口径、运行优先、消息实发、审批配置、只读 POC、process gate、自动样件 live 证据、真实回调事件证据、自建留存、补偿拉取、可读性真机确认、模型设计、最小历史留存和正式只读查询事实源 |
|
| [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WREAD1/WREAD1F/WARCH1/WARCH2/WROAD2 后企微优先 HR/考勤改造的阶段顺序、准入/退出门禁、并行规则、禁止跳阶段、API/Secret 口径、运行优先、消息实发、审批配置、只读 POC、process gate、自动样件 live 证据、真实回调事件证据、自建留存、补偿拉取、可读性真机确认、模型设计、最小历史留存、正式只读查询、受控上线巡检和后续 WARCH3/WCHECK1/WEXT1 排队事实源 |
|
||||||
| [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WARCH1/WARCH2 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、WAPC2F dry-run、WAPC2FLIVE live 创建、WCBK1 回调真实事件 POC、无完整 sandbox 假设、补偿拉取自动发现、WREAD1/WADM1/WARCH1 决策、最小留存和只读查询边界事实源 |
|
| [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WARCH1/WARCH2/WROAD2 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、WAPC2F dry-run、WAPC2FLIVE live 创建、WCBK1 回调真实事件 POC、无完整 sandbox 假设、补偿拉取自动发现、WREAD1/WADM1/WARCH1 决策、最小留存、只读查询和 WROAD2 巡检写 OA 留存边界事实源 |
|
||||||
| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 |
|
| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 |
|
||||||
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 |
|
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 |
|
||||||
| [报销发票附件规则](./报销发票附件规则.md) | 报销、发票、OCR、附件细则 |
|
| [报销发票附件规则](./报销发票附件规则.md) | 报销、发票、OCR、附件细则 |
|
||||||
| [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) | 报销发票 OCR 模块规约 |
|
| [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) | 报销发票 OCR 模块规约 |
|
||||||
| [需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md) | 企业微信入口、身份、消息、deeplink、HR/考勤员工日常审批、打卡、人事助手、按域镜像、OA 接管和恢复回写 |
|
| [需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md) | 企业微信入口、身份、消息、deeplink、HR/考勤员工日常审批、打卡、人事助手、按域镜像、OA 接管和恢复回写 |
|
||||||
| [需求 - 请假考勤修正规约](./需求-请假考勤修正规约.md) | 企微请假/补卡/外出/加班、WAPC1 审批配置准备、WAPC2 请假/补卡只读 POC、WAPC2FLIVE 请假/补卡样例、WPROC1/WPROC2 后续门禁、考勤镜像、OA 应急接管和恢复回写 |
|
| [需求 - 请假考勤修正规约](./需求-请假考勤修正规约.md) | 企微请假/补卡/外出/加班、WAPC1 审批配置准备、WAPC2 请假/补卡只读 POC、WAPC2FLIVE 请假/补卡样例、WPROC1/WPROC2 后续门禁、WROAD2 受控巡检、WARCH3/WCHECK1/WEXT1 后续队列、考勤镜像、OA 应急接管和恢复回写 |
|
||||||
| [需求 - 采购费用审批规约](./需求-采购费用审批规约.md) | 采购、费用、附件、审批规则 |
|
| [需求 - 采购费用审批规约](./需求-采购费用审批规约.md) | 采购、费用、附件、审批规则 |
|
||||||
| [需求 - 合同附件归档规约](./需求-合同附件归档规约.md) | 合同台账和附件归档边界 |
|
| [需求 - 合同附件归档规约](./需求-合同附件归档规约.md) | 合同台账和附件归档边界 |
|
||||||
| [需求 - 项目轻管理规约](./需求-项目轻管理规约.md) | 项目轻管理边界 |
|
| [需求 - 项目轻管理规约](./需求-项目轻管理规约.md) | 项目轻管理边界 |
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**文档状态**:当前测试事实源。
|
**文档状态**:当前测试事实源。
|
||||||
**适用范围**:hyb-oa MVP 首轮开发 A3-A8,以及后续所有非微小改动。
|
**适用范围**:hyb-oa MVP 首轮开发 A3-A8,以及后续所有非微小改动。
|
||||||
**路线口径**:WFOC/DBWFOC/WFDG/WDRG/WEGOV1 后,HR/考勤员工日常审批优先复用企业微信成熟能力,OA 做自建留存、按域镜像、人工接管、恢复回写、财务闭环和审计中台;报销、采购、合同、项目、PDF OCR、付款批次、AP 台账、代账交接和高敏附件继续由 OA 主办;企业微信只做脱敏消息和 OA deeplink;飞书不进入当前路线。后续企微/OA 运行时迁移前必须先读 [企微优先开发路线图](./企微优先开发路线图.md),再做对应 POC。WEGOV1 后,WAPC2/WCBK1 不能直接进入 `wecom_attendance_approval_mirror_v1`;WACP3、WREAD1、WADM1 和 WARCH1 已完成请假/补卡补偿、可读性、模型设计和最小历史留存,完整镜像仍需单独合同。WPROC2 后先跑 `check-process-contract` process gate;缺配置或权限时记录 `NEEDS_CONFIG` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`,不得伪造成通过。
|
**路线口径**:WFOC/DBWFOC/WFDG/WDRG/WEGOV1/WROAD2 后,HR/考勤员工日常审批优先复用企业微信成熟能力,OA 做自建留存、按域镜像、人工接管、恢复回写、财务闭环和审计中台;报销、采购、合同、项目、PDF OCR、付款批次、AP 台账、代账交接和高敏附件继续由 OA 主办;企业微信只做脱敏消息和 OA deeplink;飞书不进入当前路线。后续企微/OA 运行时迁移前必须先读 [企微优先开发路线图](./企微优先开发路线图.md),再做对应 POC。WEGOV1 后,WAPC2/WCBK1 不能直接进入 `wecom_attendance_approval_mirror_v1`;WACP3、WREAD1、WADM1、WARCH1 和 WARCH2 已完成请假/补卡补偿、可读性、模型设计、最小历史留存和正式只读查询。WROAD2+OPS 先做测试账号 3 天每日巡检,完整镜像仍需 WARCH3、WCHECK1、WEXT1 和单独合同。WPROC2 后先跑 `check-process-contract` process gate;缺配置或权限时记录 `NEEDS_CONFIG` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`,不得伪造成通过。
|
||||||
|
|
||||||
本文回答“什么时候测试、测什么、怎么判定通过、怎么记录跳过”。具体业务验收仍以主 PRD、模块规约和最新 Issue CSV 为准。
|
本文回答“什么时候测试、测什么、怎么判定通过、怎么记录跳过”。具体业务验收仍以主 PRD、模块规约和最新 Issue CSV 为准。
|
||||||
|
|
||||||
|
|||||||
+10
-8
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
### 1.1 背景
|
### 1.1 背景
|
||||||
|
|
||||||
海音达需要一套适合 10 人以下科技公司的轻量 OA,用来把报销、采购、费用、合同、项目资料、财务闭环、审计和关键行政数据集中到一个可审计、可回归、可持续迭代的系统中。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 进一步修正边界:能复用企业微信成熟功能的 HR/考勤员工日常场景优先使用企业微信,OA 做按域镜像、人工接管、恢复回写、财务闭环和审计中台;采购、合同、项目、财务和高敏附件仍由 OA 主办和存储。WFDG 固定后续开发前必须先过设计规约门禁和企微 API 能力 POC;WDRG 进一步固定后续采用“路线图门禁 + 单功能 Issue CSV”的开发节奏,不再直接进入大规模运行时改造。WCP1 已完成企业微信能力只读 POC 并暴露初始配置缺口;WCPC 已用既有在职测试号复跑通过,结论 `GO_TO_HR_MASTER_SYNC`;WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;WAPI/WRRA 后路线调整为先运行优先和 WOUA 差异收口,再判断是否进入考勤/审批深度镜像。
|
海音达需要一套适合 10 人以下科技公司的轻量 OA,用来把报销、采购、费用、合同、项目资料、财务闭环、审计和关键行政数据集中到一个可审计、可回归、可持续迭代的系统中。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 进一步修正边界:能复用企业微信成熟功能的 HR/考勤员工日常场景优先使用企业微信,OA 做按域镜像、人工接管、恢复回写、财务闭环和审计中台;采购、合同、项目、财务和高敏附件仍由 OA 主办和存储。WFDG 固定后续开发前必须先过设计规约门禁和企微 API 能力 POC;WDRG 进一步固定后续采用“路线图门禁 + 单功能 Issue CSV”的开发节奏,不再直接进入大规模运行时改造。WCP1 已完成企业微信能力只读 POC 并暴露初始配置缺口;WCPC 已用既有在职测试号复跑通过,结论 `GO_TO_HR_MASTER_SYNC`;WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;WAPI/WRRA 后路线调整为先运行优先和 WOUA 差异收口。WARCH2 后请假/补卡已归档历史可在 OA 只读查看,下一阶段先走 WROAD2+OPS 测试账号受控上线和每日巡检,再做归档稳定化与打卡摘要留存,不直接进入完整考勤/审批深度镜像。
|
||||||
|
|
||||||
### 1.2 总目标
|
### 1.2 总目标
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
| 恢复回写层 | OA + 企业微信 API | 企微恢复后由 `wecom_recovery_writeback_v1` 对应急数据执行 dry-run、自动回写、失败重试和冲突清单。 |
|
| 恢复回写层 | OA + 企业微信 API | 企微恢复后由 `wecom_recovery_writeback_v1` 对应急数据执行 dry-run、自动回写、失败重试和冲突清单。 |
|
||||||
| 财务主办层 | OA | 报销、PDF 发票 OCR、发票查重、付款批次、银行回单、AP 台账、代账交接继续 OA 主办,不迁移到企微。 |
|
| 财务主办层 | OA | 报销、PDF 发票 OCR、发票查重、付款批次、银行回单、AP 台账、代账交接继续 OA 主办,不迁移到企微。 |
|
||||||
|
|
||||||
无痛切换是长期目标,不代表本轮已实现完整替代。完整镜像按域定义:企微主办域镜像到 OA;OA 主办域不反向全量镜像到企微,只发送脱敏标题、业务类型、业务编号、状态和 OA 链接。WEGOV1 后,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须保存企微关键历史、完整外部关联键和必要快照,保证企微不可用时可查看既有数据。后续必须按 `wecom_hr_master_sync_v1`、`runtime_first_wecom_enablement`、`WOUA-FIX / WECOM-RUNTIME-READY-V1`、`WAPC1 审批配置准备`、`WAPC2 请假/补卡只读 POC`、`WAPC2F 自动生成 POC 样件`、`WAPC2FLIVE live 创建与 WAPC2 自动复跑`、`WCBK1 回调只读 POC(真实事件已确认)`、`WEGOV1 企微主办治理与自建留存路线修正`、`WACP3/WACP3R 补偿拉取 POC`、`WREAD1 审批可读性与误审批防护门禁`、`WADM1 自建留存/镜像数据模型设计`、`WARCH1 最小自建历史留存实现`、`wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1` 和 `wecom_ruleops_v1` 分阶段拆 Issue CSV。
|
无痛切换是长期目标,不代表本轮已实现完整替代。完整镜像按域定义:企微主办域镜像到 OA;OA 主办域不反向全量镜像到企微,只发送脱敏标题、业务类型、业务编号、状态和 OA 链接。WEGOV1 后,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须保存企微关键历史、完整外部关联键和必要快照,保证企微不可用时可查看既有数据。WROAD2 后“可受控使用”和“完整镜像增强”分离:先用测试账号 `SMOKE002 -> SMOKE101 + wangshunli` 做 3 天每日脚本化巡检,允许补偿归档写 OA 自建留存库,不写企业微信;外出/加班延期,打卡留存 V1 摘要优先,图片 OCR、复杂 BPM、预算、ERP、银行流水导入等 P2 大功能继续冻结。后续必须按 `wecom_hr_master_sync_v1`、`runtime_first_wecom_enablement`、`WOUA-FIX / WECOM-RUNTIME-READY-V1`、`WAPC1 审批配置准备`、`WAPC2 请假/补卡只读 POC`、`WAPC2F 自动生成 POC 样件`、`WAPC2FLIVE live 创建与 WAPC2 自动复跑`、`WCBK1 回调只读 POC(真实事件已确认)`、`WEGOV1 企微主办治理与自建留存路线修正`、`WACP3/WACP3R 补偿拉取 POC`、`WREAD1 审批可读性与误审批防护门禁`、`WADM1 自建留存/镜像数据模型设计`、`WARCH1 最小自建历史留存实现`、`WARCH2 正式只读历史查询`、`WROAD2+OPS 受控上线与每日巡检`、`WARCH3 归档稳定化`、`WCHECK1 打卡摘要留存`、`WEXT1 外出/加班延期决策`、`wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1` 和 `wecom_ruleops_v1` 分阶段拆 Issue CSV。
|
||||||
|
|
||||||
### 1.5 DBWFOC 数据边界修正
|
### 1.5 DBWFOC 数据边界修正
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ WFDG 将 DBWFOC 后的产品方向固化为开发前设计门禁。本节只代
|
|||||||
| 报销、采购、合同、项目、付款、AP、代账 | OA | 主办提交、审批、附件、导出、付款批次、审计和代账资料 | 只发送脱敏消息和 OA deeplink | 采购单附件、合同正文、报价、供应商资料、发票、银行回单和代账资料不进入企微原生审批或企微附件 |
|
| 报销、采购、合同、项目、付款、AP、代账 | OA | 主办提交、审批、附件、导出、付款批次、审计和代账资料 | 只发送脱敏消息和 OA deeplink | 采购单附件、合同正文、报价、供应商资料、发票、银行回单和代账资料不进入企微原生审批或企微附件 |
|
||||||
| RuleOps | OA + 企业微信 API | AI 草拟、差异报告、dry-run、人工确认、审计和回滚建议 | 接收经确认的审批模板、打卡规则、排班、假期余额或人事字段配置写入 | AI 不得直接改正式规则;每次写入保存前后快照、确认人、API `errcode` 和失败原因 |
|
| RuleOps | OA + 企业微信 API | AI 草拟、差异报告、dry-run、人工确认、审计和回滚建议 | 接收经确认的审批模板、打卡规则、排班、假期余额或人事字段配置写入 | AI 不得直接改正式规则;每次写入保存前后快照、确认人、API `errcode` 和失败原因 |
|
||||||
|
|
||||||
`WECOM-CAPABILITY-POC-V1` / WCPC 已按 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API` 输出人事助手、通讯录、打卡、审批、假期余额、回调和权限配置能力矩阵,并达到 HR 主数据镜像准入。WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;WAPI 已固定 API/Secret 口径并复跑 WOUA;WRRA 后明确 `PASS_WITH_FINDINGS` 不能直接放行深度镜像;WOUA-FIX 已将 7 个缺企微测试账号软归档并复检 `oaActiveMissingInWecom=0`,企微缺字段先接受不补;WMSG1 已证明真实企微应用消息和 Deeplink 可用;WAPC1 已固化审批配置准备清单;WAPC2 已提供请假/补卡只读 POC runner;WAPC2FLIVE 已创建 OA-POC 样件并自动复跑通过;WCBK1 已完成真实回调 URL 验证和审批状态事件确认;WACP3R 已自动发现 OA-POC 请假/补卡模板并证明补偿拉取和详情读取可用;WPROC1/WPROC2 已固定自动化优先、非自审、高风险 POC 前置和 process gate;WEGOV1 固定企微主办 + OA 自建留存路线。生产写接口必须单独批准。正式开发顺序为 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC(真实事件已确认)` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)-> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`。
|
`WECOM-CAPABILITY-POC-V1` / WCPC 已按 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API` 输出人事助手、通讯录、打卡、审批、假期余额、回调和权限配置能力矩阵,并达到 HR 主数据镜像准入。WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;WAPI 已固定 API/Secret 口径并复跑 WOUA;WRRA 后明确 `PASS_WITH_FINDINGS` 不能直接放行深度镜像;WOUA-FIX 已将 7 个缺企微测试账号软归档并复检 `oaActiveMissingInWecom=0`,企微缺字段先接受不补;WMSG1 已证明真实企微应用消息和 Deeplink 可用;WAPC1 已固化审批配置准备清单;WAPC2 已提供请假/补卡只读 POC runner;WAPC2FLIVE 已创建 OA-POC 样件并自动复跑通过;WCBK1 已完成真实回调 URL 验证和审批状态事件确认;WACP3R 已自动发现 OA-POC 请假/补卡模板并证明补偿拉取和详情读取可用;WPROC1/WPROC2 已固定自动化优先、非自审、高风险 POC 前置和 process gate;WEGOV1 固定企微主办 + OA 自建留存路线;WARCH1/WARCH2 已完成请假/补卡最小留存和正式只读查询。生产写接口必须单独批准。正式开发顺序为 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC(真实事件已确认)` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班延期决策` -> `wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)-> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`。
|
||||||
|
|
||||||
### 1.7 WDRG 开发路线图门禁
|
### 1.7 WDRG 开发路线图门禁
|
||||||
|
|
||||||
@@ -89,7 +89,9 @@ WDRG 将 WFDG 后的设计门禁转化为开发节奏门禁。本节只代表路
|
|||||||
| `wecom_hr_master_sync_v1` | 企微/人事助手员工、部门、主管、职位、联系方式和在职状态镜像到 OA | OA 可自动创建/更新员工档案、账号、角色、企微绑定和审计 |
|
| `wecom_hr_master_sync_v1` | 企微/人事助手员工、部门、主管、职位、联系方式和在职状态镜像到 OA | OA 可自动创建/更新员工档案、账号、角色、企微绑定和审计 |
|
||||||
| `runtime_first_wecom_enablement` | 优先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手读取、打卡读取和只读对账 | API/Secret 口径固定,WOUA 差异已分类并有处理决策 |
|
| `runtime_first_wecom_enablement` | 优先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手读取、打卡读取和只读对账 | API/Secret 口径固定,WOUA 差异已分类并有处理决策 |
|
||||||
| `WOUA-FIX / WECOM-RUNTIME-READY-V1` | 收口 OA/企微用户一致性差异和运行优先准入 | 区分真实员工、测试账号、待补企微字段、待清理绑定和 WHMS 批量窗口决策 |
|
| `WOUA-FIX / WECOM-RUNTIME-READY-V1` | 收口 OA/企微用户一致性差异和运行优先准入 | 区分真实员工、测试账号、待补企微字段、待清理绑定和 WHMS 批量窗口决策 |
|
||||||
| `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA | OA 可查询企微 HR/考勤镜像、考勤解释和审计 |
|
| `WAPC2FLIVE -> WCBK1 -> WACP3/WACP3R -> WREAD1 -> WADM1 -> WARCH1 -> WARCH2` | 先用请假/补卡低风险样例证明审批详情、回调、补偿拉取、可读性、自建留存和只读查询 | 已完成请假/补卡最小链路;仍不代表完整镜像、外出/加班、应急接管或恢复回写 |
|
||||||
|
| `WROAD2+OPS -> WARCH3 -> WCHECK1 -> WEXT1` | 先测试账号受控上线和每日巡检,再做归档稳定化、打卡摘要留存和外出/加班延期决策 | 3 天巡检报告和归档/打卡摘要边界明确后,再评估完整镜像 |
|
||||||
|
| `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA | WARCH3、WCHECK1 和外出/加班决策完成后再拆;OA 可查询企微 HR/考勤镜像、考勤解释和审计 |
|
||||||
| `oa_hr_emergency_mode_v1` | 企业微信不可用时管理员人工开启 OA HR/考勤应急接管 | 应急单据带 `EMERGENCY` 标记,开启/关闭均有原因、范围、责任人和审计 |
|
| `oa_hr_emergency_mode_v1` | 企业微信不可用时管理员人工开启 OA HR/考勤应急接管 | 应急单据带 `EMERGENCY` 标记,开启/关闭均有原因、范围、责任人和审计 |
|
||||||
| `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微 | 生成成功、失败、跳过和冲突清单,不静默覆盖企微正式记录 |
|
| `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微 | 生成成功、失败、跳过和冲突清单,不静默覆盖企微正式记录 |
|
||||||
| `wecom_ruleops_v1` | AI 草拟规则、生成差异报告和 dry-run,人工确认后写入企微 | 保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计 |
|
| `wecom_ruleops_v1` | AI 草拟规则、生成差异报告和 dry-run,人工确认后写入企微 | 保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计 |
|
||||||
@@ -299,13 +301,13 @@ WFOC/DBWFOC 后审批分为两类:OA 主办审批和企微主办审批。OA
|
|||||||
- 企业微信打卡用于原始采集和规则执行,保留其定位、人脸、Wi-Fi、排班、设备和防作弊能力。
|
- 企业微信打卡用于原始采集和规则执行,保留其定位、人脸、Wi-Fi、排班、设备和防作弊能力。
|
||||||
- OA 不重造企业微信打卡规则、定位、人脸识别、排班或防作弊引擎。
|
- OA 不重造企业微信打卡规则、定位、人脸识别、排班或防作弊引擎。
|
||||||
- 请假、补卡、外出、加班等考勤修正申请优先在企业微信原生审批中提交和处理。
|
- 请假、补卡、外出、加班等考勤修正申请优先在企业微信原生审批中提交和处理。
|
||||||
- OA 通过 `wecom_attendance_approval_mirror_v1` 同步企微审批、打卡记录、规则、日报、月报和异常摘要,形成按域镜像和考勤解释;该命名承接旧口径 `wecom_native_approval_mirror_v1`。
|
- OA 先通过 WARCH1/WARCH2 保存并查询请假/补卡已归档历史,再通过 WROAD2+OPS 做测试账号受控巡检;后续 `WCHECK1` 先保存打卡日/月摘要、异常摘要和规则快照。完整 `wecom_attendance_approval_mirror_v1` 需等 WARCH3、WCHECK1 和外出/加班决策完成后再拆。
|
||||||
- 企业微信不可用时,管理员可人工开启 `oa_hr_emergency_mode_v1`,临时开放 OA 提交和审批;应急单据带 `EMERGENCY` 标记并进入恢复回写队列。
|
- 企业微信不可用时,管理员可人工开启 `oa_hr_emergency_mode_v1`,临时开放 OA 提交和审批;应急单据带 `EMERGENCY` 标记并进入恢复回写队列。
|
||||||
|
|
||||||
### 7.2 用户流程
|
### 7.2 用户流程
|
||||||
|
|
||||||
- 员工正常在企业微信提交请假、补卡、外出或加班申请。
|
- 员工正常在企业微信提交请假、补卡;外出和加班当前业务路线先延期,需真实业务需要或用户批准后再做低风险 POC。
|
||||||
- 主管或 HR 正常在企业微信审批;OA 同步审批详情、审批历史、附件、状态回调和假期余额。
|
- 主管或 HR 正常在企业微信审批;OA 先保存请假/补卡审批详情、审批历史、状态回调和对账 finding,后续再扩展外出/加班和打卡摘要。
|
||||||
- 审批通过后,OA 使用企微审批和打卡数据更新团队状态、日历和考勤镜像。
|
- 审批通过后,OA 使用企微审批和打卡数据更新团队状态、日历和考勤镜像。
|
||||||
- 企微故障时,管理员人工开启 OA 应急模式;企微恢复后,OA 通过 `wecom_recovery_writeback_v1` dry-run 后自动回写,冲突进入人工确认。
|
- 企微故障时,管理员人工开启 OA 应急模式;企微恢复后,OA 通过 `wecom_recovery_writeback_v1` dry-run 后自动回写,冲突进入人工确认。
|
||||||
|
|
||||||
@@ -313,7 +315,7 @@ WFOC/DBWFOC 后审批分为两类:OA 主办审批和企微主办审批。OA
|
|||||||
|
|
||||||
- 请假提交、审批、撤回、驳回后状态正确。
|
- 请假提交、审批、撤回、驳回后状态正确。
|
||||||
- 已批准请假能影响团队状态或日历展示。
|
- 已批准请假能影响团队状态或日历展示。
|
||||||
- 企微正常时员工优先在企业微信提交请假、补卡、外出和加班;OA 展示同步记录和应急入口状态。
|
- 企微正常时员工优先在企业微信提交请假、补卡;OA 展示已归档历史和应急入口状态。外出/加班不作为当前受控上线阻断。
|
||||||
|
|
||||||
### 7.4 当前完成度校正
|
### 7.4 当前完成度校正
|
||||||
|
|
||||||
|
|||||||
+13
-3
@@ -1,6 +1,6 @@
|
|||||||
# hyb-oa 管理员手册(10 人以下团队版)
|
# hyb-oa 管理员手册(10 人以下团队版)
|
||||||
|
|
||||||
**当前状态(2026-05-20 / WARCH2 本地实现后)**:R7E、PRELAUNCH、财务闭环、ATTV1、HR-WECOM-DIRECTORY-V1、WAPI、WOUA-FIX、WRV1/WRA1、WMSG1、WAPC1/WAPC2、WPROC1/WPROC2、WAPC2F dry-run、WAPC2FLIVE、WCBK1、WEGOV1、WACP3/WACP3R、WREAD1/WREAD1F、WADM1、WARCH1 和 WARCH2 均已收口到当前开发阶段;SYSTEM-COMPLETE-GATE 结论为 `GO_TO_USE`。WAPI 后固定企微 API 能力目录和 Secret 矩阵:通讯录使用 `WECOM_CONTACT_SECRET`,人事助手/打卡/消息/OAuth/审批读取使用 `WECOM_AGENT_SECRET`,运行时代码不得靠多个 Secret 试错。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,不自动删除。WCBK1 已部署只读回调端点和 runner,远端完成回调 URL 验证并收到一条由 `SMOKE101` 同意现有 OA-POC 补卡测试单触发的真实审批状态事件,报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 为 `PASS_CALLBACK_EVENT_CONFIRMED`。WACP3R 已新增自动发现模板 ID 路径并公网只读复跑,报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`;WREAD1F 新样例后,用户确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。WARCH1 已新增并部署请假/补卡最小审批历史留存:回调事件默认入 OA DB,补偿拉取可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 留存,离线 runner 可不调用企微 API 读取已保存历史摘要;公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 和 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 均为 `PASS_WITH_FINDINGS`,2 条请假/补卡历史可离线读取,finding 是旧回调未入库历史 gap。WARCH2 已新增只读历史查询 API 和 PC/移动历史页:页面入口为“企微审批历史”,文案固定“企业微信主办,OA 自建留存”和“仅已归档记录”,只读 OA DB,不调用企微 API,不提供审批动作;权限按本人相关、直属下属和 HR/admin/* 分层,申请人未映射或 callback-only 记录仅 HR/admin/* 可见。同意单击即通过风险已进入归档审计事实,后续正式历史页和操作规程继续突出动作来源与补偿一致性。采购、费用、合同、项目、报销、付款、AP、代账交接和高敏附件继续 OA 主办,企业微信只做脱敏提醒和 OA deeplink。公网 `payment_batch_v1=force_on`,`erp_sync=force_off`。公司当前无 ERP/独立财务系统,且 ERP 未来不接入 OA;财务闭环以 OA 内审批、台账、付款批次、银行对公付款回单和月度代账交接为准。
|
**当前状态(2026-05-20 / WROAD2 Day 0 后)**:R7E、PRELAUNCH、财务闭环、ATTV1、HR-WECOM-DIRECTORY-V1、WAPI、WOUA-FIX、WRV1/WRA1、WMSG1、WAPC1/WAPC2、WPROC1/WPROC2、WAPC2F dry-run、WAPC2FLIVE、WCBK1、WEGOV1、WACP3/WACP3R、WREAD1/WREAD1F、WADM1、WARCH1 和 WARCH2 均已收口到当前开发阶段;WROAD2+OPS 已完成测试账号受控上线 Day 0 巡检,报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`;SYSTEM-COMPLETE-GATE 结论为 `GO_TO_USE`。WAPI 后固定企微 API 能力目录和 Secret 矩阵:通讯录使用 `WECOM_CONTACT_SECRET`,人事助手/打卡/消息/OAuth/审批读取使用 `WECOM_AGENT_SECRET`,运行时代码不得靠多个 Secret 试错。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,不自动删除。WCBK1 已部署只读回调端点和 runner,远端完成回调 URL 验证并收到一条由 `SMOKE101` 同意现有 OA-POC 补卡测试单触发的真实审批状态事件,报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 为 `PASS_CALLBACK_EVENT_CONFIRMED`。WACP3R 已新增自动发现模板 ID 路径并公网只读复跑,报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`;WREAD1F 新样例后,用户确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。WARCH1 已新增并部署请假/补卡最小审批历史留存:回调事件默认入 OA DB,补偿拉取可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 留存,离线 runner 可不调用企微 API 读取已保存历史摘要;公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 和 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 均为 `PASS_WITH_FINDINGS`,2 条请假/补卡历史可离线读取,finding 是旧回调未入库历史 gap。WARCH2 已新增只读历史查询 API 和 PC/移动历史页:页面入口为“企微审批历史”,文案固定“企业微信主办,OA 自建留存”和“仅已归档记录”,只读 OA DB,不调用企微 API,不提供审批动作;权限按本人相关、直属下属和 HR/admin/* 分层,申请人未映射或 callback-only 记录仅 HR/admin/* 可见。WROAD2 巡检只允许补偿归档写 OA 留存库,不写企业微信、不创建模板或审批单、不安装 cron/systemd timer;外出/加班延期,打卡留存 V1 摘要优先。同意单击即通过风险已进入归档审计事实,后续正式历史页和操作规程继续突出动作来源与补偿一致性。采购、费用、合同、项目、报销、付款、AP、代账交接和高敏附件继续 OA 主办,企业微信只做脱敏提醒和 OA deeplink。公网 `payment_batch_v1=force_on`,`erp_sync=force_off`。公司当前无 ERP/独立财务系统,且 ERP 未来不接入 OA;财务闭环以 OA 内审批、台账、付款批次、银行对公付款回单和月度代账交接为准。
|
||||||
|
|
||||||
## 1. 适用范围
|
## 1. 适用范围
|
||||||
- 适用于 `small_team_internal` 工作区模式。
|
- 适用于 `small_team_internal` 工作区模式。
|
||||||
@@ -205,7 +205,7 @@ WCP1/WCPC/WHMS 后续推进:
|
|||||||
2. WCP1 历史结论为 `PAUSE_FOR_CONFIG`;WCPC 已用既有在职测试号完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`。
|
2. WCP1 历史结论为 `PAUSE_FOR_CONFIG`;WCPC 已用既有在职测试号完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`。
|
||||||
3. WCPC 已证明 HR 主数据镜像准入项可用:通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取均达到可复用状态;审批模板、审批实例和回调配置仍是后续考勤/审批镜像前置项。
|
3. WCPC 已证明 HR 主数据镜像准入项可用:通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取均达到可复用状态;审批模板、审批实例和回调配置仍是后续考勤/审批镜像前置项。
|
||||||
4. WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`,包括同步批次、逐员工结果、dry-run/apply、People 管理入口和 QA-only runner;公网验证后最终保持 `force_off`。
|
4. WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`,包括同步批次、逐员工结果、dry-run/apply、People 管理入口和 QA-only runner;公网验证后最终保持 `force_off`。
|
||||||
5. 正式开发仍按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1` 分合同实施;WOUA-FIX 已收口测试账号差异和处理决策,WRV1/WRA1/WMSG1 已验证运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡读取主链路。WAPC2FLIVE 已生成请假/补卡低风险样例,WCBK1 已证明真实审批回调 URL、验签/解密和事件脱敏留证,WACP3R 已证明请假/补卡补偿拉取和详情读取可用,WREAD1 已确认请假/补卡可读性,WADM1 已明确自建留存模型,WARCH1 已实现最小请假/补卡历史留存;后续仍不得跳过正式查询、外出/加班、打卡细项等独立合同直接进入深度考勤/审批镜像。
|
5. 正式开发仍按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班延期决策` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1` 分合同实施;WOUA-FIX 已收口测试账号差异和处理决策,WRV1/WRA1/WMSG1 已验证运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡读取主链路。WAPC2FLIVE 已生成请假/补卡低风险样例,WCBK1 已证明真实审批回调 URL、验签/解密和事件脱敏留证,WACP3R 已证明请假/补卡补偿拉取和详情读取可用,WREAD1 已确认请假/补卡可读性,WADM1 已明确自建留存模型,WARCH1 已实现最小请假/补卡历史留存,WARCH2 已实现正式只读查询;后续仍不得跳过 WROAD2+OPS、WARCH3、WCHECK1、外出/加班决策等独立合同直接进入深度考勤/审批镜像。
|
||||||
6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。
|
6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。
|
||||||
|
|
||||||
WCPC 配置复跑清单:
|
WCPC 配置复跑清单:
|
||||||
@@ -322,6 +322,16 @@ WAPC2 请假/补卡只读 POC 操作口径:
|
|||||||
6. 管理员查看审计日志中是否有异常导出、权限拒绝或付款动作。
|
6. 管理员查看审计日志中是否有异常导出、权限拒绝或付款动作。
|
||||||
7. 记录当天新增问题、影响等级、处理人、结论和是否需要暂停。
|
7. 记录当天新增问题、影响等级、处理人、结论和是否需要暂停。
|
||||||
|
|
||||||
|
WROAD2+OPS 企微受控上线每日巡检:
|
||||||
|
|
||||||
|
1. 试用范围固定为测试账号 `SMOKE002 -> SMOKE101 + wangshunli`,试用周期 3 天,每日手动触发一次脚本,不安装 cron 或 systemd timer。
|
||||||
|
2. 本地或远端执行 `scripts/qa/run-wroad2-ops-daily.sh`,报告输出到 `artifacts/qa-flow/wroad2-ops-<timestamp>/summary.json`。
|
||||||
|
3. 巡检会复用公网 `/ready`、live smoke、feature flag、企微 runtime、审批补偿拉取和 OA 归档离线读取;默认不写企业微信。
|
||||||
|
4. 唯一允许写入的是审批补偿归档步骤:进程级 `WECOM_ARCHIVE_WRITE=1` 加 runner `--persist-to-db`,仅写 OA 自建留存库,用于补齐历史和对账证据。
|
||||||
|
5. 结论只能记录为 `PASS_CONTROLLED_OPS_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或真实 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。出现 Secret、权限、可信 IP、可见范围或外部配置问题时,先记录真实阻断,不扩大范围。
|
||||||
|
6. 外出/加班、完整镜像、应急接管、恢复回写、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入在试用期继续冻结。
|
||||||
|
7. Day 0 公网报告为 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`:企微 runtime、补偿归档、离线归档读取和隐私扫描通过;finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。
|
||||||
|
|
||||||
问题登记最小字段:
|
问题登记最小字段:
|
||||||
|
|
||||||
| 字段 | 说明 |
|
| 字段 | 说明 |
|
||||||
@@ -443,7 +453,7 @@ WAPC2 请假/补卡只读 POC 操作口径:
|
|||||||
- `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com`
|
- `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com`
|
||||||
5. 先让管理员用账号密码登录,在 `个人设置` 完成一次绑定,再测试企业微信工作台直达;已绑定用户从手机企业微信进入时应直接看到移动工作台。
|
5. 先让管理员用账号密码登录,在 `个人设置` 完成一次绑定,再测试企业微信工作台直达;已绑定用户从手机企业微信进入时应直接看到移动工作台。
|
||||||
6. 若启用 OA 同步企业微信打卡数据,在企业微信打卡 API「可调用接口的应用」中授权 `海音达工作台`。OA 默认可复用 `WECOM_AGENT_SECRET`;只有单独创建考勤同步应用时才额外配置 `WECOM_CHECKIN_SECRET`。
|
6. 若启用 OA 同步企业微信打卡数据,在企业微信打卡 API「可调用接口的应用」中授权 `海音达工作台`。OA 默认可复用 `WECOM_AGENT_SECRET`;只有单独创建考勤同步应用时才额外配置 `WECOM_CHECKIN_SECRET`。
|
||||||
7. HR/考勤员工日常审批后续配置企业微信原生审批模板作为主流程;WAPC2FLIVE 已自动生成请假/补卡 OA-POC 低风险样件并复跑只读 POC,WCBK1 已完成真实回调事件确认,WACP3R 已完成补偿拉取,WREAD1 已确认请假/补卡在企微中可读,WADM1 已完成自建留存/镜像模型设计,WARCH1 已完成最小请假/补卡历史留存。同意单击即通过需继续纳入操作提示和审计设计。外出/加班模板仍需后续单独配置或 POC。报销、财务、采购、合同和项目类 OA 主办审批仍使用企业微信消息提醒并回到 OA 页面完成。
|
7. HR/考勤员工日常审批后续配置企业微信原生审批模板作为主流程;WAPC2FLIVE 已自动生成请假/补卡 OA-POC 低风险样件并复跑只读 POC,WCBK1 已完成真实回调事件确认,WACP3R 已完成补偿拉取,WREAD1 已确认请假/补卡在企微中可读,WADM1 已完成自建留存/镜像模型设计,WARCH1 已完成最小请假/补卡历史留存,WARCH2 已完成正式只读历史查询。WROAD2 先用测试账号做 3 天每日巡检;同意单击即通过需继续纳入操作提示和审计设计。外出/加班模板延期,需后续单独配置或 POC。报销、财务、采购、合同和项目类 OA 主办审批仍使用企业微信消息提醒并回到 OA 页面完成。
|
||||||
|
|
||||||
### 员工会看到的典型状态
|
### 员工会看到的典型状态
|
||||||
- 未绑定:登录页会提示“当前企业微信账号尚未绑定”,回退到账号密码登录。
|
- 未绑定:登录页会提示“当前企业微信账号尚未绑定”,回退到账号密码登录。
|
||||||
|
|||||||
+6
-6
@@ -6,7 +6,7 @@
|
|||||||
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
|
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
|
||||||
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[企微 API 能力目录](./企微API能力目录.md)
|
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[企微 API 能力目录](./企微API能力目录.md)
|
||||||
|
|
||||||
本规约细化企业微信在 `hyb-oa` 中的基础设施边界、入口、免登/绑定、通讯录身份、消息通知、deeplink、打卡、人事助手、原生审批、OA 自建留存、OA 镜像、人工接管和恢复回写要求。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 后进一步固定为:HR/考勤员工日常审批优先使用企业微信,OA 做按域镜像、备份接管、财务闭环和审计中台;采购、合同、项目、财务和高敏附件继续由 OA 主办。WAPI 后,所有企微相关开发必须先读取本规约和 [企微 API 能力目录](./企微API能力目录.md),确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界,再拆 Issue CSV。WMSG1 已证明企业微信应用消息和 Deeplink 真机回流可用;WAPC1 后审批进入配置准备清单,WAPC2 后先做请假/补卡模板详情与低风险 `sp_no` 只读 POC;WAPC2F 已实现 OA-POC 样件 dry-run 并公网验证 `PASS_FIXTURE_DRY_RUN_READY`。WAPC2FLIVE 已在用户批准后创建 OA-POC 请假/补卡测试模板和低风险测试审批单,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网结论 `PASS_CALLBACK_EVENT_CONFIRMED`。WEGOV1 后固定“企微主办 HR/考勤成熟能力,OA 保存关键历史和外部关联键”的路线。WACP3R 已自动发现 OA-POC 请假/补卡模板并完成公网补偿拉取复跑,报告为 `PASS_WITH_FINDINGS`;补偿拉取和详情读取可用,当时 finding 为回调证据文件未持久化。WREAD1F 后,用户真机确认请假/补卡审批卡片、列表和详情页可读,远端报告为 `PASS_READABLE`;同意单击即通过作为操作风险进入后续设计。WADM1 已完成自建留存/镜像数据模型设计,WARCH1 已创建最小审批留存迁移和运行时入库路径;后续仍不能直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。
|
本规约细化企业微信在 `hyb-oa` 中的基础设施边界、入口、免登/绑定、通讯录身份、消息通知、deeplink、打卡、人事助手、原生审批、OA 自建留存、OA 镜像、人工接管和恢复回写要求。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 后进一步固定为:HR/考勤员工日常审批优先使用企业微信,OA 做按域镜像、备份接管、财务闭环和审计中台;采购、合同、项目、财务和高敏附件继续由 OA 主办。WAPI 后,所有企微相关开发必须先读取本规约和 [企微 API 能力目录](./企微API能力目录.md),确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界,再拆 Issue CSV。WMSG1 已证明企业微信应用消息和 Deeplink 真机回流可用;WAPC1 后审批进入配置准备清单,WAPC2 后先做请假/补卡模板详情与低风险 `sp_no` 只读 POC;WAPC2F 已实现 OA-POC 样件 dry-run 并公网验证 `PASS_FIXTURE_DRY_RUN_READY`。WAPC2FLIVE 已在用户批准后创建 OA-POC 请假/补卡测试模板和低风险测试审批单,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网结论 `PASS_CALLBACK_EVENT_CONFIRMED`。WEGOV1 后固定“企微主办 HR/考勤成熟能力,OA 保存关键历史和外部关联键”的路线。WACP3R 已自动发现 OA-POC 请假/补卡模板并完成公网补偿拉取复跑,报告为 `PASS_WITH_FINDINGS`;补偿拉取和详情读取可用,当时 finding 为回调证据文件未持久化。WREAD1F 后,用户真机确认请假/补卡审批卡片、列表和详情页可读,远端报告为 `PASS_READABLE`;同意单击即通过作为操作风险进入后续设计。WADM1 已完成自建留存/镜像数据模型设计,WARCH1 已创建最小审批留存迁移和运行时入库路径,WARCH2 已提供 OA DB 正式只读查询 API 和 PC/移动历史页。WROAD2 后先做测试账号受控上线和每日巡检,外出/加班延期,打卡留存 V1 摘要优先;后续仍不能直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
| 通讯录 | 成员创建、读取、更新、禁用或删除 | 近期已验证 OA 写企微;后续改为企微主源同步 OA,OA 保留修复和审计 | `CAN_REUSE_NOW`:HCLT create/update/disable、部门读取和 WCPC 既有在职测试号 `contact.member_read` 均已通过 |
|
| 通讯录 | 成员创建、读取、更新、禁用或删除 | 近期已验证 OA 写企微;后续改为企微主源同步 OA,OA 保留修复和审计 | `CAN_REUSE_NOW`:HCLT create/update/disable、部门读取和 WCPC 既有在职测试号 `contact.member_read` 均已通过 |
|
||||||
| 人事助手 | 员工字段配置、花名册读取、花名册更新 | 作为员工主数据源,驱动 OA 员工、账号、角色、绑定和状态镜像 | `LOCAL_IMPLEMENTED_FOR_READ_SYNC`:字段配置和既有在职测试号花名册读取已通过;WHMS 已本地实现只读同步到 OA;资料更新写接口仍需单独 POC |
|
| 人事助手 | 员工字段配置、花名册读取、花名册更新 | 作为员工主数据源,驱动 OA 员工、账号、角色、绑定和状态镜像 | `LOCAL_IMPLEMENTED_FOR_READ_SYNC`:字段配置和既有在职测试号花名册读取已通过;WHMS 已本地实现只读同步到 OA;资料更新写接口仍需单独 POC |
|
||||||
| 打卡 | 打卡记录、员工规则、日报、月报、排班、补卡、规则管理 | 企微主办规则和采集,OA 同步按域镜像和应急对账 | `CAN_REUSE_NOW_FOR_READ`:WCPC 短窗口打卡记录和规则读取通过;日报/月报/排班等细项留到考勤镜像合同继续验证 |
|
| 打卡 | 打卡记录、员工规则、日报、月报、排班、补卡、规则管理 | 企微主办规则和采集,OA 同步按域镜像和应急对账 | `CAN_REUSE_NOW_FOR_READ`:WCPC 短窗口打卡记录和规则读取通过;日报/月报/排班等细项留到考勤镜像合同继续验证 |
|
||||||
| 审批 | 模板详情、提交审批、审批状态回调、审批详情、模板创建/更新、批量获取审批单号、假期余额 | HR/考勤员工日常审批企微主办,OA 同步镜像;OA 主办财务、采购、合同、项目和报销审批不迁移 | `WARCH1_ARCHIVE_READY`:WAPC2FLIVE 已创建请假/补卡 OA-POC 样件并复跑通过;WCBK1 已证明审批状态回调 URL 验证、验签、解密和真实事件脱敏留证;WACP3R 已通过 `getapprovalinfo` 自动发现模板并拉取请假/补卡详情;WARCH1 已补齐回调事件、补偿拉取和对账 finding 的最小 OA 自建留存。完整镜像、外出/加班、应急接管和恢复回写仍需后续合同 |
|
| 审批 | 模板详情、提交审批、审批状态回调、审批详情、模板创建/更新、批量获取审批单号、假期余额 | HR/考勤员工日常审批企微主办,OA 同步镜像;OA 主办财务、采购、合同、项目和报销审批不迁移 | `WARCH2_QUERY_READY / WROAD2_CONTROLLED_OPS`:WAPC2FLIVE 已创建请假/补卡 OA-POC 样件并复跑通过;WCBK1 已证明审批状态回调 URL 验证、验签、解密和真实事件脱敏留证;WACP3R 已通过 `getapprovalinfo` 自动发现模板并拉取请假/补卡详情;WARCH1 已补齐回调事件、补偿拉取和对账 finding 的最小 OA 自建留存;WARCH2 已提供只读历史查询。WROAD2 只做测试账号受控上线和每日巡检;完整镜像、外出/加班、应急接管和恢复回写仍需后续合同 |
|
||||||
| 工作台和消息 | 自建应用入口、应用消息、deeplink | 继续作为 OA 移动入口和通知渠道 | `CAN_REUSE_NOW`;WRV1 新增 `check:wecom-runtime-ready` 对入口、OAuth、脱敏消息 dry-run 和 deeplink 做运行就绪门禁 |
|
| 工作台和消息 | 自建应用入口、应用消息、deeplink | 继续作为 OA 移动入口和通知渠道 | `CAN_REUSE_NOW`;WRV1 新增 `check:wecom-runtime-ready` 对入口、OAuth、脱敏消息 dry-run 和 deeplink 做运行就绪门禁 |
|
||||||
| 财务/报销 | 企微不提供本项目需要的 PDF OCR、付款批次、银行回单和代账闭环 | OA 主办 | `KEEP_OA_PRIMARY` |
|
| 财务/报销 | 企微不提供本项目需要的 PDF OCR、付款批次、银行回单和代账闭环 | OA 主办 | `KEEP_OA_PRIMARY` |
|
||||||
| 真实支付、ERP、图片 OCR、银行流水导入 | 非本路线目标 | 不进入当前路线 | `NOT_IN_SCOPE` |
|
| 真实支付、ERP、图片 OCR、银行流水导入 | 非本路线目标 | 不进入当前路线 | `NOT_IN_SCOPE` |
|
||||||
@@ -235,9 +235,9 @@ REQAUD 复核后,ATTV1 已完成统一入口实现,企业微信打卡边界
|
|||||||
## 7.8 WDRG 开发路线图门禁
|
## 7.8 WDRG 开发路线图门禁
|
||||||
|
|
||||||
- WDRG 后,企业微信相关运行时迁移采用“路线图门禁 + 单功能 Issue CSV”,路线图事实源为 [企微优先开发路线图](./企微优先开发路线图.md)。
|
- WDRG 后,企业微信相关运行时迁移采用“路线图门禁 + 单功能 Issue CSV”,路线图事实源为 [企微优先开发路线图](./企微优先开发路线图.md)。
|
||||||
- WEGOV1 后阶段顺序调整为 `WECOM-CAPABILITY-POC-V1` -> `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`。
|
- WROAD2 后阶段顺序调整为 `WECOM-CAPABILITY-POC-V1` -> `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班延期决策` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`。
|
||||||
- `WECOM-CAPABILITY-POC-V1` 已由 WCPC 收口,WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;后续不得跳过运行优先门禁和 WOUA 差异处理决策直接开发企微 HR/考勤审批镜像、OA 应急接管、恢复回写或 RuleOps 正式写入。
|
- `WECOM-CAPABILITY-POC-V1` 已由 WCPC 收口,WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;后续不得跳过运行优先门禁和 WOUA 差异处理决策直接开发企微 HR/考勤审批镜像、OA 应急接管、恢复回写或 RuleOps 正式写入。
|
||||||
- 运行优先阶段先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手花名册读取和打卡读取;WOUA-FIX 已按用户确认软归档 7 个缺企微测试账号,复检 `oaActiveMissingInWecom=0`;剩余企微缺字段先接受不补,归档测试绑定保留审计。WRV1 用 `server/src/scripts/check-wecom-runtime-ready.js` 固化运行优先门禁,WRA1 修正 QA-only 打卡只读门禁,WMSG1 完成真实消息和 Deeplink 真机确认。报告结论只能是 `PASS_RUNTIME_READY`、`PASS_WITH_CONFIG_GAPS` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。该结论仍不能直接放行深度镜像,深度考勤/审批镜像需在 WAPC1、WAPC2、WAPC2F/WAPC2FLIVE、WCBK1、WEGOV1、WACP3、WREAD1、WADM1 和 WARCH1 完成后再拆。
|
- 运行优先阶段先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手花名册读取和打卡读取;WOUA-FIX 已按用户确认软归档 7 个缺企微测试账号,复检 `oaActiveMissingInWecom=0`;剩余企微缺字段先接受不补,归档测试绑定保留审计。WRV1 用 `server/src/scripts/check-wecom-runtime-ready.js` 固化运行优先门禁,WRA1 修正 QA-only 打卡只读门禁,WMSG1 完成真实消息和 Deeplink 真机确认。报告结论只能是 `PASS_RUNTIME_READY`、`PASS_WITH_CONFIG_GAPS` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。该结论仍不能直接放行深度镜像,深度考勤/审批镜像需在 WAPC1、WAPC2、WAPC2F/WAPC2FLIVE、WCBK1、WEGOV1、WACP3、WREAD1、WADM1、WARCH1、WARCH2、WROAD2+OPS、WARCH3、WCHECK1 和外出/加班决策完成后再拆。
|
||||||
- WAPC2F 自动样件默认申请人 `SMOKE002`、审批人 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid。`SMOKE101` 不可用时不自动换人,返回配置缺口并问答确认。
|
- WAPC2F 自动样件默认申请人 `SMOKE002`、审批人 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid。`SMOKE101` 不可用时不自动换人,返回配置缺口并问答确认。
|
||||||
- 线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护可另开合同并行;采购、合同、报销、付款、AP、代账和高敏附件继续 OA 主办,不混入企微 HR/考勤路线。
|
- 线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护可另开合同并行;采购、合同、报销、付款、AP、代账和高敏附件继续 OA 主办,不混入企微 HR/考勤路线。
|
||||||
- 本路线图只代表开发节奏和门禁,不代表任何企微 HR/考勤镜像、OA 应急接管、恢复回写或 RuleOps 运行时能力已完成。
|
- 本路线图只代表开发节奏和门禁,不代表任何企微 HR/考勤镜像、OA 应急接管、恢复回写或 RuleOps 运行时能力已完成。
|
||||||
@@ -395,7 +395,7 @@ WAPC2 将审批配置准备先收窄到请假和补卡两类低风险链路,
|
|||||||
|
|
||||||
## 7.15 WADM1/WARCH1 自建留存基础设施
|
## 7.15 WADM1/WARCH1 自建留存基础设施
|
||||||
|
|
||||||
WADM1 后,企业微信基础设施侧的数据职责调整为“先持久化关键历史,再增强镜像查询”。WARCH1 已把请假/补卡最小审批历史留存落到 Prisma schema、回调入库、补偿拉取入库和 QA-only 离线读取 runner;打卡、人事快照仍按既有表和后续合同扩展。
|
WADM1 后,企业微信基础设施侧的数据职责调整为“先持久化关键历史,再增强镜像查询”。WARCH1 已把请假/补卡最小审批历史留存落到 Prisma schema、回调入库、补偿拉取入库和 QA-only 离线读取 runner;WARCH2 已把已归档历史开放为正式只读 API 和 PC/移动历史页;WROAD2+OPS 再把这条链路纳入测试账号受控上线和每日巡检。打卡、人事快照仍按既有表和后续合同扩展。
|
||||||
|
|
||||||
自建留存 V1 基础对象:
|
自建留存 V1 基础对象:
|
||||||
|
|
||||||
@@ -410,7 +410,7 @@ WADM1 后,企业微信基础设施侧的数据职责调整为“先持久化
|
|||||||
- OA DB 可保存完整外部键用于补偿和恢复;所有日志、报告、Issue 和文档只输出脱敏前缀。
|
- OA DB 可保存完整外部键用于补偿和恢复;所有日志、报告、Issue 和文档只输出脱敏前缀。
|
||||||
- 不保存 access token、Secret、回调 Token、EncodingAESKey、原始 XML、密文、人脸、完整位置、设备明文或无治理原始 payload。
|
- 不保存 access token、Secret、回调 Token、EncodingAESKey、原始 XML、密文、人脸、完整位置、设备明文或无治理原始 payload。
|
||||||
- 企微 API 不可用时,OA 历史页应能查看已入库的历史摘要;V1 不承诺继续办理企微主办流程。
|
- 企微 API 不可用时,OA 历史页应能查看已入库的历史摘要;V1 不承诺继续办理企微主办流程。
|
||||||
- WARCH1 的离线验证命令为 `npm run check:wecom-approval-archive -- --offline --format=json`,只读 OA DB,不调用企微 API;WARCH2 已新增正式只读查询 API 和 PC/移动历史页,沿用只读 OA DB、白名单输出、未映射记录仅 HR/admin/* 可见的边界,不代表完整镜像或应急办理。
|
- WARCH1 的离线验证命令为 `npm run check:wecom-approval-archive -- --offline --format=json`,只读 OA DB,不调用企微 API;WARCH2 已新增正式只读查询 API 和 PC/移动历史页,沿用只读 OA DB、白名单输出、未映射记录仅 HR/admin/* 可见的边界,不代表完整镜像或应急办理。WROAD2 巡检脚本复用该离线命令,并仅在审批补偿归档步骤以 `WECOM_ARCHIVE_WRITE=1` 写 OA 留存库。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+10
-7
@@ -7,7 +7,7 @@
|
|||||||
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md)
|
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md)
|
||||||
**体验总依据**:[产品设计规则基线](./产品设计规则.md)
|
**体验总依据**:[产品设计规则基线](./产品设计规则.md)
|
||||||
|
|
||||||
本规约细化请假、补卡、外出、加班与考勤修正的产品要求。WFOC 起,企业微信作为 HR/考勤员工日常审批和打卡规则主操作端;OA 负责按域镜像、应急接管、恢复回写、查询导出和审计。WEGOV1 后进一步明确:企微成熟 HR/考勤功能优先上线,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须做自建历史留存、审计、入口、消息和应急兜底。WAPC2 后,请假和补卡先通过 QA-only runner 只读验证模板详情与低风险 `sp_no` 审批详情;WAPC2FLIVE 已生成 OA-POC 样件并复跑通过;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已自动发现模板并证明补偿拉取和详情读取可用。WREAD1F 后,用户真机确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`;驳回有二次确认,同意单击即通过。WARCH1 已实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和离线读取证明;当前仍不代表完整审批镜像、外出/加班、应急接管或恢复回写已实现。PC 和移动页面体验以产品设计规则基线为依据,不重复定义通用审批链和移动导航规则。
|
本规约细化请假、补卡、外出、加班与考勤修正的产品要求。WFOC 起,企业微信作为 HR/考勤员工日常审批和打卡规则主操作端;OA 负责按域镜像、应急接管、恢复回写、查询导出和审计。WEGOV1 后进一步明确:企微成熟 HR/考勤功能优先上线,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须做自建历史留存、审计、入口、消息和应急兜底。WAPC2 后,请假和补卡先通过 QA-only runner 只读验证模板详情与低风险 `sp_no` 审批详情;WAPC2FLIVE 已生成 OA-POC 样件并复跑通过;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已自动发现模板并证明补偿拉取和详情读取可用。WREAD1F 后,用户真机确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`;驳回有二次确认,同意单击即通过。WARCH1 已实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和离线读取证明;WARCH2 已提供正式只读历史查询。WROAD2 后当前策略是测试账号受控上线和每日脚本化巡检;外出/加班延期,不作为当前上线阻断;打卡留存 V1 摘要优先。当前仍不代表完整审批镜像、外出/加班、应急接管或恢复回写已实现。PC 和移动页面体验以产品设计规则基线为依据,不重复定义通用审批链和移动导航规则。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ REQAUD 复核后,ATTV1 已完成统一入口实现,当前运行时完成度
|
|||||||
| 请假对团队状态/日历的影响 | `DONE` | 已批准请假可作为团队状态和日历依据。 |
|
| 请假对团队状态/日历的影响 | `DONE` | 已批准请假可作为团队状态和日历依据。 |
|
||||||
| 企业微信打卡作为原始采集 | `DONE` | 由企业微信侧承载定位、人脸、Wi-Fi、设备和防作弊能力;OA 不重造。 |
|
| 企业微信打卡作为原始采集 | `DONE` | 由企业微信侧承载定位、人脸、Wi-Fi、设备和防作弊能力;OA 不重造。 |
|
||||||
| 企业微信打卡 API 同步 | `PARTIAL` | 已新增同步批次和企微打卡摘要表;有已授权调用打卡 API 的自建应用 Secret 和企微权限时同步,缺配置时记录 `SKIP`。`WECOM_CHECKIN_SECRET` 可作为单独考勤同步应用的显式覆盖;未配置时复用已授权工作台应用的 `WECOM_AGENT_SECRET`。 |
|
| 企业微信打卡 API 同步 | `PARTIAL` | 已新增同步批次和企微打卡摘要表;有已授权调用打卡 API 的自建应用 Secret 和企微权限时同步,缺配置时记录 `SKIP`。`WECOM_CHECKIN_SECRET` 可作为单独考勤同步应用的显式覆盖;未配置时复用已授权工作台应用的 `WECOM_AGENT_SECRET`。 |
|
||||||
| 企微 HR/考勤审批镜像 | `ARCHIVE_MINIMUM_READY` | WAPC2 已新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC;WAPC2FLIVE 已完成自动样件与 WAPC2 自动复跑;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已证明请假/补卡补偿拉取和详情读取可用;WREAD1F 已完成请假/补卡模板级真机确认,结论 `PASS_READABLE`。WARCH1 已实现请假/补卡最小历史留存和离线读取。后续 `wecom_attendance_approval_mirror_v1` 仍需外出/加班 POC 或处理决策、正式查询 API/页面和打卡细项。 |
|
| 企微 HR/考勤审批镜像 | `CONTROLLED_OPS_READY` | WAPC2 已新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC;WAPC2FLIVE 已完成自动样件与 WAPC2 自动复跑;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已证明请假/补卡补偿拉取和详情读取可用;WREAD1F 已完成请假/补卡模板级真机确认,结论 `PASS_READABLE`。WARCH1 已实现请假/补卡最小历史留存和离线读取,WARCH2 已实现正式只读历史查询。WROAD2+OPS 先做测试账号 3 天每日巡检;后续 `wecom_attendance_approval_mirror_v1` 仍需 WARCH3、WCHECK1、外出/加班 POC 或延期决策和打卡细项。 |
|
||||||
| 员工补卡申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交补卡修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
|
| 员工补卡申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交补卡修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
|
||||||
| 外出申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交外出修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
|
| 外出申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交外出修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
|
||||||
| 加班申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交加班修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
|
| 加班申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交加班修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
|
||||||
@@ -231,11 +231,14 @@ WFOC 后,正常审批规则优先以企业微信审批模板和打卡/假期
|
|||||||
- 已完成 A0.13:`WADM1 自建留存/镜像数据模型设计`,已固定请假/补卡审批留存主表、参与人/动作/字段摘要、回调事件、补偿拉取 run/item、对账 finding、隐私保留、迁移回滚,以及同意单击风险对应的审计和提示策略。
|
- 已完成 A0.13:`WADM1 自建留存/镜像数据模型设计`,已固定请假/补卡审批留存主表、参与人/动作/字段摘要、回调事件、补偿拉取 run/item、对账 finding、隐私保留、迁移回滚,以及同意单击风险对应的审计和提示策略。
|
||||||
- 已完成 A0.14:`WARCH1 最小自建历史留存实现`,已保存请假/补卡企微审批历史、回调事件、补偿拉取记录和对账 finding,并新增离线读取 runner。打卡和人事快照先复用既有表,后续按缺口扩展。
|
- 已完成 A0.14:`WARCH1 最小自建历史留存实现`,已保存请假/补卡企微审批历史、回调事件、补偿拉取记录和对账 finding,并新增离线读取 runner。打卡和人事快照先复用既有表,后续按缺口扩展。
|
||||||
- 已完成 A0.15:`WARCH2 正式只读历史查询`,已新增请假/补卡企微审批历史查询 API 和 PC/移动历史页。本阶段只读 OA DB,不调用企微 API;普通员工看本人相关,主管看直属下属和本人相关,HR/admin/* 看全量;页面固定“企业微信主办,OA 自建留存”“仅已归档记录”,不提供审批动作。公网已部署并通过 `/ready`、未登录 401 和远端离线归档复跑。
|
- 已完成 A0.15:`WARCH2 正式只读历史查询`,已新增请假/补卡企微审批历史查询 API 和 PC/移动历史页。本阶段只读 OA DB,不调用企微 API;普通员工看本人相关,主管看直属下属和本人相关,HR/admin/* 看全量;页面固定“企业微信主办,OA 自建留存”“仅已归档记录”,不提供审批动作。公网已部署并通过 `/ready`、未登录 401 和远端离线归档复跑。
|
||||||
- 后续 A1:`wecom_attendance_approval_mirror_v1`,同步企微请假、补卡、外出、加班审批、附件、历史和状态回调;该命名承接旧口径 `wecom_native_approval_mirror_v1`。WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险 `sp_no` 样例,WACP3R 已证明请假/补卡补偿拉取;正式开发前仍必须补齐外出/加班样例或处理决策、WARCH2 公网验证和必要打卡细项 POC。
|
- 当前 A0.16:`WROAD2+OPS 受控上线与每日巡检`,先用测试账号 `SMOKE002 -> SMOKE101 + wangshunli` 做 3 天每日脚本化巡检。巡检只允许补偿归档写 OA 留存库,不写企业微信、不创建模板或审批单、不安装定时任务。
|
||||||
- 后续 A2:企微打卡规则、排班、记录、日报、月报按域镜像,覆盖 Secret/API 权限、短窗口同步、错误码和脱敏证据。
|
- 后续 A0.17:`WARCH3 归档稳定化`,优先稳定每日补偿、归档对账 finding、历史查询可用性、旧 callback gap 解释和报告趋势。
|
||||||
- 后续 A3:`oa_hr_emergency_mode_v1`,管理员人工接管、应急提交、应急审批和恢复队列。
|
- 后续 A0.18:`WCHECK1 打卡摘要留存`,只保存日/月摘要、异常摘要和规则快照;不保存完整位置、人脸、设备明文或原始 payload。
|
||||||
- 后续 A4:`wecom_recovery_writeback_v1`,企微恢复后 dry-run、自动回写、失败重试和冲突清单。
|
- 后续 A0.19:`WEXT1 外出/加班延期决策`,默认延期;仅当真实业务需要或用户批准时,再自动生成低风险 POC 样件。
|
||||||
- 后续 A5:团队状态和日历按企微镜像、OA 应急单和回写结果统一解释。
|
- 后续 A1:`wecom_attendance_approval_mirror_v1`,同步企微请假、补卡、外出、加班审批、附件、历史和状态回调;该命名承接旧口径 `wecom_native_approval_mirror_v1`。正式开发前仍必须完成 WROAD2+OPS、WARCH3、WCHECK1、外出/加班决策和必要打卡细项 POC。
|
||||||
|
- 后续 A2:`oa_hr_emergency_mode_v1`,管理员人工接管、应急提交、应急审批和恢复队列。
|
||||||
|
- 后续 A3:`wecom_recovery_writeback_v1`,企微恢复后 dry-run、自动回写、失败重试和冲突清单。
|
||||||
|
- 后续 A4:团队状态和日历按企微镜像、OA 应急单和回写结果统一解释。
|
||||||
- 后续 A6:出差完整流程专项,不进入当前正式首批能力。
|
- 后续 A6:出差完整流程专项,不进入当前正式首批能力。
|
||||||
|
|
||||||
涉及审批状态、团队状态、生效记录或后续打卡同步的 Issue,必须写明失败重试、回滚策略和人工修正路径。
|
涉及审批状态、团队状态、生效记录或后续打卡同步的 Issue,必须写明失败重试、回滚策略和人工修正路径。
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
|
||||||
|
"WROAD2-0","受控上线合同与边界冻结","建立 WROAD2+OPS 受控上线与每日巡检合同;承接系统核心能力 GO_TO_USE/GO_TO_OPERATE 和 WARCH2 请假/补卡 OA 自建留存查询结果。本阶段不直接进入 wecom_attendance_approval_mirror_v1,改为测试账号受控上线、每日脚本化巡检和归档稳定化优先。范围固定为 SMOKE002 -> SMOKE101 + wangshunli,3 天试用,每日一次脚本化触发;外出/加班先延期,打卡留存 V1 摘要优先,P2 大功能继续冻结。","1) WARCH2 后路线调整为 WARCH2 -> WROAD2+OPS -> WARCH3 -> WCHECK1 -> 镜像/应急/回写/RuleOps;2) 明确可受控使用和完整镜像增强分离;3) 试用范围为测试账号,不扩大真实员工;4) 不安装 cron/systemd timer;5) 不创建企微模板、不提交审批单、不写企业微信;6) 企微相关 Secret 来源固定,审批补偿和归档读取使用 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback、不允许运行时猜 Secret;7) 缺 Secret、权限、可信 IP、可见范围、模板或外部配置时记录 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。","受影响流程:WARCH2 已归档请假/补卡历史 -> 受控上线路线冻结 -> 后续每日巡检和归档稳定化;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv --profile wecom --json。","python3|node|manual","DONE","DONE","DONE","issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv","[]","回滚/清理:本行仅合同;如路线不通过,删除本合同和后续事实源改动即可,不影响已部署 WARCH2。保留审计,不清理既有测试数据。"
|
||||||
|
"WROAD2-1","路线事实源回写","更新路线图、PRD/规约、管理员手册、试运行报告、文档索引、事实源矩阵和项目 skill,固化 WROAD2+OPS 决策。","1) 文档明确当前可进入测试账号受控上线,不等于完整镜像完成;2) 外出/加班延期且不阻断当前上线;3) 打卡摘要优先,不保存完整位置、人脸、设备明文或原始 payload;4) WARCH3 归档稳定化为 WROAD2+OPS 后优先阶段;5) 其他 P2 大功能继续冻结;6) 文档不暗示 OA 正常替代企微 HR/考勤办理。","受影响流程:路线事实源 -> 后续 Issue 拆分 -> 实施人员按当前边界开发;验证步骤:node scripts/qa/audit-docs.mjs --check-registry;python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery;rg -n ""WROAD2|受控上线|WARCH3|WCHECK1|外出/加班|P2 大功能继续冻结|SKIP/BLOCKED_BY_EXTERNAL_CONFIG"" docs .agents/skills/hyb-oa-delivery/SKILL.md。","node|python3|rg","DONE","DONE","DONE","docs/企微优先开发路线图.md|docs/海音达OA-MVP需求规格说明书.md|docs/需求-企业微信基础设施规约.md|docs/需求-请假考勤修正规约.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WROAD2-0""]","回滚/清理:恢复本阶段文档改动即可;不修改历史 Issue 快照。"
|
||||||
|
"WROAD2-2","每日巡检编排脚本","新增 QA-only 一键巡检脚本 scripts/qa/run-wroad2-ops-daily.sh,复用现有公网 readiness、feature flag、企微 runtime、审批补偿拉取和 OA 归档离线读取 runner。","1) 脚本输出 artifacts/qa-flow/wroad2-ops-<timestamp>/summary.json;2) 默认不写企业微信、不创建模板、不提交审批单、不安装持久定时任务;3) 仅审批补偿归档步骤允许以进程级 WECOM_ARCHIVE_WRITE=1 + --persist-to-db 写 OA 自建留存库;4) 审批补偿固定 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback、不允许运行时猜 Secret;5) 缺配置按 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG 记录,不伪造成 PASS;6) 报告不泄露手机号、邮箱、token、secret、完整 userid、完整 template_id、完整 sp_no、原始 XML、密文、表单值、附件、评论或原始 payload。","受影响流程:每日巡检 -> 公网健康检查 -> 企微只读运行验收 -> 审批补偿写 OA 留存 -> OA 离线归档读取;验证步骤:bash -n scripts/qa/run-wroad2-ops-daily.sh;本地不要求执行 live 脚本;公网以 SYNC_ENV=0 部署后远端执行脚本生成 summary.json。","bash|node|npm","DONE","DONE","DONE","scripts/qa/run-wroad2-ops-daily.sh|deploy/trialrun/Dockerfile","[""WROAD2-1""]","回滚/清理:删除脚本或恢复镜像 Dockerfile 即可;脚本不安装 cron/systemd timer。巡检写入只限 OA 留存库,保留审计;不写企微数据。"
|
||||||
|
"WROAD2-3","本地门禁与最小回归","执行 WROAD2+OPS 本地合同、流程、文档和最小门禁,确保脚本和事实源可交付。","1) Issue CSV 校验通过;2) process baseline 和 WROAD2 issue profile 通过;3) bash 语法通过;4) 文档审计和 skill 校验通过;5) git diff --check 与 scripts/check-minimal.sh 通过。","受影响流程:开发合同 -> 本地 QA -> 可部署候选;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv;node scripts/qa/check-process-contract.mjs --baseline --json;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv --profile wecom --json;bash -n scripts/qa/run-wroad2-ops-daily.sh;node scripts/qa/audit-docs.mjs --check-registry;python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery;git diff --check;bash scripts/check-minimal.sh。","python3|node|bash|git","DONE","DONE","DONE","issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv|scripts/qa/run-wroad2-ops-daily.sh|deploy/trialrun/Dockerfile|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WROAD2-2""]","回滚/清理:若本地门禁失败,不部署;修复后重跑。"
|
||||||
|
"WROAD2-4","公网 Day 0 基线巡检","本地门禁通过后,以 SYNC_ENV=0 受控部署并远端执行一次 WROAD2+OPS 巡检,作为 3 天试用 Day 0 基线。","1) 使用 SYNC_ENV=0,不同步本地 env,不改企微后台密钥;2) /ready 正常;3) 远端脚本生成 WROAD2+OPS summary.json;4) 结论限定为 PASS_CONTROLLED_OPS_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或真实 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;5) 远端报告不泄露完整外部键或敏感值;6) 若缺 Secret、权限、可信 IP、可见范围或外部配置,记录真实阻断并停止扩大范围。","受影响流程:受控部署 -> 公网 /ready -> Day 0 巡检 -> 3 天试用基线;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;curl -fsS https://oa.hyinda.com/ready;远端执行 bash scripts/qa/run-wroad2-ops-daily.sh 或等效容器内命令;核对 artifacts/qa-flow/wroad2-ops-*/summary.json。","bash|ssh|curl","DONE","DONE","DONE","deploy/trialrun/deploy.sh|scripts/qa/run-wroad2-ops-daily.sh","[""WROAD2-3""]","回滚/清理:部署异常按既有 trialrun 部署回滚;不改远端 env,不安装定时任务。巡检写 OA 留存属于保留审计。 Day 0 已以 SYNC_ENV=0 部署并远端执行,报告 /app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json 为 PASS_WITH_FINDINGS;企微 runtime、补偿归档、离线归档读取和隐私扫描通过,finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap。"
|
||||||
|
"WROAD2-5","三天脚本化试用节奏","固定 3 天试用节奏和人工验收方式:每日脚本化触发一次巡检,结束后自动报告 + 用户确认。","1) 试用期为 3 天;2) 每日一次脚本化触发,不安装 cron/systemd timer;3) 每日报告保留审计;4) 试用结束由自动报告 + wangshunli 确认是否通过;5) 期间不启动图片 OCR、复杂 BPM、预算、ERP、银行流水导入等 P2 大功能。","受影响流程:Day 1/2/3 巡检 -> 自动汇总 -> 用户确认;验证步骤:人工或运维每日执行 scripts/qa/run-wroad2-ops-daily.sh;检查每日 summary.json;第 3 天汇总结论并记录 PASS_CONTROLLED_OPS_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。","manual|bash","DOING","TODO","TODO","docs/管理员手册.md|docs/trialrun/人工试运行报告.md","[""WROAD2-4""]","回滚/清理:试用可随时暂停;测试数据和报告保留审计,不自动删除。 Day 0 已完成;Day 1/2/3 仍需每日手动触发脚本并在结束后汇总验收。"
|
||||||
|
"WROAD2-6","后续路线排队","把 WROAD2+OPS 后续路线排队为 WARCH3 归档稳定化、WCHECK1 打卡摘要留存、WEXT1 外出/加班延期决策、完整镜像、应急、回写、RuleOps。","1) WARCH3 是 WROAD2+OPS 后优先实现合同;2) WCHECK1 只做打卡摘要和规则快照留存;3) WEXT1 外出/加班暂缓,需真实业务需要或用户批准后再做自动 POC;4) wecom_attendance_approval_mirror_v1 必须等 WARCH3、WCHECK1、外出/加班决策后再拆;5) 应急接管、恢复回写和 RuleOps 必须独立合同和人工批准。","受影响流程:WROAD2+OPS 完成 -> 后续路线排队 -> 防止跳阶段;验证步骤:rg -n ""WARCH3|WCHECK1|WEXT1|wecom_attendance_approval_mirror_v1|oa_hr_emergency_mode_v1|wecom_recovery_writeback_v1|wecom_ruleops_v1"" docs .agents/skills/hyb-oa-delivery/SKILL.md。","rg|manual","DONE","DONE","DONE","docs/企微优先开发路线图.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WROAD2-1""]","回滚/清理:路线排队只影响事实源,不启动后续阶段。"
|
||||||
|
"WROAD2-7","状态回填与中文提交","完成 Issue 状态回填、本地与公网证据登记和中文提交。","1) 所有已执行 Test_Method 真实通过或真实 SKIP;2) Issue 状态回填 DONE;3) 事实源写入 Day 0 公网报告路径;4) git diff --check 通过;5) 中文提交完成。","受影响流程:WROAD2+OPS 实施 -> 证据回写 -> 可进入 3 天试用;验证步骤:git status --short;git diff --check;git log -1 --oneline;确认提交信息包含 WROAD2。","git|manual","DONE","DONE","DONE","issues/2026-05-20_11-30-22-wroad2-ops-controlled-launch-v1.csv|docs/*|scripts/qa/run-wroad2-ops-daily.sh|.agents/skills/hyb-oa-delivery/SKILL.md","[""WROAD2-4"",""WROAD2-6""]","提交建议:WROAD2 增加受控上线每日巡检。若公网 Day 0 因外部配置 SKIP,仍可提交真实阻断事实,不伪造成 PASS。 Day 0 证据已回写;最终门禁已通过,中文提交随本合同完成。"
|
||||||
|
+185
@@ -0,0 +1,185 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -u -o pipefail
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
|
SERVER_DIR="$ROOT_DIR/server"
|
||||||
|
PUBLIC_BASE_URL="${LIVE_SMOKE_BASE_URL:-https://oa.hyinda.com}"
|
||||||
|
REPORT_DIR="${WROAD2_OPS_REPORT_DIR:-$ROOT_DIR/artifacts/qa-flow/wroad2-ops-$(date +%Y%m%d-%H%M%S)}"
|
||||||
|
SUMMARY_TXT="$REPORT_DIR/summary.txt"
|
||||||
|
STATUS=0
|
||||||
|
FINDING_COUNT=0
|
||||||
|
|
||||||
|
mkdir -p "$REPORT_DIR"
|
||||||
|
: >"$SUMMARY_TXT"
|
||||||
|
|
||||||
|
load_default_env() {
|
||||||
|
local env_file="${WROAD2_OPS_ENV_FILE:-$HOME/.hyb-oa/live-smoke.env}"
|
||||||
|
if [[ "${WROAD2_OPS_SKIP_ENV_FILE:-0}" == "1" || ! -f "$env_file" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -a
|
||||||
|
# shellcheck disable=SC1090
|
||||||
|
source "$env_file"
|
||||||
|
set +a
|
||||||
|
PUBLIC_BASE_URL="${LIVE_SMOKE_BASE_URL:-$PUBLIC_BASE_URL}"
|
||||||
|
echo "[wroad2-ops] loaded masked env file" | tee -a "$SUMMARY_TXT"
|
||||||
|
}
|
||||||
|
|
||||||
|
run_step() {
|
||||||
|
local name="$1"
|
||||||
|
shift
|
||||||
|
local log_file="$REPORT_DIR/${name}.log"
|
||||||
|
|
||||||
|
echo ">>> [wroad2-ops] $name" | tee -a "$SUMMARY_TXT"
|
||||||
|
if "$@" > >(tee "$log_file") 2>&1; then
|
||||||
|
echo "[wroad2-ops][PASS] $name" | tee -a "$SUMMARY_TXT"
|
||||||
|
else
|
||||||
|
local code="$?"
|
||||||
|
echo "[wroad2-ops][FAIL] $name exit=$code" | tee -a "$SUMMARY_TXT"
|
||||||
|
STATUS=1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_finding_step() {
|
||||||
|
local name="$1"
|
||||||
|
shift
|
||||||
|
local log_file="$REPORT_DIR/${name}.log"
|
||||||
|
|
||||||
|
echo ">>> [wroad2-ops] $name" | tee -a "$SUMMARY_TXT"
|
||||||
|
if "$@" > >(tee "$log_file") 2>&1; then
|
||||||
|
echo "[wroad2-ops][PASS] $name" | tee -a "$SUMMARY_TXT"
|
||||||
|
else
|
||||||
|
local code="$?"
|
||||||
|
echo "[wroad2-ops][FINDING] $name exit=$code" | tee -a "$SUMMARY_TXT"
|
||||||
|
FINDING_COUNT=$((FINDING_COUNT + 1))
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_shell_step() {
|
||||||
|
local name="$1"
|
||||||
|
local command="$2"
|
||||||
|
run_step "$name" bash -lc "$command"
|
||||||
|
}
|
||||||
|
|
||||||
|
run_shell_finding_step() {
|
||||||
|
local name="$1"
|
||||||
|
local command="$2"
|
||||||
|
run_finding_step "$name" bash -lc "$command"
|
||||||
|
}
|
||||||
|
|
||||||
|
write_summary_json() {
|
||||||
|
local status="PASS_CONTROLLED_OPS_READY"
|
||||||
|
local qa_status="PASS"
|
||||||
|
local notes="WROAD2+OPS Day 0/每日巡检通过:受控上线测试账号范围,归档补偿可写 OA 留存库,不写企业微信,不安装定时任务。"
|
||||||
|
if [[ "$STATUS" -ne 0 ]]; then
|
||||||
|
status="SKIP/BLOCKED_BY_EXTERNAL_CONFIG"
|
||||||
|
qa_status="SKIP"
|
||||||
|
notes="WROAD2+OPS 巡检存在失败:按真实 Secret、权限、可信 IP、可见范围、凭据或外部配置阻断处理,不伪造成 PASS。"
|
||||||
|
elif [[ "$FINDING_COUNT" -gt 0 ]]; then
|
||||||
|
status="PASS_WITH_FINDINGS"
|
||||||
|
qa_status="PASS_WITH_FINDINGS"
|
||||||
|
notes="WROAD2+OPS 巡检主链路通过,但存在可解释 finding;按事实源保留审计,不扩大范围。"
|
||||||
|
fi
|
||||||
|
|
||||||
|
QA_REPORT_DIR="$REPORT_DIR" \
|
||||||
|
QA_ISSUE_ID="WROAD2" \
|
||||||
|
QA_BASE_URL="$PUBLIC_BASE_URL" \
|
||||||
|
QA_MODE="wroad2-controlled-ops-daily" \
|
||||||
|
QA_STATUS="$qa_status" \
|
||||||
|
QA_SUMMARY_NOTES="$notes" \
|
||||||
|
node "$ROOT_DIR/scripts/qa/write-qa-summary.mjs" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
node - "$REPORT_DIR" "$PUBLIC_BASE_URL" "$status" "$notes" "$FINDING_COUNT" <<'NODE' || true
|
||||||
|
const fs = require("node:fs");
|
||||||
|
const path = require("node:path");
|
||||||
|
const { execSync } = require("node:child_process");
|
||||||
|
|
||||||
|
const [reportDir, baseURL, initialStatus, initialNotes, findingCountInput] = process.argv.slice(2);
|
||||||
|
const findingCount = Number(findingCountInput || 0);
|
||||||
|
let commit = "unknown";
|
||||||
|
try {
|
||||||
|
commit = execSync("git rev-parse --short HEAD", { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
const childReports = {};
|
||||||
|
for (const [key, file] of Object.entries({
|
||||||
|
liveReadiness: "live-smoke-readiness/summary.json",
|
||||||
|
wecomRuntimeReady: "wecom-runtime-ready/summary.json",
|
||||||
|
approvalCompensation: "wecom-approval-compensation-poc/summary.json",
|
||||||
|
approvalArchive: "wecom-approval-archive/summary.json",
|
||||||
|
})) {
|
||||||
|
const fullPath = path.join(reportDir, file);
|
||||||
|
if (!fs.existsSync(fullPath)) continue;
|
||||||
|
try {
|
||||||
|
const json = JSON.parse(fs.readFileSync(fullPath, "utf8"));
|
||||||
|
childReports[key] = {
|
||||||
|
status: json.status || json.conclusion || "UNKNOWN",
|
||||||
|
conclusion: json.conclusion || null,
|
||||||
|
reportPath: fullPath,
|
||||||
|
};
|
||||||
|
} catch {
|
||||||
|
childReports[key] = { status: "UNREADABLE", reportPath: fullPath };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const childStatuses = Object.values(childReports).map((report) => report.status);
|
||||||
|
const status = initialStatus === "PASS_CONTROLLED_OPS_READY" && childStatuses.includes("PASS_WITH_FINDINGS")
|
||||||
|
? "PASS_WITH_FINDINGS"
|
||||||
|
: initialStatus;
|
||||||
|
const notes = status === "PASS_WITH_FINDINGS"
|
||||||
|
? "WROAD2+OPS 巡检主链路通过,但子报告存在可解释 finding;按事实源保留审计,不扩大范围。"
|
||||||
|
: initialNotes;
|
||||||
|
|
||||||
|
const summary = {
|
||||||
|
issueId: "WROAD2",
|
||||||
|
mode: "wroad2-controlled-ops-daily",
|
||||||
|
status,
|
||||||
|
baseURL,
|
||||||
|
commit,
|
||||||
|
checkedAt: new Date().toISOString(),
|
||||||
|
reportDir: path.resolve(reportDir),
|
||||||
|
pilot: {
|
||||||
|
scope: "test_accounts",
|
||||||
|
applicant: "SMOKE002",
|
||||||
|
approver: "SMOKE101",
|
||||||
|
reviewer: "wangshunli",
|
||||||
|
durationDays: 3,
|
||||||
|
schedule: "manual_daily_script",
|
||||||
|
},
|
||||||
|
boundaries: {
|
||||||
|
noWeComWrites: true,
|
||||||
|
noFixtureCreation: true,
|
||||||
|
noCronOrSystemdTimer: true,
|
||||||
|
archivePersistence: "OA_DB_only_with_process_level_WECOM_ARCHIVE_WRITE",
|
||||||
|
postponed: ["outing_overtime", "deep_mirror", "emergency_mode", "recovery_writeback", "ruleops", "large_P2_features"],
|
||||||
|
},
|
||||||
|
childReports,
|
||||||
|
findingCount,
|
||||||
|
privacy: "masked prefixes/counts/status summaries only; no phone/email/token/secret/full userid/full template_id/full sp_no/raw XML/ciphertext/form values/attachments/comments/raw payload",
|
||||||
|
notes,
|
||||||
|
};
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(reportDir, "summary.json"), `${JSON.stringify(summary, null, 2)}\n`, "utf8");
|
||||||
|
console.log(`[wroad2-ops] summary=${path.join(reportDir, "summary.json")}`);
|
||||||
|
NODE
|
||||||
|
}
|
||||||
|
|
||||||
|
finish() {
|
||||||
|
write_summary_json
|
||||||
|
echo "[wroad2-ops] report=$REPORT_DIR" | tee -a "$SUMMARY_TXT"
|
||||||
|
exit "$STATUS"
|
||||||
|
}
|
||||||
|
|
||||||
|
trap finish EXIT
|
||||||
|
|
||||||
|
load_default_env
|
||||||
|
|
||||||
|
run_shell_step "public-ready" "curl -fsS '$PUBLIC_BASE_URL/ready' >/dev/null"
|
||||||
|
run_shell_finding_step "live-smoke-readiness" "QA_ISSUE_ID='WROAD2' LIVE_SMOKE_BASE_URL='$PUBLIC_BASE_URL' LIVE_SMOKE_READINESS_DIR='$REPORT_DIR/live-smoke-readiness' bash '$ROOT_DIR/scripts/qa/run-live-smoke-readiness.sh'"
|
||||||
|
run_shell_finding_step "live-feature-flags" "LIVE_SMOKE_BASE_URL='$PUBLIC_BASE_URL' node '$ROOT_DIR/scripts/qa/check-live-feature-flags.mjs' --expect payment_batch_v1=force_on --expect erp_sync=force_off --expect attendance_v1=disabled --expect attendance_unified_v1=enabled --json"
|
||||||
|
run_shell_step "wecom-runtime-ready" "cd '$SERVER_DIR' && npm run check:wecom-runtime-ready -- --live --format=json --report-dir='$REPORT_DIR/wecom-runtime-ready'"
|
||||||
|
run_shell_step "approval-compensation-persist" "cd '$SERVER_DIR' && WECOM_ARCHIVE_WRITE=1 npm run check:wecom-approval-compensation-poc -- --live --format=json --discover-template-ids --persist-to-db --report-dir='$REPORT_DIR/wecom-approval-compensation-poc'"
|
||||||
|
run_shell_step "approval-archive-offline" "cd '$SERVER_DIR' && npm run check:wecom-approval-archive -- --offline --format=json --report-dir='$REPORT_DIR/wecom-approval-archive'"
|
||||||
|
|
||||||
|
run_shell_step "report-privacy-smoke" "if grep -RInE 'access_token=[A-Za-z0-9._-]{8,}|1[3-9][0-9]{9}|[[:alnum:]._%+-]+@[[:alnum:].-]+\\.[[:alpha:]]{2,}|-----BEGIN|BEGIN [A-Z ]*KEY' '$REPORT_DIR'; then exit 1; fi"
|
||||||
在新工单中引用
屏蔽一个用户