2026-07-27 11:28:33 +08:00

666 lines
18 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const dayjs = require("dayjs");
const sop = require("../sop");
const common = require("../../common");
const appFunction = require("../app-function");
const customerHisSyncAppFunction = require("../app-function/customerHisSync.js");
let db = null;
let recordDB = null;
exports.main = async (content, DB) => {
db = DB;
recordDB = db.collection("medical-record");
switch (content.type) {
case "addMedicalRecord":
return await exports.add(content);
case "getCustomerMedicalRecord":
return await exports.getList(content);
case "getMedicalRecordById":
return await exports.getById(content);
case "updateMedicalRecord":
return await exports.update(content);
case "removeMedicalRecord":
return await exports.remove(content);
case "mergeMedicalHisRecord":
return await mergeMedicalHisRecord(content);
case "getArriveTime":
return await exports.getArriveTime(content);
case "getMedicalFiledsTrend":
return await exports.getMedicalFiledsTrend(content);
case "addHealthIndicators":
return await addHealthIndicators(content);
case "getHealthIndicators":
return await getHealthIndicators(content);
case "getHealthIndicatorsTemplate":
return await exports.getHealthIndicatorsTemplate(content);
}
};
async function getHealthIndicators({ corpId, memberId }) {
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
try {
const list = await db
.collection("corp-health-indicators")
.find({ memberId, corpId })
.limit(1000)
.toArray();
return { success: true, message: "获取客户信息成功", list };
} catch (e) {
return { success: false, message: "获取客户信息失败" };
}
}
exports.getHealthIndicatorsTemplate = async function (context) {
const { corpId } = context;
try {
let list = await db
.collection("health-indicators-template")
.find({ corpId })
.toArray();
if (list.length === 0) {
list = await db
.collection("health-indicators-template")
.find({ corpId: { $exists: false } })
.toArray();
}
const templateList =
Array.isArray(list) && list[0] ? list[0].templateList : [];
return { success: true, message: "获取客户信息成功", templateList };
} catch (e) {
return { success: false, message: "获取客户信息失败" };
}
};
exports.getMedicalFiledsTrend = async function (context) {
const { corpId, memberId, field, dates } = context;
const { startTime, lastTime } = getStartAndEndTime(dates);
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
if (!field) {
return { success: false, message: "字段不能为空" };
}
let query = { corpId, memberId, [field]: { $exists: true } };
if (startTime && lastTime) {
query.createTime = { $gte: startTime, $lte: lastTime };
}
try {
const list = await recordDB
.find(query)
.project({ [field]: 1, createTime: 1, _id: 0 })
.sort({ createTime: 1 })
.toArray();
return { success: true, message: "获取客户信息成功", list };
} catch (e) {
return { success: false, message: "获取客户信息失败" };
}
};
function getStartAndEndTime(dates) {
if (!dates || dates.length === 0) {
return {
startTime: "",
lastTime: "",
};
}
let t_1 = dates[0];
let t_2 = dates[1];
return {
startTime: t_1 && new Date(t_1).setHours(0, 0, 0, 0),
lastTime: t_2 && new Date(t_2).setHours(23, 59, 59, 999),
};
}
exports.add = async function (context) {
const {
memberId,
corpId,
personResponsibles,
customerUserId,
createTeamId,
createTeamName,
customerName = "",
...rest
} = context;
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
try {
const id = common.generateRandomString(24);
await recordDB.insertOne({
_id: id,
...rest,
memberId,
corpId,
createTime: new Date().getTime(),
});
// 更新健康指标
const healthIndicatorsActtionTask = healthIndicatorsActtion({
corpId,
memberId,
rest,
type: "add",
recordId: id,
});
const time = rest.sortTime && dayjs(rest.sortTime).isValid();
const case1 =
["outpatient", "inhospital"].includes(rest.medicalType) &&
rest.corp === "本院";
const case2 = [
"healthProjectTemplate",
"physicalExaminationTemplate",
].includes(rest.medicalType);
//更新入院时间到客户档案
let updateCustomerTimeFieldTask = null;
if (time && (case1 || case2)) {
updateCustomerTimeFieldTask = updateCustomerVisitTime({
memberId,
visitTime: rest.sortTime,
});
}
let triggerSopTask = null;
if (rest.medicalType !== "healthRecord") {
triggerSopTask = triggerSop({
medicalRecord: rest,
memberId,
corpId,
medicalRecordId: id,
});
}
const params = {
eventType: "customerUpdate",
customerId: memberId,
executorUserId: rest.creator,
executeTeamId: createTeamId,
createTeamName,
creatorUserId: rest.creator,
corpId,
customerName,
createTime: dayjs().valueOf(),
taskContent: `更新${customerName}客户健康档案`,
executionTime: dayjs().valueOf(),
};
const addServiceRecordTask = rest.creator
? appFunction.addServiceRecord(params)
: null;
await Promise.all([
healthIndicatorsActtionTask,
updateCustomerTimeFieldTask,
triggerSopTask,
addServiceRecordTask,
]);
return {
success: true,
message: "新增成功",
data: id,
};
} catch (e) {
return { success: false, message: "新增失败" };
}
};
updateCustomerVisitTime = async function (context) {
const { memberId, visitTime } = context;
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!visitTime) {
return { success: false, message: "到院时间不能为空" };
}
try {
await db
.collection("member")
.updateOne({ _id: memberId, visitTimes: { $nin: [visitTime] } }, { $push: { visitTimes: visitTime } });
return { success: true, message: "更新成功" };
} catch (e) {
return { success: false, message: "更新失败" };
}
};
// 执行sop
async function triggerSop({
medicalRecord,
memberId,
corpId,
medicalRecordId,
healthIndicators,
}) {
if (!memberId) return;
if (
medicalRecord &&
medicalRecord.medicalType === "outpatient" &&
medicalRecord.diagnosisName
) {
medicalRecord["outpatientDiagnosis"] = medicalRecord.diagnosisName;
}
if (
medicalRecord &&
medicalRecord.medicalType === "inhospital" &&
medicalRecord.diagnosisName
) {
medicalRecord["inhospitalDiagnosis"] = medicalRecord.diagnosisName;
}
const query = {
corpId,
customerId: memberId,
medicalRecord,
medicalRecordId,
healthIndicators,
};
let res = await sop.main(
{
type: "triggerSopTask",
...query,
},
db
);
console.log("sop", res);
}
// 更改健康指标操作
async function healthIndicatorsActtion({
corpId,
memberId,
recordId,
rest,
type,
}) {
try {
let healthIndicators = {};
let { templateList, success } = await exports.getHealthIndicatorsTemplate({
corpId,
});
if (success) {
for (let item of templateList) {
healthIndicators[item.title] = item.name;
}
}
//遍历 rest 的所有字段
let isMatch = false;
for (let key in rest) {
if (healthIndicators[key]) {
isMatch = true;
if (type === "update" || type === "add") {
let value = rest[key];
if (typeof value === "string" && !isNaN(value)) value = Number(value);
await addHealthIndicators({
corpId,
memberId,
field: key,
value,
recordId,
type,
});
} else if (type === "remove") {
await removeRecordMerageHealthIndicators({
corpId,
memberId,
recordId,
field: key,
});
}
}
}
if (isMatch) {
// 触发sop
console.log("触发sop");
const { success, list } = await getHealthIndicators({ corpId, memberId });
let healthIndicators = {};
if (success && list) {
for (let item of list) {
healthIndicators[item.type] = item.value;
}
}
await triggerSop({ memberId, corpId, healthIndicators });
}
} catch (e) {
console.error("healthIndicatorsActtion error:", e);
}
}
async function addHealthIndicators({
corpId,
memberId,
field,
value,
name,
recordId,
type,
}) {
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
try {
const params = { type: field, memberId, corpId };
const query = type === "update" ? { ...params, recordId } : params;
const count = await db
.collection("corp-health-indicators")
.find(query)
.count();
if (count > 0) {
await db.collection("corp-health-indicators").updateOne(params, {
$set: { value, updateTime: new Date().getTime(), recordId },
});
} else {
type === "add" &&
(await db.collection("corp-health-indicators").insertOne({
_id: common.generateRandomString(24),
...params,
createTime: new Date().getTime(),
value,
name,
recordId,
}));
}
return { success: true, message: "新增成功" };
} catch (e) {
return { success: false, message: "新增失败" };
}
}
// 删除健康档案后同步健康指标
async function removeRecordMerageHealthIndicators({
corpId,
memberId,
recordId,
field,
}) {
// 获取到档案中最新一条field的值
const record = await recordDB
.find({ corpId, memberId, [field]: { $exists: true } })
.sort({ createTime: -1 })
.limit(1)
.toArray();
let value = record.length ? record[0][field] : "";
const newRecordId = record.length ? record[0]._id : "";
const params = { type: field, memberId, corpId };
if (typeof value === "string" && !isNaN(value)) value = Number(value);
const count = await db
.collection("corp-health-indicators")
.find({ ...params, recordId })
.count();
if (count > 0) {
await db.collection("corp-health-indicators").updateOne(
{ ...params, recordId },
{
$set: {
value,
updateTime: new Date().getTime(),
recordId: newRecordId,
},
}
);
} else {
await db.collection("corp-health-indicators").insertOne({
_id: common.generateRandomString(24),
...params,
createTime: new Date().getTime(),
value,
recordId: newRecordId,
});
}
}
exports.getById = async function (context) {
const { corpId, _id, memberId, medicalType } = context;
if (!_id) {
return { success: false, message: "id不能为空" };
}
if (!medicalType) {
return { success: false, message: "类型不能为空" };
}
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
try {
const record = await recordDB.findOne({
_id,
corpId,
memberId,
medicalType,
});
if (record) {
return { success: true, message: "查询信息成功", record };
}
return { success: false, message: "未查询到信息" };
} catch (e) {
return { success: false, message: "查询信息失败" };
}
};
exports.getList = async function (context) {
let { memberId, corpId, startTime, endTime, medicalType, dataSource } = context;
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
// 判断medicalType 是否是字符串
if (typeof medicalType === "string") {
medicalType = [medicalType];
}
try {
const query = { memberId, corpId };
if (dataSource) query.dataSource = dataSource;
if (medicalType) query.medicalType = { $in: medicalType };
const dateFilter = {};
if (startTime) dateFilter.$gte = startTime;
if (endTime) dateFilter.$lte = endTime;
// 如果日期筛选条件不为空,添加到 sortTime 字段
if (Object.keys(dateFilter).length) {
query.sortTime = dateFilter;
}
const list = await recordDB.find(query).sort({ sortTime: -1 }).toArray();
// hisList 根据sortTime排序
list.sort((a, b) => b.sortTime - a.sortTime);
return { success: true, message: "获取客户信息成功", list };
} catch (e) {
return { success: false, message: e.message || "获取客户信息失败" };
}
};
async function mergeMedicalHisRecord(context) {
const { corpId, customerNumber, memberId, recordDates } = context;
let startTime = "",
endTime = "";
if (recordDates && Array.isArray(recordDates)) {
startTime = recordDates[0];
endTime = recordDates[1];
}
if (!customerNumber) {
return { success: false, message: "客户编号不能为空" };
}
try {
// 获取现有的医疗记录仅查询ID和visitId、hospitalizationId等必要字段
const customerMedicalRecord = await recordDB
.find({ corpId, memberId })
.toArray();
const existingVisitIds = new Set(
customerMedicalRecord.map((item) => item.visitId)
);
const existingHospitalizationIds = new Set(
customerMedicalRecord.map((item) => item.hospitalizationId)
);
let medicalTypes = ["outpatient", "inhospital"];
const tasks = medicalTypes.map(async (medicalType) => {
const query = { corpId, customerNumber, startTime, endTime };
let { list, success } =
medicalType === "outpatient"
? await customerHisSyncAppFunction.getHisOutHospitalRecord(query)
: await customerHisSyncAppFunction.getHisInHospitalRecord(query);
console.log(list);
if (!success || !list) return;
const recordsToAdd = list
.filter((i) => {
i.corp = "本院";
i.corpId = corpId;
i.memberId = memberId;
i.medicalType = medicalType;
if (medicalType === "outpatient") {
i.sortTime = i.visitTime ? dayjs(i.visitTime).valueOf() : "";
return !existingVisitIds.has(i.visitId); // 检查是否已存在
} else if (medicalType === "inhospital") {
i.sortTime = i.inhosDate ? dayjs(i.inhosDate).valueOf() : "";
return !existingHospitalizationIds.has(i.hospitalizationId); // 检查是否已存在
}
return false;
})
.map((i) => {
i.visitTime = i.visitTime ? dayjs(i.visitTime).valueOf() : "";
return i;
});
if (recordsToAdd.length > 0) {
await Promise.all(recordsToAdd.map((record) => exports.add(record)));
}
});
// 执行所有异步任务并等待完成
await Promise.all(tasks);
return { success: true, message: "合并成功" };
} catch (e) {
console.error("mergeMedicalHisRecord error:", e);
return { success: false, message: "合并失败" };
}
}
exports.update = async function (context) {
const { memberId, corpId, _id, userId, creator, ...rest } = context;
if (!_id) {
return { success: false, message: "id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
try {
const record = await exports.getById({
corpId,
_id,
memberId,
medicalType: rest.medicalType,
});
if (record.success) {
if (record.record.dataSource !== 'customerReport' && !userId) {
return { success: false, message: "员工id不能为空" };
}
await recordDB.updateOne(
{ _id },
{
$set: {
...rest,
memberId,
corpId,
updateBy: userId,
updateTime: new Date().getTime(),
},
}
);
// 更新健康指标
await healthIndicatorsActtion({
corpId,
memberId,
recordId: _id,
rest,
type: "update",
});
if (rest.medicalType !== "healthRecord") {
await triggerSop({
medicalRecord: rest,
memberId,
corpId,
medicalRecordId: _id,
});
}
return { success: true, message: "更新成功" };
}
return { success: false, message: record.message };
} catch (e) {
console.log(e);
return { success: false, message: "更新失败" };
}
};
exports.remove = async function (context) {
const { memberId, corpId, _id, medicalType } = context;
if (!_id) {
return { success: false, message: "id不能为空" };
}
if (!corpId) {
return { success: false, message: "机构id不能为空" };
}
if (!memberId) {
return { success: false, message: "客户id不能为空" };
}
if (!medicalType) {
return { success: false, message: "类型不能为空" };
}
try {
const record = await exports.getById({
corpId,
_id,
memberId,
medicalType,
});
if (record.success) {
await recordDB.deleteOne({ _id });
await healthIndicatorsActtion({
corpId,
memberId,
recordId: _id,
rest: record.record,
type: "remove",
});
return { success: true, message: "删除成功" };
}
return { success: false, message: record.message };
} catch (e) {
console.log(e);
return { success: false, message: "删除失败" };
}
};
exports.getArriveTime = async (context) => {
try {
const { corpId, memberId } = context;
if (corpId && memberId) {
const query = await recordDB
.find({ corpId, memberId, corp: { $ne: "其他" } })
.sort({ sortTime: -1 })
.limit(1)
.project({ sortTime: 1, _id: 0 })
.toArray();
const time =
query && query.length && query[0].sortTime > 0 ? query[0].sortTime : 0;
if (time > 0) {
return { success: true, message: "查询到最近到院时间成功", time };
}
}
return { success: false, message: "未查询到最近到院时间" };
} catch (e) {
return { success: false, message: "查询到最近到院时间失败" };
}
};