372 lines
15 KiB
JavaScript
372 lines
15 KiB
JavaScript
/**
|
|
* 企业信息管理 - 细粒度接口联调测试
|
|
*
|
|
* 运行:
|
|
* source scripts/setup-test-env.sh
|
|
* node scripts/test-enterprise-info-granular.mjs
|
|
*/
|
|
const API_BASE = process.env.API_BASE || "http://127.0.0.1:8095/safety-eval";
|
|
const TS = Date.now();
|
|
|
|
const results = [];
|
|
let passed = 0;
|
|
let failed = 0;
|
|
const createdIds = {};
|
|
|
|
/** 保持 ID 为字符串,避免雪花 ID 超出 JS 安全整数精度 */
|
|
function normalizeId(id) {
|
|
if (id === undefined || id === null || id === "") return undefined;
|
|
return String(id);
|
|
}
|
|
|
|
function record(id, name, condition, detail = "") {
|
|
const status = condition ? "PASS" : "FAIL";
|
|
if (condition) passed += 1;
|
|
else failed += 1;
|
|
results.push({ id, name, status, detail });
|
|
}
|
|
|
|
async function request(method, path, body) {
|
|
const url = `${API_BASE}${path}`;
|
|
const options = {
|
|
method,
|
|
headers: { "Content-Type": "application/json" },
|
|
};
|
|
if (body !== undefined) options.body = JSON.stringify(body);
|
|
const res = await fetch(url, options);
|
|
const text = await res.text();
|
|
try {
|
|
return { httpStatus: res.status, ...JSON.parse(text) };
|
|
}
|
|
catch {
|
|
return { httpStatus: res.status, success: false, raw: text };
|
|
}
|
|
}
|
|
|
|
function assertSuccess(id, name, res, extra = "") {
|
|
const ok = res.success === true && res.code === "0";
|
|
record(id, name, ok, ok ? extra : (res.message || res.raw || `http=${res.httpStatus}`));
|
|
return ok;
|
|
}
|
|
|
|
function assertHasData(id, name, res, extra = "") {
|
|
const ok = res.success === true && res.code === "0" && res.data != null;
|
|
record(id, name, ok, ok ? extra : (res.message || "data 为空"));
|
|
return ok;
|
|
}
|
|
|
|
async function testPagination(id, name, path, minTotal = 1) {
|
|
const sep = path.includes("?") ? "&" : "?";
|
|
const page1 = await request("GET", `${path}${sep}current=1&size=2`);
|
|
const ok1 = assertSuccess(`${id}-01`, `${name}-分页第1页`, page1, `total=${page1.total ?? page1.totalCount ?? "?"}`);
|
|
const page2 = await request("GET", `${path}${sep}current=2&size=2`);
|
|
assertSuccess(`${id}-02`, `${name}-分页第2页`, page2);
|
|
if (ok1 && (page1.total ?? page1.totalCount ?? 0) >= minTotal) {
|
|
record(`${id}-03`, `${name}-分页total有效`, true, `total=${page1.total ?? page1.totalCount}`);
|
|
}
|
|
return page1;
|
|
}
|
|
|
|
async function run() {
|
|
console.log(`\n=== 企业信息管理 细粒度接口测试 ===`);
|
|
console.log(`API Base: ${API_BASE}`);
|
|
console.log(`Timestamp: ${TS}\n`);
|
|
|
|
const orgPage = await testPagination("EI-API-ORG", "机构信息", "/org-info/page", 1);
|
|
let orgId = orgPage.data?.[0]?.id;
|
|
|
|
if (orgId) {
|
|
const orgGet = await request("GET", `/org-info/get?id=${normalizeId(orgId)}`);
|
|
assertHasData("EI-API-ORG-04", "机构信息-详情", orgGet, `id=${orgId}`);
|
|
const orgMod = await request("POST", "/org-info/modify", {
|
|
...orgGet.data,
|
|
principalName: orgGet.data.principalName,
|
|
});
|
|
assertSuccess("EI-API-ORG-05", "机构信息-修改", orgMod);
|
|
}
|
|
|
|
await testPagination("EI-API-DEPT", "部门", "/org-department/page", 1);
|
|
|
|
const deptName = `联调部门-${TS}`;
|
|
const deptSave = await request("POST", "/org-department/save", {
|
|
deptName,
|
|
managerName: "测试负责人",
|
|
deptLevelName: "一级",
|
|
});
|
|
if (assertSuccess("EI-API-DEPT-04", "部门-新增", deptSave)) {
|
|
createdIds.dept = normalizeId(deptSave.data?.id);
|
|
const deptGet = await request("GET", `/org-department/get?id=${createdIds.dept}`);
|
|
if (assertHasData("EI-API-DEPT-05", "部门-详情", deptGet)) {
|
|
const deptMod = await request("POST", "/org-department/modify", {
|
|
id: createdIds.dept,
|
|
deptName: `${deptName}-改`,
|
|
managerName: "测试负责人",
|
|
deptLevelName: "一级",
|
|
});
|
|
assertSuccess("EI-API-DEPT-06", "部门-修改", deptMod);
|
|
const deptSearch = await request("GET", `/org-department/page?current=1&size=10&deptName=${encodeURIComponent(deptName)}`);
|
|
assertSuccess("EI-API-DEPT-07", "部门-名称搜索", deptSearch, `count=${deptSearch.data?.length ?? 0}`);
|
|
}
|
|
}
|
|
|
|
const posSave = await request("POST", "/org-position/save", {
|
|
positionName: `联调岗位-${TS}`,
|
|
dutyDesc: "测试职责",
|
|
deptId: createdIds.dept || "102",
|
|
});
|
|
if (assertSuccess("EI-API-POS-01", "岗位-新增", posSave)) {
|
|
createdIds.pos = normalizeId(posSave.data?.id);
|
|
}
|
|
await testPagination("EI-API-POS-PG", "岗位", "/org-position/page", 1);
|
|
if (createdIds.pos) {
|
|
const posGet = await request("GET", `/org-position/get?id=${createdIds.pos}`);
|
|
if (assertHasData("EI-API-POS-04", "岗位-详情", posGet)) {
|
|
const posMod = await request("POST", "/org-position/modify", {
|
|
id: createdIds.pos,
|
|
positionName: `联调岗位-${TS}-改`,
|
|
dutyDesc: "已修改",
|
|
deptId: createdIds.dept || posGet.data?.deptId,
|
|
});
|
|
assertSuccess("EI-API-POS-05", "岗位-修改", posMod);
|
|
}
|
|
}
|
|
|
|
const staffSave = await request("POST", "/org-personnel/save", {
|
|
userName: `联调人员-${TS}`,
|
|
account: `139${String(TS).slice(-8)}`,
|
|
genderCode: 1,
|
|
genderName: "男",
|
|
employmentStatusCode: 1,
|
|
employmentStatusName: "在职",
|
|
deptId: createdIds.dept || "102",
|
|
postId: createdIds.pos || "205",
|
|
});
|
|
if (assertSuccess("EI-API-STAFF-01", "人员-新增", staffSave)) {
|
|
createdIds.staff = normalizeId(staffSave.data?.id);
|
|
const staffGet = await request("GET", `/org-personnel/get?id=${createdIds.staff}`);
|
|
if (assertHasData("EI-API-STAFF-02", "人员-详情", staffGet)) {
|
|
record(
|
|
"EI-API-STAFF-05",
|
|
"人员-部门名称组装",
|
|
!!staffGet.data.deptName,
|
|
`deptName=${staffGet.data.deptName ?? "(空)"}`,
|
|
);
|
|
record(
|
|
"EI-API-STAFF-06",
|
|
"人员-岗位名称组装",
|
|
!!staffGet.data.postName,
|
|
`postName=${staffGet.data.postName ?? "(空)"}`,
|
|
);
|
|
const staffPage = await request("GET", `/org-personnel/page?current=1&size=10&userName=${encodeURIComponent("联调人员")}`);
|
|
assertSuccess("EI-API-STAFF-03", "人员-姓名搜索", staffPage);
|
|
const pageRow = staffPage.data?.[0];
|
|
if (pageRow) {
|
|
record("EI-API-STAFF-07", "人员列表-部门字段", !!pageRow.deptName, `deptName=${pageRow.deptName ?? "(空)"}`);
|
|
record("EI-API-STAFF-08", "人员列表-岗位字段", !!pageRow.postName, `postName=${pageRow.postName ?? "(空)"}`);
|
|
}
|
|
const staffMod = await request("POST", "/org-personnel/modify", {
|
|
id: createdIds.staff,
|
|
userName: `联调人员-${TS}-改`,
|
|
account: staffGet.data.account,
|
|
genderCode: staffGet.data.genderCode,
|
|
genderName: staffGet.data.genderName,
|
|
employmentStatusCode: staffGet.data.employmentStatusCode,
|
|
employmentStatusName: staffGet.data.employmentStatusName,
|
|
deptId: staffGet.data.deptId,
|
|
postId: staffGet.data.postId,
|
|
});
|
|
assertSuccess("EI-API-STAFF-04", "人员-修改", staffMod);
|
|
if (staffMod.success) {
|
|
const staffAfterMod = await request("GET", `/org-personnel/get?id=${createdIds.staff}`);
|
|
record(
|
|
"EI-API-STAFF-10",
|
|
"人员-修改后变更次数",
|
|
(staffAfterMod.data?.changeCount ?? 0) >= 1,
|
|
`changeCount=${staffAfterMod.data?.changeCount ?? 0}`,
|
|
);
|
|
}
|
|
const dupSave = await request("POST", "/org-personnel/save", {
|
|
userName: `重复账号-${TS}`,
|
|
account: staffGet.data.account,
|
|
genderCode: 1,
|
|
genderName: "男",
|
|
employmentStatusCode: 1,
|
|
employmentStatusName: "在职",
|
|
deptId: staffGet.data.deptId,
|
|
postId: staffGet.data.postId,
|
|
});
|
|
record(
|
|
"EI-API-STAFF-11",
|
|
"人员-账号重复校验",
|
|
dupSave.success === false && String(dupSave.message || "").includes("账号"),
|
|
dupSave.message || `code=${dupSave.code}`,
|
|
);
|
|
const resetPwd = await request("POST", `/org-personnel/reset-password?id=${normalizeId(createdIds.staff)}`);
|
|
assertSuccess("EI-API-STAFF-09", "人员-重置密码", resetPwd);
|
|
}
|
|
}
|
|
|
|
if (createdIds.staff) {
|
|
const certSave = await request("POST", "/org-personnel-cert/save", {
|
|
personnelId: createdIds.staff,
|
|
certName: `联调证书-${TS}`,
|
|
certNo: `CERT-${TS}`,
|
|
issueOrg: "测试机关",
|
|
validStartDate: "2026-01-01",
|
|
validEndDate: "2027-01-01",
|
|
});
|
|
if (assertSuccess("EI-API-CERT-01", "人员证书-新增", certSave)) {
|
|
createdIds.cert = normalizeId(certSave.data?.id);
|
|
await testPagination("EI-API-CERT", "人员证书", `/org-personnel-cert/page?personnelId=${createdIds.staff}`, 0);
|
|
}
|
|
}
|
|
else {
|
|
record("EI-API-CERT-01", "人员证书-新增", false, "跳过:无人员 id");
|
|
}
|
|
|
|
await testPagination("EI-API-CHANGE", "人员变更", "/org-personnel-change/page", 0);
|
|
|
|
// 联调数据可能被审核操作污染,测试前重置种子离职单为「未审核」
|
|
await request("POST", "/org-resign-apply/modify", {
|
|
id: "701",
|
|
personnelId: "403",
|
|
auditStatusCode: 0,
|
|
auditStatusName: "未审核",
|
|
});
|
|
|
|
const equipSave = await request("POST", "/org-equipment/save", {
|
|
deviceName: `联调设备-${TS}`,
|
|
deviceModel: "T-001",
|
|
manufacturer: "测试厂家",
|
|
enableFlag: 1,
|
|
});
|
|
if (assertSuccess("EI-API-EQUIP-01", "装备-新增", equipSave)) {
|
|
createdIds.equip = normalizeId(equipSave.data?.id);
|
|
const equipGet = await request("GET", `/org-equipment/get?id=${createdIds.equip}`);
|
|
if (assertHasData("EI-API-EQUIP-02", "装备-详情", equipGet)) {
|
|
const toggle = equipGet.data?.enableFlag === 1 ? 0 : 1;
|
|
const equipMod = await request("POST", "/org-equipment/modify", { ...equipGet.data, enableFlag: toggle });
|
|
assertSuccess("EI-API-EQUIP-03", "装备-启停", equipMod);
|
|
}
|
|
}
|
|
await testPagination("EI-API-EQUIP-PG", "装备", "/org-equipment/page", 1);
|
|
const equipByInstrument = await request("GET", "/org-equipment/page?current=1&size=10&instrumentType=检测仪器");
|
|
record(
|
|
"EI-API-EQUIP-04",
|
|
"装备-仪器类型搜索",
|
|
equipByInstrument.success === true && (equipByInstrument.total ?? equipByInstrument.totalCount ?? 0) >= 1 && (equipByInstrument.total ?? equipByInstrument.totalCount ?? 0) < 6,
|
|
`total=${equipByInstrument.total ?? equipByInstrument.totalCount ?? "?"}`,
|
|
);
|
|
const equipByDeviceType = await request("GET", "/org-equipment/page?current=1&size=10&deviceType=便携式");
|
|
record(
|
|
"EI-API-EQUIP-05",
|
|
"装备-设备类型搜索",
|
|
equipByDeviceType.success === true && (equipByDeviceType.total ?? equipByDeviceType.totalCount ?? 0) >= 1,
|
|
`total=${equipByDeviceType.total ?? equipByDeviceType.totalCount ?? "?"}`,
|
|
);
|
|
|
|
const personnelSeed = await request("GET", "/org-personnel/page?current=1&size=10&userName=钱离职");
|
|
const seedRow = personnelSeed.data?.[0];
|
|
if (seedRow) {
|
|
record("EI-API-CHANGE-04", "人员-变更次数组装", (seedRow.changeCount ?? 0) >= 3, `changeCount=${seedRow.changeCount ?? 0}`);
|
|
record("EI-API-CHANGE-05", "人员-就职状态组装", seedRow.employmentStatusCode === 2, `employmentStatusCode=${seedRow.employmentStatusCode}`);
|
|
}
|
|
const personnelResign = await request("GET", "/org-personnel/page?current=1&size=10&userName=钱离职");
|
|
const resignRow = personnelResign.data?.[0];
|
|
if (resignRow) {
|
|
record("EI-API-CHANGE-06", "人员-离职审核状态", resignRow.resignAuditStatus === 0, `resignAuditStatus=${resignRow.resignAuditStatus ?? "(空)"}`);
|
|
}
|
|
const resignFilter = await request("GET", "/org-personnel/page?current=1&size=10&resignAuditStatus=0&userName=钱离职");
|
|
record(
|
|
"EI-API-CHANGE-07",
|
|
"人员-离职审核状态筛选",
|
|
resignFilter.success === true && (resignFilter.data?.length ?? 0) >= 1,
|
|
`count=${resignFilter.data?.length ?? 0}`,
|
|
);
|
|
|
|
const qualSave = await request("POST", "/org-qualification/save", {
|
|
licenseTypeName: "测试证照",
|
|
certName: `联调资质-${TS}`,
|
|
certNo: `QUAL-${TS}`,
|
|
issueOrg: "测试机关",
|
|
issueDate: "2026-01-01",
|
|
validStartDate: "2026-01-01",
|
|
validEndDate: "2027-01-01",
|
|
enableFlag: 1,
|
|
});
|
|
if (assertSuccess("EI-API-QUAL-01", "资质-新增", qualSave)) {
|
|
createdIds.qual = normalizeId(qualSave.data?.id);
|
|
}
|
|
await testPagination("EI-API-QUAL-PG", "资质", "/org-qualification/page", 1);
|
|
|
|
if (createdIds.staff) {
|
|
const resignSave = await request("POST", "/org-resign-apply/save", {
|
|
personnelId: createdIds.staff,
|
|
applicantName: `联调离职-${TS}`,
|
|
applyTime: "2026-06-20T10:00:00",
|
|
expectedResignDate: "2026-07-31",
|
|
resignReason: "联调测试",
|
|
auditStatusCode: 0,
|
|
auditStatusName: "未审核",
|
|
});
|
|
if (assertSuccess("EI-API-RESIGN-01", "离职申请-新增", resignSave)) {
|
|
createdIds.resign = normalizeId(resignSave.data?.id);
|
|
const resignGet = await request("GET", `/org-resign-apply/get?id=${createdIds.resign}`);
|
|
if (assertHasData("EI-API-RESIGN-03", "离职申请-详情", resignGet)) {
|
|
record(
|
|
"EI-API-RESIGN-04",
|
|
"离职-审核状态字段",
|
|
resignGet.data.auditStatusCode === 0,
|
|
`auditStatusCode=${resignGet.data.auditStatusCode}`,
|
|
);
|
|
record(
|
|
"EI-API-RESIGN-05",
|
|
"离职-用户名字段组装",
|
|
!!resignGet.data.account,
|
|
`account=${resignGet.data.account ?? "(空)"}`,
|
|
);
|
|
}
|
|
const audit = await request("POST", "/org-resign-apply/modify", {
|
|
id: createdIds.resign,
|
|
personnelId: createdIds.staff,
|
|
auditStatusCode: 1,
|
|
auditStatusName: "已审核",
|
|
});
|
|
assertSuccess("EI-API-RESIGN-02", "离职申请-审核", audit);
|
|
}
|
|
}
|
|
else {
|
|
record("EI-API-RESIGN-01", "离职申请-新增", false, "跳过:无人员 id");
|
|
}
|
|
await testPagination("EI-API-RESIGN-PG", "离职申请", "/org-resign-apply/page", 0);
|
|
|
|
const cleanup = [
|
|
["cert", "/org-personnel-cert/delete"],
|
|
["resign", "/org-resign-apply/delete"],
|
|
["staff", "/org-personnel/delete"],
|
|
["pos", "/org-position/delete"],
|
|
["dept", "/org-department/delete"],
|
|
["equip", "/org-equipment/delete"],
|
|
["qual", "/org-qualification/delete"],
|
|
];
|
|
for (const [key, path] of cleanup) {
|
|
if (createdIds[key]) {
|
|
const del = await request("POST", `${path}?id=${createdIds[key]}`);
|
|
assertSuccess(`EI-API-CLEAN-${key}`, `清理-${key}`, del);
|
|
}
|
|
}
|
|
|
|
console.log("\n========== 测试结果 ==========\n");
|
|
results.forEach((r) => {
|
|
const icon = r.status === "PASS" ? "✓" : "✗";
|
|
console.log(`${icon} [${r.status}] ${r.id} ${r.name}${r.detail ? ` — ${r.detail}` : ""}`);
|
|
});
|
|
console.log(`\n合计: ${passed + failed} 通过: ${passed} 失败: ${failed}\n`);
|
|
process.exit(failed > 0 ? 1 : 0);
|
|
}
|
|
|
|
run().catch((err) => {
|
|
console.error("测试执行失败:", err.message);
|
|
process.exit(1);
|
|
});
|