Exemple #1
0
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)
Exemple #2
0
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('体检系统登录成功')
Exemple #4
0
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)
Exemple #5
0
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)