增加接单工单客服备注

This commit is contained in:
yml2213
2026-08-23 17:51:40 +08:00
parent 1cebdd0487
commit 75d94140ed
9 changed files with 169 additions and 0 deletions
@@ -8,6 +8,7 @@ import {
resolveProblemWorkOrder,
updateWorkOrder,
updateWorkOrderBasic,
updateWorkOrderAdminNote,
} from '../../repositories/worker-platform/index.js'
import type { JsonObject } from '../../types/json.js'
import { createHttpError } from '../../utils/http.js'
@@ -111,6 +112,40 @@ export async function updateAdminWorkOrder(
return { order: mapWorkOrderAdmin(updated || workOrder) }
}
export async function updateAdminWorkOrderNote(
workOrderId: number | string,
note: unknown,
actorName = '',
) {
const workOrder = await getRequiredWorkOrder(workOrderId)
const normalizedNote = String(note ?? '').trim()
if (normalizedNote.length > 2000) {
throw createHttpError('备注不能超过 2000 个字符', {
statusCode: 400,
errorCode: 'work_order_admin_note_too_long',
})
}
const now = nowIso()
const updated = await updateWorkOrderAdminNote(workOrder.id, normalizedNote, now)
if (!updated) {
throw createHttpError('保存工单备注失败', {
statusCode: 409,
errorCode: 'work_order_admin_note_update_failed',
})
}
await createWorkOrderEvent({
workOrderId: workOrder.id,
actorType: 'admin',
actorId: actorName,
eventType: 'admin_note_updated',
fromStatus: workOrder.status,
toStatus: workOrder.status,
payloadJson: JSON.stringify({ note: normalizedNote }),
now,
})
return { order: mapWorkOrderAdmin(updated) }
}
export async function deleteAdminWorkOrder(workOrderId: number | string) {
const workOrder = await getRequiredWorkOrder(workOrderId)
if (!mapWorkOrderAdmin(workOrder).capabilities.canDelete) {
@@ -240,6 +240,7 @@ export function mapWorkOrderAdmin(workOrder: WorkOrderRow, shares?: WorkOrderSha
},
acceptance: mapAcceptanceForResponse(workOrder.acceptance_json),
draftAcceptance: mapAcceptanceForResponse(workOrder.draft_acceptance_json),
adminNote: workOrder.admin_note || '',
problemNote: workOrder.problem_note || '',
cancel:
workOrder.status === WORK_ORDER_STATUS.CANCELLED
@@ -286,6 +287,7 @@ export function mapWorkOrderForWorker(
rawStatus: _rawStatus,
hallAvailable: _hallAvailable,
capabilities: _capabilities,
adminNote: _adminNote,
...visibleOrder
} = mapped
const personalStatus = resolveWorkerShareStatus(workOrder.status, myShare?.status)