const { getDatabase } = require('../../mongodb') const Sm4Util = require('../../utils/sm4-util') const CodeMap = { updateOnlineDrug: '01'// 同步his在线药品信息 } let hlwDb = null; function isValidString(str) { return typeof str === 'string' && str.trim() !== '' && !(/^null$/i.test(str.trim())) && str.length < 200; } async function getHlwDb() { try { if (hlwDb) return hlwDb; hlwDb = await getDatabase('Internet-hospital'); if (!hlwDb) throw new Error('数据库连接失败'); return hlwDb; } catch (e) { return Promise.reject(e) } } async function handleNotify(ctx) { let data = null; try { const ciphertext = ctx && typeof ctx.data === 'string' ? ctx.data.trim() : ''; const jsonStr = Sm4Util.decryptDataForSm3(ciphertext); data = JSON.parse(jsonStr); if (Object.prototype.toString.call(data) !== '[object Object]') { return { success: false, message: '无效的通知类型' } } if (data.code === CodeMap.updateOnlineDrug) { return await updateOnlineDrug(data) } return { success: false, message: '无效的通知类型' } } catch (e) { return { success: false, message: `参数错误: ${e.message}` } } } async function updateOnlineDrug(data) { try { const db = await getHlwDb(); const corpId = typeof data.corpId === 'string' ? data.corpId.trim() : ''; const erp_id = typeof data.erp_id === 'string' ? data.erp_id.trim() : ''; const drugname = typeof data.drugname === 'string' ? data.drugname.trim() : ''; const specification = typeof data.specification === 'string' ? data.specification.trim() : ''; const pack_unit_name = typeof data.pack_unit_name === 'string' ? data.pack_unit_name.trim() : ''; const manu_name = typeof data.manu_name === 'string' ? data.manu_name.trim() : ''; const gjbm = typeof data.gjbm === 'string' ? data.gjbm.trim() : ''; const py_code = typeof data.py_code === 'string' ? data.py_code.trim() : ''; const default_dosage = Number(data.default_dosage); const default_unit = typeof data.default_unit === 'string' ? data.default_unit.trim() : ''; const default_drug_win = Number(data.default_drug_win); const default_total = Number(data.default_total); const default_usage_name = typeof data.default_usage_name === 'string' ? data.default_usage_name.trim() : ''; const default_supply_name = typeof data.default_supply_name === 'string' ? data.default_supply_name.trim() : ''; const newData = {}; const effectKeys = []; if (!corpId) { return { success: false, message: '参数错误' } } if (isValidString(erp_id) && Number(erp_id) > 0 && Number.isInteger(Number(erp_id))) { newData.product_id = Number(erp_id); newData.product_id_str = Number(erp_id).toString(); } else { return { success: false, message: 'erp id格式错误(正整数)' } } if (isValidString(drugname)) { newData.name = drugname; effectKeys.push('drugname') } else { return { success: false, message: '药瓶名称不能为空' } } if (isValidString(gjbm)) { newData.insurance_code = gjbm; effectKeys.push('gjbm') } else { return { success: false, message: '医保编码不能为空' } } if (isValidString(specification)) { newData.specification = specification; effectKeys.push('specification') } if (isValidString(manu_name)) { newData.manufacturer = manu_name; effectKeys.push('manu_name') } if (isValidString(py_code)) { newData.pinyin_code = py_code; effectKeys.push('py_code') } if (default_dosage > 0 && (default_dosage * 100) % 1 === 0) { newData.dosage = default_dosage effectKeys.push('default_dosage') } if (default_drug_win > 0 && Number.isInteger(default_drug_win)) { newData.days = default_drug_win effectKeys.push('default_drug_win') } if (default_total > 0 && Number.isInteger(default_total)) { newData.recommended_quantity = default_total effectKeys.push('default_total') } const configKeys = [ `${corpId}-medicine-package-unit`,// 药品包装单位 `${corpId}-online-medicine-dosage-unit`,//线上药品单次剂量单位 `${corpId}-online-medicine-frequence`,//线上药品用药频率 `${corpId}-online-medicine-administration`,//线上药品用药用法 ] const res = await db.collection('hlw-config').find({ corpId: { $in: configKeys } }, { projection: { corpId: 1, list: 1 } }).toArray() if (isValidString(pack_unit_name)) { const packUnitConfig = res.find(i => i.corpId === `${corpId}-medicine-package-unit`) const list = packUnitConfig && Array.isArray(packUnitConfig.list) ? packUnitConfig.list : []; const packUnit = list.find(i => i.name === pack_unit_name); if (packUnit) { newData.unit = packUnit.name effectKeys.push('pack_unit_name') } } if (isValidString(default_unit)) { const dosageUnitConfig = res.find(i => i.corpId === `${corpId}-online-medicine-dosage-unit`) const list = dosageUnitConfig && Array.isArray(dosageUnitConfig.list) ? dosageUnitConfig.list : []; const dosageUnit = list.find(i => i.name === default_unit); if (dosageUnit) { newData.dosage_unit = dosageUnit.name; effectKeys.push('default_unit') } } if (isValidString(default_usage_name)) { const administrationConfig = res.find(i => i.corpId === `${corpId}-online-medicine-administration`) const list = administrationConfig && Array.isArray(administrationConfig.list) ? administrationConfig.list : []; const usage = list.find(i => i.name === default_usage_name); if (usage) { newData.administration_method = usage.name; effectKeys.push('default_usage_name') } } if (isValidString(default_supply_name)) { const supplyConfig = res.find(i => i.corpId === `${corpId}-online-medicine-frequence`) const list = supplyConfig && Array.isArray(supplyConfig.list) ? supplyConfig.list : []; const supply = list.find(i => i.name === default_supply_name); if (supply) { newData.frequency = supply.name; newData.freq = supply.name; effectKeys.push('default_supply_name') } } // return { success: true, data, effectKeys } const med = await db.collection('online-drug-info').findOne({ product_id: Number(erp_id) }); if (med) { newData.updateTime = Date.now(); newData.updater = 'hisPush'; await db.collection('online-drug-info').updateOne({ _id: med._id }, { $set: newData }) return { success: true, message: '更新成功', valid_keys: effectKeys.join() } } else { newData.createTime = Date.now(); newData.creator = 'hisPush'; newData.onSale = false; await db.collection('online-drug-info').insertOne(newData) return { success: true, message: '新增成功', valid_keys: effectKeys.join() } } } catch (e) { return { success: false, message: `更新失败: ${e.message}` } } } async function notifyTest() { const str = getPayload() const res = await handleNotify(str); return res } function getPayload() { // const data = { // code: '01', // corpId: '4G7H8J2K9L0M1N3P5Q6R7S8T9U0V1', // erp_id: '0001', // drugname: '药品名称1', // specification: '药品规格1', // pack_unit_name: '瓶', // manu_name: '厂商名称1', // gjbm: '医保编码1', // py_code: 'pinyin1', // default_dosage: 2, // default_unit: '颗', // default_usage_name: '口服', // default_drug_win: 8, // default_supply_name: '每天二次', // default_total: 4 // }; const data = { "code": "01", "corpId": "4G7H8J2K9L0M1N3P5Q6R7S8T9U0V1", "erp_id": "52362", "drugname": "(21金维他)多维元素片(21)", "specification": "60粒×5瓶/条 ", "pack_unit_name": "条", "manu_name": "杭州民生健康药业有限公司", "gjbm": "XA11AAD190A001020904494", "py_code": "(21JWT)D", "default_dosage": null, "default_unit": null, "default_usage_name": null, "default_drug_win": null, "default_supply_name": null, "default_total": null } return { data: Sm4Util.encryptDataForSm3(JSON.stringify(data)) } } module.exports = { handleNotify, notifyTest }