# 齐业成费控中心（FNA）CLI

对应 `src/shortcuts/fna`，把泛微齐业成 FNA 费控中心 11 个源接口固化为 13 个 operation（预算 2 / 费用中心 3 / 借款管理 4 / 发票核销 4，其中提醒还款与催票为 prepare/apply 写链）。源资料：`/Users/zhufangyuan/Desktop/weaver-e10-qiyecheng`（指纹见 `skills/weaver-e10-qiyecheng/references/source-manifest.json`）。

## 公共前置

- 认证、profile、HTTP client 由 `src/internal/e10` 托管；业务 host 只适配 `/api/fna/` 与 `/api/app/fna/` 路径（`src/shortcuts/fna/host.ts` 的 `assertPath` 白名单）。
- 成功判定统一走 WeaResult（`success` 或 `status` 布尔 / `code==200`）；费用中心 AI 查询用 `success`，预算/借款/核销用 `status`。
- JSON 输出与错误 envelope、退出码遵循共享规则；写操作不满足确认条件返回 `confirmation.required`（exit 10），请求发出后结果不确定返回 `partial/write_uncertain`（exit 11）。

## Agent 入口

面向 Agent 时先读 `skills/weaver-e10-qiyecheng/SKILL.md`，再按入口路由读取 `references/`（catalog/budget/expense-center/loan-management/invoice-writeoff）。

## Operation 目录

| Operation | 风险 | 固定规则与要点 |
|---|---|---|
| `fna.budget.application.detail` | read | GET `preApplication/getApplicationDetail`；`requestId` 必填 |
| `fna.budget.execute.list` | read | POST `execute/getExecuteListByAi`；`current`/`pageSize` 必填；`templateId` 空仅返回表头 |
| `fna.expense.reimbursed.sum` | read | POST `expense/center/getSumReimbursedAmountByAi`；body 可空 |
| `fna.expense.loan.sum` | read | POST `expense/center/getSumLoanAmountByAi`；只认数字 ID；空 data 自动重试 2 次；已知仅统计首条记录缺陷 |
| `fna.expense.prepay.writeoff.sum` | read | POST `expense/center/selectPrepayWriteOffAmountBySkill`；body 可空 |
| `fna.loan.main.page` | read | POST `loanManagementMenu/mainPage` |
| `fna.loan.main.list` | read | POST `loanManagementMenu/mainPageList`；`current`/`pageSize`/`menuCode`/`permissionSetCode` 必填 |
| `fna.loan.remind.repay.prepare` | write | 校验 displayData 行并预览，不发送 |
| `fna.loan.remind.repay.apply` | write | 需 `confirm:true` + continuation；行指纹与 prepare 一致 |
| `fna.invoice.writeoff.summary` | read | POST `inv/financial/writeOffPageTab` |
| `fna.invoice.writeoff.list` | read | POST `inv/financial/writeOffList`；`current`/`pageSize` 必填 |
| `fna.invoice.writeoff.callticket.prepare` | write | 校验 requestids 并预览，不发送 |
| `fna.invoice.writeoff.callticket.apply` | write | 需 `confirm:true` + continuation；指纹与 prepare 一致 |

完整 schema（inputSchema/required/enum）以 `weaver-work-cli fna schema` 为准。`withheldOperations` 记录了未实现的按钮能力（确认已还、核销明细）与 ID 解析边界。

## 常用命令

Windows PowerShell：

```powershell
weaver-work-cli --json fna run fna.budget.application.detail --input-json '{"requestId":"1001"}'
weaver-work-cli --json fna run fna.expense.reimbursed.sum --input-json '{"startDate":"2026-01-01","endDate":"2026-08-31"}'
weaver-work-cli --json fna run fna.loan.main.list --input-json '{"current":1,"pageSize":20,"menuCode":"fesx_fna_borrowingManagement","permissionSetCode":"fesx_fna_borrowingManagement.default"}'
weaver-work-cli --json fna run fna.invoice.writeoff.list --input-json '{"current":1,"pageSize":20,"invoiceStatus":"unarrivedTicket"}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json fna run fna.budget.application.detail --input-json '{"requestId":"1001"}'
weaver-work-cli --json fna run fna.expense.reimbursed.sum --input-json '{"startDate":"2026-01-01","endDate":"2026-08-31"}'
weaver-work-cli --json fna run fna.loan.main.list --input-json '{"current":1,"pageSize":20,"menuCode":"fesx_fna_borrowingManagement","permissionSetCode":"fesx_fna_borrowingManagement.default"}'
weaver-work-cli --json fna run fna.invoice.writeoff.list --input-json '{"current":1,"pageSize":20,"invoiceStatus":"unarrivedTicket"}'
```

写操作（提醒还款示例）：先用 `fna.loan.main.list` 取行 → 存 UTF-8 JSON 文件 → prepare → 向用户展示预览并取得明确确认 → apply（`--input` 传同一文件，apply 文件加 `confirm:true` 与 continuation）。Windows 用 `C:\path\to\loan-rows.json`、macOS/Linux 用 `/tmp/loan-rows.json`。

## 口径与已知缺陷

- 金额单位元：`data` 原始精度字符串、`displayData` 格式化；费用中心借款/预付核销接口金额实测可能返回字符串或数字。
- 借款 `getSumLoanAmountByAi` 仅统计首条借款记录（for 循环内 return），汇报需注明口径。
- 日期口径：报销按明细费用日期、借款按流程创建时间、预付核销按核销记录创建时间。
- `menuCode`/`permissionSetCode` 环境相关，示例值需与环境核对。
- 超 2^53 的 requestId 无法用 JS 数字精确表达，保留字符串并提示人工核验（真实环境 ID 一般在安全整数内，已按数字发送）。

## 验证

```text
weaver-work-cli fna schema
weaver-work-cli --json fna run fna.budget.application.detail --input-json '{"requestId":"<占位>"}'
```

对应测试：`test/business/fna-operations.test.ts`、`test/business/fna-host.test.ts`；layout 约束见 `test/skills/layout.test.ts`。
