2026-10-22 15:30:30 +08:00

309 lines
9.9 KiB
JavaScript

const { ObjectId } = require('mongodb');
const validator = require('../../utils/validator');
const Sm4Util = require('../../utils/sm4-util');
const hnHis = require('../hn-his');
const COLLECTION_NAME = 'hlw-patient';
exports.main = async ({ type, ...item }, db) => {
switch (type) {
case 'addHlwPatient':
return addHlwPatient(item, db);
case 'autoAddHlwPatient':
return autoAddHlwPatient(item, db);
case 'getHlwPatientList':
return getHlwPatientList(item, db);
case 'getHlwPatient':
return getHlwPatient(item, db);
case 'updateHlwPatient':
return updateHlwPatient(item, db);
case 'deleteHlwPatient':
return deleteHlwPatient(item, db);
default:
return { success: false, message: '未找到就诊人接口' };
}
};
function validateAccountId(accountId) {
if (typeof accountId !== 'string' || accountId.trim() === '') {
return { success: false, message: 'accountId不能为空' };
}
return { success: true, accountId: accountId.trim() };
}
function isValidBirthday(birthday) {
if (!/^\d{4}-\d{2}-\d{2}$/.test(birthday)) return false;
const [year, month, day] = birthday.split('-').map(Number);
const date = new Date(Date.UTC(year, month - 1, day));
return (
date.getUTCFullYear() === year
&& date.getUTCMonth() + 1 === month
&& date.getUTCDate() === day
&& date.getTime() <= Date.now()
);
}
function validatePatient(item) {
const accountResult = validateAccountId(item && item.accountId);
if (!accountResult.success) return accountResult;
const name = typeof item.name === 'string' ? item.name.trim() : '';
const certNo = typeof item.certNo === 'string' ? item.certNo.trim() : '';
const mobile = typeof item.mobile === 'string' ? item.mobile.trim() : '';
let birthday = typeof item.birthday === 'string' ? item.birthday.trim() : '';
let sex = typeof item.sex === 'string' ? item.sex.trim() : '';
if (!name) return { success: false, message: '姓名不能为空' };
let certInfo = null;
if (certNo) {
certInfo = validator.getChinaIdInfo(certNo);
if (!certInfo) return { success: false, message: '证件号格式不正确' };
birthday = birthday || certInfo.birthday;
sex = sex || certInfo.sex;
}
if (!birthday) return { success: false, message: '出生日期不能为空' };
if (!isValidBirthday(birthday)) {
return { success: false, message: '出生日期格式不正确' };
}
if (!sex) return { success: false, message: '性别不能为空' };
if (!['男', '女'].includes(sex)) {
return { success: false, message: '性别格式不正确' };
}
if (certInfo && (birthday !== certInfo.birthday || sex !== certInfo.sex)) {
return { success: false, message: '出生日期或性别与证件号信息不一致' };
}
if (!mobile) return { success: false, message: '手机号不能为空' };
if (!validator.isMobile(mobile)) {
return { success: false, message: '手机号格式不正确' };
}
let address = '';
if (item.address !== undefined && item.address !== null) {
if (typeof item.address !== 'string') {
return { success: false, message: '地址格式不正确' };
}
address = item.address.trim();
}
return {
success: true,
origin: {
name,
certNo,
mobile,
birthday,
sex,
address,
},
data: {
accountId: accountResult.accountId,
anotherIdNo: certNo ? Sm4Util.encryptDataForSm3(certNo) : '',
anotherName: Sm4Util.encryptDataForSm3(name),
anotherMobile: Sm4Util.encryptDataForSm3(mobile),
birthday,
sex,
address,
},
};
}
async function addHlwPatient(item, db) {
try {
const validation = validatePatient(item);
if (!validation.success) return validation;
if (validation.origin.certNo) {
const exists = await db.collection(COLLECTION_NAME).countDocuments({
accountId: validation.data.accountId,
anotherIdNo: validation.data.anotherIdNo,
disabled: false,
});
if (exists > 0) {
return { success: false, message: '当前账户下已存在相同证件号的就诊人' };
}
}
// if (validation.origin.certNo) {
// const res = await hnHis({
// type: 'addHisCustomer',
// name: validation.origin.name,
// idCard: validation.origin.certNo,
// mobile: validation.origin.mobile,
// address: validation.origin.address,
// birthday: validation.origin.birthday,
// sex: validation.origin.sex,
// })
// if (!res.success) return res;
// }
const result = await db.collection(COLLECTION_NAME).insertOne({
...validation.data,
createTime: new Date(),
disabled: false,
});
return {
success: true,
message: '新增就诊人成功',
id: result.insertedId.toString(),
};
} catch (error) {
return { success: false, message: error.message || '新增就诊人失败' };
}
}
async function autoAddHlwPatient(item, db) {
try {
const validation = validatePatient(item);
if (!validation.success) return validation;
if (validation.origin.certNo) {
const exists = await db.collection(COLLECTION_NAME).countDocuments({
accountId: validation.data.accountId,
anotherIdNo: validation.data.anotherIdNo,
disabled: false,
});
if (exists > 0) {
return { success: true, data: true, message: '就诊人已存在' };
}
}
const result = await addHlwPatient(item, db);
if (!result.success) return result;
return { success: true, data: true, message: '自动新增就诊人成功' };
} catch (error) {
return { success: false, message: error.message || '自动新增就诊人失败' };
}
}
async function getHlwPatientList(item, db) {
try {
const validation = validateAccountId(item && item.accountId);
if (!validation.success) return validation;
const patients = await db.collection(COLLECTION_NAME)
.find({ accountId: validation.accountId, disabled: false })
.toArray();
const data = patients.map((patient) => toPatientData(patient, true));
return { success: true, message: '查询就诊人列表成功', data };
} catch (error) {
return { success: false, message: error.message || '查询就诊人列表失败' };
}
}
async function getHlwPatient(item, db) {
try {
const validation = validateAccountId(item && item.accountId);
if (!validation.success) return validation;
if (!item || typeof item.id !== 'string' || !ObjectId.isValid(item.id.trim())) {
return { success: false, message: '就诊人ID格式不正确' };
}
const patient = await db.collection(COLLECTION_NAME).findOne({
_id: new ObjectId(item.id.trim()),
accountId: validation.accountId,
disabled: false,
});
if (!patient) {
return { success: false, message: '就诊人不存在或accountId不匹配' };
}
return { success: true, message: '查询就诊人成功', data: toPatientData(patient) };
} catch (error) {
return { success: false, message: error.message || '查询就诊人失败' };
}
}
function calculateAge(birthday) {
if (!isValidBirthday(birthday)) return '';
const [birthYear, birthMonth, birthDay] = birthday.split('-').map(Number);
const today = new Date();
let age = today.getFullYear() - birthYear;
const hasHadBirthdayThisYear = (
today.getMonth() + 1 > birthMonth
|| (today.getMonth() + 1 === birthMonth && today.getDate() >= birthDay)
);
if (!hasHadBirthdayThisYear) age -= 1;
return age > 0 ? age : 1;
}
function toPatientData(patient, normalizeDemographics = false) {
const certNo = Sm4Util.decryptDataForSm3(patient.anotherIdNo);
const certInfo = normalizeDemographics && certNo
? validator.getChinaIdInfo(certNo)
: null;
// 证件号信息仅用于本次响应,不回写数据库中的历史就诊人数据。
const birthday = certInfo ? certInfo.birthday : (patient.birthday || '');
const sex = certInfo ? certInfo.sex : (patient.sex || '');
return {
id: patient._id.toString(),
accountId: patient.accountId,
name: Sm4Util.decryptDataForSm3(patient.anotherName),
certNo,
mobile: Sm4Util.decryptDataForSm3(patient.anotherMobile),
birthday,
sex,
...(normalizeDemographics ? { age: calculateAge(birthday) } : {}),
address: patient.address || '',
createTime: patient.createTime,
};
}
async function updateHlwPatient(item, db) {
try {
const validation = validatePatient(item);
if (!validation.success) return validation;
if (typeof item.id !== 'string' || !ObjectId.isValid(item.id.trim())) {
return { success: false, message: '就诊人ID格式不正确' };
}
const result = await db.collection(COLLECTION_NAME).updateOne(
{
_id: new ObjectId(item.id.trim()),
accountId: validation.data.accountId,
disabled: false,
},
{ $set: validation.data },
);
if (result.matchedCount === 0) {
return { success: false, message: '就诊人不存在或accountId不匹配' };
}
return { success: true, message: '更新就诊人成功' };
} catch (error) {
return { success: false, message: error.message || '更新就诊人失败' };
}
}
async function deleteHlwPatient(item, db) {
try {
const validation = validateAccountId(item && item.accountId);
if (!validation.success) return validation;
if (!item || typeof item.id !== 'string' || !ObjectId.isValid(item.id.trim())) {
return { success: false, message: '就诊人ID格式不正确' };
}
const result = await db.collection(COLLECTION_NAME).updateOne(
{
_id: new ObjectId(item.id.trim()),
accountId: validation.accountId,
disabled: false,
},
{ $set: { disabled: true } },
);
if (result.matchedCount === 0) {
return { success: false, message: '就诊人不存在或accountId不匹配' };
}
return { success: true, message: '删除就诊人成功' };
} catch (error) {
return { success: false, message: error.message || '删除就诊人失败' };
}
}