G1 OpenAPI JSON 回调能力烟测
目标:验证手机端能否通过 G1 已有 API 能力调用存储过程,并在存储过程返回后用 callback_js 格式化成前端可直接消费的 JSON。
结论
单行返回可包装成统一对象
存储过程返回平铺字段后,回调可生成
{ success, code, message, data }。
多行返回可包装成列表
多行结果可先转为
{ list: [...] },再统一包装到 data.list。
嵌套 JSON 可通过字段前缀传递
已有移动端过程使用
json_xxx 字段返回 JSON 字符串,回调识别后 JSON.parse 成数组或对象。
因此,关封进仓手机端 API 可以采用“过程负责业务查询/写入,回调负责 DTO 整形”的模式。存储过程不必硬凑复杂嵌套结构,只要把复杂片段作为 json_ 字段返回即可。
运行时链路
| 步骤 | G1 位置 | 说明 |
|---|---|---|
| 1 | g1_config.c_table |
注册 table_type=2、type=3 的存储过程 API,url 指向实际过程名。 |
| 2 | g1_config.c_column |
为 API 配参数字段;G1 调用时先传自动生成的 UUID,再按 seq 顺序传请求参数。 |
| 3 | ApiService.doCallStoredProcedureApi |
后端执行 { call procedure(UUID, ...args) },拿到过程返回结果集。 |
| 4 | g1_config.c_custom_html |
callback_js 引用 CustomHTML JS,JS 中的 #{result} 会被替换为过程返回值。 |
| 5 | /openApi/execAPI.do |
开放 API 将回调后的对象直接作为 HTTP JSON 返回给手机端。 |
已完成的只读实测
1. 单行对象格式化
POST https://release.gainit.cn/openApi/execAPI.do?domain=sipgl_lcl&api=api_get_custom_conf
{
"userId": "admin",
"_key": "apk_ver"
}
{
"code": 0,
"data": {
"file_addr": null,
"value": "1.1.0"
},
"success": true,
"message": "ok"
}
2. 多行列表格式化
POST https://release.gainit.cn/openApi/execAPI.do?domain=sipgl_lcl&api=p_mobile_get_combox_list
{
"user_id": "admin",
"type": "qc_type"
}
{
"code": 0,
"data": {
"list": [
{ "value": "瓶盖其他问题", "key": "001" },
{ "value": "瓶盖发霉", "key": "002" },
{ "value": "正标问题", "key": "003" }
]
},
"success": true,
"message": "ok"
}
3. 错误对象格式化
POST https://release.gainit.cn/openApi/execAPI.do?domain=sipgl_lcl&api=api_get_custom_conf
{
"userId": "codex_invalid",
"_key": "mobile_version"
}
{
"code": 2001,
"debug": {
"params": {
"err_code": 2001
}
},
"data": {},
"success": false,
"message": null
}
嵌套 JSON 证据
在已有移动端 domain 中,查询型过程 g1_app_wms_demo.p_mobile_get_packing_plan_info 使用如下模式生成明细列表:
SELECT JSON_ARRAYAGG(JSON_OBJECT(
'plan_number', a.plan_number,
'serial_number', a.serial_number,
'bill_of_lading_number', a.bill_of_lading_number,
'sku_no', a.sku_no,
'outbound_number', a.outbound_number
)) INTO @json_packing_plan_detail
FROM v_packing_plan_detail a
WHERE a.plan_number = plan_number;
SELECT
@record_number record_number,
@plan_number plan_number,
@json_packing_plan_detail json_packing_plan_detail;
对应通用回调会遍历返回字段:遇到 json_ 前缀就执行 JSON.parse。这说明关封进仓接口可返回 json_availableDoors、json_queue、json_nextActions、json_blockingReasons 等字段,再由回调转为前端真正需要的对象和数组。
建议的关封进仓接口返回形态
{
"success": true,
"code": 0,
"message": "ok",
"serverTime": "2026-07-15 20:30:00",
"data": {
"warehouseId": "WH01",
"vehicleWorkUnit": {
"vehicleWorkUnitId": "VWU202607150001",
"workUnitState": "ACCEPTED",
"licensePlate": "沪A12345",
"queueNo": "A001"
},
"availableDoors": [
{ "door": "D01", "state": "FREE" }
],
"queue": [
{
"rank": 1,
"vehicleWorkUnitId": "VWU202607150001",
"cargoList": [
{ "cargoId": "INB202607150001", "bookingPkgs": 20 }
]
}
],
"nextActions": ["CONFIRM_CALL"],
"blockingReasons": []
}
}
过程侧可以返回平铺字段:
SELECT
0 AS err_code,
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS serverTime,
warehouseId AS warehouseId,
JSON_OBJECT(...) AS json_vehicleWorkUnit,
JSON_ARRAYAGG(...) AS json_queue,
JSON_ARRAY(...) AS json_availableDoors,
JSON_ARRAY(...) AS json_nextActions,
JSON_ARRAY() AS json_blockingReasons;
下一步边界
本页已经完成“G1 运行时能力是否可行”的实测;但还没有在
g1_sipgl 新增临时 API。若要继续做本域烟测,需要写库创建临时测试对象,且所有配置必须限定 domain_id='g1_sipgl'。
- 新增一个业务库测试过程:
g1_sipgl.p_mobile_json_contract_smoke。 - 新增一个 CustomHTML 回调:例如
sipgl_mobile_api_format。 - 新增一个 G1 API 配置:
g1_config.c_table.id='p_mobile_json_contract_smoke'。 - 新增 2 到 3 个 API 参数字段到
g1_config.c_column。 - 刷新 G1 缓存后调用
/openApi/execAPI.do?domain=g1_sipgl&api=p_mobile_json_contract_smoke。
按当前项目约束,未获得明确写库授权前,不直接执行上述新增动作。