Groovy Action 迁移服务方案
把 MySQL Action(DB/CUS)按
pgjr.md的 73 条规则改写成 PostgreSQL 友好写法,落库到qvsu_action_tran,便于拖页面核对。
| 项 | 路径 |
|---|---|
| 需求 | 20260719/pgt.md |
| 规则手册 | 20260719/pgjr.md(73 条全覆盖) |
| OpenSpec | openspec/changes/groovy-action-tran/ |
| 代码 | 20260719/gr/ |
1. 要解决什么
读本地 MySQL qvsu_meta_action(测试环境 COC 应用已复制过来)→ 规则匹配/改写 → 可选 PG EXPLAIN → upsert qvsu_action_tran。
成功标准(一句话):mvn test 过、三接口无入参可一键跑、COC 全量 webapp-testing 绿、结果表带平台系统字段可拖页面。
2. 技术定稿
| 项 | 选定 | 说明 |
|---|---|---|
| Groovy | 3.0.25(groovy-all type=pom) |
与 core-server 同坐标族;引擎现行为 3.0.7 |
| JDK / Boot | 8 / 2.7.18 | 内网 Java 8;不用 Boot 3 |
| 构建 | Maven + gmavenplus | 不用 Gradle |
| JDBC | Hikari + groovy.sql.Sql |
双库 Bean;无 ORM |
| 结构 | 一接口一类 | 仅 Application + 三个 *Api |
3. 源码结构
20260719/gr/
README.md
pom.xml
scripts/copy_coc_meta.py # 测环境 COC → 本地
scripts/webapp_test.py # Playwright
src/main/resources/rules/auto-rules.json
src/main/groovy/com/qvsu/actiontran/
ActionTranApplication.groovy
HealthApi.groovy
ActionTranRunApi.groovy
ActionTranResultsApi.groovy
4. 接口约定(无 HTTP 入参)
业务参数写在 handler 方法内局部变量(不是类字段、不是 yml):
| 接口 | 方法内写死 |
|---|---|
GET /health |
version=1.0.0,groovyVersion=3.0.25 |
POST /api/v1/action-tran/run |
appNameEn=COC,pluginTypes=[DB,CUS],limit=0(全量),skipPgCheck=true |
GET /api/v1/action-tran/results |
appNameEn=COC,limit=50,且 s_is_del=1 |
端口:3025。响应壳:{code,message,data}。
流水线:建表(含系统字段)→ 扫 meta → CUS 抽 SQL(围栏/""",抽不出不整段当 SQL)→ 73 规则 → upsert。
match_rule:仅 title / category / notes。
5. 落库表 qvsu_action_tran
业务列:app_name_en、plugin_type、action_name_en、from_action_body、to_action_body(MEDIUMTEXT)、need_update、match_rule。
系统列(拖页面):
| 列 | 说明 |
|---|---|
s_id |
PK AUTO_INCREMENT |
s_create_by / s_update_by |
创建/修改人 |
s_created_dept / s_owner_dept |
部门 |
s_is_del |
默认 1(有效) |
s_org_code |
组织 |
s_created_time / s_updated_time |
创建 / 更新 |
6. 规则覆盖
auto-rules.json:73/73,全部 auto=true;难自动改写的用 annotate/template,命中仍进 match_rule。
门禁:RuleCatalogCoverageTest(条数、id、auto)+ catalog 评审文档。
7. 本地怎么跑
cd 20260719/gr
python scripts/copy_coc_meta.py # 测环境 COC → 本地,清空样例
mvn test
mvn spring-boot:run # :3025
python scripts/webapp_test.py # Playwright
自检:
curl http://127.0.0.1:3025/health
curl -X POST http://127.0.0.1:3025/api/v1/action-tran/run
curl http://127.0.0.1:3025/api/v1/action-tran/results
8. 测试结果(含截图)
8.1 汇总
| 项 | 结果 |
|---|---|
| 数据 | COC meta 2410(DB 2272 / CUS 138) |
mvn test |
通过(覆盖 + RunApi / CUS 保壳) |
| Playwright | PASS |
| run | scanned=2410,upserted=2299,hitRules=1363,failed=111 |
| failed 主因 | 无围栏 CUS / 抽不出 SQL(故意不整段改写) |
| 留证 JSON | 20260719/gr/_preview/webapp_test_result.json |
8.2 Health

8.3 Run 汇总

8.4 Results(含系统字段)

9. 设计自检
| 检查项 | 结果 |
|---|---|
| Groovy 3.0.25 + JDK8 + Boot 2.7 | 是 |
| 一接口一类、无 ORM | 是 |
| 规则 73 全覆盖 | 是 |
| 无 HTTP 入参,参数在方法内 | 是 |
| 系统字段可拖页面 | 是 |
| webapp-testing 绿 | 是 |
10. 已知简化
- 本地无 COC 业务表 →
skipPgCheck=true;有表映射后再改run()里局部变量。 - 111 条 failed:无抽取到的 SQL,不整段 Groovy 跑规则(防
IF()误伤)。 - 人/部门系统字段暂留空;需要时在 upsert 里加常量即可。
复制提示:选中上方正文(含表格与图片)→ 复制 → 粘贴到微信公众号编辑器。
图片为公网链接,部署到 public.joysky.cloud 后可正常显示。