2026-08-25 13:39:09 +08:00

229 lines
7.2 KiB
JavaScript

let db = "";
const { ObjectId } = require("mongodb");
const validator = require('../../utils/validator.js')
const { ensureApplicableDiagnosisIndexes } = require('../drug-info/applicable-diagnosis');
module.exports = async (item, mongodb) => {
db = mongodb;
switch (item.type) {
case "getDiagnosisList":
return await getDiagnosisList(item);
case "deleteHlwDiagnosis":
return await deleteHlwDiagnosis(item);
case "updateHlwDiagnosis":
return await updateHlwDiagnosis(item);
case "addHlwDiagnosis":
return await addHlwDiagnosis(item);
case "updateHlwDiagnosisCategory":
return await updateHlwDiagnosisCategory(item)
}
};
// 获取诊断列表
async function getDiagnosisList(item) {
const { name, code, keyword, category } = item;
try {
const page = Number.isInteger(item.page) && item.page > 0 ? item.page : 1;
const pageSize = Number.isInteger(item.pageSize) && item.pageSize > 0 ? item.pageSize : 30;
// 调用mongo 数据库查询
let query = {};
if (Array.isArray(item.ids)) {
if (item.ids.some(id => typeof id !== 'string')) {
return { success: false, message: '诊断ID格式错误' };
}
const ids = [...new Set(item.ids.map(id => id.trim()))];
if (ids.some(id => !ObjectId.isValid(id))) {
return { success: false, message: '诊断ID格式错误' };
}
query._id = { $in: ids.map(id => new ObjectId(id)) };
}
if (Array.isArray(item.codes)) {
if (item.codes.some(code => typeof code !== 'string' || !code.trim())) {
return { success: false, message: '诊断编码格式错误' };
}
const codes = [...new Set(item.codes.map(code => code.trim()))];
query.code = { $in: codes };
}
if (name && typeof name === "string") {
query.name = new RegExp(name.trim(), "i");
}
if (code && typeof code === "string") {
query.code = new RegExp(code.trim(), "i");
}
if (category && typeof category === "string") {
query.category = new RegExp(category.trim(), "i");
}
if (typeof keyword == "string" && keyword.trim()) {
query.$or = [
{ name: new RegExp(keyword.trim(), "i") },
{ code: new RegExp(keyword.trim(), "i") },
{ category: new RegExp(keyword.trim(), "i") },
{ pinyin: new RegExp(keyword.trim(), "i") },
];
}
const res = await db
.collection("hlw-diagnosis")
.find(query)
.sort({ _id: -1 })
.skip((page - 1) * pageSize)
.limit(pageSize)
.toArray();
const total = await db.collection("hlw-diagnosis").countDocuments(query);
return {
success: true,
message: "查询成功",
data: res,
total,
pages: Math.ceil(total / pageSize),
};
} catch (err) {
return {
success: false,
message: err.message || "查询失败",
};
}
}
// 删除诊断信息
async function deleteHlwDiagnosis(item) {
const { id } = item;
if (typeof id !== 'string' || id.trim() === '') {
return { success: false, message: 'id不能为空' }
}
try {
if (!ObjectId.isValid(id.trim())) {
return { success: false, message: '诊断ID格式错误' }
}
const diagnosisId = new ObjectId(id.trim());
const diagnosis = await db.collection("hlw-diagnosis").findOne(
{ _id: diagnosisId },
{ projection: { _id: 1, code: 1 } }
);
if (!diagnosis) {
return { success: false, message: '未查询到诊断' }
}
await ensureApplicableDiagnosisIndexes(db);
const [hlwDrugCount, onlineDrugCount] = await Promise.all([
db.collection("drug-info").countDocuments({ applicableDiagnosisCodes: diagnosis.code }, { limit: 1 }),
db.collection("online-drug-info").countDocuments({ applicableDiagnosisCodes: diagnosis.code }, { limit: 1 }),
]);
if (hlwDrugCount > 0 || onlineDrugCount > 0) {
return { success: false, message: '该诊断已被药品引用,请先解除关联后再删除' }
}
// 调用mongo 数据库删除
const res = await db.collection("hlw-diagnosis").deleteOne({
_id: diagnosisId,
});
return {
success: true,
message: "删除成功",
res
};
} catch (err) {
return {
success: false,
message: err.message || "删除失败",
};
}
}
// 更新诊断信息
async function updateHlwDiagnosis(item) {
if (typeof item.id !== 'string' || item.id.trim() === '') {
return { success: false, message: 'id不能为空' }
}
try {
// 调用mongo 数据库更新
const [valid, data] = verifyDisease(item);
if (!valid) return { success: false, message: data }
const diagnosisId = new ObjectId(item.id);
const duplicate = await db.collection("hlw-diagnosis").findOne({
code: data.code,
_id: { $ne: diagnosisId },
}, { projection: { _id: 1 } });
if (duplicate) return { success: false, message: '诊断编码已存在' }
data.updateTime = Date.now()
const res = await db
.collection("hlw-diagnosis")
.updateOne(
{ _id: diagnosisId },
{ $set: data }
);
if (res.matchedCount === 0) {
return { success: false, message: '未查询到诊断' }
}
return {
success: true,
message: "更新成功",
res
};
} catch (err) {
return {
success: false,
message: err.message || "更新失败",
};
}
}
async function addHlwDiagnosis(item) {
try {
// 调用mongo 数据库新增
const [valid, data] = verifyDisease(item);
if (!valid) return { success: false, message: data }
const duplicate = await db.collection("hlw-diagnosis").findOne(
{ code: data.code },
{ projection: { _id: 1 } }
);
if (duplicate) return { success: false, message: '诊断编码已存在' }
data.createTime = Date.now()
const res = await db.collection("hlw-diagnosis").insertOne(data);
return {
success: true,
message: "新增成功",
id: res.insertedId
};
} catch (err) {
return {
success: false,
message: err.message || "新增失败",
};
}
}
async function updateHlwDiagnosisCategory(ctx) {
const oldCategory = typeof ctx.oldCategory === 'string' ? ctx.oldCategory.trim() : '';
const newCategory = typeof ctx.newCategory === 'string' ? ctx.newCategory.trim() : undefined;
if (!oldCategory || newCategory == undefined) {
return { success: false, message: '参数有误' }
}
try {
const res = await db.collection("hlw-diagnosis").updateMany(
{ category: oldCategory },
{ $set: { category: newCategory } }
);
return {
success: true,
message: "更新成功",
modifiedCount: res.modifiedCount
};
} catch (e) {
return {
success: false,
message: e.message || "更新失败",
};
}
}
function verifyDisease(ctx) {
const [valid, name] = validator.verifyString(ctx.name, "诊断名称", 1);
if (!valid) return [valid, name]
const [valid1, code] = validator.verifyString(ctx.code, "诊断编码", 1);
if (!valid1) return [valid1, code]
const [valid2, pinyin] = validator.verifyString(ctx.pinyin, "诊断拼音码", 1);
if (!valid2) return [valid2, pinyin]
const [, category] = validator.verifyString(ctx.category, "常用诊断名");
return [true, { name, code, pinyin, category }]
}