发布工单时自动核销电子凭证
This commit is contained in:
@@ -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`,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user