From 96dcd92f6cf464c5108d64356a5dfab109e9c948 Mon Sep 17 00:00:00 2001 From: zichun <26684461+reporkey@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:59:18 +0800 Subject: [PATCH] feat: ERP 侧 rearch3 对接验收后的三处接轨 --- docs/agent-architecture.md | 17 ++++++++++------- src/main/java/com/xly/service/FormRenderService.java | 5 +++-- src/main/java/com/xly/service/OpService.java | 10 +++++----- src/main/resources/application-saaslocal.yml | 4 ++-- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/agent-architecture.md b/docs/agent-architecture.md index cf38098..c424bea 100644 --- a/docs/agent-architecture.md +++ b/docs/agent-architecture.md @@ -495,8 +495,9 @@ ai_op_queue( ErpClient 只剩 whoami / readForm / getUuid / checkBusinessData(dry-run 接口位)。 - **状态合法性硬检查**(预览+保存两次,防 TOCTOU;依据已核实的存储过程行为):审核要求未审核、 销审要求已审核、作废要求未作废、复原要求已作废;表无对应状态列则跳过。已审核单物理删除仅警告。 -- **ai_op_queue 列名兼容**:新增 `sMakePerson`(ERP 惯例)与 `sUserId` 双写(ERP 执行器仍读 - sUserId,切换后可删);迁移见 `sql/migrate_rearch3.sql`。 +- **ai_op_queue 归属列**:只写 `sMakePerson`(ERP 惯例);旧列 `sUserId` 已停写(2026-07-29, + ERP 执行器切读完成后),但暂不可删——ERP 侧 myTodos/归属校验仍以 `COALESCE(sMakePerson, sUserId)` + 兼容历史行;迁移见 `sql/migrate_rearch3.sql`。 - 护栏:反编造重试与 `maxSequentialToolsInvocations(8)` 原样保留;WRITE_CLAIM 正则补 保存/录入并用负向前瞻排除「已审核状态」类状态陈述;"出过卡"标志改为 change_preview/form_collect。 @@ -542,8 +543,10 @@ ai_op_queue( ### 21.5 待 ERP 侧(D 阶段对接) -- `/business/checkBusinessData` dry-run 端点在 ERP 仓库**未提交**(他人负责);xlyAi 已留 - `erp.dry-run.enabled` 开关 + `ErpClient.checkBusinessData`,完工后开启即接入(update 载荷 - 与入队同口径;__tables__ 多行分组形状需与 ERP 对一次)。 -- doExamine/updatebInvalid 的 ERP 侧校验补做中;xlyAi 预览暂以直读 bCheck/bInvalid 实现硬检查。 -- ai_op_queue `sUserId` 列:ERP 执行器切到 sMakePerson 后删除。 +- ~~`/business/checkBusinessData` 未提交~~ **已上线**(ERP 仓库 feature/ai @1555f0c,2026-07-29 验收): + validate-only(REQUIRES_NEW 强制回滚)、真写端点剥 bDryRun、__tables__ 两种分组形状均支持; + `erp.dry-run.enabled` 已在 saaslocal 开启(生产随 ERP 部署后开)。 +- ~~doExamine/updatebInvalid 校验补做中~~ **已上线**:执行时刻按 bCheck/bInvalid 校验,冲突回 fail+409 + (xlyAi 预览侧的硬检查保留,双层防 TOCTOU)。 +- ai_op_queue `sUserId` 列:xlyAi 已停写;**删列需等 ERP 侧去掉 COALESCE 兼容读**(其 myTodos SQL + 直接引用该列,先删会把查询打挂)。 diff --git a/src/main/java/com/xly/service/FormRenderService.java b/src/main/java/com/xly/service/FormRenderService.java index 0de024b..3ccfec5 100644 --- a/src/main/java/com/xly/service/FormRenderService.java +++ b/src/main/java/com/xly/service/FormRenderService.java @@ -423,7 +423,8 @@ public class FormRenderService { col.put(rc, resolver.typeDefault(rc, types.get(rc))); } col.put("sId", erp.newUuid(identity.token())); - col.put("sFormId", out.formId); + // 记录的 sFormId 按 ERP 原生惯例存模块 id(SysBillNoSettings 编号规则按它配置;存表单 id 会撞不上规则) + col.put("sFormId", out.moduleId); String billNo = resolver.nextBillNo(out.table, identity.brandsId()); if (billNo != null) { col.put("sBillNo", billNo); @@ -542,7 +543,7 @@ public class FormRenderService { } String masterId = erp.newUuid(identity.token()); masterCol.put("sId", masterId); - masterCol.put("sFormId", out.formId); + masterCol.put("sFormId", out.moduleId); String billNo = resolver.nextBillNo(out.table, identity.brandsId()); if (billNo != null) { masterCol.put("sBillNo", billNo); diff --git a/src/main/java/com/xly/service/OpService.java b/src/main/java/com/xly/service/OpService.java index d2d98d5..4bfb098 100644 --- a/src/main/java/com/xly/service/OpService.java +++ b/src/main/java/com/xly/service/OpService.java @@ -24,8 +24,8 @@ import java.util.Map; * * 旧值(draft/confirmed/executing/executed/failed/cancelled)兼容读(见 statusLabel),不再写。 * - *

列名兼容:ERP 执行器仍读 {@code sUserId} → 新列 {@code sMakePerson}(ERP 惯例)双写, - * ERP 侧切换后可删 sUserId。 + *

归属列只写 {@code sMakePerson};旧列 {@code sUserId} 已停写但暂不可删——ERP 侧 + * {@code myTodos}/归属校验仍以 {@code COALESCE(sMakePerson, sUserId)} 兼容历史行。 */ @Service public class OpService { @@ -82,11 +82,11 @@ public class OpService { String newValue, String payload, String description) { String sId = "op-" + System.currentTimeMillis() + "-" + Integer.toHexString((int) (Math.random() * 0xFFFFF)); jdbc.update( - "INSERT INTO ai_op_queue(sId,sUserId,sMakePerson,sBrandsId,sSubsidiaryId,sConversationId,sOpType," + + "INSERT INTO ai_op_queue(sId,sMakePerson,sBrandsId,sSubsidiaryId,sConversationId,sOpType," + "sTargetFormId,sTargetModuleId,sTargetTable,sTargetBillId,sField,sFieldLabel," + "sOldValue,sNewValue,sPayload,sDescription,sStatus,iStatusCode,tCreateDate,tConfirmDate) " + - "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'pending',100,NOW(),NOW())", - sId, who.userId(), who.userId(), who.brandsId(), who.subsidiaryId(), convId, opType, + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'pending',100,NOW(),NOW())", + sId, who.userId(), who.brandsId(), who.subsidiaryId(), convId, opType, formId, moduleId, table, billId, field, trunc(fieldLabel, 128), trunc(oldValue, 500), trunc(newValue, 500), payload, trunc(description, 500)); return sId; diff --git a/src/main/resources/application-saaslocal.yml b/src/main/resources/application-saaslocal.yml index 5887571..88fd446 100644 --- a/src/main/resources/application-saaslocal.yml +++ b/src/main/resources/application-saaslocal.yml @@ -33,9 +33,9 @@ erp: subsidiary: "1111111111" username: admin password: "666666" - # Phase D 接口位:ERP dry-run 校验(/business/checkBusinessData)。ERP 侧完工前保持 false。 + # ERP dry-run 校验(/business/checkBusinessData)。ERP 侧 2026-07-29 上线(feature/ai @1555f0c)后开启。 dry-run: - enabled: false + enabled: true # LLM 可观测(Langfuse,架构 §1)。默认关闭;自托管起来后填 key 开启: # docker compose -f docker-compose.langfuse.yml up -d → http://localhost:3000 拿 public/secret key。 -- libgit2 0.22.2