所有的/v1打头的接口,都要传一个token作为校验信息,放到header里 x-srv-token: ticket-builtin-token content-type: application/json
当前已使用的systemName如下:
cmp/rds/redis/datamarket/monitor
外部PaaS平台调用接口创建工单
POST /v1/ticket/tickets?systemName=cmp //systemName:外部系统名称,同一个系统生成工单时名称请统一,并在调用回调接口时该参数保持一致
{
"ticketInfo":{
"operatorId": 10, //当前进行此操作登陆uic用户的id,实时获取。operatorId/operatorName/operatorUUID传任意一个就行
"operatorName": "fa",//当前进行此操作登陆uic用户的username,实时获取,operatorId/operatorName/operatorUUID传任意一个就行
"operatorUUID": "8d767da95917b9f74839da2d71b0bc40", //当前进行此操作登陆uic用户的uuid,实时获取,operatorId/operatorName/operatorUUID传任意一个就行
"title": "工单主题", //可选,如果不填写则会使用模版中的默认值,如果模板中没有默认值会报错
"typ": "extern_asyn", //必填,如果后续的action调用逻辑为异步接口,则值为extern_asyn;如果是实时返回则是extern_sync。
"templateId": 2, //必填,模板Id,部署系统前人工配置模板生成id。
"levels": 1, //必填, 优先级,0代表P0,1代表P1,2代表P2
"systemName": "cmp", //外部系统名称,同一个系统生成工单时名称请统一,并在调用回调接口时该参数保持一致
"content": "aldfjdslkfjalsfd", //必填,描述内容markdown
"approveInfo": "[{\"type\":\"assign\",\"value\":[\"abc\",\"aoligzhangqi\"]}]", //json字符串,type固定写法, value中的值为用户的username列表
"action":"[{\"callbackBody\": \"json string\",\"name\": \"create vm\",\"desn\": \"create vm\",\"url\": \"http://1.1.1.1:9999?id=xxx\" }]",//可选,后续处理人手动执行的api接口,如果不传默认使用模板中配置的值,传的话会覆盖,如果不传且模板没有则后续没有可执行的action, name和url必填,url中为实际执行的你方接口。
"targetQueueId": 2, //选填,工作组Id,部署系统前人工配置工作组生成id。
"scheduleStartTime": "2020-08-30T14:06:26.008Z",//计划开始时间,可选,如果为空请传null
"scheduleEndTime": "2020-08-30T14:06:26.008Z",//计划结束时间,可选,如果为空请传null
"headers": {"x-srv-token": "adfkalfjlsf", "usage": "value"}, //可选,如果需要工单系统执行action时附带固定的header,则将headers传入这个值
"actionObject": [{"callbackBody":"json string","name":"sdf","desc":"","url":"http://1.1.1.1:9000"}], //可选,字段含义与action一致, 这个字段接受json object, 如果不想将action转字符串, 那么可以把action中数据的json object放在这个字段, 如果使用这个字段,那么请把action字段置为空,否则接口优先获取action忽略actionObject
}
}
//返回格式(成功)
{
"code": 20001001,
"dat":{
"id": 1 //工单数据库ID
}
}
//返回格式(错误)
{"code":40001001, "err":"adsfadsfadsf"}
错误码说明
创建工单失败,当前登陆的用户没有直属上级,不满足所选模板的审批要求
code: 40401001
创建工单失败,当前登陆的用户无效
code: 40401002
创建工单失败,找不到对应的工作组
code: 40401003
创建工单失败,找不到对应的模板
code: 40401004
创建工单失败,指定的模板不属于指定的工作组
code: 40401005
创建工单失败,没有找到标题
code: 40401006
创建工单失败,当前用户没有所属租户, 不满足所选模板的审批条件
code: 40401007
创建工单失败,当前用户所在租户没有管理员, 不满足所选模板的审批条件
code: 40401008
创建工单失败,当前用户属于多个租户, 不满足所选模板的审批条件
code: 40001001
创建工单失败,无效的type参数
code: 40001002
创建工单失败,header参数格式错误
code: 40001003
创建工单失败,找不到有效body体
code: 40001004
创建工单失败,工单数据库错误,联系工单系统管理员
code: 50201001
创建工单失败,使用模板数据异常
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
}
}
}