feat: update report detail and verification flow

This commit is contained in:
wushumin
2026-05-22 13:31:02 +08:00
parent b98d6164a7
commit be64b8e5b7
14 changed files with 1336 additions and 282 deletions

View File

@@ -461,12 +461,21 @@ class AppraisalTasksController
$reportNo = trim((string)$request->input('zhongjian_report_no', ''));
$qrInput = trim((string)$request->input('qr_input', ''));
$files = $this->evidenceService()->normalize($request->input('report_files', []), $request, true);
$productInput = $request->input('product_info', null);
$productPayload = is_array($productInput) ? $this->normalizeProductInput($productInput) : null;
$attachments = $this->evidenceService()->normalize($request->input('attachments', []), $request, true);
$keyPoints = $this->normalizeKeyPointInput($request->input('key_points', []));
$resultText = trim((string)$request->input('result_text', ''));
$resultDesc = trim((string)$request->input('result_desc', ''));
if ($id <= 0) {
return api_error('任务 ID 不能为空', 422);
}
if ($reportNo === '') {
return api_error('中检报告编号不能为空', 422);
}
if ($resultText === '') {
return api_error('鉴定结论不能为空', 422);
}
if (!$files) {
return api_error('请至少上传 1 个中检报告文件', 422);
}
@@ -514,6 +523,15 @@ class AppraisalTasksController
$task = array_merge($task, $operatorGuard['task_update']);
}
if ($productPayload !== null) {
$this->saveOrderProductSnapshot((int)$task['order_id'], $productPayload, $now);
}
if (!$this->hasSubmittableProductInfo((int)$task['order_id'], $productPayload)) {
Db::rollback();
return api_error('提交中检报告前请先完善物品信息', 422);
}
Db::name('appraisal_tasks')->where('id', $id)->update([
'status' => 'completed',
'started_at' => $task['started_at'] ?: $now,
@@ -531,14 +549,14 @@ class AppraisalTasksController
'task_id' => $id,
'order_id' => (int)$task['order_id'],
'result_status' => 'zhongjian_report',
'result_text' => '以中检报告为准',
'result_desc' => '中检报告已回传并由平台录入。',
'result_text' => $resultText,
'result_desc' => $resultDesc,
'condition_grade' => '',
'condition_desc' => '',
'valuation_min' => 0,
'valuation_max' => 0,
'valuation_desc' => '',
'attachments_json' => json_encode($files, JSON_UNESCAPED_UNICODE),
'attachments_json' => $attachments ? json_encode($attachments, JSON_UNESCAPED_UNICODE) : null,
'external_remark' => '',
'internal_remark' => '中检报告编号:' . $reportNo,
'updated_at' => $now,
@@ -546,10 +564,12 @@ class AppraisalTasksController
$resultId = Db::name('appraisal_task_results')->where('task_id', $id)->value('id');
if ($resultId) {
Db::name('appraisal_task_results')->where('id', (int)$resultId)->update($resultPayload);
$savedResultId = (int)$resultId;
} else {
$resultPayload['created_at'] = $now;
Db::name('appraisal_task_results')->insert($resultPayload);
$savedResultId = (int)Db::name('appraisal_task_results')->insertGetId($resultPayload);
}
$this->saveTaskKeyPoints($savedResultId, $keyPoints, $now);
$this->createOrUpdateReportDraft((int)$task['order_id'], $task, $resultPayload, $now);
$report = $this->findLatestAppraisalReport((int)$task['order_id']);
@@ -578,7 +598,7 @@ class AppraisalTasksController
'order_id' => (int)$task['order_id'],
'node_code' => 'zhongjian_report_entered',
'node_text' => '中检报告已录入',
'node_desc' => '报告录入人已录入中检报告编号并上传报告文件。',
'node_desc' => '报告录入人已补全报告信息、录入中检报告编号并上传报告文件。',
'operator_type' => 'admin',
'operator_id' => $operatorId,
'occurred_at' => $now,
@@ -1814,7 +1834,7 @@ class AppraisalTasksController
'appraisal_no' => $order['appraisal_no'] ?? '',
'report_type' => 'appraisal',
'service_provider' => $task['service_provider'],
'institution_name' => $task['service_provider'] === 'zhongjian' ? '中检合作机构' : '安心验',
'institution_name' => $this->displayInstitutionName((string)$task['service_provider']),
'report_title' => $task['service_provider'] === 'zhongjian' ? '中检鉴定报告' : '安心验鉴定报告',
'report_status' => 'pending_publish',
'publish_time' => null,
@@ -1870,7 +1890,7 @@ class AppraisalTasksController
private function buildAppraisalSnapshot(string $serviceProvider, string $fallbackTime, ?array $firstReviewTask, ?array $finalReviewTask): array
{
$institutionName = $serviceProvider === 'zhongjian' ? '中检合作机构' : '安心验';
$institutionName = $this->displayInstitutionName($serviceProvider);
$appraiserName = $this->normalizeAssigneeName($firstReviewTask['assignee_name'] ?? '')
?: $this->normalizeAssigneeName($finalReviewTask['assignee_name'] ?? '');
$reviewerName = $appraiserName;
@@ -1899,6 +1919,11 @@ class AppraisalTasksController
return $name;
}
private function displayInstitutionName(string $serviceProvider): string
{
return $serviceProvider === 'zhongjian' ? '中检鉴定中心' : '安心检验';
}
private function guardTaskOperator(Request $request, array $task): array
{
$adminId = (int)$request->header('x-admin-id', 0);