refactor(ticket): move the config tab into the SPA ticket center
users.php → 工单管理 的「配置」Tab 只管理部门 / 状态 / 预设回复三块 DB 字典,与 SPA「工单中心」已有的 8 个标量配置分裂成两处;且同一套 CRUD 在 admin_post 与 TicketConfigRest 里各写了一遍,REST 侧此前 没有任何调用方。 - 删除原生 config tab:UsersMenusTicketsConfig.php 整份移除, UsersMenusTicketsCenter 由 512 行降到 251 行(六个写处理方法、 分发分支、十条提示码与 ticket_delete_button 一并清理) - SPA /users/ticket 改为 customPage:内嵌 SchemaPage 承载原有 8 字段, 三块字典改为 n-data-table + n-modal + n-dialog,取色器/管理员多选/ 拖拽排序替代原生手填表单 - TicketConfigRest 成为三块字典的唯一实现,新增 api/modules/tickets.js 封装 aksrt/v1/admin/tickets* - 双向深链:原生页跳 SPA 配置页,SPA 页跳回原生工单列表 契约测试同步更新,并新增 ticket-spa-config-contract 守护接线。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d32bdc0581
commit
e7ca0ee5df
19 files changed
+1074
-509
No files matched your search
@@ -6,6 +6,7 @@ import { extensionsApiMethods } from './extensions.js'
|
||||
import { toolsApiMethods } from './tools.js'
|
||||
import { schemaApiMethods } from './schema.js'
|
||||
import { iconsApiMethods } from './icons.js'
|
||||
import { ticketsApiMethods } from './tickets.js'
|
||||
|
||||
export const apiMethods = {
|
||||
...globalApiMethods,
|
||||
@@ -16,4 +17,5 @@ export const apiMethods = {
|
||||
...toolsApiMethods,
|
||||
...schemaApiMethods,
|
||||
...iconsApiMethods,
|
||||
...ticketsApiMethods,
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* 工单管理端 REST(命名空间 aksrt/v1/admin)。
|
||||
*
|
||||
* TicketRestAdmin 把三块字典 CRUD(工单状态 / 部门 / 预设回复)挂在
|
||||
* aksrt/v1/admin 下,全部要求 manage_options。api 客户端的 baseUrl 只到
|
||||
* aksrt/v1,因此这里必须用 /aksrt/ 全路径形式(joinRestUrl 的
|
||||
* startsWith('/aksrt/') 分支会原样拼接,不再追加 base 前缀)。
|
||||
*/
|
||||
|
||||
const ADMIN = '/aksrt/v1/admin/tickets'
|
||||
|
||||
export const ticketsApiMethods = {
|
||||
/* ---------------- 工单状态 ---------------- */
|
||||
|
||||
listTicketStatuses() { return this.request(`${ADMIN}/statuses`) },
|
||||
createTicketStatus(data) {
|
||||
return this.request(`${ADMIN}/statuses`, { method: 'POST', body: JSON.stringify(data) })
|
||||
},
|
||||
updateTicketStatus(id, data) {
|
||||
return this.request(`${ADMIN}/statuses/${id}`, { method: 'POST', body: JSON.stringify(data) })
|
||||
},
|
||||
deleteTicketStatus(id) {
|
||||
return this.request(`${ADMIN}/statuses/${id}/delete`, { method: 'POST', body: '{}' })
|
||||
},
|
||||
|
||||
/* ---------------- 工单部门 ---------------- */
|
||||
|
||||
listTicketTypes() { return this.request(`${ADMIN}/types`) },
|
||||
createTicketType(data) {
|
||||
return this.request(`${ADMIN}/types`, { method: 'POST', body: JSON.stringify(data) })
|
||||
},
|
||||
updateTicketType(id, data) {
|
||||
return this.request(`${ADMIN}/types/${id}`, { method: 'POST', body: JSON.stringify(data) })
|
||||
},
|
||||
deleteTicketType(id) {
|
||||
return this.request(`${ADMIN}/types/${id}/delete`, { method: 'POST', body: '{}' })
|
||||
},
|
||||
|
||||
/* ---------------- 预设回复 ---------------- */
|
||||
|
||||
listTicketPrereplies() { return this.request(`${ADMIN}/prereplies`) },
|
||||
createTicketPrereply(data) {
|
||||
return this.request(`${ADMIN}/prereplies`, { method: 'POST', body: JSON.stringify(data) })
|
||||
},
|
||||
updateTicketPrereply(id, data) {
|
||||
return this.request(`${ADMIN}/prereplies/${id}`, { method: 'POST', body: JSON.stringify(data) })
|
||||
},
|
||||
deleteTicketPrereply(id) {
|
||||
return this.request(`${ADMIN}/prereplies/${id}/delete`, { method: 'POST', body: '{}' })
|
||||
},
|
||||
/** 排序入参必须是全量 ID,数量不符后端直接拒绝。 */
|
||||
reorderTicketPrereplies(ids) {
|
||||
return this.request(`${ADMIN}/prereplies/order`, { method: 'POST', body: JSON.stringify({ ids }) })
|
||||
},
|
||||
}
|
||||
Reference in new issue
Block a user