所有的/v1打头的接口,都要传一个token作为校验信息,放到header里 x-srv-token: ticket-builtin-token content-type: application/json

当前已使用的systemName如下:
cmp/rds/redis/datamarket/monitor


外部PaaS平台调用接口创建工单

  1. POST /v1/ticket/tickets?systemName=cmp //systemName:外部系统名称,同一个系统生成工单时名称请统一,并在调用回调接口时该参数保持一致
  2. {
  3. "ticketInfo":{
  4. "operatorId": 10, //当前进行此操作登陆uic用户的id,实时获取。operatorId/operatorName/operatorUUID传任意一个就行
  5. "operatorName": "fa",//当前进行此操作登陆uic用户的username,实时获取,operatorId/operatorName/operatorUUID传任意一个就行
  6. "operatorUUID": "8d767da95917b9f74839da2d71b0bc40", //当前进行此操作登陆uic用户的uuid,实时获取,operatorId/operatorName/operatorUUID传任意一个就行
  7. "title": "工单主题", //可选,如果不填写则会使用模版中的默认值,如果模板中没有默认值会报错
  8. "typ": "extern_asyn", //必填,如果后续的action调用逻辑为异步接口,则值为extern_asyn;如果是实时返回则是extern_sync。
  9. "templateId": 2, //必填,模板Id,部署系统前人工配置模板生成id。
  10. "levels": 1, //必填, 优先级,0代表P0,1代表P1,2代表P2
  11. "systemName": "cmp", //外部系统名称,同一个系统生成工单时名称请统一,并在调用回调接口时该参数保持一致
  12. "content": "aldfjdslkfjalsfd", //必填,描述内容markdown
  13. "approveInfo": "[{\"type\":\"assign\",\"value\":[\"abc\",\"aoligzhangqi\"]}]", //json字符串,type固定写法, value中的值为用户的username列表
  14. "action":"[{\"callbackBody\": \"json string\",\"name\": \"create vm\",\"desn\": \"create vm\",\"url\": \"http://1.1.1.1:9999?id=xxx\" }]",//可选,后续处理人手动执行的api接口,如果不传默认使用模板中配置的值,传的话会覆盖,如果不传且模板没有则后续没有可执行的action, name和url必填,url中为实际执行的你方接口。
  15. "targetQueueId": 2, //选填,工作组Id,部署系统前人工配置工作组生成id。
  16. "scheduleStartTime": "2020-08-30T14:06:26.008Z",//计划开始时间,可选,如果为空请传null
  17. "scheduleEndTime": "2020-08-30T14:06:26.008Z",//计划结束时间,可选,如果为空请传null
  18. "headers": {"x-srv-token": "adfkalfjlsf", "usage": "value"}, //可选,如果需要工单系统执行action时附带固定的header,则将headers传入这个值
  19. "actionObject": [{"callbackBody":"json string","name":"sdf","desc":"","url":"http://1.1.1.1:9000"}], //可选,字段含义与action一致, 这个字段接受json object, 如果不想将action转字符串, 那么可以把action中数据的json object放在这个字段, 如果使用这个字段,那么请把action字段置为空,否则接口优先获取action忽略actionObject
  20. }
  21. }


  1. //返回格式(成功)
  2. {
  3. "code": 20001001,
  4. "dat":{
  5. "id": 1 //工单数据库ID
  6. }
  7. }
  8. //返回格式(错误)
  9. {"code":40001001, "err":"adsfadsfadsf"}

错误码说明

  1. 创建工单失败,当前登陆的用户没有直属上级,不满足所选模板的审批要求
  2. code: 40401001
  3. 创建工单失败,当前登陆的用户无效
  4. code: 40401002
  5. 创建工单失败,找不到对应的工作组
  6. code: 40401003
  7. 创建工单失败,找不到对应的模板
  8. code: 40401004
  9. 创建工单失败,指定的模板不属于指定的工作组
  10. code: 40401005
  11. 创建工单失败,没有找到标题
  12. code: 40401006
  13. 创建工单失败,当前用户没有所属租户, 不满足所选模板的审批条件
  14. code: 40401007
  15. 创建工单失败,当前用户所在租户没有管理员, 不满足所选模板的审批条件
  16. code: 40401008
  17. 创建工单失败,当前用户属于多个租户, 不满足所选模板的审批条件
  18. code: 40001001
  19. 创建工单失败,无效的type参数
  20. code: 40001002
  21. 创建工单失败,header参数格式错误
  22. code: 40001003
  23. 创建工单失败,找不到有效body
  24. code: 40001004
  25. 创建工单失败,工单数据库错误,联系工单系统管理员
  26. code: 50201001
  27. 创建工单失败,使用模板数据异常
  28. code: 50201002


外部PaaS平台异步action回调地址

POST /v1/ticket/callback?systemName=cmp     //systemName:外部系统名称,同一个系统生成工单时名称请统一,并在调用回调接口时该参数保持一致
Header: x-srv-token
{
    "ticketId":10,  //工单数据库ID, 必须
    "success": -1, //任务结果, 1是成功,-1是失败,必须
    "reason": "this this this", //失败原因,可选
    "info": jsonObject, //一些有用的信息, 比如第三方系统的响应体。可选
    "systemName": "cmp", //外部系统名称,同一个系统调用回调地址时名称请统一,必须
    "actionAPI": "http://1.1.1.1/create/vm?xxx=xxx" //这个回调通知对应了之前执行的哪个action api地址,必须
}
//返回格式(成功)
{
  "code": 20001001,
  "err": ""
}
//返回格式(错误)
{"code":40001001, "err":"adsfadsfadsf"}

错误码说明


调用失败,传的工单id无效
code: 40401009

数据库错误
code: 50201001

参数错误
code: 40001004

回调第三方系统发送的body说明

对于处理人手动触发,只要触发了回调,则说明已经通过审批
对于审批结束自动触发,则需要通过approval字段判断

{
    "id": 78,  //工单数据库ID
    "serviceId": "TT202081019245378", //工单编号,展示给用户的唯一标识
    "title": "创建云盘",
    "typ": "event",
    "templateId": 27,
    "creator": "test", //创建工单的用户名, 相当于operatorName
    "levels": 0,
    "cc": "[]",
    "content": "属性名|描述\n---|---\n数据盘|磁盘名:aaa,存储介质:SSD,磁盘容量:1000|\n",
    "contact": "",
    "status": "onprogress",
    "action": "[{\"desn\":\"\",\"name\":\"\",\"url\":\"http://172.20.24.220:8080/zstack/asyncrest/sendcommand\"}]",
    "formSchema": "",
    "ticketSchema": "",
    "nowWorkQueueId": 14,
    "nowWorkQueueTime": "2020-08-10T19:25:22Z",
    "nowWorkQueueUserId": 2,
    "targetQueueId": 14,
    "targetQueueUserId": 0,
    "approveInfo": "[{\"type\":\"leader\",\"value\":[\"dujiashu\"]},{\"type\":\"role\",\"value\":[\"CCP容器平台管理员\"]},{\"type\":\"assign\",\"value\":[\"dujiashu\",\"root\"]},{\"type\":\"tenantAdmin\",\"value\":[\"dujiashu\"]}]",
    "externHeaders": "{\"commandpath\":\"/ticket/face\"}", 
    "externFlag": "extern_asyn", //相当于创建工单时的typ
    "nowApproveIndex": 4,
    "scheduleStartTime": null,
    "scheduleEndTime": null,
    "realStartTime": "2020-08-10T11:25:17Z",
    "firstIntoQueueTime": "2020-08-10T19:25:17Z",
    "totalCostTime": 0,
    "closeTime": "0001-01-01T00:00:00Z",
    "reject": false,
    "createdAt": "2020-08-10T19:24:53Z",
    "updatedAt": "2020-08-10T19:25:22Z",
    "upgradeId": 0,
    "mailTo": null,
  "systemName": "cmp", //创建工单时queryString中的systemName
    "relatedId": null,
    "showNowQueueId": 0,
    "showNowUserId": 0,
    "operatorId": 0,
    "headers": null,
    "@timestamp": "",
    "form": {}, //这里面是自定义表单的字段
    "runUser": "dujiashu",  //本次执行这个action接口地址的处理人username
  "approval": 1, //1通过审批,2驳回审批,仅用于审批结束自动触发模式。
  "callbackBody": "json string", //生成工单时外部系统传过来的对应api的json string
  "extendData": {} //回调时处理人填充的参数, 前提是模版里面进行了配置
}

回调action时,如果需要动态获取数据带过去,那么需要实现一个接口,供工单的前端调用

接口返回的格式如下

{
  "dat":[{
    "label": "加权轮询",
    "value": "wrr"
  }, {
    "label": "轮询",
    "value": "rr"
  }, {
    "label": "最少连接",
    "value": "minconn"
  }, {
    "label": "源地址散列",
    "value": "srch"
  }],
  "err": "",
}

这个数据会被前端获取渲染到select控件的下拉框里

外部接口获取工单详情

GET /v1/ticket/ticket/:id
id为工单的数据库id

调用方可能关心的字段为: ticketInfo.status, 代表工单的状态,(approving(审批中)/pending(待处理)/onprogress(处理中)/close(已关闭)

ticketInfo.approveInfo, 代表工单的审批流程信息。 里面为json字符串,需要反序列化解析。列表的长度代表了审批的环节数。审批顺序按下标从小到大排列。type字段代表审批方式, assign为指定人员审批,value中为人员的username, role为指定角色审批,value中为角色id,value_names中为角色的name。leader为直属上级审批,value中为上级的username,tenantAdmin为租户管理员审批。

ticketInfo.nowApproveIndex, 代表审批流程当前在哪一环节,实际就是approveInfo的下标,从0开始。 如果这个数字超出了approveInfo的最大下标值,那么说明审批环节已经完成。审批环节是否完成推荐通过status直接判断。

ticketInfo.reject,如果status为close,这个字段代表了工单关闭的原因, false代表工单是因为审批被驳回而自动关闭的。

{
  "dat":{
    "ticketInfo":{
        "id": 1, //数据库ID
        "title": "这是个工单", //工单标题
        "serviceId": "TT2020202020203", //工单编号
        "typ": "event",
        "templateId": 2,
        "level": 1,
        "cc": "[1,2,3]", 
        "content": "aldfjdslkfjalsfd",
        "action":"[{\"name\":\"asdfasf\",     \"desn\": \"aklsdfjkljasfkljads\",     \"url\": \"http://sakfjdskfjldsaf\", }]",
        "targetQueueId": 2, //目标工作组
        "formSchema": "",
        "approveInfo": "[{\"type\":\"role\",\"value\":[1],\"value_names\":[\"AMS资产管理员\"]},{\"type\":\"leader\",\"value\":[\"demo01\"],\"value_names\":null},{\"type\":\"assign\",\"value\":[\"aaa\"],\"value_names\":null},{\"type\":\"tenantAdmin\",\"value\":[\"内置租户\",\"root\"],\"value_names\":null}]",//这是一个四阶段审批的示例
        "scheduleStartTime": "2012-03-03 20:20:03",
        "scheduleEndTime": "2012-03-03 20:20:03",
        "nowWorkQueueId": 0, //当前工作组,如果这个字段为0,则从targetQueueId获取
        "nowWorkQueueUserId": 1, //当前处理人
        "nowApproveIndex": 3,
        "showNowQueueId": 1,
        "showNowUserId": 8,
        "realStartTime": "2020-07-27T16:25:02+08:00", //实际开始时间
        "firstIntoQueueTime": "2020-07-27T16:25:02+08:00", //首次入组时间,后端用
        "createdAt": "2020-07-27T16:25:02+08:00",//创建时间
        "status": "close", //工单状态(approving(审批中)/pending(待处理)/onprogress(处理中)/close(已关闭))
        "reject": false, //是否审批驳回,true代表审批被驳回
        "totalCostTime": 120.2 //,总计消耗时间, 计算方式为:如果工单已关闭,则直接获取这个字段, 否则前端自行计算(serverNowTime-创建时间)
          }, 
    "extraField": {
        "ticketId": 1,
        "templateId": 2,
        "fieldIndent": "adf",
        "fieldValue": "善良的看法"
      },
    "relatedTickets": [
        {
        "ticketServiceId": "TT20200202000000123", //当前工单的编号
        "relatedTicketServiceId": "TT20200202000000124" //关联的工单编号
          }, {}], 
    "fileInfo": {
        "ticketId": 1,
        "fileName": "akdjf.txt",
        "filePath": "http://s3.com/sldkfjaskldfasf/asdf.txt",
        "fileSize": 22121312
      }
      }
}