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 || '删除就诊人失败' }; } }