fix: sync material tag on report publish
This commit is contained in:
@@ -2150,6 +2150,8 @@ class AppraisalTasksController
|
|||||||
$verify = $this->createOrUpdateVerifyRecord($report, $now);
|
$verify = $this->createOrUpdateVerifyRecord($report, $now);
|
||||||
|
|
||||||
if (($report['report_type'] ?? 'appraisal') === 'appraisal' && (int)($report['order_id'] ?? 0) > 0) {
|
if (($report['report_type'] ?? 'appraisal') === 'appraisal' && (int)($report['order_id'] ?? 0) > 0) {
|
||||||
|
(new MaterialTagService())->syncBoundTagForReport($report, $request);
|
||||||
|
|
||||||
Db::name('orders')->where('id', (int)$report['order_id'])->update([
|
Db::name('orders')->where('id', (int)$report['order_id'])->update([
|
||||||
'order_status' => 'report_published',
|
'order_status' => 'report_published',
|
||||||
'display_status' => '报告已出具',
|
'display_status' => '报告已出具',
|
||||||
|
|||||||
@@ -435,8 +435,10 @@ class ReportsController
|
|||||||
$effectivePublishTime = $report['publish_time'] ?: $now;
|
$effectivePublishTime = $report['publish_time'] ?: $now;
|
||||||
$isOrderAppraisalReport = ($report['report_type'] ?? 'appraisal') === 'appraisal' && (int)($report['order_id'] ?? 0) > 0;
|
$isOrderAppraisalReport = ($report['report_type'] ?? 'appraisal') === 'appraisal' && (int)($report['order_id'] ?? 0) > 0;
|
||||||
$materialTag = null;
|
$materialTag = null;
|
||||||
|
$materialTagService = new MaterialTagService();
|
||||||
if ($isOrderAppraisalReport) {
|
if ($isOrderAppraisalReport) {
|
||||||
$materialTag = (new MaterialTagService())->findBoundTagForReport($id);
|
$materialTag = $materialTagService->findBoundTagForReport($id)
|
||||||
|
?: $materialTagService->syncBoundTagForReport($report, $request);
|
||||||
if (!$materialTag) {
|
if (!$materialTag) {
|
||||||
if ($qrInput === '') {
|
if ($qrInput === '') {
|
||||||
Db::rollback();
|
Db::rollback();
|
||||||
@@ -452,7 +454,7 @@ class ReportsController
|
|||||||
return api_error('报告未关联鉴定任务,不能绑定吊牌发布', 422);
|
return api_error('报告未关联鉴定任务,不能绑定吊牌发布', 422);
|
||||||
}
|
}
|
||||||
|
|
||||||
$materialTag = (new MaterialTagService())->bindTagToReportByTask((int)$task['id'], $qrInput, $request);
|
$materialTag = $materialTagService->bindTagToReportByTask((int)$task['id'], $qrInput, $request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,6 +478,7 @@ class ReportsController
|
|||||||
|
|
||||||
if ($isOrderAppraisalReport) {
|
if ($isOrderAppraisalReport) {
|
||||||
$this->refreshAppraisalSnapshot((int)$report['id'], (int)$report['order_id'], $report['service_provider'], $now);
|
$this->refreshAppraisalSnapshot((int)$report['id'], (int)$report['order_id'], $report['service_provider'], $now);
|
||||||
|
$materialTag = $materialTagService->syncBoundTagForReport($report, $request) ?: $materialTag;
|
||||||
}
|
}
|
||||||
|
|
||||||
$verify = $this->createOrUpdateVerifyRecord($report, $now);
|
$verify = $this->createOrUpdateVerifyRecord($report, $now);
|
||||||
|
|||||||
@@ -484,6 +484,102 @@ class MaterialTagService
|
|||||||
return $this->formatTagCode($tag, $report ?: null);
|
return $this->formatTagCode($tag, $report ?: null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function syncBoundTagForReport(array $report, ?Request $request = null): ?array
|
||||||
|
{
|
||||||
|
$reportId = (int)($report['id'] ?? 0);
|
||||||
|
$orderId = (int)($report['order_id'] ?? 0);
|
||||||
|
$reportNo = trim((string)($report['report_no'] ?? ''));
|
||||||
|
if ($reportId <= 0 || $orderId <= 0 || $reportNo === '' || ($report['report_type'] ?? 'appraisal') !== 'appraisal') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tag = Db::name('material_tag_codes')->where('report_id', $reportId)->find();
|
||||||
|
if (!$tag) {
|
||||||
|
$tag = Db::name('material_tag_codes')
|
||||||
|
->where('bound_order_id', $orderId)
|
||||||
|
->where('bind_status', 'bound')
|
||||||
|
->where('status', '<>', 'invalid')
|
||||||
|
->order('bound_at', 'desc')
|
||||||
|
->order('id', 'desc')
|
||||||
|
->find();
|
||||||
|
}
|
||||||
|
if (!$tag && $reportNo !== '') {
|
||||||
|
$tag = Db::name('material_tag_codes')
|
||||||
|
->where('report_no', $reportNo)
|
||||||
|
->where('bind_status', 'bound')
|
||||||
|
->where('status', '<>', 'invalid')
|
||||||
|
->order('id', 'desc')
|
||||||
|
->find();
|
||||||
|
}
|
||||||
|
if (!$tag) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$batch = Db::name('material_batches')->where('id', (int)$tag['batch_id'])->find();
|
||||||
|
if (($tag['status'] ?? 'active') === 'invalid' || ($batch && ($batch['status'] ?? 'active') === 'invalid')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$now = date('Y-m-d H:i:s');
|
||||||
|
$payload = [
|
||||||
|
'report_id' => $reportId,
|
||||||
|
'report_no' => $reportNo,
|
||||||
|
'bind_status' => 'bound',
|
||||||
|
'bound_order_id' => $orderId,
|
||||||
|
'updated_at' => $now,
|
||||||
|
];
|
||||||
|
if (empty($tag['bound_by'])) {
|
||||||
|
$payload['bound_by'] = $request ? ((int)$request->header('x-admin-id', 0) ?: null) : null;
|
||||||
|
}
|
||||||
|
if (trim((string)($tag['bound_by_name'] ?? '')) === '') {
|
||||||
|
$payload['bound_by_name'] = $request ? trim((string)$request->header('x-admin-name', '')) : '';
|
||||||
|
}
|
||||||
|
if (empty($tag['bound_at'])) {
|
||||||
|
$payload['bound_at'] = $now;
|
||||||
|
}
|
||||||
|
|
||||||
|
Db::name('material_tag_codes')->where('id', (int)$tag['id'])->update($payload);
|
||||||
|
$fresh = Db::name('material_tag_codes')->where('id', (int)$tag['id'])->find();
|
||||||
|
return $this->formatTagCode($fresh ?: array_merge($tag, $payload), $report);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function findPublishedReportForTag(array $tag): ?array
|
||||||
|
{
|
||||||
|
if ((int)($tag['report_id'] ?? 0) > 0) {
|
||||||
|
$report = Db::name('reports')
|
||||||
|
->where('id', (int)$tag['report_id'])
|
||||||
|
->where('report_status', 'published')
|
||||||
|
->find();
|
||||||
|
if ($report) {
|
||||||
|
return $report;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$reportNo = trim((string)($tag['report_no'] ?? ''));
|
||||||
|
if ($reportNo !== '') {
|
||||||
|
$report = Db::name('reports')
|
||||||
|
->where('report_no', $reportNo)
|
||||||
|
->where('report_status', 'published')
|
||||||
|
->find();
|
||||||
|
if ($report) {
|
||||||
|
return $report;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$orderId = (int)($tag['bound_order_id'] ?? 0);
|
||||||
|
if ($orderId <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Db::name('reports')
|
||||||
|
->where('order_id', $orderId)
|
||||||
|
->where('report_type', 'appraisal')
|
||||||
|
->where('report_status', 'published')
|
||||||
|
->order('publish_time', 'desc')
|
||||||
|
->order('id', 'desc')
|
||||||
|
->find() ?: null;
|
||||||
|
}
|
||||||
|
|
||||||
public function showPublicTag(string $token, Request $request): array
|
public function showPublicTag(string $token, Request $request): array
|
||||||
{
|
{
|
||||||
$tag = Db::name('material_tag_codes')->where('qr_token', $token)->find();
|
$tag = Db::name('material_tag_codes')->where('qr_token', $token)->find();
|
||||||
@@ -521,6 +617,14 @@ class MaterialTagService
|
|||||||
$report = (int)($tag['report_id'] ?? 0) > 0
|
$report = (int)($tag['report_id'] ?? 0) > 0
|
||||||
? Db::name('reports')->where('id', (int)$tag['report_id'])->find()
|
? Db::name('reports')->where('id', (int)$tag['report_id'])->find()
|
||||||
: null;
|
: null;
|
||||||
|
$publishedReport = $this->findPublishedReportForTag($tag);
|
||||||
|
if ($publishedReport && (!$report || ($report['report_status'] ?? '') !== 'published' || (int)$report['id'] !== (int)$publishedReport['id'])) {
|
||||||
|
$this->syncBoundTagForReport($publishedReport, $request);
|
||||||
|
$tag = Db::name('material_tag_codes')->where('id', (int)$tag['id'])->find() ?: $tag;
|
||||||
|
$tag['scan_count'] = max((int)$tag['scan_count'], 1);
|
||||||
|
$tag['last_scanned_at'] = $now;
|
||||||
|
$report = $publishedReport;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$report) {
|
if (!$report) {
|
||||||
return [
|
return [
|
||||||
@@ -597,6 +701,12 @@ class MaterialTagService
|
|||||||
$report = (int)($tag['report_id'] ?? 0) > 0
|
$report = (int)($tag['report_id'] ?? 0) > 0
|
||||||
? Db::name('reports')->where('id', (int)$tag['report_id'])->find()
|
? Db::name('reports')->where('id', (int)$tag['report_id'])->find()
|
||||||
: null;
|
: null;
|
||||||
|
$publishedReport = $this->findPublishedReportForTag($tag);
|
||||||
|
if ($publishedReport && (!$report || ($report['report_status'] ?? '') !== 'published' || (int)$report['id'] !== (int)$publishedReport['id'])) {
|
||||||
|
$this->syncBoundTagForReport($publishedReport, $request);
|
||||||
|
$tag = Db::name('material_tag_codes')->where('id', (int)$tag['id'])->find() ?: $tag;
|
||||||
|
$report = $publishedReport;
|
||||||
|
}
|
||||||
|
|
||||||
$passed = $report
|
$passed = $report
|
||||||
&& ($report['report_status'] ?? '') === 'published'
|
&& ($report['report_status'] ?? '') === 'published'
|
||||||
@@ -963,8 +1073,7 @@ class MaterialTagService
|
|||||||
$tag = Db::name('material_tag_codes')->where('qr_token', $token)->find();
|
$tag = Db::name('material_tag_codes')->where('qr_token', $token)->find();
|
||||||
if (
|
if (
|
||||||
!$tag
|
!$tag
|
||||||
|| (int)($tag['report_id'] ?? 0) <= 0
|
|| ((int)($tag['report_id'] ?? 0) <= 0 && (int)($tag['bound_order_id'] ?? 0) <= 0 && trim((string)($tag['report_no'] ?? '')) === '')
|
||||||
|| ($tag['bind_status'] ?? '') !== 'bound'
|
|
||||||
|| ($tag['status'] ?? 'active') === 'invalid'
|
|| ($tag['status'] ?? 'active') === 'invalid'
|
||||||
) {
|
) {
|
||||||
return '';
|
return '';
|
||||||
@@ -975,10 +1084,10 @@ class MaterialTagService
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$report = Db::name('reports')
|
$report = $this->findPublishedReportForTag($tag);
|
||||||
->where('id', (int)$tag['report_id'])
|
if ($report) {
|
||||||
->where('report_status', 'published')
|
$this->syncBoundTagForReport($report);
|
||||||
->find();
|
}
|
||||||
|
|
||||||
return $report ? (string)$report['report_no'] : '';
|
return $report ? (string)$report['report_no'] : '';
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user