diff --git a/apps/backend/src/services/worker-platform/admin-service.ts b/apps/backend/src/services/worker-platform/admin-service.ts index 0dacfebb..3c119796 100644 --- a/apps/backend/src/services/worker-platform/admin-service.ts +++ b/apps/backend/src/services/worker-platform/admin-service.ts @@ -754,6 +754,16 @@ export async function submitAdminWorkOrderMaterial( errorCode: 'work_order_material_status_invalid', }) } + if ( + workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS && + workOrder.sharing_enabled === true && + payload.rewardAmount !== undefined + ) { + throw createHttpError('拼单订单的份额奖励已锁定,不能在更新资料时修改价格', { + statusCode: 409, + errorCode: 'work_order_material_reward_sharing_invalid', + }) + } const fields = resolveRequirementFields(workOrder) const submittedFields = normalizeSubmittedFields(payload.fields || payload.material || payload) @@ -762,6 +772,10 @@ export async function submitAdminWorkOrderMaterial( ) const now = nowIso() const screenshots = normalizeUploadedFiles(payload.screenshots || payload.files) + const rewardAmount = + workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS && payload.rewardAmount !== undefined + ? normalizeAmountFen(payload.rewardAmount, workOrder.reward_amount) + : workOrder.reward_amount const material = { ...safeParseJson(workOrder.material_json), collect: { @@ -781,6 +795,7 @@ export async function submitAdminWorkOrderMaterial( const updated = await updateWorkOrder(workOrder.id, { status: nextStatus, material_json: material, + reward_amount: rewardAmount, updated_at: now, }) await createWorkOrderEvent({ @@ -793,7 +808,7 @@ export async function submitAdminWorkOrderMaterial( : 'material_completed', fromStatus: workOrder.status, toStatus: nextStatus, - payloadJson: JSON.stringify({ fields: submittedFields, complete }), + payloadJson: JSON.stringify({ fields: submittedFields, complete, rewardAmount }), now, }) return { order: mapWorkOrderAdmin(updated || workOrder), complete } diff --git a/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx b/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx index 6d45344b..03e0e5c2 100644 --- a/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx +++ b/apps/frontend/src/pages/admin/panels/WorkOrdersPanel.tsx @@ -126,6 +126,11 @@ const FILTERABLE_WORK_ORDER_STATUSES = [ 'cancelled', ] as const +type MaterialFormValues = { + fields?: Record + rewardAmount?: number +} + export default function WorkOrdersPanel() { const { message, modal } = App.useApp() const navigate = useNavigate() @@ -151,7 +156,7 @@ export default function WorkOrdersPanel() { const [deductOrder, setDeductOrder] = useState(null) const [problemForm] = Form.useForm() const [resolutionForm] = Form.useForm() - const [materialForm] = Form.useForm() + const [materialForm] = Form.useForm() const [deductForm] = Form.useForm<{ amount?: number; note?: string }>() const [editForm] = Form.useForm<{ productName?: string @@ -378,7 +383,7 @@ export default function WorkOrdersPanel() { resolutionForm.resetFields() } - async function submitMaterial(values: { fields?: Record }) { + async function submitMaterial(values: MaterialFormValues) { if (!materialOrder) return const succeeded = await runAction( () => @@ -386,6 +391,9 @@ export default function WorkOrdersPanel() { materialOrder.workOrderId, values.fields || {}, materialScreenshots, + materialOrder.status === 'in_progress' && !materialOrder.sharing?.enabled + ? Number(values.rewardAmount || 0) + : undefined, ), materialOrder.status === 'in_progress' ? '订单资料已更新' : '订单资料已保存', ) @@ -410,7 +418,10 @@ export default function WorkOrdersPanel() { function openMaterialModal(row: WorkOrder) { setMaterialOrder(row) - materialForm.setFieldsValue({ fields: getMaterialFields(row) }) + materialForm.setFieldsValue({ + fields: getMaterialFields(row), + rewardAmount: Math.round(Number(row.rewardAmount || 0)) / 100, + }) setMaterialScreenshots(getMaterialScreenshots(row)) } @@ -1320,6 +1331,15 @@ export default function WorkOrdersPanel() { destroyOnHidden >
+ {materialOrder?.status === 'in_progress' && !materialOrder.sharing?.enabled ? ( + + + + ) : null} , screenshots?: UploadedFile[], + rewardAmount?: number, ) { return apiPost<{ order: WorkOrder; complete: boolean }>( `/api/v1/admin/worker-platform/orders/${workOrderId}/material`, - { fields, screenshots }, + { fields, screenshots, rewardAmount }, ) }