押金解冻天数可配置与待解冻押金扣减,超时订单保留记录

This commit is contained in:
yml2213
2026-08-02 10:14:05 +08:00
parent 043dd3c128
commit 93df3d1c9b
20 changed files with 854 additions and 38 deletions
@@ -84,6 +84,7 @@ import {
import { formatAdminDateTime } from '@/utils/admin-time'
import { asRecord, formatMoney, formatSharingShareStatus, resolveSharingShareStatusColor } from './shared'
type FinanceConfigFormValues = {
depositUnfreezeDays?: number
recharge?: {
enabled?: boolean
channelName?: string
@@ -168,6 +169,7 @@ export default function FinancePanel() {
setSavingConfig(true)
try {
await saveAdminWorkerFinanceConfig({
depositUnfreezeDays: Number(values.depositUnfreezeDays ?? 3),
recharge: {
enabled: values.recharge?.enabled !== false,
channelName: String(values.recharge?.channelName || '').trim(),
@@ -370,6 +372,19 @@ export default function FinancePanel() {
</Form.Item>
</Card>
<Card title="押金与提现规则" size="small" style={{ marginBottom: 16 }}>
<Form.Item
label="押金解冻天数"
name="depositUnfreezeDays"
tooltip="有押金的工单验收通过后,押金进入待解冻,N 天后自动转入可用余额;0 表示验收通过立即释放"
>
<InputNumber min={0} max={30} step={1} addonAfter="天" />
</Form.Item>
<Typography.Text type="secondary">
"接单工单"
</Typography.Text>
</Card>
<Card title="提现入口" size="small" style={{ marginBottom: 16 }}>
<Form.Item
label="开启提现申请"
@@ -528,6 +543,7 @@ function mapFinanceConfigToFormValues(
config?: WorkerFinanceConfig,
): FinanceConfigFormValues {
return {
depositUnfreezeDays: Number(config?.depositUnfreezeDays ?? 3),
recharge: {
enabled: config?.recharge.enabled !== false,
channelName: config?.recharge.channelName || '',
@@ -13,6 +13,7 @@ import {
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
App,
Alert,
Button,
Card,
Descriptions,
@@ -42,6 +43,7 @@ import {
acceptAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deductAdminWorkOrderPendingDeposit,
deleteAdminWorkCategory,
deleteAdminWorkOrder,
deleteAdminWorkerLevel,
@@ -121,9 +123,11 @@ export default function WorkOrdersPanel() {
const [materialScreenshots, setMaterialScreenshots] = useState<UploadedFile[]>([])
const [sharingOrder, setSharingOrder] = useState<WorkOrder | null>(null)
const [editOrder, setEditOrder] = useState<WorkOrder | null>(null)
const [deductOrder, setDeductOrder] = useState<WorkOrder | null>(null)
const [problemForm] = Form.useForm()
const [resolutionForm] = Form.useForm()
const [materialForm] = Form.useForm()
const [deductForm] = Form.useForm<{ amount?: number; note?: string }>()
const [editForm] = Form.useForm<{
productName?: string
platformOrderId?: string
@@ -329,6 +333,29 @@ export default function WorkOrdersPanel() {
})
}
function openDeductModal(row: WorkOrder) {
setDeductOrder(row)
deductForm.setFieldsValue({
amount: Math.round(Number(row.pendingUnfreezeAmount || 0)) / 100,
note: '',
})
}
async function submitDeduct(values: { amount?: number; note?: string }) {
if (!deductOrder) return
const succeeded = await runAction(
() =>
deductAdminWorkOrderPendingDeposit(deductOrder.workOrderId, {
amount: Number(values.amount || 0),
note: String(values.note || '').trim(),
}),
'待解冻押金已扣减',
)
if (!succeeded) return
setDeductOrder(null)
deductForm.resetFields()
}
async function submitEdit(values: {
productName?: string
platformOrderId?: string
@@ -573,6 +600,15 @@ export default function WorkOrdersPanel() {
</Button>
) : null}
{row.status === 'accepted' && Number(row.pendingUnfreezeAmount || 0) > 0 ? (
<Button
icon={<WarningOutlined />}
danger
onClick={() => openDeductModal(row)}
>
</Button>
) : null}
{['in_progress', 'pending_acceptance'].includes(row.status) ? (
<Button
icon={<WarningOutlined />}
@@ -948,6 +984,50 @@ export default function WorkOrdersPanel() {
) : null}
</Modal>
<Modal
title={`扣减待解冻押金 · ${deductOrder?.workOrderNo || ''}`}
open={Boolean(deductOrder)}
onCancel={() => {
setDeductOrder(null)
deductForm.resetFields()
}}
onOk={() => deductForm.submit()}
destroyOnHidden
>
{deductOrder ? (
<Form form={deductForm} layout="vertical" onFinish={submitDeduct}>
<Alert
showIcon
type="warning"
message={`该工单当前待解冻押金 ${formatMoney(
deductOrder.pendingUnfreezeAmount,
)},扣减后剩余部分仍按原计划解冻。`}
style={{ marginBottom: 16 }}
/>
<Form.Item
label="扣减金额"
name="amount"
rules={[{ required: true, message: '请输入扣减金额' }]}
>
<InputNumber
min={0.01}
max={Math.round(Number(deductOrder.pendingUnfreezeAmount || 0)) / 100}
step={1}
addonAfter="元"
className="full-width"
/>
</Form.Item>
<Form.Item
label="扣减原因"
name="note"
rules={[{ required: true, message: '请填写扣减原因' }]}
>
<Input.TextArea rows={3} placeholder="如:订单出现问题,按规则扣除押金" />
</Form.Item>
</Form>
) : null}
</Modal>
<Modal
title="标记问题单"
open={Boolean(problemOrder)}