feat: 订单资料图片完整展示与打手快捷复制

- 修复资料截图 URL 过期问题:读取工单时统一重签截图访问链接(后台/打手端/收集页)
- 修复后台手动补资料截图从未保存的问题(提交真实上传列表)
- 收集页提交后回显已上传截图,补资料弹窗重开回显已有截图
- 打手端我的订单新增快捷复制:复制信息(多行标签:值)+ 一键复制图片(JPEG 自动转 PNG)
- 快捷复制列与后台资料列同款展示:全字段逐行 + 截图缩略图
- 后台接单工单资料列优化:显示全部字段与截图缩略图
- 详情抽屉移除冗余的资料要求卡片
This commit is contained in:
yml2213
2026-08-14 18:13:21 +08:00
parent 85fa8f11fd
commit f2e08a4fbc
6 changed files with 191 additions and 47 deletions
@@ -102,7 +102,6 @@ import {
getRequirementFields,
renderDetailFieldValues,
renderMaterialSummary,
renderRequirementFieldValues,
asRecord,
formatMoney,
formatSharingShareStatus,
@@ -332,17 +331,14 @@ export default function WorkOrdersPanel() {
resolutionForm.resetFields()
}
async function submitMaterial(values: {
fields?: Record<string, string>
screenshots?: UploadedFile[]
}) {
async function submitMaterial(values: { fields?: Record<string, string> }) {
if (!materialOrder) return
const succeeded = await runAction(
() =>
submitAdminWorkOrderMaterial(
materialOrder.workOrderId,
values.fields || {},
values.screenshots || [],
materialScreenshots,
),
'订单资料已保存',
)
@@ -367,7 +363,7 @@ export default function WorkOrdersPanel() {
function openMaterialModal(row: WorkOrder) {
setMaterialOrder(row)
materialForm.setFieldsValue({ fields: getMaterialFields(row) })
setMaterialScreenshots([])
setMaterialScreenshots(getMaterialScreenshots(row))
}
function openDetailDrawer(row: WorkOrder) {
@@ -590,7 +586,7 @@ export default function WorkOrdersPanel() {
},
{
title: '资料',
width: 160,
width: 240,
render: (_, row) => renderMaterialSummary(row),
},
{
@@ -929,10 +925,6 @@ export default function WorkOrdersPanel() {
</div>
</Card>
<Card title="资料要求" size="small">
{renderRequirementFieldValues(detailOrder)}
</Card>
<Card title="验收信息" size="small">
<div className="worker-order-detail-stack">
<Descriptions column={{ xs: 1, md: 2 }} bordered size="small">
@@ -1190,6 +1182,7 @@ export default function WorkOrdersPanel() {
setMaterialOrder(null)
setMaterialPasteText('')
materialForm.resetFields()
setMaterialScreenshots([])
}}
onOk={() => materialForm.submit()}
destroyOnHidden
@@ -142,21 +142,20 @@ export function renderMaterialSummary(order: WorkOrder) {
const entries = Object.entries(fields).filter(([, value]) =>
String(value || '').trim(),
)
if (entries.length === 0) {
const screenshots = getMaterialScreenshots(order)
if (entries.length === 0 && screenshots.length === 0) {
return <Typography.Text type="secondary">-</Typography.Text>
}
return (
<div className="cell-stack">
{entries.slice(0, 2).map(([key, value]) => (
<Typography.Text key={key} ellipsis>
{entries.map(([key, value]) => (
<Typography.Text key={key} style={{ fontSize: 12 }} ellipsis>
{fieldLabelMap.get(key) || key}: {value}
</Typography.Text>
))}
{entries.length > 2 ? (
<Typography.Text type="secondary">
{entries.length - 2}
</Typography.Text>
{screenshots.length > 0 ? (
<ImagePreviewList files={screenshots} size={36} />
) : null}
</div>
)