284 lines
8.5 KiB
JavaScript
284 lines
8.5 KiB
JavaScript
|
|
let db = "";
|
||
|
|
const dayjs = require("dayjs");
|
||
|
|
module.exports = async (item, mongodb) => {
|
||
|
|
db = mongodb;
|
||
|
|
switch (item.type) {
|
||
|
|
case "getDoctorPrescriptionCount":
|
||
|
|
return await getDoctorPrescriptionCount(item, db);
|
||
|
|
case "getStoreOrderStatistics":
|
||
|
|
return await getStoreOrderStatistics(item, db);
|
||
|
|
case "getTimePeriodStatistics":
|
||
|
|
return await getTimePeriodStatistics(item, db);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 统计医生开方数量
|
||
|
|
async function getDoctorPrescriptionCount(item, db) {
|
||
|
|
try {
|
||
|
|
// 构建基础查询条件
|
||
|
|
const query = {
|
||
|
|
status: "PASS", // 只统计成功的处方
|
||
|
|
};
|
||
|
|
// 添加时间范围过滤条件
|
||
|
|
if (item.endDate && item.startDate) {
|
||
|
|
query.createTime = {
|
||
|
|
$gte: dayjs(item.startDate).valueOf(),
|
||
|
|
$lte: dayjs(item.endDate).valueOf(),
|
||
|
|
};
|
||
|
|
} else {
|
||
|
|
// 默认查询当天数据
|
||
|
|
const today = new Date();
|
||
|
|
const startOfDay = new Date(today.setHours(0, 0, 0, 0)).getTime();
|
||
|
|
const endOfDay = new Date(today.setHours(23, 59, 59, 999)).getTime();
|
||
|
|
query.createTime = {
|
||
|
|
$gte: startOfDay,
|
||
|
|
$lte: endOfDay,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
// 添加状态过滤条件
|
||
|
|
if (item.orderSource) {
|
||
|
|
query.orderSource = item.orderSource;
|
||
|
|
}
|
||
|
|
// 进行聚合查询
|
||
|
|
const result = await db
|
||
|
|
.collection("diagnostic-record")
|
||
|
|
.aggregate([
|
||
|
|
{
|
||
|
|
$match: query, // 应用基础查询条件
|
||
|
|
},
|
||
|
|
{
|
||
|
|
$group: {
|
||
|
|
_id: "$doctorCode", // 按医生代码分组
|
||
|
|
doctorName: { $first: "$doctorName" }, // 获取医生姓名
|
||
|
|
prescriptionCount: { $sum: 1 }, // 计算开方数量
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
$project: {
|
||
|
|
_id: 0,
|
||
|
|
doctorCode: "$_id",
|
||
|
|
doctorName: 1,
|
||
|
|
prescriptionCount: 1,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
$sort: { prescriptionCount: -1 }, // 按开方数量降序排序
|
||
|
|
},
|
||
|
|
])
|
||
|
|
.toArray();
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "查询成功",
|
||
|
|
data: result,
|
||
|
|
};
|
||
|
|
} catch (e) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: e.message || "查询医生开方统计失败",
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 统计店铺订单数据
|
||
|
|
async function getStoreOrderStatistics(item, db) {
|
||
|
|
try {
|
||
|
|
// 构建基础查询条件
|
||
|
|
let query = {
|
||
|
|
drugStoreNo: { $exists: true, $ne: null }, // 确保drugStoreNo存在且不为null
|
||
|
|
status: "PASS", // 只统计成功的处方
|
||
|
|
};
|
||
|
|
// 添加时间范围过滤条件
|
||
|
|
if (item.endDate && item.startDate) {
|
||
|
|
query.createTime = {
|
||
|
|
$gte: dayjs(item.startDate).valueOf(),
|
||
|
|
$lte: dayjs(item.endDate).valueOf(),
|
||
|
|
};
|
||
|
|
} else {
|
||
|
|
// 默认查询当天数据
|
||
|
|
const today = new Date();
|
||
|
|
const startOfDay = new Date(today.setHours(0, 0, 0, 0)).getTime();
|
||
|
|
const endOfDay = new Date(today.setHours(23, 59, 59, 999)).getTime();
|
||
|
|
query.createTime = {
|
||
|
|
$gte: startOfDay,
|
||
|
|
$lte: endOfDay,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
if (item.orderSource) {
|
||
|
|
query.orderSource = item.orderSource;
|
||
|
|
}
|
||
|
|
// 直接从diagnostic-record表按drugStoreNo分组查询
|
||
|
|
const prescriptionStats = await db
|
||
|
|
.collection("diagnostic-record")
|
||
|
|
.aggregate([
|
||
|
|
{
|
||
|
|
$match: query, // 应用筛选条件
|
||
|
|
},
|
||
|
|
{
|
||
|
|
$group: {
|
||
|
|
_id: "$drugStoreNo", // 直接按drugStoreNo分组
|
||
|
|
prescriptionCount: { $sum: 1 }, // 计算处方数量
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
$sort: { prescriptionCount: -1 }, // 按处方数量降序排序
|
||
|
|
},
|
||
|
|
])
|
||
|
|
.toArray();
|
||
|
|
// 获取所有相关的drugStoreNo
|
||
|
|
const storeIds = prescriptionStats.map((item) => item._id);
|
||
|
|
// 查询store-list集合获取店铺区域信息
|
||
|
|
const storeList = await db
|
||
|
|
.collection("store-list")
|
||
|
|
.find({ store_id: { $in: storeIds } })
|
||
|
|
.toArray();
|
||
|
|
// 创建一个store_id到区域名称的映射
|
||
|
|
const storeMap = {};
|
||
|
|
storeList.forEach((store) => {
|
||
|
|
storeMap[store.store_id] = {
|
||
|
|
areaName: store.area || "未知区域",
|
||
|
|
storeName: store.name || "未知店铺",
|
||
|
|
storetype: store.type,
|
||
|
|
region: store.region,
|
||
|
|
};
|
||
|
|
});
|
||
|
|
// 合并数据
|
||
|
|
const result = prescriptionStats.map((stat) => {
|
||
|
|
const storeInfo = storeMap[stat._id] || {
|
||
|
|
areaName: "未知区域",
|
||
|
|
storeName: "未知店铺",
|
||
|
|
};
|
||
|
|
return {
|
||
|
|
drugStoreNo: stat._id,
|
||
|
|
storeName: storeInfo.storeName,
|
||
|
|
areaName: storeInfo.areaName,
|
||
|
|
storetype: storeInfo.storetype,
|
||
|
|
region: storeInfo.region,
|
||
|
|
prescriptionCount: stat.prescriptionCount,
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "查询成功",
|
||
|
|
data: result,
|
||
|
|
};
|
||
|
|
} catch (e) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: e.message || "查询店铺订单统计失败",
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 统计各时间段处方数量
|
||
|
|
async function getTimePeriodStatistics(item, db) {
|
||
|
|
try {
|
||
|
|
// 构建基础查询条件
|
||
|
|
const query = {
|
||
|
|
status: "PASS", // 只统计成功的处方
|
||
|
|
};
|
||
|
|
if (item.orderSource) {
|
||
|
|
query.orderSource = item.orderSource;
|
||
|
|
}
|
||
|
|
// 添加时间范围过滤条件
|
||
|
|
if (item.date) {
|
||
|
|
query.createTime = {
|
||
|
|
$gte: dayjs(item.date).startOf("day").valueOf(),
|
||
|
|
$lte: dayjs(item.date).endOf("day").valueOf(),
|
||
|
|
};
|
||
|
|
} else {
|
||
|
|
// 默认查询当天数据
|
||
|
|
const today = new Date();
|
||
|
|
const startOfDay = new Date(today.setHours(0, 0, 0, 0)).getTime();
|
||
|
|
const endOfDay = new Date(today.setHours(23, 59, 59, 999)).getTime();
|
||
|
|
query.createTime = {
|
||
|
|
$gte: startOfDay,
|
||
|
|
$lte: endOfDay,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
// 时间段定义
|
||
|
|
const timeSlots = [
|
||
|
|
// { name: "70:00-07:30", start: 0, end: 7.5 },
|
||
|
|
{ name: "07:30-08:00", start: 7.5, end: 8 },
|
||
|
|
{ name: "08:00-08:30", start: 8, end: 8.5 },
|
||
|
|
{ name: "08:30-09:00", start: 8.5, end: 9 },
|
||
|
|
{ name: "09:00-09:30", start: 9, end: 9.5 },
|
||
|
|
{ name: "09:30-10:00", start: 9.5, end: 10 },
|
||
|
|
{ name: "10:00-10:30", start: 10, end: 10.5 },
|
||
|
|
{ name: "10:30-11:00", start: 10.5, end: 11 },
|
||
|
|
{ name: "11:00-11:30", start: 11, end: 11.5 },
|
||
|
|
{ name: "11:30-12:00", start: 11.5, end: 12 },
|
||
|
|
{ name: "12:00-12:30", start: 12, end: 12.5 },
|
||
|
|
{ name: "12:30-13:00", start: 12.5, end: 13 },
|
||
|
|
{ name: "13:00-13:30", start: 13, end: 13.5 },
|
||
|
|
{ name: "13:30-14:00", start: 13.5, end: 14 },
|
||
|
|
{ name: "14:00-14:30", start: 14, end: 14.5 },
|
||
|
|
{ name: "14:30-15:00", start: 14.5, end: 15 },
|
||
|
|
{ name: "15:00-15:30", start: 15, end: 15.5 },
|
||
|
|
{ name: "15:30-16:00", start: 15.5, end: 16 },
|
||
|
|
{ name: "16:00-16:30", start: 16, end: 16.5 },
|
||
|
|
{ name: "16:30-17:00", start: 16.5, end: 17 },
|
||
|
|
{ name: "17:00-17:30", start: 17, end: 17.5 },
|
||
|
|
{ name: "17:30-18:00", start: 17.5, end: 18 },
|
||
|
|
{ name: "18:00-18:30", start: 18, end: 18.5 },
|
||
|
|
{ name: "18:30-19:00", start: 18.5, end: 19 },
|
||
|
|
{ name: "19:00-19:30", start: 19, end: 19.5 },
|
||
|
|
{ name: "19:30-20:00", start: 19.5, end: 20 },
|
||
|
|
{ name: "20:00-20:30", start: 20, end: 20.5 },
|
||
|
|
{ name: "20:30-21:00", start: 20.5, end: 21 },
|
||
|
|
{ name: "21:00-24:00", start: 21, end: 24 },
|
||
|
|
];
|
||
|
|
|
||
|
|
// 获取指定时间范围内的所有处方记录
|
||
|
|
const prescriptions = await db
|
||
|
|
.collection("diagnostic-record")
|
||
|
|
.find(query)
|
||
|
|
.toArray();
|
||
|
|
|
||
|
|
// 初始化结果对象
|
||
|
|
const resultMap = {};
|
||
|
|
timeSlots.forEach((slot) => {
|
||
|
|
resultMap[slot.name] = 0;
|
||
|
|
});
|
||
|
|
|
||
|
|
// 统计每个时间段的处方数量
|
||
|
|
prescriptions.forEach((prescription) => {
|
||
|
|
const date = new Date(prescription.createTime);
|
||
|
|
const hour = date.getHours();
|
||
|
|
const minute = date.getMinutes();
|
||
|
|
const decimalHour = hour + minute / 60; // 转换为小数形式的小时
|
||
|
|
|
||
|
|
// 查找对应的时间段
|
||
|
|
for (const slot of timeSlots) {
|
||
|
|
if (decimalHour >= slot.start && decimalHour < slot.end) {
|
||
|
|
resultMap[slot.name]++;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// 转换为数组格式
|
||
|
|
const result = Object.entries(resultMap)
|
||
|
|
.map(([timeSlot, count]) => ({
|
||
|
|
timeSlot,
|
||
|
|
count,
|
||
|
|
}))
|
||
|
|
.sort((a, b) => {
|
||
|
|
// 按时间段顺序排序
|
||
|
|
return (
|
||
|
|
timeSlots.findIndex((slot) => slot.name === a.timeSlot) -
|
||
|
|
timeSlots.findIndex((slot) => slot.name === b.timeSlot)
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
return {
|
||
|
|
success: true,
|
||
|
|
message: "查询成功",
|
||
|
|
data: result,
|
||
|
|
};
|
||
|
|
} catch (e) {
|
||
|
|
return {
|
||
|
|
success: false,
|
||
|
|
message: e.message || "查询时间段统计失败",
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|