G1 OpenAPI JSON 回调能力烟测

目标:验证手机端能否通过 G1 已有 API 能力调用存储过程,并在存储过程返回后用 callback_js 格式化成前端可直接消费的 JSON。

结论:机制可行 入口:/openApi/execAPI.do 方式:存储过程 API + CustomHTML JS 回调 本页实测未写 g1_sipgl 数据库 日期:2026-07-15

结论

单行返回可包装成统一对象 存储过程返回平铺字段后,回调可生成 { success, code, message, data }
多行返回可包装成列表 多行结果可先转为 { list: [...] },再统一包装到 data.list
嵌套 JSON 可通过字段前缀传递 已有移动端过程使用 json_xxx 字段返回 JSON 字符串,回调识别后 JSON.parse 成数组或对象。

因此,关封进仓手机端 API 可以采用“过程负责业务查询/写入,回调负责 DTO 整形”的模式。存储过程不必硬凑复杂嵌套结构,只要把复杂片段作为 json_ 字段返回即可。

运行时链路

步骤 G1 位置 说明
1 g1_config.c_table 注册 table_type=2type=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_availableDoorsjson_queuejson_nextActionsjson_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'
按当前项目约束,未获得明确写库授权前,不直接执行上述新增动作。