2026-07-30 16:49:41 +08:00
|
|
|
|
const dayjs = require("dayjs");
|
|
|
|
|
|
const { decode } = require('iconv-lite');
|
|
|
|
|
|
const request = require("../../request");
|
|
|
|
|
|
|
|
|
|
|
|
// const baseUrl = "http://115.239.161.48:8089"; //his说 8089可能会关闭,用8083
|
|
|
|
|
|
const baseUrl = process.env.CONFIG_HN_HIS_BASE_URL;
|
|
|
|
|
|
const url = `${baseUrl}/getYoucanData/hlw`;
|
|
|
|
|
|
|
|
|
|
|
|
const AppWin = {
|
|
|
|
|
|
line: '线上挂号',
|
|
|
|
|
|
win: '线下挂号',
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = async (item) => {
|
|
|
|
|
|
switch (item.type) {
|
2026-09-20 17:34:12 +08:00
|
|
|
|
case "updateHisDrug":
|
|
|
|
|
|
return await updateHisDrug(item);
|
2026-07-30 16:49:41 +08:00
|
|
|
|
case "getHisCustomer":
|
|
|
|
|
|
return await getHisCustomer(item);
|
|
|
|
|
|
case "addHisCustomer":
|
|
|
|
|
|
return await addHisCustomer(item);
|
|
|
|
|
|
case "hlwuploadprescription":
|
|
|
|
|
|
return await hlwuploadprescription(item);
|
|
|
|
|
|
case "hisTest":
|
|
|
|
|
|
return await hisTest(item);
|
|
|
|
|
|
case "getHisEmployeeInfo":
|
|
|
|
|
|
return await getHisEmployeeInfo(item);
|
|
|
|
|
|
case "ybReviewPrescription":
|
|
|
|
|
|
return await ybReviewPrescription(item);
|
2026-09-24 18:22:05 +08:00
|
|
|
|
case "cancelInsuranceRx":
|
|
|
|
|
|
return await cancelInsuranceRx(item);
|
2026-07-30 16:49:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
async function getHisCustomer(ctx) {
|
|
|
|
|
|
const idCard = typeof ctx.idCard === 'string' ? ctx.idCard.trim() : '';
|
|
|
|
|
|
if (!idCard) {
|
|
|
|
|
|
return { success: false, message: '证件号不能为空' }
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
const params = { type: "getHisCustomer", idCard };
|
|
|
|
|
|
const { data, status_code, message } = await request.main(url, params, "POST");
|
|
|
|
|
|
if (status_code == 200 && !message) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
list: data?.patients,
|
|
|
|
|
|
patient: data?.patients?.[0],
|
|
|
|
|
|
tmbxx: Array.isArray(data?.tmbxx) ? data?.tmbxx : [],
|
|
|
|
|
|
message: `[his]查询档案:获取his档案成功`,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: message || "获取失败",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: err.message || "获取失败",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {buildType} 建档类型 1.自费建档 2.电子凭证建档 3.线下医保建档
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
*/
|
|
|
|
|
|
async function addHisCustomer(item) {
|
|
|
|
|
|
// let { idCard, name, mobile, address, psnToken, buildType = '1', mdtrt_cert_type, mdtrt_cert_no, card_sn } = item;
|
|
|
|
|
|
try {
|
|
|
|
|
|
const name = typeof item.name === 'string' ? item.name.trim() : '';
|
|
|
|
|
|
const idCard = typeof item.idCard === 'string' ? item.idCard.trim() : '';
|
|
|
|
|
|
const mobile = typeof item.mobile === 'string' ? item.mobile.trim() : '';
|
|
|
|
|
|
const address = typeof item.address === 'string' ? item.address.trim() : '';
|
|
|
|
|
|
const psnToken = typeof item.psnToken === 'string' ? item.psnToken.trim() : '';
|
|
|
|
|
|
const mdtrt_cert_no = typeof item.mdtrt_cert_no === 'string' ? item.mdtrt_cert_no.trim() : '';
|
2026-10-21 10:54:44 +08:00
|
|
|
|
const ecToken = typeof item.ecToken === 'string' ? item.ecToken.trim() : '';
|
2026-07-30 16:49:41 +08:00
|
|
|
|
const card_sn = typeof item.card_sn === 'string' ? item.card_sn.trim() : '';
|
2026-10-22 15:30:30 +08:00
|
|
|
|
const birthday = typeof item.birthday === 'string' ? item.birthday.trim() : '';
|
|
|
|
|
|
const sex = typeof item.sex === 'string' ? item.sex.trim() : '';
|
|
|
|
|
|
|
2026-10-21 10:54:44 +08:00
|
|
|
|
if (!name || !mobile) {
|
2026-10-22 15:30:30 +08:00
|
|
|
|
return { success: false, message: '姓名、手机号不能为空' }
|
2026-07-30 16:49:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
const payload = {
|
|
|
|
|
|
type: 'addHisCustomer',
|
|
|
|
|
|
name,
|
|
|
|
|
|
idCard,
|
|
|
|
|
|
mobile,
|
|
|
|
|
|
address,
|
|
|
|
|
|
buildType: '1', // 1.自费建档 2.电子凭证建档 3.线下医保
|
|
|
|
|
|
};
|
2026-10-22 15:30:30 +08:00
|
|
|
|
if (!idCard) {
|
|
|
|
|
|
payload.brdy = birthday;
|
|
|
|
|
|
payload.gend = sex === '男' ? 1 : 2
|
|
|
|
|
|
}
|
2026-07-30 16:49:41 +08:00
|
|
|
|
// 电子凭证建档 医保插件授权建档
|
|
|
|
|
|
if (psnToken) {
|
|
|
|
|
|
payload.psnToken = psnToken;
|
|
|
|
|
|
payload.buildType = "2";
|
|
|
|
|
|
// payload.mdtrt_cert_type = '01'
|
2026-10-21 10:54:44 +08:00
|
|
|
|
} else if (mdtrt_cert_no) {
|
2026-07-30 16:49:41 +08:00
|
|
|
|
payload.mdtrt_cert_type = '03';
|
|
|
|
|
|
payload.mdtrt_cert_no = mdtrt_cert_no;
|
|
|
|
|
|
payload.card_sn = card_sn; //就诊凭证类型为“03”时填写社会保障卡内码
|
2026-10-21 10:54:44 +08:00
|
|
|
|
} else if (ecToken) {
|
|
|
|
|
|
payload.buildType = '2';
|
|
|
|
|
|
payload.mdtrt_cert_type = '01';
|
|
|
|
|
|
payload.mdtrt_cert_no = ecToken;
|
2026-07-30 16:49:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
const { data, status_code, message } = await request.main(
|
|
|
|
|
|
url,
|
|
|
|
|
|
payload,
|
|
|
|
|
|
"POST"
|
|
|
|
|
|
);
|
|
|
|
|
|
if (status_code == 200 && !message) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
list: data?.patients,
|
|
|
|
|
|
tmbxx: Array.isArray(data?.tmbxx) ? data?.tmbxx : [],
|
|
|
|
|
|
message: "获取成功",
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: message || "获取失败",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: "获取失败",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 6.外配处方回写
|
|
|
|
|
|
/**
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {*} param0
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
*/
|
|
|
|
|
|
async function hlwuploadprescription(item) {
|
|
|
|
|
|
try {
|
2026-09-04 09:57:39 +08:00
|
|
|
|
const params = { type: "hlwuploadprescription", data: item.data };
|
2026-07-30 16:49:41 +08:00
|
|
|
|
|
|
|
|
|
|
const { code, status_code, message } = await request.main(url, params, "POST");
|
|
|
|
|
|
|
|
|
|
|
|
if (status_code == 200 && code == '1') {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
message: "[his]处方上传成功",
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: `[his]处方上传失败: ${message || '未知错误'}`,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: `[his]处方上传错误: ${err.message || '未知错误'}`,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function ybReviewPrescription(item) {
|
|
|
|
|
|
try {
|
2026-09-04 09:57:39 +08:00
|
|
|
|
const params = { type: "rationalDrugReview", data: item.data };
|
|
|
|
|
|
const { status_code, code, data, message } = await request.main(url, params, "POST");
|
|
|
|
|
|
if (status_code == 200 && code == '1') {
|
2026-07-30 16:49:41 +08:00
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
2026-09-04 09:57:39 +08:00
|
|
|
|
message: message,
|
2026-07-30 16:49:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
2026-09-04 09:57:39 +08:00
|
|
|
|
message: message || '查询合理用药结果失败',
|
2026-07-30 16:49:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
2026-09-04 09:57:39 +08:00
|
|
|
|
message: `[his]查询合理用药错误: ${err.message || '未知错误'}`,
|
2026-07-30 16:49:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function getHisEmployeeInfo(item) {
|
|
|
|
|
|
const { code } = item;
|
|
|
|
|
|
try {
|
|
|
|
|
|
const testUrl = "http://115.239.161.48:8089";
|
|
|
|
|
|
const url = `${testUrl}/his/hlw/employeeinfo`;
|
|
|
|
|
|
const { data, status_code, message } = await request.main(
|
|
|
|
|
|
url,
|
|
|
|
|
|
{ type: "01", code: code },
|
|
|
|
|
|
"POST"
|
|
|
|
|
|
);
|
|
|
|
|
|
if (status_code == 200 && !message) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
data,
|
|
|
|
|
|
message: "获取成功",
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
return { success: false, message: e?.message }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function hisTest() {
|
|
|
|
|
|
// const data = {
|
|
|
|
|
|
// patientId: '10428622',
|
|
|
|
|
|
// orderNo: 'R260530160013084765664',
|
|
|
|
|
|
// tradeNo: '3JHR2605301770353161405592',
|
|
|
|
|
|
// outTradeNo: '3JHR260530160352836640789',
|
|
|
|
|
|
// totalAmount: 78
|
|
|
|
|
|
// }
|
|
|
|
|
|
// const data = { "patientid": "30015424", "registerid": "h202501070833145550001", "orderno": "h202501070833145550001", "doctorcode": "10010", "unitcode": "1005000", "visit_time": "2025-12-04 13:15", "area_code": "330602", "hospid": "108", "icds": [{ "icd_code ": "R51.x00", "icd_name": "头痛", "sort": 1 }], "details": [{ "drug_type": "xy", "drug_groupno": "7X", "drug_group": "", "drug_id": "00110", "drug_serial": "01", "drug_name": "富马酸替诺福韦二吡呋酯片", "drug_spec": "300mg×30片/盒", "drug_pric": "329.41", "drug_cnt": "1", "drug_sumamt": "329.41", "supple_code": "1", "supple_name": "口服", "medc_days": "3", "drug_times": "1", "drug_comm": "", "drug_ma": "", "remark": "", "limit_flag": "0", "usage": "11", "usage_name": "每天一次(qd)", "sin_doscnt": "2.00", "sin_dosunt": "片", "unit": "盒" }] }
|
|
|
|
|
|
// return await syncHisChargeStatus(data);
|
2026-09-04 09:57:39 +08:00
|
|
|
|
}
|
2026-09-20 17:34:12 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function updateHisDrug({ data: drugArr }) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const params = { type: "updateOnlineDrug", data: drugArr };
|
|
|
|
|
|
const { data, status_code, message } = await request.main(url, params, "POST");
|
|
|
|
|
|
if (status_code == 200 && !message) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
message: `同步his药品成功`,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: message || "同步his药品失败",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: err.message || "同步his药品错误",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
2026-09-24 18:22:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function cancelInsuranceRx(item) {
|
|
|
|
|
|
const patientId = typeof item.patientId === "string" ? item.patientId.trim() : "";
|
|
|
|
|
|
const orderno = typeof item.orderno === "string" ? item.orderno.trim() : "";
|
|
|
|
|
|
if (!patientId || !orderno) {
|
|
|
|
|
|
return { success: false, message: "医保处方缺少患者编号或处方编号" };
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
const params = { type: "hlwPrescriptionOrderCancel", patientId, orderno };
|
|
|
|
|
|
const { code, status_code, message } = await request.main(url, params, "POST");
|
|
|
|
|
|
if (status_code == 200 && code == "1") {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
message: `处方撤销成功`,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: message || "处方撤销失败",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
message: err.message || "处方撤销错误",
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|