统一前后端代码格式化配置
This commit is contained in:
@@ -76,10 +76,7 @@ import type {
|
||||
WorkerLevel,
|
||||
WorkerUser,
|
||||
} from '@/types/worker-platform'
|
||||
import {
|
||||
ADMIN_DEFAULT_PAGE_SIZE,
|
||||
buildAdminTablePagination,
|
||||
} from '@/utils/admin-pagination'
|
||||
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
|
||||
export default function CategoriesPanel() {
|
||||
@@ -190,7 +187,10 @@ export default function CategoriesPanel() {
|
||||
|
||||
return (
|
||||
<section className="platform-panel-stack">
|
||||
<Card title={editingCategory ? `编辑分类:${editingCategory.name}` : '保存分类'} bordered={false}>
|
||||
<Card
|
||||
title={editingCategory ? `编辑分类:${editingCategory.name}` : '保存分类'}
|
||||
bordered={false}
|
||||
>
|
||||
<Form
|
||||
form={form}
|
||||
layout="inline"
|
||||
@@ -204,11 +204,7 @@ export default function CategoriesPanel() {
|
||||
>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="名称"
|
||||
name="name"
|
||||
rules={[{ required: true, message: '请输入名称' }]}
|
||||
>
|
||||
<Form.Item label="名称" name="name" rules={[{ required: true, message: '请输入名称' }]}>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item label="排序" name="sortOrder">
|
||||
@@ -252,7 +248,8 @@ export default function CategoriesPanel() {
|
||||
cancelText="取消"
|
||||
>
|
||||
<Typography.Text>
|
||||
确定删除分类「{deletingCategory?.name}」?已引用该分类的工单和物品规则将无法删除,需先处理。
|
||||
确定删除分类「{deletingCategory?.name}
|
||||
」?已引用该分类的工单和物品规则将无法删除,需先处理。
|
||||
</Typography.Text>
|
||||
</Modal>
|
||||
</section>
|
||||
|
||||
@@ -76,12 +76,14 @@ import type {
|
||||
WorkerLevel,
|
||||
WorkerUser,
|
||||
} from '@/types/worker-platform'
|
||||
import {
|
||||
ADMIN_DEFAULT_PAGE_SIZE,
|
||||
buildAdminTablePagination,
|
||||
} from '@/utils/admin-pagination'
|
||||
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
import { asRecord, formatMoney, formatSharingShareStatus, resolveSharingShareStatusColor } from './shared'
|
||||
import {
|
||||
asRecord,
|
||||
formatMoney,
|
||||
formatSharingShareStatus,
|
||||
resolveSharingShareStatusColor,
|
||||
} from './shared'
|
||||
type FinanceConfigFormValues = {
|
||||
depositUnfreezeDays?: number
|
||||
recharge?: {
|
||||
@@ -230,9 +232,7 @@ export default function FinancePanel() {
|
||||
<Typography.Text strong>
|
||||
{row.worker?.displayName || row.worker?.username || '-'}
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">
|
||||
{row.worker?.username || '-'}
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">{row.worker?.username || '-'}</Typography.Text>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
@@ -272,9 +272,7 @@ export default function FinancePanel() {
|
||||
<div className="cell-stack">
|
||||
<Typography.Text>{row.note || '-'}</Typography.Text>
|
||||
{row.reviewedNote ? (
|
||||
<Typography.Text type="secondary">
|
||||
审核备注:{row.reviewedNote}
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">审核备注:{row.reviewedNote}</Typography.Text>
|
||||
) : null}
|
||||
</div>
|
||||
),
|
||||
@@ -350,11 +348,7 @@ export default function FinancePanel() {
|
||||
initialValues={mapFinanceConfigToFormValues()}
|
||||
>
|
||||
<Card title="充值入口" size="small" style={{ marginBottom: 16 }}>
|
||||
<Form.Item
|
||||
label="开启充值申请"
|
||||
name={['recharge', 'enabled']}
|
||||
valuePropName="checked"
|
||||
>
|
||||
<Form.Item label="开启充值申请" name={['recharge', 'enabled']} valuePropName="checked">
|
||||
<Switch />
|
||||
</Form.Item>
|
||||
<Form.Item label="收款通道名称" name={['recharge', 'channelName']}>
|
||||
@@ -378,10 +372,7 @@ export default function FinancePanel() {
|
||||
</Card>
|
||||
|
||||
<Card title="管理员联系" size="small" style={{ marginBottom: 16 }}>
|
||||
<Form.Item
|
||||
label="管理员微信二维码"
|
||||
name={['adminContact', 'wechatQrCodeImageList']}
|
||||
>
|
||||
<Form.Item label="管理员微信二维码" name={['adminContact', 'wechatQrCodeImageList']}>
|
||||
<ImageUpload scene="worker-admin-contact" scope="admin" maxCount={1} />
|
||||
</Form.Item>
|
||||
</Card>
|
||||
@@ -400,11 +391,7 @@ export default function FinancePanel() {
|
||||
</Card>
|
||||
|
||||
<Card title="提现入口" size="small" style={{ marginBottom: 16 }}>
|
||||
<Form.Item
|
||||
label="开启提现申请"
|
||||
name={['withdraw', 'enabled']}
|
||||
valuePropName="checked"
|
||||
>
|
||||
<Form.Item label="开启提现申请" name={['withdraw', 'enabled']} valuePropName="checked">
|
||||
<Switch />
|
||||
</Form.Item>
|
||||
<Form.Item label="提现说明" name={['withdraw', 'instructions']}>
|
||||
@@ -494,7 +481,9 @@ export default function FinancePanel() {
|
||||
</Card>
|
||||
|
||||
<Modal
|
||||
title={reviewState ? `${formatFinanceReviewAction(reviewState.action)}资金申请` : '处理资金申请'}
|
||||
title={
|
||||
reviewState ? `${formatFinanceReviewAction(reviewState.action)}资金申请` : '处理资金申请'
|
||||
}
|
||||
open={Boolean(reviewState)}
|
||||
destroyOnHidden
|
||||
confirmLoading={reviewing}
|
||||
@@ -553,9 +542,7 @@ export default function FinancePanel() {
|
||||
)
|
||||
}
|
||||
|
||||
function mapFinanceConfigToFormValues(
|
||||
config?: WorkerFinanceConfig,
|
||||
): FinanceConfigFormValues {
|
||||
function mapFinanceConfigToFormValues(config?: WorkerFinanceConfig): FinanceConfigFormValues {
|
||||
return {
|
||||
depositUnfreezeDays: Number(config?.depositUnfreezeDays ?? 3),
|
||||
recharge: {
|
||||
@@ -613,9 +600,7 @@ function renderFinanceRequestAccount(request: WorkerFinanceRequest) {
|
||||
<div className="cell-stack">
|
||||
<Typography.Text>{renderFinanceRequestAccountText(request)}</Typography.Text>
|
||||
{request.requestType === 'withdraw' && request.accountNo ? (
|
||||
<Typography.Text type="secondary">
|
||||
{maskFinanceAccount(request.accountNo)}
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">{maskFinanceAccount(request.accountNo)}</Typography.Text>
|
||||
) : null}
|
||||
</div>
|
||||
)
|
||||
@@ -629,11 +614,7 @@ function renderFinanceRequestAccountText(request: WorkerFinanceRequest) {
|
||||
}
|
||||
|
||||
const rechargeSnapshot = getRechargeSnapshot(request)
|
||||
if (
|
||||
rechargeSnapshot.channelName ||
|
||||
rechargeSnapshot.accountName ||
|
||||
rechargeSnapshot.accountNo
|
||||
) {
|
||||
if (rechargeSnapshot.channelName || rechargeSnapshot.accountName || rechargeSnapshot.accountNo) {
|
||||
return [
|
||||
rechargeSnapshot.channelName,
|
||||
rechargeSnapshot.accountName,
|
||||
|
||||
@@ -76,10 +76,7 @@ import type {
|
||||
WorkerLevel,
|
||||
WorkerUser,
|
||||
} from '@/types/worker-platform'
|
||||
import {
|
||||
ADMIN_DEFAULT_PAGE_SIZE,
|
||||
buildAdminTablePagination,
|
||||
} from '@/utils/admin-pagination'
|
||||
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
import { formatMoney } from './shared'
|
||||
|
||||
@@ -179,8 +176,7 @@ export default function LevelsPanel() {
|
||||
{
|
||||
title: '可见延迟',
|
||||
width: 110,
|
||||
render: (_, row) =>
|
||||
row.visibleDelaySeconds > 0 ? `${row.visibleDelaySeconds} 秒` : '立即',
|
||||
render: (_, row) => (row.visibleDelaySeconds > 0 ? `${row.visibleDelaySeconds} 秒` : '立即'),
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
@@ -212,10 +208,7 @@ export default function LevelsPanel() {
|
||||
|
||||
return (
|
||||
<section className="platform-panel-stack">
|
||||
<Card
|
||||
title={editingLevel ? `编辑等级:${editingLevel.name}` : '保存等级'}
|
||||
bordered={false}
|
||||
>
|
||||
<Card title={editingLevel ? `编辑等级:${editingLevel.name}` : '保存等级'} bordered={false}>
|
||||
<Form
|
||||
form={form}
|
||||
layout="inline"
|
||||
@@ -236,11 +229,7 @@ export default function LevelsPanel() {
|
||||
>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="名称"
|
||||
name="name"
|
||||
rules={[{ required: true, message: '请输入名称' }]}
|
||||
>
|
||||
<Form.Item label="名称" name="name" rules={[{ required: true, message: '请输入名称' }]}>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item label="免押额度" name="depositFreeAmount">
|
||||
|
||||
@@ -66,7 +66,11 @@ export default function ProductRulesPanel() {
|
||||
rule.provider,
|
||||
rule.shopId,
|
||||
rule.categoryName,
|
||||
].some((value) => String(value || '').toLowerCase().includes(keywordText))
|
||||
].some((value) =>
|
||||
String(value || '')
|
||||
.toLowerCase()
|
||||
.includes(keywordText),
|
||||
)
|
||||
})
|
||||
|
||||
function resetRuleForm() {
|
||||
@@ -212,9 +216,7 @@ export default function ProductRulesPanel() {
|
||||
}) {
|
||||
const values = form.getFieldsValue()
|
||||
const unitReward = Number(next.sharingUnitReward ?? values.sharingUnitReward ?? 0)
|
||||
const totalQuantity = Number(
|
||||
next.sharingTotalQuantity ?? values.sharingTotalQuantity ?? 1,
|
||||
)
|
||||
const totalQuantity = Number(next.sharingTotalQuantity ?? values.sharingTotalQuantity ?? 1)
|
||||
const totalAmount = Number(next.sharingTotalAmount ?? values.sharingTotalAmount ?? 0)
|
||||
if (next.sharingTotalAmount !== undefined) {
|
||||
const quantity = unitReward > 0 ? Math.max(1, Math.round(totalAmount / unitReward)) : 1
|
||||
@@ -260,9 +262,7 @@ export default function ProductRulesPanel() {
|
||||
const shopId = String(row.shopId || '')
|
||||
return (
|
||||
<div className="cell-stack">
|
||||
<Typography.Text style={{ fontSize: 12 }}>
|
||||
{row.platform || 'kuaishou'}
|
||||
</Typography.Text>
|
||||
<Typography.Text style={{ fontSize: 12 }}>{row.platform || 'kuaishou'}</Typography.Text>
|
||||
{shopId ? (
|
||||
<Tag color="geekblue" style={{ margin: 0, fontSize: 11, lineHeight: '18px' }}>
|
||||
{shopId}
|
||||
@@ -290,7 +290,9 @@ export default function ProductRulesPanel() {
|
||||
width: '11%',
|
||||
render: (value) =>
|
||||
value ? (
|
||||
<Tag color="cyan" style={{ margin: 0 }}>{value}</Tag>
|
||||
<Tag color="cyan" style={{ margin: 0 }}>
|
||||
{value}
|
||||
</Tag>
|
||||
) : (
|
||||
<Typography.Text type="secondary">-</Typography.Text>
|
||||
),
|
||||
@@ -413,11 +415,7 @@ export default function ProductRulesPanel() {
|
||||
取消编辑
|
||||
</Button>
|
||||
) : null}
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
form="product-rule-form"
|
||||
>
|
||||
<Button type="primary" htmlType="submit" form="product-rule-form">
|
||||
{editingRule ? '保存修改' : '创建规则'}
|
||||
</Button>
|
||||
</Space>
|
||||
@@ -455,10 +453,7 @@ export default function ProductRulesPanel() {
|
||||
{
|
||||
validator: (_, value) => {
|
||||
const key = String(value || '').trim()
|
||||
if (
|
||||
!editingRule &&
|
||||
allRules.some((rule) => rule.ruleKey === key)
|
||||
) {
|
||||
if (!editingRule && allRules.some((rule) => rule.ruleKey === key)) {
|
||||
return Promise.reject(new Error('标识已存在'))
|
||||
}
|
||||
return Promise.resolve()
|
||||
@@ -677,11 +672,7 @@ export default function ProductRulesPanel() {
|
||||
>
|
||||
刷新
|
||||
</Button>
|
||||
<Button
|
||||
type="primary"
|
||||
icon={<PlusOutlined />}
|
||||
onClick={resetRuleForm}
|
||||
>
|
||||
<Button type="primary" icon={<PlusOutlined />} onClick={resetRuleForm}>
|
||||
新建规则
|
||||
</Button>
|
||||
</Space>
|
||||
|
||||
@@ -91,10 +91,7 @@ import type {
|
||||
WorkerLevel,
|
||||
WorkerUser,
|
||||
} from '@/types/worker-platform'
|
||||
import {
|
||||
ADMIN_DEFAULT_PAGE_SIZE,
|
||||
buildAdminTablePagination,
|
||||
} from '@/utils/admin-pagination'
|
||||
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
|
||||
import { hasAdminRole } from '@/utils/admin-auth'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
import {
|
||||
@@ -187,8 +184,7 @@ export default function WorkOrdersPanel() {
|
||||
totalAmount?: number
|
||||
}>()
|
||||
// 仅单独筛选「待验收」时提供批量验收入口(多选状态下不启用勾选,避免误操作)
|
||||
const isPendingAcceptanceOnly =
|
||||
statuses.length === 1 && statuses[0] === 'pending_acceptance'
|
||||
const isPendingAcceptanceOnly = statuses.length === 1 && statuses[0] === 'pending_acceptance'
|
||||
|
||||
const ordersQuery = useQuery({
|
||||
queryKey: [
|
||||
@@ -436,8 +432,7 @@ export default function WorkOrdersPanel() {
|
||||
async function submitProblem(values: { note?: string }) {
|
||||
if (!problemOrder) return
|
||||
const succeeded = await runAction(
|
||||
() =>
|
||||
markAdminWorkOrderProblem(problemOrder.workOrderId, values.note || ''),
|
||||
() => markAdminWorkOrderProblem(problemOrder.workOrderId, values.note || ''),
|
||||
'已标记问题单',
|
||||
)
|
||||
if (!succeeded) return
|
||||
@@ -473,9 +468,7 @@ export default function WorkOrdersPanel() {
|
||||
action,
|
||||
reason: String(values.reason || '').trim(),
|
||||
}),
|
||||
action === 'return_to_hall'
|
||||
? '订单已退回大厅,打手额度已恢复'
|
||||
: '订单已取消,打手额度已恢复',
|
||||
action === 'return_to_hall' ? '订单已退回大厅,打手额度已恢复' : '订单已取消,打手额度已恢复',
|
||||
)
|
||||
if (!succeeded) return
|
||||
setCancelOrder(null)
|
||||
@@ -535,8 +528,7 @@ export default function WorkOrdersPanel() {
|
||||
platformOrderId: row.platformOrderId || '',
|
||||
categoryId: row.categoryId ?? undefined,
|
||||
rewardAmount: Math.round(Number(row.rewardAmount || 0)) / 100,
|
||||
requiredDepositAmount:
|
||||
Math.round(Number(row.requiredDepositAmount || 0)) / 100,
|
||||
requiredDepositAmount: Math.round(Number(row.requiredDepositAmount || 0)) / 100,
|
||||
fieldsText: formatRequirementFieldsText(getRequirementFields(row)),
|
||||
timeoutMinutes: Number(row.timeoutMinutes || 0),
|
||||
timeoutPolicy: row.timeoutPolicy || 'reopen',
|
||||
@@ -586,9 +578,7 @@ export default function WorkOrdersPanel() {
|
||||
categoryId: values.categoryId || null,
|
||||
rewardAmount: Number(values.rewardAmount || 0),
|
||||
requiredDepositAmount: Number(values.requiredDepositAmount || 0),
|
||||
...(canEditRequirementFields
|
||||
? { fieldsText: String(values.fieldsText || '') }
|
||||
: {}),
|
||||
...(canEditRequirementFields ? { fieldsText: String(values.fieldsText || '') } : {}),
|
||||
timeoutMinutes: Math.max(0, Number(values.timeoutMinutes || 0)),
|
||||
timeoutPolicy: values.timeoutPolicy || 'reopen',
|
||||
}),
|
||||
@@ -602,7 +592,9 @@ export default function WorkOrdersPanel() {
|
||||
content: (
|
||||
<span>
|
||||
该订单用户付款 {formatMoney(paymentFen)},发单金额{' '}
|
||||
<Typography.Text strong type="danger">{formatMoney(rewardFen)}</Typography.Text>
|
||||
<Typography.Text strong type="danger">
|
||||
{formatMoney(rewardFen)}
|
||||
</Typography.Text>
|
||||
,本单平台将亏损。确认保存?
|
||||
</span>
|
||||
),
|
||||
@@ -631,11 +623,7 @@ export default function WorkOrdersPanel() {
|
||||
okText: '确认删除',
|
||||
okButtonProps: { danger: true },
|
||||
cancelText: '取消',
|
||||
onOk: () =>
|
||||
runAction(
|
||||
() => deleteAdminWorkOrder(row.workOrderId),
|
||||
'工单已删除',
|
||||
),
|
||||
onOk: () => runAction(() => deleteAdminWorkOrder(row.workOrderId), '工单已删除'),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -657,9 +645,7 @@ export default function WorkOrdersPanel() {
|
||||
<Space size={[6, 6]} wrap>
|
||||
{row.categoryName ? <Tag>{row.categoryName}</Tag> : null}
|
||||
{row.orderId ? (
|
||||
<Typography.Text type="secondary">
|
||||
源订单 #{row.orderId}
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">源订单 #{row.orderId}</Typography.Text>
|
||||
) : null}
|
||||
</Space>
|
||||
{shopName || provider ? (
|
||||
@@ -669,9 +655,7 @@ export default function WorkOrdersPanel() {
|
||||
{shopName ? `店铺:${shopName}` : ''}
|
||||
</Typography.Text>
|
||||
) : null}
|
||||
<Typography.Text type="secondary">
|
||||
{getDisplayOrderNo(row)}
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">{getDisplayOrderNo(row)}</Typography.Text>
|
||||
</div>
|
||||
)
|
||||
},
|
||||
@@ -748,11 +732,11 @@ export default function WorkOrdersPanel() {
|
||||
width: 150,
|
||||
render: (_, row) => (
|
||||
<Space wrap size={4}>
|
||||
<Tag color={resolveStatusColor(row.status)}>
|
||||
{formatStatus(row.status)}
|
||||
</Tag>
|
||||
<Tag color={resolveStatusColor(row.status)}>{formatStatus(row.status)}</Tag>
|
||||
{row.status === 'open' && row.pinnedAt ? (
|
||||
<Tag color="gold" icon={<PushpinOutlined />}>置顶</Tag>
|
||||
<Tag color="gold" icon={<PushpinOutlined />}>
|
||||
置顶
|
||||
</Tag>
|
||||
) : null}
|
||||
</Space>
|
||||
),
|
||||
@@ -760,8 +744,7 @@ export default function WorkOrdersPanel() {
|
||||
{
|
||||
title: '打手',
|
||||
width: 140,
|
||||
render: (_, row) =>
|
||||
row.worker?.displayName || row.worker?.username || '-',
|
||||
render: (_, row) => row.worker?.displayName || row.worker?.username || '-',
|
||||
},
|
||||
{
|
||||
title: '资料',
|
||||
@@ -787,27 +770,17 @@ export default function WorkOrdersPanel() {
|
||||
<Space wrap>
|
||||
<Button onClick={() => openDetailDrawer(row)}>详情</Button>
|
||||
{['pending_material', 'unassigned', 'open'].includes(row.status) ? (
|
||||
<Button
|
||||
icon={<EditOutlined />}
|
||||
onClick={() => openEditModal(row)}
|
||||
>
|
||||
<Button icon={<EditOutlined />} onClick={() => openEditModal(row)}>
|
||||
编辑
|
||||
</Button>
|
||||
) : null}
|
||||
{['pending_material', 'unassigned', 'cancelled'].includes(row.status) ? (
|
||||
<Button
|
||||
danger
|
||||
icon={<DeleteOutlined />}
|
||||
onClick={() => requestDeleteWorkOrder(row)}
|
||||
>
|
||||
<Button danger icon={<DeleteOutlined />} onClick={() => requestDeleteWorkOrder(row)}>
|
||||
删除
|
||||
</Button>
|
||||
) : null}
|
||||
{['pending_material', 'unassigned', 'open'].includes(row.status) ? (
|
||||
<Button
|
||||
icon={<TeamOutlined />}
|
||||
onClick={() => openSharingConfigModal(row)}
|
||||
>
|
||||
<Button icon={<TeamOutlined />} onClick={() => openSharingConfigModal(row)}>
|
||||
拼单配置
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -817,19 +790,12 @@ export default function WorkOrdersPanel() {
|
||||
</Button>
|
||||
) : null}
|
||||
{row.status === 'in_progress' && row.worker ? (
|
||||
<Button
|
||||
danger
|
||||
icon={<UndoOutlined />}
|
||||
onClick={() => openCancelModal(row)}
|
||||
>
|
||||
<Button danger icon={<UndoOutlined />} onClick={() => openCancelModal(row)}>
|
||||
撤单
|
||||
</Button>
|
||||
) : null}
|
||||
{['pending_material', 'in_progress'].includes(row.status) ? (
|
||||
<Button
|
||||
icon={<FormOutlined />}
|
||||
onClick={() => openMaterialModal(row)}
|
||||
>
|
||||
<Button icon={<FormOutlined />} onClick={() => openMaterialModal(row)}>
|
||||
{row.status === 'in_progress' ? '更新资料' : '补资料'}
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -838,9 +804,7 @@ export default function WorkOrdersPanel() {
|
||||
icon={<SendOutlined />}
|
||||
disabled={Number(row.rewardAmount || 0) <= 0}
|
||||
title={
|
||||
Number(row.rewardAmount || 0) <= 0
|
||||
? '接单金额为 0,不能发布到大厅'
|
||||
: undefined
|
||||
Number(row.rewardAmount || 0) <= 0 ? '接单金额为 0,不能发布到大厅' : undefined
|
||||
}
|
||||
onClick={() => confirmPublishWorkOrder(row)}
|
||||
>
|
||||
@@ -871,10 +835,7 @@ export default function WorkOrdersPanel() {
|
||||
okText: '确认下架',
|
||||
cancelText: '取消',
|
||||
onOk: () =>
|
||||
runAction(
|
||||
() => unpublishAdminWorkOrder(row.workOrderId),
|
||||
'订单已撤回到未分配',
|
||||
),
|
||||
runAction(() => unpublishAdminWorkOrder(row.workOrderId), '订单已撤回到未分配'),
|
||||
})
|
||||
}}
|
||||
>
|
||||
@@ -885,31 +846,18 @@ export default function WorkOrdersPanel() {
|
||||
<Button
|
||||
icon={<CheckOutlined />}
|
||||
type="primary"
|
||||
onClick={() =>
|
||||
runAction(
|
||||
() => acceptAdminWorkOrder(row.workOrderId),
|
||||
'已验收通过',
|
||||
)
|
||||
}
|
||||
onClick={() => runAction(() => acceptAdminWorkOrder(row.workOrderId), '已验收通过')}
|
||||
>
|
||||
验收
|
||||
</Button>
|
||||
) : null}
|
||||
{row.status === 'accepted' && Number(row.pendingUnfreezeAmount || 0) > 0 ? (
|
||||
<Button
|
||||
icon={<WarningOutlined />}
|
||||
danger
|
||||
onClick={() => openDeductModal(row)}
|
||||
>
|
||||
<Button icon={<WarningOutlined />} danger onClick={() => openDeductModal(row)}>
|
||||
扣押金
|
||||
</Button>
|
||||
) : null}
|
||||
{['in_progress', 'pending_acceptance'].includes(row.status) ? (
|
||||
<Button
|
||||
icon={<WarningOutlined />}
|
||||
danger
|
||||
onClick={() => setProblemOrder(row)}
|
||||
>
|
||||
<Button icon={<WarningOutlined />} danger onClick={() => setProblemOrder(row)}>
|
||||
问题单
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -1078,9 +1026,7 @@ export default function WorkOrdersPanel() {
|
||||
<Descriptions.Item label="订单子项 ID">
|
||||
{detailOrder.orderItemId || '-'}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="商品">
|
||||
{detailOrder.productName || '-'}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="商品">{detailOrder.productName || '-'}</Descriptions.Item>
|
||||
<Descriptions.Item label="分类">
|
||||
{detailOrder.categoryName || '-'}
|
||||
</Descriptions.Item>
|
||||
@@ -1090,9 +1036,7 @@ export default function WorkOrdersPanel() {
|
||||
</Tag>
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="打手">
|
||||
{detailOrder.worker?.displayName ||
|
||||
detailOrder.worker?.username ||
|
||||
'-'}
|
||||
{detailOrder.worker?.displayName || detailOrder.worker?.username || '-'}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label="接单金额">
|
||||
{formatMoney(detailOrder.rewardAmount)}
|
||||
@@ -1111,10 +1055,7 @@ export default function WorkOrdersPanel() {
|
||||
<Descriptions.Item label="超时截止">
|
||||
{detailOrder.deadlineAt ? (
|
||||
<Space wrap size={8}>
|
||||
<DeadlineCountdown
|
||||
deadlineAt={detailOrder.deadlineAt}
|
||||
showExpired
|
||||
/>
|
||||
<DeadlineCountdown deadlineAt={detailOrder.deadlineAt} showExpired />
|
||||
<Typography.Text type="secondary">
|
||||
{formatAdminDateTime(detailOrder.deadlineAt)}
|
||||
</Typography.Text>
|
||||
@@ -1150,10 +1091,7 @@ export default function WorkOrdersPanel() {
|
||||
</Card>
|
||||
|
||||
<Card title="资料信息" size="small">
|
||||
{renderDetailFieldValues(
|
||||
getMaterialDetailItems(detailOrder),
|
||||
'当前还没有填写资料',
|
||||
)}
|
||||
{renderDetailFieldValues(getMaterialDetailItems(detailOrder), '当前还没有填写资料')}
|
||||
<div style={{ marginTop: 12 }}>
|
||||
<Typography.Text type="secondary">买家主页截图</Typography.Text>
|
||||
<div style={{ marginTop: 8 }}>
|
||||
@@ -1186,9 +1124,7 @@ export default function WorkOrdersPanel() {
|
||||
size={72}
|
||||
/>
|
||||
) : (
|
||||
<Typography.Text type="secondary">
|
||||
暂无验收图
|
||||
</Typography.Text>
|
||||
<Typography.Text type="secondary">暂无验收图</Typography.Text>
|
||||
)}
|
||||
</div>
|
||||
</Card>
|
||||
@@ -1282,12 +1218,7 @@ export default function WorkOrdersPanel() {
|
||||
name="timeoutMinutes"
|
||||
tooltip="打手抢单后开始计时,超时由系统自动按策略处置;0 表示不限时"
|
||||
>
|
||||
<InputNumber
|
||||
min={0}
|
||||
step={5}
|
||||
addonAfter="分钟"
|
||||
style={{ width: 160 }}
|
||||
/>
|
||||
<InputNumber min={0} step={5} addonAfter="分钟" style={{ width: 160 }} />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="超时策略"
|
||||
@@ -1454,10 +1385,7 @@ export default function WorkOrdersPanel() {
|
||||
rules={[
|
||||
({ getFieldValue }) => ({
|
||||
validator(_, value) {
|
||||
if (
|
||||
getFieldValue('action') !== 'cancel_order' ||
|
||||
String(value || '').trim()
|
||||
) {
|
||||
if (getFieldValue('action') !== 'cancel_order' || String(value || '').trim()) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
return Promise.reject(new Error('取消订单时请填写退款或撤单原因'))
|
||||
@@ -1465,10 +1393,7 @@ export default function WorkOrdersPanel() {
|
||||
}),
|
||||
]}
|
||||
>
|
||||
<Input.TextArea
|
||||
rows={3}
|
||||
placeholder="取消订单时请填写退款原因;退回大厅可选填"
|
||||
/>
|
||||
<Input.TextArea rows={3} placeholder="取消订单时请填写退款原因;退回大厅可选填" />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
) : null}
|
||||
@@ -1658,9 +1583,7 @@ export default function WorkOrdersPanel() {
|
||||
min={0.01}
|
||||
step={1}
|
||||
addonAfter="元"
|
||||
onChange={(value) =>
|
||||
syncSharingForm({ unitReward: Number(value) || 0 })
|
||||
}
|
||||
onChange={(value) => syncSharingForm({ unitReward: Number(value) || 0 })}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
@@ -1673,9 +1596,7 @@ export default function WorkOrdersPanel() {
|
||||
min={0.01}
|
||||
step={1}
|
||||
addonAfter="元"
|
||||
onChange={(value) =>
|
||||
syncSharingForm({ totalAmount: Number(value) || 0 })
|
||||
}
|
||||
onChange={(value) => syncSharingForm({ totalAmount: Number(value) || 0 })}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Space>
|
||||
@@ -1717,9 +1638,7 @@ export default function WorkOrdersPanel() {
|
||||
{
|
||||
title: '提交时间',
|
||||
render: (_, share) =>
|
||||
share.submittedAt
|
||||
? formatAdminDateTime(share.submittedAt)
|
||||
: '-',
|
||||
share.submittedAt ? formatAdminDateTime(share.submittedAt) : '-',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
@@ -1910,7 +1829,9 @@ function AmountEditableCell({
|
||||
content: (
|
||||
<span>
|
||||
该订单用户付款 {formatMoney(paymentFen)},发单金额{' '}
|
||||
<Typography.Text strong type="danger">{formatMoney(nextFen)}</Typography.Text>
|
||||
<Typography.Text strong type="danger">
|
||||
{formatMoney(nextFen)}
|
||||
</Typography.Text>
|
||||
,本单平台将亏损。确认保存?
|
||||
</span>
|
||||
),
|
||||
@@ -2002,9 +1923,7 @@ function formatRequirementFieldsText(fields: CollectField[]): string {
|
||||
.map((field) => {
|
||||
const labelPart = `${field.key}:${field.label}`
|
||||
const options = (field.options || []).filter(Boolean)
|
||||
return options.length > 0
|
||||
? `${labelPart}#${options.join(',')}`
|
||||
: labelPart
|
||||
return options.length > 0 ? `${labelPart}#${options.join(',')}` : labelPart
|
||||
})
|
||||
.join('\n')
|
||||
}
|
||||
@@ -2069,12 +1988,7 @@ function MockWorkOrderForm({ onCreated }: { onCreated: () => Promise<void> }) {
|
||||
<Switch />
|
||||
</Form.Item>
|
||||
<Form.Item className="worker-order-mock-action">
|
||||
<Button
|
||||
type="primary"
|
||||
icon={<PlusOutlined />}
|
||||
htmlType="submit"
|
||||
loading={loading}
|
||||
>
|
||||
<Button type="primary" icon={<PlusOutlined />} htmlType="submit" loading={loading}>
|
||||
生成
|
||||
</Button>
|
||||
</Form.Item>
|
||||
|
||||
@@ -76,10 +76,7 @@ import type {
|
||||
WorkerLevel,
|
||||
WorkerUser,
|
||||
} from '@/types/worker-platform'
|
||||
import {
|
||||
ADMIN_DEFAULT_PAGE_SIZE,
|
||||
buildAdminTablePagination,
|
||||
} from '@/utils/admin-pagination'
|
||||
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
import { formatMoney, formatWorkerStatus } from './shared'
|
||||
|
||||
@@ -189,9 +186,7 @@ export default function WorkersPanel() {
|
||||
render: (_, row) => (
|
||||
<div className="cell-stack">
|
||||
<Space size={6} wrap>
|
||||
<Typography.Text strong>
|
||||
{row.displayName || row.username}
|
||||
</Typography.Text>
|
||||
<Typography.Text strong>{row.displayName || row.username}</Typography.Text>
|
||||
<Tag color={row.workerType === 'internal' ? 'blue' : 'default'}>
|
||||
{row.workerType === 'internal' ? '内部' : '外部'}
|
||||
</Tag>
|
||||
@@ -368,17 +363,8 @@ export default function WorkersPanel() {
|
||||
destroyOnHidden
|
||||
>
|
||||
<Form form={creditForm} layout="vertical" onFinish={submitCredit}>
|
||||
<Form.Item
|
||||
label="金额"
|
||||
name="amount"
|
||||
rules={[{ required: true, message: '请输入金额' }]}
|
||||
>
|
||||
<InputNumber
|
||||
min={0.01}
|
||||
step={10}
|
||||
addonAfter="元"
|
||||
className="full-width"
|
||||
/>
|
||||
<Form.Item label="金额" name="amount" rules={[{ required: true, message: '请输入金额' }]}>
|
||||
<InputNumber min={0.01} step={10} addonAfter="元" className="full-width" />
|
||||
</Form.Item>
|
||||
<Form.Item label="备注" name="note">
|
||||
<Input />
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
import { Descriptions, Space, Tag, Typography } from 'antd'
|
||||
import ImagePreviewList from '@/components/files/ImagePreviewList'
|
||||
import {
|
||||
DeadlineCountdown,
|
||||
formatTimeoutPolicyLabel,
|
||||
} from '@/components/DeadlineCountdown'
|
||||
import { DeadlineCountdown, formatTimeoutPolicyLabel } from '@/components/DeadlineCountdown'
|
||||
import type { CollectField, UploadedFile, WorkOrder, WorkOrderShare } from '@/types/worker-platform'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
|
||||
@@ -19,9 +16,7 @@ type MappedRequirementField = {
|
||||
|
||||
export function getRequirementFields(order: WorkOrder | null): CollectField[] {
|
||||
if (!order) return []
|
||||
const rawFields = Array.isArray(order.requirement?.fields)
|
||||
? order.requirement.fields
|
||||
: []
|
||||
const rawFields = Array.isArray(order.requirement?.fields) ? order.requirement.fields : []
|
||||
return rawFields
|
||||
.map((item) => {
|
||||
const source = asRecord(item)
|
||||
@@ -83,10 +78,7 @@ export function getMaterialDetailItems(order: WorkOrder): DetailFieldItem[] {
|
||||
return items
|
||||
}
|
||||
|
||||
export function renderDetailFieldValues(
|
||||
items: DetailFieldItem[],
|
||||
emptyText: string,
|
||||
) {
|
||||
export function renderDetailFieldValues(items: DetailFieldItem[], emptyText: string) {
|
||||
if (items.length === 0) {
|
||||
return <Typography.Text type="secondary">{emptyText}</Typography.Text>
|
||||
}
|
||||
@@ -139,9 +131,7 @@ export function renderMaterialSummary(order: WorkOrder) {
|
||||
getRequirementFields(order).map((field) => [field.key, field.label]),
|
||||
)
|
||||
const fields = getMaterialFields(order)
|
||||
const entries = Object.entries(fields).filter(([, value]) =>
|
||||
String(value || '').trim(),
|
||||
)
|
||||
const entries = Object.entries(fields).filter(([, value]) => String(value || '').trim())
|
||||
const screenshots = getMaterialScreenshots(order)
|
||||
if (entries.length === 0 && screenshots.length === 0) {
|
||||
return <Typography.Text type="secondary">-</Typography.Text>
|
||||
@@ -154,9 +144,7 @@ export function renderMaterialSummary(order: WorkOrder) {
|
||||
{fieldLabelMap.get(key) || key}: {value}
|
||||
</Typography.Text>
|
||||
))}
|
||||
{screenshots.length > 0 ? (
|
||||
<ImagePreviewList files={screenshots} size={36} />
|
||||
) : null}
|
||||
{screenshots.length > 0 ? <ImagePreviewList files={screenshots} size={36} /> : null}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -167,17 +155,13 @@ export function getAcceptanceFiles(row: WorkOrder): UploadedFile[] {
|
||||
|
||||
export function getAcceptanceImageUrls(row: WorkOrder): string[] {
|
||||
return Array.isArray(row.acceptance?.imageUrls)
|
||||
? row.acceptance.imageUrls
|
||||
.map((item) => String(item || '').trim())
|
||||
.filter(Boolean)
|
||||
? row.acceptance.imageUrls.map((item) => String(item || '').trim()).filter(Boolean)
|
||||
: []
|
||||
}
|
||||
|
||||
export function getAcceptanceSubmittedAt(order: WorkOrder): string | null {
|
||||
const acceptanceSubmittedAt =
|
||||
typeof order.acceptance?.submittedAt === 'string'
|
||||
? order.acceptance.submittedAt
|
||||
: null
|
||||
typeof order.acceptance?.submittedAt === 'string' ? order.acceptance.submittedAt : null
|
||||
return order.submittedAt || acceptanceSubmittedAt || null
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user