完善拼单状态与份额验收流程

This commit is contained in:
yml2213
2026-08-18 18:02:43 +08:00
parent 052b99b05f
commit ee79195f47
17 changed files with 1143 additions and 196 deletions
@@ -36,6 +36,12 @@ import {
} from '@/services/worker'
import type { WorkOrder, WorkerUser } from '@/types/worker-platform'
import { useIsMobile } from '@/utils/use-is-mobile'
import {
resolveHallDepositAmount,
resolveHallProductName,
resolveHallRemainingQuantity,
resolveHallRewardAmount,
} from '@/utils/worker-product-name'
type HallSummary = {
pendingAcceptanceCount: number
@@ -203,10 +209,7 @@ export default function WorkerHallPage() {
}
function resolveSharingRemaining(order: WorkOrder): number {
const sharing = order.sharing
if (!sharing?.enabled) return 0
const progress = order.sharingProgress
return Math.max(0, sharing.totalQuantity - (progress?.joinedQuantity || 0))
return resolveHallRemainingQuantity(order)
}
function resolveSharingDeposit(order: WorkOrder, quantity: number): number {
@@ -387,6 +390,8 @@ export default function WorkerHallPage() {
) : (
orders.map((order) => {
const disabledReason = resolveGrabDisabledReason(order, worker, remainingSlots)
const productName = resolveHallProductName(order) || '未命名商品'
const sharingRemaining = resolveSharingRemaining(order)
return (
<article key={order.workOrderId} className="worker-hall-mobile-card">
@@ -409,7 +414,8 @@ export default function WorkerHallPage() {
) : null}
{order.sharing?.enabled ? (
<Tag color="purple" className="worker-hall-mobile-tag">
{resolveSharingRemaining(order)}
{order.sharingProgress?.joinedQuantity || 0}/
{order.sharing.totalQuantity} · {resolveSharingRemaining(order)}
</Tag>
) : null}
{Number(order.timeoutMinutes || 0) > 0 ? (
@@ -429,14 +435,11 @@ export default function WorkerHallPage() {
{/* 商品标题与保证金说明 */}
<div className="worker-hall-mobile-card-main">
<strong
className="worker-hall-mobile-card-title"
title={order.productName || '未命名商品'}
>
{order.productName || '未命名商品'}
<strong className="worker-hall-mobile-card-title" title={productName}>
{productName}
</strong>
<div className="worker-hall-mobile-card-meta">
<span>: {formatMoney(order.freezeDepositAmount)}</span>
<span>: {formatMoney(resolveHallDepositAmount(order))}</span>
{order.sharing?.enabled ? (
<span> · {formatMoney(order.sharing.unitReward)}/</span>
) : null}
@@ -448,12 +451,14 @@ export default function WorkerHallPage() {
<div className="worker-hall-mobile-card-price-group">
<span className="worker-hall-mobile-card-price-label"></span>
<strong className="worker-hall-mobile-card-price-val">
{formatMoney(order.rewardAmount)}
{formatMoney(resolveHallRewardAmount(order))}
</strong>
</div>
<div className="worker-hall-mobile-card-btn-group">
{order.sharing?.enabled && !disabledReason ? (
{order.sharing?.enabled &&
(sharingRemaining > 0 || order.myShare) &&
!disabledReason ? (
<Button
type="primary"
size="middle"
@@ -466,16 +471,18 @@ export default function WorkerHallPage() {
: `拼单 ${formatMoney(order.sharing.unitReward)}/份`}
</Button>
) : null}
<Button
type="primary"
size="middle"
className="worker-hall-mobile-grab-btn"
disabled={Boolean(disabledReason)}
loading={grabbingId === order.workOrderId}
onClick={() => submitGrab(order)}
>
{disabledReason || '立即抢单'}
</Button>
{sharingRemaining > 0 || !order.sharing?.enabled ? (
<Button
type="primary"
size="middle"
className="worker-hall-mobile-grab-btn"
disabled={Boolean(disabledReason)}
loading={grabbingId === order.workOrderId}
onClick={() => submitGrab(order)}
>
{disabledReason || '立即抢单'}
</Button>
) : null}
</div>
</div>
</article>
@@ -613,6 +620,8 @@ export default function WorkerHallPage() {
<div className="worker-hall-card-grid">
{orders.map((order) => {
const disabledReason = resolveGrabDisabledReason(order, worker, remainingSlots)
const productName = resolveHallProductName(order) || '未命名商品'
const sharingRemaining = resolveSharingRemaining(order)
return (
<article key={order.workOrderId} className="worker-hall-card">
@@ -626,11 +635,8 @@ export default function WorkerHallPage() {
</Tag>
) : null}
<strong
className="worker-hall-card-title-text"
title={order.productName || '未命名商品'}
>
{order.productName || '未命名商品'}
<strong className="worker-hall-card-title-text" title={productName}>
{productName}
</strong>
<Typography.Text type="secondary">
{order.categoryName || '默认分类'}
@@ -661,10 +667,10 @@ export default function WorkerHallPage() {
<div className="worker-hall-card-amount-row">
<div className="worker-hall-card-amount">
{formatMoney(order.rewardAmount)}
{formatMoney(resolveHallRewardAmount(order))}
</div>
<Typography.Text type="secondary" className="worker-hall-card-deposit">
{formatMoney(order.freezeDepositAmount)}
{formatMoney(resolveHallDepositAmount(order))}
</Typography.Text>
</div>
@@ -676,7 +682,9 @@ export default function WorkerHallPage() {
<div className="worker-hall-card-actions">
<div className="worker-hall-card-grab-row">
{order.sharing?.enabled && !disabledReason ? (
{order.sharing?.enabled &&
(sharingRemaining > 0 || order.myShare) &&
!disabledReason ? (
<Button
type="primary"
size="large"
@@ -689,15 +697,17 @@ export default function WorkerHallPage() {
: `拼单 ${formatMoney(order.sharing.unitReward)}/份`}
</Button>
) : null}
<Button
type="primary"
size="large"
disabled={Boolean(disabledReason)}
loading={grabbingId === order.workOrderId}
onClick={() => submitGrab(order)}
>
{disabledReason || '立即抢单'}
</Button>
{sharingRemaining > 0 || !order.sharing?.enabled ? (
<Button
type="primary"
size="large"
disabled={Boolean(disabledReason)}
loading={grabbingId === order.workOrderId}
onClick={() => submitGrab(order)}
>
{disabledReason || '立即抢单'}
</Button>
) : null}
</div>
</div>
</article>
@@ -713,7 +723,7 @@ export default function WorkerHallPage() {
)}
<Modal
title={`拼单参与 · ${sharingOrder?.productName || ''}`}
title={`拼单参与 · ${sharingOrder ? resolveHallProductName(sharingOrder) : ''}`}
width={isMobile ? '92%' : 520}
open={Boolean(sharingOrder)}
confirmLoading={submittingSharing}
@@ -831,7 +841,7 @@ function resolveGrabDisabledReason(
worker: WorkerUser | undefined,
remainingSlots: number | null,
) {
if (remainingSlots !== null && remainingSlots <= 0) {
if (remainingSlots !== null && remainingSlots <= 0 && !order.myShare) {
return '已达到当前等级最大同时接单量'
}
@@ -840,7 +850,7 @@ function resolveGrabDisabledReason(
}
const availableAmount = Number(worker.wallet.availableAmount || 0)
const freezeAmount = Number(order.freezeDepositAmount || 0)
const freezeAmount = resolveHallDepositAmount(order)
if (availableAmount < freezeAmount) {
return `余额不足,还差 ${formatMoney(freezeAmount - availableAmount)}`
}