58 lines
1.7 KiB
JavaScript
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,
|
|
};
|