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