395 lines
13 KiB
JavaScript
395 lines
13 KiB
JavaScript
const dayjs = require("dayjs");
|
||
const { ObjectId } = require("mongodb");
|
||
|
||
const { getDrugList } = require('./verify');
|
||
let db = "";
|
||
module.exports = async (item, mongodb) => {
|
||
db = mongodb;
|
||
switch (item.type) {
|
||
case "getDrugInfo":
|
||
return await getDrugInfo(item);
|
||
case "deleteDrugInfo":
|
||
return await deleteDrugInfo(item);
|
||
case "updateDrugInfo":
|
||
return await updateDrugInfo(item);
|
||
case "addDrugInfo":
|
||
return await addDrugInfo(item);
|
||
case "getHlwDrugInfo":
|
||
return await getHlwDrugInfo(item);
|
||
case "addHlwDrugInfo":
|
||
return await addHlwDrugInfo(item);
|
||
case "editHlwDrugInfo":
|
||
return await editHlwDrugInfo(item);
|
||
case "setHlwDrugOnSale":
|
||
return await setHlwDrugOnSale(item);
|
||
case "importHlwDrugInfo":
|
||
return await importHlwDrugInfo(item);
|
||
case "getStoreSimilarDrugInfo":
|
||
return await getStoreSimilarDrugInfo(item);
|
||
case "searchDrugs":
|
||
return await searchDrugs(item);
|
||
}
|
||
};
|
||
// 药品库信息
|
||
async function getDrugInfo(item) {
|
||
let { name, _id, ids, pinyin_code, keyword, insuranceCodes } = item;
|
||
let fuzzyQuery = null;
|
||
let query = { onSale: true };
|
||
if (typeof name === "string") query.name = new RegExp(name.trim(), "i");
|
||
if (_id) query._id = new ObjectId(_id);
|
||
if (Array.isArray(ids) && ids.length > 0) {
|
||
query._id = { $in: ids.filter(id => ObjectId.isValid(id)).map(id => new ObjectId(id)) };
|
||
}
|
||
if (typeof pinyin_code === "string")
|
||
query.pinyin_code = new RegExp(pinyin_code.trim(), "i");
|
||
if (Array.isArray(insuranceCodes)) {
|
||
query.insurance_code = { $in: insuranceCodes };
|
||
}
|
||
const page = Number.isInteger(item.page) && item.page > 0 ? item.page : 1;
|
||
const pageSize =
|
||
Number.isInteger(item.pageSize) && item.pageSize > 0 ? item.pageSize : 15;
|
||
if (typeof keyword === "string" && keyword.trim()) {
|
||
const arr = [
|
||
{ name: new RegExp(keyword.trim(), "i") },
|
||
{ generic_name: new RegExp(keyword.trim(), "i") },
|
||
{ barcode: keyword.trim() },
|
||
{ pinyin_code: new RegExp(keyword.trim(), "i") },
|
||
{ product_id_str: keyword.trim() },
|
||
];
|
||
fuzzyQuery = { $or: arr };
|
||
}
|
||
const finalQuery = fuzzyQuery ? { $and: [query, fuzzyQuery] } : query;
|
||
try {
|
||
// 调用mongo 数据库查询
|
||
const res = await db
|
||
.collection("drug-info")
|
||
.find(finalQuery)
|
||
.skip((page - 1) * pageSize)
|
||
.limit(pageSize)
|
||
.toArray();
|
||
const total = await db.collection("drug-info").countDocuments(finalQuery);
|
||
return {
|
||
success: true,
|
||
message: "查询成功",
|
||
data: res,
|
||
total,
|
||
pages: Math.ceil(total / pageSize),
|
||
};
|
||
} catch (err) {
|
||
return {
|
||
success: false,
|
||
message: "查询失败",
|
||
};
|
||
}
|
||
}
|
||
|
||
// 删除药品信息
|
||
async function deleteDrugInfo(item) {
|
||
const { _id } = item;
|
||
try {
|
||
// 调用mongo 数据库删除
|
||
const res = await db.collection("drug-info").deleteOne({
|
||
_id: new ObjectId(_id),
|
||
});
|
||
return {
|
||
success: true,
|
||
message: "删除成功",
|
||
};
|
||
} catch (err) {
|
||
return {
|
||
success: false,
|
||
message: "删除失败",
|
||
};
|
||
}
|
||
}
|
||
|
||
// 更新药品信息
|
||
async function updateDrugInfo(item) {
|
||
const { updateData, _id } = item;
|
||
try {
|
||
// 调用mongo 数据库更新
|
||
const res = await db
|
||
.collection("drug-info")
|
||
.updateOne(
|
||
{ _id: new ObjectId(_id) },
|
||
{ $set: { ...updateData, updateTime: Date.now() } }
|
||
);
|
||
return {
|
||
success: true,
|
||
message: "更新成功",
|
||
};
|
||
} catch (err) {
|
||
return {
|
||
success: false,
|
||
message: "更新失败",
|
||
};
|
||
}
|
||
}
|
||
//新增药品信息
|
||
/**
|
||
* pinyin_code:拼音操作码
|
||
product_id:药店货品ID
|
||
name:名称
|
||
specification:规格
|
||
manufacturer:厂家
|
||
unit:单位
|
||
category:分类
|
||
barcode:条形码
|
||
insurance_code:医保国码
|
||
dosage:用量
|
||
dosage_unit:用量单位
|
||
frequency:频率
|
||
days:天数
|
||
administration_method:给药方式
|
||
recommended_quantity:建议销售数量
|
||
* @param {*} item
|
||
* @returns
|
||
*/
|
||
async function addDrugInfo(item) {
|
||
const { name } = item;
|
||
try {
|
||
// 调用mongo 数据库新增
|
||
const res = await db.collection("drug-info").insertOne({
|
||
name,
|
||
createTime: Date.now(),
|
||
});
|
||
return {
|
||
success: true,
|
||
data: res,
|
||
message: "新增成功",
|
||
};
|
||
} catch (err) {
|
||
return {
|
||
success: false,
|
||
message: "新增失败",
|
||
};
|
||
}
|
||
}
|
||
|
||
async function getHlwDrugInfo(ctx) {
|
||
try {
|
||
const page = Number.isInteger(ctx.page) && ctx.page > 0 ? ctx.page : 1;
|
||
const pageSize = Number.isInteger(ctx.pageSize) && ctx.pageSize > 0 ? ctx.pageSize : 10;
|
||
const query = {}
|
||
if (typeof ctx.name === "string" && ctx.name.trim()) {
|
||
query.name = new RegExp(ctx.name.trim(), "i")
|
||
};
|
||
if (typeof ctx.onSale === "boolean") {
|
||
query.onSale = ctx.onSale
|
||
}
|
||
if (typeof ctx.productId === 'string' && ctx.productId.trim()) {
|
||
query.product_id_str = ctx.productId.trim()
|
||
}
|
||
if (typeof ctx.barcode === 'string' && ctx.barcode.trim()) {
|
||
query.barcode = ctx.barcode.trim()
|
||
}
|
||
if (typeof ctx.insuranceCode === 'string' && ctx.insuranceCode.trim()) {
|
||
query.insurance_code = ctx.insuranceCode.trim()
|
||
}
|
||
const res = await db.collection("drug-info").find(query).sort({ onSale: -1, createTime: -1 }).skip((page - 1) * pageSize).limit(pageSize).toArray();
|
||
const total = await db.collection("drug-info").countDocuments(query);
|
||
return {
|
||
success: true,
|
||
message: "查询成功",
|
||
data: res,
|
||
total,
|
||
pages: Math.ceil(total / pageSize),
|
||
}
|
||
} catch (e) {
|
||
return { success: false, message: e.message }
|
||
}
|
||
}
|
||
|
||
async function addHlwDrugInfo(ctx) {
|
||
const { params = {} } = ctx;
|
||
if (Object.prototype.toString.call(params) !== "[object Object]") {
|
||
return { success: false, message: "参数错误" }
|
||
}
|
||
try {
|
||
const peopleInfo = {
|
||
creator: typeof ctx.operator === "string" ? ctx.operator : "",
|
||
creatorId: typeof ctx.operatorId === "string" ? ctx.operatorId : "",
|
||
createTime: Date.now()
|
||
}
|
||
const { onSale, ...data } = params;
|
||
let newDrug = {};
|
||
if (Object.keys(data).length) {
|
||
const [item] = getDrugList([data], true, peopleInfo);
|
||
const { msgs, ...drug } = item;
|
||
if (msgs.length) {
|
||
return { success: false, message: msgs.join(",") }
|
||
}
|
||
newDrug = { ...drug }
|
||
}
|
||
if (typeof onSale === "boolean") {
|
||
newDrug.onSale = onSale;
|
||
}
|
||
newDrug.createTime = Date.now();
|
||
const res = await db.collection("drug-info").insertOne(newDrug);
|
||
return { success: true, message: "新增药品成功", id: res.insertedId }
|
||
} catch (e) {
|
||
return { success: false, message: e.message || '新增药品失败' }
|
||
}
|
||
}
|
||
|
||
async function editHlwDrugInfo(ctx) {
|
||
const { id, params = {} } = ctx;
|
||
if (Object.prototype.toString.call(params) !== "[object Object]" || typeof id !== "string") {
|
||
return { success: false, message: "参数错误" }
|
||
}
|
||
try {
|
||
const { onSale, ...data } = params;
|
||
let updateData = {};
|
||
if (Object.keys(data).length) {
|
||
const peopleInfo = {
|
||
updater: typeof ctx.operator === "string" ? ctx.operator : "",
|
||
updaterId: typeof ctx.operatorId === "string" ? ctx.operatorId : "",
|
||
updateTime: Date.now()
|
||
}
|
||
const [item] = getDrugList([data], false, peopleInfo);
|
||
const { msgs, ...drug } = item;
|
||
if (msgs.length) {
|
||
return { success: false, message: msgs.join(",") }
|
||
}
|
||
updateData = { ...drug }
|
||
}
|
||
if (typeof onSale === "boolean") {
|
||
updateData.onSale = onSale;
|
||
}
|
||
if (Object.keys(updateData).length) {
|
||
updateData.updateTime = Date.now();
|
||
const res = await db.collection("drug-info").updateOne({ _id: new ObjectId(id) }, { $set: updateData });
|
||
if (res.matchedCount === 0) {
|
||
return { success: false, message: "未找到对应药品" }
|
||
}
|
||
return { success: true, message: "更新成功" }
|
||
}
|
||
return { success: true, message: "更新成功" }
|
||
|
||
} catch (e) {
|
||
return { success: false, message: e.message }
|
||
}
|
||
|
||
}
|
||
|
||
async function setHlwDrugOnSale(ctx) {
|
||
const { ids, onSale, updaterId, updater } = ctx;
|
||
const _ids = Array.isArray(ids) ? ids.filter(i => typeof i === 'string' && i.trim()).map(i => new ObjectId(i.trim())) : [ids];
|
||
if (_ids.length == 0 || typeof onSale !== "boolean" || typeof updaterId !== "string" || typeof updater !== "string" || !updaterId.trim() || !updater.trim()) {
|
||
return { success: false, message: "参数错误" }
|
||
}
|
||
try {
|
||
const res = await db.collection("drug-info").updateMany({ _id: { $in: _ids } }, { $set: { onSale, updateTime: Date.now(), updaterId, updater } });
|
||
return { success: true, message: "更新成功", res }
|
||
} catch (e) {
|
||
return { success: false, message: e.message }
|
||
}
|
||
}
|
||
|
||
async function importHlwDrugInfo(ctx) {
|
||
const drugs = Array.isArray(ctx.drugs) ? ctx.drugs.filter(i => typeof i === 'object' && i !== null) : [];
|
||
const onSale = typeof ctx.onSale === "boolean" ? ctx.onSale : true;
|
||
if (drugs.length == 0) {
|
||
return { success: false, message: "参数错误" }
|
||
}
|
||
try {
|
||
const peopleInfo = {
|
||
creator: typeof ctx.operator === "string" ? ctx.operator : "",
|
||
creatorId: typeof ctx.operatorId === "string" ? ctx.operatorId : "",
|
||
createTime: Date.now(),
|
||
}
|
||
const datalist = getDrugList(drugs, true, peopleInfo);
|
||
const createTime = dayjs().valueOf();
|
||
const list = datalist.filter(i => i.msgs.length == 0).map(i => {
|
||
const { msgs, ...drug } = i;
|
||
drug.createTime = createTime;
|
||
drug.onSale = onSale;
|
||
return drug
|
||
});
|
||
const res = await db.collection("drug-info").insertMany(list);
|
||
if (res.insertedCount > 0) {
|
||
return { success: true, message: `成功导入${res.insertedCount}条数据` }
|
||
}
|
||
return { success: false, message: "导入失败" }
|
||
} catch (e) {
|
||
return { success: false, message: e.message }
|
||
}
|
||
}
|
||
|
||
async function getStoreSimilarDrugInfo(ctx) {
|
||
try {
|
||
const accountId = typeof ctx.accountId === "string" && ctx.accountId.trim() !== "" ? ctx.accountId.trim() : "";
|
||
const patientId = typeof ctx.patientId === "string" && ctx.patientId.trim() !== "" ? ctx.patientId.trim() : "";
|
||
const patientName = typeof ctx.patientName === "string" && ctx.patientName.trim() !== "" ? ctx.patientName.trim() : "";
|
||
const phone = typeof ctx.phone === "string" && ctx.phone.trim() !== "" ? ctx.phone.trim() : "";
|
||
const drugs = Array.isArray(ctx.drugs) ? ctx.drugs.filter(i => i && typeof i.insurance_code == 'string' && i.insurance_code.trim() !== "") : [];
|
||
const insurance_codes = drugs.map(i => i.insurance_code);
|
||
const query = { insurance_code: { $in: insurance_codes }, onSale: true };
|
||
const medicines = await db.collection("drug-info").find(query).toArray();
|
||
const lackMedicines = drugs.filter(i => !medicines.some(med => med.insurance_code === i.insurance_code));
|
||
let similarDrugs = [];
|
||
if (lackMedicines.length > 0) {
|
||
const lackMedicineRegApi = require("../lack-medicine-reg");
|
||
// 补全厂商数据:从药品库(包括已下架)中查询完整信息
|
||
const lackInsuranceCodes = lackMedicines.map(i => i.insurance_code);
|
||
const allDrugsInDb = await db.collection("drug-info").find({
|
||
insurance_code: { $in: lackInsuranceCodes }
|
||
}).toArray();
|
||
const lackDrugsWithManufacturer = lackMedicines.map(drug => {
|
||
// 尝试从数据库中找到匹配的药品信息
|
||
const dbDrug = allDrugsInDb.find(d => d.insurance_code === drug.insurance_code);
|
||
const result = {
|
||
...drug,
|
||
drugName: drug.drugName || (dbDrug ? dbDrug.name : ''),
|
||
spec: drug.spec || (dbDrug ? dbDrug.specification : ''),
|
||
manufacturer: drug.manufacturer || (dbDrug ? dbDrug.manufacturer : ''),
|
||
insurance_code: drug.insurance_code
|
||
};
|
||
return result;
|
||
});
|
||
const res = await lackMedicineRegApi({
|
||
type: "batchAddLackMedicineReg",
|
||
drugs: lackDrugsWithManufacturer,
|
||
accountId,
|
||
patientId,
|
||
patientName,
|
||
phone,
|
||
inventory: 'store',
|
||
regType: 'outOfStock',
|
||
corpId: ctx.corpId,
|
||
}, db)
|
||
const similarQuery = lackMedicines.map(i => ({
|
||
$and: [
|
||
{ onSale: true, insurance_code: new RegExp(i.insurance_code.slice(0, -5), "i") },
|
||
{ insurance_code: { $ne: i.insuranceCode } }
|
||
]
|
||
}))
|
||
similarDrugs = await db.collection("drug-info").find({ $or: similarQuery }).toArray();
|
||
}
|
||
return { success: true, message: "查询成功", drugs: medicines, similarDrugs }
|
||
} catch (e) {
|
||
return { success: false, message: e.message }
|
||
}
|
||
}
|
||
|
||
async function searchDrugs(ctx) {
|
||
try {
|
||
const keyword = typeof ctx.keyword === "string" ? ctx.keyword.trim() : "";
|
||
if (!keyword) {
|
||
return { success: false, message: "参数错误" }
|
||
}
|
||
const query = {
|
||
$or: [
|
||
{ name: { $regex: keyword, $options: "i" } },
|
||
{ pinyin_code: keyword },
|
||
{ product_id_str: keyword },
|
||
{ barcode: keyword },
|
||
{ insurance_code: keyword }
|
||
]
|
||
}
|
||
const list = await db.collection("drug-info").find(query, { projection: { _id: 1, name: 1, specification: 1, manufacturer: 1, insurance_code: 1 } }).limit(30).toArray();
|
||
return { success: true, message: "查询成功", list }
|
||
} catch (e) {
|
||
return { success: false, message: e.message }
|
||
}
|
||
} |