新增验收报酬待解冻配置并修复待解冻结算漏入队与重复释放流水

This commit is contained in:
yml2213
2026-08-22 13:38:17 +08:00
parent 7b2a5321b9
commit 7f6a291628
17 changed files with 173 additions and 115 deletions
+1 -2
View File
@@ -429,8 +429,7 @@ function patchAdminWorkOrderCaches(
matchesWorkOrderKeyword(item, keyword) &&
(!workerId || workerId === Number(item.worker?.workerId || 0)) &&
(!targetWorkOrderId || targetWorkOrderId === Number(item.workOrderId || 0))
const shouldInsert =
event.operation === 'upsert' && page === 1 && matches && !levelFilterActive
const shouldInsert = event.operation === 'upsert' && page === 1 && matches && !levelFilterActive
const operation = event.operation === 'remove' || !matches ? 'remove' : 'upsert'
queryClient.setQueryData(
queryKey,
@@ -395,7 +395,7 @@ const AfterSalesPanel = forwardRef<AfterSalesPanelHandle>(function AfterSalesPan
label="追缴金额"
name="recoveryAmount"
rules={[{ required: true, message: '请输入追缴金额' }]}
extra="系统依次扣减该责任打手的本单待解冻金、可用余额;不足部分转为欠款,并从后续验收报酬自动抵扣。"
extra="系统依次扣减该责任打手的本单待解冻金、可用余额;不足部分转为欠款,并从后续验收报酬自动抵扣。"
>
<InputNumber min={0} precision={2} addonAfter="元" className="full-width" />
</Form.Item>
@@ -41,6 +41,7 @@ import { formatAdminDateTime } from '@/utils/admin-time'
import { asRecord, formatMoney } from './shared'
type FinanceConfigFormValues = {
depositUnfreezeDays?: number
rewardUnfreezeEnabled?: boolean
recharge?: {
enabled?: boolean
channelName?: string
@@ -158,6 +159,7 @@ export default function FinancePanel() {
try {
await saveAdminWorkerFinanceConfig({
depositUnfreezeDays: Number(values.depositUnfreezeDays ?? 3),
rewardUnfreezeEnabled: values.rewardUnfreezeEnabled !== false,
recharge: {
enabled: values.recharge?.enabled !== false,
channelName: String(values.recharge?.channelName || '').trim(),
@@ -401,12 +403,20 @@ export default function FinancePanel() {
<Form.Item
label="押金解冻天数"
name="depositUnfreezeDays"
tooltip="有押金的工单验收通过后,押金进入待解冻,N 天后自动转入可用余额;0 表示验收通过立即释放"
tooltip="验收通过后,押金进入待解冻,N 天后自动转入可用余额;0 表示押金立即释放"
>
<InputNumber min={0} max={30} step={1} addonAfter="天" />
</Form.Item>
<Form.Item
label="报酬待解冻"
name="rewardUnfreezeEnabled"
valuePropName="checked"
tooltip="开启后,验收报酬和押金一起进入待解冻;期间可由售后问题单优先扣减"
>
<Switch />
</Form.Item>
<Typography.Text type="secondary">
"接单工单"
"接单工单""售后问题单"
</Typography.Text>
</Card>
@@ -636,6 +646,7 @@ export default function FinancePanel() {
function mapFinanceConfigToFormValues(config?: WorkerFinanceConfig): FinanceConfigFormValues {
return {
depositUnfreezeDays: Number(config?.depositUnfreezeDays ?? 3),
rewardUnfreezeEnabled: config?.rewardUnfreezeEnabled !== false,
recharge: {
enabled: config?.recharge.enabled !== false,
channelName: config?.recharge.channelName || '',
@@ -747,7 +747,7 @@ function ScheduledJobCard({
}
>
<Typography.Paragraph type="secondary" style={{ marginBottom: 12 }}>
3
3
</Typography.Paragraph>
<div className="platform-form-grid">
<NumberField
@@ -98,7 +98,11 @@ export function WorkerProfileDesktopWallet({ worker }: { worker: WorkerUser }) {
const items = [
['可用余额', worker.wallet.availableAmount, '可用于抢单冻结或提现申请'],
['冻结押金', worker.wallet.frozenDepositAmount, '抢单后冻结,验收后进入待解冻'],
['待解冻押金', worker.wallet.pendingUnfreezeAmount, '验收后按配置天数解冻到账'],
[
'待解冻金额',
worker.wallet.pendingUnfreezeAmount,
'验收报酬与押金按配置天数解冻到账,期间不可提现',
],
['累计结算', worker.wallet.totalSettledAmount, '已结算入账的报酬合计'],
] as const
return (
@@ -333,7 +333,7 @@ export function WorkerProfileFinanceModals({
<Alert
showIcon
type="warning"
message={`每天最多提现 3 次(支付宝、微信共享次数);100 元及以下支持微信和支付宝,超过 100 元仅支持支付宝;有押金的工单验收通过后,押金需 ${Number(financeConfig?.depositUnfreezeDays ?? 3)} 天解冻到账后方可提现。`}
message={`每天最多提现 3 次(支付宝、微信共享次数);100 元及以下支持微信和支付宝,超过 100 元仅支持支付宝;验收报酬与押金需 ${Number(financeConfig?.depositUnfreezeDays ?? 3)} 天解冻到账后方可提现。`}
style={{ marginBottom: 16 }}
/>
<Descriptions column={1} bordered size="small" style={{ marginBottom: 16 }}>
@@ -189,7 +189,7 @@ export function WorkerProfileMobileView({
<div className="worker-profile-mobile-wallet-grid">
<MobileWalletItem label="冻结押金" amount={worker.wallet.frozenDepositAmount} />
<MobileWalletItem label="待解冻金" amount={worker.wallet.pendingUnfreezeAmount} />
<MobileWalletItem label="待解冻金" amount={worker.wallet.pendingUnfreezeAmount} />
<MobileWalletItem label="累计结算" amount={worker.wallet.totalSettledAmount} />
</div>
</div>
@@ -29,7 +29,7 @@ const LEDGER_TYPE_OPTIONS = [
{ value: 'withdraw_paid', label: '提现打款' },
{ value: 'deposit_freeze', label: '冻结押金' },
{ value: 'deposit_release', label: '释放押金' },
{ value: 'deposit_pending_unfreeze', label: '押金待解冻' },
{ value: 'deposit_pending_unfreeze', label: '待解冻金额' },
{ value: 'deposit_unfreeze', label: '押金已解冻' },
{ value: 'deposit_deduction', label: '扣除押金' },
{ value: 'reward_settlement', label: '结算报酬' },
@@ -52,7 +52,7 @@ export function formatLedgerType(ledgerType: string) {
withdraw_paid: '提现打款',
deposit_freeze: '冻结押金',
deposit_release: '释放押金',
deposit_pending_unfreeze: '押金待解冻',
deposit_pending_unfreeze: '待解冻金额',
deposit_unfreeze: '押金已解冻',
deposit_deduction: '扣除押金',
reward_settlement: '结算报酬',
@@ -408,6 +408,7 @@ export function fetchAdminWorkerFinanceConfig() {
export function saveAdminWorkerFinanceConfig(payload: {
depositUnfreezeDays?: number
rewardUnfreezeEnabled?: boolean
recharge?: {
enabled?: boolean
channelName?: string
@@ -200,6 +200,7 @@ export type WorkerAfterSalesCaseEvent = {
export type WorkerFinanceConfig = {
depositUnfreezeDays: number
rewardUnfreezeEnabled: boolean
recharge: {
enabled: boolean
channelName: string