220 lines
8.2 KiB
JavaScript
220 lines
8.2 KiB
JavaScript
|
||
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
|
||
} |