hn-hlw-service/hlw/drug-info/applicable-diagnosis.js
2026-08-25 13:39:09 +08:00

58 lines
1.7 KiB
JavaScript

let ensureIndexesPromise = null;
async function ensureApplicableDiagnosisIndexes(db) {
if (!ensureIndexesPromise) {
ensureIndexesPromise = Promise.all([
db.collection("drug-info").createIndex({ applicableDiagnosisCodes: 1 }),
db.collection("online-drug-info").createIndex({ applicableDiagnosisCodes: 1 }),
]).catch((error) => {
ensureIndexesPromise = null;
throw error;
});
}
await ensureIndexesPromise;
}
async function validateApplicableDiagnosisCodes(params, db) {
if (!Object.prototype.hasOwnProperty.call(params, "applicableDiagnosisCodes")) {
return { present: false, value: [] };
}
const rawCodes = params.applicableDiagnosisCodes;
if (!Array.isArray(rawCodes)) {
throw new Error("适应诊断格式错误");
}
const uniqueCodes = [];
const seen = new Set();
for (const rawCode of rawCodes) {
if (typeof rawCode !== "string" || !rawCode.trim()) {
throw new Error("适应诊断包含无效编码");
}
const code = rawCode.trim();
if (!seen.has(code)) {
seen.add(code);
uniqueCodes.push(code);
}
}
if (uniqueCodes.length) {
const diagnoses = await db.collection("hlw-diagnosis").find(
{ code: { $in: uniqueCodes } },
{ projection: { _id: 0, code: 1 } }
).toArray();
const existingCodes = new Set(diagnoses.map(item => item.code));
if (uniqueCodes.some(code => !existingCodes.has(code))) {
throw new Error("部分适应诊断不存在,请重新选择");
}
}
await ensureApplicableDiagnosisIndexes(db);
return { present: true, value: uniqueCodes };
}
module.exports = {
ensureApplicableDiagnosisIndexes,
validateApplicableDiagnosisCodes,
};