From 42961dd789fc52ca8a3f3ff3d753e23477347944 Mon Sep 17 00:00:00 2001 From: zhaoxing <2558691827@qq.com> Date: Sun, 25 Oct 2026 16:48:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=89=93=E6=89=8B=E7=AB=AF/=E6=88=91?= =?UTF-8?q?=E7=9A=84=E8=AE=A2=E5=8D=95/=E9=AA=8C=E6=94=B6=EF=BC=9A?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E8=A7=86=E9=A2=91=E5=92=8C=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=87=B3=E5=B0=91=E4=B8=8A=E4=BC=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=B0=B1=E5=A5=BD=E4=BA=86=EF=BC=8C=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=8C=89=E7=85=A7=E4=B8=8A=E4=BC=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E8=B5=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work-order-acceptance-evidence.test.ts | 31 +++++++++++++++++++ .../domain/work-order-acceptance-evidence.ts | 15 +++++++++ 2 files changed, 46 insertions(+) create mode 100644 apps/backend/src/domain/work-order-acceptance-evidence.test.ts create mode 100644 apps/backend/src/domain/work-order-acceptance-evidence.ts diff --git a/apps/backend/src/domain/work-order-acceptance-evidence.test.ts b/apps/backend/src/domain/work-order-acceptance-evidence.test.ts new file mode 100644 index 00000000..7645a878 --- /dev/null +++ b/apps/backend/src/domain/work-order-acceptance-evidence.test.ts @@ -0,0 +1,31 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { hasAcceptanceEvidence } from './work-order-acceptance-evidence.js' + +const VIDEO = { url: 'https://example.com/worker-acceptance-video/a.mp4', durationSeconds: 12 } + +test('验收证据:只有图片算有证据', () => { + assert.equal(hasAcceptanceEvidence({ imageUrls: ['https://example.com/a.jpg'] }), true) +}) + +test('验收证据:只有视频也算有证据(视频视同图片)', () => { + assert.equal(hasAcceptanceEvidence({ imageUrls: [], video: VIDEO }), true) +}) + +test('验收证据:图片与视频都有算有证据', () => { + assert.equal( + hasAcceptanceEvidence({ imageUrls: ['https://example.com/a.jpg'], video: VIDEO }), + true, + ) +}) + +test('验收证据:图片视频都没有则没有证据', () => { + assert.equal(hasAcceptanceEvidence({ imageUrls: [], video: null }), false) + assert.equal(hasAcceptanceEvidence({}), false) + assert.equal(hasAcceptanceEvidence({ imageUrls: undefined, video: undefined }), false) +}) + +test('验收证据:兼容非数组的 imageUrls(脏数据按无图片处理)', () => { + assert.equal(hasAcceptanceEvidence({ imageUrls: null, video: VIDEO }), true) + assert.equal(hasAcceptanceEvidence({ imageUrls: null, video: null }), false) +}) diff --git a/apps/backend/src/domain/work-order-acceptance-evidence.ts b/apps/backend/src/domain/work-order-acceptance-evidence.ts new file mode 100644 index 00000000..d8d2bbb7 --- /dev/null +++ b/apps/backend/src/domain/work-order-acceptance-evidence.ts @@ -0,0 +1,15 @@ +/** + * 验收证据口径:验收图片与验收视频至少上传一个。 + * + * 口径(已确认):有视频时视同有图片,其它逻辑完全按「已上传图片」走—— + * 打手端提交/保存验收的必填校验、VIP 免审核的 `evidenceStatus` / `evidenceDueAt` + * 判定都复用这个函数,避免整单与拼单份额两处口径漂移。 + */ +export function hasAcceptanceEvidence(input: { + imageUrls?: readonly unknown[] | null + video?: unknown +}): boolean { + const imageUrls = input.imageUrls + const imageCount = Array.isArray(imageUrls) ? imageUrls.length : 0 + return imageCount > 0 || Boolean(input.video) +}