示例#1
0
def data_entry():
    # 获取请求头信息
    if request.content_type != "application/json":
        return invalid(detail="请在请求头中指定: Content-Type: application/json")
    try:
        data_dict = request.get_json(force=True)
    except Exception as e:
        logging.error("json data parse failed, error:[{}]".format(e))
        return invalid(detail="json 数据解析失败, 请检查数据内容")
    # 数据校验
    data_dict, error_str = data_verify(data_dict)
    if error_str:
        return invalid(detail=error_str)

    # 将图片保存在本地
    image_bytes = data_dict["image_bytes"]

    # 根据违法时间分目录存储
    illegal_time = data_dict["illegal_time"]
    date_folder = illegal_time.split(" ")[0]

    # 判断目录是否存在,不存在则创建目录
    # current_path = os.path.join(os.path.expanduser('~'), "hbase_image/{}".format(date_folder))
    current_path = os.path.join(cons.IMAGE_SAVE_PATH, date_folder)
    is_exist = os.path.exists(current_path)
    if not is_exist:
        os.makedirs(current_path)

    # 保存图片,以 record_id 命名
    record_id = data_dict["record_id"]
    with open("{}/{}.jpg".format(current_path, record_id), "wb") as f:
        f.write(image_bytes)
    logging.info("image downloaded, recordId:[{}], illegalCode:[{}]".format(
        data_dict["record_id"], data_dict["illegal_code"]))
    # 删除图片参数, 增加定制化参数
    data_dict.pop("image_bytes")
    data_dict["img_path"] = date_folder + "/" + record_id + ".jpg"
    # 处理机关code前4位
    data_dict["correct_sector_code"] = data_dict["office_code"][:4]

    # is exist
    wf_record = db.session.query(WfRecord).filter(
        WfRecord.record_id == record_id).first()
    if wf_record:
        return invalid(detail="数据重复推送, record_id:{}".format(record_id))
    # save mysql
    try:
        db.session.add(WfRecord(**data_dict))
        db.session.commit()
    except Exception as e:
        logging.error("data insertion into db failed, error:[{}]".format(e))
        return server_error(detail="数据库错误, 请联系系统管理员")
    #
    return success(detail="接收成功, 数量 1")
示例#2
0
def update_manual_status():
    data = request.get_json(force=True)
    ids = data.get('ids', [])
    manual_check_status = data.get('manual_check_status', 0)
    if not ids:
        return response.invalid('no ids')

    # 查询的同时直接更新
    # [(s.query(Wfrecord).filter(Wfrecord.id == id).update({"manual_check_status": manual_check_status})) for id in ids]
    for id in ids:
        db.session.query(Wfrecord).filter(Wfrecord.id == id).update(
            {"manual_check_status": manual_check_status})
    # 手动提交事务
    db.session.commit()

    return response.success()
示例#3
0
def get_results():
    data_dict = request.get_json(force=True)
    current = data_dict.get('current', 1)
    pageSize = data_dict.get('pageSize', 24)
    start_time = data_dict.get('start_time', '')
    end_time = data_dict.get('end_time', '')
    reason_code = data_dict.get('reason_code', [])
    manual_check_status = data_dict.get('manual_check_status', [])
    recog_start_time = int(data_dict.get('recog_start_time', 0))
    recog_end_time = int(data_dict.get('recog_end_time', 0))
    action = str(data_dict.get('action', ''))
    # 审核页面传的参数
    simple = data_dict.get("simple", "")

    # 限制查询时间
    if start_time and end_time:
        day_num = date_interval(start_time, end_time)
        if day_num > cons.QUERY_MAX_INTERVAL:
            return response.invalid(message="最大查询区间为一个月")
    if recog_start_time and recog_end_time:
        recog_day_num = date_interval(mstime2str(recog_start_time),
                                      mstime2str(recog_end_time))
        if recog_day_num > cons.QUERY_MAX_INTERVAL:
            return response.invalid(message="最大查询区间为一个月")
    #

    # records, total = model_manager.wfrecord.search(filter_params, offset=current, limit=pageSize)

    # 总的查询集
    query = db.session.query(Wfrecord.id, Wfrecord.src_record_id, Wfrecord.src_car_plate_type,
                             Wfrecord.src_car_plate_number, Wfrecord.sdk_car_plate_number,
                             Wfrecord.sdk_car_plate_type, Wfrecord.sdk_reason_code,
                             Wfrecord.data_entry_time, Wfrecord.car_num_pic_url, Wfrecord.car_num_pic_path,
                             Wfrecord.sdk_plate_rect, Wfrecord.manual_check_status,
                             Wfrecord.src_illegal_action, Wfrecord.sdk_recog_time, Wfrecord.recog_data)\
                      .filter(Wfrecord.check_status == 2)
    # .filter(Wfrecord.sdk_reason_code>0)\
    # .filter(Wfrecord.src_car_plate_number != Wfrecord.sdk_car_plate_number)

    if not cons.NO_CAR_DISPLAY:
        query = query.filter(Wfrecord.sdk_reason_code > 0) \
            .filter(Wfrecord.src_car_plate_number != Wfrecord.sdk_car_plate_number)
    # id 的查询集
    s_query = db.session.query(Wfrecord.id).filter(Wfrecord.check_status != 0)

    # 过滤查询时间
    if start_time and end_time:
        query = query \
            .filter(Wfrecord.data_entry_time >= start_time) \
            .filter(Wfrecord.data_entry_time <= end_time)
        s_query = s_query \
            .filter(Wfrecord.data_entry_time >= start_time) \
            .filter(Wfrecord.data_entry_time <= end_time)

    if recog_start_time and recog_end_time:
        query = query \
            .filter(Wfrecord.sdk_recog_time >= recog_start_time) \
            .filter(Wfrecord.sdk_recog_time <= recog_end_time)

        s_query = s_query \
            .filter(Wfrecord.sdk_recog_time >= recog_start_time) \
            .filter(Wfrecord.sdk_recog_time <= recog_end_time)

    if reason_code:
        if not cons.NO_CAR_DISPLAY:
            if 5 in reason_code:
                reason_code.remove(5)
        # 过滤类型
        query = query.filter(Wfrecord.sdk_reason_code.in_(reason_code))
    else:
        if not cons.NO_CAR_DISPLAY:
            query = query.filter(Wfrecord.sdk_reason_code != 5)

    # 过滤人工审核
    if manual_check_status:
        query = query.filter(
            Wfrecord.manual_check_status.in_(manual_check_status))
    # 过滤操作
    if action:
        query = query.filter(Wfrecord.src_illegal_action == action)

    # 将两个统计数据存到 g 变量, 不一定每次都查询总数 (查询总数比较耗时)
    # if not simple:
    #     time_total = s_query.with_entities(func.count(Wfrecord.id)).scalar()
    #     flask.g = dict()
    #     flask.g["time_total"] = time_total
    # else:
    #     time_total = flask.g["time_total"]

    # if not simple:
    #     total = query.with_entities(func.count(Wfrecord.id)).scalar()
    #     flask.g["total"] = total
    # else:
    #     total = flask.g["total"]

    # 先从 g 变量中去取, 取不到则查询数据库
    try:
        time_total = flask.g["time_total"]
        total = flask.g["total"]
    except Exception as e:
        time_total = s_query.with_entities(func.count(Wfrecord.id)).scalar()
        total = query.with_entities(func.count(Wfrecord.id)).scalar()
        logging.info("again query wfrecord total")

    # 数据量大了导致分页较慢(从查询的时候限制查询区间)
    # 使用内存分页 (不可取)
    # records = query.all()
    # records = records[0: pageSize]
    records = query.offset(current).limit(pageSize).all()

    result = []
    for r in records:
        recog_data = json.loads(r[14])
        plate_scores = recog_data["PlateScores"]
        result.append({
            'id': r[0],
            'src_record_id': r[1],
            'src_car_plate_type': r[2],
            'src_car_plate_number': r[3],
            'sdk_car_plate_number': r[4],
            'sdk_car_plate_type': r[5],
            'sdk_reason_code': r[6],
            'data_entry_time': str(r[7]),
            'car_num_pic_url': r[8],
            'car_num_pic_path': get_image_path(r[9]),
            'sdk_plate_rect': r[10],
            'manual_check_status': r[11],
            'src_illegal_action': r[12],
            'sdk_recog_time': r[13],
            'plate_scores': plate_scores,
        })
    result_data = {"result": result, "time_total": time_total}
    return response.success_with_pagenation(total, current, pageSize,
                                            result_data)
示例#4
0
def get_results():
    data_dict = request.get_json(force=True)
    current = data_dict.get('current', 1)
    pageSize = data_dict.get('pageSize', 24)
    start_time = data_dict.get('start_time', '')
    end_time = data_dict.get('end_time', '')
    reason_code = data_dict.get('reason_code', [])
    manual_check_status = data_dict.get('manual_check_status', [])
    recog_start_time = int(data_dict.get('recog_start_time', 0))
    recog_end_time = int(data_dict.get('recog_end_time', 0))
    illegal_code = str(data_dict.get('action', ''))

    # 限制查询时间
    if start_time and end_time:
        day_num = date_interval(start_time, end_time)
        if day_num > cons.QUERY_MAX_INTERVAL:
            return response.invalid(message="最大查询区间为一个月")
    if recog_start_time and recog_end_time:
        recog_day_num = date_interval(to_string(recog_start_time), to_string(recog_end_time))
        if recog_day_num > cons.QUERY_MAX_INTERVAL:
            return response.invalid(message="最大查询区间为一个月")
    #

    # records, total = model_manager.wfrecord.search(filter_params, offset=current, limit=pageSize)

    # 总的查询集
    query = db.session.query(WfRecord.id, WfRecord.record_id, WfRecord.car_plate_type,
                             WfRecord.car_plate_number, WfRecord.sdk_car_plate_number,
                             WfRecord.sdk_car_plate_type, WfRecord.sdk_reason_code,
                             WfRecord.create_time, WfRecord.img_url, WfRecord.img_path,
                             WfRecord.sdk_plate_rect, WfRecord.manual_check_status,
                             WfRecord.illegal_code, WfRecord.sdk_recog_time, WfRecord.recog_data,
                             WfRecord.entry_person, WfRecord.recog_status, WfRecord.report_status,
                             WfRecord.report_time) \
                      .filter(WfRecord.recog_status == 2)
    # .filter(WfRecord.sdk_reason_code>0)\
    # .filter(WfRecord.car_plate_number != WfRecord.sdk_car_plate_number)

    if not cons.NO_CAR_DISPLAY:
        query = query.filter(WfRecord.sdk_reason_code > 0) \
            .filter(WfRecord.car_plate_number != WfRecord.sdk_car_plate_number)
    # id 的查询集
    s_query = db.session.query(WfRecord.id).filter(WfRecord.recog_status != 0)

    # 过滤查询时间
    if start_time and end_time:
        query = query \
            .filter(WfRecord.create_time >= start_time) \
            .filter(WfRecord.create_time <= end_time)
        s_query = s_query \
            .filter(WfRecord.create_time >= start_time) \
            .filter(WfRecord.create_time <= end_time)

    if recog_start_time and recog_end_time:
        query = query \
            .filter(WfRecord.sdk_recog_time >= to_string(recog_start_time)) \
            .filter(WfRecord.sdk_recog_time <= to_string(recog_end_time))

        s_query = s_query \
            .filter(WfRecord.sdk_recog_time >= to_string(recog_start_time)) \
            .filter(WfRecord.sdk_recog_time <= to_string(recog_end_time))

    if reason_code:
        if not cons.NO_CAR_DISPLAY:
            if 5 in reason_code:
                reason_code.remove(5)
        # 过滤类型
        query = query.filter(WfRecord.sdk_reason_code.in_(reason_code))
    else:
        if not cons.NO_CAR_DISPLAY:
            query = query.filter(WfRecord.sdk_reason_code != 5)

    # 过滤人工审核
    if manual_check_status:
        query = query.filter(WfRecord.manual_check_status.in_(manual_check_status))
    # 过滤操作
    if illegal_code:
        query = query.filter(WfRecord.illegal_code == illegal_code)

    # 从 g 变量中去取, 取不到则查询数据库
    try:
        time_total = flask.g["time_total"]
        total = flask.g["total"]
    except Exception as e:
        time_total = s_query.with_entities(func.count(WfRecord.id)).scalar()
        total = query.with_entities(func.count(WfRecord.id)).scalar()

    # 数据量大了导致分页较慢(从查询的时候限制查询区间)
    # 使用内存分页 (不可取)
    # records = query.all()
    # records = records[0: pageSize]
    records = query.offset(current).limit(pageSize).all()

    result = []
    for r in records:
        recog_data = r[14]
        if not recog_data:
            logging.error("missing recog data")
            return response.server_error(detail="识别结果数据缺失")
        # 解析识别数据
        recog_data_dict = json.loads(recog_data)
        plate_scores = recog_data_dict.get("PlateScores")
        result.append({
            'id': r[0],
            'src_record_id': r[1],
            'src_car_plate_type': r[2],
            'src_car_plate_number': r[3],
            'sdk_car_plate_number': r[4],
            'sdk_car_plate_type': r[5],
            'sdk_reason_code': r[6],
            'data_entry_time': str(r[7]),
            'car_num_pic_url': r[8],
            'car_num_pic_path': get_image_path(r[9]),
            'sdk_plate_rect': r[10],
            'manual_check_status': r[11],
            'src_illegal_action': r[12],
            'sdk_recog_time': str(r[13]),
            'entry_person': r[15],  # 2020-05-25 add by chenkai
            'recog_status': r[16],
            'report_status': r[17],
            'report_time': str(r[18]),
            'plate_scores': plate_scores,
        })
    result_data = {"result": result, "time_total": time_total}
    return response.success_with_pagenation(total, current, pageSize, result_data)