From e4875c58e523a0e4622bcb181d5f14a729dc390f Mon Sep 17 00:00:00 2001 From: Yuuuu <1569752928@qq.com> Date: Fri, 2 Oct 2026 17:42:43 +0800 Subject: [PATCH 1/5] docs: lock repo layout for oms + four English job packages --- .../specs/2026-10-02-repo-layout-design.md | 256 ++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 docs/superpowers/specs/2026-10-02-repo-layout-design.md diff --git a/docs/superpowers/specs/2026-10-02-repo-layout-design.md b/docs/superpowers/specs/2026-10-02-repo-layout-design.md new file mode 100644 index 0000000..bff87ae --- /dev/null +++ b/docs/superpowers/specs/2026-10-02-repo-layout-design.md @@ -0,0 +1,256 @@ +# 仓库布局:四接口一服务 + 四个英文作业包 + +| 文档属性 | 内容 | +| --- | --- | +| 日期 | 2026-10-02 | +| 状态 | 已锁定,本轮实施依据 | +| 范围 | 根目录命名与分家:`选品流程/` 整包迁到 `rpa_selection/`;占位 `rpa_cart/`、`rpa_contract/`、`rpa_rebate/`;`资料/` 并入 `docs/`。路径与文档引用。 | +| 替代 | 根 `README.md` 代码入口表;`资料/README.md`(并入后成为 `docs/README.md`) | +| 不变 | 四张表、四个口的作业语义、接口 1 行为、选品规则与拆量、`rpa_yisaiqi` 页面步骤 | + +四个 HTTP 口不是四个服务。四条作业不是一个包。代码目录名全英文。 + +--- + +## 1. 要做成什么 + +根目录变成: + +``` +AutoRpa/ + README.md + rpa_oms/ # 四个 HTTP 口,一个 FastAPI + rpa_selection/ # 选品班(现 选品流程/ 整包搬来) + rpa_cart/ # 加购 + 支付回传(占位) + rpa_contract/ # 合同班(占位) + rpa_rebate/ # 返利班(占位) + docs/ # 现行口径 + 归档(现 资料/ 并入) + rpa_yisaiqi/ # 过渡:合同班能跑之后整包删除 +``` + +完成标准: + +1. 仓库根上不再有 `选品流程/`、`资料/`。 +2. `cd rpa_selection && uv run pytest -v` 与搬前同等通过。 +3. `cd rpa_oms && uv run pytest -v` 通过。 +4. 根 README、`docs/README.md`、`.gitignore`、现行口径里的路径指向新目录。 +5. `rpa_cart/`、`rpa_contract/`、`rpa_rebate/` 各有 README 和空 `pyproject.toml`,能看出职责,没有可运行作业代码。 + +--- + +## 2. 不做什么 + +- 不加购、不支付回传、不录合同、不录返利 +- 不实现接口 2 / 3 / 4,不在 `rpa_oms` 里建空路由模块 +- 不改选品规则、班次判定、表结构、接口 1 报文 +- 不整理、不改名、不删除 `rpa_yisaiqi/`(本轮只改指向它的现行文档路径,若文档从 `资料/` 搬走) +- 不把作业改成 `app/` 包;作业保持扁平脚本(`main.py` + `job.py`) +- 不把四个作业收进 `rpa_jobs/` +- 不改 `docs/superpowers/` 里历史 spec / plan 的死链(视为归档) +- 不提交 `state_center/` 等本轮无关的已删文件(那些删除不在本 spec 范围) + +--- + +## 3. 已锁定决策 + +| 项 | 决定 | +| --- | --- | +| 四个口 | 继续住在 `rpa_oms/`。入站 1、3 在 `app/inbound/`,出站 2、4 做到时再加 `app/outbound/`。本轮只把这张地图写进 `rpa_oms/README.md` | +| 四个作业 | 根上并列:`rpa_selection`、`rpa_cart`、`rpa_contract`、`rpa_rebate` | +| `rpa_cart` | 加购(接口 2 `operateType=1`)和支付回传(`operateType=2`)同一个包。两个班次,共享表 2 | +| 选品 | `git mv 选品流程 rpa_selection`。业务代码、扁平 import、`pythonpath = ["."]` 不动 | +| 占位包 | 只有 `README.md` + `pyproject.toml`。无 `main.py`、无 `tests/` | +| 中文 | **代码目录**全英文。文档文件名可以中文。`docs/` 是目录名,里面的 `.md` 文件名不改 | +| `rpa_yisaiqi` | 过渡资产。合同页面步骤仍以它为准。等 `rpa_contract` 能跑再整包删 | +| `docs/superpowers/` | 原地不动,归档 | + +--- + +## 4. `rpa_oms`:四个口的地图 + +本轮不改 Python 文件(README 除外)。运行时仍只开放接口 1。 + +| 口 | 方向 | 底表 | 代码落点(做到再写) | +| --- | --- | --- | --- | +| 1 | 订单中心 → 本方 | `rpa_sales_goods_mapping_data` | 已有 `app/inbound/sales_goods.py`,`POST /api/oms/v1/sales-goods` | +| 2 | 本方 → 订单中心 | `rpa_cart_settlement_goods_data` | 未来 `app/outbound/`,由 `rpa_cart` 班次调用,本服务也可提供 push 客户端 | +| 3 | 订单中心 → 本方 | `rpa_purchase_contract_data` | 未来 `app/inbound/`,复用接口 1 信封/鉴权 | +| 4 | 本方 → 订单中心 | `rpa_contract_agreement_result` | 未来 `app/outbound/`,由合同/返利班次调用 | + +`rpa_oms/README.md` 用上表替换「本期只开放接口 1」的单一叙述,并写明:HTTP 收件不同步跑作业。 + +--- + +## 5. 四个作业包 + +作业语义仍以 `docs/RPA订单中心接口开发口径_20260930.md`(搬后路径)为准。包只是落点。 + +### 5.1 `rpa_selection/`(整包搬) + +来源:`选品流程/`。 + +| 动作 | 细节 | +| --- | --- | +| 移动 | `git mv 选品流程 rpa_selection` | +| `pyproject.toml` | `name = "rpa-selection"`;description 改成带新目录名。依赖、`requires-python`、pytest 配置不动 | +| `README.md` | 所有 `cd 选品流程`、`` `选品流程/` `` 改成 `rpa_selection`;口径路径改 `docs/...` | +| 代码 | 不改 import、不改 `PROJECT_ROOT = Path(__file__).resolve().parent` | +| `output/结果` | 不改名(gitignored 产物)。`.gitignore` 路径跟着父目录改 | + +搬完后包内仍是扁平脚本:`main.py`、`job.py`、`persist.py`、`repo.py`、`rules.py`、`pipeline.py`、`search_*.py`、`auth_login.py`、`tests/`。 + +### 5.2 占位包共同形态 + +`rpa_cart/`、`rpa_contract/`、`rpa_rebate/` 各两个文件,模板一致。 + +`pyproject.toml`: + +```toml +[project] +name = "rpa-" +version = "0.1.0" +description = "<一句话职责>" +requires-python = ">=3.12" +dependencies = [] + +[tool.uv] +package = false + +[[tool.uv.index]] +url = "https://pypi.tuna.tsinghua.edu.cn/simple" +default = true +``` + +三个 `name` / `description`: + +| 目录 | name | description | +| --- | --- | --- | +| `rpa_cart` | `rpa-cart` | 洁达加购与支付回传。表 2 → 接口 2。本包尚未实现。 | +| `rpa_contract` | `rpa-contract` | 洁达合同班。表 3 合单录入 → 表 4。本包尚未实现。 | +| `rpa_rebate` | `rpa-rebate` | 洁达返利班。按合同号查号、录协议 → 表 4。本包尚未实现。 | + +每个 README 必须写清: + +1. 读哪张表、写哪张表、对应哪个口 +2. 班次(选品随接口 1;加购在选品之后另班;支付另班对准 12:30 / 17:30;合同/返利一天两班,返利建议合同班之后) +3. 本期不做(占位) +4. 合同包额外一句:页面步骤目前仍在 `rpa_yisaiqi/`,本包能跑之后再删艺赛旗 + +`rpa_cart` README 须写明两个入口将来都在本包:`operateType=1` 加购、`operateType=2` 支付回传。不要暗示会拆成第五个包。 + +### 5.3 作业与表的对照(写入根 README) + +| 包 | 读 | 写 | 口 | +| --- | --- | --- | --- | +| `rpa_selection` | 表 1 `deal_flag=0` | 表 2 `operate_type=1`,表 1 处理标志 | 不直接调口;口 2 由 `rpa_cart` 推 | +| `rpa_cart` | 表 2 | 表 2 `push_status`;支付行 | 口 2 | +| `rpa_contract` | 表 3 `process_status=0` | 表 4 `actionCode=1` | 口 3 收件在 oms;口 4 回写 | +| `rpa_rebate` | 表 3 / 表 4 待查号与待录协议 | 表 4 `contractStatus=2`、`actionCode=2` | 口 4 | + +--- + +## 6. `资料/` → `docs/` + +`docs/` 已有 `superpowers/`。不要新建第二套文档根。`资料/` 拆开并入后删除空目录。 + +### 6.1 现行(`docs/` 根下) + +| 来源 | 去向 | +| --- | --- | +| `资料/README.md` | `docs/README.md`(重写路径,去掉「路径先不动」) | +| `资料/RPA订单中心接口开发口径_20260930.md` | `docs/` 同名 | +| `资料/RPA订单中心接口口径讨论纪要_20260929.md` | `docs/` 同名 | +| `资料/ddl/` | `docs/ddl/` | +| `资料/API鉴权.doc` | `docs/` | +| `资料/下一会话任务_建表.md` | `docs/` | +| `资料/合同系统录入流程.md` | `docs/` | +| `资料/合同返利系统字段映射_20260911.xlsx` | `docs/` | +| `资料/采购平台选品条件优先项_20260902.txt` | `docs/` | +| `资料/【项目方案】福建洁达采购合同RPA自动化录入需求_v20260924.docx` | `docs/` | + +口径正文里的 `` `资料/...` `` 改成 `` `docs/...` ``;`` `选品流程/` `` 改成 `` `rpa_selection/` ``。`合同系统录入流程.md` 里指向 `rpa_yisaiqi` 的句子保留。 + +### 6.2 归档(`docs/archive/`) + +一期 13 节点主链,以及未列入现行表的旧设计说明: + +- `PLAN.md` +- `一期开发任务清单_表结构_API草案.md` +- `一期需求简版说明_业务版.md` +- `界面截图证据记录.md` +- `福建洁达采购合同自动化设计说明.md` +- `采购业务RPA思路20260625.docx` +- `采购主链RPA一期实施与验收规范.md` +- `采购主链RPA一期开发规划.md` +- `采购主链RPA一期设计文档.md` +- `采购主链RPA一期需求文档_三方会审版.md` +- `采购主链RPA一期需求文档_会议整理版.md` + +这些文件内部的 `资料/` 链接不改。`docs/README.md` 的历史节指向 `docs/archive/`,并保留原警告:那套模型是「一单合同走状态机」,不要用来解释接口 1 收件箱。 + +### 6.3 必须改路径的现行文件 + +只改还在用的入口,不扫历史 spec。 + +| 文件 | 改什么 | +| --- | --- | +| `README.md`(仓库根) | 代码入口表换成五包;文档入口改 `docs/` | +| `docs/README.md` | 见 6.1 | +| `rpa_oms/README.md` | 四个口地图;文档链接 `docs/` | +| `rpa_selection/README.md` | 目录名与口径路径 | +| `rpa_yisaiqi/README.md` | `` `资料/合同系统录入流程.md` `` → `` `docs/合同系统录入流程.md` `` | +| `.gitignore` | `选品流程/` → `rpa_selection/`(`.vscode` 例外规则、secrets、`data/.auth`、`output/结果`) | +| `docs/RPA订单中心接口开发口径_20260930.md` | `选品流程/`、`资料/` 路径 | +| `docs/RPA订单中心接口口径讨论纪要_20260929.md` | `资料/` 路径 | +| `docs/ddl/列对照.md` | `资料/ddl/` → `docs/ddl/` | +| `docs/下一会话任务_建表.md` | `资料/` 路径 | +| `docs/合同系统录入流程.md` | 若正文有 `资料/` 自引用则改 | + +`docs/superpowers/specs/2026-10-02-selection-split-allocation-design.md` 里的 `选品流程/`、`资料/` 是当时实施记录,不改。 + +--- + +## 7. `.gitignore` + +现有选品相关行整段替换为: + +``` +!rpa_selection/.vscode/ +!rpa_selection/.vscode/** +rpa_selection/secrets.json +rpa_selection/data/.auth/ +rpa_selection/output/结果/*.xlsx +rpa_selection/output/结果/*.txt +``` + +其余规则不动。 + +--- + +## 8. 错误与回归 + +这是搬家,没有新的运行时错误分支。失败模式只有路径漏改: + +- 测试或文档还写 `选品流程`、`资料/`(现行入口) +- `cd 选品流程` 还出现在现行 README +- 占位包被误写成可运行作业(出现 `main.py` 却无实现) + +回归: + +```bash +cd rpa_oms && uv run pytest -v +cd rpa_selection && uv run pytest -v +``` + +选品单测不得改断言、不得为搬家放宽。若有测试读仓库根路径或写死 `选品流程`,改为相对包根(`Path(__file__).resolve().parents[1]` 已是包根的保持不动)。 + +--- + +## 9. 实施顺序 + +1. `git mv 选品流程 rpa_selection`,改该包 `pyproject.toml` 与 README +2. 建三个占位包 +3. 把 `资料/` 按第 6 节拆进 `docs/` 与 `docs/archive/`,重写 `docs/README.md` +4. 改根 README、`rpa_oms/README.md`、`rpa_yisaiqi/README.md`、`.gitignore`、搬过来的现行口径 +5. 跑第 8 节两条 pytest +6. 确认根上没有 `选品流程/`、`资料/` From ec3ae342fcdfd6eab3be14693e718b93ef6394e1 Mon Sep 17 00:00:00 2001 From: Yuuuu <1569752928@qq.com> Date: Fri, 2 Oct 2026 17:58:32 +0800 Subject: [PATCH 2/5] docs: distinguish tracked vs untracked files in layout spec --- .../specs/2026-10-02-repo-layout-design.md | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/docs/superpowers/specs/2026-10-02-repo-layout-design.md b/docs/superpowers/specs/2026-10-02-repo-layout-design.md index bff87ae..a3aae71 100644 --- a/docs/superpowers/specs/2026-10-02-repo-layout-design.md +++ b/docs/superpowers/specs/2026-10-02-repo-layout-design.md @@ -153,32 +153,46 @@ default = true `docs/` 已有 `superpowers/`。不要新建第二套文档根。`资料/` 拆开并入后删除空目录。 +已跟踪的用 `git mv`;未跟踪的用普通 `mv`,改完再 `git add`。不要对未跟踪文件跑 `git mv`。 + +仓库根 `README.md` 当前未跟踪。本轮按第 5.3 节写好后 `git add README.md`。 + +`选品流程/output/结果/.gitkeep` 已跟踪,随父目录 `git mv` 进入 `rpa_selection/output/结果/.gitkeep`。目录名保持 `结果`。 + ### 6.1 现行(`docs/` 根下) +已跟踪(`git mv`): + +| 来源 | 去向 | +| --- | --- | +| `资料/RPA订单中心接口开发口径_20260930.md` | `docs/` 同名 | +| `资料/采购平台选品条件优先项_20260902.txt` | `docs/` 同名 | + +未跟踪(`mv` + `git add`): + | 来源 | 去向 | | --- | --- | | `资料/README.md` | `docs/README.md`(重写路径,去掉「路径先不动」) | -| `资料/RPA订单中心接口开发口径_20260930.md` | `docs/` 同名 | | `资料/RPA订单中心接口口径讨论纪要_20260929.md` | `docs/` 同名 | | `资料/ddl/` | `docs/ddl/` | | `资料/API鉴权.doc` | `docs/` | | `资料/下一会话任务_建表.md` | `docs/` | | `资料/合同系统录入流程.md` | `docs/` | | `资料/合同返利系统字段映射_20260911.xlsx` | `docs/` | -| `资料/采购平台选品条件优先项_20260902.txt` | `docs/` | | `资料/【项目方案】福建洁达采购合同RPA自动化录入需求_v20260924.docx` | `docs/` | 口径正文里的 `` `资料/...` `` 改成 `` `docs/...` ``;`` `选品流程/` `` 改成 `` `rpa_selection/` ``。`合同系统录入流程.md` 里指向 `rpa_yisaiqi` 的句子保留。 ### 6.2 归档(`docs/archive/`) -一期 13 节点主链,以及未列入现行表的旧设计说明: +一期 13 节点主链,以及未列入现行表的旧设计说明。 + +已跟踪(`git mv` 进 `docs/archive/`): - `PLAN.md` - `一期开发任务清单_表结构_API草案.md` - `一期需求简版说明_业务版.md` - `界面截图证据记录.md` -- `福建洁达采购合同自动化设计说明.md` - `采购业务RPA思路20260625.docx` - `采购主链RPA一期实施与验收规范.md` - `采购主链RPA一期开发规划.md` @@ -186,6 +200,10 @@ default = true - `采购主链RPA一期需求文档_三方会审版.md` - `采购主链RPA一期需求文档_会议整理版.md` +未跟踪(`mv` + `git add` 进 `docs/archive/`): + +- `福建洁达采购合同自动化设计说明.md` + 这些文件内部的 `资料/` 链接不改。`docs/README.md` 的历史节指向 `docs/archive/`,并保留原警告:那套模型是「一单合同走状态机」,不要用来解释接口 1 收件箱。 ### 6.3 必须改路径的现行文件 @@ -249,8 +267,8 @@ cd rpa_selection && uv run pytest -v ## 9. 实施顺序 1. `git mv 选品流程 rpa_selection`,改该包 `pyproject.toml` 与 README -2. 建三个占位包 -3. 把 `资料/` 按第 6 节拆进 `docs/` 与 `docs/archive/`,重写 `docs/README.md` -4. 改根 README、`rpa_oms/README.md`、`rpa_yisaiqi/README.md`、`.gitignore`、搬过来的现行口径 +2. 建三个占位包并 `git add` +3. 按第 6 节:已跟踪文件 `git mv`,未跟踪文件 `mv` 后 `git add`;重写 `docs/README.md` +4. 写根 `README.md` 并 `git add`(该文件当前未跟踪);改 `rpa_oms/README.md`、`rpa_yisaiqi/README.md`、`.gitignore`、搬过来的现行口径 5. 跑第 8 节两条 pytest 6. 确认根上没有 `选品流程/`、`资料/` From f40822566e21086be4e8076f04b90ddf1c0e0245 Mon Sep 17 00:00:00 2001 From: Yuuuu <1569752928@qq.com> Date: Fri, 2 Oct 2026 18:02:21 +0800 Subject: [PATCH 3/5] docs: handle leftover untracked files in layout spec --- .../specs/2026-10-02-repo-layout-design.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/docs/superpowers/specs/2026-10-02-repo-layout-design.md b/docs/superpowers/specs/2026-10-02-repo-layout-design.md index a3aae71..64c8386 100644 --- a/docs/superpowers/specs/2026-10-02-repo-layout-design.md +++ b/docs/superpowers/specs/2026-10-02-repo-layout-design.md @@ -91,7 +91,7 @@ AutoRpa/ | 动作 | 细节 | | --- | --- | -| 移动 | `git mv 选品流程 rpa_selection` | +| 移动 | `git mv 选品流程 rpa_selection`。未跟踪残留(`.explore/`、`.magic/`、`output/结果` 下 html/png、本地 `.venv` / `.env`)不会跟着走,目录会留下。把需要的本地文件普通 `mv` 进 `rpa_selection/`,探测垃圾直接删,然后去掉空的 `选品流程/`。不要 `git add` `.explore` / `.magic` / 截图 | | `pyproject.toml` | `name = "rpa-selection"`;description 改成带新目录名。依赖、`requires-python`、pytest 配置不动 | | `README.md` | 所有 `cd 选品流程`、`` `选品流程/` `` 改成 `rpa_selection`;口径路径改 `docs/...` | | 代码 | 不改 import、不改 `PROJECT_ROOT = Path(__file__).resolve().parent` | @@ -230,18 +230,12 @@ default = true ## 7. `.gitignore` -现有选品相关行整段替换为: +`选品流程` 出现在两处,按前缀替换,不要当成一整段覆盖: -``` -!rpa_selection/.vscode/ -!rpa_selection/.vscode/** -rpa_selection/secrets.json -rpa_selection/data/.auth/ -rpa_selection/output/结果/*.xlsx -rpa_selection/output/结果/*.txt -``` +1. 顶部 `.vscode` 例外:`!选品流程/.vscode/` → `!rpa_selection/.vscode/`(两行) +2. 底部凭据与产物:`选品流程/secrets.json` 等四行,前缀改 `rpa_selection/` -其余规则不动。 +其余规则不动。根 README 的代码入口表仍保留 `rpa_yisaiqi` 一行,标明过渡;「五包」指 oms + 四个作业,不是把艺赛旗从入口拿掉。 --- @@ -266,7 +260,7 @@ cd rpa_selection && uv run pytest -v ## 9. 实施顺序 -1. `git mv 选品流程 rpa_selection`,改该包 `pyproject.toml` 与 README +1. `git mv 选品流程 rpa_selection`;按 5.1 处理未跟踪残留,改该包 `pyproject.toml` 与 README 2. 建三个占位包并 `git add` 3. 按第 6 节:已跟踪文件 `git mv`,未跟踪文件 `mv` 后 `git add`;重写 `docs/README.md` 4. 写根 `README.md` 并 `git add`(该文件当前未跟踪);改 `rpa_oms/README.md`、`rpa_yisaiqi/README.md`、`.gitignore`、搬过来的现行口径 From d7b3ec48e6d215f73f64de58c6f0719dbfa44e96 Mon Sep 17 00:00:00 2001 From: Yuuuu <1569752928@qq.com> Date: Fri, 2 Oct 2026 21:24:46 +0800 Subject: [PATCH 4/5] =?UTF-8?q?chore:=20=E6=A0=B9=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=94=B9=E6=88=90=20oms=20+=20=E5=9B=9B=E4=B8=AA=E8=8B=B1?= =?UTF-8?q?=E6=96=87=E4=BD=9C=E4=B8=9A=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 选品流程迁到 rpa_selection,资料并入 docs。合同页面脚本迁入 rpa_contract,删除 rpa_yisaiqi。加购和返利先占位。 --- .gitignore | 16 +- README.md | 48 ++ docs/API鉴权.doc | Bin 0 -> 460800 bytes docs/README.md | 35 + docs/RPA订单中心接口口径讨论纪要_20260929.md | 86 ++ .../RPA订单中心接口开发口径_20260930.md | 8 +- {资料 => docs/archive}/PLAN.md | 0 .../archive}/一期开发任务清单_表结构_API草案.md | 0 .../archive}/一期需求简版说明_业务版.md | 0 {资料 => docs/archive}/界面截图证据记录.md | 0 .../archive/福建洁达采购合同自动化设计说明.md | 305 +++++++ .../archive}/采购业务RPA思路20260625.docx | Bin .../archive}/采购主链RPA一期实施与验收规范.md | 0 .../archive}/采购主链RPA一期开发规划.md | 0 .../archive}/采购主链RPA一期设计文档.md | 0 .../采购主链RPA一期需求文档_三方会审版.md | 0 .../采购主链RPA一期需求文档_会议整理版.md | 0 docs/ddl/rpa_oms_staging_tables.sql | 318 +++++++ docs/ddl/列对照.md | 169 ++++ .../specs/2026-10-02-repo-layout-design.md | 2 +- ...福建洁达采购合同RPA自动化录入需求_v20260924.docx | Bin 0 -> 1902050 bytes docs/下一会话任务_建表.md | 45 + docs/合同系统录入流程.md | 75 ++ docs/合同返利系统字段映射_20260911.xlsx | Bin 0 -> 17987 bytes .../采购平台选品条件优先项_20260902.txt | 0 rpa_cart/README.md | 16 + rpa_cart/pyproject.toml | 13 + rpa_contract/README.md | 49 ++ .../runtime => rpa_contract}/accept.py | 4 +- .../apa_browser_adapter.py | 5 +- .../contract_create_node.py | 100 +-- .../contract_draft.py | 2 +- .../contract_flow_steps.py | 76 +- .../runtime => rpa_contract}/errors.py | 2 +- .../contract_create_input_dry_run.json | 4 +- .../examples/contract_draft_xyy.json | 0 .../examples/contract_draft_yyc.json | 0 rpa_contract/main.py | 4 + {rpa_yisaiqi => rpa_contract}/pdf_utils.py | 5 +- rpa_contract/pyproject.toml | 29 + .../selectors/contract_create_selectors.json | 0 .../tests/test_accept.py | 6 +- .../tests/test_apa_browser_adapter.py | 4 +- rpa_contract/tests/test_errors.py | 15 + rpa_contract/uv.lock | 480 +++++++++++ rpa_oms/README.md | 39 +- rpa_rebate/README.md | 15 + rpa_rebate/pyproject.toml | 13 + {选品流程 => rpa_selection}/.env.example | 0 {选品流程 => rpa_selection}/.python-version | 0 .../.vscode/extensions.json | 0 .../.vscode/launch.json | 0 .../.vscode/settings.json | 0 {选品流程 => rpa_selection}/README.md | 6 +- {选品流程 => rpa_selection}/auth_login.py | 0 {选品流程 => rpa_selection}/db.py | 0 {选品流程 => rpa_selection}/http_util.py | 0 {选品流程 => rpa_selection}/job.py | 0 {选品流程 => rpa_selection}/main.py | 0 {选品流程 => rpa_selection}/mall_config.py | 0 .../output/技术可行性报告_双商城查价_20260904.md | 0 .../output/结果/.gitkeep | 0 {选品流程 => rpa_selection}/persist.py | 0 {选品流程 => rpa_selection}/pipeline.py | 0 {选品流程 => rpa_selection}/pyproject.toml | 4 +- {选品流程 => rpa_selection}/repo.py | 0 {选品流程 => rpa_selection}/rules.py | 0 {选品流程 => rpa_selection}/search_yaoex.py | 0 {选品流程 => rpa_selection}/search_ybm.py | 0 .../secrets.example.json | 0 {选品流程 => rpa_selection}/tests/test_cli.py | 0 .../tests/test_decrypt.py | 0 {选品流程 => rpa_selection}/tests/test_job.py | 0 .../tests/test_legacy.py | 0 .../tests/test_mapping.py | 0 .../tests/test_oracle_repo.py | 0 .../tests/test_persist.py | 0 .../tests/test_pipeline.py | 0 .../tests/test_rules.py | 0 .../tests/test_search_key.py | 0 {选品流程 => rpa_selection}/util.py | 0 {选品流程 => rpa_selection}/uv.lock | 58 +- rpa_yisaiqi/README.md | 191 ----- rpa_yisaiqi/__init__.py | 2 - rpa_yisaiqi/__main__.py | 59 -- rpa_yisaiqi/_flow_state.py | 17 - rpa_yisaiqi/agent.py | 125 --- rpa_yisaiqi/build_multinode_seq.py | 358 -------- rpa_yisaiqi/callback_client.py | 166 ---- rpa_yisaiqi/flows/contract_create_flow.json | 151 ---- .../flows/contract_create_preview_flow.json | 42 - rpa_yisaiqi/requirements.txt | 4 - rpa_yisaiqi/runners/__init__.py | 1 - rpa_yisaiqi/runners/mock.py | 87 -- rpa_yisaiqi/runtime/__init__.py | 1 - rpa_yisaiqi/runtime/payloads.py | 37 - rpa_yisaiqi/runtime/shell.py | 28 - rpa_yisaiqi/studio/Main.seq | 790 ------------------ rpa_yisaiqi/studio/Project.pro | 46 - rpa_yisaiqi/studio/codes/GlobalFun.py | 22 - rpa_yisaiqi/studio/codes/Main.py | 200 ----- rpa_yisaiqi/studio/codes/modules/__init__.py | 12 - rpa_yisaiqi/studio/codes/modules/readme.txt | 86 -- .../codes/modules/resources/elements.json | 3 - rpa_yisaiqi/studio/codes/run_contract.py | 148 ---- rpa_yisaiqi/studio/codes/sitecustomize.py | 64 -- rpa_yisaiqi/studio/conf/marketConf.json | 1 - rpa_yisaiqi/studio/project.html | 273 ------ rpa_yisaiqi/tests/test_agent.py | 240 ------ rpa_yisaiqi/tests/test_callback_client.py | 78 -- rpa_yisaiqi/tests/test_runtime_shell.py | 75 -- rpa_yisaiqi/yisaiqi_adapter_template.py | 42 - 112 files changed, 1823 insertions(+), 3582 deletions(-) create mode 100644 README.md create mode 100644 docs/API鉴权.doc create mode 100644 docs/README.md create mode 100644 docs/RPA订单中心接口口径讨论纪要_20260929.md rename {资料 => docs}/RPA订单中心接口开发口径_20260930.md (94%) rename {资料 => docs/archive}/PLAN.md (100%) rename {资料 => docs/archive}/一期开发任务清单_表结构_API草案.md (100%) rename {资料 => docs/archive}/一期需求简版说明_业务版.md (100%) rename {资料 => docs/archive}/界面截图证据记录.md (100%) create mode 100644 docs/archive/福建洁达采购合同自动化设计说明.md rename {资料 => docs/archive}/采购业务RPA思路20260625.docx (100%) rename {资料 => docs/archive}/采购主链RPA一期实施与验收规范.md (100%) rename {资料 => docs/archive}/采购主链RPA一期开发规划.md (100%) rename {资料 => docs/archive}/采购主链RPA一期设计文档.md (100%) rename {资料 => docs/archive}/采购主链RPA一期需求文档_三方会审版.md (100%) rename {资料 => docs/archive}/采购主链RPA一期需求文档_会议整理版.md (100%) create mode 100644 docs/ddl/rpa_oms_staging_tables.sql create mode 100644 docs/ddl/列对照.md create mode 100644 docs/【项目方案】福建洁达采购合同RPA自动化录入需求_v20260924.docx create mode 100644 docs/下一会话任务_建表.md create mode 100644 docs/合同系统录入流程.md create mode 100644 docs/合同返利系统字段映射_20260911.xlsx rename {资料 => docs}/采购平台选品条件优先项_20260902.txt (100%) create mode 100644 rpa_cart/README.md create mode 100644 rpa_cart/pyproject.toml create mode 100644 rpa_contract/README.md rename {rpa_yisaiqi/runtime => rpa_contract}/accept.py (98%) rename {rpa_yisaiqi => rpa_contract}/apa_browser_adapter.py (99%) rename {rpa_yisaiqi => rpa_contract}/contract_create_node.py (78%) rename {rpa_yisaiqi => rpa_contract}/contract_draft.py (98%) rename {rpa_yisaiqi => rpa_contract}/contract_flow_steps.py (96%) rename {rpa_yisaiqi/runtime => rpa_contract}/errors.py (86%) rename {rpa_yisaiqi => rpa_contract}/examples/contract_create_input_dry_run.json (93%) rename {rpa_yisaiqi => rpa_contract}/examples/contract_draft_xyy.json (100%) rename {rpa_yisaiqi => rpa_contract}/examples/contract_draft_yyc.json (100%) create mode 100644 rpa_contract/main.py rename {rpa_yisaiqi => rpa_contract}/pdf_utils.py (80%) create mode 100644 rpa_contract/pyproject.toml rename {rpa_yisaiqi => rpa_contract}/selectors/contract_create_selectors.json (100%) rename rpa_yisaiqi/tests/test_runtime_accept.py => rpa_contract/tests/test_accept.py (92%) rename {rpa_yisaiqi => rpa_contract}/tests/test_apa_browser_adapter.py (86%) create mode 100644 rpa_contract/tests/test_errors.py create mode 100644 rpa_contract/uv.lock create mode 100644 rpa_rebate/README.md create mode 100644 rpa_rebate/pyproject.toml rename {选品流程 => rpa_selection}/.env.example (100%) rename {选品流程 => rpa_selection}/.python-version (100%) rename {选品流程 => rpa_selection}/.vscode/extensions.json (100%) rename {选品流程 => rpa_selection}/.vscode/launch.json (100%) rename {选品流程 => rpa_selection}/.vscode/settings.json (100%) rename {选品流程 => rpa_selection}/README.md (96%) rename {选品流程 => rpa_selection}/auth_login.py (100%) rename {选品流程 => rpa_selection}/db.py (100%) rename {选品流程 => rpa_selection}/http_util.py (100%) rename {选品流程 => rpa_selection}/job.py (100%) rename {选品流程 => rpa_selection}/main.py (100%) rename {选品流程 => rpa_selection}/mall_config.py (100%) rename {选品流程 => rpa_selection}/output/技术可行性报告_双商城查价_20260904.md (100%) rename {选品流程 => rpa_selection}/output/结果/.gitkeep (100%) rename {选品流程 => rpa_selection}/persist.py (100%) rename {选品流程 => rpa_selection}/pipeline.py (100%) rename {选品流程 => rpa_selection}/pyproject.toml (78%) rename {选品流程 => rpa_selection}/repo.py (100%) rename {选品流程 => rpa_selection}/rules.py (100%) rename {选品流程 => rpa_selection}/search_yaoex.py (100%) rename {选品流程 => rpa_selection}/search_ybm.py (100%) rename {选品流程 => rpa_selection}/secrets.example.json (100%) rename {选品流程 => rpa_selection}/tests/test_cli.py (100%) rename {选品流程 => rpa_selection}/tests/test_decrypt.py (100%) rename {选品流程 => rpa_selection}/tests/test_job.py (100%) rename {选品流程 => rpa_selection}/tests/test_legacy.py (100%) rename {选品流程 => rpa_selection}/tests/test_mapping.py (100%) rename {选品流程 => rpa_selection}/tests/test_oracle_repo.py (100%) rename {选品流程 => rpa_selection}/tests/test_persist.py (100%) rename {选品流程 => rpa_selection}/tests/test_pipeline.py (100%) rename {选品流程 => rpa_selection}/tests/test_rules.py (100%) rename {选品流程 => rpa_selection}/tests/test_search_key.py (100%) rename {选品流程 => rpa_selection}/util.py (100%) rename {选品流程 => rpa_selection}/uv.lock (99%) delete mode 100644 rpa_yisaiqi/README.md delete mode 100644 rpa_yisaiqi/__init__.py delete mode 100644 rpa_yisaiqi/__main__.py delete mode 100644 rpa_yisaiqi/_flow_state.py delete mode 100644 rpa_yisaiqi/agent.py delete mode 100644 rpa_yisaiqi/build_multinode_seq.py delete mode 100644 rpa_yisaiqi/callback_client.py delete mode 100644 rpa_yisaiqi/flows/contract_create_flow.json delete mode 100644 rpa_yisaiqi/flows/contract_create_preview_flow.json delete mode 100644 rpa_yisaiqi/requirements.txt delete mode 100644 rpa_yisaiqi/runners/__init__.py delete mode 100644 rpa_yisaiqi/runners/mock.py delete mode 100644 rpa_yisaiqi/runtime/__init__.py delete mode 100644 rpa_yisaiqi/runtime/payloads.py delete mode 100644 rpa_yisaiqi/runtime/shell.py delete mode 100644 rpa_yisaiqi/studio/Main.seq delete mode 100644 rpa_yisaiqi/studio/Project.pro delete mode 100644 rpa_yisaiqi/studio/codes/GlobalFun.py delete mode 100644 rpa_yisaiqi/studio/codes/Main.py delete mode 100644 rpa_yisaiqi/studio/codes/modules/__init__.py delete mode 100644 rpa_yisaiqi/studio/codes/modules/readme.txt delete mode 100644 rpa_yisaiqi/studio/codes/modules/resources/elements.json delete mode 100644 rpa_yisaiqi/studio/codes/run_contract.py delete mode 100644 rpa_yisaiqi/studio/codes/sitecustomize.py delete mode 100644 rpa_yisaiqi/studio/conf/marketConf.json delete mode 100644 rpa_yisaiqi/studio/project.html delete mode 100644 rpa_yisaiqi/tests/test_agent.py delete mode 100644 rpa_yisaiqi/tests/test_callback_client.py delete mode 100644 rpa_yisaiqi/tests/test_runtime_shell.py delete mode 100644 rpa_yisaiqi/yisaiqi_adapter_template.py diff --git a/.gitignore b/.gitignore index dc26bc1..4101acd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ .DS_Store .idea/ .vscode/ +!rpa_selection/.vscode/ +!rpa_selection/.vscode/** *.swp # Python @@ -17,11 +19,10 @@ __pycache__/ # Node node_modules/ -state_center_web/dist/ # Local runtime / agent .runtime/ -rpa_yisaiqi/screenshots/ +rpa_contract/screenshots/ rpa-chrome-profile/ **/chrome-profile/ .tmp/ @@ -30,15 +31,16 @@ rpa-chrome-profile/ .claude/ .superpowers/ -# Duplicate / scratch -state_center_副本/ - -# Local M5 credentials -state_center/fixtures/m5/connection.local.json .env .env.* !.env.example +# 选品凭据与运行结果 +rpa_selection/secrets.json +rpa_selection/data/.auth/ +rpa_selection/output/结果/*.xlsx +rpa_selection/output/结果/*.txt + # Media (keep docs, drop recordings and extracted frames) *.mp4 video_frames_v2/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..dcd74ed --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# AutoRpa + +福建洁达采购 RPA。仓库里叠过两套产品,以本文「现行」为准。 + +## 现行工作 + +订单中心四接口 + 四条独立作业。对码在订单中心做完,本方收件、选品、录合同/返利、回写结果。 + +| 口 | 方向 | 底表 | 状态 | +| --- | --- | --- | --- | +| 1 | 订单中心 → 本方 | `rpa_sales_goods_mapping_data` | 进行中(`rpa_oms/`) | +| 2 | 本方 → 订单中心 | `rpa_cart_settlement_goods_data` | 选品已落表,push_status=0,路径仍空 | +| 3 | 订单中心 → 本方 | `rpa_purchase_contract_data` | 复用接口 1 接收壳 | +| 4 | 本方 → 订单中心 | `rpa_contract_agreement_result` | 路径空,先造数 | + +作业互不串联:选品读表 1,合同/返利读表 3。HTTP 收件不同步跑 RPA。 + +## 代码入口 + +| 目录 | 身份 | +| --- | --- | +| `rpa_oms/` | 四个 HTTP 口,一个 FastAPI。先做接口 1 | +| `rpa_selection/` | 选品班。读表 1 `deal_flag=0`,双平台选品,写表 2 | +| `rpa_cart/` | 加购 + 支付回传(占位)。表 2 → 口 2 | +| `rpa_contract/` | 合同班。页面录入在本包;表 3 合单、接口 4 尚未接 | +| `rpa_rebate/` | 返利班(占位)。查号、录协议 → 表 4 | + +| 包 | 读 | 写 | 口 | +| --- | --- | --- | --- | +| `rpa_selection` | 表 1 `deal_flag=0` | 表 2 `operate_type=1`,表 1 处理标志 | 不直接调口;口 2 由 `rpa_cart` 推 | +| `rpa_cart` | 表 2 | 表 2 `push_status`;支付行 | 口 2 | +| `rpa_contract` | 表 3 `process_status=0` | 表 4 `actionCode=1` | 口 3 收件在 oms;口 4 回写 | +| `rpa_rebate` | 表 3 / 表 4 待查号与待录协议 | 表 4 `contractStatus=2`、`actionCode=2` | 口 4 | + +合同怎么录、合单和回写口径见 `docs/合同系统录入流程.md`。页面控件以 `rpa_contract/contract_flow_steps.py` 为准。 + +新接口只进 `rpa_oms/`。起服务见 [`rpa_oms/README.md`](rpa_oms/README.md)。 + +## 文档入口 + +现行口径和表:[`docs/README.md`](docs/README.md)。 + +开发对照只看: + +- `docs/RPA订单中心接口开发口径_20260930.md` +- `docs/ddl/rpa_oms_staging_tables.sql` + +一期主链需求/设计在 `docs/archive/`;`docs/superpowers/specs/` 里 9 月 12–13 日的四流程稿也是归档。作业语义以口径为准。 diff --git a/docs/API鉴权.doc b/docs/API鉴权.doc new file mode 100644 index 0000000000000000000000000000000000000000..07ba3f6b65db0ce179c4258fabf5b84d1fc39f40 GIT binary patch literal 460800 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%0AByTBbPw^!7_SDKfzFmh|L-%G% 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

acC1O1M*R)Y$ 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

4tp|3zPBg|Fe!?>)xlC)TUMJ#5Ylv|V>jq%pK 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 literal 0 HcmV?d00001 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..3f1a7cf --- /dev/null +++ b/docs/README.md @@ -0,0 +1,35 @@ +# docs + +按现行 / 作业资产 / 历史查阅。 + +## 现行(订单中心四接口) + +| 文件 | 用途 | +| --- | --- | +| `RPA订单中心接口开发口径_20260930.md` | 开发对照,作业语义以这份为准 | +| `RPA订单中心接口口径讨论纪要_20260929.md` | 为什么这么定 | +| `ddl/rpa_oms_staging_tables.sql` | Oracle 11.2 四张暂存表 | +| `ddl/列对照.md` | 与接口 Excel 列对照 | +| `API鉴权.doc` | 调订单中心时的 Token;接口 1、3 入站鉴权由本方定 | +| `下一会话任务_建表.md` | 建表任务说明(已完成) | +| `合同系统录入流程.md` | 合同班合单、尽调、提交、回写;页面步骤指向 `rpa_contract` | + +接口字段、示例报文仍以 Excel 为准(当前 `Downloads/RPA与订单中心接口设计_20260922.xlsx`)。Excel 与口径冲突时,作业语义听口径。 + +`ddl 2/`、`ddl.zip` 与 `ddl/` 重复,不要用。 + +## 作业资产 + +| 文件 | 用途 | +| --- | --- | +| `合同返利系统字段映射_20260911.xlsx` | 返利总单默认值 | +| `采购平台选品条件优先项_20260902.txt` | 选品规则原文 | +| `【项目方案】福建洁达采购合同RPA自动化录入需求_v20260924.docx` | 页面操作参考 | + +## 历史(一期 13 节点主链) + +见 `archive/`:`PLAN.md`、一期需求/设计/开发规划/验收规范、`一期开发任务清单_表结构_API草案.md`、会议整理版、业务思路 docx、界面截图记录。 + +那套模型是「一单合同走状态机」。不要用它解释接口 1 的收件箱。 + +`superpowers/` 是 8–9 月设计稿,同样视为归档。 diff --git a/docs/RPA订单中心接口口径讨论纪要_20260929.md b/docs/RPA订单中心接口口径讨论纪要_20260929.md new file mode 100644 index 0000000..025a699 --- /dev/null +++ b/docs/RPA订单中心接口口径讨论纪要_20260929.md @@ -0,0 +1,86 @@ +# 纪要:RPA 与订单中心接口口径 + +- 时间:2026-09-29~30 +- 材料:`RPA与订单中心接口设计_20260922.xlsx`、`API鉴权.doc`、`docs/合同返利系统字段映射_20260911.xlsx`、方案 v20260924 +- 开发对照:`docs/RPA订单中心接口开发口径_20260930.md` + +--- + +## 一、接口怎么理解 + +四个口不是四条流程一对一。1 是选品收件,2 是加购/支付回传,3 是合同和返利共用的行级下发,4 是合同/协议结果回写。 + +对码不在本方。接口 1 的 `goodsId` 进来就已经有了。 + +表 1 是收件箱:订单中心推 → 本方接口写入表 1 → 选品捞待处理。不是手填。 + +--- + +## 二、已锁定论 + +### 合单 + +福建确认一天两班(中午、下午)。Albert:未处理行按供应商汇总,一个供应商一份合同、一份返利。 + +锁定: + +- 按 `supplierId` 合,不用 `omsId`,不用名称 +- 任务启动冻结快照,新进数据下一班 +- 头字段取该班该供应商第一行(同一班账期不一致也照录,算对方发数) +- 下午再来的另开一份,不改上午已录合同 +- 带合同号的协议重录不进按供应商合 + +### 选品 / 加购 / 支付 + +- 搜商城用条形码 +- 规则不过:表 1 失败 + 表 2 `status=2` + 原因;默认对方**不重推**该 `omsId`(口头再跟对方确认,开发按已锁) +- `status` 只用于加购。支付:有单号就推 `operateType=2`,没付不推,没有支付失败 +- 入站一单一个品种;多平台凑数量时同一 `omsId` 多行、`multi_platform_flag=1`、必须同包回(已进表 2) +- 付款仍是采购员两班;支付回传另排,选品不等 + +### 合同 / 返利回写(业务确认) + +合同选 A:提交后回起草;成功=返利中心能搜到合同号。搜不到下一班再搜,不重录合同。 + +返利选 A 的字面、按现场做:据说无审批流,点送审即成功,点完就回成功并带协议号。以后若开审批流再改。 + +查号挂在返利班,不单开查状态任务。合同班只录+提交+回起草。 + +这期不做「合同审完订单中心再推返利包」。二次推只用接口已写的「协议失败带合同号重录」。 + +暂存号不用于返利。返利用正式合同号去搜。 + +### 这期范围 + +- 只做账期。`customerType` 预留,对方固定传 1。预付项目组不做。 +- 平台字典:66 = 1 药城,48 = 药帮忙 +- 返利总单默认值跟映射表,不跟方案 5.5 +- MDM 码对方说默认必填,按必填做;示例没带先不管 +- 失败行数量/单价必填、总价舍入:先不管,真数据出问题打回订单中心 + +### 联调 + +- Token 测试地址已有;测试用户名 `rpa`(密码不入库) +- 接口 2、4 路径暂时空着,先造数 + +--- + +## 三、讨论过程中澄清过的误解 + +1. 接口 3 一次可以很多行,那是批量收件,不是「已经合成一份合同」。合单是本方按供应商做的。 +2. 供应商编码不是小药药商家名。这期用对方给的 MDM/供应商字段填页面。 +3. 接口 4 示例是 RPA 把结果推出去,不是「合同审批完通知订单中心再推返利」。 +4. `contractStatus=2` 不是让本方重复录合同,是提交后按班次去返利**查号**。 +5. 审批/驳回不是本方作业;但合同成功码按接口仍要查号,不能理解成「填完报成功」。 +6. 加购「跳过」最后不单开状态码,用失败+原因;和多平台同包回不是一件事。 + +--- + +## 四、后置(不挡造数) + +- 接口 2、4 真实 URL;`orgSecret` 是否要带;订单中心调本方 1、3 的鉴权 +- 只凑到一部分数量时,多平台报文怎么组 +- 返利测试环境确认:点送审后协议号是否立即可见 +- 加购业务失败不重推:口头跟对方确认一句 + +开发以口径文档为准。本文只记为什么这么定。 diff --git a/资料/RPA订单中心接口开发口径_20260930.md b/docs/RPA订单中心接口开发口径_20260930.md similarity index 94% rename from 资料/RPA订单中心接口开发口径_20260930.md rename to docs/RPA订单中心接口开发口径_20260930.md index 3aad6ae..9f87f79 100644 --- a/资料/RPA订单中心接口开发口径_20260930.md +++ b/docs/RPA订单中心接口开发口径_20260930.md @@ -5,9 +5,9 @@ 依据: - `Downloads/RPA与订单中心接口设计_20260922.xlsx`(以当时最新一份为准) -- `资料/API鉴权.doc` -- `资料/合同返利系统字段映射_20260911.xlsx`(返利总单默认值) -- `选品流程/` 既有规则 +- `docs/API鉴权.doc` +- `docs/合同返利系统字段映射_20260911.xlsx`(返利总单默认值) +- `rpa_selection/` 既有规则 --- @@ -47,7 +47,7 @@ 商城查询键:**条形码**。批准文号照收,不拿去搜。 -规则沿用 `选品流程/`(自营仓、毛利 ≥ 4%、效期 ≥ 12 个月;两平台合并后按仓序拆量,凑齐计划量才算成功)。毛利用 `salePrice`,拆量目标用 `planPurchaseQty`。详见 `docs/superpowers/specs/2026-10-02-selection-split-allocation-design.md`。 +规则沿用 `rpa_selection/`(自营仓、毛利 ≥ 4%、效期 ≥ 12 个月;两平台合并后按仓序拆量,凑齐计划量才算成功)。毛利用 `salePrice`,拆量目标用 `planPurchaseQty`。详见 `docs/superpowers/specs/2026-10-02-selection-split-allocation-design.md`。 ### 3.2 加购结果(接口 2,`operateType=1`) diff --git a/资料/PLAN.md b/docs/archive/PLAN.md similarity index 100% rename from 资料/PLAN.md rename to docs/archive/PLAN.md diff --git a/资料/一期开发任务清单_表结构_API草案.md b/docs/archive/一期开发任务清单_表结构_API草案.md similarity index 100% rename from 资料/一期开发任务清单_表结构_API草案.md rename to docs/archive/一期开发任务清单_表结构_API草案.md diff --git a/资料/一期需求简版说明_业务版.md b/docs/archive/一期需求简版说明_业务版.md similarity index 100% rename from 资料/一期需求简版说明_业务版.md rename to docs/archive/一期需求简版说明_业务版.md diff --git a/资料/界面截图证据记录.md b/docs/archive/界面截图证据记录.md similarity index 100% rename from 资料/界面截图证据记录.md rename to docs/archive/界面截图证据记录.md diff --git a/docs/archive/福建洁达采购合同自动化设计说明.md b/docs/archive/福建洁达采购合同自动化设计说明.md new file mode 100644 index 0000000..45d190f --- /dev/null +++ b/docs/archive/福建洁达采购合同自动化设计说明.md @@ -0,0 +1,305 @@ +# 福建洁达采购合同全链条自动化设计说明 + +| 项目 | 内容 | +| --- | --- | +| 文档名称 | 福建洁达采购合同全链条自动化设计说明 | +| 版本 | V1.1 | +| 日期 | 2026-09-12 | +| 适用范围 | 福建广药洁达医药有限公司采购合同、返利中心录入及相关选品作业 | +| 依据 | 《福建洁达采购合同全链条 RPA 自动化录入流程》《采购平台选品条件优先项》(2026-09-02)《合同返利系统字段映射》(2026-09-11) | +| 配套文档 | 《福建洁达四流程技术实现说明》 | + +--- + +## 1. 概述 + +本方案在现有状态中心与 RPA 执行体系上,将采购作业拆为四条可独立启动的流程:选品采购、订单对码、合同录入、返利录入。 + +页面操作仍由 RPA 完成。**四条流程启动后的第一步,均由状态中心调用订单中心接口取数(或回写),写入 RPA 数据库并标记处理状态;接口未成功返回前,RPA 不得打开下游系统页面。** 操作人员可在状态中心启动作业、查看进度与业务数据,亦可按约定时间自动触发。 + +四条流程独立启动、独立失败、独立重跑,互不占用同一执行会话。同一笔业务单据的数据仍按「选品 → 对码 → 合同 → 返利」顺序衔接;前置数据未就绪时,后续流程不予执行,并记录原因。 + +--- + +## 2. 建设目标 + +1. 提供统一操作入口:状态中心可分别启动四条流程,或按计划定时运行。 +2. 保证过程可见:每条作业的执行状态、当前环节、责任角色、业务数据及失败原因可在状态中心查询。 +3. 保证数据可追溯:订单中心接口数据先落入 RPA 库,记录待处理、成功、失败等状态,支持失败重拉与按单重跑。 +4. 保证规则可落地:选品按已确认的优先项执行;合同、返利按字段映射表填写,不自行推断未提供的字段。 +5. 控制操作风险:商城付款、未尽调客户的合同填报,均不由机器人自动完成。 + +--- + +## 3. 总体方案 + +``` +状态中心(启动 / 监控 / 待办) + │ + │ 每条流程启动后,先调订单中心接口 + ▼ +订单中心 ──读取──► 销售总单 / 客户主数据 / 货品 / 计划员 / 账期 + ◄──回写── 对码结果 + │ + ▼ +RPA 数据库(带处理状态:待处理 / 成功 / 失败) + │ + │ 仅 STATUS=就绪 时,RPA 才点页面 + ▼ +1号药城 / 药帮忙 / 合同系统 / 返利中心 +``` + +| 流程 | 业务内容 | 建议运行时点 | +| --- | --- | --- | +| 选品采购 | 读取订单中心销售总单,在 1 号药城、药帮忙按规则选品,生成待复核清单 | 销售订单产生之后 | +| 订单对码 | 将选品结果或手工单字段写入订单中心对码表 | 选品完成,或手工单到达之后 | +| 合同录入 | 按字段映射填写合同系统 | 对码完成,且客户已尽调 | +| 返利录入 | 按合同号填写返利中心总单与细单 | 合同编号已生成 | + +启动某一流程仅处理该流程范围内的任务,不强制四条连续一次跑完。某流程缺少必要数据或处于人工待办时,系统停留在该流程并写明原因,不向下游系统提交空数据。 + +--- + +## 4. 订单中心接口 + +订单中心是本方案的**唯一业务数据源**。合同系统、返利中心页面上由 RPA 填写、且映射表标注「从订单中心获取」的字段,一律经本接口取得,禁止从商城页面抄写,禁止在 RPA 脚本中写死。 + +调用原则: + +1. **只由状态中心调用。** RPA 不直连订单中心。状态中心将结果写入 RPA 库后,机器人只读本地就绪数据。 +2. **先接口、后页面。** 接口失败、超时、缺必填字段,本流程记失败并停止,不打开 1 号药城、合同系统或返利中心。 +3. **原文留存。** 每次响应写入 RPA 库(含原始报文),状态中心可查,便于对账与重拉。 +4. **按单幂等。** 同一业务键重复启动不重复插入成功数据;失败允许按同一键重拉。 + +正式 URL、鉴权、报文格式由订单中心提供后锁定。本节先按业务能力列出必须具备的接口;能力未齐备前,对应流程不得对生产系统写入。 + +### 4.1 接口清单与调用时点 + +| 序号 | 接口能力 | 方向 | 调用流程 | 调用时点 | 失败后果 | +| --- | --- | --- | --- | --- | --- | +| A | 销售总单查询 | 读 | 选品 | 选品启动后、上商城之前 | 选品停止,不上 1 号药城 / 药帮忙 | +| B | 销售明细查询 | 读 | 选品 | 紧接 A,按总单取行 | 同 A;无批准文号的行单独失败,不阻断其他行 | +| C | 对码结果回写 | 写 | 对码 | 选品完成或手工单识别之后 | 对码失败;合同不得启动 | +| D | 对码商家与货品查询 | 读 | 对码 / 合同 | 回写成功后,取客户名称、货品编码等 | 合同不得启动 | +| E | 客户主数据查询 | 读 | 合同 | 合同启动后、打开合同系统之前 | 合同停止;不填报 | +| F | 合同货品明细查询 | 读 | 合同 | 与 E 一并发起 | 同 E;缺货品行则本单失败 | +| G | 计划员与采购员对照查询 | 读 | 返利 | 返利启动后、打开返利中心之前 | 返利停止;不猜测计划员 | +| H | 返利源数据查询 | 读 | 返利 | 与 G 一并发起 | 缺供应商编码、订单号或货源细单号则本单失败 | + +### 4.2 各接口必须返回的字段 + +字段名称以订单中心正式文档为准。下表为业务含义,来源为流程图及《合同返利系统字段映射》。 + +**A 销售总单查询** + +入参:订单日期(默认前一日),可选供应商名称。 +出参(每张总单):销售总单号、订单日期、客户(商家)名称、客户编码、来源、总金额。 + +**B 销售明细查询** + +入参:销售总单号。 +出参(每行):订单号、批准文号、通用名、规格、生产厂家、采购数量、**销售价格**(选品计算 5% 毛利的基准,不得用采购价替代)、平台商品编码(如有)。 + +无批准文号、无销售价格的行标记失败,不进入商城查询。 + +**C 对码结果回写** + +入参:订单号或销售明细行标识,以及待写入对码表的字段(品名、规格、厂家、批准文号、数量、选品后的货品信息等)。 +出参:写入是否成功。 +说明:对应流程图「提取需要字段数据,传到订单中心对码功能数据表」。此为写接口,与查询分开。 + +**D 对码商家与货品查询** + +入参:客户(商家)标识、货品匹配条件。 +出参:客户名称、客户编码;货品编码、货品名称、注册证号、规格、单位。 +说明:合同系统「客户名称」对照此处填写,不以商城店铺名为准。 + +**E 客户主数据查询** + +入参:客户编码或客户名称。 +出参: + +| 字段 | 用途 | +| --- | --- | +| 客户名称、客户编码 | 合同「客户名称」 | +| 客户类型(预付 / 账期) | 预付:合同版本「我司定制」、预付款「是」、付款期限 1 天;账期:合同版本「非格式合同」、预付款「否」、付款期限取账期天数 | +| 账期天数 | 仅账期客户必填;映射表要求订单中心具备该维护功能 | +| 合同签订日期、开始日期、结束日期 | 合同对应日期字段 | +| 尽调状态(如订单中心有维护) | 未尽调则本份合同跳过并邮件通知采购员。若尽调仅在合同系统回显,则本字段改为页面读取,须在接口说明书中明确 | + +**F 合同货品明细查询** + +入参:销售总单号或订单号。 +出参(每行):货品编码、货品名称、注册证号、规格、单位、数量、单价。 +说明:用于合同明细导入模板。数量、单价取订单中心,不取商城实时价。 + +**G 计划员与采购员对照查询** + +入参:计划员或采购员。可按全量或按供应商查询。 +出参:计划员、对应采购员。 +说明:映射表注明「订单中心需要有计划员和采购员的对应关系」。无对照则返利总单「计划员」无法填写。 + +**H 返利源数据查询** + +入参:合同号或销售总单号。 +出参:供应商编码、返利单位编码、计划员、订单号、货源细单号;以及细单行的货品编码、数量、含税协议单价。 +说明:返利细单「细单备注」填订单号,「货源细单 ID」填货源细单号,二者均须订单中心给出。 + +### 4.3 调用顺序(按一笔业务) + +``` +选品启动 + ① 调 A、B → 写入销售总单/明细(就绪) → 再上商城查价 + A/B 失败 → 选品失败,不上商城 + +对码启动 + ② 调 C 回写对码表 → 调 D 取客户与货品编码 → 就绪后方可合同 + C/D 失败 → 对码失败,合同入口拒绝启动 + +合同启动 + ③ 调 E、F → 客户类型/账期/日期/货品行就绪 → 再打开合同系统 + 必填缺失 → 合同失败,不填报 + 未尽调 → 本单跳过,邮件通知,处理下一单 + +返利启动 + ④ 调 G、H → 计划员对照与细单源数据就绪 → 再打开返利中心 + 必填缺失 → 返利失败,不猜测字段 +``` + +四条流程仍可分时、分别启动;上述顺序约束的是**同一业务键上的数据依赖**,不是强制一次连续跑完四条。 + +### 4.4 失败与重试 + +| 情形 | 处理 | +| --- | --- | +| 网络超时、服务不可用 | 本流程失败,可重拉接口;不启动 RPA | +| 返回成功但缺必填字段 | 本单失败,记录缺失字段名称;不启动 RPA | +| 部分明细行缺批准文号或销售价格 | 仅该行失败,其余行继续 | +| 对码回写失败 | 对码失败;合同、返利不得启动 | +| 客户未尽调 | 本合同跳过(不算接口失败),发邮件,继续下一客户 | +| 计划员对照不存在 | 返利失败,不使用默认计划员 | + +重拉只覆盖失败数据,已成功入库的记录不得覆盖。 + +### 4.5 需订单中心确认的事项 + +1. 上表 A–H 的正式地址、鉴权方式、测试与生产环境。 +2. 客户类型、账期天数、计划员与采购员对照、货源细单号是否已有维护功能与查询接口(映射表已提出,当前文档未提供接口说明)。 +3. 尽调状态以订单中心为准,或以合同系统选择客户后的回显为准。 +4. 对码功能数据表的写入接口是否已经开放;未开放则对码流程无法闭环。 + +未确认前,状态中心可用测试数据验证「调用 → 入库 → 状态中心可见」链路,不对生产订单中心与生产合同系统写入。 + +--- + +## 5. 流程说明 + +### 5.1 选品采购 + +调用接口 A、B,取得销售总单及明细后,按批准文号检索 1 号药城、药帮忙商品,依据第 6 节规则筛选。筛选结果形成待复核清单,由采购人员确认后再付款。机器人不执行支付操作。 + +已完成的商城登录与按文号查询能力纳入本流程复用,查询结果改为写入 RPA 库及状态中心,不再以桌面表格作为唯一产出。 + +### 5.2 订单对码 + +调用接口 C,将选品结果或 DocAgent 识别的手工单字段写入订单中心对码功能数据表;再调用接口 D,取得客户名称与货品编码。合同系统中的「客户名称」以接口 D 为准。 + +### 5.3 合同录入 + +调用接口 E、F 取得客户主数据与货品明细后,依据《合同返利系统字段映射》填写合同系统。录入方式分为系统自动生成、RPA 填写、无需填写三类;RPA 仅处理标注为「RPA」的字段。 + +客户未完成主体尽调时:向采购员发送邮件,本份合同跳过,继续处理后续合同,不中断整批作业。 + +客户类型为预付时:合同版本类型取「我司定制」,是否预付款为「是」,付款期限为 1 天。 +客户类型为账期时:合同版本类型取「非格式合同」,是否预付款为「否」,付款期限取接口 E 返回的账期天数。 + +### 5.4 返利录入 + +调用接口 G、H 取得计划员对照与返利源数据后,按合同号查询采购协议,填写总单必填项并导入细单。提交失败转为人工处理,不循环强行提交。 + +--- + +## 6. 选品规则 + +规则依据《采购平台选品条件优先项》(2026-09-02)。下列第 1 至 4 项须同时满足,再比较仓库距离。销售价格以订单中心接口 B 为准。 + +1. **自营仓**:仅在已勾选的自营仓范围内选择。 +2. **价格**:与销售价格比较,毛利不低于 5%。 +3. **有效期**:大于等于 12 个月。 +4. **库存**:库存数量不低于本单采购数量。 +5. **仓库距离**:在满足以上条件后,按下列自营仓顺序优先选择距离较近的仓库: + + 1. 广东壹号药业有限公司 + 2. 昆山亿方药业有限公司 + 3. 湖北亿昊药业有限公司 + 4. 天津壹号药业有限公司 + 5. 重庆亿昊药业有限公司 + 6. 重庆壹号医药有限公司 + 7. 湖南壹号药业股份有限公司 + 8. 辽宁亿昊药业有限公司 + 9. 河南壹号医药有限公司 + 10. 甘肃壹号云医药有限责任公司企业店 + 11. 陕西壹号药业有限公司 + +现有商城查价程序实现了双平台登录与按批准文号取价,可作为选品流程的查询能力复用。该程序现行过滤逻辑与上述规则存在差异,上线口径以本节为准: + +| 现有查价程序 | 本方案采用规则 | +| --- | --- | +| 按采购价格上下浮动 10% 过滤 | 相对销售价格,毛利不低于 5% | +| 未限定自营仓范围 | 仅在上述 11 家自营仓内选择 | +| 未校验库存是否覆盖采购数量 | 库存须大于等于采购数量 | +| 结果输出至本地表格 | 结果写入 RPA 库,并在状态中心展示 | + +--- + +## 7. 合同与返利录入口径 + +字段来源、录入方式以《合同返利系统字段映射》(2026-09-11)为准。凡标注「从订单中心获取」的字段,取值路径见第 4 节,缺项不得提交。 + +合同、返利中标注为默认值的字段(如结算类型「收支双向」、付款方式「电汇」、税率 0.13、承付模式及参数等)按映射表执行,不在运行时另行解释。 + +--- + +## 8. 运行监控 + +状态中心提供以下可见信息: + +- 当日四条流程的执行数量,以及成功、失败、等待人工处理的分布 +- 单笔作业的当前环节与责任角色 +- 订单中心各接口最近一次调用时间、成功或失败、缺失字段 +- 选品候选、毛利是否达标、选用自营仓 +- 合同关键字段(客户名称、金额、日期、尽调结果) +- 返利总单编号、细单导入结果 +- 失败原因及是否允许按本流程重跑 + +接口数据写入 RPA 测试库,并标记处理状态(待处理 / 处理中 / 成功 / 失败 / 跳过)。状态中心同步展示,作为业务查询与问题定位的依据。 + +--- + +## 9. 本期范围 + +**本期包含** + +- 四条流程的独立启动、定时启动与状态查询 +- 订单中心接口 A–H 的调用、入库与失败停机 +- 选品查询能力与优先项规则落地 +- 合同、返利按映射表自动填写 + +**本期不包含** + +- 机器人自动完成商城支付 +- 对未尽调客户自动填写并提交合同 +- 将四条流程拆成互不共享状态的独立工具 +- 在订单中心正式接口就绪前对生产系统写入 + +流程图未包含 M5 采购订单。若现场仍需 M5 作业,另行立项,不纳入本四条流程。 + +--- + +## 10. 待确认事项 + +1. 四条流程采用统一状态中心入口、分别启动;允许只运行其中一条。 +2. 选品正式规则以第 6 节为准;现有查价程序仅复用登录与查询能力。 +3. 订单中心按第 4.5 节提供接口说明书,并确认客户类型、账期天数、计划员对照、货源细单号、对码回写、尽调来源。未齐备前,合同与返利不得按缺省猜测值提交。 + +上述事项确认后,按《福建洁达四流程技术实现说明》实施。实施顺序为:先完成订单中心取数入库与状态中心可见,再接入选品、合同与返利。 diff --git a/资料/采购业务RPA思路20260625.docx b/docs/archive/采购业务RPA思路20260625.docx similarity index 100% rename from 资料/采购业务RPA思路20260625.docx rename to docs/archive/采购业务RPA思路20260625.docx diff --git a/资料/采购主链RPA一期实施与验收规范.md b/docs/archive/采购主链RPA一期实施与验收规范.md similarity index 100% rename from 资料/采购主链RPA一期实施与验收规范.md rename to docs/archive/采购主链RPA一期实施与验收规范.md diff --git a/资料/采购主链RPA一期开发规划.md b/docs/archive/采购主链RPA一期开发规划.md similarity index 100% rename from 资料/采购主链RPA一期开发规划.md rename to docs/archive/采购主链RPA一期开发规划.md diff --git a/资料/采购主链RPA一期设计文档.md b/docs/archive/采购主链RPA一期设计文档.md similarity index 100% rename from 资料/采购主链RPA一期设计文档.md rename to docs/archive/采购主链RPA一期设计文档.md diff --git a/资料/采购主链RPA一期需求文档_三方会审版.md b/docs/archive/采购主链RPA一期需求文档_三方会审版.md similarity index 100% rename from 资料/采购主链RPA一期需求文档_三方会审版.md rename to docs/archive/采购主链RPA一期需求文档_三方会审版.md diff --git a/资料/采购主链RPA一期需求文档_会议整理版.md b/docs/archive/采购主链RPA一期需求文档_会议整理版.md similarity index 100% rename from 资料/采购主链RPA一期需求文档_会议整理版.md rename to docs/archive/采购主链RPA一期需求文档_会议整理版.md diff --git a/docs/ddl/rpa_oms_staging_tables.sql b/docs/ddl/rpa_oms_staging_tables.sql new file mode 100644 index 0000000..8d83e91 --- /dev/null +++ b/docs/ddl/rpa_oms_staging_tables.sql @@ -0,0 +1,318 @@ +-- RPA 库暂存表 DDL(Oracle 11.2) +-- 依据:/Users/yuuuu/Downloads/RPA与订单中心接口设计_20260922.xlsx(2026-09-30 16:24) +-- 四张「数据表」sheet。表1 已去掉 oms_orderno;表1 fid 为 number(19); +-- 表2 push_time/create_time/update_time 为 date(create_time 写作 dateNOT NULL,按 date NOT NULL)。 +-- 库版本:11.2.0.4,无 IDENTITY;表1/2/4 自增用 SEQUENCE + BEFORE INSERT 触发器(fid 为空才取号,等同 BY DEFAULT)。 +-- 标识符不超过 30 字节。 +-- 范围:仅本方 RPA 库四张暂存表。不是订单中心对码功能表。本方不建对码引擎。 +-- oms_id 一律 number(20)。 +-- +-- 待确认(Excel 现稿保留,未删列): +-- 表1 oms_id:需确认字段属性是否与订单中心一致。 +-- 表2 bar_code:确认同一条形码是否可出现在多个订单;普通索引已建,不作为主键。 +-- 表3 fid:确认重录协议时是否生成新的 fid。 +-- 表3 purchase_tax_rate:确认税率是百分数还是小数比例;Excel 备注为 0.13 表示 13%。 +-- 表3 contract_entry_status:确认是否保留 need_contract 旧字段名;现稿用本列名。 +-- +-- 主键 / 唯一(Excel 未写主键时按任务口径): +-- 表1 fid 自增主键;oms_id 幂等唯一(因此补 NOT NULL)。 +-- 表2、表4 fid 本方序列主键。 +-- 表3 fid 订单中心来源唯一序号,作主键。 + +-- --------------------------------------------------------------------------- +-- 1. 销售商品对码数据(Excel 名;实为选品收件箱) +-- --------------------------------------------------------------------------- +CREATE TABLE rpa_sales_goods_mapping_data ( + oms_id NUMBER(20) NOT NULL, + bar_code VARCHAR2(40), + order_date DATE, + sale_price NUMBER(16,4), + sale_qty NUMBER(10), + plan_purchase_qty NUMBER(10), + goods_id VARCHAR2(20), + goods_name VARCHAR2(200), + goods_spec VARCHAR2(100), + manufacturer VARCHAR2(100), + approval_no VARCHAR2(100), + unit VARCHAR2(20), + customer_id VARCHAR2(20), + customer_name VARCHAR2(200), + create_time DATE, + create_user_id NUMBER(10), + create_user_name VARCHAR2(20), + update_time DATE, + update_user_id NUMBER(10), + update_user_name VARCHAR2(20), + deal_flag NUMBER(2) DEFAULT 0 NOT NULL, + deal_result VARCHAR2(200), + deal_time DATE, + deal_user_id NUMBER(10), + deal_user_name VARCHAR2(20), + fid NUMBER(19) NOT NULL, + org_code VARCHAR2(10), + goods_mdm_code VARCHAR2(100), + customer_mdm_code VARCHAR2(100), + CONSTRAINT pk_rpa_sgmd PRIMARY KEY (fid), + CONSTRAINT uk_rpa_sgmd_oms_id UNIQUE (oms_id) +); + +CREATE SEQUENCE seq_rpa_sgmd_fid + START WITH 1 + INCREMENT BY 1 + NOMAXVALUE + NOCYCLE + NOCACHE; + +CREATE OR REPLACE TRIGGER trg_rpa_sgmd_bi +BEFORE INSERT ON rpa_sales_goods_mapping_data +FOR EACH ROW +WHEN (new.fid IS NULL) +BEGIN + SELECT seq_rpa_sgmd_fid.NEXTVAL INTO :NEW.fid FROM dual; +END; +/ + +COMMENT ON TABLE rpa_sales_goods_mapping_data IS '销售商品对码数据(选品收件箱)。订单中心推入,按 oms_id 幂等。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.oms_id IS '订单中心序号。已存在则不入库、不重跑。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.bar_code IS '条形码。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.order_date IS '订单日期。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.sale_price IS '销售单价。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.sale_qty IS '销售数量。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.plan_purchase_qty IS '计划采购量。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.goods_id IS '货品ID。入站时已有,本方不做对码。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.goods_name IS '品名。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.goods_spec IS '货品规格。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.manufacturer IS '厂家。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.approval_no IS '国药准字/注册证号。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.unit IS '单位。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.customer_id IS '客户ID。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.customer_name IS '客户名称。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.create_time IS '创建时间。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.create_user_id IS '创建人ID。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.create_user_name IS '创建人名称。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.update_time IS '更新时间。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.update_user_id IS '更新人ID。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.update_user_name IS '更新人名称。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.deal_flag IS '处理标志。0-待处理、1-处理成功、2-处理失败、3-处理中。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.deal_result IS '处理结果。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.deal_time IS '处理时间。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.deal_user_id IS '处理人ID。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.deal_user_name IS '处理人名称。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.fid IS '序号,自增序列。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.org_code IS '货主编码。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.goods_mdm_code IS '货品MDM码。'; +COMMENT ON COLUMN rpa_sales_goods_mapping_data.customer_mdm_code IS '客户MDM码。'; + +-- --------------------------------------------------------------------------- +-- 2. 加购及结算商品数据(加购/支付回传缓冲) +-- --------------------------------------------------------------------------- +CREATE TABLE rpa_cart_settlement_goods_data ( + fid NUMBER(19,0) NOT NULL, + operate_type NUMBER(2,0) NOT NULL, + oms_id NUMBER(20) NOT NULL, + platform_type NUMBER(4,0) NOT NULL, + supplier_name VARCHAR2(200 CHAR) NOT NULL, + bar_code VARCHAR2(40 CHAR) NOT NULL, + purchase_price NUMBER(16,4) NOT NULL, + purchase_qty NUMBER(10,0) NOT NULL, + purchase_total NUMBER(16,4) NOT NULL, + status NUMBER(2,0), + fail_reason VARCHAR2(500 CHAR), + pay_order_no VARCHAR2(40 CHAR), + pay_order_dtl_id VARCHAR2(40 CHAR), + push_status NUMBER(1,0) DEFAULT 0 NOT NULL, + push_result VARCHAR2(500 CHAR), + push_time DATE, + create_time DATE NOT NULL, + update_time DATE, + create_user_id NUMBER(19,0), + create_user_name VARCHAR2(100 CHAR), + update_user_id NUMBER(19,0), + update_user_name VARCHAR2(100 CHAR), + org_code VARCHAR2(10), + multi_platform_flag NUMBER(1,0) DEFAULT 0 NOT NULL, + CONSTRAINT pk_rpa_csgd PRIMARY KEY (fid) +); + +CREATE SEQUENCE seq_rpa_csgd_fid + START WITH 1 + INCREMENT BY 1 + NOMAXVALUE + NOCYCLE + NOCACHE; + +CREATE OR REPLACE TRIGGER trg_rpa_csgd_bi +BEFORE INSERT ON rpa_cart_settlement_goods_data +FOR EACH ROW +WHEN (new.fid IS NULL) +BEGIN + SELECT seq_rpa_csgd_fid.NEXTVAL INTO :NEW.fid FROM dual; +END; +/ + +CREATE INDEX idx_rpa_csgd_bar_code + ON rpa_cart_settlement_goods_data (bar_code); + +COMMENT ON TABLE rpa_cart_settlement_goods_data IS '加购及结算商品数据。RPA 回传缓冲;同一 oms_id 多平台多行。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.fid IS 'RPA记录技术主键;接口推送时作为业务回执关联键。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.operate_type IS '操作类型。1-加购,2-支付。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.oms_id IS '订单中心单据编号。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.platform_type IS '平台类型。48 药帮忙,66 1药城。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.supplier_name IS '供应商名称。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.bar_code IS '条形码。保留前导零,不作为单独主键。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.purchase_price IS '采购单价。金额精度4位小数。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.purchase_qty IS '采购数量。大于0。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.purchase_total IS '采购总价。金额字段统一 NUMBER(16,4)。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.status IS '整单采购状态。仅加购:1-成功,2-失败。支付填空。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.fail_reason IS '整单采购失败原因。status=2时填写。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.pay_order_no IS '支付订单号。支付场景填写。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.pay_order_dtl_id IS '支付订单明细ID。支付场景填写。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.push_status IS '推送状态。0-未推送,1-推送成功,2-推送失败,3-推送中。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.push_result IS '推送结果。保存订单中心回执或失败原因。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.push_time IS '推送时间。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.create_time IS '创建时间。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.update_time IS '更新时间。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.create_user_id IS '创建人ID。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.create_user_name IS '创建人名称。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.update_user_id IS '更新人ID。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.update_user_name IS '更新人名称。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.org_code IS '货主编码。'; +COMMENT ON COLUMN rpa_cart_settlement_goods_data.multi_platform_flag IS '多平台满足标志。同一 OMS ID 多行时为1,须同报文返回。'; + +-- --------------------------------------------------------------------------- +-- 3. 采购合同数据 +-- --------------------------------------------------------------------------- +CREATE TABLE rpa_purchase_contract_data ( + fid NUMBER(19,0) NOT NULL, + oms_id NUMBER(20) NOT NULL, + supplier_id VARCHAR2(20 CHAR) NOT NULL, + supplier_name VARCHAR2(200 CHAR) NOT NULL, + contract_sign_date DATE NOT NULL, + contract_start_date DATE NOT NULL, + contract_end_date DATE NOT NULL, + payment_term NUMBER(5,0) NOT NULL, + goods_id VARCHAR2(20 CHAR) NOT NULL, + goods_name VARCHAR2(200 CHAR) NOT NULL, + reg_no VARCHAR2(100 CHAR) NOT NULL, + spec VARCHAR2(100 CHAR) NOT NULL, + unit VARCHAR2(20 CHAR) NOT NULL, + qty NUMBER(16,4) NOT NULL, + purchase_tax_rate NUMBER(8,4) NOT NULL, + unit_price NUMBER(16,4) NOT NULL, + goods_source_id VARCHAR2(20 CHAR) NOT NULL, + purchaser_id VARCHAR2(20 CHAR) NOT NULL, + purchaser_name VARCHAR2(100 CHAR) NOT NULL, + planner_id VARCHAR2(20 CHAR) NOT NULL, + planner_name VARCHAR2(100 CHAR) NOT NULL, + contract_entry_status NUMBER(1,0), + contract_no VARCHAR2(40 CHAR), + process_status NUMBER(1,0) DEFAULT 0 NOT NULL, + process_result VARCHAR2(1000 CHAR), + process_time TIMESTAMP(6), + create_time TIMESTAMP(6) NOT NULL, + update_time TIMESTAMP(6), + org_code VARCHAR2(10), + customer_type NUMBER(2,0) NOT NULL, + goods_mdm_code VARCHAR2(100), + supplier_mdm_code VARCHAR2(100), + CONSTRAINT pk_rpa_pcd PRIMARY KEY (fid) +); + +COMMENT ON TABLE rpa_purchase_contract_data IS '采购合同数据。订单中心行级下发;按来源 fid 幂等。'; +COMMENT ON COLUMN rpa_purchase_contract_data.fid IS '订单中心来源稳定唯一序号。'; +COMMENT ON COLUMN rpa_purchase_contract_data.oms_id IS '订单中心单据编号。'; +COMMENT ON COLUMN rpa_purchase_contract_data.supplier_id IS '供应商ID。'; +COMMENT ON COLUMN rpa_purchase_contract_data.supplier_name IS '供应商名称。'; +COMMENT ON COLUMN rpa_purchase_contract_data.contract_sign_date IS '合同签订日期。'; +COMMENT ON COLUMN rpa_purchase_contract_data.contract_start_date IS '合同开始日期。'; +COMMENT ON COLUMN rpa_purchase_contract_data.contract_end_date IS '合同结束日期。'; +COMMENT ON COLUMN rpa_purchase_contract_data.payment_term IS '付款期限(账期),单位:天。'; +COMMENT ON COLUMN rpa_purchase_contract_data.goods_id IS '货品ID。'; +COMMENT ON COLUMN rpa_purchase_contract_data.goods_name IS '货品名称。'; +COMMENT ON COLUMN rpa_purchase_contract_data.reg_no IS '注册证号。'; +COMMENT ON COLUMN rpa_purchase_contract_data.spec IS '规格。'; +COMMENT ON COLUMN rpa_purchase_contract_data.unit IS '单位。'; +COMMENT ON COLUMN rpa_purchase_contract_data.qty IS '数量。支持非整数采购数量。'; +COMMENT ON COLUMN rpa_purchase_contract_data.purchase_tax_rate IS '进货税率。0.13 表示 13%。'; +COMMENT ON COLUMN rpa_purchase_contract_data.unit_price IS '采购单价。'; +COMMENT ON COLUMN rpa_purchase_contract_data.goods_source_id IS '货源细单ID。'; +COMMENT ON COLUMN rpa_purchase_contract_data.purchaser_id IS '采购员ID。'; +COMMENT ON COLUMN rpa_purchase_contract_data.purchaser_name IS '采购员。'; +COMMENT ON COLUMN rpa_purchase_contract_data.planner_id IS '计划员ID。'; +COMMENT ON COLUMN rpa_purchase_contract_data.planner_name IS '计划员。'; +COMMENT ON COLUMN rpa_purchase_contract_data.contract_entry_status IS '录入合同状态。null-首次下发,0-失败,1-成功。'; +COMMENT ON COLUMN rpa_purchase_contract_data.contract_no IS '采购合同号。失败重录协议时填写。'; +COMMENT ON COLUMN rpa_purchase_contract_data.process_status IS '处理状态。0-待处理,1-成功,2-失败,3-处理中。'; +COMMENT ON COLUMN rpa_purchase_contract_data.process_result IS '处理结果。保存RPA处理结果或失败原因。'; +COMMENT ON COLUMN rpa_purchase_contract_data.process_time IS '处理时间。'; +COMMENT ON COLUMN rpa_purchase_contract_data.create_time IS '创建时间。'; +COMMENT ON COLUMN rpa_purchase_contract_data.update_time IS '更新时间。'; +COMMENT ON COLUMN rpa_purchase_contract_data.org_code IS '货主编码。'; +COMMENT ON COLUMN rpa_purchase_contract_data.customer_type IS '客户类型。口径本期固定 1 账期。'; +COMMENT ON COLUMN rpa_purchase_contract_data.goods_mdm_code IS '货品MDM码。'; +COMMENT ON COLUMN rpa_purchase_contract_data.supplier_mdm_code IS '供应商MDM码。'; + +-- --------------------------------------------------------------------------- +-- 4. 合同协议录入结果 +-- --------------------------------------------------------------------------- +CREATE TABLE rpa_contract_agreement_result ( + fid NUMBER(19,0) NOT NULL, + oms_id NUMBER(20) NOT NULL, + action_code NUMBER(2,0) NOT NULL, + contract_status NUMBER(2,0), + contract_fail_reason VARCHAR2(500 CHAR), + contract_no VARCHAR2(40 CHAR), + agreement_status NUMBER(2,0), + agreement_fail_reason VARCHAR2(500 CHAR), + agreement_id VARCHAR2(40 CHAR), + agreement_dtl_id VARCHAR2(40 CHAR), + push_status NUMBER(1,0) DEFAULT 0 NOT NULL, + push_result VARCHAR2(500 CHAR), + push_time TIMESTAMP(6), + create_time TIMESTAMP(6) NOT NULL, + update_time TIMESTAMP(6), + create_user_id NUMBER(19,0), + create_user_name VARCHAR2(100 CHAR), + update_user_id NUMBER(19,0), + update_user_name VARCHAR2(100 CHAR), + org_code VARCHAR2(10), + CONSTRAINT pk_rpa_car PRIMARY KEY (fid) +); + +CREATE SEQUENCE seq_rpa_car_fid + START WITH 1 + INCREMENT BY 1 + NOMAXVALUE + NOCYCLE + NOCACHE; + +CREATE OR REPLACE TRIGGER trg_rpa_car_bi +BEFORE INSERT ON rpa_contract_agreement_result +FOR EACH ROW +WHEN (new.fid IS NULL) +BEGIN + SELECT seq_rpa_car_fid.NEXTVAL INTO :NEW.fid FROM dual; +END; +/ + +COMMENT ON TABLE rpa_contract_agreement_result IS '合同协议录入结果。本方回写缓冲。'; +COMMENT ON COLUMN rpa_contract_agreement_result.fid IS 'RPA记录技术主键;接口推送时作为回执关联键。'; +COMMENT ON COLUMN rpa_contract_agreement_result.oms_id IS '订单中心单据编号。'; +COMMENT ON COLUMN rpa_contract_agreement_result.action_code IS '回传动作。1-合同,2-返利协议。'; +COMMENT ON COLUMN rpa_contract_agreement_result.contract_status IS '合同状态。1-起草,2-成功,3-失败。'; +COMMENT ON COLUMN rpa_contract_agreement_result.contract_fail_reason IS '合同录入失败原因。'; +COMMENT ON COLUMN rpa_contract_agreement_result.contract_no IS '合同编号。'; +COMMENT ON COLUMN rpa_contract_agreement_result.agreement_status IS '返利协议状态。1-成功,2-失败。'; +COMMENT ON COLUMN rpa_contract_agreement_result.agreement_fail_reason IS '协议录入失败原因。'; +COMMENT ON COLUMN rpa_contract_agreement_result.agreement_id IS '采购协议总单ID。'; +COMMENT ON COLUMN rpa_contract_agreement_result.agreement_dtl_id IS '采购协议细单ID。'; +COMMENT ON COLUMN rpa_contract_agreement_result.push_status IS '推送状态。0-未推送,1-推送成功,2-推送失败,3-推送中。'; +COMMENT ON COLUMN rpa_contract_agreement_result.push_result IS '推送结果。'; +COMMENT ON COLUMN rpa_contract_agreement_result.push_time IS '推送时间。'; +COMMENT ON COLUMN rpa_contract_agreement_result.create_time IS '创建时间。'; +COMMENT ON COLUMN rpa_contract_agreement_result.update_time IS '更新时间。'; +COMMENT ON COLUMN rpa_contract_agreement_result.create_user_id IS '创建人ID。'; +COMMENT ON COLUMN rpa_contract_agreement_result.create_user_name IS '创建人名称。'; +COMMENT ON COLUMN rpa_contract_agreement_result.update_user_id IS '更新人ID。'; +COMMENT ON COLUMN rpa_contract_agreement_result.update_user_name IS '更新人名称。'; +COMMENT ON COLUMN rpa_contract_agreement_result.org_code IS '货主编码。'; diff --git a/docs/ddl/列对照.md b/docs/ddl/列对照.md new file mode 100644 index 0000000..6962f36 --- /dev/null +++ b/docs/ddl/列对照.md @@ -0,0 +1,169 @@ +# 四张暂存表 ↔ Excel 列对照 + +依据:`/Users/yuuuu/Downloads/RPA与订单中心接口设计_20260922.xlsx`(2026-09-30 16:24)四张「数据表」sheet。 +DDL:`docs/ddl/rpa_oms_staging_tables.sql`(Oracle 11.2)。 +Excel 无表英文名;表名按中文意译,未用拼音。 + +库是 11.2.0.4:表1/2/4 自增不用 IDENTITY,改 SEQUENCE + 触发器;约束/索引名压到 30 字节内。列集合未改。 + +约束(非列):表1 `oms_id` 唯一、`fid` 主键;表2/4 `fid` 主键;表3 `fid` 主键(来源唯一);表2 `bar_code` 普通索引。 + +## 总览 + +| Excel 数据表 | DDL 表名 | 列数 | 缺列 | 多列 | +| --- | --- | ---: | --- | --- | +| 销售商品对码数据 | `rpa_sales_goods_mapping_data` | 29 | 无 | 无 | +| 加购及结算商品数据 | `rpa_cart_settlement_goods_data` | 24 | 无 | 无 | +| 采购合同数据 | `rpa_purchase_contract_data` | 32 | 无 | 无 | +| 合同协议录入结果 | `rpa_contract_agreement_result` | 20 | 无 | 无 | + +口径点名且 Excel 已有的列,按所在表落地:`org_code`(四张都有);MDM 在表1(货品/客户)、表3(货品/供应商);`customer_type` 仅表3;`multi_platform_flag` 仅表2;`push_status` 在表2、表4。 + +--- + +## 1. 销售商品对码数据 + +Excel 待确认:`oms_id` 属性是否与订单中心一致。 + +| Excel 序号 | 中文名 | 英文名 | Excel 属性 | DDL | 差异 | +| ---: | --- | --- | --- | --- | --- | +| 1 | 订单中心序号 | oms_id | number(20) | NUMBER(20) NOT NULL | 幂等唯一,补 NOT NULL + UNIQUE | +| 2 | 条形码 | bar_code | varchar2(40) | VARCHAR2(40) | 同 | +| 3 | 订单日期 | order_date | date | DATE | 同 | +| 4 | 销售单价 | sale_price | number(16,4) | NUMBER(16,4) | 同 | +| 5 | 销售数量 | sale_qty | number(10) | NUMBER(10) | 同 | +| 6 | 计划采购量 | plan_purchase_qty | number(10) | NUMBER(10) | 同 | +| 7 | 货品ID | goods_id | varchar2(20) | VARCHAR2(20) | 同 | +| 8 | 品名 | goods_name | varchar2(200) | VARCHAR2(200) | 同 | +| 9 | 货品规格 | goods_spec | varchar2(100) | VARCHAR2(100) | 同 | +| 10 | 厂家 | manufacturer | varchar2(100) | VARCHAR2(100) | 同 | +| 11 | 国药准字/注册证号 | approval_no | varchar2(100) | VARCHAR2(100) | 同 | +| 12 | 单位 | unit | varchar2(20) | VARCHAR2(20) | 同 | +| 13 | 客户ID | customer_id | varchar2(20) | VARCHAR2(20) | 同 | +| 14 | 客户名称 | customer_name | varchar2(200) | VARCHAR2(200) | 同 | +| 15 | 创建时间 | create_time | date | DATE | 同 | +| 16 | 创建人ID | create_user_id | number(10) | NUMBER(10) | 同 | +| 17 | 创建人名称 | create_user_name | varchar2(20) | VARCHAR2(20) | 同 | +| 18 | 更新时间 | update_time | date | DATE | 同 | +| 19 | 更新人ID | update_user_id | number(10) | NUMBER(10) | 同 | +| 20 | 更新人名称 | update_user_name | varchar2(20) | VARCHAR2(20) | 同 | +| 21 | 处理标志 | deal_flag | number(2) DEFAULT 0 NOT NULL | NUMBER(2) DEFAULT 0 NOT NULL | 同 | +| 22 | 处理结果 | deal_result | varchar2(200) | VARCHAR2(200) | 同 | +| 23 | 处理时间 | deal_time | date | DATE | 同 | +| 24 | 处理人ID | deal_user_id | number(10) | NUMBER(10) | 同 | +| 25 | 处理人名称 | deal_user_name | varchar2(20) | VARCHAR2(20) | 同 | +| 26 | 序号 | fid | number(19) 自增序列 | NUMBER(19) 主键 + SEQUENCE/触发器 | 11g 无 IDENTITY | +| 27 | 货主编码 | org_code | varchar2(10) | VARCHAR2(10) | 同 | +| 28 | 货品MDM码 | goods_mdm_code | varchar2(100) | VARCHAR2(100) | 同 | +| 29 | 客户MDM码 | customer_mdm_code | varchar2(100) | VARCHAR2(100) | 同 | + +相对接口 sheet:数据表多审计字段、`deal_*`、`fid`。接口业务字段均在表中。`oms_orderno` 已删。 + +--- + +## 2. 加购及结算商品数据 + +Excel 待确认:同一条形码是否可出现在多个订单。平台字典已写入备注:48 药帮忙,66 1药城。 + +| Excel 序号 | 中文名 | 英文名 | Excel 属性 | DDL | 差异 | +| ---: | --- | --- | --- | --- | --- | +| 1 | 序号 | fid | number(19,0) IDENTITY | NUMBER(19,0) 主键 + SEQUENCE/触发器 | 11g 无 IDENTITY,主键补 NOT NULL | +| 2 | 操作类型 | operate_type | number(2,0) NOT NULL | 同 | 无 | +| 3 | 订单中心单据编号 | oms_id | number(20) NOT NULL | 同 | 无 | +| 4 | 平台类型 | platform_type | number(4,0) NOT NULL | 同 | 无 | +| 5 | 供应商名称 | supplier_name | varchar2(200 char) NOT NULL | 同 | 无 | +| 6 | 条形码 | bar_code | varchar2(40 char) NOT NULL | 同;普通索引 | 无 | +| 7 | 采购单价 | purchase_price | number(16,4) NOT NULL | 同 | 无 | +| 8 | 采购数量 | purchase_qty | number(10,0) NOT NULL | 同 | 无 | +| 9 | 采购总价 | purchase_total | number(16,4) NOT NULL | 同 | 无 | +| 10 | 整单采购状态 | status | number(2,0) | 同 | 无 | +| 11 | 整单采购失败原因 | fail_reason | varchar2(500 char) | 同 | 无 | +| 12 | 支付订单号 | pay_order_no | varchar2(40 char) | 同 | 无 | +| 13 | 支付订单明细ID | pay_order_dtl_id | varchar2(40 char) | 同 | 无 | +| 14 | 推送状态 | push_status | number(1,0) DEFAULT 0 NOT NULL | 同 | 无 | +| 15 | 推送结果 | push_result | varchar2(500 char) | 同 | 无 | +| 16 | 推送时间 | push_time | date | DATE | 无 | +| 17 | 创建时间 | create_time | date NOT NULL | DATE NOT NULL | Excel 写作 dateNOT NULL | +| 18 | 更新时间 | update_time | date | DATE | 无 | +| 19 | 创建人ID | create_user_id | number(19,0) | 同 | 无 | +| 20 | 创建人名称 | create_user_name | varchar2(100 char) | 同 | 无 | +| 21 | 更新人ID | update_user_id | number(19,0) | 同 | 无 | +| 22 | 更新人名称 | update_user_name | varchar2(100 char) | 同 | 无 | +| 23 | 货主编码 | org_code | varchar2(10) | 同 | 无 | +| 24 | 多平台满足标志 | multi_platform_flag | number(1,0) DEFAULT 0 NOT NULL | 同 | 无 | + +相对接口 sheet:数据表多 `push_*`、审计、`multi_platform_flag`。 + +--- + +## 3. 采购合同数据 + +Excel 待确认:重录协议是否新 `fid`;税率百分数还是小数;是否保留 `need_contract` 旧名。 + +| Excel 序号 | 中文名 | 英文名 | Excel 属性 | DDL | 差异 | +| ---: | --- | --- | --- | --- | --- | +| 1 | 序号 | fid | number(19,0) NOT NULL | 同,主键(来源唯一) | 无 | +| 2 | 订单中心单据编号 | oms_id | number(20) NOT NULL | 同 | 无 | +| 3 | 供应商ID | supplier_id | varchar2(20 char) NOT NULL | 同 | 无 | +| 4 | 供应商名称 | supplier_name | varchar2(200 char) NOT NULL | 同 | 无 | +| 5 | 合同签订日期 | contract_sign_date | date NOT NULL | 同 | 无 | +| 6 | 合同开始日期 | contract_start_date | date NOT NULL | 同 | 无 | +| 7 | 合同结束日期 | contract_end_date | date NOT NULL | 同 | 无 | +| 8 | 付款期限(账期) | payment_term | number(5,0) NOT NULL | 同 | 无 | +| 9 | 货品ID | goods_id | varchar2(20 char) NOT NULL | 同 | 无 | +| 10 | 货品名称 | goods_name | varchar2(200 char) NOT NULL | 同 | 无 | +| 11 | 注册证号 | reg_no | varchar2(100 char) NOT NULL | 同 | 无 | +| 12 | 规格 | spec | varchar2(100 char) NOT NULL | 同 | 无 | +| 13 | 单位 | unit | varchar2(20 char) NOT NULL | 同 | 无 | +| 14 | 数量 | qty | number(16,4) NOT NULL | 同 | 无 | +| 15 | 进货税率 | purchase_tax_rate | number(8,4) NOT NULL | 同 | 无 | +| 16 | 采购单价 | unit_price | number(16,4) NOT NULL | 同 | 无 | +| 17 | 货源细单ID | goods_source_id | varchar2(20 char) NOT NULL | 同 | 无 | +| 18 | 采购员ID | purchaser_id | varchar2(20 char) NOT NULL | 同 | 无 | +| 19 | 采购员 | purchaser_name | varchar2(100 char) NOT NULL | 同 | 无 | +| 20 | 计划员ID | planner_id | varchar2(20 char) NOT NULL | 同 | 无 | +| 21 | 计划员 | planner_name | varchar2(100 char) NOT NULL | 同 | 无 | +| 22 | 录入合同状态 | contract_entry_status | number(1,0) | 同 | 无 | +| 23 | 采购合同号 | contract_no | varchar2(40 char) | 同 | 无 | +| 24 | 处理状态 | process_status | number(1,0) DEFAULT 0 NOT NULL | 同 | 无 | +| 25 | 处理结果 | process_result | varchar2(1000 char) | 同 | 无 | +| 26 | 处理时间 | process_time | timestamp(6) | 同 | 无 | +| 27 | 创建时间 | create_time | timestamp(6) NOT NULL | 同 | 无 | +| 28 | 更新时间 | update_time | timestamp(6) | 同 | 无 | +| 29 | 货主编码 | org_code | varchar2(10) | 同 | 无 | +| 30 | 客户类型 | customer_type | number(2,0) NOT NULL | 同 | 无 | +| 31 | 货品MDM码 | goods_mdm_code | varchar2(100) | 同 | 无 | +| 32 | 供应商MDM码 | supplier_mdm_code | varchar2(100) | 同 | 无 | + +相对接口 sheet:数据表多 `process_*`、`create_time`、`update_time`。未建 `need_contract`。 + +--- + +## 4. 合同协议录入结果 + +无 Excel「待确认」列。 + +| Excel 序号 | 中文名 | 英文名 | Excel 属性 | DDL | 差异 | +| ---: | --- | --- | --- | --- | --- | +| 1 | 序号 | fid | number(19,0) IDENTITY | NUMBER(19,0) 主键 + SEQUENCE/触发器 | 11g 无 IDENTITY,主键补 NOT NULL | +| 2 | 订单中心单据编号 | oms_id | number(20) NOT NULL | 同 | 无 | +| 3 | 回传动作 | action_code | number(2,0) NOT NULL | 同 | 无 | +| 4 | 合同状态 | contract_status | number(2,0) | 同 | 无 | +| 5 | 合同录入失败原因 | contract_fail_reason | varchar2(500 char) | 同 | 无 | +| 6 | 合同编号 | contract_no | varchar2(40 char) | 同 | 无 | +| 7 | 返利协议状态 | agreement_status | number(2,0) | 同 | 无 | +| 8 | 协议录入失败原因 | agreement_fail_reason | varchar2(500 char) | 同 | 无 | +| 9 | 采购协议总单ID | agreement_id | varchar2(40 char) | 同 | 无 | +| 10 | 采购协议细单ID | agreement_dtl_id | varchar2(40 char) | 同 | 无 | +| 11 | 推送状态 | push_status | number(1,0) DEFAULT 0 NOT NULL | 同 | 无 | +| 12 | 推送结果 | push_result | varchar2(500 char) | 同 | 无 | +| 13 | 推送时间 | push_time | timestamp(6) | 同 | 无 | +| 14 | 创建时间 | create_time | timestamp(6) NOT NULL | 同 | 无 | +| 15 | 更新时间 | update_time | timestamp(6) | 同 | 无 | +| 16 | 创建人ID | create_user_id | number(19,0) | 同 | 无 | +| 17 | 创建人名称 | create_user_name | varchar2(100 char) | 同 | 无 | +| 18 | 更新人ID | update_user_id | number(19,0) | 同 | 无 | +| 19 | 更新人名称 | update_user_name | varchar2(100 char) | 同 | 无 | +| 20 | 货主编码 | org_code | varchar2(10) | 同 | 无 | + +相对接口 sheet:数据表多 `push_*`、审计字段。 diff --git a/docs/superpowers/specs/2026-10-02-repo-layout-design.md b/docs/superpowers/specs/2026-10-02-repo-layout-design.md index 64c8386..0e96e58 100644 --- a/docs/superpowers/specs/2026-10-02-repo-layout-design.md +++ b/docs/superpowers/specs/2026-10-02-repo-layout-design.md @@ -3,7 +3,7 @@ | 文档属性 | 内容 | | --- | --- | | 日期 | 2026-10-02 | -| 状态 | 已锁定,本轮实施依据 | +| 状态 | 已锁定。随后 `rpa_yisaiqi/` 已删,页面脚本迁入 `rpa_contract/` | | 范围 | 根目录命名与分家:`选品流程/` 整包迁到 `rpa_selection/`;占位 `rpa_cart/`、`rpa_contract/`、`rpa_rebate/`;`资料/` 并入 `docs/`。路径与文档引用。 | | 替代 | 根 `README.md` 代码入口表;`资料/README.md`(并入后成为 `docs/README.md`) | | 不变 | 四张表、四个口的作业语义、接口 1 行为、选品规则与拆量、`rpa_yisaiqi` 页面步骤 | diff --git a/docs/【项目方案】福建洁达采购合同RPA自动化录入需求_v20260924.docx b/docs/【项目方案】福建洁达采购合同RPA自动化录入需求_v20260924.docx new file mode 100644 index 0000000000000000000000000000000000000000..a3a2384e58d271ba45aa7a4bda918a58f2b96e06 GIT binary patch literal 1902050 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

2MeBE)wyh-1(?6k04b&Tt7%}fmc|k;80%ZS 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 z%0D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

Pzqm`-Rgb5X2Vm{DPhg5agva;dA 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 - - - - - - -
-
-
- -
-
-
- - - - - \ No newline at end of file diff --git a/rpa_yisaiqi/tests/test_agent.py b/rpa_yisaiqi/tests/test_agent.py deleted file mode 100644 index 5506aa2..0000000 --- a/rpa_yisaiqi/tests/test_agent.py +++ /dev/null @@ -1,240 +0,0 @@ -from rpa_yisaiqi.agent import JobAgent - - -class FakeClient: - def __init__(self, job, *, tasks=None): - self.job = dict(job) - self.tasks = list(tasks or []) - self.calls = [] - - def get_job(self, job_id): - self.calls.append(("get_job", job_id)) - return {"job": dict(self.job), "tasks": list(self.tasks)} - - def start_node(self, job_id, node_code, **kwargs): - self.calls.append(("start", node_code, kwargs)) - return {"ok": True} - - def complete_node(self, job_id, node_code, payload): - self.calls.append(("complete", node_code, payload)) - return {"ok": True, "next_node": "PRODUCT_MATCH"} - - def fail_node(self, job_id, node_code, payload): - self.calls.append(("fail", node_code, payload)) - return {"ok": True, "job_status": "FAILED_RETRYABLE"} - - def ingest_items(self, job_id, rows, replace=True): - self.calls.append(("ingest_items", job_id, rows)) - return {"ok": True, "inserted": len(rows)} - - def match_run(self, job_id): - self.calls.append(("match_run", job_id)) - return {"ok": True, "next_node": "CONTRACT_CREATE"} - - def list_tasks(self, **kwargs): - self.calls.append(("list_tasks", kwargs)) - return {"items": list(self.tasks)} - - def submit_task(self, task_id, action, payload, submit_token, operator="agent"): - self.calls.append(("submit_task", task_id, action, payload, submit_token)) - return {"ok": True, "next_node": "CONTRACT_CREATE"} - - def check_contract_result(self, job_id, approved, **kwargs): - self.calls.append(("check_result", job_id, approved)) - return {"ok": True, "next_node": "REBATE_HEADER"} - - def retry_job(self, job_id): - self.calls.append(("retry", job_id)) - return {"ok": True, "node_code": self.job["current_node_code"], "attempt_no": 2} - - -def test_agent_does_not_hardcode_next_node_after_order_fetch(): - client = FakeClient({ - "job_id": "JOB-1", - "current_node_code": "ORDER_FETCH", - "status": "PENDING", - "source_type": "YYC", - "supplier_name": "重庆亿昊药业", - "order_date": "2026-08-12", - }) - agent = JobAgent(client, "JOB-1", runner_mode="mock") - - result = agent.step() - - assert result["next_node"] == "PRODUCT_MATCH" - assert ("complete", "ORDER_FETCH") == (client.calls[-1][0], client.calls[-1][1]) - assert not any(call[0] == "complete" and call[1] == "OCR_EXTRACT" for call in client.calls) - - -def test_agent_runs_product_match_via_state_center_not_rpa_callback(): - client = FakeClient({ - "job_id": "JOB-1", - "current_node_code": "PRODUCT_MATCH", - "status": "PENDING", - "source_type": "YYC", - }) - agent = JobAgent(client, "JOB-1", runner_mode="mock") - - result = agent.step() - - assert result["next_node"] == "CONTRACT_CREATE" - assert client.calls[1][0] == "match_run" - assert not any(call[0] in {"start", "complete"} for call in client.calls) - - -def test_agent_auto_human_submits_source_add_task_not_node_complete(): - job_id = "YYC-重庆亿昊药业-2fa0-20260812-16abff" - client = FakeClient( - { - "job_id": job_id, - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "source_type": "YYC", - }, - tasks=[{"task_id": "T-1", "node_code": "SOURCE_ADD", "status": "OPEN"}], - ) - agent = JobAgent(client, job_id, runner_mode="mock", auto_human=True) - - result = agent.step() - - assert result["next_node"] == "CONTRACT_CREATE" - assert client.calls[-1][:3] == ("submit_task", "T-1", "CONFIRM_AND_CONTINUE") - assert len(client.calls[-1][4]) <= 64 - assert not any(call[0] == "complete" for call in client.calls) - - -def test_agent_stops_on_human_node_when_auto_human_disabled(): - client = FakeClient({ - "job_id": "JOB-1", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "source_type": "YYC", - }) - agent = JobAgent(client, "JOB-1", runner_mode="mock", auto_human=False) - - result = agent.step() - - assert result["stopped"] == "WAITING_USER" - assert not any(call[0] == "submit_task" for call in client.calls) - - -def test_agent_contract_wait_uses_check_result_not_start_complete(): - client = FakeClient({ - "job_id": "JOB-1", - "current_node_code": "CONTRACT_APPROVE_WAIT", - "status": "WAITING_EXTERNAL", - "source_type": "YYC", - }) - agent = JobAgent(client, "JOB-1", runner_mode="mock") - - result = agent.step() - - assert result["next_node"] == "REBATE_HEADER" - assert client.calls[-1][:2] == ("check_result", "JOB-1") - assert not any(call[0] in {"start", "complete"} for call in client.calls) - - -def test_agent_retries_failed_retryable_then_stops_if_still_failed(): - client = FakeClient({ - "job_id": "JOB-1", - "current_node_code": "ORDER_FETCH", - "status": "FAILED_RETRYABLE", - "source_type": "YYC", - }) - agent = JobAgent(client, "JOB-1", runner_mode="mock", auto_retry=True) - - result = agent.step() - - assert ("retry", "JOB-1") in client.calls - assert result["attempt_no"] == 2 - - -class ScriptedClient(FakeClient): - """Advance through canned job states after each action. Sequence is not in the agent.""" - - def __init__(self, frames): - self.frames = list(frames) - super().__init__(self.frames[0]["job"], tasks=self.frames[0].get("tasks") or []) - - def _advance(self): - if len(self.frames) > 1: - self.frames.pop(0) - self.job = dict(self.frames[0]["job"]) - self.tasks = list(self.frames[0].get("tasks") or []) - - def complete_node(self, job_id, node_code, payload): - nxt = self.frames[0].get("next_node") - self._advance() - self.calls.append(("complete", node_code, payload)) - return {"ok": True, "next_node": nxt} - - def match_run(self, job_id): - nxt = self.frames[0].get("next_node") - self._advance() - self.calls.append(("match_run", job_id)) - return {"ok": True, "next_node": nxt} - - def submit_task(self, task_id, action, payload, submit_token, operator="agent"): - nxt = self.frames[0].get("next_node") - self._advance() - self.calls.append(("submit_task", task_id, action, payload)) - return {"ok": True, "next_node": nxt} - - def check_contract_result(self, job_id, approved, **kwargs): - nxt = self.frames[0].get("next_node") - self._advance() - self.calls.append(("check_result", job_id, approved)) - return {"ok": True, "next_node": nxt} - - -def test_agent_run_follows_state_center_until_success(): - client = ScriptedClient([ - {"job": {"job_id": "JOB-1", "current_node_code": "ORDER_FETCH", "status": "PENDING", - "source_type": "YYC", "supplier_name": "重庆亿昊药业", "order_date": "2026-08-12"}, - "next_node": "PRODUCT_MATCH"}, - {"job": {"job_id": "JOB-1", "current_node_code": "PRODUCT_MATCH", "status": "PENDING", - "source_type": "YYC"}, - "next_node": "CONTRACT_CREATE"}, - {"job": {"job_id": "JOB-1", "current_node_code": "CONTRACT_CREATE", "status": "PENDING", - "source_type": "YYC", "order_date": "2026-08-12"}, - "next_node": "CONTRACT_APPROVE_WAIT"}, - {"job": {"job_id": "JOB-1", "current_node_code": "CONTRACT_APPROVE_WAIT", - "status": "WAITING_EXTERNAL", "source_type": "YYC"}, - "next_node": "REBATE_HEADER"}, - {"job": {"job_id": "JOB-1", "current_node_code": "REBATE_HEADER", "status": "PENDING", - "source_type": "YYC"}, - "next_node": "REBATE_IMPORT"}, - {"job": {"job_id": "JOB-1", "current_node_code": "REBATE_IMPORT", "status": "PENDING", - "source_type": "YYC"}, - "next_node": "REBATE_SUBMIT"}, - {"job": {"job_id": "JOB-1", "current_node_code": "REBATE_SUBMIT", "status": "PENDING", - "source_type": "YYC"}, - "next_node": "M5_CREATE_ORDER"}, - {"job": {"job_id": "JOB-1", "current_node_code": "M5_CREATE_ORDER", "status": "PENDING", - "source_type": "YYC"}, - "next_node": "M5_MANUAL_CONFIRM"}, - {"job": {"job_id": "JOB-1", "current_node_code": "M5_MANUAL_CONFIRM", "status": "WAITING_USER", - "source_type": "YYC"}, - "tasks": [{"task_id": "T-M5", "node_code": "M5_MANUAL_CONFIRM", "status": "OPEN"}], - "next_node": "M5_RECEIPT_NOTICE"}, - {"job": {"job_id": "JOB-1", "current_node_code": "M5_RECEIPT_NOTICE", "status": "WAITING_USER", - "source_type": "YYC"}, - "tasks": [{"task_id": "T-SH", "node_code": "M5_RECEIPT_NOTICE", "status": "OPEN"}], - "next_node": None}, - {"job": {"job_id": "JOB-1", "current_node_code": "ARCHIVE_JOB", "status": "SUCCESS", - "source_type": "YYC"}}, - ]) - agent = JobAgent(client, "JOB-1", runner_mode="mock", auto_human=True) - - history = agent.run() - - acted = [call[0] for call in client.calls if call[0] in { - "complete", "match_run", "check_result", "submit_task", - }] - assert acted == [ - "complete", "match_run", "complete", "check_result", - "complete", "complete", "complete", "complete", - "submit_task", "submit_task", - ] - assert history[-1]["stopped"] == "SUCCESS" - assert not any(call[1] == "OCR_EXTRACT" for call in client.calls if call[0] == "complete") diff --git a/rpa_yisaiqi/tests/test_callback_client.py b/rpa_yisaiqi/tests/test_callback_client.py deleted file mode 100644 index 8d6d07a..0000000 --- a/rpa_yisaiqi/tests/test_callback_client.py +++ /dev/null @@ -1,78 +0,0 @@ -import json - -from rpa_yisaiqi.callback_client import StateCenterClient - - -class FakeHttp: - def __init__(self, responses=None): - self.requests = [] - self.responses = list(responses or [{"ok": True}]) - - def __call__(self, request, timeout): - body = json.loads(request.data.decode("utf-8")) if request.data else None - self.requests.append({ - "url": request.full_url, - "method": request.get_method(), - "body": body, - "headers": dict(request.header_items()), - }) - return FakeResponse(self.responses.pop(0)) - - -class FakeResponse: - def __init__(self, payload): - self.payload = payload - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def read(self): - return json.dumps(self.payload).encode("utf-8") - - -def test_get_job_uses_get_and_token(): - http = FakeHttp([{"job": {"job_id": "JOB-1"}, "tasks": []}]) - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - - result = client.get_job("JOB-1") - - assert result["job"]["job_id"] == "JOB-1" - assert http.requests[0]["method"] == "GET" - assert http.requests[0]["url"] == "http://state-center:8000/api/jobs/JOB-1" - assert http.requests[0]["headers"]["X-agent-token"] == "dev-agent-token" - - -def test_ingest_items_posts_rows(): - http = FakeHttp([{"ok": True, "inserted": 1}]) - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - - client.ingest_items("JOB-1", [{"orderNo": "DD-1", "rawProductName": "阿卡波糖片", "qty": 1}]) - - assert http.requests[0]["url"].endswith("/api/jobs/JOB-1/items") - assert http.requests[0]["body"]["replace"] is True - assert http.requests[0]["body"]["rows"][0]["orderNo"] == "DD-1" - - -def test_match_run_and_retry_and_task_submit(): - http = FakeHttp([ - {"ok": True, "next_node": "CONTRACT_CREATE"}, - {"ok": True, "attempt_no": 2}, - {"ok": True, "next_node": "CONTRACT_CREATE"}, - {"ok": True, "next_node": "REBATE_HEADER"}, - ]) - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - - assert client.match_run("JOB-1")["next_node"] == "CONTRACT_CREATE" - assert client.retry_job("JOB-1")["attempt_no"] == 2 - assert client.submit_task("T-1", "CONFIRM_AND_CONTINUE", {}, "tok")["next_node"] == "CONTRACT_CREATE" - assert client.check_contract_result("JOB-1", True)["next_node"] == "REBATE_HEADER" - - assert http.requests[0]["url"].endswith("/api/jobs/JOB-1/match/run") - assert http.requests[1]["url"].endswith("/api/jobs/JOB-1/retry") - assert http.requests[2]["url"].endswith("/api/tasks/T-1/submit") - assert http.requests[2]["body"]["action"] == "CONFIRM_AND_CONTINUE" - assert http.requests[3]["url"].endswith("/nodes/CONTRACT_APPROVE_WAIT/check-result") - assert http.requests[3]["body"]["approved"] is True diff --git a/rpa_yisaiqi/tests/test_runtime_shell.py b/rpa_yisaiqi/tests/test_runtime_shell.py deleted file mode 100644 index 2411128..0000000 --- a/rpa_yisaiqi/tests/test_runtime_shell.py +++ /dev/null @@ -1,75 +0,0 @@ -import json - -from rpa_yisaiqi.callback_client import StateCenterClient -from rpa_yisaiqi.runtime.errors import LoginFailed, NodeError -from rpa_yisaiqi.runtime.shell import execute_node - - -class FakeHttp: - def __init__(self, responses=None): - self.requests = [] - self.responses = list(responses or [{"ok": True}, {"ok": True, "next_node": "PRODUCT_MATCH"}]) - - def __call__(self, request, timeout): - body = json.loads(request.data.decode("utf-8")) if request.data else None - self.requests.append({ - "url": request.full_url, - "method": request.get_method(), - "body": body, - }) - return FakeResponse(self.responses.pop(0)) - - -class FakeResponse: - def __init__(self, payload): - self.payload = payload - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def read(self): - return json.dumps(self.payload).encode("utf-8") - - -def test_execute_node_starts_then_completes_with_runner_payload(): - http = FakeHttp() - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - - result = execute_node( - client, - "JOB-1", - "ORDER_FETCH", - lambda: {"summary": {"orderCount": 1}, "businessRefs": {}}, - attempt_no=1, - ) - - assert result["next_node"] == "PRODUCT_MATCH" - assert [req["url"].rsplit("/", 1)[-1] for req in http.requests] == ["start", "complete"] - assert http.requests[1]["body"]["summary"] == {"orderCount": 1} - assert http.requests[1]["body"]["attemptNo"] == 1 - - -def test_execute_node_maps_login_failure_to_fail_callback(): - http = FakeHttp([{"ok": True}, {"ok": True, "job_status": "FAILED_RETRYABLE"}]) - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - - def failing(): - raise LoginFailed("登录失败") - - result = execute_node(client, "JOB-1", "ORDER_FETCH", failing) - - assert result["job_status"] == "FAILED_RETRYABLE" - assert http.requests[1]["url"].endswith("/fail") - assert http.requests[1]["body"]["errorCode"] == "SYS_LOGIN_FAIL" - assert http.requests[1]["body"]["retryable"] is True - assert http.requests[1]["body"]["routeRole"] == "OPS" - - -def test_node_error_carries_default_ui_code(): - exc = NodeError("元素找不到") - assert exc.error_code == "UI_ELEMENT_NOT_FOUND" - assert exc.retryable is False - assert exc.route_role == "OPS" diff --git a/rpa_yisaiqi/yisaiqi_adapter_template.py b/rpa_yisaiqi/yisaiqi_adapter_template.py deleted file mode 100644 index fdc4c7b..0000000 --- a/rpa_yisaiqi/yisaiqi_adapter_template.py +++ /dev/null @@ -1,42 +0,0 @@ -"""YiSaiQi adapter template for CONTRACT_CREATE flowchart nodes. - -This file is a mapping template. In the YiSaiQi designer, replace each method -body with the platform's native browser activities: open webpage, input text, -click element, select dropdown, upload file, read text, and screenshot. -""" -from __future__ import annotations - - -class YiSaiQiBrowserAdapter: - def open_url(self, url: str) -> None: - """Flowchart node: 浏览器打开网页.""" - raise NotImplementedError("Map to YiSaiQi browser open-url activity") - - def fill_first(self, selectors: list[str], value: str) -> None: - """Flowchart node: 按候选定位器依次查找,找到后输入文本.""" - raise NotImplementedError(f"Map to YiSaiQi input-text activity: {selectors=} {value=}") - - def click_first(self, selectors: list[str]) -> None: - """Flowchart node: 按候选定位器依次查找,找到后点击.""" - raise NotImplementedError(f"Map to YiSaiQi click activity: {selectors=}") - - def wait_for_text(self, text: str, timeout_seconds: int = 15) -> None: - """Flowchart node: 等待页面出现指定文本.""" - raise NotImplementedError(f"Map to YiSaiQi wait-text activity: {text=} {timeout_seconds=}") - - def select_first(self, selectors: list[str], value: str) -> None: - """Flowchart node: 下拉框选择.""" - raise NotImplementedError(f"Map to YiSaiQi select activity: {selectors=} {value=}") - - def upload_file_first(self, selectors: list[str], file_path: str) -> None: - """Flowchart node: 文件上传.""" - raise NotImplementedError(f"Map to YiSaiQi upload-file activity: {selectors=} {file_path=}") - - def read_first(self, selectors: list[str], value_name: str) -> str: - """Flowchart node: 读取页面文本/输入框值并写入流程变量.""" - raise NotImplementedError(f"Map to YiSaiQi read-text activity: {selectors=} {value_name=}") - - def screenshot(self, name: str) -> str: - """Human evidence only. Acceptance is ACCEPT text from runtime.accept, not this image.""" - raise NotImplementedError(f"Map to YiSaiQi screenshot activity: {name=}") - From 60c2d6d0f019ffbbdc3fbe7cd1f7f0feea7cd187 Mon Sep 17 00:00:00 2001 From: Yuuuu <1569752928@qq.com> Date: Sat, 3 Oct 2026 10:20:54 +0800 Subject: [PATCH 5/5] =?UTF-8?q?chore:=20=E5=8E=BB=E6=8E=89=20state=5Fcente?= =?UTF-8?q?r=20=E6=97=A7=E6=A0=88=EF=BC=8C=E6=A0=B9=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E5=8F=AA=E7=95=99=20oms=20=E4=B8=8E=E5=9B=9B=E4=B8=AA=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除 state_center、state_center_web、rpa_mock、scripts 及并行开发残留。 oms 运行时只走 Oracle,内存仓库留给单测注入。 --- PARALLEL_DEV_PLAN.md | 367 ---- rpa_mock/mock_orders.py | 89 - rpa_mock/order_fetch_mock.py | 106 - rpa_oms/app/inbound/memory_repo.py | 2 +- rpa_oms/app/main.py | 10 +- run_mock_chain.py | 11 - scripts/__init__.py | 1 - scripts/dev.py | 292 --- state_center/README.md | 124 -- state_center/app/__init__.py | 0 state_center/app/config.py | 51 - state_center/app/db.py | 21 - state_center/app/m5_client.py | 174 -- state_center/app/main.py | 1511 -------------- state_center/app/match_engine.py | 215 -- state_center/app/web_state_machine.py | 163 -- state_center/fixtures/README.md | 20 - state_center/fixtures/ingest_mapping.json | 41 - .../fixtures/m5/connection.example.json | 9 - state_center/fixtures/m5/fujian.json | 13 - .../fixtures/orders/yyc-fujian-20260804.json | 26 - state_center/requirements.txt | 7 - state_center/sql/schema.sql | 205 -- state_center/tests/test_dev_launcher.py | 111 -- state_center/tests/test_m5_client.py | 101 - state_center/tests/test_match_engine.py | 107 - state_center/tests/test_web_api.py | 1226 ------------ state_center/tests/test_web_state_machine.py | 23 - .../tests/test_yisaiqi_contract_create.py | 112 -- .../tests/test_yisaiqi_contract_draft.py | 180 -- .../tests/test_yisaiqi_contract_flow_steps.py | 490 ----- state_center/给Trae的开发交接.md | 110 -- state_center/给艺赛旗的开发交接.md | 197 -- state_center_web/LAYOUT_PROPOSAL.md | 207 -- state_center_web/README.md | 65 - state_center_web/index.html | 12 - state_center_web/package-lock.json | 1750 ----------------- state_center_web/package.json | 24 - state_center_web/src/App.tsx | 1136 ----------- state_center_web/src/api/client.ts | 49 - .../src/components/JobAcceptanceChecklist.tsx | 65 - .../src/components/JobEvidenceList.tsx | 66 - state_center_web/src/components/JobList.tsx | 114 -- .../src/components/JobNodeDetailList.tsx | 102 - .../src/components/JobReferenceChain.tsx | 27 - .../src/components/JobTimeline.tsx | 45 - state_center_web/src/components/TaskList.tsx | 55 - .../src/components/ToolbarSelect.tsx | 97 - state_center_web/src/main.tsx | 10 - state_center_web/src/stateMachine.test.mjs | 288 --- state_center_web/src/stateMachine.ts | 772 -------- state_center_web/src/styles.css | 1593 --------------- state_center_web/src/vite-env.d.ts | 1 - state_center_web/tsconfig.json | 21 - state_center_web/vite.config.ts | 16 - 艺赛旗开发包-README.md | 195 -- 56 files changed, 2 insertions(+), 12823 deletions(-) delete mode 100644 PARALLEL_DEV_PLAN.md delete mode 100644 rpa_mock/mock_orders.py delete mode 100644 rpa_mock/order_fetch_mock.py delete mode 100644 run_mock_chain.py delete mode 100644 scripts/__init__.py delete mode 100644 scripts/dev.py delete mode 100644 state_center/README.md delete mode 100644 state_center/app/__init__.py delete mode 100644 state_center/app/config.py delete mode 100644 state_center/app/db.py delete mode 100644 state_center/app/m5_client.py delete mode 100644 state_center/app/main.py delete mode 100644 state_center/app/match_engine.py delete mode 100644 state_center/app/web_state_machine.py delete mode 100644 state_center/fixtures/README.md delete mode 100644 state_center/fixtures/ingest_mapping.json delete mode 100644 state_center/fixtures/m5/connection.example.json delete mode 100644 state_center/fixtures/m5/fujian.json delete mode 100644 state_center/fixtures/orders/yyc-fujian-20260804.json delete mode 100644 state_center/requirements.txt delete mode 100644 state_center/sql/schema.sql delete mode 100644 state_center/tests/test_dev_launcher.py delete mode 100644 state_center/tests/test_m5_client.py delete mode 100644 state_center/tests/test_match_engine.py delete mode 100644 state_center/tests/test_web_api.py delete mode 100644 state_center/tests/test_web_state_machine.py delete mode 100644 state_center/tests/test_yisaiqi_contract_create.py delete mode 100644 state_center/tests/test_yisaiqi_contract_draft.py delete mode 100644 state_center/tests/test_yisaiqi_contract_flow_steps.py delete mode 100644 state_center/给Trae的开发交接.md delete mode 100644 state_center/给艺赛旗的开发交接.md delete mode 100644 state_center_web/LAYOUT_PROPOSAL.md delete mode 100644 state_center_web/README.md delete mode 100644 state_center_web/index.html delete mode 100644 state_center_web/package-lock.json delete mode 100644 state_center_web/package.json delete mode 100644 state_center_web/src/App.tsx delete mode 100644 state_center_web/src/api/client.ts delete mode 100644 state_center_web/src/components/JobAcceptanceChecklist.tsx delete mode 100644 state_center_web/src/components/JobEvidenceList.tsx delete mode 100644 state_center_web/src/components/JobList.tsx delete mode 100644 state_center_web/src/components/JobNodeDetailList.tsx delete mode 100644 state_center_web/src/components/JobReferenceChain.tsx delete mode 100644 state_center_web/src/components/JobTimeline.tsx delete mode 100644 state_center_web/src/components/TaskList.tsx delete mode 100644 state_center_web/src/components/ToolbarSelect.tsx delete mode 100644 state_center_web/src/main.tsx delete mode 100644 state_center_web/src/stateMachine.test.mjs delete mode 100644 state_center_web/src/stateMachine.ts delete mode 100644 state_center_web/src/styles.css delete mode 100644 state_center_web/src/vite-env.d.ts delete mode 100644 state_center_web/tsconfig.json delete mode 100644 state_center_web/vite.config.ts delete mode 100644 艺赛旗开发包-README.md diff --git a/PARALLEL_DEV_PLAN.md b/PARALLEL_DEV_PLAN.md deleted file mode 100644 index c690390..0000000 --- a/PARALLEL_DEV_PLAN.md +++ /dev/null @@ -1,367 +0,0 @@ -# 状态中心 ↔ 艺赛旗并行开发方案 - -## 核心原则:契约驱动,各自独立,最后对接 - -双方只通过 **HTTP 回调契约** 交互,这个契约在交接文档里已经明确定义。在对接前,双方各自用假数据/假回调验证自己的逻辑,互不阻塞。 - ---- - -## 对接契约(双方共同遵守) - -### 基础信息 -- **状态中心地址**:联调时给艺赛旗实际 IP,如 `http://192.168.x.x:8000` -- **鉴权**:所有回调必须带 header `X-Agent-Token: `(默认 `dev-agent-token`,上线换正式值) -- **幂等键**:`complete` 回调可带 `idempotencyKey`,重发同键不会二次推进 - -### 三个回调接口(艺赛旗调状态中心) - -#### 1. 节点开始 -```bash -POST /api/jobs/{jobId}/nodes/{nodeCode}/start -Content-Type: application/json -X-Agent-Token: dev-agent-token - -{ - "attemptNo": 1, - "executorPlatform": "iS-RPA", - "operator": "agent" -} -``` - -#### 2. 节点成功 -```bash -POST /api/jobs/{jobId}/nodes/{nodeCode}/complete -Content-Type: application/json -X-Agent-Token: dev-agent-token - -{ - "attemptNo": 1, - "executorRunId": "YD-RUN-001", - "idempotencyKey": "uuid-xxx", - "businessRefs": { - "contractSystemNo": "HT2026...", // 三把钥匙,对应节点必传 - "rebateOrderNo": "FL2026...", - "m5OrderNo": "M5-xxx", - "receiptNoticeNo": "SH-xxx" - }, - "summary": { "orderCount": 12 }, - "artifacts": [ - { - "artifactType": "SOURCE_EXCEL", - "storagePath": "/data/jobs/xxx/orders.xlsx", - "fileHash": "sha256:abc", - "visibleRoles": ["PURCHASER", "PLANNER"], - "isMasked": false - } - ] -} -``` - -**返回**:`{"ok": true, "next_node": "OCR_EXTRACT"}` ← 艺赛旗拿到 `next_node` 继续跑下一节点 - -#### 3. 节点失败 -```bash -POST /api/jobs/{jobId}/nodes/{nodeCode}/fail -Content-Type: application/json -X-Agent-Token: dev-agent-token - -{ - "attemptNo": 1, - "errorCode": "SYS_LOGIN_FAIL", // 见交接文档错误码表 - "errorSummary": "验证码识别失败", - "retryable": true, // 系统类填 true,业务类填 false - "routeRole": "OPS", // OPS/PLANNER/PURCHASER - "artifacts": [] -} -``` - -**返回**:`{"ok": true, "job_status": "FAILED_RETRYABLE"}` - -### 必须回传的业务编号(三把钥匙) - -| 节点 | 必传字段 | 说明 | -| --- | --- | --- | -| CONTRACT_CREATE | `contractSystemNo` | 合同编号(后续返利、M5靠它串) | -| REBATE_HEADER | `rebateOrderNo` | 返利中心总单号 | -| M5_RECEIPT_NOTICE | `receiptNoticeNo` | 收货通知单号(全链终点) | - -不传或传空,状态中心返回 **400 拒绝**。 - -### 错误码规范(部分,全表见交接文档) - -| 错误码 | 含义 | retryable | routeRole | -| --- | --- | --- | --- | -| SYS_LOGIN_FAIL | 登录失败 | true | OPS | -| SYS_PAGE_TIMEOUT | 页面超时 | true | OPS | -| UI_ELEMENT_NOT_FOUND | 页面改版找不到元素 | false | OPS | -| BIZ_CONTRACT_DISABLED | 供应商合同被禁 | false | PURCHASER | -| M5_QC_MISSING | M5质管资料缺失 | - | - | -| REBATE_DUP_CODE | 返利重复编码 | false | PURCHASER | - -**特殊规则**:`M5_QC_MISSING` 无条件转 `FAILED_MANUAL`,`retryable` 填什么都没用。 - ---- - -## 状态中心这边(你的任务) - -### 阶段1:独立验证(不依赖艺赛旗) -**时间**:1-2天 -**目标**:后端在真 MySQL 上用假回调跑通全链 - -#### 任务 -1. **环境准备** - - Docker 起 MySQL 8,执行 `schema.sql` 建库。 - - 配 `MYSQL_DSN`,起后端服务。 - - 前端 `npm run dev` 起来。 - -2. **用假回调跑通一单** - - 方式1:用 curl 按顺序调回调接口。 - - 方式2:用前端"开发:节点回调模拟"区域的按钮。 - - **路径**:建单 → ORDER_FETCH start/complete → PRODUCT_MATCH run(有 MULTI) → 人工确认 → SOURCE_ADD 人工提交 → CONTRACT_CREATE complete(带合同编号) → ... → ARCHIVE_JOB。 - - **验证点**: - - job 状态正确推进(PENDING → RUNNING → WAITING_USER → ...)。 - - 业务编号正确落库(合同编号、返利总单号、M5单号、收货通知单号)。 - - job_node 每个节点有历史记录,attempt_no 正确。 - - user_task 在该创建时创建,提交后关闭。 - - job_artifact 证据落库。 - - 条件节点(OCR_EXTRACT/SOURCE_ADD)正确跳过或执行。 - -3. **发现并修复真实问题** - - SQL 语法问题(如 MySQL 8 的保留字冲突)。 - - JSON 列序列化问题(Python dict → MySQL JSON → 前端拿到的是对象还是字符串)。 - - 事务回滚是否正确。 - - datetime 字段格式(MySQL 存的 `YYYY-MM-DD HH:MM:SS`,前端拿到的格式)。 - - 幂等逻辑是否真的防重(重复 complete 同一节点,状态不会乱)。 - -4. **记录真实 API 响应** - - 把 `GET /api/jobs/{id}` 的完整响应存下来,给 UI 优化做参考。 - -#### 产出 -- ✅ 一个能在真 MySQL 上跑通全链的后端(用假回调验证)。 -- ✅ 一份真实响应示例 + 发现的问题清单。 -- ✅ 前端能正常展示真实数据(不再依赖 `demoJobDetailMap`)。 - -### 阶段2:优化与补全(不依赖艺赛旗) -**时间**:2-3天 -**目标**:UI 优化 + 补缺失接口 + 加调度重试 - -#### 任务 -1. **UI 优化** - - 按刚才的方案,分区 + 可折叠 + 调试开关。 - - 基于阶段1 的真实响应,确保所有字段正确展示。 - -2. **补缺失接口** - - `GET /api/jobs/{id}/match/unmatched`:返回该 job 未命中的订单行列表。 - - 其他小接口(如果阶段1 发现有遗漏)。 - -3. **调度与重试(任务6)** - - 定时建单:每天早上扫前一天订单。 - - 系统类错误自动重试(`FAILED_RETRYABLE` 状态的 job,重试 1-2 次)。 - - 超时升级:合同审批超时、人工待办超时转 OPS。 - -#### 产出 -- ✅ 优化后的前端(信息分层清晰,调试模式可开关)。 -- ✅ 完整的接口(验收点名的都实现)。 -- ✅ 调度器能定时触发建单和重试。 - -### 阶段3:准备对接(等艺赛旗阶段2 完成) -**时间**:半天 -**目标**:给艺赛旗提供联调环境 - -#### 任务 -1. **部署联调环境** - - 把后端部署到艺赛旗能访问的机器(或你本机开端口映射)。 - - 给艺赛旗提供:基础地址(如 `http://192.168.x.x:8000`) + 正式 `X-Agent-Token`。 - -2. **准备测试数据** - - 在库里建几个不同类型的 job: - - 医药城线上单(会跳过 OCR_EXTRACT)。 - - 线下单(会走 OCR_EXTRACT)。 - - 有对码 MULTI 的单。 - - 缺货源的单(会走 SOURCE_ADD)。 - - 每个 job 停在 ORDER_FETCH 节点,等艺赛旗来调 start/complete 推进。 - -3. **写联调检查表** - - 逐节点列验收点,双方对着检查表勾。 - -#### 产出 -- ✅ 一个可供艺赛旗调用的联调环境。 -- ✅ 测试数据 + 联调检查表。 - ---- - -## 艺赛旗那边(你要转述给他们) - -### 阶段1:独立开发(不依赖状态中心) -**时间**:2-3周(他们的活重) -**目标**:每个节点的页面自动化都能独立跑通 - -#### 任务 -1. **理解回调契约** - - 仔细读 `给艺赛旗的开发交接.md`。 - - 确认三个回调接口的字段、错误码表。 - -2. **逐节点开发页面自动化** - - **节点顺序**(他们的优先级): - 1. ORDER_FETCH(订单获取):登录医药城/小药药 → 导出 Excel → 存证据。 - 2. CONTRACT_CREATE(合同建单):登录合同系统 → 填表 → 上传 PDF(医药城) → 提交送审 → 拿到合同编号。 - 3. REBATE_HEADER(返利总单):登录返利中心 → 按合同编号查总单 → 填必填项 → 保存 → 拿到返利总单号。 - 4. REBATE_IMPORT(返利细单):下载模板 → 填字段 → 上传 → 读成功/失败行。 - 5. REBATE_SUBMIT(返利送审):点"提交送审"按钮。 - 6. M5_CREATE_ORDER(M5建单):桌面自动化 → 录单 → **停,不保存**。 - 7. CONTRACT_APPROVE_WAIT(合同审批):定时查审批状态(到点被状态中心扫到时才查一次)。 - - - **每个节点独立验证**: - - 不调状态中心,在自己环境里跑(比如用测试账号登录真实系统,手工给初始数据)。 - - 验证能拿到业务编号(合同编号、返利总单号等)。 - - 验证错误情况能识别出正确的错误码(如登录失败是 `SYS_LOGIN_FAIL`,合同被禁是 `BIZ_CONTRACT_DISABLED`)。 - -3. **本地模拟回调** - - 自己起个假的状态中心(或者直接用 curl 打印 JSON),验证回调 payload 格式对不对。 - - 示例(他们自己写个小脚本验证): - ```python - # 假的状态中心 mock.py - from flask import Flask, request, jsonify - app = Flask(__name__) - - @app.route('/api/jobs//nodes//complete', methods=['POST']) - def complete(job_id, node_code): - data = request.json - print(f"收到 {node_code} complete:", data) - # 检查必传字段 - if node_code == 'CONTRACT_CREATE' and not data.get('businessRefs', {}).get('contractSystemNo'): - return jsonify({"error": "缺少合同编号"}), 400 - return jsonify({"ok": True, "next_node": "下一节点"}) - - app.run(port=8000) - ``` - -#### 产出 -- ✅ 每个节点的页面自动化脚本(iS-RPA 流程)。 -- ✅ 能正确识别各种错误并返回对应错误码。 -- ✅ 能拿到三把钥匙(合同编号、返利总单号、收货通知单号)。 - -### 阶段2:准备对接(等状态中心阶段3 准备好) -**时间**:1天 -**目标**:改成调真实状态中心接口 - -#### 任务 -1. **获取联调环境信息** - - 从状态中心拿到:基础地址 + `X-Agent-Token`。 - -2. **改造回调逻辑** - - 把阶段1 的假回调改成调真实状态中心接口。 - - **关键**:拿到 `complete` 返回的 `next_node`,继续跑下一节点(不要自己写死顺序)。 - -3. **小范围试跑** - - 先跑一个最简单的节点(如 ORDER_FETCH),验证回调能调通、状态中心能正确推进。 - -#### 产出 -- ✅ 能调通状态中心回调接口的 RPA 脚本。 - ---- - -## 联调阶段(双方一起) - -**时间**:3-5天 -**目标**:端到端跑通一单真实流程 - -### 任务 -1. **按节点逐个验证** - - 顺序:ORDER_FETCH → (OCR_EXTRACT) → PRODUCT_MATCH(状态中心内部) → (SOURCE_ADD 人工) → CONTRACT_CREATE → ... - - 每个节点验证: - - RPA 能正确调 start/complete/fail。 - - 状态中心正确推进到下一节点或转人工。 - - 业务编号正确落库。 - - 证据正确存储。 - -2. **跑完整链** - - 医药城线上单(跳过 OCR)。 - - 线下单(走 OCR)。 - - 有对码 MULTI 的单(走人工确认)。 - - 缺货源的单(走 SOURCE_ADD 人工)。 - - 合同审批等待(定时查几次,验证不会死等)。 - -3. **异常场景** - - 登录失败 → 重试。 - - 页面改版找不到元素 → 转 OPS。 - - M5 质管缺失 → 直接 FAILED_MANUAL,不重试。 - - 返利重复编码 → 该单挂起,整批继续。 - -4. **对照验收规范逐条勾** - - 打开 `实施与验收规范.md`,每个节点的代码验收 + 业务验收两栏逐条过。 - -### 产出 -- ✅ 一个能端到端跑通的完整流程(从订单获取到归档)。 -- ✅ 验收报告(哪些通过,哪些有问题)。 - ---- - -## 时间线(并行开发) - -``` -第1周 第2周 第3周 -状态中心 │────阶段1────│───阶段2───│──阶段3──│────联调────│ - 真MySQL跑通 UI优化+补全 准备环境 与艺赛旗对接 - (1-2天) (2-3天) (半天) (3-5天) - -艺赛旗 │────────────阶段1────────────│─阶段2─│────联调────│ - 独立开发各节点页面自动化 改真回调 与状态中心对接 - (2-3周) (1天) (3-5天) -``` - -**关键点**: -- 前两周双方完全独立,互不阻塞。 -- 状态中心先做完(1周内),等艺赛旗追上。 -- 艺赛旗开发周期长(页面自动化细节多),但不影响状态中心进度。 -- 第3周开始联调,双方都已在各自环境验证过,对接就是走形式。 - ---- - -## 给艺赛旗的检查清单(转述) - -在开始联调前,艺赛旗必须自证能做到: - -### 功能检查 -- [ ] 能登录医药城/小药药/合同系统/返利中心/M5,并正确处理验证码/超时。 -- [ ] 能导出订单 Excel 并存到指定路径。 -- [ ] 能建合同、上传 PDF(医药城)、拿到合同编号。 -- [ ] 能在返利中心按合同编号查总单、填表、拿到返利总单号。 -- [ ] 能下载返利细单模板、填字段、上传、读成功/失败行。 -- [ ] 能点返利送审按钮。 -- [ ] 能用桌面自动化在 M5 录单(但不保存)。 -- [ ] 能定时查合同审批状态(不是连续轮询,是到点查一次)。 - -### 回调检查 -- [ ] 知道何时调 start、何时调 complete、何时调 fail。 -- [ ] complete 时能正确带 `businessRefs`(三把钥匙对应节点必传)。 -- [ ] fail 时能正确识别错误码(`SYS_*` vs `BIZ_*`,`retryable` 填对)。 -- [ ] 拿到 `next_node` 后能继续跑下一节点(不写死顺序)。 -- [ ] 所有回调都带 `X-Agent-Token` header。 - -### 异常检查 -- [ ] 登录失败时返回 `SYS_LOGIN_FAIL`,`retryable=true`。 -- [ ] 页面改版找不到元素时返回 `UI_ELEMENT_NOT_FOUND`,`retryable=false`,`routeRole=OPS`。 -- [ ] M5 质管缺失时返回 `M5_QC_MISSING`(状态中心会直接转 FAILED_MANUAL,不重试)。 -- [ ] 供应商合同被禁时返回 `BIZ_CONTRACT_DISABLED`,`retryable=false`,`routeRole=PURCHASER`。 - ---- - -## 总结 - -**你现在要做的**: -1. 马上开始阶段1(真 MySQL 跑通),1-2天搞定。 -2. 接着做阶段2(UI 优化 + 补全),2-3天搞定。 -3. 然后做阶段3(准备联调环境),半天搞定。 -4. **这时你这边已经全部做完**,等艺赛旗追上(他们要 2-3 周)。 - -**艺赛旗要做的**(你转述给他们): -1. 阶段1:独立开发各节点页面自动化,2-3周。期间不需要状态中心配合,自己用假数据验证。 -2. 阶段2:拿到状态中心联调环境信息后,改成调真实接口,1天。 -3. 联调阶段:双方一起按检查表逐条验收,3-5天。 - -**不会互相阻塞**:你 1 周内做完你的,艺赛旗 2-3 周做完他们的,最后 3-5 天一起联调。 - ---- - -要我把这份文档发给艺赛旗吗?或者你先看看有没有要调整的。 diff --git a/rpa_mock/mock_orders.py b/rpa_mock/mock_orders.py deleted file mode 100644 index 79da8d2..0000000 --- a/rpa_mock/mock_orders.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -""" -Mock 医药城/小药药订单数据生成器 -用于在没有真实医药平台访问权限时,模拟 ORDER_FETCH 节点的输出 -""" -import pandas as pd -from datetime import datetime, timedelta -import random -import os - -# 假订单数据模板 -MOCK_SUPPLIERS = [ - "重庆亿昊药业", - "华润医药", - "国药控股", - "上海医药" -] - -MOCK_PRODUCTS = [ - {"name": "阿卡波糖片", "spec": "50mg*30片", "manufacturer": "示例制药", "approval_no": "国药准字H00000001"}, - {"name": "二甲双胍片", "spec": "0.5g*60片", "manufacturer": "示例制药", "approval_no": "国药准字H00000002"}, - {"name": "格列美脲片", "spec": "2mg*10片", "manufacturer": "示例制药", "approval_no": "国药准字H00000003"}, - {"name": "阿托伐他汀钙片", "spec": "10mg*7片", "manufacturer": "示例制药", "approval_no": "国药准字H00000004"}, -] - -def generate_mock_orders(supplier_name: str, order_date: str, source_type: str = "YYC", item_count: int = 5): - """ - 生成模拟订单Excel - - Args: - supplier_name: 供应商名称 - order_date: 订单日期 YYYY-MM-DD - source_type: 来源类型 YYC/XYY/OFFLINE - item_count: 订单明细行数 - - Returns: - 生成的Excel文件路径 - """ - rows = [] - for i in range(item_count): - product = random.choice(MOCK_PRODUCTS) - rows.append({ - "订单号": f"DD-{order_date.replace('-', '')}-{i+1:03d}", - "订单日期": order_date, - "供应商名称": supplier_name, - "药品通用名": product["name"], - "规格": product["spec"], - "单位": "盒", - "数量": random.randint(10, 500), - "单价": round(random.uniform(5.0, 200.0), 2), - "生产厂家": product["manufacturer"], - "批准文号": product["approval_no"], - }) - - df = pd.DataFrame(rows) - - # 生成文件路径 - output_dir = "/tmp/mock_rpa_data" - os.makedirs(output_dir, exist_ok=True) - - filename = f"orders_{supplier_name}_{order_date}_{source_type}.xlsx" - filepath = os.path.join(output_dir, filename) - - df.to_excel(filepath, index=False, sheet_name="订单明细") - print(f"✓ 生成模拟订单: {filepath}") - print(f" - 供应商: {supplier_name}") - print(f" - 订单日期: {order_date}") - print(f" - 明细行数: {len(rows)}") - - return filepath - - -if __name__ == "__main__": - # 生成几个测试订单 - test_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d") - - print("生成模拟订单数据...\n") - - # 医药城订单(线上) - generate_mock_orders("重庆亿昊药业", test_date, "YYC", item_count=8) - - # 小药药订单(线上) - generate_mock_orders("华润医药", test_date, "XYY", item_count=5) - - # 线下手工单 - generate_mock_orders("国药控股", test_date, "OFFLINE", item_count=3) - - print("\n✓ 全部完成,文件位于: /tmp/mock_rpa_data/") - diff --git a/rpa_mock/order_fetch_mock.py b/rpa_mock/order_fetch_mock.py deleted file mode 100644 index 724e754..0000000 --- a/rpa_mock/order_fetch_mock.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -""" -ORDER_FETCH 节点 Mock 实现 -模拟从医药城/小药药导出订单,实际返回本地生成的假数据 -""" -import requests -import hashlib -from pathlib import Path -from mock_orders import generate_mock_orders -from datetime import datetime, timedelta - - -STATE_CENTER_URL = "http://localhost:8000" # 状态中心地址 -AGENT_TOKEN = "dev-agent-token-12345" # 开发令牌(和state_center的配置一致) - - -def calculate_file_hash(filepath: str) -> str: - """计算文件SHA256哈希""" - sha256 = hashlib.sha256() - with open(filepath, 'rb') as f: - for chunk in iter(lambda: f.read(4096), b''): - sha256.update(chunk) - return f"sha256:{sha256.hexdigest()}" - - -def mock_order_fetch(job_id: str, order_date: str, source_type: str = "YYC"): - """ - 模拟 ORDER_FETCH 节点执行 - - Args: - job_id: 单据ID - order_date: 订单日期 - source_type: 来源类型 YYC/XYY/OFFLINE - """ - print(f"\n{'='*60}") - print(f"🤖 [Mock RPA] ORDER_FETCH 开始执行") - print(f" Job ID: {job_id}") - print(f" 订单日期: {order_date}") - print(f" 来源: {source_type}") - print(f"{'='*60}\n") - - # 1. 调用 start 回调 - print("📞 调用状态中心 /start 回调...") - start_resp = requests.post( - f"{STATE_CENTER_URL}/api/jobs/{job_id}/nodes/ORDER_FETCH/start", - headers={"X-Agent-Token": AGENT_TOKEN}, - json={ - "attemptNo": 1, - "executorRunId": f"MOCK-RUN-{datetime.now().strftime('%Y%m%d%H%M%S')}", - "executorPlatform": "mock-rpa", - "operator": "mock-script" - } - ) - print(f" 响应: {start_resp.status_code} - {start_resp.json()}\n") - - # 2. 生成假订单数据 - print("📦 生成模拟订单数据...") - supplier_name = "重庆亿昊药业" if source_type == "YYC" else "华润医药" - excel_path = generate_mock_orders(supplier_name, order_date, source_type, item_count=8) - print() - - # 3. 计算文件哈希 - file_hash = calculate_file_hash(excel_path) - - # 4. 调用 complete 回调 - print("📞 调用状态中心 /complete 回调...") - order_nos = [f"DD-{order_date.replace('-', '')}-{i+1:03d}" for i in range(8)] - - complete_resp = requests.post( - f"{STATE_CENTER_URL}/api/jobs/{job_id}/nodes/ORDER_FETCH/complete", - headers={"X-Agent-Token": AGENT_TOKEN}, - json={ - "attemptNo": 1, - "executorRunId": f"MOCK-RUN-{datetime.now().strftime('%Y%m%d%H%M%S')}", - "executorPlatform": "mock-rpa", - "operator": "mock-script", - "summary": { - "orderCount": 8, - "supplierList": [supplier_name], - "orderNoList": order_nos - }, - "artifacts": [ - { - "artifactType": "SOURCE_EXCEL", - "storagePath": excel_path, - "fileHash": file_hash - } - ] - } - ) - print(f" 响应: {complete_resp.status_code}") - result = complete_resp.json() - print(f" next_node: {result.get('next_node')}") - print(f" job_status: {result.get('job_status')}\n") - - print(f"✅ ORDER_FETCH 完成!下一节点: {result.get('next_node')}\n") - - return result - - -if __name__ == "__main__": - # 示例:模拟昨天的医药城订单 - yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d") - job_id = f"YYC-重庆亿昊药业-{yesterday.replace('-', '')}-001" - - mock_order_fetch(job_id, yesterday, "YYC") diff --git a/rpa_oms/app/inbound/memory_repo.py b/rpa_oms/app/inbound/memory_repo.py index 1dbbf7e..f731a82 100644 --- a/rpa_oms/app/inbound/memory_repo.py +++ b/rpa_oms/app/inbound/memory_repo.py @@ -1,4 +1,4 @@ -"""内存仓库。单测和 OMS_REPO=memory 用,进程退出即丢。 +"""内存仓库。只给单测用,进程退出即丢。运行时走 Oracle。 按 oms_id 判重,已存在就 DuplicateOmsId,不覆盖。 """ diff --git a/rpa_oms/app/main.py b/rpa_oms/app/main.py index 45a0ea8..541a8a6 100644 --- a/rpa_oms/app/main.py +++ b/rpa_oms/app/main.py @@ -7,7 +7,6 @@ """ from __future__ import annotations -import os from typing import Annotated, Any from fastapi import Depends, FastAPI, Header @@ -15,21 +14,14 @@ from fastapi.responses import JSONResponse from .auth import token_ok from .inbound.envelope import EnvelopeError, parse_envelope -from .inbound.memory_repo import MemorySalesGoodsRepo from .inbound.repo import RepoUnavailable from .inbound.sales_goods import receive_sales_goods app = FastAPI(title="洁达 RPA × 订单中心", version="0.1") -# 内存仓库做成进程内单例,同一进程多次 POST 才能测到 DUPLICATE。 -_memory_repo = MemorySalesGoodsRepo() - def get_repo(): - # 默认走 Oracle。本机连不上库时 OMS_REPO=memory。 - if os.getenv("OMS_REPO", "oracle") == "memory": - return _memory_repo - # thick 客户端初始化有副作用,用到才 import。 + # 运行时只走 Oracle。单测用 dependency_overrides 注入内存替身。 from .inbound.oracle_repo import OracleSalesGoodsRepo return OracleSalesGoodsRepo.from_env() diff --git a/run_mock_chain.py b/run_mock_chain.py deleted file mode 100644 index 0d84b1c..0000000 --- a/run_mock_chain.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python3 -"""Thin wrapper around the portable mock agent. - -Prefer: - python -m rpa_yisaiqi --create --auto-human -""" -from rpa_yisaiqi.__main__ import main - - -if __name__ == "__main__": - main() diff --git a/scripts/__init__.py b/scripts/__init__.py deleted file mode 100644 index aab9e1c..0000000 --- a/scripts/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Project development utilities.""" diff --git a/scripts/dev.py b/scripts/dev.py deleted file mode 100644 index fbe1bb3..0000000 --- a/scripts/dev.py +++ /dev/null @@ -1,292 +0,0 @@ -"""Start and inspect the local state-center integration stack. - -Usage: - python scripts/dev.py start - python scripts/dev.py status - python scripts/dev.py stop -""" -from __future__ import annotations - -import argparse -import json -import os -import signal -import socket -import subprocess -import sys -import time -from pathlib import Path -from urllib.error import URLError -from urllib.request import urlopen - -ROOT = Path(__file__).resolve().parents[1] -RUNTIME_DIR = ROOT / ".runtime" -PID_FILE = RUNTIME_DIR / "dev-pids.json" -MYSQL_CONTAINER = "rpa-center-mysql" -MYSQL_VOLUME = "rpa-center-mysql-data" -MYSQL_IMAGE = "mysql:8" - - -def build_backend_env(source: dict[str, str] | None = None) -> dict[str, str]: - """Return backend environment with safe local defaults.""" - env = dict(os.environ if source is None else source) - env.setdefault("DEV_MODE", "true") - env.setdefault( - "MYSQL_DSN", - "mysql+pymysql://root:root@127.0.0.1:3306/rpa_center?charset=utf8mb4", - ) - env.setdefault("AGENT_TOKEN", "dev-agent-token") - return env - - -def _run(command: list[str], *, check: bool = True, capture: bool = False) -> subprocess.CompletedProcess[str]: - return subprocess.run( - command, - cwd=ROOT, - check=check, - text=True, - capture_output=capture, - ) - - -def _command_exists(command: str) -> bool: - return subprocess.run( - [command, "--version"], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - check=False, - ).returncode == 0 - - -def _backend_python() -> str: - configured = os.getenv("STATE_CENTER_PYTHON") - if configured: - return configured - local_python = ROOT / ".venv_test" / ("Scripts/python.exe" if os.name == "nt" else "bin/python") - if local_python.exists(): - return str(local_python) - return sys.executable - - -def _ensure_backend_runtime() -> str: - python = _backend_python() - probe = subprocess.run( - [python, "-c", "import fastapi, pymysql, uvicorn, cryptography"], - cwd=ROOT, - stdout=subprocess.DEVNULL, - stderr=subprocess.PIPE, - text=True, - check=False, - ) - if probe.returncode != 0: - raise RuntimeError( - f"Backend dependencies are missing for {python}. " - f"Install them with: {python} -m pip install -r state_center/requirements.txt" - ) - return python - - -def _docker_container_state() -> str | None: - if not _command_exists("docker"): - return None - result = _run( - ["docker", "inspect", "-f", "{{.State.Status}}", MYSQL_CONTAINER], - check=False, - capture=True, - ) - if result.returncode != 0: - return None - return result.stdout.strip() - - -def ensure_mysql() -> None: - if not _command_exists("docker"): - raise RuntimeError("Docker is required to start the local MySQL container.") - - state = _docker_container_state() - if state == "running": - return - if state: - _run(["docker", "start", MYSQL_CONTAINER]) - return - - _run( - [ - "docker", - "run", - "--detach", - "--name", - MYSQL_CONTAINER, - "--env", - "MYSQL_ROOT_PASSWORD=root", - "--env", - "MYSQL_DATABASE=rpa_center", - "--publish", - "3306:3306", - "--volume", - f"{MYSQL_VOLUME}:/var/lib/mysql", - "--volume", - f"{ROOT / 'state_center' / 'sql' / 'schema.sql'}:/docker-entrypoint-initdb.d/001-schema.sql:ro", - MYSQL_IMAGE, - ] - ) - - -def _port_open(host: str, port: int) -> bool: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - sock.settimeout(0.5) - return sock.connect_ex((host, port)) == 0 - - -def wait_for_port(host: str, port: int, timeout: float = 30) -> None: - deadline = time.monotonic() + timeout - while time.monotonic() < deadline: - if _port_open(host, port): - return - time.sleep(0.5) - raise RuntimeError(f"Timed out waiting for {host}:{port}.") - - -def _spawn(name: str, command: list[str], cwd: Path, env: dict[str, str]) -> int: - RUNTIME_DIR.mkdir(exist_ok=True) - log_path = RUNTIME_DIR / f"{name}.log" - log_file = log_path.open("a", encoding="utf-8") - kwargs: dict[str, object] = { - "cwd": cwd, - "env": env, - "stdout": log_file, - "stderr": subprocess.STDOUT, - "stdin": subprocess.DEVNULL, - } - if os.name == "nt": - kwargs["creationflags"] = subprocess.CREATE_NEW_PROCESS_GROUP - else: - kwargs["start_new_session"] = True - process = subprocess.Popen(command, **kwargs) - log_file.close() - return process.pid - - -def _read_pids() -> dict[str, int]: - if not PID_FILE.exists(): - return {} - try: - return {key: int(value) for key, value in json.loads(PID_FILE.read_text()).items()} - except (OSError, ValueError, TypeError): - return {} - - -def _write_pids(pids: dict[str, int]) -> None: - RUNTIME_DIR.mkdir(exist_ok=True) - PID_FILE.write_text(json.dumps(pids, indent=2), encoding="utf-8") - - -def _pid_alive(pid: int) -> bool: - if pid <= 0: - return False - try: - os.kill(pid, 0) - except OSError: - return False - return True - - -def _service_alive(pid: int, host: str, port: int) -> bool: - return _pid_alive(pid) or _port_open(host, port) - - -def start() -> None: - ensure_mysql() - wait_for_port("127.0.0.1", 3306) - backend_python = _ensure_backend_runtime() - - pids = _read_pids() - backend_env = build_backend_env() - if not _service_alive(pids.get("backend", -1), "127.0.0.1", 8000): - pids["backend"] = _spawn( - "backend", - [ - backend_python, - "-m", - "uvicorn", - "state_center.app.main:app", - "--host", - "0.0.0.0", - "--port", - "8000", - ], - ROOT, - backend_env, - ) - if not _service_alive(pids.get("frontend", -1), "127.0.0.1", 5173): - pids["frontend"] = _spawn( - "frontend", - ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "5173"], - ROOT / "state_center_web", - os.environ.copy(), - ) - _write_pids(pids) - wait_for_port("127.0.0.1", 8000) - wait_for_port("127.0.0.1", 5173) - print("MySQL: 127.0.0.1:3306") - print("Backend: http://127.0.0.1:8000") - print("Frontend: http://127.0.0.1:5173") - - -def status() -> int: - db = _port_open("127.0.0.1", 3306) - backend = False - backend_detail = "" - try: - with urlopen("http://127.0.0.1:8000/health", timeout=2) as response: - payload = json.loads(response.read().decode("utf-8")) - backend = response.status == 200 and payload.get("database") == "ok" - backend_detail = json.dumps(payload, ensure_ascii=False) - except (OSError, URLError, json.JSONDecodeError) as exc: - backend_detail = str(exc) - frontend = _port_open("127.0.0.1", 5173) - print(f"MySQL 3306: {'UP' if db else 'DOWN'}") - print(f"Backend 8000: {'UP' if backend else 'DOWN'} {backend_detail}".rstrip()) - print(f"Frontend 5173: {'UP' if frontend else 'DOWN'}") - return 0 if db and backend and frontend else 1 - - -def _stop_pid(pid: int) -> None: - try: - if os.name == "nt": - os.kill(pid, signal.SIGTERM) - else: - os.killpg(os.getpgid(pid), signal.SIGTERM) - except OSError: - return - - -def stop() -> None: - for pid in _read_pids().values(): - _stop_pid(pid) - if _docker_container_state() == "running": - _run(["docker", "stop", MYSQL_CONTAINER], check=False) - if PID_FILE.exists(): - PID_FILE.unlink() - print("Local integration stack stopped.") - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("command", choices=("start", "status", "stop")) - args = parser.parse_args() - try: - if args.command == "start": - start() - return 0 - if args.command == "status": - return status() - stop() - return 0 - except (OSError, RuntimeError, subprocess.CalledProcessError) as exc: - print(f"dev launcher error: {exc}", file=sys.stderr) - return 1 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/state_center/README.md b/state_center/README.md deleted file mode 100644 index dc1efb2..0000000 --- a/state_center/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# 状态中心(采购主链RPA一期 · 第1步骨架) - -Python + FastAPI + MySQL。库里只存**流程状态 + 对码累积别名 + 证据**;对码货品主数据在 **Oracle**,直连查(不复制)。 - -## 目录 - -``` -state_center/ -├── sql/schema.sql 建库脚本(job 那套 + mapping_config + 证据) -├── app/ -│ ├── config.py 配置(MySQL/Oracle 连接、表名列名,从环境变量读) -│ ├── db.py MySQL 访问(pymysql) -│ ├── match_engine.py 对码引擎(两级命中 + 规格标准化 + Oracle 取数) -│ └── main.py FastAPI:建单 + 回调(含幂等/乱序拒绝)+ 合同审批等待 + 整单查询 -├── tests/test_match_engine.py 对码单测(不依赖 DB/Oracle) -└── requirements.txt -``` - -## 起步 - -以下命令在 macOS/Linux 的终端执行;Windows PowerShell 只需要把激活命令换成下一段对应写法,接口和浏览器端完全相同。 - -```bash -python -m pip install -r state_center/requirements.txt - -# 1) 建库(先起个 MySQL 8) -mysql -uroot -p < state_center/sql/schema.sql - -# 2) 配连接(默认 root/root@127.0.0.1) -export MYSQL_DSN="mysql+pymysql://root:root@127.0.0.1:3306/rpa_center?charset=utf8mb4" - -# 3) 起服务 -uvicorn state_center.app.main:app --reload --port 8000 -# 打开 http://127.0.0.1:8000/docs 有全部接口可点 -``` - -Windows PowerShell: - -```powershell -py -m venv .venv -.\.venv\Scripts\Activate.ps1 -python -m pip install -r state_center\requirements.txt -$env:DEV_MODE = "true" -$env:MYSQL_DSN = "mysql+pymysql://root:root@127.0.0.1:3306/rpa_center?charset=utf8mb4" -python -m uvicorn state_center.app.main:app --reload --port 8000 -``` - -浏览器端另开一个终端: - -```bash -cd state_center_web -npm install -npm run dev -``` - -然后打开 `http://localhost:5173/`。Windows 和 macOS 均使用标准浏览器访问,不需要 Electron 或系统专用脚本。`DEV_MODE=true` 只用于本地样例货品和节点回调模拟,生产环境不要开启。 - -本地样例联调顺序:建单 → 写入订单明细(`POST /api/jobs/{job_id}/items`) → 开发接口装载样例货品(`POST /api/dev/match/load-fixture-goods`) → 运行对码。真实环境把样例接口替换为 Oracle 货品装载即可。 - -## 验证第1步(不接真实系统,假回调走全链) - -```bash -# 建单 -curl -X POST http://127.0.0.1:8000/api/jobs -H 'Content-Type: application/json' \ - -d '{"source_type":"YYC","order_date":"2026-08-04","supplier_name":"重庆亿昊药业"}' -# 拿到 job_id 后,模拟艺赛旗回调(带 token): -curl -X POST http://127.0.0.1:8000/api/jobs//nodes/ORDER_FETCH/start \ - -H 'X-Agent-Token: dev-agent-token' -H 'Content-Type: application/json' -d '{"attemptNo":1}' -curl -X POST http://127.0.0.1:8000/api/jobs//nodes/ORDER_FETCH/complete \ - -H 'X-Agent-Token: dev-agent-token' -H 'Content-Type: application/json' \ - -d '{"attemptNo":1,"summary":{"orderCount":12}}' -# 反复 start/complete 走完各节点,最后 GET 看整单轨迹: -curl http://127.0.0.1:8000/api/jobs/ -``` - -## 节点编排(13 = 11 主 + 2 条件) - -主链 11 步(每单都走): -`ORDER_FETCH → PRODUCT_MATCH → CONTRACT_CREATE → CONTRACT_APPROVE_WAIT → REBATE_HEADER → REBATE_IMPORT → REBATE_SUBMIT → M5_CREATE_ORDER → M5_MANUAL_CONFIRM → M5_RECEIPT_NOTICE → ARCHIVE_JOB` - -2 个条件节点(不满足条件自动跳过,不算漏节点): - -| 条件节点 | 何时执行 | 何时跳过 | -| --- | --- | --- | -| `OCR_EXTRACT` | 线下手工单(source_type=OFFLINE) | 线上单(医药城/小药药) | -| `SOURCE_ADD` | 对码判定缺货源(needs_source_add=1) | 货源齐全 | - -转移不是"数组下一个",是 `main.py` 里的显式转移表 `TRANSITIONS` + 条件跳过。 -每个节点标了执行方 `NODE_EXECUTOR`:STATE_CENTER(对码,内部算)/ RPA(艺赛旗点页面)/ HUMAN(一期人工)。 -所以文档里"11 个节点"和代码里"13 个"是同一套:**11 主 + 2 条件 = 13**。 - -## 关键设计点(会审确认) - -- **回调幂等**:同节点同 attempt 重复 complete 不会二次推进(靠 job_node 状态 + `callback_idempotency_key`)。 -- **乱序拒绝**:回调节点必须是 job 当前节点,否则 409(避免网络重发把状态推乱)。 -- **合同审批等待**(CONTRACT_APPROVE_WAIT)**不连续轮询**:进 `WAITING_EXTERNAL` 态,每 - `CONTRACT_WAIT_INTERVAL_MIN`(默认 30 分)由调度器扫 `GET /api/scheduler/due-contract-checks` - 触发 RPA 查一次,结果回 `POST .../CONTRACT_APPROVE_WAIT/check-result`;查满 - `CONTRACT_WAIT_MAX_CHECKS`(默认 8 次)还没过就升级 OPS。 -- **对码状态只有 4 种**:EXACT / ALIAS / MULTI / NONE(无 FUZZY;ALIAS=累积别名命中,非当次人工)。 -- **PRODUCT_MATCH 是状态中心自己算的节点**(executor=STATE_CENTER),不走 RPA 三回调,靠 - `POST /api/jobs/{id}/match/run` 推进:跑 `order_item` → 落 `product_match` → MULTI/NONE 建 - 待办转 WAITING_USER,全命中自动往下走;`POST /api/match/{id}/confirm` 人工确认后沉淀 - `mapping_config` 别名并推进。**前置**:`order_item` 已落库 + `POST /api/match/reload-goods` - 从 Oracle 装载过货品主数据(这两样是 Trae 任务2/3 的接真数据部分)。 -- **SOURCE_ADD 触发源明确**:对码拿到 `goods_id` 后,状态中心按历史 `supplier_name + goods_id` - 判断是否已有货源;没历史则写 `product_match.source_add_needed=1`、同步 `job.needs_source_add=1` - 并创建一条聚合的 `SOURCE_ADD` 待办。 -- **对码重跑幂等**:`product_match` 以 `(job_id, order_item_id)` 为当前态唯一键, - `match/run` 重跑时 upsert 结果并重建 OPEN 待办,不重复造结果/待办。 -- **alias 当前态唯一**:`match/confirm` 会先失效同一 `config_key` 的旧 active 记录,再插入新 active; - 装载 alias 时按 `updated_at/id` 固定顺序读取,历史脏数据也有确定结果。 - -## 对码接 Oracle(拿到连接串后) - -1. `pip install oracledb` -2. 在 `config.py` / 环境变量填 `ORACLE_DSN/USER/PASSWORD`,把 `ORACLE_GOODS_TABLE` 和各列名改成真实的。 -3. 开工时 `load_goods_from_oracle(settings)` 拉全量 → `MatchEngine.load_goods(...)`,之后内存匹配。 - -## 对码单测 - -```bash -python3 state_center/tests/test_match_engine.py # 6/6 passed -``` diff --git a/state_center/app/__init__.py b/state_center/app/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/state_center/app/config.py b/state_center/app/config.py deleted file mode 100644 index e33a5ff..0000000 --- a/state_center/app/config.py +++ /dev/null @@ -1,51 +0,0 @@ -"""配置:从环境变量读,别把密码写死在代码里。""" -import os - - -class Settings: - # 本地联调功能开关。生产环境保持关闭。 - DEV_MODE = os.getenv("DEV_MODE", "false").lower() == "true" - - # MySQL(状态中心自己的库) - MYSQL_DSN = os.getenv( - "MYSQL_DSN", - "mysql+pymysql://root:root@127.0.0.1:3306/rpa_center?charset=utf8mb4", - ) - - # Oracle(他们的货品主数据,只读)。拿到真实连接串后填这里。 - # 形如: username/password@host:1521/service_name - ORACLE_DSN = os.getenv("ORACLE_DSN", "") - ORACLE_USER = os.getenv("ORACLE_USER", "") - ORACLE_PASSWORD = os.getenv("ORACLE_PASSWORD", "") - - # M5 货品视图(福建货主对码)。账号密码只走环境变量,不进仓库。 - M5_HOST = os.getenv("M5_HOST", "173.1.1.215") - M5_PORT = int(os.getenv("M5_PORT", "1521")) - M5_SERVICE = os.getenv("M5_SERVICE", "m5") - M5_USER = os.getenv("M5_USER", "") - M5_PASSWORD = os.getenv("M5_PASSWORD", "") - M5_SCHEMA = os.getenv("M5_SCHEMA", "m5") - - # Oracle 货品主数据表(真实表名/列名拿到后改这里,先按设计文档 A~G 列占位) - ORACLE_GOODS_TABLE = os.getenv("ORACLE_GOODS_TABLE", "GOODS_MASTER") - ORACLE_COL_COMMON_NAME = os.getenv("ORACLE_COL_COMMON_NAME", "COMMON_NAME") # 通用名 - ORACLE_COL_APPROVAL_NO = os.getenv("ORACLE_COL_APPROVAL_NO", "APPROVAL_NO") # 批准文号 - ORACLE_COL_SPEC = os.getenv("ORACLE_COL_SPEC", "SPEC") # 规格 - ORACLE_COL_UNIT = os.getenv("ORACLE_COL_UNIT", "BASE_UNIT") # 基本单位 - ORACLE_COL_MANUFACTURER = os.getenv("ORACLE_COL_MANUFACTURER", "MANUFACTURER")# 生产厂家 - ORACLE_COL_GOODS_ID = os.getenv("ORACLE_COL_GOODS_ID", "GOODS_ID") # 货品ID - ORACLE_COL_GOODS_CODE = os.getenv("ORACLE_COL_GOODS_CODE", "GOODS_CODE") # 货品编码 - - # 对码货品主数据是否开工时全量 load 进内存(几万行推荐 True,快) - MATCH_LOAD_INTO_MEMORY = os.getenv("MATCH_LOAD_INTO_MEMORY", "true").lower() == "true" - - # RPA 回调鉴权 token - AGENT_TOKEN = os.getenv("AGENT_TOKEN", "dev-agent-token") - - # 合同审批等待(CONTRACT_APPROVE_WAIT):按业务方案定时查,不连续轮询。 - # 到点由调度器触发 RPA 去查一次审批状态,没过就再排下一次。 - CONTRACT_WAIT_INTERVAL_MIN = int(os.getenv("CONTRACT_WAIT_INTERVAL_MIN", "30")) # 每次间隔(分钟),业务方案≈半小时 - CONTRACT_WAIT_MAX_CHECKS = int(os.getenv("CONTRACT_WAIT_MAX_CHECKS", "8")) # 最多查几次,超了升级OPS(8次≈4小时) - - -settings = Settings() diff --git a/state_center/app/db.py b/state_center/app/db.py deleted file mode 100644 index df5d2cf..0000000 --- a/state_center/app/db.py +++ /dev/null @@ -1,21 +0,0 @@ -"""极简 MySQL 访问层(pymysql)。够第1步用,后面要换 SQLAlchemy 也行。""" -import pymysql -from pymysql.cursors import DictCursor - -from .config import settings - - -def _parse_dsn(dsn: str) -> dict: - # mysql+pymysql://user:pass@host:port/db?charset=utf8mb4 - body = dsn.split("://", 1)[1] - creds, rest = body.split("@", 1) - user, password = creds.split(":", 1) - hostport, dbq = rest.split("/", 1) - host, port = (hostport.split(":", 1) + ["3306"])[:2] - db = dbq.split("?", 1)[0] - return dict(host=host, port=int(port), user=user, password=password, database=db) - - -def get_conn(): - cfg = _parse_dsn(settings.MYSQL_DSN) - return pymysql.connect(charset="utf8mb4", cursorclass=DictCursor, autocommit=True, **cfg) diff --git a/state_center/app/m5_client.py b/state_center/app/m5_client.py deleted file mode 100644 index b8120a3..0000000 --- a/state_center/app/m5_client.py +++ /dev/null @@ -1,174 +0,0 @@ -"""M5 货品视图只读查询。账号密码来自环境变量或 connection.local.json。""" -from __future__ import annotations - -import json -import os -from pathlib import Path -from typing import Any - -from .config import settings - -FIXTURE_DIR = Path(__file__).resolve().parents[1] / "fixtures" -M5_DIR = FIXTURE_DIR / "m5" -ORDER_PATH = FIXTURE_DIR / "orders" / "yyc-fujian-20260804.json" -FUJIAN_PATH = M5_DIR / "fujian.json" -LOCAL_CONN_PATH = M5_DIR / "connection.local.json" - - -def _load_json(path: Path) -> dict[str, Any]: - return json.loads(path.read_text(encoding="utf-8")) - - -def load_connection() -> dict[str, Any]: - local: dict[str, Any] = {} - if LOCAL_CONN_PATH.is_file(): - local = _load_json(LOCAL_CONN_PATH) - host = os.getenv("M5_HOST") or local.get("host") or settings.M5_HOST - port = int(os.getenv("M5_PORT") or local.get("port") or settings.M5_PORT) - service = os.getenv("M5_SERVICE") or local.get("serviceName") or settings.M5_SERVICE - user = os.getenv("M5_USER") or local.get("user") or settings.M5_USER - password = os.getenv("M5_PASSWORD") or local.get("password") or settings.M5_PASSWORD - schema = os.getenv("M5_SCHEMA") or local.get("schema") or settings.M5_SCHEMA - return { - "host": host, - "port": port, - "serviceName": service, - "user": user, - "password": password, - "schema": schema, - } - - -def recorded_source_rows(goods_id: str) -> list[dict[str, Any]] | None: - """离线夹具:哈药牌这条 SQL 的 P1 结果,不连 M5。""" - params = lookup_params() - if str(goods_id) != params["expectedGoodsId"]: - return None - return [ - { - "ENTRYID": params["entryId"], - "PRIORITY": 1, - "GOODSTYPE": params["spec"], - "FACTORYNAME": params["manufacturer"], - } - ] - - -def evaluate_priority_source( - rows: list[dict[str, Any]], - *, - entry_id: int, - spec: str, - manufacturer: str, -) -> dict[str, Any]: - """PRIORITY=1 且货主/规格/厂家对上,才算货源齐全。""" - priority_rows = [row for row in rows if str(row.get("PRIORITY") or "") == "1"] - hit = next( - ( - row - for row in priority_rows - if str(row.get("ENTRYID") or "") == str(entry_id) - and str(row.get("GOODSTYPE") or "").strip() == spec.strip() - and str(row.get("FACTORYNAME") or "").strip() == manufacturer.strip() - ), - None, - ) - return { - "source_add_needed": hit is None, - "hit": hit, - "priorityRows": priority_rows, - } - - -def lookup_params(order: dict[str, Any] | None = None, fujian: dict[str, Any] | None = None) -> dict[str, Any]: - order = order or _load_json(ORDER_PATH) - fujian = fujian or _load_json(FUJIAN_PATH) - row = order["row"] - return { - "goodsNameLike": f"%{row['goodsNameLike']}%", - "approvalNo": row["approvalNo"], - "spec": row["spec"], - "manufacturer": row["manufacturer"], - "entryId": int(order["m5"]["entryId"] or fujian["entryId"]), - "expectedGoodsId": str(row["expectedGoodsId"]), - "sql": fujian["sql"], - "sourceSql": fujian["sourceSql"], - "expectedSourceAddNeeded": bool(row.get("expectedSourceAddNeeded", True)), - } - - -def connect(conn_cfg: dict[str, Any] | None = None): - cfg = conn_cfg or load_connection() - missing = [key for key in ("user", "password") if not cfg.get(key)] - if missing: - raise RuntimeError( - "M5 连接缺少 " + ", ".join(missing) + "。设 M5_USER/M5_PASSWORD,或写 fixtures/m5/connection.local.json" - ) - import oracledb - - dsn = f"{cfg['host']}:{cfg['port']}/{cfg['serviceName']}" - return oracledb.connect(user=cfg["user"], password=cfg["password"], dsn=dsn) - - -def lookup_one(conn_cfg: dict[str, Any] | None = None) -> dict[str, Any]: - params = lookup_params() - conn = connect(conn_cfg) - try: - cur = conn.cursor() - cur.execute( - params["sql"], - goodsNameLike=params["goodsNameLike"], - approvalNo=params["approvalNo"], - spec=params["spec"], - manufacturer=params["manufacturer"], - entryId=params["entryId"], - ) - rows = _rows_from_cursor(cur) - finally: - conn.close() - - goods_ids = [str(row.get("GOODSID") or "") for row in rows] - return { - "ok": len(rows) == 1 and goods_ids[0] == params["expectedGoodsId"], - "expectedGoodsId": params["expectedGoodsId"], - "hits": len(rows), - "goodsIds": goods_ids, - "rows": rows, - } - - -def _rows_from_cursor(cur) -> list[dict[str, Any]]: - columns = [col[0] for col in cur.description] - return [dict(zip(columns, row)) for row in cur.fetchall()] - - -def query_priority_source(goods_id: str, conn_cfg: dict[str, Any] | None = None) -> list[dict[str, Any]]: - fujian = _load_json(FUJIAN_PATH) - conn = connect(conn_cfg) - try: - cur = conn.cursor() - cur.execute(fujian["sourceSql"], goodsId=int(goods_id)) - return _rows_from_cursor(cur) - finally: - conn.close() - - -def check_priority_source(conn_cfg: dict[str, Any] | None = None) -> dict[str, Any]: - params = lookup_params() - rows = query_priority_source(params["expectedGoodsId"], conn_cfg) - judged = evaluate_priority_source( - rows, - entry_id=params["entryId"], - spec=params["spec"], - manufacturer=params["manufacturer"], - ) - judged["ok"] = judged["source_add_needed"] == params["expectedSourceAddNeeded"] - judged["expectedSourceAddNeeded"] = params["expectedSourceAddNeeded"] - judged["rows"] = rows - return judged - - -if __name__ == "__main__": - match = lookup_one() - source = check_priority_source() if match.get("ok") else {"skipped": True, "reason": "对码未命中,不查货源"} - print(json.dumps({"match": match, "source": source}, ensure_ascii=False, default=str, indent=2)) diff --git a/state_center/app/main.py b/state_center/app/main.py deleted file mode 100644 index 29d0c3f..0000000 --- a/state_center/app/main.py +++ /dev/null @@ -1,1511 +0,0 @@ -""" -状态中心 · FastAPI 入口(第1步骨架)。 - -提供: - - 建单 POST /api/jobs - - 节点开始 POST /api/jobs/{job_id}/nodes/{node_code}/start - - 节点成功 POST /api/jobs/{job_id}/nodes/{node_code}/complete - - 节点失败 POST /api/jobs/{job_id}/nodes/{node_code}/fail - - 合同审批查一次 POST /api/jobs/{job_id}/nodes/CONTRACT_APPROVE_WAIT/check-result - - 到点待查列表(调度器扫) GET /api/scheduler/due-contract-checks - - 对码运行(内部算) POST /api/jobs/{job_id}/match/run - - 对码人工确认 POST /api/match/{match_id}/confirm - - 装载货品主数据 POST /api/match/reload-goods - - 整单查询(画树状图用) GET /api/jobs/{job_id} - -鉴权:RPA 回调带 header X-Agent-Token。 - -节点编排(13 个 = 11 主节点 + 2 条件节点): - - 主链 11 步:ORDER_FETCH → PRODUCT_MATCH → CONTRACT_CREATE → CONTRACT_APPROVE_WAIT - → REBATE_HEADER → REBATE_IMPORT → REBATE_SUBMIT → M5_CREATE_ORDER - → M5_MANUAL_CONFIRM → M5_RECEIPT_NOTICE → ARCHIVE_JOB - - 2 条件节点:OCR_EXTRACT(仅线下单)、SOURCE_ADD(仅对码判定缺货源)。 - 条件不满足则自动跳过,不占流程。 - -转移不是"数组下一个",是显式转移表 + 条件节点判定(见 _next_node)。 -每个节点标了执行方(STATE_CENTER 编排 / RPA 执行 / HUMAN 人工挂起),见 NODE_EXECUTOR。 -回调做了幂等(重复 complete 不二次推进)和乱序拒绝(非当前节点回调返回 409)。 -""" -from __future__ import annotations - -import json -import uuid -from datetime import datetime, timedelta -from typing import Optional - -from fastapi import FastAPI, Header, HTTPException -from pydantic import BaseModel - -from .config import settings -from .db import get_conn -from .match_engine import GoodsRecord, MatchEngine, build_match_key, load_goods_from_oracle -from .web_state_machine import build_state_machine_meta, build_timeline - -app = FastAPI(title="采购主链RPA状态中心", version="0.1") - -# 全部 13 个节点(11 主 + 2 条件),仅用于展示口径 / 前端画图 / 校验节点名合法。 -# 顺序不代表实际转移,实际转移看 TRANSITIONS + _next_node。 -NODE_ORDER = [ - "ORDER_FETCH", "OCR_EXTRACT", "PRODUCT_MATCH", "SOURCE_ADD", - "CONTRACT_CREATE", "CONTRACT_APPROVE_WAIT", "REBATE_HEADER", - "REBATE_IMPORT", "REBATE_SUBMIT", "M5_CREATE_ORDER", - "M5_MANUAL_CONFIRM", "M5_RECEIPT_NOTICE", "ARCHIVE_JOB", -] - -# 显式转移表:node -> 下一个"直连"节点(不含条件跳过逻辑,跳过在 _should_skip 处理)。 -# None = 整单终点。条件节点(OCR_EXTRACT/SOURCE_ADD)也在链里,但可能被跳过。 -TRANSITIONS = { - "ORDER_FETCH": "OCR_EXTRACT", - "OCR_EXTRACT": "PRODUCT_MATCH", - "PRODUCT_MATCH": "SOURCE_ADD", - "SOURCE_ADD": "CONTRACT_CREATE", - "CONTRACT_CREATE": "CONTRACT_APPROVE_WAIT", - "CONTRACT_APPROVE_WAIT": "REBATE_HEADER", - "REBATE_HEADER": "REBATE_IMPORT", - "REBATE_IMPORT": "REBATE_SUBMIT", - "REBATE_SUBMIT": "M5_CREATE_ORDER", - "M5_CREATE_ORDER": "M5_MANUAL_CONFIRM", - "M5_MANUAL_CONFIRM": "M5_RECEIPT_NOTICE", - "M5_RECEIPT_NOTICE": "ARCHIVE_JOB", - "ARCHIVE_JOB": None, -} - -# 执行方标注:谁真正干这个节点。 -# STATE_CENTER = 状态中心内部算(对码),不派 RPA、不挂人工。 -# RPA = 艺赛旗点页面。 -# HUMAN = 一期人工做(状态中心只挂待办等回填)。 -NODE_EXECUTOR = { - "ORDER_FETCH": "RPA", - "OCR_EXTRACT": "RPA", # 线下单触发 OCR;线上单跳过 - "PRODUCT_MATCH": "STATE_CENTER", # 对码是状态中心内部算 - "SOURCE_ADD": "HUMAN", # 缺货源时人工在 M5 新增货源 - "CONTRACT_CREATE": "RPA", - "CONTRACT_APPROVE_WAIT": "RPA", # 到点由调度器触发 RPA 查一次审批 - "REBATE_HEADER": "RPA", - "REBATE_IMPORT": "RPA", - "REBATE_SUBMIT": "RPA", - "M5_CREATE_ORDER": "RPA", - "M5_MANUAL_CONFIRM": "HUMAN", # 一期人工检查/保存/签订 - "M5_RECEIPT_NOTICE": "HUMAN", # 一期人工生成收货通知单 - "ARCHIVE_JOB": "STATE_CENTER", -} - -HUMAN_NODE_ROLES = { - "SOURCE_ADD": "PURCHASER", - "M5_MANUAL_CONFIRM": "PURCHASER", - "M5_RECEIPT_NOTICE": "PURCHASER", -} - -HUMAN_TASK_TITLES = { - "M5_MANUAL_CONFIRM": "M5人工确认", - "M5_RECEIPT_NOTICE": "生成收货通知单", - "CONTRACT_APPROVE_WAIT": "合同审批超时", -} - -HUMAN_TASK_REASONS = { - "M5_MANUAL_CONFIRM": "M5采购单已录入待保存,需要人工核对、保存并签订。", - "M5_RECEIPT_NOTICE": "M5采购单已签订,需要生成收货通知单并回填单号。", - "CONTRACT_APPROVE_WAIT": "合同审批已超过等待上限,需要运维确认已通过或终止本单。", -} - -# 条件节点:满足条件才执行,否则自动跳过下一节点。 -CONDITIONAL_NODES = {"OCR_EXTRACT", "SOURCE_ADD"} - -# 业务编号回写:哪个节点产出哪个 job 字段 -BUSINESS_REF_FIELD = { - "contractSystemNo": "contract_system_no", - "rebateOrderNo": "rebate_order_no", - "m5OrderNo": "m5_order_no", - "receiptNoticeNo": "receipt_notice_no", -} - - -def _now(): - return datetime.now() - - -def _check_agent(token: Optional[str]): - if token != settings.AGENT_TOKEN: - raise HTTPException(status_code=401, detail="bad agent token") - - -def _should_skip(node_code: str, job: dict) -> bool: - """条件节点是否跳过。 - - OCR_EXTRACT:只有线下单(OFFLINE)才做 OCR,线上单跳过。 - - SOURCE_ADD:只有对码判定缺货源(needs_source_add=1)才做,否则跳过。 - """ - if node_code == "OCR_EXTRACT": - return job.get("source_type") != "OFFLINE" - if node_code == "SOURCE_ADD": - return not job.get("needs_source_add") - return False - - -def _next_node(node_code: str, job: dict) -> Optional[str]: - """按显式转移表找下一节点;遇到不满足条件的条件节点自动继续往后跳。""" - nxt = TRANSITIONS.get(node_code) - # 一路跳过不满足条件的条件节点 - while nxt is not None and nxt in CONDITIONAL_NODES and _should_skip(nxt, job): - nxt = TRANSITIONS.get(nxt) - return nxt - - -def _advance(cur, job: dict, node_code: str) -> Optional[str]: - """把 job 从 node_code 推进到下一节点,处理终点/合同审批等待/普通三种落法。 - 返回 next_node(None=整单结束)。调用方需保证 node_code 已记 SUCCESS。""" - job_id = job["job_id"] - nxt = _next_node(node_code, job) - if nxt is None: - cur.execute("UPDATE job SET status='SUCCESS',finished_at=%s,updated_at=%s WHERE job_id=%s", - (_now(), _now(), job_id)) - _log_event(cur, job_id, "JOB_FINISHED", None, "SYSTEM", None) - elif nxt == "ARCHIVE_JOB": - # 归档是状态中心自己的收口,进入即完成,不派 RPA、不挂人工。 - now = _now() - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status,started_at,ended_at,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s,%s)" - " ON DUPLICATE KEY UPDATE status='SUCCESS',ended_at=VALUES(ended_at)", - (job_id, "ARCHIVE_JOB", NODE_EXECUTOR["ARCHIVE_JOB"], 1, "SUCCESS", now, now, now), - ) - cur.execute( - "UPDATE job SET status='SUCCESS',finished_at=%s,updated_at=%s,current_node_code=%s WHERE job_id=%s", - (now, now, "ARCHIVE_JOB", job_id), - ) - _log_event(cur, job_id, "JOB_FINISHED", None, "SYSTEM", None) - return None - elif nxt == "CONTRACT_APPROVE_WAIT": - # 进等待外部态:不立刻派 RPA,挂 WAITING_EXTERNAL,到点由调度器触发查一次。 - next_check = _now() + timedelta(minutes=settings.CONTRACT_WAIT_INTERVAL_MIN) - cur.execute( - "UPDATE job SET current_node_code=%s,status='WAITING_EXTERNAL'," - "next_check_at=%s,wait_check_count=0,updated_at=%s WHERE job_id=%s", - (nxt, next_check, _now(), job_id), - ) - _log_event(cur, job_id, "NODE_STARTED", nxt, "SYSTEM", None, - {"wait": "CONTRACT_APPROVE", "next_check_at": next_check.isoformat()}) - elif nxt in HUMAN_NODE_ROLES: - role_code = HUMAN_NODE_ROLES[nxt] - _mark_node_waiting_user(cur, job_id, nxt) - cur.execute( - "UPDATE job SET current_node_code=%s,status='WAITING_USER'," - "current_role=%s,updated_at=%s WHERE job_id=%s", - (nxt, role_code, _now(), job_id), - ) - if nxt != "SOURCE_ADD": - _create_human_task(cur, job, nxt, role_code) - _log_event(cur, job_id, "MANUAL_HANDOFF", nxt, "SYSTEM", None, - {"role_code": role_code}) - else: - cur.execute("UPDATE job SET current_node_code=%s,status='PENDING',updated_at=%s WHERE job_id=%s", - (nxt, _now(), job_id)) - return nxt - - -def _log_event(cur, job_id, event_type, node_code, operator_type, operator, detail=None): - cur.execute( - "INSERT INTO job_event(job_id,event_type,node_code,operator_type,operator,detail_json,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s)", - (job_id, event_type, node_code, operator_type, operator, - json.dumps(detail, ensure_ascii=False) if detail else None, _now()), - ) - - -def _serialize_visible_roles(visible_roles: Optional[list[str]]) -> Optional[str]: - if visible_roles is None: - return None - return json.dumps(visible_roles, ensure_ascii=False) - - -def _parse_visible_roles(value): - if value in (None, ""): - return [] - if isinstance(value, list): - return [str(item) for item in value] - try: - parsed = json.loads(value) - except (TypeError, ValueError): - parsed = None - if isinstance(parsed, list): - return [str(item) for item in parsed] - return [part.strip() for part in str(value).split(",") if part.strip()] - - -def _record_job_artifacts(cur, job_id: str, node_code: str, attempt_no: int, - artifacts: Optional[list["NodeArtifactReq"]]): - if not artifacts: - return - for artifact in artifacts: - cur.execute( - "INSERT INTO job_artifact(job_id,node_code,attempt_no,artifact_type,storage_path," - "file_hash,visible_roles,is_masked,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)", - ( - job_id, - node_code, - attempt_no, - artifact.artifactType, - artifact.storagePath, - artifact.fileHash, - _serialize_visible_roles(artifact.visibleRoles), - 1 if artifact.isMasked else 0, - _now(), - ), - ) - - -def _fetch_job_artifacts(cur, job_id: str) -> list[dict]: - cur.execute( - "SELECT node_code,attempt_no,artifact_type,storage_path,file_hash,visible_roles," - "is_masked,created_at FROM job_artifact WHERE job_id=%s ORDER BY id", - (job_id,), - ) - rows = cur.fetchall() - out = [] - for row in rows: - out.append({ - "node_code": row.get("node_code"), - "attempt_no": row.get("attempt_no"), - "artifact_type": row.get("artifact_type"), - "storage_path": row.get("storage_path"), - "file_hash": row.get("file_hash"), - "visible_roles": _parse_visible_roles(row.get("visible_roles")), - "is_masked": bool(row.get("is_masked")), - "created_at": row.get("created_at"), - }) - return out - - -def _mark_node_waiting_user(cur, job_id: str, node_code: str): - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status,started_at,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s)" - " ON DUPLICATE KEY UPDATE status=VALUES(status),started_at=COALESCE(started_at,VALUES(started_at))", - (job_id, node_code, NODE_EXECUTOR.get(node_code, "HUMAN"), 1, "WAITING_USER", _now(), _now()), - ) - - -def _mark_node_success(cur, job_id: str, node_code: str): - """把当前人工/内部节点记 SUCCESS。 - - 已有 WAITING_USER 行则原地收口;合同审批超时这类已有 FAILED 检查历史的, - 另起 attempt,不覆盖查审批记录。 - """ - cur.execute( - "SELECT attempt_no,status FROM job_node WHERE job_id=%s AND node_code=%s" - " ORDER BY attempt_no DESC LIMIT 1", - (job_id, node_code), - ) - latest = cur.fetchone() - if latest and latest.get("status") == "WAITING_USER": - cur.execute( - "UPDATE job_node SET status='SUCCESS',ended_at=%s" - " WHERE job_id=%s AND node_code=%s AND attempt_no=%s", - (_now(), job_id, node_code, latest["attempt_no"]), - ) - return - - next_attempt = int((latest or {}).get("attempt_no") or 0) + 1 - now = _now() - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status,started_at,ended_at,created_at)" - " VALUES(%s,%s,%s,%s,'SUCCESS',%s,%s,%s)", - (job_id, node_code, NODE_EXECUTOR.get(node_code, "HUMAN"), next_attempt, now, now, now), - ) - - -def _create_human_task(cur, job: dict, node_code: str, role_code: str): - job_id = job["job_id"] - cur.execute( - "DELETE FROM user_task WHERE job_id=%s AND node_code=%s AND status='OPEN'", - (job_id, node_code), - ) - title_prefix = HUMAN_TASK_TITLES.get(node_code, node_code) - cur.execute( - "INSERT INTO user_task(task_id,job_id,node_code,role_code,title,reason_type," - "reason_user_friendly,why_me_text,status,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s,%s,'OPEN',%s)", - ( - uuid.uuid4().hex, - job_id, - node_code, - role_code, - f"{title_prefix}:{job['supplier_name']}", - node_code, - HUMAN_TASK_REASONS.get(node_code), - "该节点一期由人工处理,确认完成后流程继续。", - _now(), - ), - ) - - -def _supplier_has_source(cur, supplier_name: str, goods_id: str, current_job_id: str) -> bool: - """用状态中心历史结果判断该供应商是否已有该货品货源。 - - 一期没有 M5 货源 API,所以用历史已确认/已命中的 supplier+goods_id 作为明确触发源。 - """ - cur.execute( - "SELECT 1 FROM job j JOIN product_match pm ON pm.job_id=j.job_id" - " WHERE j.supplier_name=%s AND pm.goods_id=%s AND j.job_id<>%s" - " AND pm.match_status IN ('EXACT','ALIAS') LIMIT 1", - (supplier_name, goods_id, current_job_id), - ) - return cur.fetchone() is not None - - -def _source_add_needed( - cur, - job: dict, - goods_id: Optional[str], - spec: str = "", - manufacturer: str = "", -) -> int: - if not goods_id: - return 0 - from .config import settings - from .m5_client import ( - FUJIAN_PATH, - _load_json, - evaluate_priority_source, - load_connection, - query_priority_source, - recorded_source_rows, - ) - - if spec and manufacturer: - recorded = recorded_source_rows(str(goods_id)) - if recorded is not None and settings.DEV_MODE: - entry_id = int(_load_json(FUJIAN_PATH)["entryId"]) - judged = evaluate_priority_source( - recorded, - entry_id=entry_id, - spec=spec, - manufacturer=manufacturer, - ) - return 1 if judged["source_add_needed"] else 0 - - cfg = load_connection() - if cfg.get("user") and cfg.get("password") and spec and manufacturer: - try: - entry_id = int(_load_json(FUJIAN_PATH)["entryId"]) - rows = query_priority_source(str(goods_id), cfg) - judged = evaluate_priority_source( - rows, - entry_id=entry_id, - spec=spec, - manufacturer=manufacturer, - ) - return 1 if judged["source_add_needed"] else 0 - except Exception: - pass - return 0 if _supplier_has_source(cur, job["supplier_name"], goods_id, job["job_id"]) else 1 - - -def _build_source_add_candidates(cur, job_id: str) -> list[dict]: - """从 product_match 当前态生成 SOURCE_ADD 待办明细,按 goods_id 去重。""" - cur.execute( - "SELECT pm.id AS product_match_id,pm.order_item_id,pm.goods_id,pm.goods_code," - "pm.base_unit,pm.match_key,oi.raw_product_name,oi.spec,oi.manufacturer" - " FROM product_match pm JOIN order_item oi ON oi.id=pm.order_item_id" - " WHERE pm.job_id=%s AND pm.source_add_needed=1 AND pm.goods_id IS NOT NULL" - " ORDER BY pm.id", - (job_id,), - ) - out = [] - seen_goods = set() - for row in cur.fetchall(): - goods_id = row["goods_id"] - if goods_id in seen_goods: - continue - seen_goods.add(goods_id) - out.append({ - "goods_id": goods_id, - "goods_code": row["goods_code"], - "base_unit": row["base_unit"], - "raw_product_name": row["raw_product_name"], - "spec": row["spec"], - "manufacturer": row["manufacturer"], - "order_item_id": row["order_item_id"], - "product_match_id": row["product_match_id"], - "match_key": row["match_key"], - }) - return out - - -def _sync_source_add_task(cur, job: dict) -> list[dict]: - """把 product_match.source_add_needed 同步到 job.needs_source_add 和一条聚合待办。""" - job_id = job["job_id"] - candidates = _build_source_add_candidates(cur, job_id) - cur.execute( - "DELETE FROM user_task WHERE job_id=%s AND node_code='SOURCE_ADD' AND status='OPEN'", - (job_id,), - ) - cur.execute( - "UPDATE job SET needs_source_add=%s,updated_at=%s WHERE job_id=%s", - (1 if candidates else 0, _now(), job_id), - ) - if not candidates: - return [] - - detail = { - "supplier_name": job["supplier_name"], - "items": candidates, - } - cur.execute( - "INSERT INTO user_task(task_id,job_id,node_code,role_code,title,reason_type," - "reason_user_friendly,why_me_text,comparison_snapshot_json,candidates_json,status,created_at)" - " VALUES(%s,%s,'SOURCE_ADD','PURCHASER',%s,'SOURCE_ADD',%s,%s,%s,%s,'OPEN',%s)", - ( - uuid.uuid4().hex, - job_id, - f"新增货源:{job['supplier_name']}", - "该供应商未维护这些品种的货源,需要在 M5 新增后继续。", - "供应商货源由采购/业务在 M5 维护。", - json.dumps(detail, ensure_ascii=False), - json.dumps(candidates, ensure_ascii=False), - _now(), - ), - ) - _log_event(cur, job_id, "TASK_CREATED", "SOURCE_ADD", "SYSTEM", None, detail) - return candidates - - -# ---------------- 建单 ---------------- - -class CreateJobReq(BaseModel): - source_type: str # YYC/XYY/OFFLINE - order_date: str # YYYY-MM-DD - supplier_name: str - created_by: str = "system" - - -class OrderItemRowReq(BaseModel): - orderNo: str - rawProductName: str - platformProductCode: Optional[str] = None - spec: Optional[str] = None - manufacturer: Optional[str] = None - approvalNo: Optional[str] = None - qty: float - unitPrice: Optional[float] = None - sourceRowNo: Optional[int] = None - - -class OrderItemsIngestReq(BaseModel): - replace: bool = True - rows: list[OrderItemRowReq] - - -@app.post("/api/jobs") -def create_job(req: CreateJobReq): - job_id = f"{req.source_type}-{req.supplier_name}-{req.order_date.replace('-', '')}-{uuid.uuid4().hex[:6]}" - business_key = f"{req.source_type}|{req.supplier_name}|{req.order_date}" - need_pdf = 1 if req.source_type == "YYC" else 0 - first_node = NODE_ORDER[0] - - conn = get_conn() - with conn.cursor() as cur: - # 幂等:同 business_key 已有未结束 job 就不重复建 - cur.execute( - "SELECT job_id FROM job WHERE business_key=%s AND status NOT IN" - " ('SUCCESS','CANCELLED','FAILED_MANUAL') LIMIT 1", - (business_key,), - ) - exist = cur.fetchone() - if exist: - return {"job_id": exist["job_id"], "reused": True} - - cur.execute( - "INSERT INTO job(job_id,business_key,source_type,order_date,supplier_name," - "need_pdf_upload,current_node_code,status,auto_save_enabled,created_by,created_at,updated_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s,'PENDING',0,%s,%s,%s)", - (job_id, business_key, req.source_type, req.order_date, req.supplier_name, - need_pdf, first_node, req.created_by, _now(), _now()), - ) - _log_event(cur, job_id, "JOB_CREATED", None, "SYSTEM", req.created_by, - {"business_key": business_key}) - return {"job_id": job_id, "first_node": first_node, "reused": False} - - -@app.post("/api/jobs/{job_id}/items") -def ingest_order_items(job_id: str, req: OrderItemsIngestReq, - x_agent_token: Optional[str] = Header(default=None)): - """开发/接入侧写入订单明细。已有对码结果后禁止改写,避免破坏下游状态。""" - _check_agent(x_agent_token) - conn = get_conn() - with conn.cursor() as cur: - _load_job(cur, job_id) - cur.execute("SELECT COUNT(*) AS c FROM product_match WHERE job_id=%s", (job_id,)) - if cur.fetchone()["c"]: - raise HTTPException(status_code=409, detail="已有对码结果,不能覆盖订单明细") - - if req.replace: - cur.execute("DELETE FROM order_item WHERE job_id=%s", (job_id,)) - - order_nos = [] - for row in req.rows: - if row.orderNo not in order_nos: - order_nos.append(row.orderNo) - cur.execute( - "INSERT INTO order_item(job_id,order_no,raw_product_name,platform_product_code," - "spec,manufacturer,approval_no,qty,unit_price,source_row_no,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", - ( - job_id, - row.orderNo, - row.rawProductName, - row.platformProductCode, - row.spec, - row.manufacturer, - row.approvalNo, - row.qty, - row.unitPrice, - row.sourceRowNo, - _now(), - ), - ) - - cur.execute( - "UPDATE job SET order_no_list_json=%s,updated_at=%s WHERE job_id=%s", - (json.dumps(order_nos, ensure_ascii=False), _now(), job_id), - ) - _log_event(cur, job_id, "ORDER_ITEMS_INGESTED", "ORDER_FETCH", "ROBOT", None, - {"replace": req.replace, "inserted": len(req.rows), "order_nos": order_nos}) - return {"ok": True, "inserted": len(req.rows), "order_nos": order_nos} - - -@app.get("/api/jobs") -def list_jobs(status: Optional[str] = None, source_type: Optional[str] = None, - supplier_name: Optional[str] = None, date_from: Optional[str] = None, - date_to: Optional[str] = None): - conn = get_conn() - sql = ( - "SELECT job_id,supplier_name,order_date,source_type,status,current_node_code," - "current_role,created_at,updated_at,finished_at FROM job WHERE 1=1" - ) - params = [] - if status: - sql += " AND status=%s" - params.append(status) - if source_type: - sql += " AND source_type=%s" - params.append(source_type) - if supplier_name: - sql += " AND supplier_name LIKE %s" - params.append(f"%{supplier_name}%") - if date_from: - sql += " AND order_date>=%s" - params.append(date_from) - if date_to: - sql += " AND order_date<=%s" - params.append(date_to) - sql += " ORDER BY created_at DESC" - with conn.cursor() as cur: - cur.execute(sql, tuple(params)) - rows = cur.fetchall() - return {"items": rows} - - -@app.get("/api/tasks/my") -def list_my_tasks(roleCode: Optional[str] = None, status: Optional[str] = None): - conn = get_conn() - sql = ( - "SELECT task_id,job_id,node_code,order_item_id,product_match_id,role_code,status,title," - "reason_type,reason_user_friendly,why_me_text,candidates_json,submitted_action," - "submitted_at,created_at FROM user_task WHERE 1=1" - ) - params = [] - if roleCode: - sql += " AND role_code=%s" - params.append(roleCode) - if status: - sql += " AND status=%s" - params.append(status.upper()) - sql += " ORDER BY created_at DESC" - with conn.cursor() as cur: - cur.execute(sql, tuple(params)) - rows = cur.fetchall() - return {"items": rows} - - -# ---------------- 节点开始 ---------------- - -class NodeStartReq(BaseModel): - attemptNo: int = 1 - executorPlatform: Optional[str] = None - operator: Optional[str] = "agent" - - -def _load_job(cur, job_id: str) -> dict: - cur.execute("SELECT * FROM job WHERE job_id=%s", (job_id,)) - job = cur.fetchone() - if not job: - raise HTTPException(status_code=404, detail="job not found") - return job - - -def _guard_current_node(job: dict, node_code: str): - """乱序拒绝:回调的节点必须是该 job 当前节点,否则 409。 - 避免 RPA 端网络重发/顺序错乱把状态推乱。""" - if node_code not in NODE_ORDER: - raise HTTPException(status_code=400, detail=f"unknown node {node_code}") - if job.get("current_node_code") != node_code: - raise HTTPException( - status_code=409, - detail=f"out-of-order: job 当前在 {job.get('current_node_code')},拒绝 {node_code} 回调", - ) - - -@app.post("/api/jobs/{job_id}/nodes/{node_code}/start") -def node_start(job_id: str, node_code: str, req: NodeStartReq, - x_agent_token: Optional[str] = Header(default=None)): - _check_agent(x_agent_token) - conn = get_conn() - with conn.cursor() as cur: - job = _load_job(cur, job_id) - _guard_current_node(job, node_code) - - # 幂等:该节点该次尝试已 RUNNING/SUCCESS,直接回 ok,不重复起点 - cur.execute( - "SELECT status FROM job_node WHERE job_id=%s AND node_code=%s AND attempt_no=%s", - (job_id, node_code, req.attemptNo), - ) - row = cur.fetchone() - if row and row["status"] in ("RUNNING", "SUCCESS"): - return {"ok": True, "idempotent": True} - - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status,executor_platform," - "executor_run_id,started_at,created_at) VALUES(%s,%s,%s,%s,'RUNNING',%s,NULL,%s,%s)" - " ON DUPLICATE KEY UPDATE status='RUNNING',started_at=VALUES(started_at)", - (job_id, node_code, NODE_EXECUTOR.get(node_code, "RPA"), req.attemptNo, - req.executorPlatform, _now(), _now()), - ) - cur.execute( - "UPDATE job SET status='RUNNING',updated_at=%s WHERE job_id=%s", - (_now(), job_id), - ) - _log_event(cur, job_id, "NODE_STARTED", node_code, "ROBOT", req.operator) - return {"ok": True} - - -# ---------------- 节点成功 ---------------- - -class NodeArtifactReq(BaseModel): - artifactType: str - storagePath: str - fileHash: Optional[str] = None - visibleRoles: Optional[list[str]] = None - isMasked: bool = False - - -class NodeCompleteReq(BaseModel): - attemptNo: int = 1 - executorRunId: Optional[str] = None - idempotencyKey: Optional[str] = None # RPA 端生成的回调幂等键,重发同键不二次推进 - businessRefs: Optional[dict] = None # {contractSystemNo:..., rebateOrderNo:...} - summary: Optional[dict] = None - artifacts: Optional[list[NodeArtifactReq]] = None - endedAt: Optional[str] = None - - -@app.post("/api/jobs/{job_id}/nodes/{node_code}/complete") -def node_complete(job_id: str, node_code: str, req: NodeCompleteReq, - x_agent_token: Optional[str] = Header(default=None)): - _check_agent(x_agent_token) - - if NODE_EXECUTOR.get(node_code) == "HUMAN": - raise HTTPException(status_code=409, detail="人工节点只能通过待办提交,拒绝 RPA complete") - - # 约束:要求业务编号却没回传的节点,不许记 SUCCESS - required = {"CONTRACT_CREATE": "contractSystemNo", "REBATE_HEADER": "rebateOrderNo", - "M5_RECEIPT_NOTICE": "receiptNoticeNo"} - if node_code in required: - key = required[node_code] - if not (req.businessRefs or {}).get(key): - raise HTTPException(status_code=400, detail=f"{node_code} 必须回传 {key}") - - conn = get_conn() - with conn.cursor() as cur: - job = _load_job(cur, job_id) - - # 幂等:该节点该次尝试已 SUCCESS,直接回上次算出的 next,不二次推进 - cur.execute( - "SELECT status,callback_idempotency_key FROM job_node" - " WHERE job_id=%s AND node_code=%s AND attempt_no=%s", - (job_id, node_code, req.attemptNo), - ) - prev = cur.fetchone() - if prev and prev["status"] == "SUCCESS": - return {"ok": True, "next_node": _next_node(node_code, job), "idempotent": True} - - # 乱序拒绝:非当前节点的 complete 一律 409(幂等重发已在上面放行) - _guard_current_node(job, node_code) - - cur.execute( - "UPDATE job_node SET status='SUCCESS',executor_run_id=%s,ended_at=%s," - "callback_idempotency_key=%s,output_json=%s" - " WHERE job_id=%s AND node_code=%s AND attempt_no=%s", - (req.executorRunId, _now(), req.idempotencyKey, - json.dumps({"businessRefs": req.businessRefs, "summary": req.summary}, ensure_ascii=False), - job_id, node_code, req.attemptNo), - ) - # 回写业务编号(三把钥匙等) - if req.businessRefs: - for k, v in req.businessRefs.items(): - col = BUSINESS_REF_FIELD.get(k) - if col and v: - cur.execute(f"UPDATE job SET {col}=%s,updated_at=%s WHERE job_id=%s", - (v, _now(), job_id)) - _record_job_artifacts(cur, job_id, node_code, req.attemptNo, req.artifacts) - _log_event(cur, job_id, "NODE_SUCCESS", node_code, "ROBOT", None, req.summary) - - # 决定下一步(显式转移表 + 条件节点跳过) - nxt = _advance(cur, job, node_code) - return {"ok": True, "next_node": nxt} - - -# ---------------- 节点失败 ---------------- - -class NodeFailReq(BaseModel): - attemptNo: int = 1 - errorCode: str - errorSummary: Optional[str] = None - retryable: bool = False - routeRole: Optional[str] = None - artifacts: Optional[list[NodeArtifactReq]] = None - - -@app.post("/api/jobs/{job_id}/nodes/{node_code}/fail") -def node_fail(job_id: str, node_code: str, req: NodeFailReq, - x_agent_token: Optional[str] = Header(default=None)): - _check_agent(x_agent_token) - - # M5 质管缺失:不重试、不等质管,直接转人工手工做 - force_manual = req.errorCode == "M5_QC_MISSING" - - conn = get_conn() - with conn.cursor() as cur: - job = _load_job(cur, job_id) - _guard_current_node(job, node_code) # 只有当前节点能报失败,乱序 409 - - cur.execute( - "UPDATE job_node SET status='FAILED',error_code=%s,error_summary=%s," - "role_at_failure=%s,ended_at=%s WHERE job_id=%s AND node_code=%s AND attempt_no=%s", - (req.errorCode, req.errorSummary, req.routeRole, _now(), - job_id, node_code, req.attemptNo), - ) - _record_job_artifacts(cur, job_id, node_code, req.attemptNo, req.artifacts) - if force_manual: - job_status = "FAILED_MANUAL" - elif req.retryable: - job_status = "FAILED_RETRYABLE" - else: - job_status = "WAITING_USER" # 业务类转人工待办 - cur.execute("UPDATE job SET status=%s,current_role=%s,updated_at=%s WHERE job_id=%s", - (job_status, req.routeRole, _now(), job_id)) - _log_event(cur, job_id, "NODE_FAILED", node_code, "ROBOT", None, - {"errorCode": req.errorCode, "retryable": req.retryable}) - return {"ok": True, "job_status": job_status} - - -@app.post("/api/jobs/{job_id}/retry") -def retry_job(job_id: str, x_agent_token: Optional[str] = Header(default=None)): - """把 FAILED_RETRYABLE 的当前节点放回可 start 状态。 - - 不覆盖失败历史:下一轮 start 用 attempt_no+1 另起 job_node 行。 - """ - _check_agent(x_agent_token) - conn = get_conn() - with conn.cursor() as cur: - job = _load_job(cur, job_id) - if job.get("status") != "FAILED_RETRYABLE": - raise HTTPException( - status_code=409, - detail=f"job 不在可重试状态(当前 {job.get('status')})", - ) - node_code = job["current_node_code"] - cur.execute( - "SELECT COALESCE(MAX(attempt_no), 0) AS max_attempt FROM job_node" - " WHERE job_id=%s AND node_code=%s", - (job_id, node_code), - ) - row = cur.fetchone() or {} - next_attempt = int(row.get("max_attempt") or 0) + 1 - cur.execute( - "UPDATE job SET status='PENDING',updated_at=%s WHERE job_id=%s", - (_now(), job_id), - ) - _log_event( - cur, job_id, "NODE_STARTED", node_code, "SYSTEM", None, - {"retry": True, "attempt_no": next_attempt}, - ) - return {"ok": True, "node_code": node_code, "attempt_no": next_attempt} - - -# ---------------- 合同审批等待(定时查一次,不连续轮询) ---------------- - -@app.get("/api/scheduler/due-contract-checks") -def due_contract_checks(x_agent_token: Optional[str] = Header(default=None)): - """调度器/RPA 定时扫这个:到点该查审批的 job 列表。 - 业务方案:送审后每 CONTRACT_WAIT_INTERVAL_MIN 分钟查一次,不死等。""" - _check_agent(x_agent_token) - conn = get_conn() - with conn.cursor() as cur: - cur.execute( - "SELECT job_id,contract_system_no,wait_check_count,next_check_at FROM job" - " WHERE status='WAITING_EXTERNAL' AND current_node_code='CONTRACT_APPROVE_WAIT'" - " AND next_check_at IS NOT NULL AND next_check_at<=%s ORDER BY next_check_at", - (_now(),), - ) - rows = cur.fetchall() - return {"due": rows, "interval_min": settings.CONTRACT_WAIT_INTERVAL_MIN, - "max_checks": settings.CONTRACT_WAIT_MAX_CHECKS} - - -class ContractCheckReq(BaseModel): - approved: bool # RPA 查完:审批是否已通过 - operator: Optional[str] = "agent" - detail: Optional[str] = None - - -@app.post("/api/jobs/{job_id}/nodes/CONTRACT_APPROVE_WAIT/check-result") -def contract_check_result(job_id: str, req: ContractCheckReq, - x_agent_token: Optional[str] = Header(default=None)): - """RPA 到点登录查了一次审批状态,把结果回给状态中心。 - - 通过 → 该节点 SUCCESS,推进到 REBATE_HEADER。 - - 未通过 → 次数+1;没超上限则排下一次查(next_check_at);超了升级 OPS(WAITING_USER)。 - """ - _check_agent(x_agent_token) - conn = get_conn() - with conn.cursor() as cur: - job = _load_job(cur, job_id) - if job.get("current_node_code") != "CONTRACT_APPROVE_WAIT" or job.get("status") != "WAITING_EXTERNAL": - raise HTTPException(status_code=409, - detail=f"job 不在合同审批等待态(当前 {job.get('current_node_code')}/{job.get('status')})") - - # 本次是第几次查(1-based)。每次查都单独落一行 job_node(不覆盖历史), - # attempt_no 递增 → 命中 uniq_job_node_attempt 也不冲突,审计轨迹完整。 - attempt = int(job.get("wait_check_count") or 0) + 1 - - if req.approved: - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status," - "started_at,ended_at,created_at) VALUES(%s,'CONTRACT_APPROVE_WAIT',%s,%s,'SUCCESS',%s,%s,%s)", - (job_id, NODE_EXECUTOR["CONTRACT_APPROVE_WAIT"], attempt, _now(), _now(), _now()), - ) - nxt = _next_node("CONTRACT_APPROVE_WAIT", job) # REBATE_HEADER - cur.execute( - "UPDATE job SET current_node_code=%s,status='PENDING',wait_check_count=%s," - "next_check_at=NULL,updated_at=%s WHERE job_id=%s", - (nxt, attempt, _now(), job_id), - ) - _log_event(cur, job_id, "NODE_SUCCESS", "CONTRACT_APPROVE_WAIT", "ROBOT", req.operator, - {"approved": True, "checks": attempt}) - return {"ok": True, "next_node": nxt} - - # 未通过:本次查也单独落一行(记为一次尝试),再决定重排还是升级 - over_limit = attempt >= settings.CONTRACT_WAIT_MAX_CHECKS - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status,error_code," - "error_summary,role_at_failure,started_at,ended_at,created_at)" - " VALUES(%s,'CONTRACT_APPROVE_WAIT',%s,%s,%s,%s,%s,%s,%s,%s,%s)", - (job_id, NODE_EXECUTOR["CONTRACT_APPROVE_WAIT"], attempt, - "FAILED" if over_limit else "WAITING_EXTERNAL", - "CONTRACT_APPROVE_TIMEOUT" if over_limit else None, - req.detail, "OPS" if over_limit else None, _now(), _now(), _now()), - ) - if over_limit: - # 超上限:升级 OPS 人工介入,并建一条可提交的待办。 - cur.execute( - "UPDATE job SET status='WAITING_USER',current_role='OPS'," - "wait_check_count=%s,next_check_at=NULL,updated_at=%s WHERE job_id=%s", - (attempt, _now(), job_id), - ) - _create_human_task(cur, job, "CONTRACT_APPROVE_WAIT", "OPS") - _log_event(cur, job_id, "MANUAL_HANDOFF", "CONTRACT_APPROVE_WAIT", "SYSTEM", None, - {"reason": "approve_timeout", "checks": attempt}) - return {"ok": True, "escalated": True, "job_status": "WAITING_USER"} - - # 没超:排下一次查 - next_check = _now() + timedelta(minutes=settings.CONTRACT_WAIT_INTERVAL_MIN) - cur.execute( - "UPDATE job SET wait_check_count=%s,next_check_at=%s,updated_at=%s WHERE job_id=%s", - (attempt, next_check, _now(), job_id), - ) - _log_event(cur, job_id, "NODE_STARTED", "CONTRACT_APPROVE_WAIT", "ROBOT", req.operator, - {"approved": False, "checks": attempt, "next_check_at": next_check.isoformat()}) - return {"ok": True, "approved": False, "checks": attempt, "next_check_at": next_check.isoformat()} - - -# ---------------- 对码(PRODUCT_MATCH,状态中心内部算) ---------------- -# -# 骨架说明:对码是状态中心自己算的节点(executor=STATE_CENTER),不派 RPA。 -# 依赖两样东西,拿到后本节点才真正跑得动: -# 1) order_item 已落库(建单/ORDER_FETCH 后把订单明细写进来)——Trae 任务; -# 2) 货品主数据装载进 MatchEngine(开工时从 Oracle 全量拉)——需 Oracle 真连。 -# 当前给出可推进的骨架:有明细就跑 match_engine 落 product_match、判 needs_source_add、 -# MULTI/NONE 建 user_task 转人工,全命中则推进下一节点;没明细/引擎没装载则明确报错,不静默卡。 - -# 进程内对码引擎(开工 reload 一次,后续内存匹配)。多进程部署时各进程各自 reload。 -_ENGINE = MatchEngine() -_ENGINE_LOADED = False - - -@app.post("/api/match/reload-goods") -def reload_goods(x_agent_token: Optional[str] = Header(default=None)): - """从 Oracle 全量拉货品主数据装载进内存引擎。需先配好 ORACLE_* 且 pip install oracledb。""" - _check_agent(x_agent_token) - if not settings.ORACLE_DSN: - raise HTTPException(status_code=400, detail="未配置 ORACLE_DSN,无法装载货品主数据") - global _ENGINE_LOADED - records = load_goods_from_oracle(settings) - _ENGINE.load_goods(records) - _ENGINE_LOADED = True - return {"ok": True, "loaded": len(records)} - - -@app.post("/api/dev/match/load-fixture-goods") -def load_fixture_goods(x_agent_token: Optional[str] = Header(default=None)): - """仅本地联调用,不依赖 Oracle 装载一组可重复的货品样例。""" - _check_agent(x_agent_token) - if not settings.DEV_MODE: - raise HTTPException(status_code=404, detail="开发接口未启用") - - records = [ - GoodsRecord("阿卡波糖片", "国药准字H00000001", "50mg*30片", "盒", "示例制药", "G-001", "YP-001"), - GoodsRecord("阿莫西林胶囊", "国药准字H00000002", "0.25g*24粒", "盒", "示例医药", "G-002", "YP-002"), - GoodsRecord("氯化钠注射液", "国药准字H00000003", "100ml", "瓶", "示例药业", "G-003", "YP-003"), - GoodsRecord( - "哈药牌钙铁锌口服液", - "食健备G201923000558", - "10ml*90支", - "盒", - "哈药集团三精制药有限公司", - "4000109983", - "4000109983", - ), - ] - global _ENGINE_LOADED - _ENGINE.load_goods(records) - _ENGINE_LOADED = True - return {"ok": True, "loaded": len(records)} - - -def _load_aliases_into_engine(cur) -> int: - """把 mapping_config(PRODUCT,active)里的累积别名装进引擎 alias_map。 - target_value 存的是 {"goods_id":..,"goods_code":..,"base_unit":..} 的 JSON。""" - cur.execute( - "SELECT config_key,target_value FROM mapping_config" - " WHERE config_type='PRODUCT' AND is_active=1" - " ORDER BY config_key,updated_at,id", - ) - alias = {} - for row in cur.fetchall(): - try: - tv = json.loads(row["target_value"]) if row["target_value"] else {} - except (TypeError, ValueError): - continue - gid = tv.get("goods_id") - if gid: - alias[row["config_key"]] = (gid, tv.get("goods_code", ""), tv.get("base_unit", "")) - _ENGINE.load_aliases(alias) - return len(alias) - - -@app.post("/api/jobs/{job_id}/match/run") -def match_run(job_id: str, x_agent_token: Optional[str] = Header(default=None)): - """对该 job 的 order_item 全量跑对码,落 product_match。 - - 全部 EXACT/ALIAS(且不缺货源)→ 推进下一节点。 - - 有 MULTI/NONE → 逐条建 user_task,job 转 WAITING_USER(单条挂起,整批继续落库)。 - """ - _check_agent(x_agent_token) - if not _ENGINE_LOADED: - raise HTTPException(status_code=409, detail="对码引擎未装载货品主数据,先调 /api/match/reload-goods") - - conn = get_conn() - try: - conn.begin() - with conn.cursor() as cur: - job = _load_job(cur, job_id) - _guard_current_node(job, "PRODUCT_MATCH") - - cur.execute( - "SELECT id,raw_product_name,approval_no,spec,manufacturer FROM order_item" - " WHERE job_id=%s ORDER BY id", (job_id,), - ) - items = cur.fetchall() - if not items: - # 明确报错,不静默推进(否则等于跳过对码) - raise HTTPException(status_code=400, detail=f"job {job_id} 没有 order_item,无法对码") - - _load_aliases_into_engine(cur) - - # 对码结果是当前态,重跑时用 job_id+order_item_id upsert,避免重复 product_match/user_task。 - cur.execute( - "DELETE FROM user_task WHERE job_id=%s AND node_code IN ('PRODUCT_MATCH','SOURCE_ADD')" - " AND status='OPEN'", - (job_id,), - ) - - stat = {"EXACT": 0, "ALIAS": 0, "MULTI": 0, "NONE": 0, "SOURCE_ADD": 0} - need_match_human = False - for it in items: - r = _ENGINE.match_one(it["id"], it["raw_product_name"], it["approval_no"] or "", - it["spec"] or "", it["manufacturer"] or "") - stat[r.match_status] = stat.get(r.match_status, 0) + 1 - source_add_needed = _source_add_needed( - cur, job, r.goods_id, it.get("spec") or "", it.get("manufacturer") or "" - ) - cur.execute( - "INSERT INTO product_match(job_id,order_item_id,match_key,match_status," - "goods_id,goods_code,base_unit,candidates_json,source_add_needed,created_at)" - " VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" - " ON DUPLICATE KEY UPDATE match_key=VALUES(match_key),match_status=VALUES(match_status)," - "goods_id=VALUES(goods_id),goods_code=VALUES(goods_code),base_unit=VALUES(base_unit)," - "candidates_json=VALUES(candidates_json),source_add_needed=VALUES(source_add_needed)," - "confirmed_by=NULL,confirmed_at=NULL,id=LAST_INSERT_ID(id)", - (job_id, it["id"], r.match_key, r.match_status, r.goods_id, r.goods_code, - r.base_unit, - json.dumps(r.candidates, ensure_ascii=False) if r.candidates else None, - source_add_needed, _now()), - ) - match_id = cur.lastrowid - if r.match_status in ("MULTI", "NONE"): - need_match_human = True - reason = "MATCH_MULTI" if r.match_status == "MULTI" else "MATCH_NONE" - cur.execute( - "INSERT INTO user_task(task_id,job_id,node_code,order_item_id,product_match_id," - "role_code,title,reason_type,candidates_json,status,created_at)" - " VALUES(%s,%s,'PRODUCT_MATCH',%s,%s,'PLANNER',%s,%s,%s,'OPEN',%s)", - (uuid.uuid4().hex, job_id, it["id"], match_id, - f"对码待确认:{it['raw_product_name']}", reason, - json.dumps(r.candidates, ensure_ascii=False) if r.candidates else None, _now()), - ) - - source_add_candidates = _sync_source_add_task(cur, job) - stat["SOURCE_ADD"] = len(source_add_candidates) - - cur.execute( - "INSERT INTO job_node(job_id,node_code,executor_type,attempt_no,status,started_at,ended_at,created_at)" - " VALUES(%s,'PRODUCT_MATCH',%s,1,%s,%s,%s,%s)" - " ON DUPLICATE KEY UPDATE status=VALUES(status),ended_at=VALUES(ended_at)", - (job_id, NODE_EXECUTOR["PRODUCT_MATCH"], "WAITING_USER" if need_match_human else "SUCCESS", - _now(), _now(), _now()), - ) - _log_event(cur, job_id, "NODE_SUCCESS" if not need_match_human else "TASK_CREATED", - "PRODUCT_MATCH", "SYSTEM", None, stat) - - if need_match_human: - # 有待确认:job 转人工待办,不推进(人工 confirm 后再推进)。 - cur.execute( - "UPDATE job SET status='WAITING_USER',current_role='PLANNER',updated_at=%s WHERE job_id=%s", - (_now(), job_id), - ) - conn.commit() - return {"ok": True, "stat": stat, "waiting_user": True, - "source_add_needed": bool(source_add_candidates)} - - # 全部已明确匹配:按 needs_source_add 决定是否进入 SOURCE_ADD,否则进合同建单。 - job = _load_job(cur, job_id) - nxt = _advance(cur, job, "PRODUCT_MATCH") - conn.commit() - return {"ok": True, "stat": stat, "next_node": nxt, - "source_add_needed": bool(source_add_candidates)} - except Exception: - conn.rollback() - raise - finally: - conn.close() - - -class MatchConfirmReq(BaseModel): - goods_id: str # 人工选定/新增的货品ID - goods_code: Optional[str] = None - base_unit: Optional[str] = None - confirmed_by: str = "planner" - save_as_alias: bool = True # 是否把这次选择沉淀成累积别名(下次自动命中) - - -@app.post("/api/match/{match_id}/confirm") -def match_confirm(match_id: int, req: MatchConfirmReq, - x_agent_token: Optional[str] = Header(default=None)): - """人工确认一条 MULTI/NONE 对码结果: - - 回写 product_match(goods_id/编码/单位、确认人)。 - - save_as_alias=1 时把 match_key→货品ID 沉淀进 mapping_config(PRODUCT),下次自动 ALIAS 命中。 - - 关掉对应 user_task;若该 job 已无待确认,推进 PRODUCT_MATCH 到下一节点。 - 注意:只写 mapping_config 累积别名,绝不回写 Oracle 货品主数据(主数据只读)。 - """ - _check_agent(x_agent_token) - conn = get_conn() - try: - conn.begin() - with conn.cursor() as cur: - cur.execute("SELECT * FROM product_match WHERE id=%s", (match_id,)) - pm = cur.fetchone() - if not pm: - raise HTTPException(status_code=404, detail="product_match not found") - job_id = pm["job_id"] - job = _load_job(cur, job_id) - oi = None - if pm.get("order_item_id"): - cur.execute( - "SELECT spec,manufacturer FROM order_item WHERE id=%s", - (pm["order_item_id"],), - ) - oi = cur.fetchone() - source_add_needed = _source_add_needed( - cur, - job, - req.goods_id, - (oi or {}).get("spec") or "", - (oi or {}).get("manufacturer") or "", - ) - - cur.execute( - "UPDATE product_match SET match_status='ALIAS',goods_id=%s,goods_code=%s,base_unit=%s," - "source_add_needed=%s,confirmed_by=%s,confirmed_at=%s WHERE id=%s", - (req.goods_id, req.goods_code, req.base_unit, source_add_needed, - req.confirmed_by, _now(), match_id), - ) - - if req.save_as_alias: - target = json.dumps({"goods_id": req.goods_id, "goods_code": req.goods_code, - "base_unit": req.base_unit}, ensure_ascii=False) - cur.execute( - "UPDATE mapping_config SET is_active=0,effective_to=%s,updated_by=%s,updated_at=%s" - " WHERE config_type='PRODUCT' AND config_key=%s AND is_active=1", - (_now(), req.confirmed_by, _now(), pm["match_key"]), - ) - cur.execute( - "INSERT INTO mapping_config(config_type,config_key,target_value,is_active," - "effective_from,updated_by,updated_at)" - " VALUES('PRODUCT',%s,%s,1,%s,%s,%s)", - (pm["match_key"], target, _now(), req.confirmed_by, _now()), - ) - - # 精确关掉这条对码结果对应的待办(按 product_match_id 关联,不再靠"最早 OPEN"猜) - cur.execute( - "UPDATE user_task SET status='SUBMITTED',submitted_by=%s,submitted_at=%s" - " WHERE product_match_id=%s AND status='OPEN'", - (req.confirmed_by, _now(), match_id), - ) - _log_event(cur, job_id, "TASK_SUBMITTED", "PRODUCT_MATCH", "USER", req.confirmed_by, - {"match_id": match_id, "goods_id": req.goods_id, - "source_add_needed": bool(source_add_needed)}) - - source_add_candidates = _sync_source_add_task(cur, job) - - # 还有没有未解决的对码?(product_match 里仍是 MULTI/NONE 的) - cur.execute( - "SELECT COUNT(*) AS c FROM product_match WHERE job_id=%s AND match_status IN ('MULTI','NONE')", - (job_id,), - ) - remaining = cur.fetchone()["c"] - if remaining == 0: - job = _load_job(cur, job_id) - if job.get("current_node_code") == "PRODUCT_MATCH": - cur.execute( - "UPDATE job_node SET status='SUCCESS',ended_at=%s" - " WHERE job_id=%s AND node_code='PRODUCT_MATCH' AND attempt_no=1", - (_now(), job_id), - ) - nxt = _advance(cur, job, "PRODUCT_MATCH") - conn.commit() - return {"ok": True, "all_resolved": True, "next_node": nxt, - "source_add_needed": bool(source_add_candidates)} - conn.commit() - return {"ok": True, "all_resolved": remaining == 0, "remaining": remaining, - "source_add_needed": bool(source_add_candidates)} - except Exception: - conn.rollback() - raise - finally: - conn.close() - - -# ---------------- 人工待办提交(Web/H5 用) ---------------- - -class TaskSubmitReq(BaseModel): - action: str - payload: Optional[dict] = None - submitToken: str - operator: Optional[str] = "user" - - -def _submit_candidate_selection(cur, task: dict, job: dict, payload: dict, operator: str) -> dict: - """在当前事务/连接中完成一条对码候选确认。""" - match_id = payload.get("productMatchId") - goods_id = payload.get("goodsId") - if not match_id or not goods_id: - raise HTTPException( - status_code=400, - detail="选择候选货品时必须提供 productMatchId 和 goodsId", - ) - if task.get("node_code") != "PRODUCT_MATCH": - raise HTTPException(status_code=400, detail="该待办不是对码待办") - if task.get("product_match_id") and int(match_id) != int(task["product_match_id"]): - raise HTTPException(status_code=409, detail="候选货品与当前待办不匹配") - if job.get("current_node_code") != "PRODUCT_MATCH": - raise HTTPException(status_code=409, detail="当前单据已不在对码节点") - - cur.execute("SELECT * FROM product_match WHERE id=%s", (match_id,)) - pm = cur.fetchone() - if not pm or pm.get("job_id") != task["job_id"]: - raise HTTPException(status_code=404, detail="对码结果不存在") - - oi = None - if pm.get("order_item_id"): - cur.execute( - "SELECT spec,manufacturer FROM order_item WHERE id=%s", - (pm["order_item_id"],), - ) - oi = cur.fetchone() - source_add_needed = _source_add_needed( - cur, - job, - goods_id, - (oi or {}).get("spec") or "", - (oi or {}).get("manufacturer") or "", - ) - goods_code = payload.get("goodsCode") - base_unit = payload.get("baseUnit") - cur.execute( - "UPDATE product_match SET match_status='ALIAS',goods_id=%s,goods_code=%s,base_unit=%s," - "source_add_needed=%s,confirmed_by=%s,confirmed_at=%s WHERE id=%s", - (goods_id, goods_code, base_unit, source_add_needed, operator, _now(), match_id), - ) - - if payload.get("saveAsAlias", True): - target = json.dumps( - {"goods_id": goods_id, "goods_code": goods_code, "base_unit": base_unit}, - ensure_ascii=False, - ) - cur.execute( - "UPDATE mapping_config SET is_active=0,effective_to=%s,updated_by=%s,updated_at=%s" - " WHERE config_type='PRODUCT' AND config_key=%s AND is_active=1", - (_now(), operator, _now(), pm["match_key"]), - ) - cur.execute( - "INSERT INTO mapping_config(config_type,config_key,target_value,is_active," - "effective_from,updated_by,updated_at) VALUES('PRODUCT',%s,%s,1,%s,%s,%s)", - (pm["match_key"], target, _now(), operator, _now()), - ) - - source_add_candidates = _sync_source_add_task(cur, job) - cur.execute( - "SELECT COUNT(*) AS c FROM product_match WHERE job_id=%s AND match_status IN ('MULTI','NONE')", - (task["job_id"],), - ) - remaining = cur.fetchone()["c"] - result = { - "ok": True, - "all_resolved": remaining == 0, - "remaining": remaining, - "source_add_needed": bool(source_add_candidates), - } - if remaining == 0: - cur.execute( - "UPDATE job_node SET status='SUCCESS',ended_at=%s" - " WHERE job_id=%s AND node_code='PRODUCT_MATCH' AND attempt_no=1", - (_now(), task["job_id"]), - ) - result["next_node"] = _advance(cur, job, "PRODUCT_MATCH") - return result - - -@app.post("/api/tasks/{task_id}/submit") -def task_submit(task_id: str, req: TaskSubmitReq, - x_agent_token: Optional[str] = Header(default=None)): - _check_agent(x_agent_token) - if not req.submitToken or len(req.submitToken) > 64: - raise HTTPException(status_code=400, detail="submitToken 最长 64") - - conn = get_conn() - began = False - try: - begin = getattr(conn, "begin", None) - if callable(begin): - begin() - began = True - result = _task_submit_body(conn, task_id, req) - if began: - conn.commit() - return result - except Exception: - rollback = getattr(conn, "rollback", None) - if callable(rollback): - rollback() - raise - finally: - close = getattr(conn, "close", None) - if callable(close): - close() - - -def _task_submit_body(conn, task_id: str, req: TaskSubmitReq): - with conn.cursor() as cur: - cur.execute("SELECT * FROM user_task WHERE task_id=%s", (task_id,)) - task = cur.fetchone() - if not task: - raise HTTPException(status_code=404, detail="task not found") - - existing_token = task.get("submit_token") - if existing_token: - if existing_token != req.submitToken: - raise HTTPException(status_code=409, detail="task already submitted with another token") - try: - result = json.loads(task.get("submitted_result_json") or "{}") - except (TypeError, ValueError): - result = {"ok": True} - result["idempotent"] = True - return result - - if task.get("status") != "OPEN": - raise HTTPException(status_code=409, detail=f"task status is {task.get('status')}") - - job = _load_job(cur, task["job_id"]) - node_code = task["node_code"] - payload = req.payload or {} - - if req.action == "SELECT_CANDIDATE": - result = _submit_candidate_selection(cur, task, job, payload, req.operator or "user") - elif req.action == "CONFIRM_AND_CONTINUE": - if job.get("current_node_code") != node_code: - raise HTTPException( - status_code=409, - detail=f"job 当前在 {job.get('current_node_code')},不能提交 {node_code}", - ) - - if node_code == "M5_RECEIPT_NOTICE": - receipt_no = payload.get("receiptNoticeNo") - if not receipt_no: - raise HTTPException(status_code=400, detail="M5_RECEIPT_NOTICE 需要 receiptNoticeNo") - cur.execute( - "UPDATE job SET receipt_notice_no=%s,updated_at=%s WHERE job_id=%s", - (receipt_no, _now(), task["job_id"]), - ) - - if node_code == "SOURCE_ADD": - cur.execute( - "UPDATE job SET needs_source_add=0,updated_at=%s WHERE job_id=%s", - (_now(), task["job_id"]), - ) - - _mark_node_success(cur, task["job_id"], node_code) - job = _load_job(cur, task["job_id"]) - nxt = _advance(cur, job, node_code) - result = {"ok": True, "next_node": nxt} - elif req.action == "TERMINATE_JOB": - cur.execute( - "UPDATE job SET status='CANCELLED',finished_at=%s,updated_at=%s WHERE job_id=%s", - (_now(), _now(), task["job_id"]), - ) - _log_event(cur, task["job_id"], "TASK_SUBMITTED", node_code, "USER", req.operator, - {"action": req.action, "payload": payload}) - result = {"ok": True, "job_status": "CANCELLED"} - elif req.action in ("TRANSFER_MANUAL", "RETRY_CURRENT_NODE"): - if req.action == "TRANSFER_MANUAL": - target_role = payload.get("targetRole") - if target_role: - cur.execute( - "UPDATE job SET current_role=%s,updated_at=%s WHERE job_id=%s", - (target_role, _now(), task["job_id"]), - ) - _log_event(cur, task["job_id"], "TASK_SUBMITTED", node_code, "USER", req.operator, - {"action": req.action, "payload": payload}) - result = {"ok": True, "job_status": job.get("status"), "node_code": node_code} - else: - raise HTTPException(status_code=400, detail=f"unsupported task action {req.action}") - - result_json = json.dumps(result, ensure_ascii=False) - cur.execute( - "UPDATE user_task SET status='SUBMITTED',submit_token=%s,submitted_action=%s," - "submitted_payload_json=%s,submitted_result_json=%s,submitted_by=%s,submitted_at=%s" - " WHERE task_id=%s", - ( - req.submitToken, - req.action, - json.dumps(payload, ensure_ascii=False), - result_json, - req.operator, - _now(), - task_id, - ), - ) - _log_event(cur, task["job_id"], "TASK_SUBMITTED", node_code, "USER", req.operator, - {"action": req.action, "payload": payload, "result": result}) - return result - - -# ---------------- 整单查询(前端画树状图用) ---------------- - -@app.get("/api/jobs/{job_id}") -def get_job(job_id: str): - conn = get_conn() - with conn.cursor() as cur: - cur.execute("SELECT * FROM job WHERE job_id=%s", (job_id,)) - job = cur.fetchone() - if not job: - raise HTTPException(status_code=404, detail="job not found") - cur.execute("SELECT node_code,attempt_no,status,started_at,ended_at,duration_ms," - "error_code,error_summary,output_json FROM job_node WHERE job_id=%s" - " ORDER BY id", (job_id,)) - nodes = cur.fetchall() - cur.execute("SELECT task_id,node_code,role_code,reason_type,status FROM user_task" - " WHERE job_id=%s ORDER BY id", (job_id,)) - tasks = cur.fetchall() - artifacts = _fetch_job_artifacts(cur, job_id) - return {"job": job, "nodes": nodes, "tasks": tasks, "artifacts": artifacts, - "node_order": NODE_ORDER, "node_executor": NODE_EXECUTOR, - "conditional_nodes": sorted(CONDITIONAL_NODES)} - - -@app.get("/api/jobs/{job_id}/timeline") -def get_job_timeline(job_id: str): - conn = get_conn() - with conn.cursor() as cur: - cur.execute("SELECT * FROM job WHERE job_id=%s", (job_id,)) - job = cur.fetchone() - if not job: - raise HTTPException(status_code=404, detail="job not found") - cur.execute( - "SELECT node_code,attempt_no,status,executor_type,started_at,ended_at " - "FROM job_node WHERE job_id=%s ORDER BY id", - (job_id,), - ) - nodes = cur.fetchall() - return {"job": job, "timeline": build_timeline(job, nodes)} - - -@app.get("/api/jobs/{job_id}/evidence-package") -def get_evidence_package(job_id: str): - conn = get_conn() - with conn.cursor() as cur: - cur.execute("SELECT job_id FROM job WHERE job_id=%s", (job_id,)) - job = cur.fetchone() - if not job: - raise HTTPException(status_code=404, detail="job not found") - artifacts = _fetch_job_artifacts(cur, job_id) - return {"job_id": job_id, "artifacts": artifacts} - - -@app.get("/health") -def health(): - conn = None - try: - conn = get_conn() - with conn.cursor() as cur: - cur.execute("SELECT 1") - cur.fetchone() - return {"ok": True, "database": "ok"} - except Exception as exc: - raise HTTPException(status_code=503, detail=f"database unavailable: {exc}") from exc - finally: - if conn is not None: - conn.close() - - -@app.get("/api/state-machine") -def get_state_machine(): - return build_state_machine_meta() diff --git a/state_center/app/match_engine.py b/state_center/app/match_engine.py deleted file mode 100644 index 171e169..0000000 --- a/state_center/app/match_engine.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -对码引擎(核心难点)。 - -数据源: - - 货品主数据在 Oracle(只读)。开工时可全量 load 进内存,后续内存匹配。 - - mapping_config(PRODUCT):平台奇葩写法→货品ID 的人工确认累积,存在自己 MySQL。 - -查找顺序(命中率越用越高): - 1. 先查 mapping_config 累积别名 → 命中直接出货品ID(ALIAS,累积别名命中,非人工介入) - 2. 再查货品主数据(内存/Oracle)四要素精确键 → EXACT - 3. 规格/厂家容错后同商品名多条 → MULTI(出候选) - 4. 都没有 → NONE(转人工) - -对码结果状态只有 4 种:EXACT / ALIAS / MULTI / NONE。 -(无 FUZZY:本引擎不产出模糊命中档,拿不准就走 MULTI 出候选让人选。) -""" -from __future__ import annotations - -import re -from dataclasses import dataclass, field -from typing import Optional - - -# ---------- 规范化:对付"15×2 vs 30片""干一瓶 vs ×1瓶""进口英文厂家" ---------- - -_FULL2HALF = {ord(" "): " ", ord("("): "(", ord(")"): ")", ord("*"): "*", ord("×"): "*"} - - -def _norm_text(s: Optional[str]) -> str: - """通用规范化:去空格、全半角、大小写、常见标点。""" - if not s: - return "" - s = s.translate(_FULL2HALF) - s = s.lower().strip() - s = re.sub(r"[\s,,。.、;;::'\"“”‘’]+", "", s) - return s - - -def _norm_manufacturer(s: Optional[str]) -> str: - """厂家名容错:进口药英文名统一大小写、去标点(B.V. / S.r.l. 之类)。""" - if not s: - return "" - s = s.lower().strip() - s = re.sub(r"[.\s,]+", "", s) # 去点、空格、逗号 - return s - - -def _norm_spec(s: Optional[str]) -> str: - """ - 规格标准化。把 '15×2' '15*2' 展开成乘积;'30片' '×1瓶' 抽出数字。 - 返回一个可比较的规范串,如 '30' 或 '30片'。 - 这是痛点,规则先覆盖会议里点名的几种,后续可加。 - """ - if not s: - return "" - raw = s.translate(_FULL2HALF).lower().strip() - raw = re.sub(r"\s+", "", raw) - - # 形如 15*2 / 15x2 → 乘积 30 - m = re.search(r"(\d+(?:\.\d+)?)\*(\d+(?:\.\d+)?)", raw) - if m: - product = float(m.group(1)) * float(m.group(2)) - product = int(product) if product == int(product) else product - # 保留单位后缀(如 片/瓶),便于跟 '30片' 对齐 - unit = re.sub(r"[\d*.]+", "", raw) - return f"{product}{unit}" - - return raw - - -def build_match_key(common_name: str, approval_no: str, spec: str, manufacturer: str) -> str: - """四要素拼接键:通用名 + 批准文号 + 规格 + 厂家(全部规范化)。""" - return "|".join([ - _norm_text(common_name), - _norm_text(approval_no), - _norm_spec(spec), - _norm_manufacturer(manufacturer), - ]) - - -# ---------- 货品主数据(Oracle 镜像到内存) ---------- - -@dataclass -class GoodsRecord: - common_name: str - approval_no: str - spec: str - base_unit: str - manufacturer: str - goods_id: str - goods_code: str - - -@dataclass -class MatchResult: - order_item_id: int - match_key: str - match_status: str # EXACT / ALIAS / MULTI / NONE - goods_id: Optional[str] = None - goods_code: Optional[str] = None - base_unit: Optional[str] = None - candidates: list = field(default_factory=list) - - -class MatchEngine: - """ - 内存索引 + 两级查找。 - goods_index: 四要素键 -> [GoodsRecord] (可能一键多货品,即一对多) - name_index: 规范通用名 -> [GoodsRecord] (用于同商品名多规格出候选) - alias_map: mapping_config 累积别名 config_key -> (goods_id, goods_code, base_unit) - """ - - def __init__(self): - self.goods_index: dict[str, list[GoodsRecord]] = {} - self.name_index: dict[str, list[GoodsRecord]] = {} - self.alias_map: dict[str, tuple[str, str, str]] = {} - - # -- 装载 -- - def load_goods(self, records: list[GoodsRecord]) -> None: - self.goods_index.clear() - self.name_index.clear() - for r in records: - key = build_match_key(r.common_name, r.approval_no, r.spec, r.manufacturer) - self.goods_index.setdefault(key, []).append(r) - self.name_index.setdefault(_norm_text(r.common_name), []).append(r) - - def load_aliases(self, aliases: dict[str, tuple[str, str, str]]) -> None: - """aliases: config_key -> (goods_id, goods_code, base_unit)""" - self.alias_map = dict(aliases) - - # -- 单行对码 -- - def match_one(self, order_item_id: int, common_name: str, approval_no: str, - spec: str, manufacturer: str) -> MatchResult: - key = build_match_key(common_name, approval_no, spec, manufacturer) - - # 1) 累积别名优先(ALIAS = 历史人工确认沉淀的别名命中,不是当次人工介入) - if key in self.alias_map: - gid, gcode, unit = self.alias_map[key] - return MatchResult(order_item_id, key, "ALIAS", gid, gcode, unit) - - # 2) 四要素精确 - hits = self.goods_index.get(key, []) - if len(hits) == 1: - r = hits[0] - return MatchResult(order_item_id, key, "EXACT", r.goods_id, r.goods_code, r.base_unit) - if len(hits) > 1: - return MatchResult(order_item_id, key, "MULTI", - candidates=[self._cand(r) for r in hits]) - - # 3) 同商品名多规格 → 出候选给人工选 - name_hits = self.name_index.get(_norm_text(common_name), []) - if name_hits: - return MatchResult(order_item_id, key, "MULTI", - candidates=[self._cand(r) for r in name_hits]) - - # 4) 无命中 - return MatchResult(order_item_id, key, "NONE") - - @staticmethod - def _cand(r: GoodsRecord) -> dict: - return { - "goods_id": r.goods_id, - "goods_code": r.goods_code, - "common_name": r.common_name, - "spec": r.spec, - "base_unit": r.base_unit, - "manufacturer": r.manufacturer, - "approval_no": r.approval_no, - } - - -# ---------- Oracle 取数(拿到真实连接串后启用) ---------- - -def load_goods_from_oracle(settings) -> list[GoodsRecord]: - """ - 从 Oracle 只读拉全量货品主数据。 - 需要: pip install oracledb - 真实表名/列名在 config.py 里改。 - """ - import oracledb # 延迟导入,没配 Oracle 时不影响其他功能 - - sql = f""" - SELECT {settings.ORACLE_COL_COMMON_NAME}, - {settings.ORACLE_COL_APPROVAL_NO}, - {settings.ORACLE_COL_SPEC}, - {settings.ORACLE_COL_UNIT}, - {settings.ORACLE_COL_MANUFACTURER}, - {settings.ORACLE_COL_GOODS_ID}, - {settings.ORACLE_COL_GOODS_CODE} - FROM {settings.ORACLE_GOODS_TABLE} - """ - conn = oracledb.connect( - user=settings.ORACLE_USER, - password=settings.ORACLE_PASSWORD, - dsn=settings.ORACLE_DSN, - ) - try: - cur = conn.cursor() - cur.execute(sql) - rows = cur.fetchall() - finally: - conn.close() - - out = [] - for row in rows: - out.append(GoodsRecord( - common_name=str(row[0] or ""), - approval_no=str(row[1] or ""), - spec=str(row[2] or ""), - base_unit=str(row[3] or ""), - manufacturer=str(row[4] or ""), - goods_id=str(row[5] or ""), - goods_code=str(row[6] or ""), - )) - return out diff --git a/state_center/app/web_state_machine.py b/state_center/app/web_state_machine.py deleted file mode 100644 index a475a73..0000000 --- a/state_center/app/web_state_machine.py +++ /dev/null @@ -1,163 +0,0 @@ -"""Web 版状态机纯逻辑。 - -只放和 UI/接口共享的计算,不碰数据库。 -""" -from __future__ import annotations - -from collections.abc import Mapping, Sequence - -NODE_ORDER = [ - "ORDER_FETCH", "OCR_EXTRACT", "PRODUCT_MATCH", "SOURCE_ADD", - "CONTRACT_CREATE", "CONTRACT_APPROVE_WAIT", "REBATE_HEADER", - "REBATE_IMPORT", "REBATE_SUBMIT", "M5_CREATE_ORDER", - "M5_MANUAL_CONFIRM", "M5_RECEIPT_NOTICE", "ARCHIVE_JOB", -] - -TRANSITIONS = { - "ORDER_FETCH": "OCR_EXTRACT", - "OCR_EXTRACT": "PRODUCT_MATCH", - "PRODUCT_MATCH": "SOURCE_ADD", - "SOURCE_ADD": "CONTRACT_CREATE", - "CONTRACT_CREATE": "CONTRACT_APPROVE_WAIT", - "CONTRACT_APPROVE_WAIT": "REBATE_HEADER", - "REBATE_HEADER": "REBATE_IMPORT", - "REBATE_IMPORT": "REBATE_SUBMIT", - "REBATE_SUBMIT": "M5_CREATE_ORDER", - "M5_CREATE_ORDER": "M5_MANUAL_CONFIRM", - "M5_MANUAL_CONFIRM": "M5_RECEIPT_NOTICE", - "M5_RECEIPT_NOTICE": "ARCHIVE_JOB", - "ARCHIVE_JOB": None, -} - -CONDITIONAL_NODES = {"OCR_EXTRACT", "SOURCE_ADD"} -HUMAN_NODE_ROLES = { - "SOURCE_ADD": "PURCHASER", - "M5_MANUAL_CONFIRM": "PURCHASER", - "M5_RECEIPT_NOTICE": "PURCHASER", -} - -NODE_EXECUTOR = { - "ORDER_FETCH": "RPA", - "OCR_EXTRACT": "RPA", - "PRODUCT_MATCH": "STATE_CENTER", - "SOURCE_ADD": "HUMAN", - "CONTRACT_CREATE": "RPA", - "CONTRACT_APPROVE_WAIT": "RPA", - "REBATE_HEADER": "RPA", - "REBATE_IMPORT": "RPA", - "REBATE_SUBMIT": "RPA", - "M5_CREATE_ORDER": "RPA", - "M5_MANUAL_CONFIRM": "HUMAN", - "M5_RECEIPT_NOTICE": "HUMAN", - "ARCHIVE_JOB": "STATE_CENTER", -} - -NODE_LABELS_ZH = { - "ORDER_FETCH": "订单获取", - "OCR_EXTRACT": "OCR识别", - "PRODUCT_MATCH": "对码", - "SOURCE_ADD": "新增货源", - "CONTRACT_CREATE": "合同建单", - "CONTRACT_APPROVE_WAIT": "合同审批等待", - "REBATE_HEADER": "返利总单", - "REBATE_IMPORT": "返利细单导入", - "REBATE_SUBMIT": "返利送审", - "M5_CREATE_ORDER": "M5建单", - "M5_MANUAL_CONFIRM": "M5人工确认", - "M5_RECEIPT_NOTICE": "收货通知单", - "ARCHIVE_JOB": "归档", -} - -EXECUTOR_LABELS_ZH = { - "STATE_CENTER": "状态中心", - "RPA": "艺赛旗执行", - "HUMAN": "人工处理", -} - -STATUS_LABELS_ZH = { - "PENDING": "待处理", - "RUNNING": "执行中", - "SUCCESS": "已完成", - "FAILED": "已失败", - "WAITING_USER": "等待人工", - "WAITING_EXTERNAL": "等待外部", - "SKIPPED": "已跳过", -} - - -def _should_skip(node_code: str, job: Mapping[str, object]) -> bool: - if node_code == "OCR_EXTRACT": - return job.get("source_type") != "OFFLINE" - if node_code == "SOURCE_ADD": - return not job.get("needs_source_add") - return False - - -def _node_row_map(job_nodes: Sequence[Mapping[str, object]]) -> dict[str, Mapping[str, object]]: - out: dict[str, Mapping[str, object]] = {} - for row in job_nodes: - node_code = str(row.get("node_code") or "") - if node_code and node_code not in out: - out[node_code] = row - return out - - -def _display_status_for_node(job: Mapping[str, object], node_code: str, - job_nodes_by_code: Mapping[str, Mapping[str, object]]) -> str: - row = job_nodes_by_code.get(node_code) - if row: - row_status = str(row.get("status") or "PENDING") - if row_status in {"SUCCESS", "FAILED", "RUNNING", "WAITING_USER", "WAITING_EXTERNAL"}: - return row_status - return "PENDING" - - if node_code == job.get("current_node_code"): - job_status = str(job.get("status") or "PENDING") - if job_status in {"RUNNING", "WAITING_USER", "WAITING_EXTERNAL", "FAILED_RETRYABLE", "FAILED_MANUAL"}: - return "WAITING_USER" if job_status == "WAITING_USER" else ( - "WAITING_EXTERNAL" if job_status == "WAITING_EXTERNAL" else ( - "RUNNING" if job_status == "RUNNING" else "FAILED" - ) - ) - if job_status == "SUCCESS": - return "SUCCESS" - return "PENDING" - - if node_code in CONDITIONAL_NODES and _should_skip(node_code, job): - return "SKIPPED" - - return "PENDING" - - -def build_timeline(job: Mapping[str, object], job_nodes: Sequence[Mapping[str, object]]) -> list[dict]: - """Return all nodes with backend-computed display status. - - The frontend should render this directly and never infer node skipping itself. - """ - by_code = _node_row_map(job_nodes) - timeline = [] - for node_code in NODE_ORDER: - row = by_code.get(node_code) - timeline.append({ - "node_code": node_code, - "display_status": _display_status_for_node(job, node_code, by_code), - "attempt_no": row.get("attempt_no") if row else None, - "executor_type": row.get("executor_type") if row else None, - "status": row.get("status") if row else None, - "started_at": row.get("started_at") if row else None, - "ended_at": row.get("ended_at") if row else None, - }) - return timeline - - -def build_state_machine_meta() -> dict: - return { - "node_order": NODE_ORDER, - "transitions": TRANSITIONS, - "conditional_nodes": sorted(CONDITIONAL_NODES), - "human_node_roles": HUMAN_NODE_ROLES, - "node_executor": NODE_EXECUTOR, - "node_labels": NODE_LABELS_ZH, - "executor_labels": EXECUTOR_LABELS_ZH, - "status_labels": STATUS_LABELS_ZH, - } diff --git a/state_center/fixtures/README.md b/state_center/fixtures/README.md deleted file mode 100644 index 611c45c..0000000 --- a/state_center/fixtures/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对码入参底座(一条,福建货主) - -订单明细走这里,不走证据包。本批只有一条:重庆亿昊 / 哈药牌钙铁锌口服液。 - -## M5 - -- 地址默认 `173.1.1.215:1521`,Service Name `m5` -- 账号密码可配,不进 git:环境变量 `M5_USER` `M5_PASSWORD`,或复制 `m5/connection.example.json` → `m5/connection.local.json` -- 查询:品名 LIKE + 文号 + 规格 + 厂家 + `ENTRYID=907` -- 产地空或「无」不参与过滤 -- 回写 `goods_id` = `GOODSID`(`4000109983`) -- 对码命中后再查货源:`bms_su_supplygoods_doc_v` × `bms_su_supplygoods_dtl_v`,`PRIORITY` 必须是 1,且 `ENTRYID/GOODSTYPE/FACTORYNAME` 对上这条规格。对上则跳过新增货源。 - -查这一条: - -```bash -export M5_USER=... -export M5_PASSWORD=... -python -m state_center.app.m5_client -``` diff --git a/state_center/fixtures/ingest_mapping.json b/state_center/fixtures/ingest_mapping.json deleted file mode 100644 index 325b907..0000000 --- a/state_center/fixtures/ingest_mapping.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": 1, - "comment": "Excel 列 → 订单入参。本批只收一条。条码/医保不进 order_item,也不拿去查 M5。账号密码不写在这份文件里。", - "sheet": "订单明细", - "skipStatuses": ["已取消"], - "jobGroupBy": ["supplierName", "orderDate", "sourceType"], - "columns": { - "父订单号": "parentOrderNo", - "商家": "supplierName", - "订单状态": "orderStatus", - "品名": "rawProductName", - "产品编码": "platformProductCode", - "产品条码": "barcode", - "医保编码": "insuranceCode", - "批准文号": "approvalNo" - }, - "orderItem": [ - "orderNo", - "rawProductName", - "platformProductCode", - "spec", - "manufacturer", - "approvalNo", - "qty", - "sourceRowNo" - ], - "m5Lookup": { - "view": "PUB_ENTRY_GOODS_V", - "goodsIdField": "GOODSID", - "filters": { - "GOODSNAME": { "from": "rawProductName", "op": "like" }, - "APPROVEDOCNO": { "from": "approvalNo", "op": "eq" }, - "GOODSTYPE": { "from": "spec", "op": "eq" }, - "FACTORYNAME": { "from": "manufacturer", "op": "eq" }, - "ENTRYID": { "from": "entryId", "op": "eq" } - }, - "optionalFilters": { - "PRODAREA": { "from": "prodArea", "skipValues": ["", "无", null] } - } - } -} diff --git a/state_center/fixtures/m5/connection.example.json b/state_center/fixtures/m5/connection.example.json deleted file mode 100644 index fcadf3a..0000000 --- a/state_center/fixtures/m5/connection.example.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "host": "173.1.1.215", - "port": 1521, - "serviceName": "m5", - "user": "", - "password": "", - "schema": "m5", - "comment": "复制为 connection.local.json 填账号密码。local 文件不进 git。也可用环境变量 M5_USER / M5_PASSWORD / M5_SERVICE。" -} diff --git a/state_center/fixtures/m5/fujian.json b/state_center/fixtures/m5/fujian.json deleted file mode 100644 index 777a7ee..0000000 --- a/state_center/fixtures/m5/fujian.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "entryName": "福建", - "entryId": 907, - "host": "173.1.1.215", - "port": 1521, - "serviceName": "m5", - "schema": "m5", - "view": "PUB_ENTRY_GOODS_V", - "goodsIdField": "GOODSID", - "requireProdArea": false, - "sql": "SELECT t.FACTORYNAME, t.APPROVEDOCNO, t.GOODSTYPE, t.PRODAREA, t.ENTRYID, t.GOODSID, t.GOODSNAME, t.GOODSUNIT, t.ENTRYGOODSID FROM PUB_ENTRY_GOODS_V t WHERE t.GOODSNAME LIKE :goodsNameLike AND t.APPROVEDOCNO = :approvalNo AND t.GOODSTYPE = :spec AND t.FACTORYNAME = :manufacturer AND t.ENTRYID = :entryId", - "sourceSql": "SELECT t.ENTRYID, a.PRIORITY, t.GOODSTYPE, t.FACTORYNAME FROM bms_su_supplygoods_doc_v t, bms_su_supplygoods_dtl_v a WHERE t.GOODSID = :goodsId AND a.PRIORITY = 1 AND t.SUPPLYGOODSDOCID = a.SUPPLYGOODSDOCID" -} diff --git a/state_center/fixtures/orders/yyc-fujian-20260804.json b/state_center/fixtures/orders/yyc-fujian-20260804.json deleted file mode 100644 index ec3eff8..0000000 --- a/state_center/fixtures/orders/yyc-fujian-20260804.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sourceType": "YYC", - "orderDate": "2026-08-04", - "supplierName": "重庆亿昊药业有限公司", - "m5": { - "entryName": "福建", - "entryId": 907 - }, - "row": { - "orderNo": "YYC-ROW-2", - "parentOrderNo": "", - "rawProductName": "哈药牌钙铁锌口服液", - "goodsNameLike": "哈药牌", - "platformProductCode": "2919482534", - "barcode": "6938780031263", - "approvalNo": "食健备G201923000558", - "spec": "10ml*90支", - "manufacturer": "哈药集团三精制药有限公司", - "prodArea": "无", - "qty": 83, - "orderStatus": "待付款", - "sourceRowNo": 2, - "expectedGoodsId": "4000109983", - "expectedSourceAddNeeded": false - } -} diff --git a/state_center/requirements.txt b/state_center/requirements.txt deleted file mode 100644 index 2e5826c..0000000 --- a/state_center/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -fastapi==0.115.0 -uvicorn==0.30.6 -pydantic==2.9.2 -pymysql==1.1.1 -cryptography==50.0.0 -# 对码接 Oracle 时再装(拿到连接串后): -# oracledb==2.4.1 diff --git a/state_center/sql/schema.sql b/state_center/sql/schema.sql deleted file mode 100644 index 5596445..0000000 --- a/state_center/sql/schema.sql +++ /dev/null @@ -1,205 +0,0 @@ --- 采购主链 RPA 一期 · 状态中心建库脚本 --- 库里只存"流程状态 + 对码累积别名 + 证据",不存对码表本身(对码表在 Oracle,直连查)。 --- 目标库:MySQL 8 - -CREATE DATABASE IF NOT EXISTS rpa_center DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -USE rpa_center; - --- ============================================================ --- job:一次流程实例 = 同供应商 + 同订单日期 + 同来源 = 一条合同 --- ============================================================ -CREATE TABLE IF NOT EXISTS job ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - job_id VARCHAR(64) NOT NULL UNIQUE COMMENT '对外流程单号', - business_key VARCHAR(160) NOT NULL COMMENT '来源+供应商+订单日期,幂等用', - parent_job_id VARCHAR(64) NULL COMMENT '重跑/加单来源', - source_type VARCHAR(16) NOT NULL COMMENT 'YYC医药城/XYY小药药/OFFLINE线下单', - order_date DATE NOT NULL COMMENT '订单日期=合同签约日期', - supplier_name VARCHAR(128) NOT NULL COMMENT '供应商/商家', - order_no_list_json JSON NULL COMMENT '该批订单号数组', - contract_template VARCHAR(16) NULL COMMENT 'FORMAT格式/NON_FORMAT非格式承兑', - need_pdf_upload TINYINT NOT NULL DEFAULT 0 COMMENT '医药城=1,小药药=0', - planner_name VARCHAR(64) NULL COMMENT '计划员', - current_node_code VARCHAR(64) NOT NULL COMMENT '当前节点', - status VARCHAR(24) NOT NULL COMMENT 'PENDING/RUNNING/WAITING_USER/WAITING_EXTERNAL/SUCCESS/FAILED_RETRYABLE/FAILED_MANUAL/CANCELLED', - mapping_version VARCHAR(64) NULL COMMENT '绑定的对码累积版本', - needs_source_add TINYINT NOT NULL DEFAULT 0 COMMENT '对码后判定是否缺货源,决定是否走 SOURCE_ADD 条件节点', - executor_platform VARCHAR(16) NULL COMMENT '默认执行平台,如 ISRPA', - contract_system_no VARCHAR(64) NULL COMMENT '合同系统编号(钥匙1)', - rebate_order_no VARCHAR(64) NULL COMMENT '返利中心总单号', - m5_order_no VARCHAR(64) NULL COMMENT 'M5采购订单号', - receipt_notice_no VARCHAR(64) NULL COMMENT '收货通知单号', - current_role VARCHAR(16) NULL COMMENT '当前责任角色', - current_assignee VARCHAR(64) NULL COMMENT '当前责任人', - auto_save_enabled TINYINT NOT NULL DEFAULT 0 COMMENT 'M5自动保存开关,一期=0', - next_check_at DATETIME NULL COMMENT '等待态(如合同审批)下次检查时间,调度器扫这个', - wait_check_count INT NOT NULL DEFAULT 0 COMMENT '当前等待态已检查次数,超上限升级OPS', - created_by VARCHAR(64) NOT NULL, - created_at DATETIME NOT NULL, - updated_at DATETIME NOT NULL, - finished_at DATETIME NULL, - KEY idx_business_status (business_key, status), - KEY idx_supplier_date (supplier_name, order_date), - KEY idx_status (status), - KEY idx_next_check (status, next_check_at), - KEY idx_created_at (created_at) -) COMMENT='流程实例主表'; - --- ============================================================ --- order_item:订单明细行(对码前的原始数据) --- ============================================================ -CREATE TABLE IF NOT EXISTS order_item ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - job_id VARCHAR(64) NOT NULL, - order_no VARCHAR(64) NOT NULL COMMENT '订单号(贯穿追溯)', - parent_order_no VARCHAR(64) NULL COMMENT '父订单号(加单/拆单)', - raw_product_name VARCHAR(255) NOT NULL COMMENT '平台品名', - platform_product_code VARCHAR(64) NULL COMMENT '平台产品编码', - spec VARCHAR(128) NULL COMMENT '规格(对码痛点:15×2 vs 30片)', - manufacturer VARCHAR(255) NULL COMMENT '厂家(含进口英文)', - approval_no VARCHAR(64) NULL COMMENT '国药准字/批准文号', - qty DECIMAL(14,2) NOT NULL COMMENT '数量', - unit_price DECIMAL(14,4) NULL COMMENT '单价', - source_row_no INT NULL COMMENT '原始Excel行号', - created_at DATETIME NOT NULL, - KEY idx_job (job_id), - KEY idx_order_no (order_no) -) COMMENT='订单明细行'; - --- ============================================================ --- product_match:对码结果(核心难点落库) --- ============================================================ -CREATE TABLE IF NOT EXISTS product_match ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - job_id VARCHAR(64) NOT NULL, - order_item_id BIGINT NOT NULL COMMENT '对应订单行', - match_key VARCHAR(512) NOT NULL COMMENT '四要素拼接键:通用名+批准文号+规格+厂家', - match_status VARCHAR(16) NOT NULL COMMENT 'EXACT精确/ALIAS别名命中/MULTI一对多/NONE未命中(无FUZZY)', - goods_id VARCHAR(64) NULL COMMENT '命中的M5货品ID(来自Oracle)', - goods_code VARCHAR(64) NULL COMMENT '货品编码', - base_unit VARCHAR(32) NULL COMMENT '基本单位', - candidates_json JSON NULL COMMENT '一对多候选列表(供H5选择)', - source_add_needed TINYINT NOT NULL DEFAULT 0 COMMENT '是否需M5新增货源', - confirmed_by VARCHAR(64) NULL COMMENT '人工确认人', - confirmed_at DATETIME NULL, - mapping_version VARCHAR(64) NULL COMMENT '使用的对码累积版本', - created_at DATETIME NOT NULL, - UNIQUE KEY uniq_job_order_item (job_id, order_item_id), - KEY idx_job (job_id), - KEY idx_status (match_status) -) COMMENT='对码结果'; - --- ============================================================ --- job_node:节点执行(每节点每次尝试一行,不覆盖历史) --- ============================================================ -CREATE TABLE IF NOT EXISTS job_node ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - job_id VARCHAR(64) NOT NULL, - node_code VARCHAR(64) NOT NULL COMMENT 'ORDER_FETCH/PRODUCT_MATCH/...', - executor_type VARCHAR(16) NOT NULL DEFAULT 'RPA' COMMENT '执行方:STATE_CENTER编排/RPA执行/HUMAN人工挂起', - attempt_no INT NOT NULL DEFAULT 1 COMMENT '第几次尝试', - status VARCHAR(24) NOT NULL COMMENT '节点状态', - executor_platform VARCHAR(16) NULL COMMENT '实际执行平台', - executor_run_id VARCHAR(64) NULL COMMENT '平台侧任务号', - started_at DATETIME NULL, - ended_at DATETIME NULL, - duration_ms BIGINT NULL, - error_code VARCHAR(64) NULL, - error_summary VARCHAR(500) NULL, - role_at_failure VARCHAR(16) NULL, - output_json JSON NULL COMMENT '节点输出(业务编号等)', - callback_idempotency_key VARCHAR(128) NULL COMMENT '回调幂等键', - created_at DATETIME NOT NULL, - UNIQUE KEY uniq_job_node_attempt (job_id, node_code, attempt_no), - KEY idx_status (status) -) COMMENT='节点执行记录'; - --- ============================================================ --- user_task:人工待办 --- ============================================================ -CREATE TABLE IF NOT EXISTS user_task ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - task_id VARCHAR(64) NOT NULL UNIQUE, - job_id VARCHAR(64) NOT NULL, - node_code VARCHAR(64) NOT NULL, - order_item_id BIGINT NULL COMMENT '对应订单行(对码类待办用)', - product_match_id BIGINT NULL COMMENT '对应对码结果行(对码类待办精确关联,confirm 时按它关闭)', - role_code VARCHAR(16) NOT NULL COMMENT 'PLANNER/PURCHASER/QC/OPS', - assignee_user_id VARCHAR(64) NULL, - title VARCHAR(255) NOT NULL, - reason_type VARCHAR(32) NOT NULL COMMENT 'MATCH_MULTI/MATCH_NONE/SOURCE_ADD/OCR_LOW_CONF/REBATE_DUP/QC_MISSING/CONTRACT_DISABLED', - reason_user_friendly VARCHAR(500) NULL COMMENT '人话说明', - why_me_text VARCHAR(255) NULL COMMENT '为什么派给你', - editable_fields_json JSON NULL COMMENT '白名单字段', - action_schema_json JSON NULL COMMENT '允许动作', - comparison_snapshot_json JSON NULL COMMENT '原值/建议/当前对比', - candidates_json JSON NULL COMMENT '一对多对码候选', - status VARCHAR(16) NOT NULL DEFAULT 'OPEN' COMMENT 'OPEN/SUBMITTED/CANCELLED/EXPIRED', - submit_token VARCHAR(64) NULL COMMENT '防重复提交', - submitted_action VARCHAR(24) NULL, - submitted_payload_json JSON NULL, - submitted_result_json JSON NULL COMMENT '提交结果,同 submit_token 重放时返回', - submitted_by VARCHAR(64) NULL, - submitted_at DATETIME NULL, - due_at DATETIME NULL COMMENT '超时升级', - created_at DATETIME NOT NULL, - KEY idx_job (job_id), - KEY idx_role_status (role_code, status), - KEY idx_product_match (product_match_id) -) COMMENT='人工待办'; - --- ============================================================ --- mapping_config:对码累积别名 + 供应商对照等映射(版本化) --- 注意:这不是对码表的拷贝!对码表在 Oracle。 --- 这里存的是"平台奇葩写法 → 货品ID"的人工确认记录,以及供应商对照。 --- ============================================================ -CREATE TABLE IF NOT EXISTS mapping_config ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - config_type VARCHAR(24) NOT NULL COMMENT 'PRODUCT对码别名/SUPPLIER供应商对照/SETTLEMENT/PAYMENT_TERM/PLANNER_ROUTE', - config_key VARCHAR(512) NOT NULL COMMENT '对码时=四要素拼接键或平台写法', - source_value VARCHAR(512) NULL COMMENT '来源值', - target_value VARCHAR(512) NULL COMMENT '目标值(对码=货品ID+编码+单位JSON)', - extra_json JSON NULL, - version_no VARCHAR(64) NULL COMMENT '版本号', - is_active TINYINT NOT NULL DEFAULT 1, - effective_from DATETIME NULL, - effective_to DATETIME NULL, - updated_by VARCHAR(64) NULL, - updated_at DATETIME NOT NULL, - KEY idx_type_key (config_type, config_key), - KEY idx_type_key_active (config_type, config_key, is_active, updated_at, id), - KEY idx_active (is_active) -) COMMENT='映射/对码累积别名(非对码表拷贝)'; - --- ============================================================ --- job_artifact:证据元数据(文件落对象存储,这里存元数据) --- ============================================================ -CREATE TABLE IF NOT EXISTS job_artifact ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - job_id VARCHAR(64) NOT NULL, - node_code VARCHAR(64) NULL, - attempt_no INT NULL, - artifact_type VARCHAR(32) NOT NULL COMMENT 'SOURCE_EXCEL/SOURCE_IMAGE/OCR_JSON/CONTRACT_PDF/MERGED_PDF/SCREENSHOT/TEMPLATE/LOG', - storage_path VARCHAR(500) NOT NULL, - file_hash VARCHAR(128) NULL, - visible_roles VARCHAR(128) NULL COMMENT '可见角色', - is_masked TINYINT NOT NULL DEFAULT 0 COMMENT '脱敏标记', - created_at DATETIME NOT NULL, - KEY idx_job (job_id) -) COMMENT='证据元数据'; - --- ============================================================ --- job_event:事件流(审计留痕) --- ============================================================ -CREATE TABLE IF NOT EXISTS job_event ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - job_id VARCHAR(64) NOT NULL, - event_type VARCHAR(32) NOT NULL COMMENT 'JOB_CREATED/NODE_STARTED/NODE_SUCCESS/NODE_FAILED/TASK_CREATED/TASK_SUBMITTED/MANUAL_HANDOFF/JOB_FINISHED', - node_code VARCHAR(64) NULL, - operator_type VARCHAR(16) NOT NULL COMMENT 'SYSTEM/ROBOT/USER', - operator VARCHAR(64) NULL, - detail_json JSON NULL, - created_at DATETIME NOT NULL, - KEY idx_job (job_id), - KEY idx_type (event_type) -) COMMENT='事件流'; diff --git a/state_center/tests/test_dev_launcher.py b/state_center/tests/test_dev_launcher.py deleted file mode 100644 index a7b6d80..0000000 --- a/state_center/tests/test_dev_launcher.py +++ /dev/null @@ -1,111 +0,0 @@ -from scripts import dev - - -def test_backend_runtime_probe_checks_mysql8_auth_dependency(monkeypatch): - commands = [] - - monkeypatch.setattr(dev, "_backend_python", lambda: "/tmp/backend-python") - - def fake_run(command, **kwargs): - commands.append(command) - - class Result: - returncode = 0 - stderr = "" - - return Result() - - monkeypatch.setattr(dev.subprocess, "run", fake_run) - - assert dev._ensure_backend_runtime() == "/tmp/backend-python" - assert commands[0] == [ - "/tmp/backend-python", - "-c", - "import fastapi, pymysql, uvicorn, cryptography", - ] - - -def test_backend_environment_has_local_defaults(monkeypatch): - for name in ("DEV_MODE", "MYSQL_DSN", "AGENT_TOKEN"): - monkeypatch.delenv(name, raising=False) - - env = dev.build_backend_env({}) - - assert env["DEV_MODE"] == "true" - assert env["MYSQL_DSN"] == "mysql+pymysql://root:root@127.0.0.1:3306/rpa_center?charset=utf8mb4" - assert env["AGENT_TOKEN"] == "dev-agent-token" - - -def test_start_uses_checked_backend_python(monkeypatch): - spawned = [] - - monkeypatch.setattr(dev, "ensure_mysql", lambda: None) - monkeypatch.setattr(dev, "wait_for_port", lambda host, port: None) - monkeypatch.setattr(dev, "_ensure_backend_runtime", lambda: "/tmp/backend-python") - monkeypatch.setattr(dev, "_read_pids", lambda: {}) - monkeypatch.setattr(dev, "_pid_alive", lambda pid: False) - monkeypatch.setattr(dev, "_port_open", lambda host, port: False) - monkeypatch.setattr(dev, "_write_pids", lambda pids: None) - monkeypatch.setattr(dev, "build_backend_env", lambda: {}) - - def fake_spawn(name, command, cwd, env): - spawned.append((name, command)) - return len(spawned) - - monkeypatch.setattr(dev, "_spawn", fake_spawn) - - dev.start() - - assert spawned[0] == ( - "backend", - [ - "/tmp/backend-python", - "-m", - "uvicorn", - "state_center.app.main:app", - "--host", - "0.0.0.0", - "--port", - "8000", - ], - ) - - -def test_start_reuses_frontend_when_port_is_already_open(monkeypatch): - spawned = [] - - monkeypatch.setattr(dev, "ensure_mysql", lambda: None) - monkeypatch.setattr(dev, "wait_for_port", lambda host, port: None) - monkeypatch.setattr(dev, "_ensure_backend_runtime", lambda: "/tmp/backend-python") - monkeypatch.setattr(dev, "_read_pids", lambda: {}) - monkeypatch.setattr(dev, "_write_pids", lambda pids: None) - monkeypatch.setattr(dev, "build_backend_env", lambda: {}) - monkeypatch.setattr(dev, "_port_open", lambda host, port: port == 5173) - - def fake_spawn(name, command, cwd, env): - spawned.append(name) - return len(spawned) - - monkeypatch.setattr(dev, "_spawn", fake_spawn) - - dev.start() - - assert spawned == ["backend"] - - -def test_pid_alive_rejects_invalid_pid(): - assert dev._pid_alive(-1) is False - assert dev._pid_alive(0) is False - - -def test_stop_pid_terminates_process_group_on_posix(monkeypatch): - calls = [] - - monkeypatch.setattr(dev.os, "name", "posix") - monkeypatch.setattr(dev.os, "getpgid", lambda pid: 4321) - monkeypatch.setattr(dev.os, "killpg", lambda pgid, sig: calls.append(("killpg", pgid, sig))) - monkeypatch.setattr(dev.os, "kill", lambda pid, sig: calls.append(("kill", pid, sig))) - - dev._stop_pid(1234) - - assert calls == [("killpg", 4321, dev.signal.SIGTERM)] diff --git a/state_center/tests/test_m5_client.py b/state_center/tests/test_m5_client.py deleted file mode 100644 index 5bcbb87..0000000 --- a/state_center/tests/test_m5_client.py +++ /dev/null @@ -1,101 +0,0 @@ -from state_center.app.m5_client import ( - evaluate_priority_source, - load_connection, - lookup_params, - recorded_source_rows, -) - - -def test_lookup_params_use_the_single_fujian_row(): - params = lookup_params() - assert params["goodsNameLike"] == "%哈药牌%" - assert params["approvalNo"] == "食健备G201923000558" - assert params["spec"] == "10ml*90支" - assert params["manufacturer"] == "哈药集团三精制药有限公司" - assert params["entryId"] == 907 - assert params["expectedGoodsId"] == "4000109983" - assert "PUB_ENTRY_GOODS_V" in params["sql"] - assert "PRODAREA" not in params["sql"].split("WHERE", 1)[1] - - -def test_m5_host_defaults_and_password_stays_out_of_repo(monkeypatch): - monkeypatch.delenv("M5_USER", raising=False) - monkeypatch.delenv("M5_PASSWORD", raising=False) - monkeypatch.delenv("M5_SERVICE", raising=False) - cfg = load_connection() - assert cfg["host"] == "173.1.1.215" - assert cfg["port"] == 1521 - assert cfg["serviceName"] == "m5" - assert cfg["password"] == "" - - -def test_priority_1_matching_spec_skips_source_add(): - judged = evaluate_priority_source( - [ - { - "ENTRYID": 907, - "PRIORITY": 1, - "GOODSTYPE": "10ml*90支", - "FACTORYNAME": "哈药集团三精制药有限公司", - } - ], - entry_id=907, - spec="10ml*90支", - manufacturer="哈药集团三精制药有限公司", - ) - assert judged["source_add_needed"] is False - - -def test_priority_1_other_spec_needs_source_add(): - judged = evaluate_priority_source( - [ - { - "ENTRYID": 907, - "PRIORITY": 1, - "GOODSTYPE": "10ml*10支", - "FACTORYNAME": "哈药集团三精制药有限公司", - } - ], - entry_id=907, - spec="10ml*90支", - manufacturer="哈药集团三精制药有限公司", - ) - assert judged["source_add_needed"] is True - - -def test_lookup_params_include_source_sql(): - params = lookup_params() - assert "bms_su_supplygoods_doc_v" in params["sourceSql"] - assert params["expectedSourceAddNeeded"] is False - - -def test_recorded_source_rows_cover_hayao_without_m5(): - rows = recorded_source_rows("4000109983") - assert rows is not None - judged = evaluate_priority_source( - rows, - entry_id=907, - spec="10ml*90支", - manufacturer="哈药集团三精制药有限公司", - ) - assert judged["source_add_needed"] is False - assert recorded_source_rows("other") is None - - -def test_hayao_priority1_sql_row_skips_source_add(): - """第二条 SQL 的真实结果:907 / 1 / 10ml*90支 / 哈药集团三精制药有限公司。""" - judged = evaluate_priority_source( - [ - { - "ENTRYID": 907, - "PRIORITY": 1, - "GOODSTYPE": "10ml*90支", - "FACTORYNAME": "哈药集团三精制药有限公司", - } - ], - entry_id=907, - spec="10ml*90支", - manufacturer="哈药集团三精制药有限公司", - ) - assert judged["source_add_needed"] is False - assert judged["hit"]["ENTRYID"] == 907 diff --git a/state_center/tests/test_match_engine.py b/state_center/tests/test_match_engine.py deleted file mode 100644 index 22bf315..0000000 --- a/state_center/tests/test_match_engine.py +++ /dev/null @@ -1,107 +0,0 @@ -"""对码引擎单测:不依赖 DB / Oracle,纯内存验证四要素匹配 + 规格标准化。 -运行: python -m pytest state_center/tests/test_match_engine.py -v -或直接: python state_center/tests/test_match_engine.py -""" -import os -import sys - -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) - -from state_center.app.match_engine import ( # noqa: E402 - MatchEngine, GoodsRecord, build_match_key, _norm_spec, -) - - -def _engine(): - eng = MatchEngine() - eng.load_goods([ - GoodsRecord("阿卡波糖片", "国药准字H19990001", "50mg*30", "盒", "拜耳医药", "G001", "C001"), - GoodsRecord("哈药牌钙铁锌口服液", "国药准字Z20000002", "10ml*10", "盒", "哈药集团", "G002", "C002"), - # 同名多规格(用于一对多) - GoodsRecord("阿卡波糖片", "国药准字H19990001", "50mg*60", "盒", "拜耳医药", "G003", "C003"), - ]) - return eng - - -def test_spec_normalize_product(): - # 15×2 展开成 30 - assert _norm_spec("15×2") == _norm_spec("15*2") - assert _norm_spec("50mg*30").startswith("1500") or "mg" in _norm_spec("50mg*30") - - -def test_exact_hit(): - eng = _engine() - r = eng.match_one(1, "哈药牌钙铁锌口服液", "国药准字Z20000002", "10ml*10", "哈药集团") - assert r.match_status == "EXACT" - assert r.goods_id == "G002" - - -def test_multi_same_name(): - eng = _engine() - # 规格写法对不上任何精确键,但商品名命中多条 → MULTI - r = eng.match_one(2, "阿卡波糖片", "国药准字H19990001", "写个对不上的规格", "拜耳医药") - assert r.match_status == "MULTI" - assert len(r.candidates) >= 2 - - -def test_none(): - eng = _engine() - r = eng.match_one(3, "不存在的药", "X", "1", "无") - assert r.match_status == "NONE" - - -def test_fujian_hayao_exact_from_m5_row(): - eng = MatchEngine() - eng.load_goods( - [ - GoodsRecord( - "哈药牌钙铁锌口服液", - "食健备G201923000558", - "10ml*90支", - "盒", - "哈药集团三精制药有限公司", - "4000109983", - "4000109983", - ) - ] - ) - r = eng.match_one( - 1, - "哈药牌钙铁锌口服液", - "食健备G201923000558", - "10ml*90支", - "哈药集团三精制药有限公司", - ) - assert r.match_status == "EXACT" - assert r.goods_id == "4000109983" - - -def test_alias_priority(): - eng = _engine() - key = build_match_key("阿卡波糖", "", "30片", "") # 平台奇葩写法 - eng.load_aliases({key: ("G001", "C001", "盒")}) - r = eng.match_one(4, "阿卡波糖", "", "30片", "") - assert r.match_status == "ALIAS" - assert r.goods_id == "G001" - - -def test_manufacturer_tolerance(): - # 进口英文厂家:大小写/标点容错 - k1 = build_match_key("药A", "H1", "1", "Abbott Biologicals B.V.") - k2 = build_match_key("药A", "H1", "1", "abbott biologicals bv") - assert k1 == k2 - - -if __name__ == "__main__": - import traceback - fns = [v for k, v in sorted(globals().items()) if k.startswith("test_")] - passed = 0 - for fn in fns: - try: - fn() - print(f"PASS {fn.__name__}") - passed += 1 - except Exception: - print(f"FAIL {fn.__name__}") - traceback.print_exc() - print(f"\n{passed}/{len(fns)} passed") diff --git a/state_center/tests/test_web_api.py b/state_center/tests/test_web_api.py deleted file mode 100644 index 478b890..0000000 --- a/state_center/tests/test_web_api.py +++ /dev/null @@ -1,1226 +0,0 @@ -import importlib -import sys -import types - -from fastapi.testclient import TestClient - - -def _install_fake_pymysql(): - pymysql = types.ModuleType("pymysql") - cursors = types.ModuleType("pymysql.cursors") - - class DictCursor: # noqa: D401 - test double - pass - - def connect(*args, **kwargs): # noqa: D401 - test double - raise AssertionError("connect should be monkeypatched in tests") - - cursors.DictCursor = DictCursor - pymysql.cursors = cursors - pymysql.connect = connect - sys.modules["pymysql"] = pymysql - sys.modules["pymysql.cursors"] = cursors - - -def test_timeline_api_returns_backend_computed_nodes(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __init__(self): - self._result = [] - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM job WHERE job_id" in sql: - self._result = [{ - "job_id": "JOB-1", - "source_type": "YYC", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "needs_source_add": 1, - }] - elif "FROM job_node" in sql: - self._result = [ - {"node_code": "ORDER_FETCH", "attempt_no": 1, "status": "SUCCESS"}, - {"node_code": "PRODUCT_MATCH", "attempt_no": 1, "status": "SUCCESS"}, - ] - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - def fetchall(self): - return list(self._result) - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - resp = client.get("/api/jobs/JOB-1/timeline") - assert resp.status_code == 200 - body = resp.json() - by_code = {item["node_code"]: item for item in body["timeline"]} - assert by_code["ORDER_FETCH"]["display_status"] == "SUCCESS" - assert by_code["OCR_EXTRACT"]["display_status"] == "SKIPPED" - assert by_code["SOURCE_ADD"]["display_status"] == "WAITING_USER" - - -def test_state_machine_api_returns_chinese_labels(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - resp = client.get("/api/state-machine") - assert resp.status_code == 200 - body = resp.json() - assert body["node_labels"]["ORDER_FETCH"] == "订单获取" - assert body["executor_labels"]["RPA"] == "艺赛旗执行" - assert body["node_executor"]["PRODUCT_MATCH"] == "STATE_CENTER" - - -def test_health_reports_database_status(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - assert sql == "SELECT 1" - - def fetchone(self): - return {"ok": 1} - - class FakeConn: - def cursor(self): - return FakeCursor() - - def close(self): - pass - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - response = client.get("/health") - - assert response.status_code == 200 - assert response.json() == {"ok": True, "database": "ok"} - - -def test_task_submit_confirms_source_add_and_is_idempotent(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - state = { - "task": { - "task_id": "TASK-1", - "job_id": "JOB-1", - "node_code": "SOURCE_ADD", - "role_code": "PURCHASER", - "status": "OPEN", - "submit_token": None, - "submitted_action": None, - "submitted_payload_json": None, - "submitted_result_json": None, - }, - "job": { - "job_id": "JOB-1", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "needs_source_add": 1, - "current_role": "PURCHASER", - "source_type": "YYC", - }, - "job_nodes": [ - {"node_code": "SOURCE_ADD", "attempt_no": 1, "status": "WAITING_USER"}, - ], - } - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - self.last_sql = sql - self.last_params = params - if "FROM user_task WHERE task_id=%s" in sql: - self._result = [state["task"]] - elif "FROM job WHERE job_id=%s" in sql and "UPDATE" not in sql: - self._result = [state["job"]] - elif "submitted_result_json" in sql and "FROM user_task" in sql: - self._result = [state["task"]] - elif "SELECT node_code,attempt_no,status" in sql: - self._result = list(state["job_nodes"]) - elif sql.startswith("UPDATE user_task SET status='SUBMITTED'"): - state["task"]["status"] = "SUBMITTED" - state["task"]["submit_token"] = params[0] - state["task"]["submitted_action"] = params[1] - state["task"]["submitted_payload_json"] = params[2] - state["task"]["submitted_result_json"] = params[3] - state["task"]["submitted_by"] = params[4] - state["task"]["submitted_at"] = params[5] - elif sql.startswith("UPDATE job SET needs_source_add=0"): - state["job"]["needs_source_add"] = 0 - elif sql.startswith("UPDATE job SET current_node_code=%s,status='PENDING'"): - state["job"]["current_node_code"] = params[0] - state["job"]["status"] = "PENDING" - elif sql.startswith("UPDATE job_node SET status='SUCCESS'"): - state["job_nodes"][0]["status"] = "SUCCESS" - elif sql.startswith("INSERT INTO job_event"): - pass - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - def fetchall(self): - return list(self._result) - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - headers = {"X-Agent-Token": main.settings.AGENT_TOKEN} - first = client.post( - "/api/tasks/TASK-1/submit", - headers=headers, - json={ - "action": "CONFIRM_AND_CONTINUE", - "payload": {"sourceAdd": True}, - "submitToken": "token-1", - "operator": "alice", - }, - ) - assert first.status_code == 200 - first_body = first.json() - assert first_body["next_node"] == "CONTRACT_CREATE" - assert state["task"]["status"] == "SUBMITTED" - assert state["task"]["submitted_result_json"] is not None - assert state["job"]["current_node_code"] == "CONTRACT_CREATE" - assert state["job"]["needs_source_add"] == 0 - - second = client.post( - "/api/tasks/TASK-1/submit", - headers=headers, - json={ - "action": "CONFIRM_AND_CONTINUE", - "payload": {"sourceAdd": True}, - "submitToken": "token-1", - "operator": "alice", - }, - ) - assert second.status_code == 200 - assert second.json()["idempotent"] is True - - third = client.post( - "/api/tasks/TASK-1/submit", - headers=headers, - json={ - "action": "CONFIRM_AND_CONTINUE", - "payload": {"sourceAdd": True}, - "submitToken": "token-2", - "operator": "alice", - }, - ) - assert third.status_code == 409 - - -def test_task_submit_source_add_creates_missing_node_history(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - state = { - "task": { - "task_id": "TASK-1", - "job_id": "JOB-1", - "node_code": "SOURCE_ADD", - "role_code": "PURCHASER", - "status": "OPEN", - "submit_token": None, - "submitted_result_json": None, - }, - "job": { - "job_id": "JOB-1", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "needs_source_add": 1, - "current_role": "PURCHASER", - "source_type": "YYC", - }, - "job_nodes": [], - } - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM user_task WHERE task_id=%s" in sql: - self._result = [state["task"]] - elif "FROM job WHERE job_id=%s" in sql and "UPDATE" not in sql: - self._result = [state["job"]] - elif sql.startswith("UPDATE job SET needs_source_add=0"): - state["job"]["needs_source_add"] = 0 - elif sql.startswith("INSERT INTO job_node"): - state["job_nodes"].append({ - "node_code": params[1], - "attempt_no": params[3], - "status": "SUCCESS", - "executor_type": params[2], - }) - elif sql.startswith("UPDATE job SET current_node_code=%s,status='PENDING'"): - state["job"]["current_node_code"] = params[0] - state["job"]["status"] = "PENDING" - elif sql.startswith("UPDATE user_task SET status='SUBMITTED'"): - state["task"]["status"] = "SUBMITTED" - state["task"]["submit_token"] = params[0] - state["task"]["submitted_result_json"] = params[3] - elif sql.startswith("INSERT INTO job_event"): - pass - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - response = client.post( - "/api/tasks/TASK-1/submit", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={ - "action": "CONFIRM_AND_CONTINUE", - "payload": {}, - "submitToken": "source-submit-1", - "operator": "采购张三", - }, - ) - - assert response.status_code == 200 - assert state["job_nodes"] == [{ - "node_code": "SOURCE_ADD", - "attempt_no": 1, - "status": "SUCCESS", - "executor_type": "HUMAN", - }] - - -def test_advance_to_m5_human_node_creates_task(): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - - state = { - "job": { - "job_id": "JOB-1", - "supplier_name": "重庆亿昊药业", - "current_node_code": "M5_CREATE_ORDER", - "status": "RUNNING", - }, - "job_nodes": [], - "tasks": [], - } - - class FakeCursor: - def execute(self, sql, params=None): - if sql.startswith("INSERT INTO job_node"): - state["job_nodes"].append({ - "node_code": params[1], - "executor_type": params[2], - "attempt_no": params[3], - "status": params[4], - }) - elif sql.startswith("DELETE FROM user_task"): - pass - elif sql.startswith("UPDATE job SET current_node_code=%s,status='WAITING_USER'"): - state["job"]["current_node_code"] = params[0] - state["job"]["status"] = "WAITING_USER" - state["job"]["current_role"] = params[1] - elif sql.startswith("INSERT INTO user_task"): - state["tasks"].append({ - "job_id": params[1], - "node_code": params[2], - "role_code": params[3], - "title": params[4], - }) - elif sql.startswith("INSERT INTO job_event"): - pass - else: - raise AssertionError(sql) - - nxt = main._advance(FakeCursor(), state["job"], "M5_CREATE_ORDER") - - assert nxt == "M5_MANUAL_CONFIRM" - assert state["job"]["status"] == "WAITING_USER" - assert state["job"]["current_role"] == "PURCHASER" - assert state["job_nodes"] == [{ - "node_code": "M5_MANUAL_CONFIRM", - "executor_type": "HUMAN", - "attempt_no": 1, - "status": "WAITING_USER", - }] - assert state["tasks"] == [{ - "job_id": "JOB-1", - "node_code": "M5_MANUAL_CONFIRM", - "role_code": "PURCHASER", - "title": "M5人工确认:重庆亿昊药业", - }] - - -def test_node_complete_exports_artifacts(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - state = { - "job": { - "job_id": "JOB-1", - "current_node_code": "CONTRACT_CREATE", - "status": "RUNNING", - "source_type": "YYC", - }, - "job_node": { - "node_code": "CONTRACT_CREATE", - "attempt_no": 1, - "status": "RUNNING", - }, - "artifacts": [], - } - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM job WHERE job_id=%s" in sql and "ORDER BY" not in sql: - self._result = [state["job"]] - elif "FROM job_node WHERE job_id=%s" in sql: - self._result = [state["job_node"]] - elif "FROM user_task WHERE job_id=%s" in sql: - self._result = [] - elif "FROM job_artifact WHERE job_id=%s" in sql: - self._result = list(state["artifacts"]) - elif sql.startswith("UPDATE job_node SET status='SUCCESS'"): - state["job_node"]["status"] = "SUCCESS" - state["job_node"]["ended_at"] = params[1] - if len(params) > 2: - state["job_node"]["callback_idempotency_key"] = params[2] - elif sql.startswith("INSERT INTO job_artifact"): - state["artifacts"].append({ - "job_id": params[0], - "node_code": params[1], - "attempt_no": params[2], - "artifact_type": params[3], - "storage_path": params[4], - "file_hash": params[5], - "visible_roles": params[6], - "is_masked": params[7], - }) - elif sql.startswith("INSERT INTO job_event"): - pass - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - def fetchall(self): - if self._result: - return list(self._result) - return [] - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - headers = {"X-Agent-Token": main.settings.AGENT_TOKEN} - done = client.post( - "/api/jobs/JOB-1/nodes/CONTRACT_CREATE/complete", - headers=headers, - json={ - "attemptNo": 1, - "executorRunId": "RUN-1", - "idempotencyKey": "idem-1", - "businessRefs": {"contractSystemNo": "HT-001"}, - "summary": {"done": True}, - "artifacts": [ - { - "artifactType": "CONTRACT_PDF", - "storagePath": "/data/jobs/JOB-1/contract.pdf", - "fileHash": "sha256:abc", - "visibleRoles": ["PURCHASER", "PLANNER"], - "isMasked": False, - } - ], - }, - ) - - assert done.status_code == 200 - - package = client.get("/api/jobs/JOB-1/evidence-package") - assert package.status_code == 200 - body = package.json() - assert body["artifacts"][0]["artifact_type"] == "CONTRACT_PDF" - assert body["artifacts"][0]["storage_path"] == "/data/jobs/JOB-1/contract.pdf" - - -def test_job_list_api_returns_compact_rows(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM job" in sql: - self._result = [{ - "job_id": "JOB-1", - "supplier_name": "重庆亿昊药业", - "order_date": "2026-08-04", - "source_type": "YYC", - "status": "RUNNING", - "current_node_code": "PRODUCT_MATCH", - "current_role": "PLANNER", - "created_at": "2026-08-10 10:00:00", - "updated_at": "2026-08-10 10:05:00", - "finished_at": None, - }] - else: - self._result = [] - - def fetchall(self): - return list(self._result) - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - resp = client.get("/api/jobs", params={"status": "RUNNING"}) - assert resp.status_code == 200 - body = resp.json() - assert body["items"][0]["job_id"] == "JOB-1" - assert body["items"][0]["supplier_name"] == "重庆亿昊药业" - assert body["items"][0]["current_node_code"] == "PRODUCT_MATCH" - - -def test_task_list_api_filters_by_role(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM user_task" in sql: - self._result = [{ - "task_id": "TASK-1", - "job_id": "JOB-1", - "node_code": "SOURCE_ADD", - "role_code": "PURCHASER", - "status": "OPEN", - "title": "新增货源:重庆亿昊药业", - "reason_type": "SOURCE_ADD", - "submitted_action": None, - "submitted_at": None, - "created_at": "2026-08-10 10:00:00", - }] - else: - self._result = [] - - def fetchall(self): - return list(self._result) - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - - resp = client.get("/api/tasks/my", params={"roleCode": "PURCHASER", "status": "open"}) - assert resp.status_code == 200 - body = resp.json() - assert body["items"][0]["task_id"] == "TASK-1" - assert body["items"][0]["role_code"] == "PURCHASER" - - -def test_ingest_order_items_before_match(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - executed = [] - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - executed.append((sql, params)) - if "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [{ - "job_id": "JOB-1", - "current_node_code": "ORDER_FETCH", - "status": "RUNNING", - }] - elif "FROM product_match" in sql: - self._result = [{"c": 0}] - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/jobs/JOB-1/items", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={ - "replace": True, - "rows": [{ - "orderNo": "DD-001", - "rawProductName": "阿卡波糖片", - "platformProductCode": "PT-001", - "spec": "50mg*30片", - "manufacturer": "示例制药", - "approvalNo": "国药准字H00000001", - "qty": 12, - "unitPrice": 9.8, - "sourceRowNo": 2, - }], - }, - ) - - assert response.status_code == 200 - assert response.json() == {"ok": True, "inserted": 1, "order_nos": ["DD-001"]} - assert any(sql.startswith("INSERT INTO order_item") for sql, _ in executed) - assert any("order_no_list_json" in sql for sql, _ in executed) - - -def test_ingest_order_items_rejects_replace_after_match(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [{"job_id": "JOB-1", "current_node_code": "PRODUCT_MATCH"}] - elif "FROM product_match" in sql: - self._result = [{"c": 1}] - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/jobs/JOB-1/items", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={"replace": True, "rows": []}, - ) - - assert response.status_code == 409 - assert "对码结果" in response.json()["detail"] - - -def test_load_fixture_goods_for_local_demo(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - monkeypatch.setattr(main.settings, "DEV_MODE", True, raising=False) - response = client.post( - "/api/dev/match/load-fixture-goods", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - ) - - assert response.status_code == 200 - assert response.json()["loaded"] >= 3 - assert main._ENGINE_LOADED is True - - -def test_select_candidate_requires_candidate_payload(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM user_task WHERE task_id=%s" in sql: - self._result = [{ - "task_id": "TASK-1", - "job_id": "JOB-1", - "node_code": "PRODUCT_MATCH", - "role_code": "PLANNER", - "status": "OPEN", - "submit_token": None, - "product_match_id": 7, - }] - elif "FROM job WHERE job_id=%s" in sql: - self._result = [{ - "job_id": "JOB-1", - "current_node_code": "PRODUCT_MATCH", - "status": "WAITING_USER", - }] - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/tasks/TASK-1/submit", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={ - "action": "SELECT_CANDIDATE", - "payload": {}, - "submitToken": "submit-1", - "operator": "计划员张三", - }, - ) - - assert response.status_code == 400 - assert response.json()["detail"] == "选择候选货品时必须提供 productMatchId 和 goodsId" - - -def test_advance_from_receipt_notice_auto_archives_job(): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - - state = { - "job": { - "job_id": "JOB-1", - "supplier_name": "重庆亿昊药业", - "current_node_code": "M5_RECEIPT_NOTICE", - "status": "WAITING_USER", - "finished_at": None, - }, - "job_nodes": [], - "events": [], - } - - class FakeCursor: - def execute(self, sql, params=None): - if sql.startswith("INSERT INTO job_node"): - state["job_nodes"].append({ - "node_code": params[1], - "executor_type": params[2], - "attempt_no": params[3], - "status": params[4], - }) - elif sql.startswith("UPDATE job SET status='SUCCESS'"): - state["job"]["status"] = "SUCCESS" - state["job"]["finished_at"] = params[0] - state["job"]["current_node_code"] = "ARCHIVE_JOB" - elif sql.startswith("INSERT INTO job_event"): - state["events"].append({"event_type": params[1], "node_code": params[2]}) - else: - raise AssertionError(sql) - - nxt = main._advance(FakeCursor(), state["job"], "M5_RECEIPT_NOTICE") - - assert nxt is None - assert state["job"]["status"] == "SUCCESS" - assert state["job"]["current_node_code"] == "ARCHIVE_JOB" - assert state["job"]["finished_at"] is not None - assert state["job_nodes"] == [{ - "node_code": "ARCHIVE_JOB", - "executor_type": "STATE_CENTER", - "attempt_no": 1, - "status": "SUCCESS", - }] - assert {"event_type": "JOB_FINISHED", "node_code": None} in state["events"] - - -def test_retry_failed_retryable_node_opens_next_attempt(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - state = { - "job": { - "job_id": "JOB-1", - "current_node_code": "ORDER_FETCH", - "status": "FAILED_RETRYABLE", - "source_type": "YYC", - }, - "attempts": [ - {"attempt_no": 1, "status": "FAILED"}, - ], - "events": [], - } - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [state["job"]] - elif "SELECT MAX(attempt_no)" in sql or "SELECT COALESCE(MAX(attempt_no)" in sql: - self._result = [{"max_attempt": state["attempts"][-1]["attempt_no"]}] - elif sql.startswith("UPDATE job SET status='PENDING'"): - state["job"]["status"] = "PENDING" - elif sql.startswith("INSERT INTO job_event"): - state["events"].append({"event_type": params[1], "node_code": params[2]}) - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/jobs/JOB-1/retry", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - ) - - assert response.status_code == 200 - body = response.json() - assert body["ok"] is True - assert body["node_code"] == "ORDER_FETCH" - assert body["attempt_no"] == 2 - assert state["job"]["status"] == "PENDING" - assert state["job"]["current_node_code"] == "ORDER_FETCH" - assert state["attempts"] == [{"attempt_no": 1, "status": "FAILED"}] - - -def test_contract_approve_timeout_creates_ops_task(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - state = { - "job": { - "job_id": "JOB-1", - "supplier_name": "重庆亿昊药业", - "current_node_code": "CONTRACT_APPROVE_WAIT", - "status": "WAITING_EXTERNAL", - "wait_check_count": main.settings.CONTRACT_WAIT_MAX_CHECKS - 1, - "source_type": "YYC", - }, - "job_nodes": [], - "tasks": [], - } - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [state["job"]] - elif sql.startswith("INSERT INTO job_node"): - state["job_nodes"].append({ - "node_code": params[1], - "attempt_no": params[2], - "status": params[3], - }) - elif sql.startswith("UPDATE job SET status='WAITING_USER'"): - state["job"]["status"] = "WAITING_USER" - state["job"]["current_role"] = "OPS" - state["job"]["wait_check_count"] = params[0] - elif sql.startswith("DELETE FROM user_task"): - pass - elif sql.startswith("INSERT INTO user_task"): - state["tasks"].append({ - "job_id": params[1], - "node_code": params[2], - "role_code": params[3], - "title": params[4], - }) - elif sql.startswith("INSERT INTO job_event"): - pass - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/jobs/JOB-1/nodes/CONTRACT_APPROVE_WAIT/check-result", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={"approved": False, "operator": "agent", "detail": "仍未审批"}, - ) - - assert response.status_code == 200 - body = response.json() - assert body["escalated"] is True - assert body["job_status"] == "WAITING_USER" - assert state["job"]["current_role"] == "OPS" - assert state["tasks"] == [{ - "job_id": "JOB-1", - "node_code": "CONTRACT_APPROVE_WAIT", - "role_code": "OPS", - "title": "合同审批超时:重庆亿昊药业", - }] - - -def test_contract_approve_timeout_task_confirm_advances_to_rebate(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - state = { - "task": { - "task_id": "TASK-OPS-1", - "job_id": "JOB-1", - "node_code": "CONTRACT_APPROVE_WAIT", - "role_code": "OPS", - "status": "OPEN", - "submit_token": None, - "submitted_result_json": None, - }, - "job": { - "job_id": "JOB-1", - "supplier_name": "重庆亿昊药业", - "current_node_code": "CONTRACT_APPROVE_WAIT", - "status": "WAITING_USER", - "current_role": "OPS", - "source_type": "YYC", - }, - "job_nodes": [ - {"node_code": "CONTRACT_APPROVE_WAIT", "attempt_no": 8, "status": "FAILED"}, - ], - } - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM user_task WHERE task_id=%s" in sql: - self._result = [state["task"]] - elif "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [state["job"]] - elif "SELECT attempt_no,status FROM job_node" in sql: - self._result = [state["job_nodes"][-1]] - elif sql.startswith("INSERT INTO job_node"): - state["job_nodes"].append({ - "node_code": params[1], - "executor_type": params[2], - "attempt_no": params[3], - "status": "SUCCESS", - }) - elif sql.startswith("UPDATE job_node SET status='SUCCESS'"): - raise AssertionError("timeout confirm must not overwrite check history") - elif sql.startswith("UPDATE job SET current_node_code=%s,status='PENDING'"): - state["job"]["current_node_code"] = params[0] - state["job"]["status"] = "PENDING" - elif sql.startswith("UPDATE user_task SET status='SUBMITTED'"): - state["task"]["status"] = "SUBMITTED" - state["task"]["submit_token"] = params[0] - state["task"]["submitted_result_json"] = params[3] - elif sql.startswith("INSERT INTO job_event"): - pass - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/tasks/TASK-OPS-1/submit", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={ - "action": "CONFIRM_AND_CONTINUE", - "payload": {}, - "submitToken": "ops-confirm-1", - "operator": "ops", - }, - ) - - assert response.status_code == 200 - assert response.json()["next_node"] == "REBATE_HEADER" - assert state["job"]["current_node_code"] == "REBATE_HEADER" - assert state["job_nodes"][-1]["node_code"] == "CONTRACT_APPROVE_WAIT" - assert state["job_nodes"][-1]["status"] == "SUCCESS" - assert state["job_nodes"][-1]["attempt_no"] == 9 - assert state["job_nodes"][0]["status"] == "FAILED" - - -def test_human_node_rejects_rpa_complete(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [{ - "job_id": "JOB-1", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "source_type": "YYC", - }] - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/jobs/JOB-1/nodes/SOURCE_ADD/complete", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={"attemptNo": 1, "summary": {"sourceAdded": True}}, - ) - - assert response.status_code == 409 - assert "人工节点" in response.json()["detail"] - - -def test_task_submit_rejects_oversized_submit_token(monkeypatch): - _install_fake_pymysql() - main = importlib.import_module("state_center.app.main") - client = TestClient(main.app) - advanced = {"moved": False} - - class FakeCursor: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def execute(self, sql, params=None): - if "FROM user_task WHERE task_id=%s" in sql: - self._result = [{ - "task_id": "TASK-1", - "job_id": "JOB-1", - "node_code": "SOURCE_ADD", - "status": "OPEN", - "submit_token": None, - }] - elif "SELECT * FROM job WHERE job_id=%s" in sql: - self._result = [{ - "job_id": "JOB-1", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "source_type": "YYC", - }] - elif sql.startswith("UPDATE job SET"): - advanced["moved"] = True - else: - self._result = [] - - def fetchone(self): - return self._result[0] if self._result else None - - @property - def _result(self): - return getattr(self, "_result_data", []) - - @_result.setter - def _result(self, value): - self._result_data = value - - class FakeConn: - def cursor(self): - return FakeCursor() - - def begin(self): - return None - - def commit(self): - return None - - def rollback(self): - return None - - def close(self): - return None - - monkeypatch.setattr(main, "get_conn", lambda: FakeConn()) - response = client.post( - "/api/tasks/TASK-1/submit", - headers={"X-Agent-Token": main.settings.AGENT_TOKEN}, - json={ - "action": "CONFIRM_AND_CONTINUE", - "payload": {}, - "submitToken": "x" * 65, - "operator": "alice", - }, - ) - - assert response.status_code == 400 - assert "submitToken" in response.json()["detail"] - assert advanced["moved"] is False diff --git a/state_center/tests/test_web_state_machine.py b/state_center/tests/test_web_state_machine.py deleted file mode 100644 index bb5acf2..0000000 --- a/state_center/tests/test_web_state_machine.py +++ /dev/null @@ -1,23 +0,0 @@ -from state_center.app.web_state_machine import build_timeline - - -def test_build_timeline_marks_skipped_and_waiting_user(): - job = { - "job_id": "JOB-1", - "source_type": "YYC", - "current_node_code": "SOURCE_ADD", - "status": "WAITING_USER", - "needs_source_add": 1, - } - job_nodes = [ - {"node_code": "ORDER_FETCH", "attempt_no": 1, "status": "SUCCESS"}, - {"node_code": "PRODUCT_MATCH", "attempt_no": 1, "status": "SUCCESS"}, - ] - - timeline = build_timeline(job, job_nodes) - by_code = {item["node_code"]: item for item in timeline} - - assert by_code["ORDER_FETCH"]["display_status"] == "SUCCESS" - assert by_code["OCR_EXTRACT"]["display_status"] == "SKIPPED" - assert by_code["SOURCE_ADD"]["display_status"] == "WAITING_USER" - assert by_code["CONTRACT_CREATE"]["display_status"] == "PENDING" diff --git a/state_center/tests/test_yisaiqi_contract_create.py b/state_center/tests/test_yisaiqi_contract_create.py deleted file mode 100644 index 56a66c8..0000000 --- a/state_center/tests/test_yisaiqi_contract_create.py +++ /dev/null @@ -1,112 +0,0 @@ -import json - -from rpa_yisaiqi.callback_client import StateCenterClient -from rpa_yisaiqi.contract_create_node import ( - ContractCreateInput, - LoginFailed, - execute_contract_create, -) - - -class FakeHttp: - def __init__(self, responses=None): - self.requests = [] - self.responses = list(responses or [{"ok": True}, {"ok": True, "next_node": "CONTRACT_APPROVE_WAIT"}]) - - def __call__(self, request, timeout): - body = json.loads(request.data.decode("utf-8")) if request.data else None - self.requests.append( - { - "url": request.full_url, - "headers": dict(request.header_items()), - "body": body, - "timeout": timeout, - } - ) - return FakeResponse(self.responses.pop(0)) - - -class FakeResponse: - def __init__(self, payload): - self.payload = payload - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - return False - - def read(self): - return json.dumps(self.payload).encode("utf-8") - - -def test_state_center_client_sends_agent_token_and_json_body(): - http = FakeHttp([{"ok": True}]) - client = StateCenterClient("http://state-center:8000/", "dev-agent-token", opener=http) - - result = client.start_node("JOB-1", "CONTRACT_CREATE", attempt_no=2, operator="agent") - - assert result == {"ok": True} - assert http.requests[0]["url"] == "http://state-center:8000/api/jobs/JOB-1/nodes/CONTRACT_CREATE/start" - assert http.requests[0]["headers"]["X-agent-token"] == "dev-agent-token" - assert http.requests[0]["body"] == { - "attemptNo": 2, - "executorPlatform": "iS-RPA", - "operator": "agent", - } - - -def test_state_center_client_escapes_non_ascii_path_parts(): - http = FakeHttp([{"ok": True}]) - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - - client.start_node("YYC-合同节点联调-001", "CONTRACT_CREATE") - - assert http.requests[0]["url"] == ( - "http://state-center:8000/api/jobs/" - "YYC-%E5%90%88%E5%90%8C%E8%8A%82%E7%82%B9%E8%81%94%E8%B0%83-001" - "/nodes/CONTRACT_CREATE/start" - ) - - -def test_contract_create_calls_start_then_complete_with_contract_number(): - http = FakeHttp() - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - spec = ContractCreateInput( - job_id="JOB-1", - supplier_name="重庆亿昊药业", - order_date="2026-08-11", - source_type="YYC", - contract_system_no="HT-20260811-001", - ) - - result = execute_contract_create(spec, client) - - assert result["next_node"] == "CONTRACT_APPROVE_WAIT" - assert [request["url"].split("/")[-1] for request in http.requests] == ["start", "complete"] - assert http.requests[1]["body"]["businessRefs"] == {"contractSystemNo": "HT-20260811-001"} - assert http.requests[1]["body"]["summary"]["supplierName"] == "重庆亿昊药业" - assert http.requests[1]["body"]["summary"]["contractDate"] == "2026-08-11" - - -def test_contract_create_reports_login_failure_to_state_center(): - http = FakeHttp([{"ok": True}, {"ok": True, "job_status": "FAILED_RETRYABLE"}]) - client = StateCenterClient("http://state-center:8000", "dev-agent-token", opener=http) - spec = ContractCreateInput( - job_id="JOB-1", - supplier_name="重庆亿昊药业", - order_date="2026-08-11", - source_type="YYC", - contract_system_no="HT-20260811-001", - ) - - def failing_runner(_spec): - raise LoginFailed("合同系统登录失败") - - result = execute_contract_create(spec, client, contract_runner=failing_runner) - - assert result["job_status"] == "FAILED_RETRYABLE" - assert http.requests[1]["url"].endswith("/api/jobs/JOB-1/nodes/CONTRACT_CREATE/fail") - assert http.requests[1]["body"]["errorCode"] == "SYS_LOGIN_FAIL" - assert http.requests[1]["body"]["retryable"] is True - assert http.requests[1]["body"]["routeRole"] == "OPS" diff --git a/state_center/tests/test_yisaiqi_contract_draft.py b/state_center/tests/test_yisaiqi_contract_draft.py deleted file mode 100644 index adb3d6d..0000000 --- a/state_center/tests/test_yisaiqi_contract_draft.py +++ /dev/null @@ -1,180 +0,0 @@ -import json -from pathlib import Path - -import pytest - -from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter -from rpa_yisaiqi.contract_create_node import ( - ContractCreateError, - ContractCreateInput, - PdfMergeUnsupported, - build_spec_from_data, - create_contract_in_contract_system, -) -from rpa_yisaiqi.contract_draft import is_placeholder_customer_code, load_contract_draft -from rpa_yisaiqi.pdf_utils import ensure_merged_pdf - - -def test_load_contract_draft_maps_full_contract_inputs(tmp_path): - draft_path = tmp_path / "contract-draft.json" - draft_path.write_text( - json.dumps( - { - "supplierName": "重庆亿昊药业", - "orderDate": "2026-08-11", - "sourceType": "YYC", - "templateType": "NON_FORMAT", - "templateName": "非格式--采购协议", - "customerCode": "CUST-001", - "customerName": "重庆亿昊药业", - "contractCategory": "采购协议", - "settlementType": "付款", - "contractBackground": "按订单自动起草采购协议", - "contractNature": "主合同", - "amountCurrency": "人民币", - "amount": "12000.50", - "contractEndDate": "2026-12-31", - "isMajorContract": "否", - "isPrepayment": "否", - "belongYear": "2026", - "paymentMethod": "承兑", - "paymentDays": "45", - "contractStatus": "正式合同", - "containsBloodProducts": "否", - "platformPdfPaths": ["C:/jobs/JOB-1/a.pdf", "C:/jobs/JOB-1/b.pdf"], - "goodsLines": [ - { - "operationCode": "ADD", - "goodsCode": "YP-001", - "goodsName": "阿卡波糖片", - "approvalNo": "国药准字H00000001", - "spec": "50mg*30片", - "unit": "盒", - "quantity": 12, - } - ], - }, - ensure_ascii=False, - ), - encoding="utf-8", - ) - - draft = load_contract_draft(draft_path) - - assert draft.supplier_name == "重庆亿昊药业" - assert draft.template_type == "NON_FORMAT" - assert draft.template_name == "非格式--采购协议" - assert draft.customer_code == "CUST-001" - assert draft.customer_name == "重庆亿昊药业" - assert draft.contract_category == "采购协议" - assert draft.settlement_type == "付款" - assert draft.contract_background == "按订单自动起草采购协议" - assert draft.amount == "12000.50" - assert draft.contract_end_date == "2026-12-31" - assert draft.belong_year == "2026" - assert draft.payment_method == "承兑" - assert draft.contract_status == "正式合同" - assert draft.contains_blood_products == "否" - assert draft.platform_pdf_paths == ["C:/jobs/JOB-1/a.pdf", "C:/jobs/JOB-1/b.pdf"] - assert draft.goods_lines[0].goods_code == "YP-001" - - -def test_placeholder_customer_code_is_rejected_before_opening_browser(): - assert is_placeholder_customer_code("CUST-YYC-001") - assert is_placeholder_customer_code("test-001") - assert not is_placeholder_customer_code("DW0100046361") - - with pytest.raises(ContractCreateError, match="占位符"): - build_spec_from_data( - { - "jobId": "JOB-1", - "supplierName": "重庆亿昊药业有限公司", - "orderDate": "2026-08-11", - "sourceType": "XYY", - "customerCode": "CUST-YYC-001", - "customerName": "重庆亿昊药业有限公司", - "amount": "100", - "submitMode": "dry_run", - "goodsLines": [ - { - "goodsCode": "YP-001", - "goodsName": "阿卡波糖片", - "quantity": 1, - } - ], - } - ) - - -def test_yyc_requires_pdf_inputs_before_contract_drafting(tmp_path): - draft_path = tmp_path / "draft.json" - draft_path.write_text( - json.dumps( - { - "supplierName": "重庆亿昊药业", - "orderDate": "2026-08-11", - "sourceType": "YYC", - "goodsLines": [], - "platformPdfPaths": [], - }, - ensure_ascii=False, - ), - encoding="utf-8", - ) - spec = ContractCreateInput( - job_id="JOB-1", - supplier_name="重庆亿昊药业", - order_date="2026-08-11", - source_type="YYC", - draft_path=str(draft_path), - ) - - with pytest.raises(PdfMergeUnsupported): - create_contract_in_contract_system(spec) - - -def test_ensure_merged_pdf_uses_single_pdf_without_merge(tmp_path): - source = tmp_path / "one.pdf" - source.write_bytes(b"%PDF-1.4\n%one\n") - - assert ensure_merged_pdf([str(source)], str(tmp_path / "merged.pdf")) == str(source) - - -def test_create_contract_uses_apa_browser_adapter(tmp_path, monkeypatch): - draft_path = tmp_path / "draft.json" - draft_path.write_text( - json.dumps( - { - "supplierName": "重庆亿昊药业有限公司", - "orderDate": "2026-08-11", - "sourceType": "XYY", - "customerCode": "DW0100046361", - "customerName": "重庆亿昊药业有限公司", - "goodsLines": [], - "platformPdfPaths": [], - }, - ensure_ascii=False, - ), - encoding="utf-8", - ) - spec = ContractCreateInput( - job_id="JOB-1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - draft_path=str(draft_path), - ) - captured = {} - - def fake_run(browser, ctx): - captured["browser"] = browser - captured["ctx"] = ctx - return "HT-1" - - monkeypatch.setattr( - "rpa_yisaiqi.contract_create_node.run_contract_create_flow", - fake_run, - ) - - assert create_contract_in_contract_system(spec) == "HT-1" - assert isinstance(captured["browser"], ApaBrowserAdapter) diff --git a/state_center/tests/test_yisaiqi_contract_flow_steps.py b/state_center/tests/test_yisaiqi_contract_flow_steps.py deleted file mode 100644 index aa64901..0000000 --- a/state_center/tests/test_yisaiqi_contract_flow_steps.py +++ /dev/null @@ -1,490 +0,0 @@ -import pytest - -from rpa_yisaiqi.contract_flow_steps import ( - ContractFlowContext, - ContractGoodsLine, - fill_contract_signatory_info, - run_contract_create_flow, -) -from rpa_yisaiqi.runtime.errors import SupplierContractDisabled - - -@pytest.fixture(autouse=True) -def no_sleep(monkeypatch): - monkeypatch.setattr("rpa_yisaiqi.contract_flow_steps.time.sleep", lambda _s: None) - - -class FakeBrowser: - def __init__(self): - self.calls = [] - self.body_text = "" - self.xform_labels = {} - self.filled = {} - self.read_values = { - "contract_number": "HT-20260811-REAL-001", - } - - def open_url(self, url): - self.calls.append(("open_url", url)) - if "kmAgreementApply" in url or "draft.jsp" in url: - self.body_text = "客户编码 客户名称 合同类别" - - def fill_first(self, selectors, value): - self.calls.append(("fill_first", tuple(selectors), value)) - for selector in selectors: - self.filled[selector] = value - - def click_native(self, selectors): - self.calls.append(("click_native", tuple(selectors))) - - def click_first(self, selectors): - self.calls.append(("click_first", tuple(selectors))) - joined = " ".join(str(item) for item in selectors) - if "login" in joined or "登录" in joined: - self.body_text = "切换门户 待办 待阅 合同管理 合同起草" - - def wait_for_text(self, text, timeout_seconds=15): - self.calls.append(("wait_for_text", text, timeout_seconds)) - if text and text not in self.body_text: - self.body_text = f"{self.body_text} {text}".strip() - - def wait_for_element(self, selectors, timeout_seconds=15): - self.calls.append(("wait_for_element", tuple(selectors), timeout_seconds)) - - def element_exists(self, selectors): - self.calls.append(("element_exists", tuple(selectors))) - return True - - def switch_to_frame(self, selectors): - self.calls.append(("switch_to_frame", tuple(selectors))) - - def switch_to_default_content(self): - self.calls.append(("switch_to_default_content",)) - - def select_first(self, selectors, value): - self.calls.append(("select_first", tuple(selectors), value)) - for selector in selectors: - self.filled[selector] = value - - def select_xform(self, name, value): - self.calls.append(("select_xform", name, value)) - self.xform_labels[name] = value - - def execute_script(self, script, *args): - self.calls.append(("execute_script", script[:48], args)) - if "hasTextInFrames" in script: - return True - if "latestByApplyTime" in script and "headerIdx" in script: - return "001132026081734940" - if "wantedTitle" in script and "headerIdx" in script: - return "001132026081734940" - if "fd_opcode" in script and "return i" in script: - return 0 - if "List_Selected" in script and "innerText" in script: - token = str(args[0]) if args else "" - if token.startswith("DW"): - self.filled['input[name="extendDataFormInfo.value(fd_customeropcode)"]'] = token - elif token: - self.filled['input[name="extendDataFormInfo.value(fd_detail1.0.fd_opcode)"]'] = token - if "box.click" in script: - return {"ok": True} - return True - if "marked" in script and "fd_detail1" in script: - return [] - if "return location.href" in script: - return "http://contract-test.gzmpc.com:8080/km/agreement/km_agreement_apply/kmAgreementApply.do?method=view" - if "Com_Parameter" in script and "fdId" in script: - return "FD-TEST-001" - if "添加合同" in script and ("pdf" in script or "wantedStem" in script): - if any(call[0] == "upload_file_first" for call in self.calls): - return {"ok": True, "via": "name"} - return {"ok": False, "via": "empty"} - if "提交" in script or "合同正文" in script or "确定" in script: - return {"ok": True} - if "fs-label" in script and args: - return self.xform_labels.get(args[0], "") - if "data-value" in script: - return "模板A" - return [] - - def upload_file_first(self, selectors, file_path): - self.calls.append(("upload_file_first", tuple(selectors), file_path)) - - def read_first(self, selectors, value_name): - self.calls.append(("read_first", tuple(selectors), value_name)) - if value_name in self.read_values: - return self.read_values[value_name] - for selector in selectors: - if selector in self.filled: - return self.filled[selector] - joined = " ".join(str(item) for item in selectors) - if "fd_customername" in joined: - return self.read_values.get("customer_name", "重庆亿昊药业有限公司") - if "fd_customeropcode" in joined: - return self.read_values.get("customer_code", self.filled.get( - 'input[name="extendDataFormInfo.value(fd_customeropcode)"]', "" - )) - if "fdSettype" in joined: - return self.read_values.get("settlement_type", "付款") - return "" - - def read_body_text(self): - self.calls.append(("read_body_text",)) - return self.body_text - - def screenshot(self, name): - self.calls.append(("screenshot", name)) - return f"/tmp/{name}.png" - - -def test_signatory_rejects_placeholder_customer_before_opening_picker(): - browser = FakeBrowser() - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="YYC", - customer_code="CUST-YYC-001", - customer_name="重庆亿昊药业有限公司", - ) - - with pytest.raises(SupplierContractDisabled, match="占位符"): - fill_contract_signatory_info(browser, ctx) - - assert browser.calls == [] - - -def test_contract_flow_logs_in_with_real_contract_login_selectors(): - browser = FakeBrowser() - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - template_type="FORMAT", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - goods_lines=[], - ) - - run_contract_create_flow(browser, ctx) - - assert ("open_url", "http://contract-test.gzmpc.com:8080/") in browser.calls - assert ("fill_first", ('input[name="j_username"]', 'input[placeholder="用户名"]'), "test002") in browser.calls - assert ("fill_first", ('input[name="j_password"]', 'input[placeholder="密码"]'), "1") in browser.calls - assert ( - "click_first", - ('a[class*="login_button"]', 'a:contains("登录")', 'input[name="btn_submit"]'), - ) in browser.calls - assert not [call for call in browser.calls if call[0] == "screenshot"] - - -def _touch_pdf(path): - path.write_bytes(b"%PDF-1.4\n1 0 obj<<>>endobj\ntrailer<<>>\n%%EOF\n") - return str(path) - - -def test_contract_flow_uses_order_date_and_uploads_yyc_merged_pdf(tmp_path): - browser = FakeBrowser() - browser.read_values["customer_name"] = "重庆亿昊药业有限公司" - pdf_path = _touch_pdf(tmp_path / "contract-merged.pdf") - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="YYC", - template_type="FORMAT", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - goods_lines=[ - ContractGoodsLine( - operation_code="ADD", - goods_code="FQX0100118047", - goods_name="盐酸托烷司琼注射液", - approval_no="苏20160372", - spec="5ml:5mg*5支", - unit="盒", - quantity=12, - unit_price="50.00", - ) - ], - merged_pdf_path=pdf_path, - ) - - contract_no = run_contract_create_flow(browser, ctx) - - assert contract_no == "001132026081734940" - assert ("fill_first", ('input[name="fdSigndate"]',), "2026-08-11") in browser.calls - assert ("fill_first", ('input[name="fdEffedate"]',), "2026-08-11") in browser.calls - assert ( - "click_first", - ('div[title="选择商品"]', "div.lui-component.lui_widget_btn_txt", "text=选择商品"), - ) in browser.calls - assert ( - "switch_to_frame", - ( - 'iframe[src*="EopBasedataMaterial"]', - 'iframe[src*="dialog_fdMaterial"]', - 'iframe[src*="common-template"]', - ), - ) in browser.calls - assert ("fill_first", ("input.search-box-text", "input[placeholder*='关键字']"), "FQX0100118047") in browser.calls - assert ( - "fill_first", - ('input[name="extendDataFormInfo.value(fd_detail1.0.fd_goodsqty)"]',), - "12", - ) in browser.calls - assert ( - "fill_first", - ('input[name="extendDataFormInfo.value(fd_detail1.0.fd_unitprice)"]',), - "50.00", - ) in browser.calls - assert any( - call[0] == "upload_file_first" and call[-1] == pdf_path - for call in browser.calls - ) - - -def test_contract_flow_skips_pdf_upload_for_xyy(): - browser = FakeBrowser() - browser.read_values["customer_name"] = "重庆亿昊药业有限公司" - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - template_type="FORMAT", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - goods_lines=[], - merged_pdf_path="C:/should-not-upload.pdf", - ) - - run_contract_create_flow(browser, ctx) - - assert not [call for call in browser.calls if call[0] == "upload_file_first"] - - -def test_contract_flow_enters_draft_form_by_template_url(tmp_path): - from rpa_yisaiqi.contract_flow_steps import FORM_PAGE_URL - - browser = FakeBrowser() - browser.read_values["customer_name"] = "重庆亿昊药业有限公司" - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="YYC", - template_type="NON_FORMAT", - template_name="非格式--采购协议", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - goods_lines=[], - merged_pdf_path=_touch_pdf(tmp_path / "contract-merged.pdf"), - ) - - run_contract_create_flow(browser, ctx) - - assert ("open_url", FORM_PAGE_URL) in browser.calls - assert ("wait_for_text", "客户编码", 20) in browser.calls - - -def test_contract_flow_fills_real_contract_draft_form_fields_from_screenshot(): - browser = FakeBrowser() - browser.read_values["customer_name"] = "重庆亿昊药业有限公司" - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - template_type="NON_FORMAT", - template_name="非格式--采购协议", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - contract_category="采购协议", - settlement_type="付款", - contract_background="按订单自动起草采购协议", - contract_nature="主合同", - amount_currency="人民币", - amount="12000.50", - contract_end_date="2026-12-31", - is_major_contract="否", - is_prepayment="否", - belong_year="2026", - payment_method="账期支付", - payment_days="30", - contract_status="正式合同", - contains_blood_products="否", - goods_lines=[], - ) - - run_contract_create_flow(browser, ctx) - - assert ( - "select_xform", - "extendDataFormInfo.value(fd_contract_cate_type)", - "其他协议(采购)", - ) in browser.calls - assert ("select_first", ('select#fdSettype',), "付款") in browser.calls - assert ( - "fill_first", - ('textarea[name="extendDataFormInfo.value(fd_desc_info)"]',), - "按订单自动起草采购协议", - ) in browser.calls - assert ("select_xform", "extendDataFormInfo.value(fd_all_amount_type)", "合同标的金额") in browser.calls - assert ("fill_first", ('input[name="fdAccount"]',), "12000.50") in browser.calls - assert ("fill_first", ('input[name="fdSigndate"]',), "2026-08-11") in browser.calls - assert ("fill_first", ('input[name="fdEffedate"]',), "2026-08-11") in browser.calls - assert ("fill_first", ('input[name="fdEnddate"]',), "2026-12-31") in browser.calls - assert ("select_xform", "extendDataFormInfo.value(fd_is_major_contract)", "否") in browser.calls - assert ("select_xform", "extendDataFormInfo.value(fd_advance_amout)", "否") in browser.calls - assert ( - "fill_first", - ('input[name="extendDataFormInfo.value(fd_contract_year_text)"]',), - "2026", - ) in browser.calls - assert ("select_xform", "extendDataFormInfo.value(fd_paytype)", "电汇") in browser.calls - assert ( - "fill_first", - ('input[name="extendDataFormInfo.value(fd_pay_time_limit)"]',), - "30", - ) in browser.calls - assert ("select_xform", "extendDataFormInfo.value(fd_suconstatus)", "正式合同") in browser.calls - assert ("select_xform", "extendDataFormInfo.value(fd_3d1ce3953f1162)", "否") in browser.calls - - -def test_contract_flow_dry_run_skips_submit_but_still_reads_page_state(): - browser = FakeBrowser() - browser.read_values["customer_name"] = "重庆亿昊药业有限公司" - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - template_type="NON_FORMAT", - template_name="非格式--采购协议", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - submit_mode="dry_run", - goods_lines=[], - ) - - contract_no = run_contract_create_flow(browser, ctx) - - assert not [call for call in browser.calls if call[0] == "click_first" and "text=提交" in call[1]] - assert not [call for call in browser.calls if call[0] == "screenshot"] - assert contract_no == "" - - -def test_contract_flow_writes_text_accept_report_instead_of_requiring_screenshots(tmp_path, monkeypatch): - from rpa_yisaiqi.contract_flow_steps import _ACCEPT, accept_log_path - - monkeypatch.setenv("RPA_ACCEPT_LOG", str(tmp_path / "ACCEPT.txt")) - browser = FakeBrowser() - browser.read_values["customer_name"] = "重庆亿昊药业有限公司" - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - template_type="NON_FORMAT", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - submit_mode="dry_run", - goods_lines=[], - ) - - run_contract_create_flow(browser, ctx) - - text = accept_log_path("CONTRACT_CREATE").read_text(encoding="utf-8") - assert "ACCEPT SUMMARY" in text - assert "ACCEPT S03 ok" in text - assert "ACCEPT S06 ok" in text - assert "customerName=重庆亿昊药业有限公司" in text - assert "ACCEPT S12 ok" in text - assert all(line.ok for line in _ACCEPT.lines) - - -def test_read_contract_number_falls_back_to_my_contracts_list(): - from rpa_yisaiqi.contract_flow_steps import read_contract_number - - browser = FakeBrowser() - browser.read_values.pop("contract_number", None) - ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - contract_title="test1", - goods_lines=[], - ) - - contract_no = read_contract_number(browser, ctx) - - assert contract_no == "001132026081734940" - assert ("open_url", "http://contract-test.gzmpc.com:8080/") in browser.calls - assert ("click_first", ("text=我的合同",)) in browser.calls - assert ("click_first", ("text=我起草的",)) in browser.calls - assert ("click_first", ("text=申请时间",)) in browser.calls - - -def test_read_contract_number_goes_to_my_list_even_without_ctx_arg(): - from rpa_yisaiqi import _flow_state as state - from rpa_yisaiqi.contract_flow_steps import read_contract_number - - browser = FakeBrowser() - browser.read_values.pop("contract_number", None) - old_ctx = state.ctx - state.ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", - password="1", - supplier_name="重庆亿昊药业有限公司", - order_date="2026-08-11", - source_type="XYY", - customer_code="DW0100046361", - customer_name="重庆亿昊药业有限公司", - contract_title="test1", - goods_lines=[], - ) - try: - contract_no = read_contract_number(browser) - finally: - state.ctx = old_ctx - - assert contract_no == "001132026081734940" - assert ("click_first", ("text=我的合同",)) in browser.calls - assert ("click_first", ("text=申请时间",)) in browser.calls - - -def test_accept_check_fails_when_page_value_mismatches(): - from rpa_yisaiqi.contract_flow_steps import AcceptanceReport - from rpa_yisaiqi.runtime.errors import NodeError - - report = AcceptanceReport() - with pytest.raises(NodeError, match="ACCEPT S06 FAIL"): - report.check( - "S06", - "签约方", - [("customerName", "其他公司", "重庆亿昊药业有限公司")], - ) diff --git a/state_center/给Trae的开发交接.md b/state_center/给Trae的开发交接.md deleted file mode 100644 index 3b0f950..0000000 --- a/state_center/给Trae的开发交接.md +++ /dev/null @@ -1,110 +0,0 @@ -# 给 Trae 的开发交接说明 - -> 你(Trae)接手"采购主链RPA一期 · 状态中心"的后续开发。本文是你的入口,先读这份,再读下面点名的文件。写代码前把"硬规则"和"你不做什么"看完,别越界。 - -## 一、你要干什么(一句话) - -做**状态中心**:一个 Python(FastAPI)+ MySQL 的后台 + 配套网页。它负责"每一单跑到哪步、出错派给谁、存状态和证据、画步骤树状图给业务看"。它**自己不去点任何外部系统页面**——点页面是艺赛旗 RPA 的活,通过 HTTP 回调跟你交互。 - -## 二、先读这几个文件(按顺序) - -1. `资料/采购主链RPA一期需求文档_三方会审版.md` —— 业务规则(节点N01~N10、字段、异常)。 -2. `资料/采购主链RPA一期设计文档.md` —— 技术设计(表结构、状态机、接口契约、对码引擎)。 -3. `资料/采购主链RPA一期实施与验收规范.md` —— **每个节点的操作步骤 + 验收标准(代码+业务两栏)**,你做完对着这里勾。 -4. `state_center/README.md` —— 已有代码怎么起、怎么验。 - -## 三、技术栈(已定,别改) - -- 后台:Python 3 + FastAPI -- 库:MySQL 8(状态中心自己的库,建库脚本 `sql/schema.sql` 已给) -- 对码货品主数据:在 **Oracle**,只读直连查,**不要复制成本地表** -- OCR:本地 Python 服务(PaddleOCR),仅线下手工单用 -- 前端:Vue 或 React(待办页 + 步骤树状图 + 整单查询) -- RPA 下层:艺赛旗 iS-RPA(不是你做,你只跟它的 HTTP 回调对接) - -## 四、已经写好的(别重写,在这上面接着做) - -`state_center/` 里已有可跑的第1步骨架: - -| 文件 | 已实现 | 状态 | -| --- | --- | --- | -| `sql/schema.sql` | 8张表建库脚本 | 完成 | -| `app/config.py` | MySQL/Oracle 连接、Oracle表名列名占位 | 完成 | -| `app/db.py` | MySQL 访问(pymysql) | 完成 | -| `app/match_engine.py` | 对码引擎:两级命中+规格标准化+Oracle取数函数 | 完成,单测6/6过 | -| `app/main.py` | 建单 + start/complete/fail 三回调(含幂等/乱序拒绝)+ 合同审批等待 + 整单查询 | 骨架完成 | -| `tests/test_match_engine.py` | 对码单测 | 通过 | - -> 状态机流转已通(**13 节点 = 11 主 + 2 条件** 显式转移表、业务编号回写、回调幂等、乱序拒绝 409、合同审批等待态、M5质管缺失→FAILED_MANUAL、M5不自动保存),用假回调能把一个 job 从头走到尾。 -> -> 节点数口径:主链 11 步每单都走;`OCR_EXTRACT`(仅线下单)、`SOURCE_ADD`(仅缺货源)是条件节点,不满足自动跳过。代码 `NODE_ORDER` 列全 13 个,`TRANSITIONS` 定转移,`NODE_EXECUTOR` 标执行方(STATE_CENTER/RPA/HUMAN)。 - -## 五、你的任务清单(按顺序做,每步对着验收规范勾) - -### 任务1:把骨架在真 MySQL 上跑通 -- 建库、起服务,按 README 的 curl 把一个 job 用假回调走完主链(线上单会自动跳过 OCR_EXTRACT/SOURCE_ADD 条件节点)。 -- 验收:`GET /api/jobs/{id}` 能看到完整节点轨迹和状态。 - -### 任务2:对码接口 + Oracle 真连 -- 拿到 Oracle 连接串/表名列名后,填 `config.py`,`pip install oracledb`。 -- **骨架已写好**(`main.py`),你主要是接真数据、补前置: - - `POST /api/match/reload-goods`:开工从 Oracle 全量拉货品主数据装进内存引擎(依赖 ORACLE_* 配置)。 - - `POST /api/jobs/{id}/match/run`:对该 job 的 `order_item` 跑对码 → 落 `product_match`;MULTI/NONE 建 `user_task` 转 WAITING_USER,全命中推进下一节点。**前置:`order_item` 要先落库**(建单/ORDER_FETCH 后把明细写进来),否则 run 会 400。 - - `POST /api/match/{matchId}/confirm`:人工确认一条,回写 product_match + 沉淀 `mapping_config` 累积别名(下次自动 ALIAS 命中),全部解决后自动推进。 -- 已补齐的关键边界: - - 对码重跑幂等:`product_match(job_id,order_item_id)` 当前态唯一,`match/run` upsert 结果并重建 OPEN 待办。 - - 货源判定:`goods_id` 明确后,按历史 `supplier_name + goods_id` 判断是否已有货源;缺货源会写 `product_match.source_add_needed/job.needs_source_add` 并创建 `SOURCE_ADD` 聚合待办。 - - alias 沉淀:同一 `config_key` 先失效旧 active,再插新 active;装载时按固定顺序取当前结果。 -- 你要补的:① 订单明细落 `order_item` 的入口;② `GET /api/jobs/{id}/match/unmatched`(列未命中给前端);③ H5 待办提交入口(把 `SOURCE_ADD` 完成动作接到 `nodes/SOURCE_ADD/complete`)。 -- **只写 mapping_config 累积别名,绝不回写 Oracle 主数据**(主数据只读)。 -- 验收:喂真实订单,命中率有数字,未命中进待办,确认后能自动往下走。 - -### 任务3:待办 + 人工提交 -- `GET /api/tasks/my?roleCode=&status=open`、`POST /api/tasks/{id}/submit`。 -- 动作:SELECT_CANDIDATE(对码选候选)/CONFIRM_AND_CONTINUE/RETRY_CURRENT_NODE/TRANSFER_MANUAL/TERMINATE_JOB。 -- 幂等:task_id + submit_token 防重复提交。 - -### 任务4:前端网页 -- 步骤树状图(样式见实施规范第三部分)、待办页、整单查询页。 -- 验收:业务打开能看到每单跑到哪、卡在哪、去处理按钮跳待办。 - -### 任务5:证据 + 事件流 + 企业微信 -- 证据落盘(job_artifact),事件流已有基础(job_event)。 -- 企业微信推待办、H5 身份换 JWT。 - -### 任务6:调度与重试 -- 定时触发建单(跑前一天订单)、系统类错误自动重试1-2次、CONTRACT_APPROVE_WAIT 轮询(别死等)、超时升级。 - -## 六、硬规则(红线,违反就是错的) - -1. **对码表在 Oracle,只读,绝不复制成本地表、绝不回写 Oracle**。累积别名写自己的 mapping_config。 -2. **M5 质管资料缺失(errorCode=M5_QC_MISSING)→ 不重试、不等质管,直接 FAILED_MANUAL 转人工**。已在 main.py 实现,别改成重试。 -3. **M5 一期不自动保存/签订**(auto_save_enabled 默认0),做成开关,阶段二才放开。别默认自动。 -4. **关键送审在返利中心(REBATE_SUBMIT),不是合同系统**。不送审 M5 带不出协议,是硬阻断。 -5. **签约日期 = 订单日期**(不是今天),合同建单时按订单日期填。 -6. **医药城同供应商同日合同合并成一个PDF**再上传(传第二份会覆盖),小药药不上传。 -7. **返利细单备注必填订单号、特定补偿必填0**。 -8. **对码未命中/返利重复编码 = 单条挂起,整批继续**;不是停整批。 -9. **所有写接口必须鉴权**;RPA 回调校验 X-Agent-Token + 幂等键,禁止无认证暴露。 -10. 节点失败不覆盖历史,attempt_no+1 新建 job_node 行。 - -## 七、你不做什么(边界) - -- **不写点外部系统页面的代码**(登录/导Excel/建合同/M5录入)——那是艺赛旗,你只收它的 HTTP 回调。 -- 不做招财平台(一期不纳入)。 -- 不做加单/拆单全自动重做(先记录父订单号,转人工)。 -- 不做返利重复编码全自动重建(规则未定,先转人工)。 -- 遇到文档里标 `【待确认】` 的(订单状态过滤、OCR部署方式等),别自己拍板,先留 TODO 问项目负责人。 - -## 八、回调契约(艺赛旗会这样调你,已实现) - -``` -POST /api/jobs/{jobId}/nodes/{nodeCode}/start header: X-Agent-Token -POST /api/jobs/{jobId}/nodes/{nodeCode}/complete 带 businessRefs/summary -POST /api/jobs/{jobId}/nodes/{nodeCode}/fail 带 errorCode/retryable/routeRole -``` -字段细节看 `设计文档` 第六部分和 `main.py` 里的 Pydantic 模型。 - -## 九、验收总纲 - -每做完一个节点/接口,打开 `实施与验收规范` 第四部分,对着该节点的**代码验收**(你自检)和**业务验收**(交业务勾)两栏逐条过。全绿才算完。 diff --git a/state_center/给艺赛旗的开发交接.md b/state_center/给艺赛旗的开发交接.md deleted file mode 100644 index af3948a..0000000 --- a/state_center/给艺赛旗的开发交接.md +++ /dev/null @@ -1,197 +0,0 @@ -# 给艺赛旗(iS-RPA)的开发交接说明 - -> 你(艺赛旗开发)负责"采购主链RPA一期"里**点外部系统页面**的活:登录、导订单、建合同、返利中心操作、M5 录单。每做完一步,用 HTTP 回调告诉"状态中心"结果。状态中心是大脑(记每单跑到哪、派活、存证据),你是手脚(照它给的顺序点页面)。你俩**只通过 HTTP JSON 回调对接,不共享数据库**。 - -## 一、你要干什么(一句话) - -按状态中心下发的 job(一个供应商+一个订单日期=一条合同),在各外部系统页面上完成对应节点的操作,每个节点用三个回调(start / complete / fail)把状态回传。 - -## 二、你和状态中心怎么对接(核心) - -``` -状态中心(Python/FastAPI) 艺赛旗 iS-RPA - 记状态/派活/存证据 <--HTTP--> 点页面/填表/上传 - | | - | 1) 你开始一个节点: POST .../start | - | 2) 点完页面成功: POST .../complete | - | 3) 出错: POST .../fail | -``` - -- **状态中心不会调用你**(一期没有反向下发);是**你主动调它**三个回调。 -- 每次调用**必须带 header `X-Agent-Token`**(默认 `dev-agent-token`,上线换正式值,找状态中心开发要)。 -- 节点顺序由状态中心维护,你 complete 后它自己算下一个节点是谁并返回 `next_node`,你**照着它返回的 next_node 跑下一步**,不要自己写死顺序。 - -## 三、三个回调契约(照抄字段,别改名) - -基础地址:`http://<状态中心地址>:8000`(联调时给你实际 IP)。所有回调 header 带 `X-Agent-Token: `、`Content-Type: application/json`。 - -### 3.1 节点开始 start - -``` -POST /api/jobs/{jobId}/nodes/{nodeCode}/start -{ - "attemptNo": 1, // 第几次尝试,重试就 +1 - "executorPlatform": "iS-RPA", // 可选,标记是哪个RPA平台跑的 - "operator": "agent" // 可选 -} -``` -返回 `{"ok": true}`。**开始点页面前先调一次**,让状态中心把该节点标 RUNNING。 - -### 3.2 节点成功 complete - -``` -POST /api/jobs/{jobId}/nodes/{nodeCode}/complete -{ - "attemptNo": 1, - "executorRunId": "YD-RUN-001", // 可选,你这边的流程运行号,便于回查 - "businessRefs": { // 业务编号回写(见下表,产出编号的节点必传) - "contractSystemNo": "HT2026..." - }, - "summary": { "orderCount": 12 } // 可选,给业务看的摘要 -} -``` -返回 `{"ok": true, "next_node": "OCR_EXTRACT"}`。**拿到 next_node 跑下一节点**;`next_node=null` 表示整单跑完。 - -### 3.3 节点失败 fail - -``` -POST /api/jobs/{jobId}/nodes/{nodeCode}/fail -{ - "attemptNo": 1, - "errorCode": "SYS_LOGIN_FAIL", // 错误码,见第五节各节点表,照抄 - "errorSummary": "验证码识别失败", // 人能看懂的一句话 - "retryable": true, // 系统类错误填 true(状态中心可安排重试);业务类填 false - "routeRole": "OPS" // 转给谁:OPS(运维)/PLANNER(计划员)/PURCHASE(采购) -} -``` -返回 `{"ok": true, "job_status": "..."}`。 - -**状态中心对 fail 的处理逻辑(你要知道,免得填错)**: -- `errorCode == "M5_QC_MISSING"` → 无条件 `FAILED_MANUAL`(转人工手工做,**不重试、不等质管**),`retryable` 填什么都没用。 -- 否则 `retryable=true` → `FAILED_RETRYABLE`(系统类,等重试)。 -- 否则 → `WAITING_USER`(业务类,进人工待办,按 `routeRole` 派人)。 - -> 判断原则:**系统能自愈的填 retryable=true**(登录超时、页面卡顿);**要人来决定的填 false**(对码要选、合同被禁、返利重复编码)。 - -## 四、businessRefs 业务编号回写(三把钥匙 + 收货单) - -有三个节点**必须**在 complete 时回传对应编号,否则状态中心返回 400 拒绝记成功: - -| 节点 nodeCode | 必传字段 | 是什么 | -| --- | --- | --- | -| CONTRACT_CREATE | `contractSystemNo` | 🔑合同编号(后续返利、M5 靠它串) | -| REBATE_HEADER | `rebateOrderNo` | 返利中心总单号 | -| M5_RECEIPT_NOTICE | `receiptNoticeNo` | 收货通知单号(全链终点) | - -其余节点若产出编号也可回传(如 M5 单号 `m5OrderNo`),状态中心会落库。字段名**照抄**,大小写别改。 - -## 五、逐节点你要做什么(页面操作 + 回调) - -> 完整版看 `资料/采购主链RPA一期实施与验收规范.md` 第四部分,每节点都有"页面操作步骤 + 代码验收 + 业务验收 + 失败去向"。这里给精简对照,让你知道每步调哪个回调、错误码填什么。 - -节点编排一共 **13 个 = 11 主节点 + 2 条件节点**(状态中心的 NODE_ORDER): -`ORDER_FETCH → OCR_EXTRACT → PRODUCT_MATCH → SOURCE_ADD → CONTRACT_CREATE → CONTRACT_APPROVE_WAIT → REBATE_HEADER → REBATE_IMPORT → REBATE_SUBMIT → M5_CREATE_ORDER → M5_MANUAL_CONFIRM → M5_RECEIPT_NOTICE → ARCHIVE_JOB` - -- **2 个条件节点会被自动跳过**(你收不到 next_node 就是被跳了,别当 bug): - - `OCR_EXTRACT`:只有线下手工单才走,线上单(医药城/小药药)自动跳过。 - - `SOURCE_ADD`:只有对码判定缺货源才走,货源齐全自动跳过。 -- **不是你点页面的节点**:`PRODUCT_MATCH`(对码=状态中心内部算)、`SOURCE_ADD`/`M5_MANUAL_CONFIRM`/`M5_RECEIPT_NOTICE`(一期人工)、`ARCHIVE_JOB`(状态中心归档)。 -- 你负责的是下面标"★你的活"的节点。**顺序永远听 complete 返回的 next_node**,别自己写死(条件节点跳过就是状态中心帮你算好的)。 - -> 状态中心对回调做了**幂等 + 乱序拒绝**: -> - 同一节点同 attemptNo 重复 complete,不会二次推进(会返回上次的 next_node,带 `"idempotent": true`),网络重发放心。 -> - 回调的节点若不是该 job 的当前节点,返回 **409**(乱序被拒)。别跳着节点调,照 next_node 走。 -> - complete 可带 `idempotencyKey`(你生成的唯一串),便于状态中心去重。 - -### ① ORDER_FETCH · 订单获取 ★你的活 - -页面(医药城 / 小药药):登录 → 我的订单 → 选日期(默认前一天)→【待确认:按订单状态过滤】→ 导出订单明细 Excel → 存证据目录 + 截图。 -- complete:`summary` 带 `orderCount / supplierList / orderNoList`,`businessRefs` 无。 -- 当天无订单:正常结束(不算失败)。 -- fail 错误码:登录失败 `SYS_LOGIN_FAIL`(retryable=true, OPS)、页面超时 `SYS_PAGE_TIMEOUT`(true, OPS)、导出按钮改版找不到 `UI_ELEMENT_NOT_FOUND`(false, OPS)。 - -### ①b OCR_EXTRACT · 线下手工单识别(仅线下单) - -不是你主导。线上订单直接跳过此节点(complete 空过)。线下单由 OCR 服务识别,你只负责取件/触发。 -- fail:图片模糊 `BIZ_OCR_LOW_CONF`(false, PLANNER)、OCR服务挂 `SYS_OCR_DOWN`(true, OPS)。 - -### ③ CONTRACT_CREATE · 合同建单 ★你的活 - -页面(合同系统 `contract.gzmpc.com`):登录 → 按供应商对照表判断模板(格式/非格式承兑)→ 可复制历史合同再改 → 填基础信息,**签约日期/合同开始日期 = 订单日期(硬约束,不是今天)** → 填货品明细 → 填付款信息 → 提交送审。 -- **医药城分支**:下载平台购销合同,**同供应商同日合并成一个PDF**再上传(先合并!传第二份会覆盖第一份)。 -- **小药药分支**:格式合同,**跳过合同证文上传**。 -- complete:**必传 `businessRefs.contractSystemNo`(合同编号)**。 -- fail 错误码:供应商合同被禁/失效 `BIZ_CONTRACT_DISABLED`(false, PURCHASE)、PDF合并不支持 `CAP_PDF_MERGE_UNSUPPORTED`(false, OPS)、页面改版 `UI_ELEMENT_NOT_FOUND`(false, OPS)。 - -### ④ CONTRACT_APPROVE_WAIT · 等合同审批 ★你的活(定时查一次,不连续轮询) - -合同送审(CONTRACT_CREATE complete)后,状态中心把该 job 挂成 `WAITING_EXTERNAL`,并按业务方案每约半小时排一次查。**这个节点不用 start/complete/fail 三件套**,用下面两个专用接口: - -1. **到点扫待查**:你(或调度器)定时 `GET /api/scheduler/due-contract-checks`(带 X-Agent-Token),拿到到点该查的 job 列表(含 `contractSystemNo`)。 -2. **登录查一次审批状态**,把结果回给状态中心: - ``` - POST /api/jobs/{jobId}/nodes/CONTRACT_APPROVE_WAIT/check-result - { "approved": true, "operator": "agent", "detail": "已审批通过" } - ``` - - `approved=true` → 状态中心放行,返回 `{"ok":true,"next_node":"REBATE_HEADER"}`,你接着跑返利。 - - `approved=false` → 状态中心把 `wait_check_count+1`,排下一次查(约半小时后又出现在待查列表);查满上限(默认 8 次≈4 小时)还没过 → 自动升级 OPS(`WAITING_USER`),你不用管了。 -- **别死等、别连续轮询**:只在到点被扫到时查一次。 -- 注意:未审完也会有合同编号,但**必须审批通过才能进返利导入**。 - -### ⑤ REBATE_HEADER · 返利中心总单 ★你的活 - -页面(返利中心 `flgzmpc.com`):登录 → 采购协议管理 → **按合同编号查总单** → 填必填项、勾必选项 → 保存。 -- complete:**必传 `businessRefs.rebateOrderNo`(总单号)**。 -- fail:查不到总单/必填缺失 → OPS 或 PURCHASE 核查。 - -### ⑥ REBATE_IMPORT · 返利细单导入 ★你的活 - -页面:下载细单模板 → 填字段(操作码/货品编码、数量、单价、税率、承付方式、细单开始时间=订单时间、失效日期、结算方式、**特定补偿=0**、**细单备注=订单号**、货源信息)→ 上传导入 → 读成功/失败行。 -- complete:`summary` 带成功/失败计数与明细。 -- fail:重复编码(订单已做过)`REBATE_DUP_CODE`(false, PURCHASE)→ **该单挂起,整批继续**(重建规则待确认,先转人工)。 - -### ⑦ REBATE_SUBMIT · 返利送审 ⭐决定成败⭐ ★你的活 - -页面:在返利中心对该总单点"提交送审"(送审即自动审批通过,合同前端已审过)。 -- **反直觉核心:卡 M5 能不能带出品种的送审在返利中心,不在合同系统。这步不做,后面全废。** -- **未送审 = 硬阻断**,整个 job 停在这。不许跳过进 M5。 - -### ⑧ M5_CREATE_ORDER · M5 建采购单(1055)★你的活(M5 是桌面客户端) - -M5 是**桌面应用**(不是网页),用桌面自动化处理。步骤:采购订单管理 1055 → 新增 → 保管账=正常保管账(默认唯一)→ 隔天做则日期改前一天签约日期 → **备注填订单号** → 新增细单选品种(返利已送审的才带得出)→ 选对应数量 → 结算/接收/发票用返利带入值(**不填**)→ **★录完就停,绝不点保存★**。 -- complete:标记"M5待保存"(可回传 `m5OrderNo`)。 -- fail:质管资料缺失 `M5_QC_MISSING`(**填什么状态中心都转 FAILED_MANUAL,不重试不等质管,转人工手工做**)。 - -### ⑨⑩ M5_MANUAL_CONFIRM / M5_RECEIPT_NOTICE · 一期人工 - -一期这两步**人工做**(检查→保存→签订→生成收货通知单)。你不点。阶段二 `auto_save_enabled` 放开后才可能给你。 - -## 六、硬规则(红线,踩了就是错) - -1. **签约日期 = 订单日期**,不是今天。合同建单、M5 日期都按订单日期。 -2. **医药城同供应商同日合同合并成一个PDF再上传**(传第二份会覆盖);**小药药不上传合同证文**。 -3. **关键送审在返利中心(REBATE_SUBMIT)**,不是合同系统。不送审 M5 带不出协议,硬阻断。 -4. **M5 录完不点保存**(一期人工把关保存/签订)。auto_save_enabled 一期=0。 -5. **M5 质管缺失(M5_QC_MISSING)不重试、不等质管**,直接转人工。RPA 晚上跑,质管不会半夜维护。 -6. **返利细单:特定补偿=0、细单备注=订单号**(物流/结算要看)。细单开始时间=订单时间。 -7. **对码未命中/返利重复编码 = 单条挂起,整批继续**,不是停整批。 -8. **产出编号的三个节点(合同/返利总单/收货通知)complete 必传对应 businessRefs**,否则被 400 拒。 -9. **每个回调必须带 X-Agent-Token**;别把状态中心接口无认证暴露。 -10. **节点顺序听状态中心的**(照 complete 返回的 next_node 走),别自己写死。 - -## 七、你不做什么(边界) - -- **不碰状态存储/对码算法/前端页面**——那是状态中心(Trae)的活。你只点外部系统页面 + 回调。 -- **不做对码判断**——对码是状态中心内部算,MULTI/NONE 会进人工待办,不经过你。 -- **不做 M5 保存/签订/收货通知**(一期人工)。 -- **不做招财平台**(一期不纳入)。 -- 遇到文档标 `【待确认】` 的(订单状态过滤、返利重复编码重建、OCR部署方式),**别自己拍板**,留 TODO 问项目负责人。 - -## 八、联调建议顺序 - -1. 先跟状态中心开发对齐:实际 IP、正式 `X-Agent-Token`、证据目录路径。 -2. 拿一个测试供应商 + 一天的测试订单,先只跑 ORDER_FETCH:start → 导出 → complete,在状态中心 `GET /api/jobs/{id}` 看到轨迹即通。 -3. 再一节点一节点往后接,每接一个对照 `实施与验收规范` 第四部分的"业务验收"栏勾。 -4. 合同、返利、M5 三段分别单独联调通过后,再跑整链。 - - diff --git a/state_center_web/LAYOUT_PROPOSAL.md b/state_center_web/LAYOUT_PROPOSAL.md deleted file mode 100644 index 545b953..0000000 --- a/state_center_web/LAYOUT_PROPOSAL.md +++ /dev/null @@ -1,207 +0,0 @@ -# 状态中心页面 - 可调整版式方案 - -## 设计原则 - -1. **现在(联调阶段)**:全部展开,方便你看数据流转、验证接口。 -2. **后期(交付阶段)**:一键折叠技术细节,业务只看待办 + 简化流程图。 -3. **实现方式**:每个区域带展开/收起按钮 + 顶部"调试模式"开关,展开状态存 localStorage。 - ---- - -## 版式结构 - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ 顶栏 │ -│ [状态中心] [调试模式: ●开 ○关] 角色:采购 待办状态:待处理 │ -│ [令牌: ****] [刷新] │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 待办队列 (始终可见) [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ ┌────────────┬────────────┬──────────────────────────────────┐ │ -│ │ □ 新增货源 │ 对码待确认 │ M5人工确认 │ │ -│ │ 重庆亿昊 │ 阿卡波糖 │ 华润医药 │ │ -│ │ 10:00 │ 09:30 │ 昨天 │ │ -│ └────────────┴────────────┴──────────────────────────────────┘ │ -│ │ -│ 当前选中待办:新增货源 - 重庆亿昊药业 │ -│ ┌────────────────────────────────────────────────────────────┐ │ -│ │ 原因:该供应商未维护这些品种的货源 │ │ -│ │ [选择候选货品: ▼ 阿卡波糖片 50mg*30片] │ │ -│ │ [☑ 保存为下次自动匹配规则] │ │ -│ │ [确认并继续] [转派] [终止] │ │ -│ └────────────────────────────────────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 所属单据概览 [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ 单号: YYC-重庆亿昊药业-20260804-demo 状态: 等待人工 │ -│ 当前节点: 新增货源 责任角色: 采购 │ -│ 订单日期: 2026-08-04 供应商: 重庆亿昊药业 │ -│ │ -│ 业务编号链: │ -│ 订单 DD-001,DD-002 → 合同 HT-xxx → 返利 - (待填) → M5 - → 收货 - │ -│ │ -│ [查看完整详情 ↗] │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 流程状态图 [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ [订单获取✓] [OCR⊘] [对码✓] [新增货源●] [合同建单○] ... [归档○] │ -│ │ -│ 图例: ✓已完成 ●当前 ⊘已跳过 ○待处理 ✗失败 │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 调试:节点详情 (调试模式开启时显示) [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ 已执行节点: │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ ORDER_FETCH [尝试1] 成功 09:40-09:42 (2分钟) │ │ -│ │ 摘要: {orderCount: 12} │ │ -│ │ 证据: orders.xlsx (SOURCE_EXCEL) │ │ -│ ├──────────────────────────────────────────────────────────┤ │ -│ │ PRODUCT_MATCH [尝试1] 成功 09:50-09:51 (1分钟) │ │ -│ │ 摘要: {EXACT:10, ALIAS:1, MULTI:1} │ │ -│ │ 证据: 无 │ │ -│ ├──────────────────────────────────────────────────────────┤ │ -│ │ SOURCE_ADD [尝试1] 等待人工 10:00- │ │ -│ │ 证据: 无 │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 调试:证据包 (调试模式开启时显示) [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ ORDER_FETCH尝试1: │ -│ └─ SOURCE_EXCEL: /data/jobs/.../orders.xlsx (09:42) │ -│ CONTRACT_CREATE尝试1: │ -│ └─ CONTRACT_PDF: /data/jobs/.../contract.pdf (10:06) │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 调试:单据列表 (调试模式开启时显示) [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ [全部] [执行中] [等待人工] [已完成] [失败] │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 重庆亿昊药业 2026-08-04 YYC 等待人工 新增货源 采购 │ │ -│ │ 华润医药 2026-08-03 线下 执行中 对码 计划员 │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - -┌──────────────────────────────────────────────────────────────────┐ -│ ▼ 开发:节点回调模拟 (仅 DEV 环境显示) [收起/展开]│ -├──────────────────────────────────────────────────────────────────┤ -│ 当前节点: 新增货源 │ -│ [参数 JSON: ] │ -│ [开始] [成功] [失败] │ -└──────────────────────────────────────────────────────────────────┘ -``` - ---- - -## 分区说明 - -### 1. 待办队列 (始终可见,不可收起) -- **用途**:主工作流,无论联调还是生产都需要。 -- **内容**:待办卡片 + 当前待办处理表单。 - -### 2. 所属单据概览 (默认展开,可收起) -- **用途**:提供当前待办的上下文(哪个供应商、哪天的单、跑到哪了)。 -- **后期**:业务只看这个 + 待办队列就够了。 - -### 3. 流程状态图 (默认展开,可收起) -- **用途**:直观看 13 个节点的完成情况。 -- **后期**:保留,但可以简化成 mini 版(只显示名称 + 状态点)。 - -### 4. 调试:节点详情 (调试模式开启时显示) -- **用途**:验证每个节点的 started_at/ended_at/duration/output_json/error。 -- **后期**:关掉,业务不需要看技术细节。 - -### 5. 调试:证据包 (调试模式开启时显示) -- **用途**:验证 RPA 回调上传的证据是否落库、路径对不对。 -- **后期**:关掉或改成"证据总数"摘要。 - -### 6. 调试:单据列表 (调试模式开启时显示) -- **用途**:你在联调时快速切换不同单据验证状态流转。 -- **后期**:关掉或改成独立页面(管理员监控用)。 - -### 7. 开发:节点回调模拟 (仅 DEV 环境显示) -- **用途**:本地联调时模拟艺赛旗回调。 -- **后期**:生产环境 `import.meta.env.DEV=false` 自动隐藏。 - ---- - -## 技术实现 - -### 1. 展开/收起状态存储 -```typescript -// localStorage 存每个区域的展开状态 -const sectionStates = { - jobSummary: true, // 所属单据概览 - timeline: true, // 流程状态图 - nodeDetails: false, // 节点详情(调试模式控制) - evidence: false, // 证据包(调试模式控制) - jobList: false, // 单据列表(调试模式控制) -}; -localStorage.setItem('sectionStates', JSON.stringify(sectionStates)); -``` - -### 2. 调试模式开关 -```typescript -const [debugMode, setDebugMode] = useState( - localStorage.getItem('debugMode') === 'true' -); - -// 顶栏开关:切换时同步存储,并控制"调试:"前缀的区域显隐 -function toggleDebugMode() { - const next = !debugMode; - setDebugMode(next); - localStorage.setItem('debugMode', String(next)); -} -``` - -### 3. 可收起组件封装 -```typescript - - {/* 单据详情内容 */} - - - - {/* 节点列表 */} - -``` - ---- - -## 后期交付时的调整 - -你只需要: -1. **关闭调试模式**:顶栏开关点"关",所有"调试:"区域自动隐藏。 -2. **可选:收起流程图**:如果业务觉得太占屏幕,点收起按钮即可。 -3. **最终业务看到的**:待办队列 + 所属单据概览(可能 + 简化流程图),干净清爽。 - ---- - -## 你确认一下 - -这个方案是否满足你"现在全看、后期可关"的需求?如果可以,我直接动手: -1. 先封装 `CollapsibleSection` 组件。 -2. 把现有页面按上述分区重组。 -3. 加调试模式开关 + localStorage 持久化。 -4. 调整样式,让收起状态下不占垂直空间。 - -或者你对分区划分 / 默认展开状态有别的想法,直接说,我再调整。 diff --git a/state_center_web/README.md b/state_center_web/README.md deleted file mode 100644 index 3fdbc90..0000000 --- a/state_center_web/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# 状态中心 Web 版 - -## 一键启动联调环境 - -在项目根目录执行: - -macOS/Linux: - -```bash -./.venv_test/bin/python scripts/dev.py start -``` - -Windows PowerShell: - -```powershell -.\.venv_test\Scripts\python.exe scripts\dev.py start -``` - -启动器会复用或创建 Docker MySQL 容器 `rpa-center-mysql`,然后启动 FastAPI 和 Vite。 - -```bash -python scripts/dev.py status -python scripts/dev.py stop -``` - -`status` 只有在 MySQL 端口、FastAPI `/health`(包含数据库探测)和 Vite 端口都正常时才返回成功。 - -## 手动启动 - -```bash -cd state_center_web -npm install -npm run dev -``` - -默认地址:`http://localhost:5173` - -后端另开一个终端: - -macOS/Linux: - -```bash -python -m pip install -r state_center/requirements.txt -DEV_MODE=true python -m uvicorn state_center.app.main:app --reload --port 8000 -``` - -Windows PowerShell: - -```powershell -$env:DEV_MODE = "true" -python -m pip install -r state_center\requirements.txt -python -m uvicorn state_center.app.main:app --reload --port 8000 -``` - -浏览器访问:`http://localhost:5173/`。同一套页面适用于 Windows 和 macOS;前端不会自行推导流程下一节点,所有节点状态都来自 FastAPI。 - -## 说明 - -- 页面全中文。 -- 后端可连时,直接读 `state_center` 的 FastAPI 接口。 -- 后端没起时,页面自动切到本地演示数据,仍可看到单据列表、流程状态图和待办面板。 -- 页面顶部会明确显示“本地演示数据”或“后端已连接”。 -- 对码待办可直接选择候选货品;人工节点按节点显示对应动作。 -- 节点回调模拟区只在开发环境构建中显示。 -- 开发令牌只保存在浏览器会话里,不会写进代码。 diff --git a/state_center_web/index.html b/state_center_web/index.html deleted file mode 100644 index 0308ff3..0000000 --- a/state_center_web/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - 状态中心 - - -
- - - diff --git a/state_center_web/package-lock.json b/state_center_web/package-lock.json deleted file mode 100644 index 5dabd8a..0000000 --- a/state_center_web/package-lock.json +++ /dev/null @@ -1,1750 +0,0 @@ -{ - "name": "state-center-web", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "state-center-web", - "version": "0.1.0", - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@types/react": "^18.3.5", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.1", - "typescript": "^5.6.3", - "vite": "^5.4.8" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", - "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", - "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", - "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", - "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", - "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", - "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", - "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", - "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", - "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", - "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", - "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", - "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", - "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", - "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", - "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", - "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", - "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", - "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", - "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", - "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", - "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", - "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", - "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", - "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", - "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", - "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.403", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.403.tgz", - "integrity": "sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==", - "dev": true, - "license": "ISC" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", - "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.62.4", - "@rollup/rollup-android-arm64": "4.62.4", - "@rollup/rollup-darwin-arm64": "4.62.4", - "@rollup/rollup-darwin-x64": "4.62.4", - "@rollup/rollup-freebsd-arm64": "4.62.4", - "@rollup/rollup-freebsd-x64": "4.62.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", - "@rollup/rollup-linux-arm-musleabihf": "4.62.4", - "@rollup/rollup-linux-arm64-gnu": "4.62.4", - "@rollup/rollup-linux-arm64-musl": "4.62.4", - "@rollup/rollup-linux-loong64-gnu": "4.62.4", - "@rollup/rollup-linux-loong64-musl": "4.62.4", - "@rollup/rollup-linux-ppc64-gnu": "4.62.4", - "@rollup/rollup-linux-ppc64-musl": "4.62.4", - "@rollup/rollup-linux-riscv64-gnu": "4.62.4", - "@rollup/rollup-linux-riscv64-musl": "4.62.4", - "@rollup/rollup-linux-s390x-gnu": "4.62.4", - "@rollup/rollup-linux-x64-gnu": "4.62.4", - "@rollup/rollup-linux-x64-musl": "4.62.4", - "@rollup/rollup-openbsd-x64": "4.62.4", - "@rollup/rollup-openharmony-arm64": "4.62.4", - "@rollup/rollup-win32-arm64-msvc": "4.62.4", - "@rollup/rollup-win32-ia32-msvc": "4.62.4", - "@rollup/rollup-win32-x64-gnu": "4.62.4", - "@rollup/rollup-win32-x64-msvc": "4.62.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz", - "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - } - } -} diff --git a/state_center_web/package.json b/state_center_web/package.json deleted file mode 100644 index c79b1c6..0000000 --- a/state_center_web/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "state-center-web", - "private": true, - "version": "0.1.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "check": "tsc --noEmit", - "test": "node --test --experimental-strip-types src/*.test.mjs" - }, - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@types/react": "^18.3.5", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.1", - "typescript": "^5.6.3", - "vite": "^5.4.8" - } -} diff --git a/state_center_web/src/App.tsx b/state_center_web/src/App.tsx deleted file mode 100644 index 6aae693..0000000 --- a/state_center_web/src/App.tsx +++ /dev/null @@ -1,1136 +0,0 @@ -import { useEffect, useMemo, useState } from 'react'; -import { requestJson, sessionTokenStore } from './api/client'; -import { JobAcceptanceChecklist } from './components/JobAcceptanceChecklist'; -import { JobList } from './components/JobList'; -import { JobEvidenceList } from './components/JobEvidenceList'; -import { JobNodeDetailList } from './components/JobNodeDetailList'; -import { JobTimeline } from './components/JobTimeline'; -import { TaskList } from './components/TaskList'; -import { ToolbarSelect } from './components/ToolbarSelect'; -import { - type JobArtifactRow, - type JobNodeRow, - buildNodeCallbackRequestBody, - actionLabel, - allowedTaskActions, - buildBusinessOverview, - buildNodeDetails, - formatNodeCallbackTemplate, - nodeLabel, - nodeCallbackActionLabel, - reasonLabel, - roleLabel, - jobStatusBucketLabel, - jobStatusBucketMatches, - jobMatchesQuery, - type JobStatusBucket, - type NodeCallbackKind, - taskCandidates, - taskStatusLabel, - type JobRow, - type StateMachineMeta, - type TaskRow, - type TimelineNode, -} from './stateMachine'; - -type JobDetail = { - job: JobRow; - artifacts: JobArtifactRow[]; - nodes: JobNodeRow[]; - tasks: TaskRow[]; -}; - -type TaskSubmitResponse = { - ok: boolean; - next_node?: string | null; - job_status?: string | null; - idempotent?: boolean; -}; - -const devActionsEnabled = import.meta.env.DEV; -const jobBucketOptions: JobStatusBucket[] = ['ALL', 'ACTIVE', 'WAITING', 'FAILED', 'SUCCESS']; -const taskStatusOptions = ['OPEN', 'SUBMITTED'] as const; -const roleOptions = [ - { value: 'PURCHASER', label: '采购' }, - { value: 'PLANNER', label: '计划员' }, - { value: 'QC', label: '质管' }, - { value: 'OPS', label: '运维' }, -]; -const demoJobId = 'YYC-重庆亿昊药业-20260804-demo'; -const demoMeta: StateMachineMeta = { - node_order: [ - 'ORDER_FETCH', - 'OCR_EXTRACT', - 'PRODUCT_MATCH', - 'SOURCE_ADD', - 'CONTRACT_CREATE', - 'CONTRACT_APPROVE_WAIT', - 'REBATE_HEADER', - 'REBATE_IMPORT', - 'REBATE_SUBMIT', - 'M5_CREATE_ORDER', - 'M5_MANUAL_CONFIRM', - 'M5_RECEIPT_NOTICE', - 'ARCHIVE_JOB', - ], - transitions: {}, - conditional_nodes: ['OCR_EXTRACT', 'SOURCE_ADD'], - human_node_roles: { - SOURCE_ADD: 'PURCHASER', - M5_MANUAL_CONFIRM: 'PURCHASER', - M5_RECEIPT_NOTICE: 'PURCHASER', - }, - node_executor: { - ORDER_FETCH: 'RPA', - OCR_EXTRACT: 'RPA', - PRODUCT_MATCH: 'STATE_CENTER', - SOURCE_ADD: 'HUMAN', - CONTRACT_CREATE: 'RPA', - CONTRACT_APPROVE_WAIT: 'RPA', - REBATE_HEADER: 'RPA', - REBATE_IMPORT: 'RPA', - REBATE_SUBMIT: 'RPA', - M5_CREATE_ORDER: 'RPA', - M5_MANUAL_CONFIRM: 'HUMAN', - M5_RECEIPT_NOTICE: 'HUMAN', - ARCHIVE_JOB: 'STATE_CENTER', - }, - node_labels: { - ORDER_FETCH: '订单获取', - OCR_EXTRACT: 'OCR识别', - PRODUCT_MATCH: '对码', - SOURCE_ADD: '新增货源', - CONTRACT_CREATE: '合同建单', - CONTRACT_APPROVE_WAIT: '合同审批等待', - REBATE_HEADER: '返利总单', - REBATE_IMPORT: '返利细单导入', - REBATE_SUBMIT: '返利送审', - M5_CREATE_ORDER: 'M5建单', - M5_MANUAL_CONFIRM: 'M5人工确认', - M5_RECEIPT_NOTICE: '收货通知单', - ARCHIVE_JOB: '归档', - }, - executor_labels: { - STATE_CENTER: '状态中心', - RPA: '艺赛旗执行', - HUMAN: '人工处理', - }, - status_labels: { - PENDING: '待处理', - RUNNING: '执行中', - SUCCESS: '已完成', - FAILED: '已失败', - WAITING_USER: '等待人工', - WAITING_EXTERNAL: '等待外部', - SKIPPED: '已跳过', - }, -}; -const demoJobs: JobRow[] = [ - { - job_id: demoJobId, - supplier_name: '重庆亿昊药业', - order_date: '2026-08-04', - source_type: 'YYC', - status: 'WAITING_USER', - current_node_code: 'SOURCE_ADD', - current_role: 'PURCHASER', - created_at: '2026-08-10 09:40:00', - updated_at: '2026-08-10 10:06:00', - }, - { - job_id: 'OFFLINE-华润医药-20260803-demo', - supplier_name: '华润医药', - order_date: '2026-08-03', - source_type: 'OFFLINE', - status: 'RUNNING', - current_node_code: 'PRODUCT_MATCH', - current_role: 'PLANNER', - created_at: '2026-08-10 08:20:00', - updated_at: '2026-08-10 08:45:00', - }, -]; -const demoTimeline: TimelineNode[] = [ - { node_code: 'ORDER_FETCH', display_status: 'SUCCESS', attempt_no: 1, status: 'SUCCESS' }, - { node_code: 'OCR_EXTRACT', display_status: 'SKIPPED' }, - { node_code: 'PRODUCT_MATCH', display_status: 'SUCCESS', attempt_no: 1, status: 'SUCCESS' }, - { node_code: 'SOURCE_ADD', display_status: 'WAITING_USER', attempt_no: 1, status: 'WAITING_USER' }, - { node_code: 'CONTRACT_CREATE', display_status: 'PENDING' }, - { node_code: 'CONTRACT_APPROVE_WAIT', display_status: 'PENDING' }, - { node_code: 'REBATE_HEADER', display_status: 'PENDING' }, - { node_code: 'REBATE_IMPORT', display_status: 'PENDING' }, - { node_code: 'REBATE_SUBMIT', display_status: 'PENDING' }, - { node_code: 'M5_CREATE_ORDER', display_status: 'PENDING' }, - { node_code: 'M5_MANUAL_CONFIRM', display_status: 'PENDING' }, - { node_code: 'M5_RECEIPT_NOTICE', display_status: 'PENDING' }, - { node_code: 'ARCHIVE_JOB', display_status: 'PENDING' }, -]; -const demoTasks: TaskRow[] = [ - { - task_id: 'TASK-001', - job_id: demoJobId, - node_code: 'SOURCE_ADD', - role_code: 'PURCHASER', - status: 'OPEN', - title: '新增货源:重庆亿昊药业', - reason_type: 'SOURCE_ADD', - created_at: '2026-08-10 10:00:00', - }, - { - task_id: 'TASK-002', - job_id: 'OFFLINE-华润医药-20260803-demo', - node_code: 'PRODUCT_MATCH', - role_code: 'PLANNER', - status: 'OPEN', - title: '对码待确认:阿卡波糖片', - reason_type: 'MATCH_MULTI', - product_match_id: 7, - candidates_json: [ - { - goods_id: 'G-001', - goods_code: 'YP-001', - common_name: '阿卡波糖片', - spec: '50mg*30片', - base_unit: '盒', - manufacturer: '示例制药', - approval_no: '国药准字H00000001', - }, - { - goods_id: 'G-004', - goods_code: 'YP-004', - common_name: '阿卡波糖片', - spec: '50mg*60片', - base_unit: '盒', - manufacturer: '示例制药', - approval_no: '国药准字H00000004', - }, - ], - created_at: '2026-08-10 09:30:00', - }, -]; -const demoJobDetailMap: Record = { - [demoJobId]: { - job: demoJobs[0], - artifacts: [ - { - node_code: 'ORDER_FETCH', - attempt_no: 1, - artifact_type: 'SOURCE_EXCEL', - storage_path: '/data/jobs/YYC-重庆亿昊药业-20260804-demo/orders.xlsx', - file_hash: 'sha256:demo-order-excel', - visible_roles: ['PURCHASER', 'PLANNER'], - is_masked: false, - created_at: '2026-08-10 09:42:00', - }, - { - node_code: 'CONTRACT_CREATE', - attempt_no: 1, - artifact_type: 'CONTRACT_PDF', - storage_path: '/data/jobs/YYC-重庆亿昊药业-20260804-demo/contract.pdf', - file_hash: 'sha256:demo-contract-pdf', - visible_roles: ['PURCHASER'], - is_masked: false, - created_at: '2026-08-10 10:06:00', - }, - ], - nodes: [ - { node_code: 'ORDER_FETCH', attempt_no: 1, status: 'SUCCESS' }, - { node_code: 'PRODUCT_MATCH', attempt_no: 1, status: 'SUCCESS' }, - { node_code: 'SOURCE_ADD', attempt_no: 1, status: 'WAITING_USER' }, - ], - tasks: demoTasks, - }, - [demoJobs[1].job_id]: { - job: demoJobs[1], - artifacts: [], - nodes: [ - { node_code: 'ORDER_FETCH', attempt_no: 1, status: 'SUCCESS' }, - { node_code: 'OCR_EXTRACT', attempt_no: 1, status: 'SKIPPED' }, - { node_code: 'PRODUCT_MATCH', attempt_no: 1, status: 'RUNNING' }, - ], - tasks: [ - { - task_id: 'TASK-003', - job_id: demoJobs[1].job_id, - node_code: 'PRODUCT_MATCH', - role_code: 'PLANNER', - status: 'OPEN', - title: '对码待确认:阿卡波糖片', - reason_type: 'MATCH_MULTI', - product_match_id: 7, - candidates_json: demoTasks[1].candidates_json, - created_at: '2026-08-10 09:30:00', - }, - ], - }, -}; - -export default function App() { - const [meta, setMeta] = useState(null); - const [jobs, setJobs] = useState([]); - const [selectedJobId, setSelectedJobId] = useState(''); - const [jobDetail, setJobDetail] = useState(null); - const [timeline, setTimeline] = useState([]); - const [tasks, setTasks] = useState([]); - const [selectedTaskId, setSelectedTaskId] = useState(''); - const [roleCode, setRoleCode] = useState('PURCHASER'); - const [taskStatus, setTaskStatus] = useState('OPEN'); - const [jobBucket, setJobBucket] = useState('ALL'); - const [jobQuery, setJobQuery] = useState(''); - const [token, setToken] = useState(sessionTokenStore.get()); - const [taskAction, setTaskAction] = useState('CONFIRM_AND_CONTINUE'); - const [selectedCandidateId, setSelectedCandidateId] = useState(''); - const [saveAsAlias, setSaveAsAlias] = useState(true); - const [receiptNoticeNo, setReceiptNoticeNo] = useState(''); - const [targetRole, setTargetRole] = useState('PURCHASER'); - const [callbackKind, setCallbackKind] = useState('complete'); - const [simPayloadText, setSimPayloadText] = useState(formatNodeCallbackTemplate('ORDER_FETCH', 'complete')); - const [notice, setNotice] = useState(''); - const [busy, setBusy] = useState(false); - const [demoMode, setDemoMode] = useState(false); - const [focusedNodeCode, setFocusedNodeCode] = useState(''); - - async function loadJobs() { - if (demoMode) { - setJobs(demoJobs); - return; - } - const data = await requestJson<{ items: JobRow[] }>('/api/jobs'); - setJobs(data.items); - if (!selectedJobId && data.items[0]) { - setSelectedJobId(data.items[0].job_id); - } - } - - async function loadMeta() { - if (demoMode) { - setMeta(demoMeta); - return; - } - const data = await requestJson('/api/state-machine'); - setMeta(data); - } - - async function loadTasks() { - if (demoMode) { - const filtered = demoTasks.filter((task) => task.role_code === roleCode && task.status === taskStatus); - setTasks(filtered); - setSelectedTaskId((current) => - filtered.some((task) => task.task_id === current) ? current : '', - ); - return; - } - const data = await requestJson<{ items: TaskRow[] }>( - `/api/tasks/my?roleCode=${encodeURIComponent(roleCode)}&status=${encodeURIComponent(taskStatus)}`, - ); - setTasks(data.items); - setSelectedTaskId((current) => - data.items.some((task) => task.task_id === current) ? current : '', - ); - } - - async function loadJobDetail(jobId: string) { - if (demoMode) { - const detail = demoJobDetailMap[jobId] || demoJobDetailMap[demoJobId]; - setJobDetail(detail); - setTimeline( - detail.job.job_id === demoJobId - ? demoTimeline - : [ - { node_code: 'ORDER_FETCH', display_status: 'SUCCESS', attempt_no: 1, status: 'SUCCESS' }, - { node_code: 'OCR_EXTRACT', display_status: 'SKIPPED' }, - { node_code: 'PRODUCT_MATCH', display_status: 'RUNNING', attempt_no: 1, status: 'RUNNING' }, - { node_code: 'SOURCE_ADD', display_status: 'PENDING' }, - { node_code: 'CONTRACT_CREATE', display_status: 'PENDING' }, - { node_code: 'CONTRACT_APPROVE_WAIT', display_status: 'PENDING' }, - { node_code: 'REBATE_HEADER', display_status: 'PENDING' }, - { node_code: 'REBATE_IMPORT', display_status: 'PENDING' }, - { node_code: 'REBATE_SUBMIT', display_status: 'PENDING' }, - { node_code: 'M5_CREATE_ORDER', display_status: 'PENDING' }, - { node_code: 'M5_MANUAL_CONFIRM', display_status: 'PENDING' }, - { node_code: 'M5_RECEIPT_NOTICE', display_status: 'PENDING' }, - { node_code: 'ARCHIVE_JOB', display_status: 'PENDING' }, - ], - ); - return; - } - const detail = await requestJson(`/api/jobs/${jobId}`); - const tl = await requestJson<{ job: JobRow; timeline: TimelineNode[] }>(`/api/jobs/${jobId}/timeline`); - setJobDetail(detail); - setTimeline(tl.timeline); - } - - function applyDemoData(reason: string) { - setDemoMode(true); - setMeta(demoMeta); - setJobs(demoJobs); - setSelectedJobId(demoJobId); - setJobDetail(demoJobDetailMap[demoJobId]); - setTimeline(demoTimeline); - setTasks(demoTasks); - setSelectedTaskId(demoTasks[0]?.task_id || ''); - setNotice(reason); - } - - useEffect(() => { - void Promise.all([loadMeta(), loadJobs(), loadTasks()]).catch(() => { - applyDemoData('后端暂不可用,已切换到本地演示数据。'); - }); - }, []); - - useEffect(() => { - if (!selectedJobId) return; - void loadJobDetail(selectedJobId).catch((error) => { - if (!demoMode) { - applyDemoData('后端暂不可用,已切换到本地演示数据。'); - return; - } - setNotice(error instanceof Error ? error.message : '加载单据失败'); - }); - }, [selectedJobId, demoMode]); - - useEffect(() => { - void loadTasks().catch((error) => { - if (!demoMode) { - applyDemoData('后端暂不可用,已切换到本地演示数据。'); - return; - } - setNotice(error instanceof Error ? error.message : '加载待办失败'); - }); - }, [roleCode, taskStatus, demoMode]); - - const selectedTask = useMemo(() => tasks.find((task) => task.task_id === selectedTaskId) || null, [tasks, selectedTaskId]); - const visibleJobs = useMemo( - () => - jobs.filter( - (job) => jobStatusBucketMatches(jobBucket, job.status) && jobMatchesQuery(job, jobQuery, meta), - ), - [jobs, jobBucket, jobQuery, meta], - ); - const jobBucketCounts = useMemo(() => { - const matched = jobs.filter((job) => jobMatchesQuery(job, jobQuery, meta)); - const counts = { ALL: matched.length } as Record; - for (const bucket of jobBucketOptions) { - counts[bucket] = bucket === 'ALL' - ? matched.length - : matched.filter((job) => jobStatusBucketMatches(bucket, job.status)).length; - } - return counts; - }, [jobs, jobQuery, meta]); - const taskJobIds = useMemo(() => new Set(tasks.map((task) => task.job_id)), [tasks]); - const selectedTaskActions = useMemo( - () => (selectedTask ? allowedTaskActions(selectedTask) : []), - [selectedTask], - ); - const candidates = useMemo(() => taskCandidates(selectedTask), [selectedTask]); - const selectedCandidate = useMemo( - () => candidates.find((candidate) => candidate.goods_id === selectedCandidateId) || null, - [candidates, selectedCandidateId], - ); - const currentNodeCode = jobDetail?.job.current_node_code || ''; - const callbackEndpoint = jobDetail && currentNodeCode - ? `/api/jobs/${jobDetail.job.job_id}/nodes/${currentNodeCode}/${callbackKind}` - : ''; - const jobArtifacts = jobDetail?.artifacts || []; - const jobNodeDetails = useMemo( - () => buildNodeDetails(timeline, jobDetail?.nodes || [], jobArtifacts, jobDetail?.tasks || []), - [timeline, jobDetail?.nodes, jobArtifacts, jobDetail?.tasks], - ); - const businessOverview = useMemo( - () => - jobDetail - ? buildBusinessOverview( - jobDetail.job, - timeline, - jobDetail.tasks, - jobArtifacts, - meta, - jobDetail.nodes, - ) - : null, - [jobDetail, timeline, jobArtifacts, meta], - ); - - useEffect(() => { - if (!visibleJobs.length) return; - if (!visibleJobs.some((job) => job.job_id === selectedJobId)) { - setSelectedJobId(visibleJobs[0].job_id); - } - }, [visibleJobs, selectedJobId]); - - useEffect(() => { - const related = tasks.filter((task) => task.job_id === selectedJobId); - setSelectedTaskId((current) => { - if (related.some((task) => task.task_id === current)) return current; - return related[0]?.task_id || ''; - }); - }, [selectedJobId, tasks]); - - useEffect(() => { - setFocusedNodeCode(jobDetail?.job.current_node_code || ''); - }, [jobDetail?.job.job_id, jobDetail?.job.current_node_code]); - - useEffect(() => { - function onKey(event: KeyboardEvent) { - const target = event.target as HTMLElement | null; - const inField = Boolean( - target && - (target.tagName === 'INPUT' || - target.tagName === 'TEXTAREA' || - target.tagName === 'SELECT' || - target.isContentEditable), - ); - if (event.key === '/' && !inField) { - event.preventDefault(); - document.getElementById('job-search')?.focus(); - } - } - window.addEventListener('keydown', onKey); - return () => window.removeEventListener('keydown', onKey); - }, []); - - useEffect(() => { - setTaskAction((current) => - selectedTaskActions.includes(current) ? current : (selectedTaskActions[0] || ''), - ); - }, [selectedTaskActions]); - - useEffect(() => { - setSelectedCandidateId((current) => - candidates.some((candidate) => candidate.goods_id === current) - ? current - : (candidates[0]?.goods_id || ''), - ); - }, [candidates]); - - useEffect(() => { - if (!currentNodeCode) return; - setSimPayloadText(formatNodeCallbackTemplate(currentNodeCode, callbackKind)); - }, [currentNodeCode, callbackKind]); - - async function saveToken(nextToken: string) { - setToken(nextToken); - sessionTokenStore.set(nextToken); - } - - async function submitTask() { - if (!selectedTask) { - setNotice('请先选择一条待办。'); - return; - } - if (!token.trim()) { - setNotice('请先填写开发令牌。'); - return; - } - if (demoMode) { - setNotice(`演示提交:${actionLabel(taskAction)} 已记录。`); - return; - } - let payload: Record = {}; - if (taskAction === 'SELECT_CANDIDATE') { - if (!selectedCandidate || !selectedTask.product_match_id) { - setNotice('请选择一条候选货品。'); - return; - } - payload = { - productMatchId: selectedTask.product_match_id, - goodsId: selectedCandidate.goods_id, - goodsCode: selectedCandidate.goods_code, - baseUnit: selectedCandidate.base_unit, - saveAsAlias, - }; - } else if (taskAction === 'CONFIRM_AND_CONTINUE' && selectedTask.node_code === 'M5_RECEIPT_NOTICE') { - if (!receiptNoticeNo.trim()) { - setNotice('请填写收货通知单号。'); - return; - } - payload = { receiptNoticeNo: receiptNoticeNo.trim() }; - } else if (taskAction === 'TRANSFER_MANUAL') { - payload = { targetRole }; - } - setBusy(true); - try { - const result = await requestJson(`/api/tasks/${selectedTask.task_id}/submit`, { - method: 'POST', - token, - body: { - action: taskAction, - payload, - submitToken: crypto.randomUUID(), - operator: 'web', - }, - }); - setNotice(`待办已提交:${result.idempotent ? '重复提交' : '首次提交'}。`); - await Promise.all([loadJobDetail(selectedTask.job_id), loadTasks(), loadJobs()]); - } catch (error) { - setNotice(error instanceof Error ? error.message : '提交失败'); - } finally { - setBusy(false); - } - } - - function resetNodeCallbackTemplate() { - if (!currentNodeCode) return; - setSimPayloadText(formatNodeCallbackTemplate(currentNodeCode, callbackKind)); - } - - async function sendNodeCallback() { - if (!jobDetail) { - setNotice('请先选择一条单据。'); - return; - } - if (!token.trim()) { - setNotice('请先填写开发令牌。'); - return; - } - if (demoMode) { - setNotice(`演示回调:${nodeCallbackActionLabel(callbackKind)} 已记录。`); - return; - } - let payload: unknown; - try { - payload = simPayloadText.trim() ? JSON.parse(simPayloadText) : {}; - } catch { - setNotice('联调回调参数不是合法 JSON。'); - return; - } - if (!payload || typeof payload !== 'object' || Array.isArray(payload)) { - setNotice('联调回调参数必须是 JSON 对象。'); - return; - } - const body = buildNodeCallbackRequestBody( - callbackKind, - currentNodeCode, - payload as Record, - crypto.randomUUID(), - ); - setBusy(true); - try { - const result = await requestJson(callbackEndpoint, { - method: 'POST', - token, - body, - }); - const nextNodeText = result.next_node ? `,下一节点:${result.next_node}` : ''; - const statusText = result.job_status ? `,状态:${result.job_status}` : ''; - setNotice(`联调回调成功:${nodeCallbackActionLabel(callbackKind)}${nextNodeText}${statusText}`); - await Promise.all([loadJobDetail(jobDetail.job.job_id), loadJobs(), loadTasks()]); - } catch (error) { - setNotice(error instanceof Error ? error.message : '联调回调失败'); - } finally { - setBusy(false); - } - } - - function selectJob(jobId: string) { - setSelectedJobId(jobId); - } - - function activateTask(taskId: string) { - const fromQueue = tasks.find((task) => task.task_id === taskId); - const fromJob = jobDetail?.tasks.find((task) => task.task_id === taskId); - const task = fromQueue || fromJob; - if (task?.role_code && task.role_code !== roleCode) setRoleCode(task.role_code); - if (task?.status && task.status !== taskStatus) setTaskStatus(task.status); - if (task?.job_id) setSelectedJobId(task.job_id); - setSelectedTaskId(taskId); - window.setTimeout(() => { - document.getElementById('task-section')?.scrollIntoView({ behavior: 'smooth', block: 'start' }); - }, 0); - } - - function openPanel(id: string) { - const el = document.getElementById(id); - if (el instanceof HTMLDetailsElement) el.open = true; - el?.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - - function focusNode(nodeCode: string) { - setFocusedNodeCode(nodeCode); - openPanel('node-details-panel'); - window.setTimeout(() => { - document.getElementById(`node-detail-${nodeCode}`)?.scrollIntoView({ behavior: 'smooth', block: 'center' }); - }, 50); - } - - async function copyValue(label: string, value: string) { - if (!value || value === '-') { - setNotice(`${label}尚未回填`); - return; - } - try { - await navigator.clipboard.writeText(value); - setNotice(`已复制${label}:${value}`); - } catch { - setNotice(`${label}:${value}`); - } - } - - function bucketForStatus(status: string): JobStatusBucket { - if (jobStatusBucketMatches('WAITING', status)) return 'WAITING'; - if (jobStatusBucketMatches('FAILED', status)) return 'FAILED'; - if (jobStatusBucketMatches('SUCCESS', status)) return 'SUCCESS'; - if (jobStatusBucketMatches('ACTIVE', status)) return 'ACTIVE'; - return 'ALL'; - } - - return ( -
-
-
-

状态中心

- 采购主链自动化一期 - - {demoMode ? '本地演示数据' : '后端已连接'} - -
-
-
- 查询 -
- - setJobQuery(event.target.value)} - onKeyDown={(event) => { - if (event.key === 'Escape') setJobQuery(''); - }} - placeholder="供应商、单号、来源、节点…" - aria-label="查询单据" - /> - {jobQuery ? ( - - ) : null} -
-
-
- 待办角色 - -
-
- 待办状态 -
- {taskStatusOptions.map((status) => ( - - ))} -
-
-
- 单据 -
- {jobBucketOptions.map((bucket) => ( - - ))} -
-
- -
-
- - {notice ? ( -
- {notice} - -
- ) : null} - -
- - -
-
-
-
-
单据概览
-

{businessOverview?.header.supplierName || '请选择一条单据'}

- {businessOverview ? ( -
- - - {businessOverview.header.orderDateText} · {businessOverview.header.sourceTypeText} - -
- ) : ( -
先从左侧选择一条单据。
- )} -
-
- {jobDetail ? ( - - ) : ( -
-
- )} -
当前节点:{businessOverview?.header.currentNodeText || '-'}
-
责任角色:{businessOverview?.header.currentRoleText || '-'}
-
-
- -
- - - - -
- -
- {businessOverview?.referenceChain.map((item) => ( - - )) ||
请选择一条单据。
} -
- -
- {businessOverview?.primaryTask ? ( - - ) : ( - <> -
当前待办
-
当前没有未完成待办。
- - )} -
-
- - - -
-
- -
- -
-
-
待办提交
- {selectedTask ? ( -
-
-
当前待办
-
{selectedTask.title}
-
-
-
处理原因
-
{selectedTask.reason_user_friendly || reasonLabel(selectedTask.reason_type)}
-
-
- ) : businessOverview?.primaryTask ? ( -
- 当前单据待办属于{businessOverview.primaryTask.roleText}。 - -
- ) : ( -
请先选择一条待办。
- )} - - {selectedTask ? ( -
- - - {taskAction === 'SELECT_CANDIDATE' ? ( - <> - - - {selectedCandidate ? ( -
- 货品编码:{selectedCandidate.goods_code || '-'} - 生产厂家:{selectedCandidate.manufacturer || '-'} - 批准文号:{selectedCandidate.approval_no || '-'} - 基本单位:{selectedCandidate.base_unit || '-'} -
- ) : ( -
当前待办没有候选货品。
- )} - - ) : null} - - {taskAction === 'CONFIRM_AND_CONTINUE' && selectedTask.node_code === 'M5_RECEIPT_NOTICE' ? ( - - ) : null} - - {taskAction === 'TRANSFER_MANUAL' ? ( - - ) : null} - -
- -
-
- ) : null} - -
- 当前筛选:{roleLabel(roleCode)},{taskStatusLabel(taskStatus)} -
-
-
-
- -
-
- - 证据包 - {businessOverview?.summary.evidenceCount ?? 0} - - void copyValue('证据路径', path)} /> -
- -
- - 节点详情 - {businessOverview?.summary.nodeDetailCount ?? 0} - - void copyValue('证据路径', path)} - /> -
- -
- - 验收对照 - - {businessOverview - ? `${businessOverview.summary.acceptanceCounts.DONE}/${ - businessOverview.summary.acceptanceCounts.DONE + - businessOverview.summary.acceptanceCounts.PARTIAL + - businessOverview.summary.acceptanceCounts.TODO + - businessOverview.summary.acceptanceCounts.NA - }` - : '0/0'} - - - -
- - {devActionsEnabled ? ( -
- - 联调回调 - DEV - -
-
- -
-
请求路径
-
{callbackEndpoint || '-'}
-
-
-
-

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