feat: 支持验收图片暂存
This commit is contained in:
@@ -144,6 +144,7 @@ export type WorkOrderShareRow = {
|
||||
share_deposit: number
|
||||
status: string
|
||||
acceptance_json: string | Record<string, unknown>
|
||||
draft_acceptance_json: string | Record<string, unknown>
|
||||
submitted_at: string | null
|
||||
accepted_at: string | null
|
||||
created_at: string
|
||||
@@ -170,6 +171,7 @@ export type WorkOrderRow = {
|
||||
material_json: string | Record<string, unknown>
|
||||
requirement_json: string | Record<string, unknown>
|
||||
acceptance_json: string | Record<string, unknown>
|
||||
draft_acceptance_json: string | Record<string, unknown>
|
||||
problem_note: string
|
||||
sharing_enabled: boolean
|
||||
sharing_total_quantity: number
|
||||
|
||||
@@ -250,12 +250,23 @@ export async function submitWorkOrderShareAcceptance(input: {
|
||||
now: string
|
||||
}): Promise<{ share: WorkOrderShareRow | null; failureReason: 'share_not_found' | 'share_status_invalid' | null }> {
|
||||
return withTransaction(async (client) => {
|
||||
const shareResult = await client.query<WorkOrderShareRow>(
|
||||
`${WORK_ORDER_SHARE_SELECT}
|
||||
WHERE wos.work_order_id = $1 AND wos.worker_id = $2
|
||||
FOR UPDATE`,
|
||||
const lockResult = await client.query<{ id: number }>(
|
||||
`
|
||||
SELECT id
|
||||
FROM work_order_shares
|
||||
WHERE work_order_id = $1 AND worker_id = $2
|
||||
FOR UPDATE
|
||||
`,
|
||||
[input.workOrderId, input.workerId],
|
||||
)
|
||||
const shareId = lockResult.rows[0]?.id || 0
|
||||
if (!shareId) {
|
||||
return { share: null, failureReason: 'share_not_found' }
|
||||
}
|
||||
const shareResult = await client.query<WorkOrderShareRow>(
|
||||
`${WORK_ORDER_SHARE_SELECT} WHERE wos.id = $1 LIMIT 1`,
|
||||
[shareId],
|
||||
)
|
||||
const share = shareResult.rows[0] || null
|
||||
if (!share) {
|
||||
return { share: null, failureReason: 'share_not_found' }
|
||||
@@ -266,7 +277,7 @@ export async function submitWorkOrderShareAcceptance(input: {
|
||||
await client.query(
|
||||
`
|
||||
UPDATE work_order_shares
|
||||
SET status = 'submitted', acceptance_json = $1::jsonb, submitted_at = $2, updated_at = $2
|
||||
SET status = 'submitted', acceptance_json = $1::jsonb, draft_acceptance_json = '{}'::jsonb, submitted_at = $2, updated_at = $2
|
||||
WHERE id = $3
|
||||
`,
|
||||
[input.acceptanceJson, input.now, Number(share.id)],
|
||||
@@ -289,6 +300,90 @@ export async function submitWorkOrderShareAcceptance(input: {
|
||||
})
|
||||
}
|
||||
|
||||
/** 保存整单验收草稿(暂存图片/说明),不改变工单状态 */
|
||||
export async function updateWorkOrderDraftAcceptance(input: {
|
||||
workOrderId: number
|
||||
draftJson: string
|
||||
now: string
|
||||
}): Promise<WorkOrderRow | null> {
|
||||
await query(
|
||||
`
|
||||
UPDATE work_orders
|
||||
SET draft_acceptance_json = $1::jsonb, updated_at = $2
|
||||
WHERE id = $3
|
||||
`,
|
||||
[input.draftJson, input.now, Number(input.workOrderId)],
|
||||
)
|
||||
return getWorkOrderById(input.workOrderId)
|
||||
}
|
||||
|
||||
/** 更新整单已提交的验收资料(保留原 submitted_at,用于提交验收后补充/修改图片) */
|
||||
export async function updateWorkOrderAcceptanceRecord(input: {
|
||||
workOrderId: number
|
||||
acceptanceJson: string
|
||||
now: string
|
||||
}): Promise<WorkOrderRow | null> {
|
||||
await query(
|
||||
`
|
||||
UPDATE work_orders
|
||||
SET acceptance_json = $1::jsonb, updated_at = $2
|
||||
WHERE id = $3
|
||||
`,
|
||||
[input.acceptanceJson, input.now, Number(input.workOrderId)],
|
||||
)
|
||||
return getWorkOrderById(input.workOrderId)
|
||||
}
|
||||
|
||||
/** 保存拼单份额的验收草稿(暂存图片/说明),不改变份额状态 */
|
||||
export async function updateWorkOrderShareDraftAcceptance(input: {
|
||||
workOrderId: number
|
||||
workerId: number
|
||||
draftJson: string
|
||||
now: string
|
||||
}): Promise<WorkOrderShareRow | null> {
|
||||
const result = await query<WorkOrderShareRow>(
|
||||
`${WORK_ORDER_SHARE_SELECT}
|
||||
WHERE wos.work_order_id = $1 AND wos.worker_id = $2`,
|
||||
[Number(input.workOrderId), Number(input.workerId)],
|
||||
)
|
||||
const share = result.rows[0] || null
|
||||
if (!share) return null
|
||||
await query(
|
||||
`
|
||||
UPDATE work_order_shares
|
||||
SET draft_acceptance_json = $1::jsonb, updated_at = $2
|
||||
WHERE id = $3
|
||||
`,
|
||||
[input.draftJson, input.now, Number(share.id)],
|
||||
)
|
||||
return getWorkOrderShareById(share.id)
|
||||
}
|
||||
|
||||
/** 更新拼单份额已提交的验收资料(保留原 submitted_at,用于提交验收后补充/修改图片) */
|
||||
export async function updateWorkOrderShareAcceptanceRecord(input: {
|
||||
workOrderId: number
|
||||
workerId: number
|
||||
acceptanceJson: string
|
||||
now: string
|
||||
}): Promise<WorkOrderShareRow | null> {
|
||||
const result = await query<WorkOrderShareRow>(
|
||||
`${WORK_ORDER_SHARE_SELECT}
|
||||
WHERE wos.work_order_id = $1 AND wos.worker_id = $2`,
|
||||
[Number(input.workOrderId), Number(input.workerId)],
|
||||
)
|
||||
const share = result.rows[0] || null
|
||||
if (!share) return null
|
||||
await query(
|
||||
`
|
||||
UPDATE work_order_shares
|
||||
SET acceptance_json = $1::jsonb, updated_at = $2
|
||||
WHERE id = $3
|
||||
`,
|
||||
[input.acceptanceJson, input.now, Number(share.id)],
|
||||
)
|
||||
return getWorkOrderShareById(share.id)
|
||||
}
|
||||
|
||||
export async function getWorkCategoryByKey(categoryKey: string): Promise<WorkCategoryRow | null> {
|
||||
const result = await query<WorkCategoryRow>(
|
||||
'SELECT * FROM work_categories WHERE category_key = $1 LIMIT 1',
|
||||
@@ -642,6 +737,7 @@ export async function updateWorkOrder(
|
||||
| 'assigned_worker_id'
|
||||
| 'material_json'
|
||||
| 'acceptance_json'
|
||||
| 'draft_acceptance_json'
|
||||
| 'problem_note'
|
||||
| 'reward_amount'
|
||||
| 'sharing_enabled'
|
||||
@@ -666,23 +762,25 @@ export async function updateWorkOrder(
|
||||
assigned_worker_id = $2,
|
||||
material_json = $3::jsonb,
|
||||
acceptance_json = $4::jsonb,
|
||||
problem_note = $5,
|
||||
reward_amount = $6,
|
||||
sharing_enabled = $7,
|
||||
sharing_total_quantity = $8,
|
||||
sharing_unit_reward = $9,
|
||||
published_at = $10,
|
||||
assigned_at = $11,
|
||||
submitted_at = $12,
|
||||
accepted_at = $13,
|
||||
updated_at = $14
|
||||
WHERE id = $15
|
||||
draft_acceptance_json = $5::jsonb,
|
||||
problem_note = $6,
|
||||
reward_amount = $7,
|
||||
sharing_enabled = $8,
|
||||
sharing_total_quantity = $9,
|
||||
sharing_unit_reward = $10,
|
||||
published_at = $11,
|
||||
assigned_at = $12,
|
||||
submitted_at = $13,
|
||||
accepted_at = $14,
|
||||
updated_at = $15
|
||||
WHERE id = $16
|
||||
`,
|
||||
[
|
||||
next.status,
|
||||
next.assigned_worker_id || null,
|
||||
toJsonString(next.material_json),
|
||||
toJsonString(next.acceptance_json),
|
||||
toJsonString(next.draft_acceptance_json),
|
||||
next.problem_note || '',
|
||||
toPositiveInteger(next.reward_amount, 0),
|
||||
next.sharing_enabled === true,
|
||||
|
||||
Reference in New Issue
Block a user