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_ZYT_HIS_BASE_URL; const AppWin = { line: '线上挂号', win: '线下挂号', } module.exports = async (item) => { switch (item.type) { case "getHisCustomer": return await getHisCustomer(item); case "addHisCustomer": return await addHisCustomer(item); case "registration": return await registration(item); case "getPayStatus": return await getPayStatus(item); case "hlwRefund": return await hlwRefund(item); case "hlwuploadprescription": return await hlwuploadprescription(item); case "hlwPrescriptionOrderStatus": return await hlwPrescriptionOrderStatus(item); case "getHisPrescriptionUploadStatus": return await getHisPrescriptionUploadStatus(item); case "getHisStoreRegList": return await getHisStoreRegList(item); case "insurancePreSettle": return await insurancePreSettle(item); case "insuranceSettle": return await insuranceSettle(item); case "insuranceRefund": return await insuranceRefund(item); case "getRecent90daysDrugRecord": return await getRecent90daysDrugRecord(item); case "uploadMedicinePurchaseRx": return await uploadMedicinePurchaseRx(item); case "uploadWinePurchaseRx": return await uploadWinePurchaseRx(item); case "getHisDrugInfo": return await getHisDrugInfo(item); case "getHisMedicinePurchase": return await getHisMedicinePurchase(item); case "cancelMedicinePurchase": return await cancelMedicinePurchase(item); case "refundMedicinePurchase": return await refundMedicinePurchase(item); case "getHisInvoice": return await getHisInvoice(item); case "updateMedicinePurchaseDelivery": return await updateMedicinePurchaseDelivery(item); case 'syncHisChargeStatus': return await syncHisChargeStatus(item); case "hisTest": return await hisTest(item); case "getHisEmployeeInfo": return await getHisEmployeeInfo(item); case "syncHisRefundStatus": return await syncHisRefundStatus(item); case "getWineDrugStockInfo": return await getWineDrugStockInfo(item); case "ybReviewPrescription": return await ybReviewPrescription(item); } }; async function getHisCustomer(item) { const { idCard, anotherIdNo } = item; try { const params = { type: "01" }; if (idCard) { params.idnumber = idCard; } else if (anotherIdNo) { const Sm4Util = require('../../utils/sm4-util'); params.idnumber = Sm4Util.decryptDataForSm3(anotherIdNo); } if (!params.idnumber) { return { success: false, message: '证件号不能为空' } } const url = `${baseUrl}/his/hlw/patientinfo`; 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], 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 url = `${baseUrl}/his/hlw/patientbulid`; const payload = { type: buildType, name, socialno: idCard, tel: mobile, }; if (typeof address === "string") { payload.address = address; } // 电子凭证建档 医保插件授权建档 if (psnToken) { payload.psnToken = psnToken; payload.type = "2"; } // 线下医保建档 // mdtrt_cert_type 就诊凭证类型 01 | 03 // mdtrt_cert_no 就诊凭证号码 mdtrt_cert_type为01 填写电子凭证令牌 | mdtrt_cert_type为03 填写社会保障卡卡号 if (mdtrt_cert_type) { payload.mdtrt_cert_type = mdtrt_cert_type; payload.mdtrt_cert_no = mdtrt_cert_no; payload.card_sn = card_sn; //就诊凭证类型为“03”时填写社会保障卡内码 payload.type = "3"; } const { data, status_code, message } = await request.main( url, payload, "POST" ); if (status_code == 200 && !message) { return { success: true, list: data?.patients, message: "获取成功", }; } else { return { success: false, message: message || "获取失败", }; } } catch (err) { return { success: false, message: "获取失败", }; } } // 预约挂号 async function registration(item) { const { patientId, doctorCode, appwin = 'line', unitCode, registerId, chargecode, reg_fee, shopid, shopname, op_id = '', channel } = item; if (AppWin[appwin] == undefined) { return { success: false, message: "appwin参数错误" } } if (AppWin[appwin] == '线下挂号' && (typeof op_id !== 'string' || op_id.trim() === '')) { return { success: false, message: "op_id参数错误" } } try { const url = `${baseUrl}/his/hlw/registration`; // 根据dayjs 判断是上午 还是下午 const ampm = dayjs().hour() < 12 ? "a" : "p"; const requestday = dayjs().format("YYYY-MM-DD HH:mm:ss"); // registerId 为 H开头 15位随机数 const payload = { patientId, doctorCode, unitCode, requestday, ampm, registerId, chargecode, reg_fee, shopid, shopname, chargetype: "普通", appwin }; if (AppWin[appwin] == '线下挂号') { payload.op_id = op_id; } if (channel === 1) { payload.channel = 1 } const { data, status_code, message } = await request.main( url, payload, "POST" ); if (data && data.register && data.register.medorg_order_no) { return { success: true, data, message: message || "挂号成功", }; } else { return { success: false, message: message || "挂号失败", }; } } catch (err) { return { success: false, message: err.message || "挂号失败" }; } } //订单支付状态查询 async function getPayStatus(item) { const { patientId, registerId, medorgOrderNo } = item; try { const url = `${baseUrl}/his/hlw/settlement`; const { status, status_code, message, ...rest } = await request.main( url, { patientid: patientId, registerid: registerId, medorg_order_no: medorgOrderNo, }, "POST" ); const settlement = rest.data && rest.data.settlement ? rest.data.settlement : null; //settlement.status 0 已收费 1 已退费 5 未收费 x 已作废 if (status_code == 200) { return { success: true, status: settlement ? settlement.status : '', settlement, message: "订单查询成功", }; } else { return { success: false, message: message || "获取失败", }; } } catch (err) { return { success: false, message: "获取失败", }; } } //医保患者退费 async function hlwRefund(item) { const { patientId, registerId, medorgOrderNo } = item; try { const url = `${baseUrl}/his/hlw/refund`; const { data, status_code, message, ...rest } = await request.main( url, { patientid: patientId, registerid: registerId, medorg_order_no: medorgOrderNo, }, "POST" ); if (status_code == 200 && !message) { return { success: true, message: "退费成功", }; } else { return { success: false, message: message || "退费失败", }; } } catch (err) { return { success: false, message: "退费失败", }; } } // 6.外配处方回写 /** * * @param {*} param0 * @returns */ async function hlwuploadprescription(item) { try { const url = `${baseUrl}/his/hlw/ordersave`; const { code, status_code, message } = await request.main( url, item.data, "POST" ); if (status_code == 200 && code == '1' && !message) { return { success: true, message: "[his]处方上传成功", }; } else { return { success: false, message: `[his]处方上传失败: ${message || '未知错误'}`, }; } } catch (err) { return { success: false, message: `[his]处方上传错误: ${err.message || '未知错误'}`, }; } } // 外配处方状态查询 async function hlwPrescriptionOrderStatus(item) { const { patientId, orderno } = item; try { const url = `${baseUrl}/his/hlw/orderstatus`; const { status_code, message, data } = await request.main( url, { patientid: patientId, orderno, }, "POST" ); if (status_code == 200 && data && data.orderstatus) { return { success: true, uploaded: data.orderstatus.status == '1', status: data.orderstatus.status, message: "查询成功", }; } else { return { success: false, message: message || "查询失败", }; } } catch (err) { return { success: false, message: "查询失败", }; } } async function getHisPrescriptionUploadStatus(item) { const { patientId, orderno, _id } = item; try { const url = `${baseUrl}/his/hlw/orderstatus`; const { status_code, message, data } = await request.main( url, { patientid: patientId, orderno, }, "POST" ); if (status_code == 200 && data && data.orderstatus && data.orderstatus.status == 1) { return { orderno, hisUploadStatus: 'uploaded', _id } } if (status_code == 200 && data && data.orderstatus && data.orderstatus.status == -1) { return { orderno, hisUploadStatus: 'error', _id } } if (status_code == 200 && data && data.orderstatus && data.orderstatus.status == 0) { return { orderno, hisUploadStatus: 'notUploaded', _id } } return { success: false, message: message || "查询失败", }; } catch (err) { return { success: false, message: "查询失败", }; } } async function getHisStoreRegList(item) { const { storeId: shopid } = item; if (typeof shopid !== 'string' || shopid.trim() === '') { return { success: false, message: "店铺id无效", }; } try { const url = `${baseUrl}/his/hlw/registerquery`; const { status_code, message, data } = await request.main( url, { shopid, requestday: dayjs().format('YYYY-MM-DD HH:mm:ss'), status: "0", starttime: dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), endtime: dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss'), hospid: "108", }, "POST" ); if (status_code == 200 && Array.isArray(data)) { return { success: true, list: data, message: "查询成功", }; } else { return { success: false, message: message || "查询失败", }; } } catch (err) { return { success: false, message: "查询失败", }; } } async function insurancePreSettle(ctx) { const { medorg_order_no: orderno, patientId: patientid, mdtrtCertNo: mdtrt_cert_no, mdtrtCertType: mdtrt_cert_type, cardSn: card_sn, operator_code, operator_name, shopid, hospid = "108" } = ctx; try { const url = `${baseUrl}/his/hlw/presettle`; const payload = { orderno, patientid, mdtrt_cert_no, mdtrt_cert_type, card_sn, operator_code, operator_name, hospid, shopid }; const { data, status_code, message } = await request.main(url, payload, "POST"); if (status_code == 200 && !message) { return { success: true, data, message: '预结算成功' } } return { success: false, message: message || '预结算失败' } } catch (e) { return { success: false, message: e.message || '预结算失败' } } } async function insuranceSettle(ctx) { const { patientid, orderno, mdtrt_id, mdtrt_cert_no, outparm_1101, outparm_2206A, inparm_2207A, outparm_2204, totalamount, selfpay, operator_code, operator_name } = ctx; const payload = { patientid, orderno, settle_method: '7', paymethod: '1', // 1: 现金 w: 支付宝 z: 微信 paysn: '', payrequestsn: '', mdtrt_id, mdtrt_cert_no, outparm_1101, outparm_2206A, inparm_2207A, outparm_2204, totalamount, selfpay, operator_code, operator_name } try { const url = `${baseUrl}/his/hlw/ybsettle`; // const url = `${baseUrl}/his/hlw/presettle`; const { data, status_code, message } = await request.main(url, payload, "POST"); if (status_code == 200 && !message) { return { success: true, data, message: '结算成功' } } return { success: false, message: message || '结算失败' } } catch (e) { return { success: false, message: e.message || '结算失败' } } } async function insuranceRefund(ctx) { const { type, ...payload } = ctx; try { const url = `${baseUrl}/his/hlw/ybrefund`; // const url = `${baseUrl}/his/hlw/presettle`; const { data, status_code, message } = await request.main(url, payload, "POST"); if (status_code == 200 && !message) { return { success: true, data, message: '退费成功' } } return { success: false, message: message || '退费失败' } } catch (e) { return { success: false, message: e.message || '退费失败' } } } async function getRecent90daysDrugRecord(ctx) { const patientid = typeof ctx.patientId === 'string' ? ctx.patientId.trim() : ''; if (patientid === '') { return { success: false, message: '患者ID不能为空' } } try { const url = `${baseUrl}/his/hlw/patientzj3100`; const payload = { patientid, hospid: "108", doctorCode: '10021' }; if (typeof ctx.doctorcode === 'string' && ctx.doctorcode.trim() !== '') { payload.doctorcode = ctx.doctorcode.trim(); } const { data, status_code, message } = await request.main(url, payload, "POST"); if (status_code == 200 && !message && data && data.outparm_zj3100) { // 解析医保用药数据列表 const decodedBuffer = Buffer.from(data.outparm_zj3100, 'base64'); const gbkDecodedStr = decode(decodedBuffer, 'gbk'); const res = JSON.parse(gbkDecodedStr); const drugList = res && res.data && Array.isArray(res.data.lists) ? res.data.lists.map(i => ({ hiListName: i.hiListName, insuranceCode: i.hilistCode, mdtrtId: i.mdtrtId, quantity: i.cnt, spec: i.spec && i.spec !== 'null' ? i.spec : '', unit: i.unit && i.unit !== 'null' ? i.unit : '' })) : []; // 解析医保记录 const decodedBuffer1 = Buffer.from(data.outparm_zj3101, 'base64'); const gbkDecodedStr1 = decode(decodedBuffer1, 'gbk'); const res1 = JSON.parse(gbkDecodedStr1); const recordList = res1 && res1.data && Array.isArray(res1.data.lists) ? res1.data.lists.map(i => ({ mdtrtId: i.mdtrtId, date: i.admDate, medinsName: i.medinsName, })) : []; return { success: true, drugList, message: '查询成功', recordList } } return { success: false, message: message || '查询失败' } } catch (e) { return { success: false, message: e.message || '查询失败' } } } async function getHisDrugInfo(item) { try { const ignoreAreaCode = typeof item.ignoreAreaCode === 'boolean' ? item.ignoreAreaCode : false; if (!ignoreAreaCode && (typeof item.areaCode !== 'string' || item.areaCode.trim() === '')) { return { success: false, message: '区域代码不能为空' } } const showAll = typeof item.showAll === 'boolean' ? item.showAll : false; const gjbm = Array.isArray(item.insuranceCodes) ? item.insuranceCodes.filter(i => typeof i === 'string' && i.trim() !== '') : []; console.log('gjbm: ', gjbm) if (gjbm.length === 0 && !showAll) { return { success: false, message: '医保编码不能为空' } } const url = `${baseUrl}/his/hlw/drug`; const payload = { hospid: '108', drug_type: 'xy', area_code: typeof item.areaCode === 'string' ? item.areaCode.trim() : '', gjbm: gjbm.join(',') } const { code, status_code, message, data } = await request.main( url, payload, "POST" ); if (status_code == 200 && code == '1' && !message) { return { success: true, message: "[his]查询药品信息成功", data: data && Array.isArray(data.drugs) ? data.drugs : [] }; } else { return { success: false, message: `[his]查询药品信息传失败: ${message || '未知错误'}`, }; } } catch (err) { return { success: false, message: `[his]查询药品信息传错误: ${err.message || '未知'}`, }; } } async function uploadMedicinePurchaseRx(item) { try { const { data } = item; const url = `${baseUrl}/his/hlw/mzordersave`; const { code, status_code, message } = await request.main( url, data, "POST" ); if (status_code == 200 && code == '1' && !message) { return { success: true, message: "[his]购药订单处上传成功", }; } else { return { success: false, message: `[his]购药订单处方上传失败: ${message || '未知错误'}`, }; } } catch (err) { return { success: false, message: `[his]购药订单处方上传错误: ${err.message || '未知'}`, }; } } async function uploadWinePurchaseRx(item) { try { const { data } = item; const url = `${baseUrl}/his/hlw/tcsave`; const { code, status_code, message } = await request.main( url, data, "POST" ); console.log('data', code, status_code, message); if (status_code == 200 && code == '1' && !message) { return { success: true, message: "[his]浸酒处上传成功", }; } else { return { success: false, message: `[his]浸酒处方上传失败: ${message || '未知错误'}`, }; } } catch (err) { return { success: false, message: `[his]浸酒处方上传错误: ${err.message || '未知'}`, }; } } // hlwuploadprescription async function ybReviewPrescription(item) { try { const url = `${baseUrl}/his/hlw/ybsh`; const { code, data, status_code, message } = await request.main( url, item.data, "POST" ); if (status_code == 200 && code == '1' && !message) { const str = Buffer.from(data, 'base64'); const dataStr = decode(str, 'gbk'); const strData = JSON.parse(dataStr); const result = strData && strData.output && Array.isArray(strData.output.result) ? strData.output.result.filter(Boolean) : []; const advices = result.map(i => ({ name: typeof i.rule_name === 'string' ? i.rule_name.trim() : '', text: typeof i.vola_cont === 'string' ? i.vola_cont.trim() : '', })).filter(i => i.name || i.text) return { success: true, advices, message: "[his]医保审核成功", }; } else { return { success: false, message: `[his]医保审核失败: ${message || '未知错误'}`, }; } } catch (err) { return { success: false, message: `[his]医保审核错误: ${err.message || '未知错误'}`, }; } } async function getHisMedicinePurchase({ patientId, orderNo }) { try { const url = `${baseUrl}/his/hlw/orderquery`; const { code, status_code, message, data } = await request.main(url, { patientid: patientId, orderno: orderNo }, "POST"); const order = data && Array.isArray(data.orders) ? data.orders[0] : null; if (status_code == 200 && code == '1' && !message) { if (order) { return { success: true, data: order, message: '查询成功' } } return { success: false, message: `[his]处方订单查询失败: 未找到订单` } } return { success: false, message: `[his]处方订单查询失败: ${message || '未知错误'}`, }; } catch (err) { return { success: false, message: `[his]处方订单查询错误: ${err.message || '未知错误'}` }; } } async function cancelMedicinePurchase({ patientId: patientid, orderNo: orderno }) { try { const url = `${baseUrl}/his/hlw/ordercancel`; const { code, status_code, message } = await request.main(url, { patientid, orderno }, "POST"); if (status_code == 200 && code == '1' && !message) { return { success: true, message: '[his]取消购药订单处方成功' } } return { success: false, message: `[his]取消购药订单处方失败: ${message || '未知错误'}` } } catch (err) { return { success: false, message: `[his]取消购药订单处方错误: ${err.message || '未知错误'}` }; } } async function refundMedicinePurchase({ patientId: patientid, orderNo: orderno }) { try { const url = `${baseUrl}/his/hlw/orderrefund`; const { code, status_code, message } = await request.main(url, { patientid, orderno }, "POST"); if (status_code == 200 && code == '1' && !message) { return { success: true, message: '[his]退费购药订单处方成功' } } return { success: false, message: `[his]退费购药订单处方失败: ${message || '未知错误'}` } } catch (err) { return { success: false, message: `[his]退费购药订单处方错误: ${err.message || '未知错误'}` }; } } async function getHisInvoice(item) { try { const { patientId, orderNo } = item; const url = `${baseUrl}/his/hlw/dzfp`; let { code, status_code, message, data } = await request.main(url, { patientid: patientId, orderno: orderNo }, "POST"); if (status_code == 200 && code == '1' && !message) { const dzfp = data && Array.isArray(data.dzfp) ? data.dzfp[0] : null; return { success: true, data: dzfp && dzfp.dzfp_url ? dzfp.dzfp_url : '', message: '发票查询成功' } } return { success: false, message: `[his]发票查询失败: ${message || '未知错误'}` } } catch (err) { return { success: false, message: `[his]发票查询错误: ${err.message || '未知错误'}` }; } } async function updateMedicinePurchaseDelivery(item) { try { const { patientId: patientid, orderNo: orderno, backFlag: back_flag = 0, shippingType: deliv_type, shippingNo: deliv_no, shippingFee: deliv_fee, pickupCode: tracking_no, payTime: pay_dt, tradeNo: pay_orderno, receiveName: shipp_name, receivePhone: shipp_tel, fullAddress: shipp_addr, invoice } = item; const payload = { patientid, orderno, back_flag, // 0 收取运费 | 1 退还运费 deliv_type, deliv_no, deliv_fee, pay_dt, pay_orderno, shipp_name, shipp_tel, shipp_addr, tracking_no, invoice } const url = `${baseUrl}/his/hlw/delivery`; let { code, status_code, message, data } = await request.main(url, payload, "POST"); if (status_code == 200 && code == '1' && !message) { return { success: true, data, message: '[his]同步配药订单物流信息成功' } } return { success: false, message: `[his]同步配药订单物流信息失败: ${message || '未知错误'}` } } catch (err) { return { success: false, message: `[his]同步配药订单物流信息错误: ${err.message || '未知错误'}` }; } } async function syncHisChargeStatus(ctx) { try { const payload = { patientid: ctx.patientId, orderno: ctx.orderNo, settle_method: 1, paymethod: 'h', paysn: ctx.tradeNo, payrequestsn: ctx.outTradeNo, totalamount: ctx.totalAmount, selfpay: ctx.totalAmount, operator_code: 'hlw', operator_name: '互联网医院' } const url = `${baseUrl}/his/hlw/ybsettle`; let { code, status_code, message, data } = await request.main(url, payload, "POST"); if (status_code == 200 && code == '1' && !message) { return { success: true, data, message: '[his]同步浸酒订单收费成功' } } return { success: false, message: `[his]同步浸酒订单收费失败: ${message || '未知错误'}` } } catch (err) { return { success: false, message: `[his]同步浸酒订单收费错误: ${err.message || '未知错误'}` }; } } async function syncHisRefundStatus(ctx) { try { const payload = { patientid: ctx.patientId, orderno: ctx.orderNo, ptlsh: ctx.refundSerialNo } const url = `${baseUrl}/his/hlw/orderrefund`; let { code, status_code, message, data } = await request.main(url, payload, "POST"); if (status_code == 200 && code == '1' && !message) { return { success: true, data, message: '[his]同步浸酒订单退费成功' } } return { success: false, message: `[his]同步浸酒订单退费失败: ${message || '未知错误'}` } } catch (err) { return { success: false, message: `[his]同步浸酒订单退费错误: ${err.message || '未知错误'}` }; } } 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 getWineDrugStockInfo(item) { try { if (typeof item.code !== 'string' || item.code.trim() === '') { return { success: false, message: '中药饮片代码不能为空' } } if (!(Number.isInteger(item.num) && item.num > 0)) { return { success: false, message: '中药饮片数量必须是整数且大于0' } } const url = `${baseUrl}/his/hlw/drug`; const payload = { hospid: '108', drug_type: 'zcy', tc_code: item.code.trim(), tc_number: item.num } const { code, status_code, message, data } = await request.main( url, payload, "POST" ); if (status_code == 200 && code == '1') { return { success: true, message: "[his]查询药品信息成功", data: data }; } return { success: false, message: `中药饮品查询失败: ${message || '未知错误'}`, }; } catch (err) { return { success: false, message: `中药饮品查询失败错误: ${err.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); }