支持已验收订单补图

This commit is contained in:
yml2213
2026-08-20 15:17:36 +08:00
parent 106992e7c5
commit 01a1f0cc93
2 changed files with 28 additions and 43 deletions
@@ -2100,7 +2100,7 @@ export async function remindWorkerOrderAcceptance(
}
}
/** VIP 自动验收订单在 24 小时内追加验收图片,不改变订单状态和结算结果。 */
/** 已验收订单可追加验收图片,不改变订单状态和结算结果。 */
export async function supplementWorkerAcceptedOrderEvidence(
workOrderId: number | string,
payload: JsonObject = {},
@@ -2128,20 +2128,6 @@ export async function supplementWorkerAcceptedOrderEvidence(
const now = nowIso()
const previous = safeParseJson(workOrder.acceptance_json)
if (String(previous.reviewMode || '').trim() !== 'vip_auto') {
throw createHttpError('该订单不支持验收后补图', {
statusCode: 403,
errorCode: 'work_order_evidence_supplement_not_allowed',
})
}
const evidenceDueAt = String(previous.evidenceDueAt || '').trim()
if (!evidenceDueAt || Date.parse(evidenceDueAt) <= Date.now()) {
throw createHttpError('补充验收图片已超过 24 小时时限', {
statusCode: 409,
errorCode: 'work_order_evidence_supplement_expired',
})
}
const existingFiles = normalizeUploadedFiles(previous.files)
const uploadedFiles = normalizeUploadedFiles(payload.files)
const mergedFiles = [...existingFiles]
@@ -2294,7 +2280,7 @@ async function submitWorkerSharingAcceptance(
}
}
/** VIP 拼单份额在免审核后 24 小时内补充验收图片。 */
/** 已验收拼单份额可追加验收图片,不改变订单状态和结算结果。 */
async function supplementWorkerAcceptedSharingEvidence(
workOrder: WorkOrderRow,
sharingShare: WorkOrderShareRow,
@@ -2310,20 +2296,6 @@ async function supplementWorkerAcceptedSharingEvidence(
const now = nowIso()
const previous = safeParseJson(sharingShare.acceptance_json)
if (String(previous.reviewMode || '').trim() !== 'vip_auto') {
throw createHttpError('该拼单份额不支持验收后补图', {
statusCode: 403,
errorCode: 'work_order_sharing_evidence_supplement_not_allowed',
})
}
const evidenceDueAt = String(previous.evidenceDueAt || '').trim()
if (!evidenceDueAt || Date.parse(evidenceDueAt) <= Date.now()) {
throw createHttpError('补充验收图片已超过 24 小时时限', {
statusCode: 409,
errorCode: 'work_order_sharing_evidence_supplement_expired',
})
}
const existingFiles = normalizeUploadedFiles(previous.files)
const uploadedFiles = normalizeUploadedFiles(payload.files)
const mergedFiles = [...existingFiles]
@@ -292,6 +292,13 @@ export default function WorkerOrdersPage() {
function openAcceptanceModal(order: WorkOrder) {
markOrderAsRead(order)
setEditingOrder(order)
if (canSupplementAcceptedEvidence(order)) {
// 已验收补图只上传新增文件,原有验收图片由服务端保留。
setAcceptanceFiles([])
form.resetFields()
setDetailOrder(null)
return
}
// 已提交:以已提交的验收资料为初始内容;未提交:以暂存草稿为初始内容
const source = hasSubmittedAcceptance(order)
? getWorkerAcceptance(order)
@@ -1307,18 +1314,25 @@ export default function WorkerOrdersPage() {
}
>
<Form form={form} layout="vertical" onFinish={submitAcceptance}>
<Form.Item label="完成说明" name="note">
<Input.TextArea rows={3} placeholder="可补充代练结果、注意事项或截图说明。" />
</Form.Item>
{!editingOrder || !canSupplementAcceptedEvidence(editingOrder) ? (
<Form.Item label="完成说明" name="note">
<Input.TextArea rows={3} placeholder="可补充代练结果、注意事项或截图说明。" />
</Form.Item>
) : null}
<Form.Item
label="验收图片"
required={
!editingOrder || !canAutoAcceptOrder(editingOrder, workerCanAutoAcceptWithoutEvidence)
!editingOrder ||
canSupplementAcceptedEvidence(editingOrder) ||
!canAutoAcceptOrder(editingOrder, workerCanAutoAcceptWithoutEvidence)
}
extra={
editingOrder && canAutoAcceptOrder(editingOrder, workerCanAutoAcceptWithoutEvidence)
? 'VIP 免审核可先提交,验收后需在 24 小时内补充图片。'
: undefined
editingOrder && canSupplementAcceptedEvidence(editingOrder)
? '仅可追加新图片,原有验收图片会保留。'
: editingOrder &&
canAutoAcceptOrder(editingOrder, workerCanAutoAcceptWithoutEvidence)
? 'VIP 免审核可先提交,验收后需在 24 小时内补充图片。'
: undefined
}
>
<ImageUpload
@@ -1375,10 +1389,7 @@ function canAutoAcceptOrder(order: WorkOrder, workerCanAutoAcceptWithoutEvidence
}
function canSupplementAcceptedEvidence(order: WorkOrder) {
const acceptance = getWorkerAcceptance(order)
if (order.status !== 'accepted' || acceptance?.reviewMode !== 'vip_auto') return false
const dueAt = Date.parse(String(acceptance.evidenceDueAt || ''))
return Number.isFinite(dueAt) && dueAt > Date.now()
return order.status === 'accepted'
}
function isVipEvidencePending(order: WorkOrder) {
@@ -1389,7 +1400,9 @@ function isVipEvidencePending(order: WorkOrder) {
/** 是否可编辑验收图片:未提交时可暂存,已提交(待验收)时可补充/修改 */
function canEditAcceptanceImages(order: WorkOrder) {
if (order.myShare) {
return ['joined', 'submitted'].includes(order.myShare.status) && order.status !== 'accepted'
return (
['joined', 'submitted'].includes(order.myShare.status) || canSupplementAcceptedEvidence(order)
)
}
return (
['in_progress', 'problem', 'pending_acceptance'].includes(order.status) ||
@@ -1402,7 +1415,7 @@ function hasSubmittedAcceptance(order: WorkOrder) {
if (order.myShare) {
return order.myShare.status === 'submitted'
}
return order.status === 'pending_acceptance' || order.acceptance?.reviewMode === 'vip_auto'
return order.status === 'pending_acceptance' || order.status === 'accepted'
}
function getDisplayOrderNo(order: Pick<WorkOrder, 'platformOrderId'> | null | undefined): string {