V1-V6 收口移动视口与 PDF 发票上传
这个提交包含在:
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env node
|
||||
import { existsSync } from "node:fs";
|
||||
import { existsSync, readdirSync, statSync } from "node:fs";
|
||||
import { extname } from "node:path";
|
||||
|
||||
const baseUrl = (process.env.LIVE_SMOKE_BASE_URL || "https://oa.hyinda.com").trim().replace(/\/$/, "");
|
||||
|
||||
@@ -16,6 +17,28 @@ function existingFileFrom(keys) {
|
||||
return values.find((value) => existsSync(value)) || "";
|
||||
}
|
||||
|
||||
function isPdfFile(value) {
|
||||
if (!value || !existsSync(value)) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return statSync(value).isFile() && extname(value).toLowerCase() === ".pdf";
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function hasPdfFileInDir(value) {
|
||||
if (!value || !existsSync(value)) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return statSync(value).isDirectory() && readdirSync(value).some((entry) => extname(entry).toLowerCase() === ".pdf");
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchJson(url) {
|
||||
try {
|
||||
const response = await fetch(url, { signal: AbortSignal.timeout(10_000) });
|
||||
@@ -46,7 +69,9 @@ function buildStaticChecks() {
|
||||
);
|
||||
const invoiceFile = existingFileFrom(["PLAYWRIGHT_OCR_LIVE_FILE", "LIVE_OCR_INVOICE_FILE"]);
|
||||
const invoiceBatchDir = process.env.PLAYWRIGHT_OCR_LIVE_DIR?.trim() || "";
|
||||
const invoiceSampleReady = Boolean(invoiceFile) || (Boolean(invoiceBatchDir) && existsSync(invoiceBatchDir));
|
||||
const invoiceFileReady = isPdfFile(invoiceFile);
|
||||
const invoiceBatchDirReady = hasPdfFileInDir(invoiceBatchDir);
|
||||
const invoiceSampleReady = invoiceFileReady || invoiceBatchDirReady;
|
||||
|
||||
return {
|
||||
baseUrl,
|
||||
@@ -64,7 +89,9 @@ function buildStaticChecks() {
|
||||
userReady: ocrUserReady,
|
||||
invoiceSampleReady,
|
||||
invoiceFileProvided: Boolean(invoiceFile),
|
||||
invoiceFileReady,
|
||||
invoiceBatchDirProvided: Boolean(invoiceBatchDir),
|
||||
invoiceBatchDirReady,
|
||||
allowDuplicate: process.env.PLAYWRIGHT_OCR_ALLOW_DUPLICATE === "1",
|
||||
},
|
||||
missing: [],
|
||||
@@ -82,7 +109,7 @@ function addMissing(checks) {
|
||||
checks.missing.push("PLAYWRIGHT_OCR_LIVE_IDENTIFIER/PASSWORD 或 LIVE_SMOKE_EMPLOYEE_*");
|
||||
}
|
||||
if (!checks.liveOcr.invoiceSampleReady) {
|
||||
checks.missing.push("PLAYWRIGHT_OCR_LIVE_FILE 或 PLAYWRIGHT_OCR_LIVE_DIR");
|
||||
checks.missing.push("PLAYWRIGHT_OCR_LIVE_FILE 或 PLAYWRIGHT_OCR_LIVE_DIR 中的 PDF 样票");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,9 +29,8 @@ const checklist = [
|
||||
"移动首页无 PC 侧边栏或桌面表格",
|
||||
"报销草稿可新建、编辑、删除",
|
||||
"报销详情不出现 draft/bound/费用类型 code/绑定整单/发票池/OCR",
|
||||
"拍照上传打开摄像头",
|
||||
"选择图片支持 JPG/PNG/WEBP",
|
||||
"选择 PDF 不打开摄像头并可选中文件",
|
||||
"PDF 发票上传入口不打开摄像头并可选中文件",
|
||||
"发票上传不出现拍照或图片入口",
|
||||
"真实发票上传后有识别中、终态和耗时记录",
|
||||
"重复、已使用或识别失败发票显示可理解原因",
|
||||
"审批待办可查看并操作",
|
||||
|
||||
在新工单中引用
屏蔽一个用户