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")
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()
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)
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)