统一前后端代码格式化配置

This commit is contained in:
yml2213
2026-08-16 17:27:12 +08:00
parent 8705f6a6a1
commit 5c7c3e14e3
278 changed files with 6386 additions and 5500 deletions
@@ -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
}