246 lines
8.8 KiB
JavaScript
Raw Permalink Normal View History

2026-07-27 11:28:33 +08:00
const dayjs = require("dayjs");
const validator = require('../../utils/validator.js');
const logger = require('../../utils/logger');
let db = "";
module.exports = async (item, mongodb) => {
db = mongodb;
switch (item.type) {
case "addLackMedicineReg":
return await addLackMedicineReg(item);
case "getLackMedicineList":
return await getLackMedicineList(item);
case "batchAddLackMedicineReg":
return await batchAddLackMedicineReg(item);
}
};
async function addLackMedicineReg(ctx) {
try {
const inventory = ['online', 'store'].includes(ctx.inventory) ? ctx.inventory : 'online';
const accountId = typeof ctx.accountId === 'string' ? ctx.accountId.trim() : '';
const drugName = typeof ctx.drugName === 'string' ? ctx.drugName.trim() : '';
const spec = typeof ctx.spec === 'string' ? ctx.spec.trim() : '';
const manufacturer = typeof ctx.manufacturer === 'string' ? ctx.manufacturer.trim() : '';
const insuranceCode = typeof ctx.insuranceCode === 'string' ? ctx.insuranceCode.trim() : '';
const images = Array.isArray(ctx.images) ? ctx.images.filter(i => typeof i === 'string' && i.trim() !== '') : [];
const description = typeof ctx.description === 'string' ? ctx.description.trim() : '';
const patientName = typeof ctx.patientName === 'string' ? ctx.patientName.trim() : '';
const phone = typeof ctx.phone === 'string' ? ctx.phone.trim() : '';
const patientId = typeof ctx.patientId === 'string' ? ctx.patientId.trim() : '';
if (patientId.length === 0) {
return { success: false, message: "患者id不能为空" }
}
if (patientId.length > 50) {
return { success: false, message: "患者id不能超过50个字" }
}
if (accountId.length === 0) {
return { success: false, message: "账号id不能为空" }
}
if (accountId.length > 50) {
return { success: false, message: "账号id不能超过50个字" }
}
if (drugName.length > 100) {
return { success: false, message: "药品名称不能超过100个字" }
}
if (spec.length > 100) {
return { success: false, message: "规格不能超过100个字" }
}
if (manufacturer.length > 200) {
return { success: false, message: "生产厂家不能超过200个字" }
}
if (insuranceCode.length > 100) {
return { success: false, message: "医保编码不能超过100个字" }
}
if (images.length > 5) {
return { success: false, message: "图片不能超过5张" }
}
if (description.length > 500) {
return { success: false, message: "描述不能超过500个字" }
}
if (patientName.length === 0) {
return { success: false, message: "患者姓名不能为空" }
}
if (patientName.length > 30) {
return { success: false, message: "患者姓名不能超过30个字" }
}
if (phone.length === 0) {
return { success: false, message: "患者手机号不能为空" }
}
if (!validator.isMobile(phone)) {
return { success: false, message: "患者手机号格式不正确" }
}
const data = {
accountId,
corpId: typeof ctx.corpId === 'string' ? ctx.corpId.trim() : undefined,
createTime: Date.now(),
description,
drugName,
images,
insuranceCode,
inventory,
manufacturer,
patientName,
phone,
patientId,
regType: 'report',
spec
}
const res = await db.collection("lack-medicine-reg").insertOne(data);
return {
success: true,
message: "新增成功",
id: res.insertedId,
};
} catch (e) {
return { success: false, message: e.message }
}
}
async function batchAddLackMedicineReg(ctx) {
try {
const regType = ['outOfStock', 'lowStock'].includes(ctx.regType) ? ctx.regType : '';
const inventory = ['online', 'store'].includes(ctx.inventory) ? ctx.inventory : 'online';
const accountId = typeof ctx.accountId === 'string' ? ctx.accountId.trim() : '';
const patientId = typeof ctx.patientId === 'string' ? ctx.patientId.trim() : '';
const description = typeof ctx.description === 'string' ? ctx.description.trim() : '';
const patientName = typeof ctx.patientName === 'string' ? ctx.patientName.trim() : '';
const phone = typeof ctx.phone === 'string' ? ctx.phone.trim() : '';
const drugs = Array.isArray(ctx.drugs) ? ctx.drugs.filter(Boolean) : [];
if (regType === '') {
return { success: false, message: "登记类型不能为空" }
}
if (accountId.length === 0) {
return { success: false, message: "账号id不能为空" }
}
if (accountId.length > 50) {
return { success: false, message: "账号id不能超过50个字" }
}
if (patientId.length > 50) {
return { success: false, message: "患者id不能超过50个字" }
}
if (description.length > 500) {
return { success: false, message: "描述不能超过500个字" }
}
if (patientName.length === 0) {
return { success: false, message: "患者姓名不能为空" }
}
if (patientName.length > 30) {
return { success: false, message: "患者姓名不能超过30个字" }
}
// 手机号验证:如果提供了手机号则必须格式正确
if (phone.length > 0 && !validator.isMobile(phone)) {
return { success: false, message: "患者手机号格式不正确" }
}
// 注意:批量自动登记允许手机号为空,因为从购药记录导入时可能没有手机号
if (phone.length === 0) {
logger.warn(`[缺货登记警告] 批量登记缺少患者手机号 - patientName: ${patientName}, patientId: ${patientId}`);
}
const validDrugs = drugs.map(i => {
const drugName = typeof i.drugName === 'string' ? i.drugName.trim() : '';
const spec = typeof i.spec === 'string' ? i.spec.trim() : '';
const manufacturer = typeof i.manufacturer === 'string' ? i.manufacturer.trim() : '';
const insuranceCode = typeof i.insurance_code === 'string' ? i.insurance_code.trim() : '';
return {
drugName: drugName.slice(0, 100),
spec: spec.slice(0, 100),
manufacturer: manufacturer.slice(0, 200),
insuranceCode: insuranceCode.slice(0, 100)
}
})
const data = {
accountId,
patientId,
corpId: typeof ctx.corpId === 'string' ? ctx.corpId.trim() : undefined,
createTime: Date.now(),
description,
images: [],
inventory,
patientName,
phone,
regType
}
let res
if (validDrugs.length) {
res = await db.collection("lack-medicine-reg").insertMany(validDrugs.map(i => ({ ...i, ...data })));
}
return {
success: true,
res,
message: "新增成功",
};
} catch (e) {
return { success: false, message: e.message }
}
}
async function getLackMedicineList(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.corpId === 'string' && ctx.corpId.trim()) {
query.corpId = ctx.corpId.trim();
}
if(Array.isArray(ctx.regTypes) && ctx.regTypes.length > 0) {
query.regType = { $in: ctx.regTypes }
}
// 缺货药品库筛选online=配送药品库store=药店药品库
if (typeof ctx.inventory === 'string') {
const inventory = ctx.inventory.trim();
if (['online', 'store'].includes(inventory)) {
query.inventory = inventory;
}
}
if (typeof ctx.drugName === 'string' && ctx.drugName.trim()) {
query.drugName = new RegExp(ctx.drugName.trim(), 'i');
}
if (ctx.startTime && dayjs(ctx.startTime).isValid()) {
query.createTime = { $gte: dayjs(ctx.startTime).startOf('day').valueOf() };
}
if (ctx.endTime && dayjs(ctx.endTime).isValid()) {
query.createTime = query.createTime || {};
query.createTime['$lte'] = dayjs(ctx.endTime).endOf('day').valueOf();
}
const list = await db.collection("lack-medicine-reg").find(query, {
projection: {
_id: 1,
drugName: 1,
spec: 1,
manufacturer: 1,
insuranceCode: 1,
images: 1,
description: 1,
patientName: 1,
phone: 1,
regType: 1,
createTime: 1,
inventory: 1,
// 将账号 id 和患者 id 一并返回,便于前端通过 patientId 或 accountId 做患者关联
accountId: 1,
patientId: 1,
}
}).sort({ createTime: -1 }).skip((page - 1) * pageSize).limit(pageSize).toArray();
const total = await db.collection("lack-medicine-reg").countDocuments(query);
return {
success: true,
message: "查询成功",
data: list,
total: total,
page: page,
pages: Math.ceil(total / pageSize),
pageSize: pageSize,
};
} catch (e) {
return { success: false, message: e.message }
}
}