def _common_fun(pacs_assem_id): log.info( '开始通过PACS项目组ID:{}从体检系统中,获取映射的体检项目组ID及科室ID信息.'.format(pacs_assem_id)) assems = None if appconfig['MAP_CODE_IS_ASSEM_ID']: assems = get_assem_by_id(pacs_assem_id) else: assems = get_assem_by_map(appconfig['DEPARTMENTS_RANGE'], pacs_assem_id) if len(assems) == 0: raise NotFoundException( 'pacs项目组对照码:{},在体检系统中没有找到相应的项目组与其对应.'.format(pacs_assem_id)) log.info('使用PACS项目组ID:{}找到{}条项目组映射.'.format(pacs_assem_id, len(assems))) department_id_set = set([assem.department_id for assem in assems]) if len(department_id_set) > 1: raise InvalidMultiException( 'pacs项目组对照码:{}对应了多个科室的项目组,这是无效的,多个科室id:{}'.format( pacs_assem_id, department_id_set)) assem_id_list = [str(assem.id) for assem in assems] assem_name_list = [assem.name for assem in assems] log.info('获取到项目组id:{} 对应的项目组名字:{}'.format(assem_id_list, assem_name_list)) # 开始尝试登录到体检系统 exam_username = appconfig['JK_EXAM_USERNAME'] exam_password = appconfig['JK_EXAM_PASSWORD'] log.info('开始尝试登录体检系统,用户名:{} 密码:{}'.format(exam_username, exam_password)) result = tjAssert(loginByUserNamePwd(exam_username, exam_password)) log.info(result['msg']) return list(department_id_set)[0], ','.join(assem_id_list)
def _loginTj(): log.info('开始登录体检系统...') r = loginByUserNamePwd(JK_EXAM_USERNAME, JK_EXAM_PASSWORD) tjAssert(r) log.info(r['msg'])
def _login(): log.info('开始登录体检系统') r = loginByUserNamePwd(appconfig['JK_EXAM_USERNAME'], appconfig['JK_EXAM_PASSWORD']) tjAssert(r) log.info('体检系统登录成功')
def transLisByAssem(departmentId, order_id, assemId, lis_result_dict): """ 上传LIS数据到体检系统中 :param departmentId: 科室ID :param assemId:项目组ID :lis_result_dict:项目结果字典 :return: """ lis_result_key_set = set() for key in lis_result_dict.keys(): lis_result_key_set.add(key) # 开始尝试登录到体检系统 log.info('开始尝试登录体检系统,用户名:{} 密码:{}'.format(appconfig['JK_EXAM_USERNAME'], appconfig['JK_EXAM_PASSWORD'])) result = tjAssert( loginByUserNamePwd(appconfig['JK_EXAM_USERNAME'], appconfig['JK_EXAM_PASSWORD'])) log.info('开始根据科室、项目组、预约号获取体检信息,科室ID:{} 预约号:{} 项目组ID:{}'.format( departmentId, order_id, assemId)) msg = tjAssert( loadExam(dept=departmentId, orderId=order_id, filterAssemIds=assemId)) log.info('开始检查以及组装体检项目...') exam = msg['msg'] assem = exam['assems'][0] elements = assem['elements'] # 使用外键组成项目字典 examElementDict = {} examElementSet = set() for element in elements: extCode = None if appconfig['IS_LIS_ITEM_MAPPING']: # 如果不需要映射项目 extCode = element['elementId'] else: extCode = element['extSysControlCode'] # 如果需要映射项目 if not extCode: raise TJException('项目名:{} 的系统对照为空'.format(element['elementName'])) # 开始分割项目对照码,一个小项,可以有多个对照码,使用,,|^,进行分割 keys = re.split(r',|,|\^|\|', extCode) for key in keys: if key: code = key.strip() if code: examElementDict[code] = element examElementSet.add(code) # 计算体检检查项目及lis项目结果列表的交集 both_set = set.intersection(examElementSet, lis_result_key_set) # 开始对小项进行标记 for code in both_set: examElementDict[code]['bingo'] = True errMsgs = [] log.info('开始检查哪些项目,在HIS中没有结果...') # 开始检查哪些项目没有结果 for element in elements: if 'bingo' not in element.keys(): errMsg = '在LIS提供的项目列表中,未发现项目id:{} 项目名:{} 项目对照:{}的项目'.format( element['elementId'], element['elementName'], element['extSysControlCode']) errMsgs.append(errMsg) if len(errMsgs) > 0: raise TJException(';'.join(errMsgs)) log.info('开始生成LIS体检项目...') lisDatas = { 'orderId': order_id, 'elementAssemId': assemId, 'departmentId': departmentId, 'sampleOpId': None, # 报告人 'opId': None, # 审核人 'items': [] } c = 0 item_results = [] for code in both_set: try: examElement = examElementDict[code] hisLisElement = lis_result_dict[code] if c == 0: log.info('用于获取项目结果及操作员的记录ID:{}'.format(hisLisElement.ID)) sampleOpId, opId = _get_opid(hisLisElement) lisDatas['sampleOpId'] = sampleOpId lisDatas['opId'] = opId lisElement = {} lisElement['elementId'] = examElement['elementId'] lisElement[ 'checkElementResult'] = hisLisElement.CONTENT_RESULT.strip( ) if hisLisElement.CONTENT_RESULT else None lisElement[ 'ferenceLower'] = hisLisElement.FERENCE_LOWER_LIMIT if _is_number( hisLisElement.FERENCE_LOWER_LIMIT) else 0 lisElement[ 'ferenceUpper'] = hisLisElement.FERENCE_UPPER_LIMIT if _is_number( hisLisElement.FERENCE_UPPER_LIMIT) else 0 # 参考范围,使用新版的参考范围 lisElement['showFerence'] = hisLisElement.FERENCE_VALUE lisElement['unit'] = hisLisElement.RESULT_UNIT resultType = examElement['resultType'] lisElement['resultType'] = resultType lisElement['referenceType'] = '1' # e['refType'] # 危机值的标识? lisElement[ 'criticalValuesSymbol'] = hisLisElement.CRITICAL_VALUES_SYMBOL # 第三方接入标识 lisElement['sumJudgeType'] = 1 if resultType == '1': # 数值类值 if hisLisElement.POSTIVE_SYMBOL in ('↓', 'L', 'LL'): lisElement['positiveSymbol'] = '低' elif hisLisElement.POSTIVE_SYMBOL in ('↑', 'H', 'HH'): lisElement['positiveSymbol'] = '高' elif resultType == '2': # 文本类型 if hisLisElement.POSITIVE_SYMBOL == '↑' \ or '阳' in hisLisElement.POSITIVE_SYMBOL: lisElement['positiveSymbol'] = lisElement[ 'checkElementResult'] # 非正常值的话,这里写检查结果 # if hisLisElement.POSITIVE_SYMBOL == '↓': # lisElement['positiveSymbol'] = '低' # elif hisLisElement.POSITIVE_SYMBOL == '↑': # lisElement['positiveSymbol'] = '高' # else: # lisElement['positiveSymbol'] = None lisDatas['items'].append(lisElement) # 项目的结果值列表保存,作为将来的参考,结构为 项目名称^项目结果^审核时间 item_results.append('{}^{}^{}'.format( hisLisElement.LIS_ELEMENT_NAME, hisLisElement.CONTENT_RESULT, hisLisElement.AUDIT_DATE.strftime('%Y-%m-%d %H:%M:%S') if hisLisElement.AUDIT_DATE else None)) finally: c += 1 log.info('开始上传LIS结果数据...') examData = json.dumps(lisDatas) log.info(examData) log.info("开始保存LIS结果....") result = tjAssert(saveLisExamData(examData)) log.info(result['msg']) return '\n'.join(item_results)
def save_gmd(): # 获取参数 r = {"Msg": None, "Status": "SUCCESS"} log.info('开始解析骨密度参数...') try: # print(request.json) gmd = json.loads(str(request.data, encoding='utf-8')) log.info('获取到要保存的骨密度数据:{}'.format(gmd)) patient_id = gmd.get('patientID') t = gmd.get('t') z = gmd.get('z') examDoctor = gmd.get('examDoctor') check_result = gmd.get('checkResultStr') log.info('获取到patient_id:{} t值:{} z值:{} 检查结果:{} examDoctor:{}'.format( patient_id, t, z, check_result, examDoctor)) exam_username = appconfig['JK_EXAM_USERNAME'] exam_password = appconfig['JK_EXAM_PASSWORD'] log.info('开始尝试登录体检系统,用户名:{} 密码:{}'.format(exam_username, exam_password)) result = tjAssert(loginByUserNamePwd(exam_username, exam_password)) log.info(result['msg']) # 获取报告医生的ID reporterId = getUserIdByRealName(examDoctor, appconfig['PACS_USE_EXAM_DOCTOR'], 'gmd') log.info("获取报告医生ID为:{}".format(reporterId)) log.info('开始保存骨密度数据...') # 获取诊断医生ID department_id = appconfig['DEPARTMENT'] assemdIds = appconfig['ASSEM_ID'] order_id = patient_id log.info('开始根据科室、项目组、预约号获取体检信息,科室ID:{} 预约号:{} 项目组ID:{}'.format( department_id, order_id, assemdIds)) msg = tjAssert( loadExam(dept=department_id, orderId=patient_id, filterAssemIds=assemdIds)) exam = msg['msg'] # 初始化保存数据 saveExam = initSaveExam(exam, department_id, reporterId, reporterId) # 小项结果 fs = {'3837': str(t), '3838': str(z)} addElementResult(saveExam, exam=exam, opId=reporterId, **fs) log.info('获取诊断信息:{}'.format(check_result)) summary = check_result log.info('获取结论:{}'.format(summary)) writeSymbol = None diseaseCode = None if summary.find('骨量正常') >= 0: writeSymbol = '03' else: result = getDiseaseByName(summary) if result is None: writeSymbol = '02' else: writeSymbol = '01' diseaseCode = result['msg']['id'] log.info("获取诊断方式:{},疾病名称:{},疾病id:{}".format(writeSymbol, summary, diseaseCode)) addDisease(saveExam, exam=exam, deptId=department_id, opId=reporterId, writeSymbol=writeSymbol, diseaseName=summary, diseaseCode=diseaseCode) # 开始提交分科结果 examData = json.dumps(saveExam) log.info(examData) log.info('开始提交分科结果...') result = tjAssert(saveExamData(examData)) log.info(result['msg']) # 开始上传图像 img = gmd.get('image') if img: log.info('开始上传图像报告...') upload_report(order_id=patient_id, department_id=department_id, pacs_assem_id=assemdIds, pacs_assem_name='超声骨密度', reporter_id=reporterId, report_base64=img, report_date=datetime.now()) r['Msg'] = '上传成功' except Exception as e: r['Msg'] = "上传失败!{}".format(repr(e)) log.error('上传数据失败') log.exception(e) finally: log.info('返回数据:{}'.format(r)) return jsonify(r)