发布工单时自动核销电子凭证

This commit is contained in:
yml2213
2026-08-16 16:43:32 +08:00
parent bc2909d6f2
commit e641064b63
5 changed files with 522 additions and 14 deletions
@@ -19,6 +19,7 @@ import {
Alert,
Button,
Card,
Checkbox,
Descriptions,
Drawer,
Form,
@@ -128,6 +129,8 @@ const FILTERABLE_WORK_ORDER_STATUSES = [
'cancelled',
] as const
const SKIP_PUBLISH_CONFIRM_KEY = 'admin-work-order-skip-publish-confirm'
type MaterialFormValues = {
fields?: Record<string, string>
rewardAmount?: number
@@ -347,13 +350,15 @@ export default function WorkOrdersPanel() {
])
}
async function runAction(
action: () => Promise<unknown>,
successMessage: string,
async function runAction<T>(
action: () => Promise<T>,
successMessage: string | ((result: T) => string),
) {
try {
await action()
message.success(successMessage)
const result = await action()
message.success(
typeof successMessage === 'function' ? successMessage(result) : successMessage,
)
await refreshAll()
return true
} catch (error) {
@@ -362,6 +367,48 @@ export default function WorkOrdersPanel() {
}
}
function publishWorkOrder(row: WorkOrder) {
return runAction(
() => publishAdminWorkOrder(row.workOrderId),
(response) =>
response.data.voucherConsume.voucherCount > 0
? '电子凭证已自动核销,订单已发布到大厅'
: '订单已发布到大厅',
)
}
function confirmPublishWorkOrder(row: WorkOrder) {
if (shouldSkipPublishConfirm()) {
void publishWorkOrder(row)
return
}
let skipFutureConfirm = false
modal.confirm({
title: '确认发布并核销该订单?',
content: (
<div>
<Typography.Paragraph>
使
</Typography.Paragraph>
<Checkbox
onChange={(event) => {
skipFutureConfirm = event.target.checked
}}
>
</Checkbox>
</div>
),
okText: '发布并核销',
cancelText: '取消',
onOk: () => {
if (skipFutureConfirm) setSkipPublishConfirm()
return publishWorkOrder(row)
},
})
}
function confirmBatchAcceptance() {
const workOrderIds = selectedAcceptanceOrderIds
if (workOrderIds.length === 0) {
@@ -792,14 +839,9 @@ export default function WorkOrdersPanel() {
? '接单金额为 0,不能发布到大厅'
: undefined
}
onClick={() =>
runAction(
() => publishAdminWorkOrder(row.workOrderId),
'已发布到大厅',
)
}
onClick={() => confirmPublishWorkOrder(row)}
>
</Button>
) : null}
{row.status === 'open' ? (
@@ -1687,6 +1729,22 @@ export default function WorkOrdersPanel() {
)
}
function shouldSkipPublishConfirm() {
try {
return localStorage.getItem(SKIP_PUBLISH_CONFIRM_KEY) === '1'
} catch {
return false
}
}
function setSkipPublishConfirm() {
try {
localStorage.setItem(SKIP_PUBLISH_CONFIRM_KEY, '1')
} catch {
// 浏览器禁用本地存储时继续发布,但不记住本次选择。
}
}
function formatUserPaymentAmount(order: WorkOrder): string {
const paymentFen = getUserPaymentFen(order)
return paymentFen === null ? '-' : formatMoney(paymentFen)
@@ -247,7 +247,18 @@ export function submitAdminWorkOrderMaterial(
}
export function publishAdminWorkOrder(workOrderId: number) {
return apiPost<{ order: WorkOrder }>(
return apiPost<{
order: WorkOrder
voucherConsume: {
ok: boolean
voucherCount: number
consumedCount: number
alreadyConsumedCount: number
failedCount: number
voucherCodes: string[]
errorMessage: string
}
}>(
`/api/v1/admin/worker-platform/orders/${workOrderId}/publish`,
)
}