2026-07-27 11:28:33 +08:00

220 lines
8.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}