181 lines
6.6 KiB
JavaScript
Raw Permalink Normal View History

2026-07-27 11:28:33 +08:00
const { ObjectId } = require("mongodb");
const validator = require('../../utils/validator.js');
const Sm4Util = require('../../utils/sm4-util.js');
let db = "";
module.exports = async (item, mongodb) => {
db = mongodb;
switch (item.type) {
case "addFamilyProfile":
return await addFamilyProfile(item);
case "getFamilyProfile":
return await getFamilyProfile(item)
case "updateFamilyProfile":
return await updateFamilyProfile(item);
case "sm4Encrypt":
return sm4Encrypt(item);
}
};
function sm4Encrypt(data) {
if (typeof data.text == 'string' && data.text.length > 0) {
return { success: true, text: Sm4Util.encryptDataForSm3(data.text) };
}
if (Array.isArray(data.textGroup) && data.textGroup.length) {
return {
success: true, textGroup: data.textGroup.map(txt => {
if (typeof txt === 'string' && txt.trim().length > 0) {
return Sm4Util.encryptDataForSm3(txt.trim());
}
return '';
})
};
}
return { success: false, message: '加密参数无效' };
}
function getValidData({ name, socialno, tel, address, userId, psnToken }) {
const list = [
{ value: name, label: '姓名', min: 2, max: 20, prop: 'name' },
{ value: socialno, label: '证件号', min: 15, max: 20, prop: 'socialno' },
{ value: tel, label: '手机号', min: 11, max: 12, prop: 'tel' },
{ value: address, label: '地址', min: 1, max: 100, prop: 'address' },
{ value: userId, label: '用户ID', min: 10, max: 24, prop: 'userId' },
{ value: psnToken, label: '医保授权码', min: 1, max: 100, prop: 'psnToken' },
]
const data = {};
return new Promise((resolve, reject) => {
for (let item of list) {
const { value, label, min, max, prop } = item;
const [valid, valOrMsg] = validator.verifyString(value, label, min, max);
if (valid) {
data[prop] = valOrMsg;
} else {
reject({ message: valOrMsg });
return;
}
}
if (!validator.isChinaId(data.socialno)) {
reject({ message: '证件号无效' });
return
}
if (!validator.isMobile(data.tel)) {
reject({ message: '手机号无效' });
return
}
resolve(data)
})
}
async function addFamilyProfile(ctx) {
const zytHis = require("../zyt-his");
try {
const data = await getValidData(ctx);
const total = await db.collection("family-profile").countDocuments({ userId: data.userId });
if (total > 10) return { success: false, message: '亲情档案已达上限' };
const anotherIdNo = Sm4Util.encryptDataForSm3(data.socialno);
const sameCount = await db.collection("family-profile").countDocuments({ anotherIdNo, userId: data.userId });
if (sameCount > 0) {
return { success: false, message: '当前账户已经绑定该亲情档案' }
}
const queryRes = await zytHis({ type: 'getHisCustomer', idCard: data.socialno });
if (!queryRes.success) return { success: false, message: queryRes.message || '查询亲情档案失败' }
let list = Array.isArray(queryRes.list) ? queryRes.list : [];
let patient = list.find(item => item.socialno === data.socialno);
// 如果已经建过档案 比较档案姓名
if (patient && patient.name !== data.name) {
return { success: false, message: '亲情档案姓名与his系统不一致请核对后再试' }
}
// 如果没有建过档案 则新增档案
if (!patient || patient.isyb !== "1") {
const params = {
name: data.name,
idCard: data.socialno,
mobile: data.tel,
address: data.address,
psnToken: data.psnToken,
}
const addRes = await zytHis({ type: 'addHisCustomer', ...params });
if (!addRes.success) return { success: false, message: addRes.message || '新增亲情档案失败(his医保建档失败)' }
list = Array.isArray(addRes.list) ? addRes.list : [];
patient = list.find(item => item.socialno === data.socialno);
}
if (!patient || patient.isyb !== "1") {
return { success: false, message: '新增亲情档案失败,未查询到档案信息或者医保建档失败' }
}
const res = await db.collection("family-profile").insertOne({
userId: data.userId,
name: patient.name,
tel: data.tel,
patientid: patient.patientid,
blhno: patient.blhno,
address: data.address,
anotherIdNo,
anotherName: Sm4Util.encryptDataForSm3(patient.name),
createTime: Date.now()
})
if (res.insertedId) {
return { success: true, message: '新增亲情档案成功', id: res.insertedId }
}
return { success: false, message: '新增亲情档案失败' }
} catch (e) {
return { success: false, message: e.message || '新增亲情档案失败' }
}
}
async function getFamilyProfile(ctx) {
const { userId } = ctx;
if (typeof userId !== 'string' || userId.length === '') {
return { success: false, message: '用户ID无效' }
}
try {
const list = await db.collection("family-profile").find({ userId: userId.trim() }).toArray();
list.forEach(item => {
item.socialno = Sm4Util.decryptDataForSm3(item.anotherIdNo);
})
return { success: true, list, message: '查询亲情档案成功' }
} catch (e) {
return { success: false, message: e.message || '查询亲情档案失败' }
}
}
async function updateFamilyProfile(ctx) {
const { id, userId, tel, address } = ctx;
if (typeof id !== 'string' || !ObjectId.isValid(id)) {
return { success: false, message: '亲情档案ID无效' }
}
if (typeof userId !== 'string' || userId.length === '') {
return { success: false, message: '用户ID无效' }
}
if (typeof tel !== 'string' || !validator.isMobile(tel)) {
return { success: false, message: '手机号无效' }
}
if (typeof address !== 'string' || address.trim().length == 0) {
return { success: false, message: '地址无效' }
}
if (address.length > 100) {
return { success: false, message: '地址长度不能超过100个字符' }
}
try {
const count = await db.collection("family-profile").countDocuments({ _id: new ObjectId(id), userId: userId.trim() });
if (count === 0) {
return { success: false, message: '亲情档案不存在或无权限修改' }
}
const res = await db.collection("family-profile").updateOne(
{ _id: new ObjectId(id), userId: userId.trim() },
{ $set: { tel, address, updateTime: Date.now() } }
);
if (res.modifiedCount > 0) {
return { success: true, message: '亲情档案更新成功' }
}
return { success: false, message: res || '亲情档案更新失败' }
} catch (e) {
return { success: false, message: e.message || '亲情档案更新失败' }
}
}