报障现象: owner端工单管理查不到任何工单, 但有个工单待办; 待办弹窗无处理按钮致待办数不变。 根因链(全部有DB/代码证据): 1. 弹窗缺客户动作按钮: 双身份用户(admin既是TK0004客户又是staff), staff视角在 staff_replied态一个按钮都没有, 而此刻待办要求的动作是客户确认——待办永远清不掉。 修: staff视角下当前用户=工单客户且状态在已回复态时追加客户动作按钮。 2. 管理页默认队列=待认领, 当时无待认领单+前端首次查询点击渲染时序中间态→看似查不到。 修: 默认队列改全部工单。 3. T12转派校验不全: 只查目标用户属于0机构不查owner角色, 测试时把TK0003转给无角色的hyz1 产生孤儿工单(角色池无人可认领+hyz1打开管理页被权限分支挡)。 修: 目标用户必须持owner角色否则TK_E004拒绝; 候选端点只列持owner角色的用户; 孤儿工单TK0003数据修复退回角色池。 4. staff_tickets的all分支权限过窄: 无owner角色的账号直接返回空, 受理人看不到自己手上的工单。 修: 无owner角色账号至少能看到受理人是自己的工单。
81 lines
4.6 KiB
XML
81 lines
4.6 KiB
XML
{
|
|
"widgettype": "VBox",
|
|
"options": {"width": "100%", "height": "100%", "padding": "8px", "gap": "8px"},
|
|
"subwidgets": [
|
|
{
|
|
"widgettype": "InlineForm",
|
|
"id": "staff_ticket_filter",
|
|
"options": {
|
|
"css": "card", "padding": "8px", "submit_label": "查询",
|
|
"fields": [
|
|
{"name": "queue", "label": "队列", "uitype": "code", "value": "all", "cwidth": 10,
|
|
"data": [
|
|
{"value": "pending", "text": "待认领(我的角色池)"},
|
|
{"value": "mine", "text": "我受理的"},
|
|
{"value": "all", "text": "全部工单"}
|
|
]}
|
|
]
|
|
},
|
|
"binds": [{
|
|
"wid": "self", "event": "submit",
|
|
"actiontype": "script", "target": "staff_ticket_table",
|
|
"script": "var tbl = bricks.getWidgetById('staff_ticket_table', bricks.app.root); if(tbl) await tbl.render(params);"
|
|
}]
|
|
},
|
|
{
|
|
"widgettype": "Tabular",
|
|
"id": "staff_ticket_table",
|
|
"options": {
|
|
"title": "工单管理",
|
|
"width": "100%", "css": "card",
|
|
"data_url": "{{entire_url('/ticket/api/staff_tickets.dspy')}}",
|
|
"data_method": "GET", "page_rows": 20,
|
|
"data_params": {"queue": "all"},
|
|
"toolbar": {
|
|
"tools": [
|
|
{"name": "view_detail", "label": "查看详情/处理", "selected_row": true}
|
|
]
|
|
},
|
|
"row_options": {
|
|
"browserfields": {
|
|
"exclouded": ["id", "customer_org_id", "assignee_id"],
|
|
"alters": {
|
|
"category": {"uitype": "code", "data": [
|
|
{"value": "consult", "text": "使用咨询"}, {"value": "fault", "text": "故障报修"},
|
|
{"value": "billing", "text": "计费账务"}, {"value": "other", "text": "其他"}]},
|
|
"priority": {"uitype": "code", "data": [
|
|
{"value": "low", "text": "低"}, {"value": "normal", "text": "普通"},
|
|
{"value": "high", "text": "高"}, {"value": "urgent", "text": "紧急"}]},
|
|
"status": {"uitype": "code", "data": [
|
|
{"value": "new", "text": "已提交"}, {"value": "agent_processing", "text": "助手处理中"},
|
|
{"value": "agent_replied", "text": "助手已回复"}, {"value": "human_pending", "text": "待人工认领"},
|
|
{"value": "human_processing", "text": "人工处理中"}, {"value": "staff_replied", "text": "人工已回复"},
|
|
{"value": "closed", "text": "已关闭"}, {"value": "cancelled", "text": "已取消"}]}
|
|
}
|
|
},
|
|
"fields": [
|
|
{"name": "ticket_no", "title": "工单号", "type": "str", "length": 32, "cwidth": 12},
|
|
{"name": "title", "title": "标题", "type": "str", "length": 200, "cwidth": 20},
|
|
{"name": "category", "title": "分类", "type": "str", "length": 32, "cwidth": 8},
|
|
{"name": "priority", "title": "优先级", "type": "str", "length": 16, "cwidth": 6},
|
|
{"name": "status", "title": "状态", "type": "str", "length": 32, "cwidth": 10},
|
|
{"name": "customer_org_name", "title": "客户机构", "type": "str", "length": 100, "cwidth": 14},
|
|
{"name": "assignee_role", "title": "受理角色", "type": "str", "length": 64, "cwidth": 12},
|
|
{"name": "assignee_name", "title": "受理人", "type": "str", "length": 32, "cwidth": 8},
|
|
{"name": "updated_at", "title": "最后更新", "type": "timestamp", "cwidth": 14}
|
|
]
|
|
}
|
|
},
|
|
"binds": [
|
|
{
|
|
"wid": "self", "event": "view_detail",
|
|
"actiontype": "urlwidget", "target": "PopupWindow",
|
|
"popup_options": {"title": "工单处理", "width": "72%", "height": "82%",
|
|
"archor": "cc", "resizable": true},
|
|
"options": {"url": "{{entire_url('/ticket/api/ticket_detail_popup.dspy')}}?id=${id}$"}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|