From b2a1ac3db1baf2681dcb953f1037051f5fe60ebd Mon Sep 17 00:00:00 2001 From: yml2213 Date: Fri, 21 Aug 2026 12:54:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B5=84=E9=87=91=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E4=B8=8E=E6=B5=81=E6=B0=B4=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/repositories/worker-platform/types.ts | 1 + .../worker-platform/worker-repo.ts | 5 +- .../src/services/worker-platform/mappers.ts | 1 + .../worker-platform-service.test.ts | 21 ++++ .../src/pages/admin/panels/FinancePanel.tsx | 108 +++++++++--------- .../src/pages/worker/WorkerProfilePage.tsx | 8 +- apps/frontend/src/styles/admin.css | 43 +++++++ apps/frontend/src/types/worker-platform.ts | 1 + 8 files changed, 129 insertions(+), 59 deletions(-) diff --git a/apps/backend/src/repositories/worker-platform/types.ts b/apps/backend/src/repositories/worker-platform/types.ts index b350d11d..8b555690 100644 --- a/apps/backend/src/repositories/worker-platform/types.ts +++ b/apps/backend/src/repositories/worker-platform/types.ts @@ -134,6 +134,7 @@ export type WorkerWalletLedgerRow = { note: string payload_json: string | Record created_at: string + related_platform_order_id?: string | null } export type WorkerFinanceRequestRow = { diff --git a/apps/backend/src/repositories/worker-platform/worker-repo.ts b/apps/backend/src/repositories/worker-platform/worker-repo.ts index b9e0e819..0a786546 100644 --- a/apps/backend/src/repositories/worker-platform/worker-repo.ts +++ b/apps/backend/src/repositories/worker-platform/worker-repo.ts @@ -539,8 +539,11 @@ export async function listWorkerWalletLedgers({ params.push(pageSize, offset) const itemsResult = await query( ` - SELECT * + SELECT + wwl.*, + wo.platform_order_id AS related_platform_order_id FROM worker_wallet_ledgers wwl + LEFT JOIN work_orders wo ON wo.id = wwl.related_work_order_id ${whereClause} ORDER BY wwl.created_at DESC, wwl.id DESC LIMIT $${params.length - 1} OFFSET $${params.length} diff --git a/apps/backend/src/services/worker-platform/mappers.ts b/apps/backend/src/services/worker-platform/mappers.ts index 90ed324c..d4b1de5e 100644 --- a/apps/backend/src/services/worker-platform/mappers.ts +++ b/apps/backend/src/services/worker-platform/mappers.ts @@ -354,6 +354,7 @@ export function mapWalletLedger(ledger: WorkerWalletLedgerRow | null | undefined balanceAfter: Number(ledger.balance_after || 0), frozenAfter: Number(ledger.frozen_after || 0), relatedWorkOrderId: ledger.related_work_order_id ? Number(ledger.related_work_order_id) : null, + relatedPlatformOrderId: String(ledger.related_platform_order_id || '').trim() || null, auditStatus: ledger.audit_status || '', note: ledger.note || '', payload: safeParseJson(ledger.payload_json), diff --git a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts index 4e644176..a52cf23d 100644 --- a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts +++ b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts @@ -8,6 +8,7 @@ import type { WorkProductRuleRow, WorkerFinanceRequestRow, WorkerUserRow, + WorkerWalletLedgerRow, } from '../../repositories/worker-platform/index.js' import { buildWorkOrderWhere, @@ -29,6 +30,7 @@ import { mapWorkOrderAdmin, mapWorkOrderSharingWorkers, mapFinanceRequest, + mapWalletLedger, maskWorkerLeaderboardDisplayName, resolveCollectSubmitTargetWorkOrder, resolveAdminMaterialRewardAmount, @@ -1088,3 +1090,22 @@ test('resolveCollectSubmitTargetWorkOrder rejects unknown workOrderId', () => { ), ) }) + +test('资金流水映射展示关联的平台订单号', () => { + const ledger = { + id: 1, + worker_id: 1, + ledger_type: 'reward_settlement', + amount: 2500, + balance_after: 2500, + frozen_after: 0, + related_work_order_id: 44, + related_platform_order_id: '2623301845665410', + audit_status: 'approved', + note: '验收通过结算报酬', + payload_json: {}, + created_at: '2026-08-21T00:00:00.000Z', + } satisfies WorkerWalletLedgerRow + + assert.equal(mapWalletLedger(ledger)?.relatedPlatformOrderId, '2623301845665410') +}) diff --git a/apps/frontend/src/pages/admin/panels/FinancePanel.tsx b/apps/frontend/src/pages/admin/panels/FinancePanel.tsx index b80dc3bc..31960b7c 100644 --- a/apps/frontend/src/pages/admin/panels/FinancePanel.tsx +++ b/apps/frontend/src/pages/admin/panels/FinancePanel.tsx @@ -500,6 +500,7 @@ export default function FinancePanel() { } open={Boolean(reviewState)} destroyOnHidden + width="min(860px, calc(100vw - 32px))" confirmLoading={reviewing} onCancel={() => { setReviewState(null) @@ -509,64 +510,63 @@ export default function FinancePanel() { > {reviewState ? ( - - - {reviewState.request.worker?.displayName || - reviewState.request.worker?.username || - '-'} - - - {formatFinanceRequestType(reviewState.request.requestType)} - - - {formatMoney(reviewState.request.amount)} - - - {renderFinanceRequestAccountText(reviewState.request)} - - {reviewState.request.requestType === 'withdraw' && - reviewState.request.accountChannel === 'alipay' ? ( - <> - - {reviewState.request.accountNo ? ( - {reviewState.request.accountNo} - ) : ( - '-' - )} +
+
+ + {reviewState.request.requestType === 'withdraw' ? '提现信息' : '充值信息'} + + + + {reviewState.request.worker?.displayName || + reviewState.request.worker?.username || + '-'} - - + + {formatFinanceRequestType(reviewState.request.requestType)} - - ) : null} - {reviewState.request.requestType === 'recharge' ? ( - <> - - {getRechargePaidAt(reviewState.request) - ? formatAdminDateTime(getRechargePaidAt(reviewState.request)) - : '-'} + + {formatMoney(reviewState.request.amount)} - - + + {renderFinanceRequestAccountText(reviewState.request)} - - ) : null} - {reviewState.request.requestType === 'withdraw' && - reviewState.request.accountChannel === 'wechat' ? ( - - - - ) : null} - - {reviewState.request.note || '-'} - - + {reviewState.request.requestType === 'withdraw' ? ( + + {reviewState.request.accountNo ? ( + {reviewState.request.accountNo} + ) : ( + '-' + )} + + ) : null} + {reviewState.request.requestType === 'recharge' ? ( + + {getRechargePaidAt(reviewState.request) + ? formatAdminDateTime(getRechargePaidAt(reviewState.request)) + : '-'} + + ) : null} + + {reviewState.request.note || '-'} + + +
+
+ + {reviewState.request.requestType === 'withdraw' + ? `${formatFinanceChannel(reviewState.request.accountChannel)}收款二维码` + : '付款凭证'} + + +
+
diff --git a/apps/frontend/src/pages/worker/WorkerProfilePage.tsx b/apps/frontend/src/pages/worker/WorkerProfilePage.tsx index 4193623a..58952246 100644 --- a/apps/frontend/src/pages/worker/WorkerProfilePage.tsx +++ b/apps/frontend/src/pages/worker/WorkerProfilePage.tsx @@ -420,8 +420,8 @@ export default function WorkerProfilePage() { render: (_, row) => (
{row.note || '-'} - {row.relatedWorkOrderId ? ( - 关联工单 #{row.relatedWorkOrderId} + {row.relatedPlatformOrderId ? ( + 订单号 {row.relatedPlatformOrderId} ) : null}
), @@ -841,9 +841,9 @@ export default function WorkerProfilePage() { {row.note ? (
说明: {row.note}
) : null} - {row.relatedWorkOrderId ? ( + {row.relatedPlatformOrderId ? (
- 关联工单 #{row.relatedWorkOrderId} + 订单号 {row.relatedPlatformOrderId}
) : null}
diff --git a/apps/frontend/src/styles/admin.css b/apps/frontend/src/styles/admin.css index cb8f2138..26cc5048 100644 --- a/apps/frontend/src/styles/admin.css +++ b/apps/frontend/src/styles/admin.css @@ -888,6 +888,37 @@ min-width: 0; } +.finance-review-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 304px; + gap: 20px; + align-items: start; +} + +.finance-review-details, +.finance-review-evidence { + display: grid; + gap: 8px; + min-width: 0; +} + +.finance-review-evidence { + justify-items: center; + padding: 12px; + border: 1px solid #edf0f5; + border-radius: 6px; + background: #f8fafc; +} + +.finance-review-evidence .image-preview-list { + justify-content: center; +} + +.finance-review-evidence .ant-image, +.finance-review-evidence img { + max-width: 100%; +} + .worker-orders-statistics-card { border-left: 3px solid #ff6a00; } @@ -1444,6 +1475,18 @@ } @media (max-width: 720px) { + .finance-review-layout { + grid-template-columns: 1fr; + } + + .finance-review-evidence { + justify-items: start; + } + + .finance-review-evidence .image-preview-list { + justify-content: flex-start; + } + .users-action-card .ant-card-body { padding: 14px; } diff --git a/apps/frontend/src/types/worker-platform.ts b/apps/frontend/src/types/worker-platform.ts index b461d52c..fa9b9753 100644 --- a/apps/frontend/src/types/worker-platform.ts +++ b/apps/frontend/src/types/worker-platform.ts @@ -74,6 +74,7 @@ export type WorkerWalletLedger = { balanceAfter: number frozenAfter: number relatedWorkOrderId: number | null + relatedPlatformOrderId: string | null auditStatus: string note: string payload: Record