item = new LinkedHashMap<>();
+ item.put("sTable", table);
+ item.put("name", name);
+ item.put("column", List.of(col));
+ return item;
}
}
diff --git a/src/main/java/com/xly/service/FormRenderService.java b/src/main/java/com/xly/service/FormRenderService.java
new file mode 100644
index 0000000..81d5d17
--- /dev/null
+++ b/src/main/java/com/xly/service/FormRenderService.java
@@ -0,0 +1,635 @@
+package com.xly.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.xly.agent.AgentIdentity;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 表单渲染/校验的**共享内核**(rearch3 §1 分层定案):collectForm(收集信息)与
+ * previewChange(请求核准)在 LLM 层是两个语义不同的工具,实现层共用这里的
+ * 表单骨架生成、记录定位读取、字段字典映射、FK 名称→id、类型强转、系统列拒改与 create 载荷构建
+ * ——预览与保存端点用**同一份校验**,杜绝"预览过、保存拒"的漂移。
+ *
+ * 本服务只读不写:唯一的写入口在 {@link OpService}(ai_op_queue)。
+ */
+@Service
+public class FormRenderService {
+
+ private static final int MAX_FIELDS = 40;
+
+ private final JdbcTemplate jdbc;
+ private final FormResolverService resolver;
+ private final ErpClient erp;
+ private final ObjectMapper mapper;
+
+ public FormRenderService(JdbcTemplate jdbc, FormResolverService resolver, ErpClient erp, ObjectMapper mapper) {
+ this.jdbc = jdbc;
+ this.resolver = resolver;
+ this.erp = erp;
+ this.mapper = mapper;
+ }
+
+ // ---------------------------------------------------------------- 表单骨架
+
+ /**
+ * 某表单的业务录入字段骨架(label/控件类型/fk 来源/选项/提示)。
+ * 主来源 = 字段字典的业务录入字段(含报价策展),字典没有映射时退回
+ * {@code gdsconfigformslave} 的可见可写字段(排除系统列)。
+ */
+ public List