commit 26a7fdf6c07e0bdf59820cfec1c0f177d690fb49 Author: ZhuJW Date: Wed Apr 22 13:35:40 2026 +0800 提交 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..79b70dd --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,4 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +.idea \ No newline at end of file diff --git a/20251118_update.sql b/20251118_update.sql new file mode 100644 index 0000000..e256842 --- /dev/null +++ b/20251118_update.sql @@ -0,0 +1,42 @@ +-- 1. 取消 file_path 的唯一约束,保留列 +ALTER TABLE bag_file DROP INDEX `file_path`; + +-- 2. 为 file_name 建索引(用于 join / like 查询) +ALTER TABLE bag_file + ADD INDEX `idx_bag_file_name` (`file_name`); + +-- 3. 为 bag_update_time 建索引(用于 “每个 logical_name 取最新一条” 的子查询) +ALTER TABLE bag_file + ADD INDEX `idx_bag_update_time` (`bag_update_time`); + +ALTER TABLE bag_file + ADD INDEX `idx_create_time` (`create_time`); + +-- 4. 为 bag_status 建索引 +ALTER TABLE bag_file + ADD INDEX idx_bag_status (bag_status); + + +-- ============================ +-- Table structure for bag_merge_record +-- ============================ +create table bag_merge_record +( + id int(11) unsigned auto_increment comment '主键' + primary key, + joined_name varchar(255) not null comment '合并后 bag 名称(joined_name)', + src_name varchar(255) not null comment '参与合并的原始 bag 名称', + create_time datetime default CURRENT_TIMESTAMP not null comment '记录创建时间', + created_by int null comment '操作用户 id', + is_initiator tinyint(1) default 0 not null comment '1: 此 src 是本次合并的主 bag', + constraint fk_bag_merge_created_by + foreign key (created_by) references users (id) + on update cascade on delete set null +) + row_format = DYNAMIC; +create index idx_created_by + on bag_merge_record (created_by); +create index idx_joined_name + on bag_merge_record (joined_name); +create index idx_src_name + on bag_merge_record (src_name); diff --git a/20251216_multi_tag.sql b/20251216_multi_tag.sql new file mode 100644 index 0000000..b5bf11b --- /dev/null +++ b/20251216_multi_tag.sql @@ -0,0 +1,14 @@ +-- Multi-tag support: per TaggingEvent note + time range + scene flags +-- Run this against the same MySQL schema used by `flask_rulebase_serve/app/models.py`. + +ALTER TABLE tagging_events + ADD COLUMN front_starttime DATETIME NULL COMMENT '前摄像头开始时间', + ADD COLUMN front_endtime DATETIME NULL COMMENT '前摄像头结束时间', + ADD COLUMN front_start_sec INT NULL COMMENT '前摄的开始秒', + ADD COLUMN front_end_sec INT NULL COMMENT '前摄的结束秒', + ADD COLUMN high_speed INT NULL DEFAULT 0 COMMENT '高速,1是,0否', + ADD COLUMN urban INT NULL DEFAULT 0 COMMENT '城区,1是,0否', + ADD COLUMN parking INT NULL DEFAULT 0 COMMENT '停车,1是,0否', + ADD COLUMN qa_status ENUM('QA_NOT_REVIEWED','QA_PASSED','QA_MODIFY','QA_INVALID') NULL DEFAULT 'QA_NOT_REVIEWED' COMMENT '质检状态', + ADD COLUMN is_deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'soft delete flag', + ADD COLUMN note TEXT NULL COMMENT '备注'; diff --git a/20251217_migrate_retest_tag_events.sql b/20251217_migrate_retest_tag_events.sql new file mode 100644 index 0000000..c460979 --- /dev/null +++ b/20251217_migrate_retest_tag_events.sql @@ -0,0 +1,72 @@ + +--todo 检查一下 数据情况 +--SELECT COUNT(*) AS will_update_rows +--FROM tagging_events t +--JOIN bag_file b ON b.id = t.bag_id +--LEFT JOIN bag_merge_record m ON m.src_name = b.file_name +--WHERE +-- t.is_deleted = 0 +-- AND b.bag_status >= 1 +-- AND (m.is_initiator = 1 OR m.id IS NULL) +-- AND ( +-- t.front_starttime IS NULL +-- OR t.front_endtime IS NULL +-- OR t.front_start_sec IS NULL +-- OR t.front_end_sec IS NULL +-- OR t.high_speed IS NULL +-- OR t.urban IS NULL +-- OR t.parking IS NULL +-- OR t.qa_status IS NULL +-- OR t.note IS NULL +-- OR t.is_deleted IS NULL +-- ); +-- +--SELECT COUNT(*) AS will_update_rows +--FROM tagging_events t +--JOIN bag_file b ON b.id = t.bag_id +--LEFT JOIN bag_merge_record m ON m.src_name = b.file_name +--WHERE +-- t.is_deleted = 0 +-- AND b.bag_status >= 1 +-- AND b.sync_status = 'SYNC_NOT_READY' +-- AND (m.is_initiator = 1 OR m.id IS NULL) +-- AND ( +-- t.front_starttime IS NULL +-- OR t.front_endtime IS NULL +-- OR t.front_start_sec IS NULL +-- OR t.front_end_sec IS NULL +-- OR t.high_speed IS NULL +-- OR t.urban IS NULL +-- OR t.parking IS NULL +-- OR t.qa_status IS NULL +-- OR t.note IS NULL +-- OR t.is_deleted IS NULL +-- ); + +-- Backfill new columns for existing TaggingEvents that match getretestbaglist. +-- This updates only existing rows; it does not create new TaggingEvents. + +UPDATE tagging_events t +JOIN bag_file b + ON b.id = t.bag_id +LEFT JOIN bag_merge_record m + ON m.src_name = b.file_name +SET + t.front_starttime = COALESCE(t.front_starttime, b.front_starttime), + t.front_endtime = COALESCE(t.front_endtime, b.front_endtime), + t.front_start_sec = COALESCE(t.front_start_sec, b.front_start_sec), + t.front_end_sec = COALESCE(t.front_end_sec, b.front_end_sec), + t.high_speed = COALESCE(t.high_speed, b.high_speed, 0), + t.urban = COALESCE(t.urban, b.urban, 0), + t.parking = COALESCE(t.parking, b.parking, 0), + t.qa_status = COALESCE(t.qa_status, b.qa_status, 'QA_NOT_REVIEWED'), + t.note = COALESCE(t.note, b.comment1), + t.is_deleted = COALESCE(t.is_deleted, 0) +WHERE + t.is_deleted = 0 + AND b.bag_status >= 1 + AND b.sync_status = 'SYNC_NOT_READY' + AND ( + m.is_initiator = 1 + OR m.id IS NULL + ); diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2f46ea7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +# 多阶段构建:减小最终镜像体积 +FROM python:3.11 + +# 设置工作目录 +WORKDIR /app + +# 复制依赖文件 +COPY requirements.txt . + +# 安装运行时依赖 +RUN pip install -r requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple/ + +# 复制应用代码 +COPY . . + +# 配置应用目录结构 +RUN mkdir -p /app/__pycache__ /app/logs + +# 配置时区 +RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone + +# 端口配置(默认生产 5222,可用于本地测试 5228) +ARG APP_PORT=5222 +ENV APP_PORT=$APP_PORT + +# 暴露Gunicorn监听的端口(对外提供服务) +EXPOSE ${APP_PORT} + +# 环境变量配置 +# ENV FLASK_APP="app:app" \ +# FLASK_ENV="production" \ +ENV PYTHONUNBUFFERED=1 \ + PATH="/venv/bin:$PATH" + +# Gunicorn启动命令(核心配置) +CMD ["sh", "-c", "gunicorn \ + --bind 0.0.0.0:${APP_PORT} \ + --workers 14 \ + --timeout 60 \ + --keep-alive 5 \ + --access-logfile - \ + --error-logfile - \ + run:app"] diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..5125fa9 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,94 @@ +import os +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_jwt_extended import JWTManager +from flask_pymongo import PyMongo +from .config import Config,config_map +from flask_cors import CORS +import logging +from logging.handlers import RotatingFileHandler + + +db = SQLAlchemy() +mongo = PyMongo() +jwt = JWTManager() + +# def create_app(): +# app = Flask(__name__) +# app.config.from_object(Config) + +# db.init_app(app) +# mongo.init_app(app) +# # jwt.init_app(app) + +# # 注册蓝图 +# from .blueprints.auth import auth_bp +# from .blueprints.bag_data.routes import data_bp + + +# app.register_blueprint(auth_bp, url_prefix='/api/auth') +# app.register_blueprint(data_bp, url_prefix='/api/data') + +# return app + +# 加载配置 +def create_app(): + app = Flask(__name__) + # app.config.from_object(Config) + config_name = os.environ.get('FLASK_ENV', 'default') + app.config.from_object(config_map[config_name]) + + db.init_app(app) + mongo.init_app(app) + jwt.init_app(app) + setup_logging(app) # 配置日志 + # 注册蓝图 + from .blueprints.auth.routes import auth_bp + from .blueprints.bag_data.routes import data_bp + from app.blueprints.data_display.routes import check_data + from app.blueprints.data_factory.routes import data_factory_bp + from app.blueprints.label_data.rotutes import label_bp + from app.blueprints.remote_data.rotutes import remote_bp + from app.blueprints.vlm.rotutes import vlm_bp + + app.register_blueprint(auth_bp, url_prefix='/api/auth') + app.register_blueprint(data_bp, url_prefix='/api/data') + app.register_blueprint(check_data, url_prefix='/api/inspect') + app.register_blueprint(data_factory_bp, url_prefix='/api/factory') + app.register_blueprint(label_bp, url_prefix='/api/label') + app.register_blueprint(remote_bp, url_prefix='/api/remote') + app.register_blueprint(vlm_bp, url_prefix='/api/vlm') + + CORS(app, supports_credentials=True) + + return app + +# 配置日志 +def setup_logging(app): + # 确保日志目录存在 + os.makedirs(app.config['LOG_DIR'], exist_ok=True) + + # 创建文件处理器 + file_handler = RotatingFileHandler( + os.path.join(app.config['LOG_DIR'], 'app.log'), + maxBytes=app.config['LOG_FILE_MAX_BYTES'], + backupCount=app.config['LOG_FILE_BACKUP_COUNT'] + ) + + # 设置日志级别 + log_level = getattr(logging, app.config['LOG_LEVEL']) + file_handler.setLevel(log_level) + app.logger.setLevel(log_level) + + # 设置日志格式 + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + file_handler.setFormatter(formatter) + + # 添加处理器 + if not app.logger.handlers: + app.logger.addHandler(file_handler) + + # 记录启动信息 + app.logger.info(f'Application started with config') \ No newline at end of file diff --git a/app/blueprints/__init__.py b/app/blueprints/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/auth/__init__.py b/app/blueprints/auth/__init__.py new file mode 100644 index 0000000..5caddcd --- /dev/null +++ b/app/blueprints/auth/__init__.py @@ -0,0 +1,5 @@ +# from flask import Blueprint + +# auth_bp = Blueprint('auth', __name__) + +# from . import routes \ No newline at end of file diff --git a/app/blueprints/auth/routes.py b/app/blueprints/auth/routes.py new file mode 100644 index 0000000..f996223 --- /dev/null +++ b/app/blueprints/auth/routes.py @@ -0,0 +1,522 @@ +from datetime import datetime +import json +from flask import Blueprint, current_app, request, jsonify +from flask_jwt_extended import create_access_token, get_jwt, get_jwt_identity, jwt_required +from sqlalchemy import and_ +from app import jwt,db +from app.models import OperationHistory, Role, User, UserRole +from app.utils.password_hasher import hash_password,check_password +from app.utils.response_dict import response + + +auth_bp= Blueprint('data', __name__) + + +@auth_bp.route('/login', methods=['POST']) +def login(): + # 1. 获取登录凭证 + data = request.get_json() + username = data.get('username') + password = data.get('password') + print('username',username) + print('password',password) + + # 2. 验证必填字段 + # if not username or not password: + # response['code']=400 + # response['message']="用户名和密码不能为空" + # return jsonify(response) + # + # # 3. 查询用户 + # user = User.query.filter_by(username=username).first() + # + # # 4. 验证用户存在性和密码 + # if not user or not check_password(password,user.password): + # response['code']=401 + # response['message']="用户名或密码错误" + # return jsonify({"msg": "用户名或密码错误"}), 401 + # + # if user.status != 1: + # return jsonify({"msg": "用户已禁用"}), 403 + + # 5. 生成JWT令牌[2,6](@ref) + access_token = create_access_token(identity=str(1)) + + + result = db.session.query( + User.id, + User.username.label('realName'), # 使用 label 实现别名 + User.password, + User.status, + Role.name.label('roles'), + Role.description + ).join( + UserRole, User.id == UserRole.user_id # 第一次 JOIN:用户 ↔ 用户角色 + ).join( + Role, UserRole.role_id == Role.id # 第二次 JOIN:用户角色 ↔ 角色 + ).filter( + User.status == 1, # 状态过滤 + User.id == 1 # 用户ID过滤 + ).all() + + if not result: + return jsonify({"msg": "用户未分配角色或已禁用"}), 403 + + + # dict_list = [row._asdict() for row in result] + # dict_list[0]['accessToken']=access_token + # dict_list[0]['roles']=[dict_list[0]['roles']] + # data={ + # "accessToken": access_token, + # "user_id": user.id, + # "message": "登录成功" + # } + + # response['data']= dict_list[0] + # response['error']='' + # 6. 返回响应 + res={"accessToken":access_token} + data={} + data['data']=res + return jsonify(res) + + +@auth_bp.route('/userinfo', methods=['GET']) +@jwt_required() # 要求有效Token[1,5](@ref) +def get_user_info(): + userid = get_jwt_identity() + """ + 获取用户信息 + """ + result = db.session.query( + User.id, + User.username.label('realName'), # 使用 label 实现别名 + User.password, + User.status, + Role.name.label('roles'), + Role.description + ).join( + UserRole, User.id == UserRole.user_id # 第一次 JOIN:用户 ↔ 用户角色 + ).join( + Role, UserRole.role_id == Role.id # 第二次 JOIN:用户角色 ↔ 角色 + ).filter( + User.status == 1, # 状态过滤 + User.id == userid # 用户ID过滤 + ).all() + dict_list = [row._asdict() for row in result] + if not dict_list: + return jsonify({"msg": "用户未分配角色或已禁用"}), 403 + role_list = [row.get('roles') for row in dict_list if row.get('roles')] + if not role_list: + return jsonify({"msg": "用户未分配角色或已禁用"}), 403 + dict_list[0]['roles'] = role_list + + data={"roles": dict_list[0]['roles'],"realName": dict_list[0]['realName'],"homePath": '/datamanage/datalabel'} + + return jsonify(data) + + +@auth_bp.route('/codes', methods=['GET']) +@jwt_required() # 要求有效Token[1,5](@ref) +def get_code(): + response['code']=200 + response['data']=["AC_100100","AC_100110"] + return jsonify(response) + + +@auth_bp.route('/refresh', methods=['POST']) +@jwt_required() # 要求有效Token[1,5](@ref) +def refresh(): + # data: string; + # status: number; + token = create_access_token(identity='service_account') + data={} + data['data']=token + data['status']=1 + return jsonify(data) + + +# ===== 受保护路由示例 ===== +@auth_bp.route('/protected', methods=['GET']) +@jwt_required() # 要求有效Token[1,5](@ref) +def protected(): + # 从Token获取用户身份 + current_user_id = get_jwt_identity() + user = User.query.get(current_user_id) + + return jsonify({ + "message": f"欢迎回来, {user.username}!", + "user_id": user.id + }), 200 + + +@jwt.unauthorized_loader +def missing_token_callback(error): + """缺少Token时的自定义响应""" + return jsonify({ + 'status': 401, + 'msg': '缺少访问令牌' + }), 401 + + +blacklist = set() + + +@auth_bp.route('/createuser', methods=['POST']) +@jwt_required() # 需要有效Token才能创建用户 +def create_user(): + ''' + { + "username": "new_user", + "password": "securePass123", + "role_ids": [1, 3] // 要分配的角色ID列表 + } + ''' + data = request.get_json() + print(data) + if not data or 'username' not in data or 'password' not in data: + return jsonify({"error": "缺少用户名或密码"}), 400 + + # 1. 验证用户名唯一性 + existing_user = User.query.filter_by(username=data['username']).first() + if existing_user: + return jsonify({"error": "用户名已存在"}), 409 + + # 2. 获取当前操作者 + current_user_id = get_jwt_identity() + print('current_user_id',current_user_id) + current_user = User.query.get(int(current_user_id)) + if not current_user: + return jsonify({"error": "无效的操作者"}), 401 + + # 3. 密码复杂度验证 + password = data['password'] + if len(password) < 8 or not any(c.isdigit() for c in password): + return jsonify({"error": "密码需至少8位且包含数字"}), 400 + + # 4. 验证角色(新增部分) + role_ids = data.get('role_ids', []) + valid_roles = [] + if role_ids: + valid_roles = Role.query.filter(Role.id.in_(role_ids)).all() + if len(valid_roles) != len(role_ids): + return jsonify({"error": "包含无效的角色ID"}), 400 + + try: + # 5. 创建新用户 + new_user = User( + username=data['username'], + password=hash_password(data['password']), + status=data.get('status', 1), + created_by=current_user_id + ) + + db.session.add(new_user) + db.session.flush() # 获取新用户ID但不提交事务 + + # 6. 分配角色(新增核心功能) + for role in valid_roles: + user_role = UserRole( + user_id=new_user.id, + role_id=role.id, + created_by=current_user_id + ) + db.session.add(user_role) + + db.session.commit() + + # 7. 构造响应数据(包含角色信息) + response_data = { + "id": new_user.id, + "username": new_user.username, + "created_at": new_user.created_at.isoformat(), + "created_by": new_user.created_by, + "roles": [{"id": r.id, "name": r.name} for r in valid_roles] # 新增角色信息 + } + + # 8. 记录操作日志(新增角色信息) + current_app.logger.info( + f"用户创建成功: {new_user.username} (ID:{new_user.id}) " + f"操作者: {current_user.username} (ID:{current_user_id}) " + f"分配角色: {[r.name for r in valid_roles]}" # 记录分配的角色 + ) + + return jsonify(response_data), 201 + + except Exception as e: + db.session.rollback() + current_app.logger.error(f"用户创建失败: {str(e)}") + return jsonify({"error": "服务器内部错误"}), 500 + + +@auth_bp.route('/updateuser', methods=['POST']) +@jwt_required() # 需要有效Token才能访问 +def update_user(): + ''' + 请求体格式: + { + "user_id": 123, // 必需:目标用户ID + "username": "updated_user", // 可选:新用户名 + "password": "newSecurePass456", // 可选:新密码 + "status": 1 // 可选:用户状态(1-启用,0-禁用) + } + ''' + data = request.get_json() + if not data or 'user_id' not in data: + return jsonify({"error": "请求数据不能为空且必须包含user_id"}), 400 + + # 1. 验证操作者身份 + current_user_id = get_jwt_identity() + current_user = User.query.get(int(current_user_id)) + if not current_user: + return jsonify({"error": "无效的操作者"}), 401 + + # 2. 验证目标用户是否存在 + target_user_id = data['user_id'] + target_user = User.query.get(int(target_user_id)) + if not target_user: + return jsonify({"error": "目标用户不存在"}), 404 + + # 3. 权限校验:仅允许管理员修改(核心修改点) + # 检查当前用户是否为管理员(假设管理员角色ID为1) + is_admin = UserRole.query.filter_by( # 注意:这里修正为UserRole表(用户-角色关联表) + user_id=current_user_id, + role_id=1 + ).first() + + if not is_admin: # 只有管理员能通过校验 + return jsonify({"error": "仅管理员有权限修改用户信息"}), 403 + + role_ids = data.get('role_ids', None) + valid_roles = [] + if role_ids is not None: + if not isinstance(role_ids, list): + return jsonify({"error": "role_ids必须为数组"}), 400 + if role_ids: + valid_roles = Role.query.filter(Role.id.in_(role_ids)).all() + if len(valid_roles) != len(role_ids): + return jsonify({"error": "包含无效的角色ID"}), 400 + + try: + # 4. 处理用户名修改(如提供) + if 'username' in data and data['username']: + # 验证用户名唯一性(排除自身) + existing_user = User.query.filter( + User.username == data['username'], + User.id != target_user_id + ).first() + if existing_user: + return jsonify({"error": "用户名已存在"}), 409 + target_user.username = data['username'] + + # 5. 处理密码修改(如提供) + if 'password' in data and data['password']: + password = data['password'] + # 密码复杂度验证(与创建用户保持一致) + if len(password) < 8 or not any(c.isdigit() for c in password): + return jsonify({"error": "密码需至少8位且包含数字"}), 400 + target_user.password = hash_password(password) # 复用哈希函数 + + # 6. 处理状态修改(如提供) + if 'status' in data: + target_user.status = data['status'] # 管理员无需额外校验 + + # 6.1 处理角色修改(如提供) + if role_ids is not None: + UserRole.query.filter_by(user_id=target_user_id).delete() + for role in valid_roles: + user_role = UserRole( + user_id=target_user_id, + role_id=role.id, + created_by=current_user_id, + ) + db.session.add(user_role) + + # 7. 提交修改 + target_user.updated_at = datetime.now() # 假设模型有updated_at字段 + target_user.updated_by = current_user_id # 假设模型有updated_by字段 + db.session.commit() + + # 8. 构造响应数据 + response_data = { + "id": target_user.id, + "username": target_user.username, + "status": target_user.status, + "updated_at": target_user.updated_at.isoformat(), + "updated_by": current_user.username + } + if role_ids is not None: + response_data["roles"] = [{"id": r.id, "name": r.name} for r in valid_roles] + + # 9. 记录操作日志 + current_app.logger.info( + f"用户信息更新成功: {target_user.username} (ID:{target_user.id}) " + f"操作者: {current_user.username} (ID:{current_user_id}) " + f"修改内容: {[k for k in data.keys() if k != 'user_id']}" + ) + + return jsonify(response_data), 200 + + except Exception as e: + db.session.rollback() + current_app.logger.error(f"用户信息更新失败: {str(e)}") + return jsonify({"error": "服务器内部错误"}), 500 + + +@auth_bp.route('/logout', methods=['POST']) +@jwt_required() +def log_out(): + jti = get_jwt()["jti"] # 获取 Token 的唯一标识 + blacklist.add(jti) # 将 Token 添加到黑名单 + return jsonify({"msg": "Successfully logged out"}), 200 + + +@auth_bp.route('/getuserlist', methods=['GET']) +@jwt_required() +def get_users(): + result = db.session.query( + User.id, + User.username, + User.status, + User.created_at, + User.created_by, + User.updated_at, + UserRole.role_id, + Role.description, + Role.name + ).join( + UserRole, User.id == UserRole.user_id + ).join( + Role, UserRole.role_id == Role.id + ).all() + dict_list = [row._asdict() for row in result] + return jsonify(dict_list), 200 + + +@auth_bp.route('/getroles', methods=['GET']) +@jwt_required() +def get_roles(): + roles = Role.query.filter(Role.status == 1).all() + data = [{"id": r.id, "name": r.name, "description": r.description} for r in roles] + return jsonify(data), 200 + + +@auth_bp.route('/deleteuser', methods=['GET']) +@jwt_required() +def delete_user(): + + user_id=request.args.get('userid') + # 1. 查询用户(确保状态之前为 1) + user = User.query.filter( + User.id == user_id, + User.status == 1 # 只选择状态为 1 的用户 + ).first() + + if not user: + return jsonify({"error": "用户不存在或状态不是 1"}), 400 # 用户不存在或状态不是 1 + + # 2. 修改状态 + user.status = 0 + + # 3. 提交事务 + try: + db.session.commit() + return jsonify({"msg": "Successfully"}),200 + except Exception as e: + db.session.rollback() + print(f"Error: {e}") + return jsonify({"error": f"出现错误{e}"}), 400 + + +@auth_bp.route('/test', methods=['GET']) +@jwt_required() +def test(): + pass + + +@auth_bp.route('/gethisttory', methods=['POST']) +@jwt_required() +def query_operation_history(): + """ + { + "username": "admin", // 可选,精确匹配用户名 + "api_path": "/api/user/create", // 可选,精确匹配接口路径 + "start_time": "2025-07-01T00:00:00", // 可选,开始时间(ISO 8601格式) + "end_time": "2025-07-10T23:59:59", // 可选,结束时间(ISO 8601格式) + "request_keyword": "email", // 可选,在请求参数中模糊搜索关键词 + "page": 2, // 可选,页码(默认1) + "per_page": 15 // 可选,每页条数(默认20) + } + """ + + """查询操作历史记录(支持多条件过滤)""" + # 接收JSON格式的查询参数 + query_params = request.get_json() + + # 构建基础查询 + query = OperationHistory.query + + # 1. 用户名过滤(精确匹配) + if query_params['username']: + query = query.filter(OperationHistory.username == query_params['username']) + + # 2. 接口路径过滤(精确匹配) + if query_params['api_path']: + query = query.filter(OperationHistory.api_path == query_params['api_path']) + + # 3. 操作时间范围过滤 + if query_params['start_time'] and query_params['end_time']: + # 解析时间参数(支持ISO 8601格式) + start_time = datetime.fromisoformat(query_params['start_time']) if 'start_time' in query_params else None + end_time = datetime.fromisoformat(query_params['end_time']) if 'end_time' in query_params else None + # 构建时间范围查询条件 + time_conditions = [] + if start_time: + time_conditions.append(OperationHistory.operation_time >= start_time) + if end_time: + time_conditions.append(OperationHistory.operation_time <= end_time) + + if time_conditions: + query = query.filter(and_(*time_conditions)) + + # 4. 请求参数关键词过滤(模糊匹配) + if query_params['request_keyword']: + keyword = f"%{query_params['request_keyword']}%" + query = query.filter( + OperationHistory.request_params.like(keyword) + ) + + # 5. 分页参数处理 + page = query_params.get('page', 1) + per_page = query_params.get('per_page', 20) + + # 执行分页查询(使用索引优化) + pagination = query.order_by(OperationHistory.operation_time.desc()) \ + .paginate(page=page, per_page=per_page, error_out=False) + + # 序列化结果 + results = [] + for record in pagination.items: + results.append({ + 'id': record.id, + 'username': record.username, + 'api_path': record.api_path, + 'http_method': record.http_method, + 'operation_time': record.operation_time.isoformat(), + 'response_code': record.response_code, + 'ip_address': record.ip_address, + 'operation_result': record.operation_result, + 'error_message': record.error_message, + 'trace_id': record.trace_id, + # 请求参数反序列化(JSON字符串→Python对象) + 'request_params': json.loads(record.request_params) if record.request_params else None + }) + + # 返回分页结果 + return jsonify({ + 'total': pagination.total, + 'pages': pagination.pages, + 'current_page': pagination.page, + 'per_page': pagination.per_page, + 'results': results + }) diff --git a/app/blueprints/auth/services.py b/app/blueprints/auth/services.py new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/bag_data/__init__.py b/app/blueprints/bag_data/__init__.py new file mode 100644 index 0000000..0fe0a42 --- /dev/null +++ b/app/blueprints/bag_data/__init__.py @@ -0,0 +1,5 @@ +# from routes import Blueprint + +# posts_bp = Blueprint('posts', __name__) + +# from . import routes \ No newline at end of file diff --git a/app/blueprints/bag_data/routes.py b/app/blueprints/bag_data/routes.py new file mode 100644 index 0000000..e5eae93 --- /dev/null +++ b/app/blueprints/bag_data/routes.py @@ -0,0 +1,55 @@ +from collections import defaultdict +from datetime import datetime +from flask import Blueprint, current_app, request, jsonify +from flask_jwt_extended import create_access_token, get_jwt, get_jwt_identity, jwt_required +from sqlalchemy import and_, asc, desc, exists, func, or_ +from app.models import BagFile, Fst, Role, User, UserRole +from app.utils.fst_tree import build_tree,build_sub_tree +from app import db +from app.utils.log_record import log_operation +from sqlalchemy.orm import aliased + +# 1.创建蓝图实例,指定名称和导入名称 +data_bp = Blueprint('bag', __name__) + +@data_bp.route('/fstlist',methods=['GET']) +@jwt_required() +def get_fstlist(): + res=Fst.query.with_entities(Fst.id,Fst.name,Fst.parent_id).all() + response=build_tree(res) + return jsonify(response), 200 + + + +@data_bp.route('/fstlevel1', methods=['GET']) +def get_level1_fst(): + # 查询 level=1 的记录,仅返回 id, name, level 字段 + results = Fst.query.with_entities( + Fst.id, + Fst.name, + Fst.level + ).filter_by(level=1).all() + + # 转换为字典列表(方便 JSON 序列化) + data = [{ + "id": r.id, + "name": r.name, + "level": r.level + } for r in results] + + return jsonify(data),200 + +# 跨表查询所有的bag + +@data_bp.route('/getnode', methods=['GET']) +@jwt_required() +def query_sub_node(): + ''' + 根据一级标签查询对应的所有子标签 + ''' + tagid=request.args.get('tagid') + res=Fst.query.with_entities(Fst.id,Fst.name,Fst.parent_id).all() + response=build_sub_tree(res,tagid) + return jsonify(response), 200 + + diff --git a/app/blueprints/bag_data/services.py b/app/blueprints/bag_data/services.py new file mode 100644 index 0000000..d6215b0 --- /dev/null +++ b/app/blueprints/bag_data/services.py @@ -0,0 +1,73 @@ +# from datetime import datetime,timedelta +# from app import db +# from app.models import BagRecord +# from sqlalchemy.exc import SQLAlchemyError +# from sqlalchemy import func + +# def add(): +# new_record = BagRecord( +# bag_name="sensor_data_2025.bag", +# collection_time=datetime(2025, 5, 1, 12, 1, 1), +# bag_state=0, +# frames=120, +# car_state=1, +# address="beijing", +# collect_month=5 +# ) +# db.session.add(new_record) +# db.session.commit() # 提交事务 [1,7](@ref) + + +# def create_record(data): +# """创建新记录""" +# try: +# # 转换日期类型字段 +# if 'collection_time' in data: +# data['collection_time'] = datetime.fromisoformat(data['collection_time']) +# if 'parse_time' in data: +# data['parse_time'] = datetime.fromisoformat(data['parse_time']) + +# record = BagRecord(**data) +# db.session.add(record) +# db.session.commit() +# return record +# except SQLAlchemyError as e: +# db.session.rollback() +# raise e + +# def get_record_by_id(record_id): +# """根据ID获取记录""" +# return BagRecord.query.get(record_id) + + +# def get_all_records(**filters): +# """获取所有记录(支持过滤)""" +# query = BagRecord.query +# if filters: +# query = query.filter_by(**filters) +# return query.all() + + +# def get_daily_counts(start_date, end_date): +# # 执行 SQL 查询,按日期分组并统计数量 +# query = ( +# db.session.query( +# db.func.date(BagRecord.collection_time).label('date'), +# db.func.count(BagRecord.id).label('count') +# ) +# .filter(BagRecord.collection_time >= start_date) +# .filter(BagRecord.collection_time <= end_date + timedelta(days=1)) # 包含结束日期 +# .group_by(db.func.date(BagRecord.collection_time)) +# .order_by(db.func.date(BagRecord.collection_time)) +# ) + +# print(query.all()) +# # 将结果转换为字典列表 +# results = [] +# for date, count in query.all(): +# results.append({ +# 'date': str(date), # 将日期对象转换为字符串 +# 'count': count +# }) + +# return results diff --git a/app/blueprints/data_display/__init__.py b/app/blueprints/data_display/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/data_display/routes.py b/app/blueprints/data_display/routes.py new file mode 100644 index 0000000..cfc401c --- /dev/null +++ b/app/blueprints/data_display/routes.py @@ -0,0 +1,752 @@ +from datetime import datetime +from flask import Blueprint, current_app, request, jsonify +from flask_jwt_extended import ( + create_access_token, + get_jwt, + get_jwt_identity, + jwt_required, +) +from sqlalchemy import and_, asc, desc, exists, or_,func +from app.models import ( + BagFile, + BagStatus, + Fst, + QaStatus, + Role, + SyncStatus, + TaggingEvents, + User, + UserRole, + BagMergeRecord, +) +from app.utils.fst_tree import build_tree +from app import db +from app.utils.log_record import log_operation +from requests.exceptions import RequestException +import requests +from sqlalchemy.orm import aliased, joinedload + +check_data = Blueprint("display", __name__) + +def serialize_tagging_event(event: TaggingEvents) -> dict: + def safe_name(tag): + return getattr(tag, "name", None) if tag else None + + level1 = safe_name(event.level1_tag) + level2 = safe_name(event.level2_tag) + level3 = safe_name(event.level3_tag) + level4 = safe_name(event.level4_tag) + tag_path = " / ".join([x for x in [level1, level2, level3, level4] if x]) + return { + "event_id": event.event_id, + "bag_id": event.bag_id, + "tag_path": tag_path, + "level1_tag_id": event.level1_tag_id, + "level1_tag_name": level1, + "level2_tag_id": event.level2_tag_id, + "level2_tag_name": level2, + "level3_tag_id": event.level3_tag_id, + "level3_tag_name": level3, + "level4_tag_id": event.level4_tag_id, + "level4_tag_name": level4, + "qa_status": event.qa_status.value if event.qa_status else None, + "case_type": event.case_type, + "front_starttime": event.front_starttime.isoformat() + if event.front_starttime + else None, + "front_endtime": event.front_endtime.isoformat() if event.front_endtime else None, + "front_start_sec": event.front_start_sec, + "front_end_sec": event.front_end_sec, + "high_speed": event.high_speed, + "urban": event.urban, + "parking": event.parking, + "note": event.note, + "source": event.source.value if event.source else None, + "reviewer_id": event.reviewer_id, + "ts_event": event.ts_event.isoformat() if event.ts_event else None, + } + + +@check_data.route("/bagtotal", methods=["GET"]) +@jwt_required() +def bag_total(): + """查询BagFile表记录总数""" + # 执行SELECT count(*) FROM bag_file + total_count = BagFile.query.count() + + return jsonify({"total": total_count}), 200 + + +@check_data.route("/noprocess-bagtotal", methods=["GET"]) +@jwt_required() +def no_process_bag_total(): + count = BagFile.query.filter(BagFile.operation_status == 0).count() + return jsonify({"total": count}), 200 + + +@check_data.route("/insert-qa-status", methods=["POST"]) +@jwt_required() +def insert_qa_status(): + try: + # 获取请求数据 + data = request.get_json() + current_user = get_jwt_identity() + + # 验证必要参数(bag_id、qa_status为必填,评论为可选) + required_fields = ["bag_id", "qa_status"] + if not data or not all(field in data for field in required_fields): + return ( + jsonify( + { + "success": False, + "message": f"缺少必要参数,需要: {required_fields}", + } + ), + 400, + ) + + # 验证qa_status是否为有效值 + try: + qa_status = QaStatus(data["qa_status"]) + except ValueError: + valid_statuses = [status.value for status in QaStatus] + return ( + jsonify( + { + "success": False, + "message": f"无效的qa_status值,有效值为: {valid_statuses}", + } + ), + 400, + ) + + # 查询对应的BagFile记录 + bag_file = BagFile.query.get(data["bag_id"]) + if not bag_file: + return ( + jsonify( + { + "success": False, + "message": f'未找到ID为{data["bag_id"]}的BagFile记录', + } + ), + 404, + ) + + # 仅汇总 TaggingEvents,不覆盖每条事件的 qa_status + tag_events = TaggingEvents.query.filter_by( + bag_id=bag_file.id, is_deleted=False + ).all() + + def aggregate_qa_status(events): + has_not_reviewed = False + has_invalid = False + has_modify = False + has_passed = False + for ev in events: + status = ev.qa_status or QaStatus.QA_NOT_REVIEWED + if status == QaStatus.QA_NOT_REVIEWED: + has_not_reviewed = True + elif status == QaStatus.QA_INVALID: + has_invalid = True + elif status == QaStatus.QA_MODIFY: + has_modify = True + elif status == QaStatus.QA_PASSED: + has_passed = True + if has_not_reviewed: + return QaStatus.QA_NOT_REVIEWED + if has_invalid: + return QaStatus.QA_INVALID + if has_modify: + return QaStatus.QA_MODIFY + if has_passed: + return QaStatus.QA_PASSED + return QaStatus.QA_NOT_REVIEWED + + # 更新字段(包含评论字段) + if tag_events: + bag_file.qa_status = aggregate_qa_status(tag_events) + bag_file.qa_confirm_time = datetime.now() + bag_file.qa_id = current_user + if "bag_status" in data: + bag_file.bag_status = data.get("bag_status") + + # 处理评论字段(使用get方法避免参数不存在时报错,默认空字符串) + bag_file.comment1 = data.get("comment1") if data.get("comment1") else None + bag_file.comment2 = data.get("comment2") if data.get("comment2") else None + bag_file.comment3 = data.get("comment3") if data.get("comment3") else None + + # 提交到数据库 + db.session.commit() + + final_qa_status = bag_file.qa_status.value if bag_file.qa_status else None + + return jsonify( + { + "success": True, + "message": f'BagFile ID {data["bag_id"]} 的qa_status已更新为 {final_qa_status}', + "data": { + "bag_id": data["bag_id"], + "qa_status": final_qa_status, + "bag_status": data.get("bag_status"), + "comments": { + "comment1": bag_file.comment1, + "comment2": bag_file.comment2, + "comment3": bag_file.comment3, + }, + }, + } + ) + + except Exception as e: + # 发生错误时回滚 + db.session.rollback() + return jsonify({"success": False, "message": f"更新失败: {str(e)}"}), 500 + + +@check_data.route("/get-finish-list", methods=["POST"]) +@jwt_required() +def get_processed(): + try: + # 1. 解析请求参数(新增sync_status参数) + params = request.get_json() or {} + print(f"【请求参数】原始参数: {params}") + + page = params.get("page", 1) + per_page = params.get("per_page", 20) + file_name = params.get("file_name", "").strip() + start_datetime = params.get("start_datetime", "").strip() + end_datetime = params.get("end_datetime", "").strip() + level1_tag = params.get("level1_tag", "") + status_str = params.get("status", "").strip() + user_id = params.get("user_id", "") + # sync_status_str = params.get('sync_status', '').strip() # 新增:同步状态参数 + + # 2. merge 表别名 + M = aliased(BagMergeRecord) + + # 3. 构建基础查询: + # 选出 BagFile + 逻辑文件名 logical_name = coalesce(joined_name, file_name) + logical_name = func.coalesce(M.joined_name, BagFile.file_name) + + # 2. 构建基础查询(关联User表用于查询username) + query = ( + db.session.query( + BagFile, + logical_name.label("logical_name"), + ) + .outerjoin(User, BagFile.user_id == User.id) + .outerjoin(M, M.src_name == BagFile.file_name) + .options( + joinedload(BagFile.level1_tag), + joinedload(BagFile.level2_tag), + joinedload(BagFile.level3_tag), + joinedload(BagFile.level4_tag), + ) + ) + + # 3. 动态添加过滤条件 + conditions = [] + + # 固定返回bag_status>=1的数据 + conditions.append(BagFile.bag_status >= 1) + conditions.append(BagFile.sync_status == "SYNCED") + + # 只保留 merge 主 bag 或未 merge 的 bag + conditions.append( + or_( + M.is_initiator == True, # 参与 merge 的主 bag + M.id.is_(None), # 完全没 merge 过的 bag(outer join 不命中,M.* 为 NULL) + ) + ) + + # 根据user_id过滤 + if user_id: + try: + user_id_int = int(user_id) + conditions.append(BagFile.user_id == user_id_int) + except ValueError: + print(f"【过滤条件】user_id格式错误(非整数): {user_id}") + + # 新增:根据sync_status过滤 + # if sync_status_str: + # try: + # sync_status_enum = SyncStatus[sync_status_str] # 假设SyncStatus是定义的枚举类 + # conditions.append(BagFile.sync_status == sync_status_enum) + # except KeyError: + # print(f"【过滤条件】无效的sync_status值: {sync_status_str}") + + # 文件名模糊查询 + if file_name: + conditions.append(BagFile.file_name.like(f"%{file_name}%")) + print(f"【过滤条件】添加文件名模糊查询: {file_name}") + + # 时间范围查询 + if start_datetime: + try: + start_dt = datetime.fromisoformat(start_datetime) + conditions.append(BagFile.capture_datetime >= start_dt) + except ValueError: + print(f"【过滤条件】开始时间格式错误: {start_datetime}") + + if end_datetime: + try: + end_dt = datetime.fromisoformat(end_datetime) + conditions.append(BagFile.capture_datetime <= end_dt) + except ValueError: + print(f"【过滤条件】结束时间格式错误: {end_datetime}") + + # 一级标签查询 + if level1_tag: + try: + level1_id = int(level1_tag) + conditions.append(BagFile.level1_tag_id == level1_id) + except ValueError: + print(f"【过滤条件】level1_tag转换失败(非整数): {level1_tag}") + + # 状态查询 + if status_str: + try: + status_enum = BagStatus[status_str] + conditions.append(BagFile.status == status_enum) + except KeyError: + print(f"【过滤条件】无效状态值: {status_str}") + + # 应用所有条件 + query = query.filter(and_(*conditions)) + + # 4. 排序:按update_time降序(核心调整) + query = query.order_by(BagFile.qa_confirm_time.desc()) + + # 5. 分页查询 + pagination = query.paginate(page=page, per_page=per_page, error_out=False) + total_items = pagination.total + total_pages = pagination.pages + + # 6. 序列化(新增sync_status字段) + bag_files = [] + bag_ids = [bag.id for bag, _ in pagination.items] + tag_events_by_bag = {} + if bag_ids: + tag_events = ( + TaggingEvents.query.options( + joinedload(TaggingEvents.level1_tag), + joinedload(TaggingEvents.level2_tag), + joinedload(TaggingEvents.level3_tag), + joinedload(TaggingEvents.level4_tag), + ) + .filter( + TaggingEvents.bag_id.in_(bag_ids), + TaggingEvents.is_deleted == False, + ) + .order_by(TaggingEvents.bag_id.asc(), TaggingEvents.ts_event.asc()) + .all() + ) + for ev in tag_events: + tag_events_by_bag.setdefault(ev.bag_id, []).append( + serialize_tagging_event(ev) + ) + + for bag ,logical_name_value in pagination.items: + qa_username = ( + bag.qa_user.username if (bag.qa_user and bag.qa_user.username) else "" + ) + bag_files.append( + { + "id": bag.id, + "file_name": logical_name_value, + "capture_datetime": ( + bag.capture_datetime.isoformat() + if bag.capture_datetime + else None + ), + "status": bag.status.value if bag.status else None, + "create_time": ( + bag.create_time.isoformat() if bag.create_time else None + ), + "update_time": ( + bag.qa_confirm_time.isoformat() if bag.qa_confirm_time else None + ), # 排序字段显示 + "level1_tag": bag.level1_tag.name if bag.level1_tag else None, + "level2_tag": bag.level2_tag.name if bag.level2_tag else None, + "level3_tag": bag.level3_tag.name if bag.level3_tag else None, + "level4_tag": bag.level4_tag.name if bag.level4_tag else None, + "bag_status": bag.bag_status, + "user_id": bag.user_id, + "username": ( + bag.user.username if (bag.user and bag.user.username) else "" + ), + "qa_status": bag.qa_status.value, + "sync_status": ( + bag.sync_status.value if bag.sync_status else None + ), # 新增:同步状态 + "qa_user_id": bag.qa_id, # 可选:返回QA操作人ID + "qa_username": qa_username, + "comment1": bag.comment1, + "front_start_sec": bag.front_start_sec, + "front_end_sec": bag.front_end_sec, + "high_speed": bag.high_speed, + "urban": bag.urban, + "parking": bag.parking, + "tag_events": tag_events_by_bag.get(bag.id, []), + } + ) + + # 7. 返回响应 + return jsonify( + { + "code": 200, + "data": bag_files, + "total": total_items, + "page": page, + "pages": total_pages, + "message": "查询成功(包含sync_status过滤及按update_time排序)", + } + ) + + except Exception as e: + print(f"【接口异常】: {str(e)}") + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page if "page" in locals() else 1, + "pages": 0, + "message": f"查询出错:{str(e)}", + } + ), + 500, + ) + + +@check_data.route("/insert-db-ids", methods=["POST"]) +@jwt_required() +def insert_db_ids(): + try: + # 获取请求体中的ID列表 + id_list = request.get_json() + + # 1. 验证参数格式 + if not isinstance(id_list, list): + return ( + jsonify( + { + "success": False, + "message": "参数格式错误,需提供数组格式,如[1,2,3]", + } + ), + 400, + ) + + # 检查列表中是否全为整数 + if not all(isinstance(id_val, int) for id_val in id_list): + return jsonify({"success": False, "message": "数组元素必须为整数ID"}), 400 + + # 检查列表是否为空 + if len(id_list) == 0: + return jsonify({"success": False, "message": "ID列表不能为空"}), 400 + + # 2. 执行批量更新 + current_time = datetime.now() + # 使用SQLAlchemy的批量更新 + updated_rows = BagFile.query.filter(BagFile.id.in_(id_list)).update( + {BagFile.sync_status: "SYNCED", BagFile.qa_confirm_time: current_time}, + synchronize_session=False, + ) + + # 提交事务 + db.session.commit() + + # 3. 返回结果 + return ( + jsonify( + { + "success": True, + "message": f"成功更新{updated_rows}条记录", + "updated_count": updated_rows, + "updated_ids": id_list, + } + ), + 200, + ) + + except Exception as e: + # 发生错误时回滚事务 + db.session.rollback() + return jsonify({"success": False, "message": f"更新失败:{str(e)}"}), 500 + + +@check_data.route("/insert-rootdb", methods=["POST"]) +@jwt_required() +def insert_rootdb(): + API_URL = "http://10.0.240.4:5232/api/fst/bags/update" + TIMEOUT = 10 + result = {"success_count": 0, "fail_count": 0, "fail_details": []} + + try: + param_list = request.get_json() + # print(f"【insert_rootdb】请求参数: {param_list}") + if not param_list or not isinstance(param_list, list): + return jsonify({"success": False, "message": "请求参数必须为非空数组"}), 400 + + bag_ids = [ + item.get("rowid") + for item in param_list + if isinstance(item, dict) and "rowid" in item + ] + bag_files = BagFile.query.filter(BagFile.id.in_(bag_ids)).all() if bag_ids else [] + bag_by_id = {bag.id: bag for bag in bag_files} + merge_name_by_src = {} + if bag_files: + src_names = [bag.file_name for bag in bag_files if bag.file_name] + if src_names: + merge_records = ( + BagMergeRecord.query.filter(BagMergeRecord.src_name.in_(src_names)) + .filter(BagMergeRecord.is_initiator == True) + .all() + ) + for record in merge_records: + merge_name_by_src[record.src_name] = record.joined_name + + tag_events = ( + TaggingEvents.query.options( + joinedload(TaggingEvents.level1_tag), + joinedload(TaggingEvents.level2_tag), + joinedload(TaggingEvents.level3_tag), + joinedload(TaggingEvents.level4_tag), + ) + .filter( + TaggingEvents.bag_id.in_(bag_ids), + TaggingEvents.is_deleted == False, + ) + .order_by(TaggingEvents.bag_id.asc(), TaggingEvents.ts_event.asc()) + .all() + if bag_ids + else [] + ) + tag_events_by_bag = {} + for ev in tag_events: + tag_events_by_bag.setdefault(ev.bag_id, []).append(ev) + + def _tags_from_flags(high_speed, urban, parking): + tags = [] + if high_speed == 1: + tags.append("highway") + if urban == 1: + tags.append("city") + if parking == 0: + tags.append("driving") + return tags + + def _nodes_and_level(level1, level2, level3, level4): + nodes = [level1 or "", level2 or "", level3 or "", level4 or ""] + first_empty_index = next( + (idx for idx, node in enumerate(nodes) if node == ""), -1 + ) + if first_empty_index == -1: + fst_node_level = len(nodes) - 1 + else: + fst_node_level = first_empty_index - 1 + return nodes, fst_node_level + + def _build_payload( + bag_name, + level1, + level2, + level3, + level4, + start_sec, + end_sec, + comments, + high_speed, + urban, + parking, + ): + nodes, fst_node_level = _nodes_and_level(level1, level2, level3, level4) + return { + "bag_name": bag_name, + "nodes": nodes, + "start_time": start_sec if start_sec is not None else 0, + "end_time": end_sec if end_sec is not None else 0, + "comments": comments or "", + "tags": _tags_from_flags(high_speed, urban, parking), + "fst_node_level": fst_node_level, + } + + def _safe_name(tag): + return tag.name if tag else "" + + def _payload_from_event(event, bag_name): + return _build_payload( + bag_name, + _safe_name(event.level1_tag), + _safe_name(event.level2_tag), + _safe_name(event.level3_tag), + _safe_name(event.level4_tag), + event.front_start_sec, + event.front_end_sec, + event.note, + event.high_speed, + event.urban, + event.parking, + ) + + def _payload_from_bag(bag, bag_name): + return _build_payload( + bag_name, + _safe_name(bag.level1_tag), + _safe_name(bag.level2_tag), + _safe_name(bag.level3_tag), + _safe_name(bag.level4_tag), + bag.front_start_sec, + bag.front_end_sec, + bag.comment1, + bag.high_speed, + bag.urban, + bag.parking, + ) + + for idx, item in enumerate(param_list): + bag_failures = [] + try: + if not isinstance(item, dict): + raise ValueError("单条数据必须为对象") + if "rowid" not in item: + raise ValueError("参数缺少必要的'rowid'字段") + + current_rowid = item["rowid"] + bag_file = bag_by_id.get(current_rowid) + if not bag_file: + raise ValueError("未找到对应ID的本地记录") + + raw_params = item.get("params") + current_param = ( + item.get("param") if isinstance(item.get("param"), dict) else None + ) + bag_name = item.get("bag_name") + if not bag_name and current_param: + bag_name = current_param.get("bag_name") + if not bag_name and isinstance(raw_params, list) and raw_params: + first_param = raw_params[0] + if isinstance(first_param, dict): + bag_name = first_param.get("bag_name") + if not bag_name: + bag_name = ( + merge_name_by_src.get(bag_file.file_name) + or bag_file.file_name + ) + if not bag_name: + raise ValueError("bag_name为空") + + payloads = [] + if raw_params is not None: + if not isinstance(raw_params, list) or not raw_params: + raise ValueError("params必须为非空数组") + for param in raw_params: + if not isinstance(param, dict): + raise ValueError("params元素必须为对象") + if not param.get("bag_name"): + param["bag_name"] = bag_name + payloads.append((param, None)) + elif current_param: + if not current_param.get("bag_name"): + current_param["bag_name"] = bag_name + payloads.append((current_param, None)) + else: + events = tag_events_by_bag.get(current_rowid, []) + if events: + for ev in events: + payloads.append((_payload_from_event(ev, bag_name), ev)) + else: + payloads.append((_payload_from_bag(bag_file, bag_name), None)) + except Exception as e: + bag_failures.append( + { + "index": idx, + "rowid": item.get("rowid") if isinstance(item, dict) else None, + "message": f"处理失败:{str(e)}", + "error_type": type(e).__name__, + } + ) + result["fail_count"] += 1 + result["fail_details"].extend(bag_failures) + continue + + for ev_idx, (payload, ev) in enumerate(payloads): + # print( + # f"【insert_rootdb】发送到RootDB: rowid={current_rowid}, " + # f"event_index={ev_idx}, event_id={ev.event_id if ev else None}, " + # f"payload={payload}" + # ) + try: + response = requests.post( + url=API_URL, + json=[payload], + timeout=TIMEOUT, + ) + response.raise_for_status() + + response_data = response.json() + if not isinstance(response_data, list) or len(response_data) == 0: + raise ValueError("远程API返回格式错误:预期非空列表") + if not isinstance(response_data[0], dict) or "success" not in response_data[0]: + raise ValueError("远程API返回缺少'success'字段") + + if not response_data[0].get("success"): + bag_failures.append( + { + "index": idx, + "rowid": current_rowid, + "event_index": ev_idx, + "event_id": ev.event_id if ev else None, + "message": "远程API插入失败", + "remote_response": response_data[0], + } + ) + except RequestException as e: + bag_failures.append( + { + "index": idx, + "rowid": current_rowid, + "event_index": ev_idx, + "event_id": ev.event_id if ev else None, + "message": f"网络请求失败:{str(e)}", + "error_type": type(e).__name__, + } + ) + except Exception as e: + bag_failures.append( + { + "index": idx, + "rowid": current_rowid, + "event_index": ev_idx, + "event_id": ev.event_id if ev else None, + "message": f"处理失败:{str(e)}", + "error_type": type(e).__name__, + } + ) + + if bag_failures: + result["fail_count"] += 1 + result["fail_details"].extend(bag_failures) + continue + + bag_file.sync_status = SyncStatus.SYNCED + bag_file.qa_confirm_time = datetime.now() + result["success_count"] += 1 + + db.session.commit() + return ( + jsonify({ + "success": True, + "message": f"处理完成,成功{result['success_count']}条,失败{result['fail_count']}条", + "result": result, + }), + 200, + ) + + except Exception as e: + db.session.rollback() + return jsonify({"success": False, "message": f"服务器处理错误:{str(e)}"}), 500 diff --git a/app/blueprints/data_factory/__inin__.py b/app/blueprints/data_factory/__inin__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/data_factory/routes.py b/app/blueprints/data_factory/routes.py new file mode 100644 index 0000000..a56826b --- /dev/null +++ b/app/blueprints/data_factory/routes.py @@ -0,0 +1,2600 @@ +from collections import defaultdict +import csv +from datetime import date, datetime, timedelta +from io import StringIO +import re +from sqlite3 import IntegrityError +from urllib import response +from flask import Blueprint, current_app, make_response, request, jsonify,json +from flask_jwt_extended import ( + create_access_token, + get_jwt, + get_jwt_identity, + jwt_required, +) +import requests +from sqlalchemy import Date, and_, asc, case, desc, distinct, exists, func, or_ +from app.models import ( + BagFile, + QaStatus, + BagStatus, + EventSource, + Fst, + Role, + TaggingEvents, + User, + UserRole, + VerdictStatus, + BagMergeRecord, + SyncStatus +) + +from app.utils.fst_tree import build_tree, build_sub_tree +from app import db +from app.utils.log_record import log_operation +from app.utils.bagname import extract_datetime_from_filename +from sqlalchemy.orm import aliased + +from app.utils.response_dict import api_response + +# 1.创建蓝图实例,指定名称和导入名称 +data_factory_bp = Blueprint("data_factory", __name__) + + +##### 首页 ### +# 1.根据查询出所有的status +@data_factory_bp.route("/getstatus", methods=["GET"]) +@jwt_required() +def get_status(): + all_values = [ + {"value": member.value, "label": member.value} for member in BagStatus + ] + return jsonify(all_values) + + +# 2.查询出所有的一级标签 +@data_factory_bp.route("/getlevel1", methods=["GET"]) +@jwt_required() +def get_level1(): + level1_tags = Fst.query.filter(Fst.level == 1).all() + result = [ + {"id": tag.id, "name": tag.name, "level": tag.level} for tag in level1_tags + ] + + return jsonify(result) + + + +@data_factory_bp.route("/getbaglist", methods=["POST"]) +@jwt_required() +def get_baglist(): + try: + # 1. 解析请求参数 + params = request.get_json() or {} + print(f"【请求参数】原始参数: {params}") + + page = params.get("page", 1) + per_page = params.get("per_page", 20) + file_name = params.get("file_name", "").strip() + start_datetime = params.get("start_datetime", "").strip() + end_datetime = params.get("end_datetime", "").strip() + level1_tag = params.get("level1_tag", "") + status_str = params.get("status", "").strip() + + + # ========== 封装一个函数,按“model”生成条件 ========== + def build_conditions(model): + # 固定:只返回 bag_status = 0 的记录 + conds = [model.bag_status == 0] + # 文件名模糊查询 + #if file_name: + # conds.append(model.file_name.like(f"%{file_name}%")) + + # 时间范围查询 + if start_datetime: + try: + start_dt = datetime.fromisoformat(start_datetime) + conds.append(model.capture_datetime >= start_dt) + except ValueError: + print(f"【过滤条件】开始时间格式错误: {start_datetime}") + + if end_datetime: + try: + end_dt = datetime.fromisoformat(end_datetime) + conds.append(model.capture_datetime <= end_dt) + except ValueError: + print(f"【过滤条件】结束时间格式错误: {end_datetime}") + + # 一级标签查询(单个字符串) + if level1_tag: + try: + level1_id = int(level1_tag) + conds.append(model.level1_tag_id == level1_id) + except ValueError: + print(f"【过滤条件】level1_tag转换失败(非整数): {level1_tag}") + + # 状态查询(单个字符串) + if status_str: + try: + status_enum = BagStatus[status_str] + conds.append(model.status == status_enum) + except KeyError: + print(f"【过滤条件】无效状态值: {status_str}") + return conds + + # 主查询条件:用 BagFile + base_conditions = build_conditions(BagFile) + + # ========= 关键部分:在 SQL 层做 merge + 去重(与第二版同逻辑) ========= + + # 主查询:再 alias 一份 BagMergeRecord 用来回表 + M = aliased(BagMergeRecord) + logical_name = func.coalesce(M.joined_name, BagFile.file_name) + query = ( + db.session.query(BagFile, logical_name.label("logical_name")) + .outerjoin( + M, + M.src_name == BagFile.file_name, + ) + .filter( + *base_conditions, + or_( + M.is_initiator == True, # 被 merge 的主 bag + M.id.is_(None), # 完全没 merge 过的 bag + ), + ) + .order_by(BagFile.create_time.desc()) + ) + + if file_name: + query= query.filter(logical_name.like(f"%{file_name}%")) + + from sqlalchemy.dialects import mysql + + sql = query.statement.compile( + dialect=mysql.dialect(), # 或者 db.engine.dialect + compile_kwargs={"literal_binds": True}, + ) + current_app.logger.info("getbaglist SQL: %s", sql) + print("getbaglist SQL:", sql) + + + # 5. 分页查询(此时已经是“按 joined_name 去重后”的结果集) + pagination = query.paginate(page=page, per_page=per_page, error_out=False) + total_items = pagination.total + total_pages = pagination.pages + + # 6. 序列化(items 是 (BagFile, logical_name) 元组) + bag_files = [] + for bag, logical_name_value in pagination.items: + bag_files.append( + { + "id": bag.id, + # 对外展示的 file_name:优先 merged 的 joined_name + "file_name": logical_name_value, + "event": bag.event, + "capture_datetime": ( + bag.capture_datetime.isoformat() + if bag.capture_datetime + else None + ), + "status": bag.status.value if bag.status else None, + "create_time": ( + bag.create_time.isoformat() if bag.create_time else None + ), + "level1_tag": bag.level1_tag.name if bag.level1_tag else None, + "bag_status": bag.bag_status, # 始终为 0 + } + ) + + # 7. 返回响应 + return jsonify( + { + "code": 200, + "data": bag_files, + "total": total_items, + "page": page, + "pages": total_pages, + "message": "查询成功(仅返回bag_status为0的数据)", + } + ) + + except Exception as e: + print(f"【接口异常】: {str(e)}") + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page, + "pages": 0, + "message": f"查询出错:{str(e)}", + } + ), + 500, + ) + + +#### 视频播放页面 +# 查询出视频信息,1、2、3、4级标签信息,标签描述等 +@data_factory_bp.route("/getinfo", methods=["GET"]) +@jwt_required() +def get_baginfo(): + try: + bag_id = request.args.get("bag_id") + bagfile = BagFile.query.get(bag_id) + + if not bagfile: + return api_response(404, "BagFile not found") + + # ========== 新增:查询 merge 关系 ========== + merge_info = None # 用来返回 mergeName+所有 src 列表 + extra_video_sources = [] # 前端要的 extraVideoSources 数组 + + # 先看当前这个 bag 的 file_name 有没有被 merge 过(作为 src_name 出现在映射表) + rels_for_this = BagMergeRecord.query.filter_by( + src_name=bagfile.file_name + ).all() + + if rels_for_this: + # 正常情况下,同一个 src_name 对应同一个 joined_name,取第一条即可 + joined_name = rels_for_this[0].joined_name + + # 再查出这个 joined_name 下的所有 src + all_rels = BagMergeRecord.query.filter_by(joined_name=joined_name).order_by( + BagMergeRecord.id.asc() # 其余按插入顺序 + ).all() + src_bag_names = [r.src_name for r in all_rels] + + bagfiles = ( + BagFile.query + .filter(BagFile.file_name.in_(src_bag_names)) + .all() + ) + + # 根据 file_name 建索引,方便按原顺序组装 + bag_by_name = {b.file_name: b for b in bagfiles} + + # 7) 组装返回 list(按上游 names 顺序) + result_list = [] + for name in src_bag_names: + bag = bag_by_name.get(name) + if bag: + result_list.append(serialize_bagfile(bag)) + # 如果某个名字在本地不存在: + # 直接根据文件名拼出视频 url + else: + datetime_full, video_urls = extract_datetime_from_filename(name) + result_list.append( + { + "file_name": name, + "exists": False, + "video_url": video_urls.get("wide"), + "video_urls": video_urls, + "capture_datetime": datetime_full, + }) + + merge_info = { + "joined_name": joined_name, + "src_bag_names": src_bag_names, + } + # 这里按你的需求:把所有 src bagname 作为数组,放到 extraVideoSources + extra_video_sources = result_list + + + # ========= 获取各级标签信息(保持你原来的逻辑) ========= + level1_tag = None + level2_tags = [] # 存储二级标签列表 + level3_tags = [] # 存储三级标签列表 + level4_tags = [] # 存储四级标签列表 + if bagfile.level1_tag_id: + all_tags_struct = get_all_tags_struct() # { "all_tags": [...], "total_level1": X } + # 从 all_tags 里找到 level1_id 对应的块 + match_level1_tag = None + for blk in all_tags_struct.get("all_tags", []): + level1 = blk.get("level1_tag") + if level1 and level1.get("id") == bagfile.level1_tag_id: + match_level1_tag = blk + break + if match_level1_tag: + level1_tag = match_level1_tag.get("level1_tag") + level2_tags = match_level1_tag.get("level2_tags", []) + level3_tags = match_level1_tag.get("level3_tags", []) + level4_tags = match_level1_tag.get("level4_tags", []) + + video_urls = build_video_urls(bagfile.file_name) + + # 构建响应数据 + bagfile_data = { + "id": bagfile.id, + "file_name": bagfile.file_name, + "event": bagfile.event, + "capture_datetime": ( + bagfile.capture_datetime.isoformat() + if bagfile.capture_datetime + else None + ), + "status": bagfile.status.value if bagfile.status else None, + "frame_url": bagfile.frame_url, + "video_url": video_urls.get("wide"), + "video_urls": video_urls, + "batch_name": bagfile.batch_name, + "create_time": ( + bagfile.create_time.isoformat() if bagfile.create_time else None + ), + "update_time": ( + bagfile.update_time.isoformat() if bagfile.update_time else None + ), + "bag_status": bagfile.bag_status, + "last_rule_version_id": bagfile.last_rule_version_id, + "level1_tag_id": bagfile.level1_tag_id, + "comment1": bagfile.comment1, + "comment2": bagfile.comment2, + "comment3": bagfile.comment3, + # 可选:把逻辑上的 merged 名字一并返回,前端要展示也方便 + "joined_name": merge_info["joined_name"] if merge_info else None, + } + + + # 构建完整响应 + response_data = { + "bagfile": bagfile_data, + "level1_tag": level1_tag, + "level2_tags": level2_tags, + "level3_tags": level3_tags, + "level4_tags": level4_tags, + # 新增两个字段 + "extraVideoSources": extra_video_sources, # [] 或 ["A.bag", "B.bag", ...] + "merge_info": merge_info, # None 或 { joined_name, src_bag_names } + "tag_events": [ + serialize_tagging_event(e) + for e in TaggingEvents.query.filter_by(bag_id=bag_id, is_deleted=False) + .order_by(TaggingEvents.ts_event.asc()) + .all() + ], + } + + if not response_data["tag_events"]: + response_data["tag_events"] = [build_default_tag_event(bagfile)] + + return api_response(data=response_data) + + except Exception as e: + return api_response(500, f"Server error: {str(e)}") + + + +def _serialize_tag_row(row): + if not row: + return None + return { + "id": row.id, + "name": row.name, + "name_cn": row.name_cn, + "level": row.level, + "annotation": row.annotation, + "parent_id": row.parent_id, + } + +def get_all_tags_struct(): + """ + 返回: + { + "all_tags": [ + { + "level1_tag": {...}, + "level2_tags": [....], + "level3_tags": [....], + "level4_tags": [....] + }, + ... + ], + "total_level1": X + } + """ + # 一次取全表 + rows = Fst.query.with_entities( + Fst.id, Fst.name, Fst.name_cn, Fst.level, Fst.annotation, Fst.parent_id + ).all() + + by_parent = defaultdict(list) + by_id = {} + for r in rows: + node = _serialize_tag_row(r) + by_id[r.id] = node + by_parent[r.parent_id].append(node) + + # level1 = parent_id 为空 或 level==1 + level1_nodes = [n for n in by_id.values() if n["level"] == 1] + + all_tags_blocks = [] + for l1 in level1_nodes: + l2s = [n for n in by_parent.get(l1["id"], []) if n["level"] == 2] + l3s = [] + for l2 in l2s: + l3s.extend([n for n in by_parent.get(l2["id"], []) if n["level"] == 3]) + l4s = [] + for l3 in l3s: + l4s.extend([n for n in by_parent.get(l3["id"], []) if n["level"] == 4]) + all_tags_blocks.append({ + "level1_tag": l1, + "level2_tags": l2s, + "level3_tags": l3s, + "level4_tags": l4s, + }) + return { + "all_tags": all_tags_blocks, + "total_level1": len(level1_nodes) + } + +VIDEO_URL_KEYS = ("wide", "left", "right", "rear_left", "rear_right", "rear") + +def build_video_urls(bag_filename: str) -> dict: + urls = {key: None for key in VIDEO_URL_KEYS} + try: + _, generated = extract_datetime_from_filename(bag_filename) + print(f'generated:{generated}') + except Exception: + return urls + if isinstance(generated, dict): + for key in VIDEO_URL_KEYS: + urls[key] = generated.get(key) + return urls + + +def serialize_bagfile(bag) -> dict: + video_urls = build_video_urls(bag.file_name) + return { + "id": bag.id, + "file_name": bag.file_name, + "event": bag.event, + "capture_datetime": ( + bag.capture_datetime.isoformat() if bag.capture_datetime else None + ), + "status": bag.status.value if bag.status else None, + "frame_url": bag.frame_url, + "video_url": video_urls.get("wide"), + "video_urls": video_urls, + "batch_name": bag.batch_name, + "create_time": bag.create_time.isoformat() if bag.create_time else None, + "update_time": bag.update_time.isoformat() if bag.update_time else None, + "bag_status": bag.bag_status, + "last_rule_version_id": bag.last_rule_version_id, + "level1_tag_id": bag.level1_tag_id, # 保留bagfile自身的一级标签ID,但不影响标签查询 + } + +## 获取所有一级标签及其子标签 +@data_factory_bp.route("/getalltag", methods=["GET"]) +@jwt_required() +def get_all_tags_and_bagfile(): + try: + # 1. 获取bag_id参数(用于查询单个bagfile) + bag_id = request.args.get("bag_id") + if not bag_id: + return api_response(400, "缺少参数:bag_id") + + # 2. 查询指定的bagfile信息(独立于标签逻辑) + bagfile = BagFile.query.get(bag_id) + if not bagfile: + return api_response(404, f"未找到ID为{bag_id}的bagfile") + + + + # 3. 查询所有标签(完全独立于bagfile的标签逻辑) + all_tags_data = get_all_tags_struct() + + # 4. 合并响应:所有标签 + 单个bagfile信息(两者独立) + return api_response( + data={ + "all_tags": all_tags_data["all_tags"], # 所有一级标签及其子标签(与bagfile无关) + "total_level1": all_tags_data["total_level1"], # 一级标签总数 + "bagfile": serialize_bagfile(bagfile), # 单个bagfile详情(独立) + } + ) + + except Exception as e: + return api_response(500, f"Server error: {str(e)}") + + +### 点击不符合时 +# 1.点击不符合,响应一段文字后 `这个数据包是否符合另一个STS的描述?` +## 点击否时,把用户信息user_id,更新时间update_time,bag_status写入表 +@data_factory_bp.route("/tag-invalid", methods=["POST"]) +@jwt_required() +def get_baginfo_no(): + try: + # 1. 获取请求体数据 + data = request.get_json() + if not data: + return api_response(400, "缺少请求体数据") + + required_fields = ["bag_id", "bag_status", "status", "source"] + for field in required_fields: + if field not in data: + return api_response(400, f"缺少参数:{field}") + + # 2. 查询并验证bagfile状态 + bag_id = data["bag_id"] + bagfile = BagFile.query.get(bag_id) + if not bagfile: + return api_response(404, f"未找到ID为{bag_id}的bagfile") + + if bagfile.bag_status != 0: + return api_response(403, "bag_status不等于0,禁止更新") + + # 3. 获取当前用户ID(从JWT中提取) + current_user = get_jwt_identity() + # print(current_user) + # 4. 更新BagFile表 + update_data = { + "bag_status": data["bag_status"], + "status": data["status"], + "source": data["source"], + "bag_update_time": datetime.now(), # 添加更新时间 + "user_id": current_user, # 添加用户ID + } + + for key, value in update_data.items(): + setattr(bagfile, key, value) + + # 5. 更新TaggingEvents表(如果记录存在) + new_event = TaggingEvents( + bag_id=bag_id, + source=data["source"], + reviewer_id=current_user, # 添加用户ID + rule_version_id=bagfile.last_rule_version_id, + level1_tag_id=bagfile.level1_tag_id, + ts_event=datetime.now(), + ) + + db.session.add(new_event) + # 6. 提交事务 + db.session.commit() + + # 7. 返回成功响应 + return api_response( + 200, + "更新成功", + data={ + "bag_id": bag_id, + "bag_update_time": update_data["bag_update_time"].isoformat(), + }, + ) + + except Exception as e: + db.session.rollback() # 发生异常时回滚事务 + return api_response(500, f"更新失败: {str(e)}") + + +# 新增辅助函数:安全解析ISO时间格式[1](@ref) +def parse_iso_datetime(datetime_str): + """解析ISO格式时间字符串,返回datetime对象或None""" + if not datetime_str: + return None + try: + # 支持带时区和不带时区的格式 + return datetime.fromisoformat(datetime_str.replace("Z", "+00:00")) + except (TypeError, ValueError): + return None + +def serialize_tagging_event(event: TaggingEvents) -> dict: + def safe_name(tag): + return getattr(tag, "name", None) if tag else None + + level1 = safe_name(event.level1_tag) + level2 = safe_name(event.level2_tag) + level3 = safe_name(event.level3_tag) + level4 = safe_name(event.level4_tag) + tag_path = " / ".join([x for x in [level1, level2, level3, level4] if x]) + return { + "event_id": event.event_id, + "bag_id": event.bag_id, + "tag_path": tag_path, + "level1_tag_id": event.level1_tag_id, + "level1_tag_name": level1, + "level2_tag_id": event.level2_tag_id, + "level2_tag_name": level2, + "level3_tag_id": event.level3_tag_id, + "level3_tag_name": level3, + "level4_tag_id": event.level4_tag_id, + "level4_tag_name": level4, + "qa_status": event.qa_status.value if event.qa_status else None, + "case_type": event.case_type, + "front_starttime": event.front_starttime.isoformat() + if event.front_starttime + else None, + "front_endtime": event.front_endtime.isoformat() if event.front_endtime else None, + "front_start_sec": event.front_start_sec, + "front_end_sec": event.front_end_sec, + "high_speed": event.high_speed, + "urban": event.urban, + "parking": event.parking, + "note": event.note, + "source": event.source.value if event.source else None, + "reviewer_id": event.reviewer_id, + "ts_event": event.ts_event.isoformat() if event.ts_event else None, + } + +def build_default_tag_event(bagfile: BagFile) -> dict: + """当没有任何历史 TaggingEvents 时,使用当前 bag 的信息构造一个默认事件""" + level1 = getattr(bagfile.level1_tag, "name", None) + level2 = getattr(bagfile.level2_tag, "name", None) + level3 = getattr(bagfile.level3_tag, "name", None) + level4 = getattr(bagfile.level4_tag, "name", None) + tag_path = " / ".join([x for x in [level1, level2, level3, level4] if x]) + + ts = bagfile.update_time or bagfile.create_time + return { + "event_id": -1, # 前端识别为本地默认数据 + "bag_id": bagfile.id, + "tag_path": tag_path, + "level1_tag_id": bagfile.level1_tag_id, + "level1_tag_name": level1, + "level2_tag_id": bagfile.level2_tag_id, + "level2_tag_name": level2, + "level3_tag_id": bagfile.level3_tag_id, + "level3_tag_name": level3, + "level4_tag_id": bagfile.level4_tag_id, + "level4_tag_name": level4, + "qa_status": bagfile.qa_status.value if bagfile.qa_status else None, + "case_type": bagfile.case_type, + "front_starttime": bagfile.front_starttime.isoformat() if bagfile.front_starttime else None, + "front_endtime": bagfile.front_endtime.isoformat() if bagfile.front_endtime else None, + "front_start_sec": bagfile.front_start_sec, + "front_end_sec": bagfile.front_end_sec, + "high_speed": bagfile.high_speed, + "urban": bagfile.urban, + "parking": bagfile.parking, + "note": bagfile.comment1, + "source": None, + "reviewer_id": bagfile.user_id, + "ts_event": ts.isoformat() if ts else None, + } + + +@data_factory_bp.route("/tag-events", methods=["GET"]) +@jwt_required() +def list_tag_events(): + bag_id = request.args.get("bag_id") + if not bag_id: + return api_response(400, "缺少参数:bag_id") + events = ( + TaggingEvents.query.filter_by(bag_id=bag_id, is_deleted=False) + .order_by(TaggingEvents.ts_event.asc()) + .all() + ) + return api_response(data={"list": [serialize_tagging_event(e) for e in events]}) + + + + +@data_factory_bp.route("/batch-bag-record", methods=["POST"]) +@jwt_required() +def batch_add_record(): + """ + 请求参数: + { + "bag_id": "4", + "alltags": [ + { "id": 395, "name": "U_TURN", "level": 1 }, + { "id": 386, "name": "U_TURN_INTERSECTION", "level": 2 }, + { "id": 648, "name": "U_TURN_INTERSECTION_UTURN_LIGHT", "level": 3 }, + { "id": null, "name": "无四级标签数据", "level": 4 } + ], + "fstime": "15:06:15", + "fetime": "16:00:00", + "casetype": "1", + "bag_status": 1, + "status": "RULE_BASED_ACCEPTED", + "source": "RULE", + "comment1": "", + "comment2": "", + "comment3": "" + } + 批量模式: + { + "bag_id": "4", + "primary_key": "event-1-0", + "records": [ + { ...单条记录结构... }, + { ...单条记录结构... } + ], + "deleted_event_ids": [1, 2] + } + """ + try: + # 1. 解析请求参数 + params = request.get_json() or {} + records = params.get("records") + if not isinstance(records, list): + return jsonify({"code": 400, "message": "records 必须为数组"}), 400 + if not records: + return jsonify({"code": 400, "message": "records 不能为空"}), 400 + + top_bag_id = params.get("bag_id") + if top_bag_id is not None: + for rec in records: + rec.setdefault("bag_id", top_bag_id) + + required_fields = [ + "bag_id", + "alltags", + "fstime", + "fetime", + "casetype", + "bag_status", + ] + for idx, rec in enumerate(records): + missing = [key for key in required_fields if key not in rec] + if missing: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}缺少必要参数: {', '.join(missing)}", + } + ), + 400, + ) + + bag_id = records[0].get("bag_id") + if not bag_id: + return jsonify({"code": 400, "message": "bag_id 不能为空"}), 400 + for idx, rec in enumerate(records): + if rec.get("bag_id") != bag_id: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}的 bag_id 与首条记录不一致", + } + ), + 400, + ) + + # 2. 查询BAG记录并验证状态 + bagfile = BagFile.query.get(bag_id) + if not bagfile: + return jsonify({"code": 404, "message": "BAG记录不存在"}), 404 + + current_user = get_jwt_identity() + + def extract_tag_ids(alltags): + level1_tag_id = next( + ( + tag["id"] + for tag in alltags + if tag["level"] == 1 and tag["id"] is not None + ), + None, + ) + level2_tag_id = next( + ( + tag["id"] + for tag in alltags + if tag["level"] == 2 and tag["id"] is not None + ), + None, + ) + level3_tag_id = next( + ( + tag["id"] + for tag in alltags + if tag["level"] == 3 and tag["id"] is not None + ), + None, + ) + level4_tag_id = next( + ( + tag["id"] + for tag in alltags + if tag["level"] == 4 and tag["id"] is not None + ), + None, + ) + return level1_tag_id, level2_tag_id, level3_tag_id, level4_tag_id + + def normalize_qa_status(value, idx): + if value is None or value == "": + return QaStatus.QA_NOT_REVIEWED, None + if isinstance(value, QaStatus): + return value, None + try: + return QaStatus(value), None + except ValueError: + valid_statuses = [status.value for status in QaStatus] + return ( + None, + ( + jsonify( + { + "code": 400, + "message": f"记录{idx}无效的qa_status值,有效值为: {valid_statuses}", + } + ), + 400, + ), + ) + + def normalize_event_id(value): + if value is None or value == "": + return None + try: + event_id_int = int(value) + except (TypeError, ValueError): + return value + if event_id_int <= 0: + return None + return event_id_int + + deleted_event_ids_raw = params.get("deleted_event_ids") or [] + if not isinstance(deleted_event_ids_raw, list): + return jsonify({"code": 400, "message": "deleted_event_ids 必须为数组"}), 400 + deleted_event_ids = [] + for raw_id in deleted_event_ids_raw: + normalized = normalize_event_id(raw_id) + if isinstance(normalized, int): + deleted_event_ids.append(normalized) + + def aggregate_qa_status(statuses): + has_not_reviewed = False + has_invalid = False + has_modify = False + has_passed = False + for status in statuses: + status = status or QaStatus.QA_NOT_REVIEWED + if status == QaStatus.QA_NOT_REVIEWED: + has_not_reviewed = True + elif status == QaStatus.QA_INVALID: + has_invalid = True + elif status == QaStatus.QA_MODIFY: + has_modify = True + elif status == QaStatus.QA_PASSED: + has_passed = True + if has_not_reviewed: + return QaStatus.QA_NOT_REVIEWED + if has_invalid: + return QaStatus.QA_INVALID + if has_modify: + return QaStatus.QA_MODIFY + if has_passed: + return QaStatus.QA_PASSED + return QaStatus.QA_NOT_REVIEWED + + def validate_tag_hierarchy( + level1_tag_id, level2_tag_id, level3_tag_id, level4_tag_id, idx + ): + if level4_tag_id is not None: + level4_tag = Fst.query.get(level4_tag_id) + if not level4_tag: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}四级标签不存在(ID: {level4_tag_id})", + } + ), + 400, + ) + if not level3_tag_id: + return ( + jsonify( + {"code": 400, "message": f"记录{idx}四级标签存在时,三级标签不能为空"} + ), + 400, + ) + if level4_tag.parent_id != level3_tag_id: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}四级标签的父级ID({level4_tag.parent_id})与三级标签ID({level3_tag_id})不匹配", + } + ), + 400, + ) + + if level3_tag_id is not None: + level3_tag = Fst.query.get(level3_tag_id) + if not level3_tag: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}三级标签不存在(ID: {level3_tag_id})", + } + ), + 400, + ) + if not level2_tag_id: + return ( + jsonify( + {"code": 400, "message": f"记录{idx}三级标签存在时,二级标签不能为空"} + ), + 400, + ) + if level3_tag.parent_id != level2_tag_id: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}三级标签的父级ID({level3_tag.parent_id})与二级标签ID({level2_tag_id})不匹配", + } + ), + 400, + ) + + if level2_tag_id is not None: + level2_tag = Fst.query.get(level2_tag_id) + if not level2_tag: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}二级标签不存在(ID: {level2_tag_id})", + } + ), + 400, + ) + if not level1_tag_id: + return ( + jsonify( + {"code": 400, "message": f"记录{idx}二级标签存在时,一级标签不能为空"} + ), + 400, + ) + if level2_tag.parent_id != level1_tag_id: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}二级标签的父级ID({level2_tag.parent_id})与一级标签ID({level1_tag_id})不匹配", + } + ), + 400, + ) + + if level1_tag_id is not None: + level1_tag = Fst.query.get(level1_tag_id) + if not level1_tag: + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}一级标签不存在(ID: {level1_tag_id})", + } + ), + 400, + ) + return None + + def pick_primary(processed_records): + primary_key = params.get("primary_key") + if primary_key: + for item in processed_records: + if item["record"].get("key") == primary_key: + return item + + return processed_records[0] + + processed = [] + submitted_event_ids = set() + for idx, rec in enumerate(records): + alltags = rec["alltags"] + if not isinstance(alltags, list): + return ( + jsonify( + {"code": 400, "message": f"记录{idx}的 alltags 必须为数组"} + ), + 400, + ) + + ( + level1_tag_id, + level2_tag_id, + level3_tag_id, + level4_tag_id, + ) = extract_tag_ids(alltags) + + error = validate_tag_hierarchy( + level1_tag_id, level2_tag_id, level3_tag_id, level4_tag_id, idx + ) + if error: + return error + + try: + front_starttime = datetime.strptime(rec["fstime"], "%Y-%m-%d %H:%M:%S") + front_endtime = datetime.strptime(rec["fetime"], "%Y-%m-%d %H:%M:%S") + except ValueError as e: + return ( + jsonify( + {"code": 400, "message": f"记录{idx}时间格式错误: {str(e)}"} + ), + 400, + ) + + casetype = rec["casetype"] + bag_status = rec["bag_status"] + status = rec.get("status", "RULE_BASED_ACCEPTED") + source = rec.get("source", "RULE") + comment1 = rec.get("comment1", "") + comment2 = rec.get("comment2", "") + comment3 = rec.get("comment3", "") + front_start_sec = rec.get("front_start_sec") + front_end_sec = rec.get("front_end_sec") + qa_status, qa_error = normalize_qa_status(rec.get("qa_status"), idx) + if qa_error: + return qa_error + high_speed = rec.get("high_speed") + urban = rec.get("urban") + parking = rec.get("parking") + request_type = rec.get("request_type") + event_id = normalize_event_id(rec.get("event_id")) + if isinstance(event_id, int): + submitted_event_ids.add(event_id) + + if event_id is not None: + existing_event = TaggingEvents.query.get(event_id) + if not existing_event: + return ( + jsonify( + { + "code": 404, + "message": f"记录{idx}未找到 event_id={event_id} 的标签事件", + } + ), + 404, + ) + if existing_event.is_deleted: + return ( + jsonify( + { + "code": 404, + "message": f"记录{idx}的 event_id={event_id} 已被删除", + } + ), + 404, + ) + if str(existing_event.bag_id) != str(bag_id): + return ( + jsonify( + { + "code": 400, + "message": f"记录{idx}的 event_id={event_id} 不属于 bag_id={bag_id}", + } + ), + 400, + ) + + existing_event.level1_tag_id = level1_tag_id + existing_event.level2_tag_id = level2_tag_id + existing_event.level3_tag_id = level3_tag_id + existing_event.level4_tag_id = level4_tag_id + existing_event.source = source + existing_event.reviewer_id = current_user + existing_event.ts_event = datetime.now() + existing_event.case_type = casetype + existing_event.front_starttime = front_starttime + existing_event.front_endtime = front_endtime + existing_event.front_start_sec = front_start_sec + existing_event.front_end_sec = front_end_sec + existing_event.high_speed = high_speed if high_speed else 0 + existing_event.urban = urban if urban else 0 + existing_event.parking = parking if parking else 0 + existing_event.qa_status = qa_status + existing_event.note = ( + comment1.strip() + if isinstance(comment1, str) and comment1.strip() + else None + ) + else: + new_event = TaggingEvents( + bag_id=bag_id, + level1_tag_id=level1_tag_id, + level2_tag_id=level2_tag_id, + level3_tag_id=level3_tag_id, + level4_tag_id=level4_tag_id, + source=source, + reviewer_id=current_user, + ts_event=datetime.now(), + case_type=casetype, + front_starttime=front_starttime, + front_endtime=front_endtime, + front_start_sec=front_start_sec, + front_end_sec=front_end_sec, + high_speed=high_speed if high_speed else 0, + urban=urban if urban else 0, + parking=parking if parking else 0, + qa_status=qa_status, + note=comment1.strip() + if isinstance(comment1, str) and comment1.strip() + else None, + ) + db.session.add(new_event) + + processed.append( + { + "record": rec, + "event_id": event_id, + "level1_tag_id": level1_tag_id, + "level2_tag_id": level2_tag_id, + "level3_tag_id": level3_tag_id, + "level4_tag_id": level4_tag_id, + "front_starttime": front_starttime, + "front_endtime": front_endtime, + "casetype": casetype, + "bag_status": bag_status, + "status": status, + "comment1": comment1, + "comment2": comment2, + "comment3": comment3, + "front_start_sec": front_start_sec, + "front_end_sec": front_end_sec, + "qa_status": qa_status, + "high_speed": high_speed, + "urban": urban, + "parking": parking, + "request_type": request_type, + "source": source, + } + ) + + if deleted_event_ids: + delete_ids = {eid for eid in deleted_event_ids if eid not in submitted_event_ids} + for del_id in delete_ids: + delete_event = TaggingEvents.query.get(del_id) + if not delete_event: + return ( + jsonify( + { + "code": 404, + "message": f"未找到 event_id={del_id} 的标签事件", + } + ), + 404, + ) + if str(delete_event.bag_id) != str(bag_id): + return ( + jsonify( + { + "code": 400, + "message": f"event_id={del_id} 不属于 bag_id={bag_id}", + } + ), + 400, + ) + delete_event.is_deleted = True + + primary = pick_primary(processed) + + # 3. 更新BAG记录(以主记录为准) + bagfile.front_starttime = primary["front_starttime"] + bagfile.front_endtime = primary["front_endtime"] + bagfile.case_type = primary["casetype"] + bagfile.bag_status = primary["bag_status"] + bagfile.status = primary["status"] + bagfile.level1_tag_id = primary["level1_tag_id"] + bagfile.level2_tag_id = primary["level2_tag_id"] + bagfile.level3_tag_id = primary["level3_tag_id"] + bagfile.level4_tag_id = primary["level4_tag_id"] + + bagfile.comment1 = primary["comment1"] + bagfile.comment2 = primary["comment2"] + bagfile.comment3 = primary["comment3"] + bagfile.front_start_sec = primary["front_start_sec"] + bagfile.front_end_sec = primary["front_end_sec"] + + bagfile.high_speed = primary["high_speed"] if primary["high_speed"] else 0 + bagfile.urban = primary["urban"] if primary["urban"] else 0 + bagfile.parking = primary["parking"] if primary["parking"] else 0 + + db.session.flush() + active_events = TaggingEvents.query.filter_by( + bag_id=bag_id, is_deleted=False + ).all() + bagfile.qa_status = aggregate_qa_status([ev.qa_status for ev in active_events]) + + if primary["request_type"] == "annotation": + bagfile.bag_update_time = datetime.now() + bagfile.user_id = current_user + + if primary["request_type"] == "qa": + bagfile.qa_confirm_time = datetime.now() + bagfile.qa_id = current_user + + db.session.commit() + + return ( + jsonify( + { + "code": 200, + "message": "批量标签更新成功", + "data": { + "bag_id": bag_id, + "level1_tag_id": primary["level1_tag_id"], + "level2_tag_id": primary["level2_tag_id"], + "level3_tag_id": primary["level3_tag_id"], + "level4_tag_id": primary["level4_tag_id"], + "user_id": current_user, + "source": primary["source"], + "operation": "created", + "event_count": len(processed), + "qa_status": bagfile.qa_status.value if bagfile.qa_status else None, + }, + } + ), + 200, + ) + + except Exception as e: + db.session.rollback() + return jsonify({"code": 500, "message": f"服务器错误: {str(e)}"}), 500 + + +# 查询detail信息 +@data_factory_bp.route("/bag-detail", methods=["POST"]) +@jwt_required() +def bag_detail(): + """ + 参数:[xxxx.bag,xxx.bag] + """ + url = "http://10.0.240.4:5232/api/bags/pangu/detail" + data = request.json + res = requests.post(url=url, json=data["bagname"]) + # res='123' + return jsonify({"data": res.json(), "code": 200, "message": "成功"}) + return jsonify({"data": 123, "code": 200, "message": "成功"}) + + +@data_factory_bp.route("/bag-joined-detail", methods=["POST"]) +@jwt_required() +def bag_joined_detail(): + """ + 请求体示例: + { + "bagname": "xxx.bag", + "before": 5, # 或字符串 "5" + "after": 10 # 或字符串 "10" + } + """ + try: + payload = request.get_json(silent=True) or {} + bagname = payload.get("bagname") + before = payload.get("before") + after = payload.get("after") + + # 1) 基础校验 + if not bagname or before is None or after is None: + return api_response(400, "缺少参数:bagname/before/after") + + # 2) 类型校验/转换(常见为整数秒) + try: + before = int(before) + after = int(after) + except (TypeError, ValueError): + return api_response(400, "参数类型错误:before/after 必须为整数") + + # 3) 上游地址可配置化 + base_url = "http://10.0.240.4:5232" + #base_url = "http://127.0.0.1:5232" + url = f"{base_url}/api/bags/joined" + + # 4) 请求上游(使用 params 自动编码,设置合理超时) + res = requests.get( + url, + params={"bag_name": bagname, "before": before, "after": after}, + timeout=6, + ) + + # 5) 处理上游响应(JSON/非JSON都兜底) + content_type = res.headers.get("content-type", "") + body = res.json() if "application/json" in content_type.lower() else res.text + + # print(res.url) + + print(body) + + if not res.ok: + # 将上游错误透传为 502,并带上上游状态码与内容,便于排查 + return ( + jsonify( + { + "data": body, + "code": res.status_code, + "message": "上游服务返回非 2xx", + } + ), + 502, + ) + + + print(f"body:{body} type={type(body)}") + names = body + # 6) 用这些字符串当作 file_name 去 BagFile 查 + # 保持原顺序,可以先一次性查出所有,再按 names 顺序组装 + bagfiles = ( + BagFile.query + .filter(BagFile.file_name.in_(names)) + .all() + ) + + # 根据 file_name 建索引,方便按原顺序组装 + bag_by_name = {b.file_name: b for b in bagfiles} + + + # 7) 组装返回 list(按上游 names 顺序) + result_list = [] + for name in names: + bag = bag_by_name.get(name) + if bag: + result_list.append(serialize_bagfile(bag)) + # 如果某个名字在本地不存在: + # 直接根据文件名拼出视频 url + else: + datetime_full, video_urls = extract_datetime_from_filename(name) + result_list.append( + { + "file_name": name, + "exists": False, + "video_url": video_urls.get("wide"), + "video_urls": video_urls, + "capture_datetime": datetime_full, + }) + + return jsonify( + { + "data": {"list": result_list}, + "code": 200, + "message": "成功", + } + ), 200 + except requests.Timeout: + return api_response(504, "上游接口超时") + except requests.RequestException as e: + return api_response(502, f"上游请求失败:{str(e)}") + except Exception as e: + return api_response(500, f"服务器错误: {str(e)}") + + +@data_factory_bp.route("/mergebags", methods=["POST"]) +@jwt_required() +def mergebags(): + """ + 请求体示例: + { + "bag_name": [ + "A.bag", + "B.bag" + ] + } + + 逻辑: + 1. 校验 bag_name 为非空数组 + 2. 调用上游 /api/bags/joined/create,参数:{ + "bag_name": [ + "A.bag", + "B.bag" + ] + } + 3. 上游返回形如: + { + "joined_id": 0, + "joined_name": "string" + } + 4. 只有在 joined_name 有值时认为合并成功,本接口返回成功 + """ + try: + payload = request.get_json(silent=True) or {} + bag_names = payload.get("bag_name") + + initiator_src_name = payload.get("initiator_src_name") or bag_names[0] + + # 1) 参数校验 + if not isinstance(bag_names, list) or not bag_names: + return api_response(400, "参数错误:bag_name 必须为非空数组") + # initiator_src_name 必须非空 + if not initiator_src_name: + return api_response(400, "参数错误:initiator_src_name 不能为空") + + # 2) 上游地址 + base_url = "http://10.0.240.4:5232" + # 如果你本地调试要走本机,可以改成下面这行(现在先注释) + #base_url = "http://127.0.0.1:5232" + url = f"{base_url}/api/bags/joined/create" + + # 3) 请求上游 + upstream_resp = requests.post( + url, + json={"bag_names": bag_names}, + timeout=10, + ) + + content_type = upstream_resp.headers.get("content-type", "") + if "application/json" in content_type.lower(): + try: + body = upstream_resp.json() + except Exception: + body = None + else: + # 尝试把文本解析成 JSON;失败就保留原始文本用于报错 + raw_text = upstream_resp.text + try: + body = json.loads(raw_text) + except Exception: + body = None + + # 4) 上游非 2xx 的情况 + if not upstream_resp.ok: + return ( + jsonify( + { + "code": upstream_resp.status_code, + "message": "上游服务返回非 2xx", + "data": body, + } + ), + 502, + ) + + # 5) 上游格式校验 + if not isinstance(body, dict): + return api_response(502, "上游返回格式错误,期望为 JSON 对象") + + joined_id = body.get("joined_id") + joined_name = body.get("joined_name") + + # 6) 只有 joined_name 有值才算成功 + if not joined_name: + return ( + jsonify( + { + "code": 500, + "message": "mergebags 失败:上游返回的 joined_name 为空或缺失", + "data": body, + } + ), + 500, + ) + + # 6) 把 merge 关系写入 bag_merge_record + current_user = get_jwt_identity() + try: + for src in bag_names: + record = BagMergeRecord( + joined_name=joined_name, + src_name=src, + is_initiator=(src == initiator_src_name), + created_by=current_user, + ) + db.session.add(record) + db.session.commit() + except Exception as db_e: + db.session.rollback() + # 上游已成功,但本地记录失败,这里明确提示 + return api_response(500, f"mergebags 上游成功,本地写入映射表失败:{str(db_e)}") + + # 7) 返回成功 + return ( + jsonify( + { + "code": 200, + "message": "mergebags 成功", + "data": { + "joined_id": joined_id, + "joined_name": joined_name, + "bag_name": bag_names, # 把原请求也回显一下,前端更好用 + }, + } + ), + 200, + ) + + except requests.Timeout: + return api_response(504, "上游接口超时") + except requests.RequestException as e: + return api_response(502, f"上游请求失败:{str(e)}") + except Exception as e: + return api_response(500, f"服务器错误: {str(e)}") + + +@data_factory_bp.route("/restore-mergebags", methods=["POST"]) +@jwt_required() +def restore_mergebags(): + """ + 请求体示例: + { + "bag_name": [ + "A.bag", + "B.bag" + ] + } + + 逻辑: + 1. 校验 bag_name 为非空数组 + 2. 调用上游 /api/bags/joined/delete,参数: + { + "bag_name": [...] + } + 3. 上游返回形如: + { + "deleted_parents": [ + "A_C_merged" + ] + } + 4. 只有在 deleted_parents 有值时认为“解除合并”成功, + 然后本地删除 bag_merge_record 中对应的映射记录 + """ + try: + payload = request.get_json(silent=True) or {} + bag_names = payload.get("bag_name") + + # 1) 参数校验 + if not isinstance(bag_names, list) or not bag_names: + return api_response(400, "参数错误:bag_name 必须为非空数组") + + # 2) 上游地址 + base_url = "http://10.0.240.4:5232" + # 如果你本地调试要走本机,可以改成下面这行(现在先注释) + #base_url = "http://127.0.0.1:5232" + url = f"{base_url}/api/bags/joined/delete" + + # 3) 请求上游 + upstream_resp = requests.post( + url, + json={"bag_names": bag_names}, + timeout=10, + ) + + content_type = upstream_resp.headers.get("content-type", "") + if "application/json" in content_type.lower(): + try: + body = upstream_resp.json() + except Exception: + body = None + else: + # 尝试把文本解析成 JSON;失败就保留原始文本用于报错 + raw_text = upstream_resp.text + try: + body = json.loads(raw_text) + except Exception: + body = None + + # 4) 上游非 2xx 的情况 + if not upstream_resp.ok: + return ( + jsonify( + { + "code": upstream_resp.status_code, + "message": "上游服务返回非 2xx", + "data": body, + } + ), + 502, + ) + + # 5) 上游格式校验 + if not isinstance(body, dict): + return api_response(502, "上游返回格式错误,期望为 JSON 对象") + + # 上游返回 { "deleted_parents": [...] } + deleted_parents = body.get("deleted_parents") + + # 6) 只有 deleted_parents 为非空列表才算解除成功 + if not isinstance(deleted_parents, list) or not deleted_parents: + return ( + jsonify( + { + "code": 500, + "message": "restore-mergebags 失败:上游返回的 deleted_parents 为空或缺失", + "data": body, + } + ), + 500, + ) + + # 6.5) 先根据 deleted_parents 找到 is_initiator 那条记录, + # 再查出对应的 BagFile,并用 serialize_bagfile 序列化 + initiator_bagfile_data = None + try: + initiator_record = ( + BagMergeRecord.query + .filter( + BagMergeRecord.joined_name.in_(deleted_parents), + BagMergeRecord.is_initiator.is_(True), + ) + .first() + ) + if initiator_record: + initiator_bag = ( + BagFile.query + .filter(BagFile.file_name == initiator_record.src_name) + .first() + ) + if initiator_bag: + initiator_bagfile_data = serialize_bagfile(initiator_bag) + except Exception as db_e: + # 不影响主流程,只是无法返回 initiator_bagfile + current_app.logger.error( + "查询 is_initiator BagFile 失败:%s", str(db_e) + ) + + + # 7) + # 删除本地映射关系 + try: + deleted_rows = ( + BagMergeRecord.query + .filter(BagMergeRecord.joined_name.in_(deleted_parents)) + .delete(synchronize_session=False) + ) + db.session.commit() + except Exception as db_e: + db.session.rollback() + return api_response( + 500, + f"restore-mergebags 上游已解除合并,本地删除映射记录失败:{str(db_e)}", + ) + + # 无论 deleted_rows 是 0 还是 >0,都算成功(幂等删除) + return ( + jsonify( + { + "code": 200, + "message": "restore-mergebags 成功", + "data": { + "deleted_parents": deleted_parents, + "bag_name": bag_names, + "deleted_rows": deleted_rows, + "initiator_bagfile": initiator_bagfile_data, + }, + } + ), + 200, + ) + except requests.Timeout: + return api_response(504, "上游接口超时") + except requests.RequestException as e: + return api_response(502, f"上游请求失败:{str(e)}") + except Exception as e: + return api_response(500, f"服务器错误: {str(e)}") + + +@data_factory_bp.route("/bag-total", methods=["GET"]) +@jwt_required() +def bag_total(): + try: + # 统计总记录数 + total_count = BagFile.query.count() + + # 统计bag_status为0的记录数 + zero_count = BagFile.query.filter_by(bag_status=0).count() + + # 构建响应数据 + result = { + "success": True, + "data": { + "total_count": total_count, + "zero_count": zero_count, + "non_zero_count": total_count - zero_count, # 额外提供非零数量作为参考 + }, + "message": "统计成功", + } + return jsonify(result), 200 + except Exception as e: + # 错误处理 + return ( + jsonify({"success": False, "data": None, "message": f"统计失败: {str(e)}"}), + 500, + ) + + +def get_weeks_from_date_select(value): + """解析 weekN,返回周数,无效则返回默认 3 周""" + if not value or not re.match(r"^week\d+$", value): + return 3 + try: + return int(value.replace("week", "")) + except ValueError: + return 3 + + +def format_week(week_num): + """格式化周显示:2025年第31周""" + return f"2025年第{week_num}周" + + +def get_dynamic_week_ranges(weeks_count): + """ + 动态生成过去N周的范围(自动适应时间变化) + 返回:[(周数, 周一00:00, 周日23:59:59), ...],按时间顺序(远→近)排列 + """ + today = datetime.now().date() + # 1. 计算“最近已完整结束的周”的周日(周结束日) + # 例:今天是8.4(周一),最近完整周的周日是8.3 + days_since_sunday = ( + today.weekday() + 1 + ) % 7 # 0=周一,6=周日;计算距离上周日的天数 + last_complete_sunday = today - timedelta(days=days_since_sunday) + + # 2. 生成过去N周的范围(从最近完整周往前推) + week_ranges = [] + for i in range(weeks_count): + # 计算当前周的周日(周结束日):最近完整周 - i周 + current_sunday = last_complete_sunday - timedelta(weeks=i) + # 计算当前周的周一(周起始日):周日 - 6天 + current_monday = current_sunday - timedelta(days=6) + + # 计算当前周的周数(ISO周数,周一为周首) + # isocalendar()返回 (年, 周数, 星期几),星期几1=周一,7=周日 + week_num = current_monday.isocalendar()[1] + + # 转换为 datetime 类型(含时间) + week_start = datetime.combine(current_monday, datetime.min.time()) # 周一00:00 + week_end = datetime.combine( + current_sunday, datetime.max.time().replace(microsecond=0) + ) # 周日23:59:59 + + week_ranges.append((week_num, week_start, week_end)) + + # 3. 反转列表,按时间顺序排列(最早的周在前,最近的周在后) + week_ranges.reverse() + return week_ranges + + +@data_factory_bp.route("/echarts", methods=["POST"]) +def bag_statistics(): + try: + data = request.get_json() + if not data: + return jsonify({"success": False, "message": "请求体不能为空"}), 400 + + tag_value = data.get("tagValue", "") + date_select_value = data.get("dateSelectValue", "").strip() + + # 基础条件:目标状态 + target_statuses = [ + BagStatus.REVIEWED_BUT_INVALID, + BagStatus.MANUAL_OVERRIDE_ACCEPTED, + BagStatus.PROCESSED_NOT_REVIEWED, + ] + base_conditions = [BagFile.status.in_(target_statuses)] + + # 标签筛选 + if tag_value: + tag_id = int(tag_value) + fst_tag = Fst.query.filter_by(id=tag_id, level=1).first() + if not fst_tag: + return jsonify({"success": False, "message": "无效的一级标签ID"}), 400 + base_conditions.append(BagFile.level1_tag_id == tag_id) + + weeks_count = get_weeks_from_date_select(date_select_value) + + # 1. 动态生成过去N周的范围(自动适应时间变化) + week_ranges = get_dynamic_week_ranges(weeks_count) + print( + f"DEBUG: 动态生成的周范围: {[(w[0], w[1].date(), w[2].date()) for w in week_ranges]}" + ) + + # 2. 初始化结果字典 + result_dict = { + format_week(week_num): {s.value: 0 for s in target_statuses} + for week_num, _, _ in week_ranges + } + + # 3. 逐个周查询数据(按动态生成的日期范围) + for week_num, week_start, week_end in week_ranges: + conditions = base_conditions + [ + BagFile.bag_update_time >= week_start, + BagFile.bag_update_time <= week_end, + ] + + week_stats = ( + db.session.query(BagFile.status, func.count(BagFile.id).label("count")) + .filter(*conditions) + .group_by(BagFile.status) + .all() + ) + + # 填充数据 + formatted_week = format_week(week_num) + for status, count in week_stats: + result_dict[formatted_week][status.value] = count + print( + f"DEBUG: 第{week_num}周({week_start.date()}至{week_end.date()})数据:{status.value}={count}" + ) + + # 4. 按时间顺序返回(最近的周在最后) + sorted_result = { + format_week(week_num): result_dict[format_week(week_num)] + for week_num, _, _ in week_ranges + } + + total_data_points = sum(sum(d.values()) for d in sorted_result.values()) + + return jsonify( + { + "success": True, + "data": { + "type": "weeks", + "weeks": weeks_count, + "statistics": sorted_result, + }, + "message": ( + "查询成功" + if total_data_points > 0 + else f"过去 {weeks_count} 周内无匹配数据" + ), + } + ) + + except Exception as e: + import traceback + + print(f"CRITICAL ERROR: {str(e)}") + traceback.print_exc() + return jsonify({"success": False, "message": f"服务器内部错误: {str(e)}"}), 500 + + +@data_factory_bp.route("/updatedinfo", methods=["GET"]) +@jwt_required() +def bag_updatedinfo(): + # 根据用户的id获取到 + try: + # 获取请求ID + bag_id = request.args.get("bag_id") if request.args.get("bag_id") else None + + # 直接查询主表数据(不指定预加载) + bag_file = BagFile.query.get(bag_id) + + if not bag_file: + return ( + jsonify({"success": False, "message": f"未找到id为{bag_id}的记录"}), + 404, + ) + # ========= 新增:查询 merge 关系 ========== + merge_info = None # { joined_name, src_bag_names } + extra_video_sources = [] # 序列化后的 src 列表(按 merge 保存顺序) + + # 看当前 bag 的 file_name 是否作为 src_name 出现在合并表 + rels_for_this = BagMergeRecord.query.filter_by( + src_name=bag_file.file_name + ).all() + + if rels_for_this: + # 通常同一个 src_name 对应同一个 joined_name,取第一条即可 + joined_name = rels_for_this[0].joined_name + + # 查出该 joined_name 下所有 src + all_rels = BagMergeRecord.query.filter_by(joined_name=joined_name).all() + src_bag_names = [r.src_name for r in all_rels] + + # 一次性查出这些 bag,再按 src_bag_names 顺序组装 + bagfiles = ( + BagFile.query + .filter(BagFile.file_name.in_(src_bag_names)) + .all() + ) + bag_by_name = {b.file_name: b for b in bagfiles} + + result_list = [] + for name in src_bag_names: + bag = bag_by_name.get(name) + if bag: + result_list.append(serialize_bagfile(bag)) + else: + # 本地没有记录,兜底拼 video_url + datetime_full, video_urls = extract_datetime_from_filename(name) + result_list.append( + { + "file_name": name, + "exists": False, + "video_url": video_urls.get("wide"), + "video_urls": video_urls, + "capture_datetime": datetime_full, + } + ) + + merge_info = { + "joined_name": joined_name, + "src_bag_names": src_bag_names, + } + extra_video_sources = result_list + + # if bag_file.bag_status == 2: + # return jsonify({ + # "success": False, + # "message": f"该记录已经核验" + # }), 404 + + # 序列化日期 + def fmt_dt(dt): + return dt.isoformat() if dt else None + + # 构建返回数据(访问关联属性时会触发惰性加载) + tag_events = [ + serialize_tagging_event(e) + for e in TaggingEvents.query.filter_by(bag_id=bag_id, is_deleted=False) + .order_by(TaggingEvents.ts_event.asc()) + .all() + ] + if not tag_events: + tag_events = [build_default_tag_event(bag_file)] + + video_urls = build_video_urls(bag_file.file_name) + return jsonify( + { + "success": True, + "data": { + # 基础信息 + "id": bag_file.id, + "file_name": bag_file.file_name, + "file_path": bag_file.file_path, + "capture_datetime": fmt_dt(bag_file.capture_datetime), + "vehicle_status": bag_file.vehicle_status, + "user_id": bag_file.user_id, + "create_time": fmt_dt(bag_file.bag_update_time), + "update_time": fmt_dt(bag_file.update_time), + "car_state": bag_file.car_state, + "frame_url": bag_file.frame_url, + "video_url": video_urls.get("wide"), + "video_urls": video_urls, + "batch_name": bag_file.batch_name, + "status": bag_file.status.value if bag_file.status else None, + "last_time": fmt_dt(bag_file.last_time), + "last_rule_version_id": bag_file.last_rule_version_id, + "front_starttime": fmt_dt(bag_file.front_starttime), + "front_endtime": fmt_dt(bag_file.front_endtime), + "case_type": bag_file.case_type, + "comment1": bag_file.comment1, + "comment2": bag_file.comment2, + "comment3": bag_file.comment3, + "bag_status": bag_file.bag_status, + "front_start_sec": bag_file.front_start_sec, + "front_end_sec": bag_file.front_end_sec, + "high_speed": bag_file.high_speed, + "urban": bag_file.urban, + "parking": bag_file.parking, + "sync_status": bag_file.sync_status.value, + # merge 相关信息 + "joined_name": merge_info["joined_name"] if merge_info else None, + "extraVideoSources": extra_video_sources, + "merge_info": merge_info, + "tag_events": tag_events, + # 关联的FST标签信息(触发惰性加载) + "level1_tag": ( + { + "id": bag_file.level1_tag.id, + "name": bag_file.level1_tag.name, + "name_cn": bag_file.level1_tag.name_cn, + "annotation": bag_file.level1_tag.annotation, + } + if bag_file.level1_tag + else None + ), + "level2_tag": ( + { + "id": bag_file.level2_tag.id, + "name": bag_file.level2_tag.name, + "name_cn": bag_file.level2_tag.name_cn, + "annotation": bag_file.level2_tag.annotation, + } + if bag_file.level2_tag + else None + ), + "level3_tag": ( + { + "id": bag_file.level3_tag.id, + "name": bag_file.level3_tag.name, + "name_cn": bag_file.level3_tag.name_cn, + "annotation": bag_file.level3_tag.annotation, + } + if bag_file.level3_tag + else None + ), + "level4_tag": ( + { + "id": bag_file.level4_tag.id, + "name": bag_file.level4_tag.name, + "name_cn": bag_file.level4_tag.name_cn, + "level": bag_file.level4_tag.level, + "annotation": bag_file.level4_tag.annotation, + } + if bag_file.level4_tag + else None + ), + }, + "message": f"成功获取id为{bag_id}的记录", + } + ) + + except Exception as e: + return jsonify({"success": False, "message": f"服务器错误:{str(e)}"}), 500 + + +@data_factory_bp.route("/getretestbaglist", methods=["POST"]) +@jwt_required() +def get_retest_baglist(): + try: + # 1. 解析请求参数(与原代码一致) + params = request.get_json() or {} + print(f"【请求参数】原始参数: {params}") + + page = params.get("page", 1) + per_page = params.get("per_page", 20) + file_name = params.get("file_name", "").strip() + start_datetime = params.get("start_datetime", "").strip() + end_datetime = params.get("end_datetime", "").strip() + level1_tag = params.get("level1_tag", "") + status_str = params.get("status", "").strip() + user_id = params.get("user_id", "") + qa_status_str = params.get("qa_status", "").strip() + qa_id = params.get("qa_id", "") + + # 2. 创建表别名(新增QA用户表别名) + FstLevel1 = aliased(Fst) + FstLevel2 = aliased(Fst) + FstLevel3 = aliased(Fst) + FstLevel4 = aliased(Fst) + QaUser = aliased(User) # 用于区分创建者和QA操作人 + M = aliased(BagMergeRecord) # 新增:merge 表别名 + + # === 3. 构建基础查询(注意这里用 db.session.query + outerjoin M)=== + logical_name = func.coalesce(M.joined_name, BagFile.file_name) + + # 3. 构建查询(新增qa_id与QaUser的关联) + query = ( + db.session.query(BagFile, logical_name.label("logical_name")) + .outerjoin(User, BagFile.user_id == User.id) + .outerjoin(QaUser, BagFile.qa_id == QaUser.id) + .outerjoin(FstLevel1, BagFile.level1_tag_id == FstLevel1.id) + .outerjoin(FstLevel2, BagFile.level2_tag_id == FstLevel2.id) + .outerjoin(FstLevel3, BagFile.level3_tag_id == FstLevel3.id) + .outerjoin(FstLevel4, BagFile.level4_tag_id == FstLevel4.id) + .outerjoin(M, M.src_name == BagFile.file_name) # 关键:把 M 左连接进来 + ) + + # 4. 动态添加过滤条件(与原代码一致) + conditions = [] + conditions.append(BagFile.bag_status >= 1) + conditions.append(BagFile.sync_status == SyncStatus.SYNC_NOT_READY) + + if user_id: + try: + user_id_int = int(user_id) + conditions.append(BagFile.user_id == user_id_int) + except ValueError: + print(f"【过滤条件】user_id格式错误(非整数): {user_id}") + + if qa_id: + try: + qa_id_int = int(qa_id) + conditions.append(BagFile.qa_id == qa_id_int) # 关联BagFile的qa_id字段 + except ValueError: + print(f"【过滤条件】qa_id格式错误(非整数): {qa_id}") + + #if file_name: + # conditions.append(BagFile.file_name.like(f"%{file_name}%")) + + if start_datetime: + try: + start_dt = datetime.fromisoformat(start_datetime) + conditions.append(BagFile.bag_update_time >= start_dt) + except ValueError: + print(f"【过滤条件】开始时间格式错误: {start_datetime}") + + if end_datetime: + try: + end_dt = datetime.fromisoformat(end_datetime) + conditions.append(BagFile.bag_update_time <= end_dt) + except ValueError: + print(f"【过滤条件】结束时间格式错误: {end_datetime}") + + if level1_tag: + try: + level1_id = int(level1_tag) + conditions.append(BagFile.level1_tag_id == level1_id) + except ValueError: + print(f"【过滤条件】level1_tag转换失败(非整数): {level1_tag}") + + if status_str: + try: + status_enum = BagStatus[status_str] + conditions.append(BagFile.status == status_enum) + except KeyError: + print(f"【过滤条件】无效状态值: {status_str}") + + if qa_status_str: + try: + qa_status_enum = QaStatus[qa_status_str] + conditions.append(BagFile.qa_status == qa_status_enum) + except KeyError: + print(f"【过滤条件】无效qa_status值: {qa_status_str}") + + # === 新增:只保留 is_initiator / 未合并 的记录 === + conditions.append( + or_( + M.is_initiator == True, # 被 merge 的主 bag + M.id.is_(None), # 完全没 merge 过的 bag + ) + ) + + if conditions: + query = query.filter(and_(*conditions)) + + + if file_name: + query= query.filter(logical_name.like(f"%{file_name}%")) + + # 5. 排序与分页(与原代码一致) + # query = query.order_by(BagFile.bag_update_time.desc()) + # 使用case语句给QA_NOT_REVIEWED的记录赋予更高优先级(0比1小,排序时靠前) + priority_case = case( + ( + BagFile.qa_status == QaStatus.QA_NOT_REVIEWED, + 0, + ), # 直接传递元组作为位置参数 + else_=1, + ) + + # 组合排序条件:先按优先级升序(0在前),再按update_time降序 + query = query.order_by( + priority_case.asc(), # 第一排序:QA_NOT_REVIEWED优先 + BagFile.update_time.desc(), # 第二排序:最新更新在前 + ) + + pagination = query.paginate(page=page, per_page=per_page, error_out=False) + total_items = pagination.total + total_pages = pagination.pages + + bag_files = [] + for bag ,logical_name_value in pagination.items: + level1_name = bag.level1_tag.name if bag.level1_tag else None + level2_name = bag.level2_tag.name if bag.level2_tag else None + level3_name = bag.level3_tag.name if bag.level3_tag else None + level4_name = bag.level4_tag.name if bag.level4_tag else None + + qa_username = ( + bag.qa_user.username if (bag.qa_user and bag.qa_user.username) else "" + ) + + bag_files.append( + { + "id": bag.id, + "file_name": logical_name_value, + "capture_datetime": ( + bag.capture_datetime.isoformat() + if bag.capture_datetime + else None + ), + "status": bag.status.value if bag.status else None, + "create_time": ( + bag.create_time.isoformat() if bag.create_time else None + ), + "level1_tag": level1_name, + "level2_tag": level2_name, + "level3_tag": level3_name, + "level4_tag": level4_name, + "bag_status": bag.bag_status, + "user_id": bag.user_id, + "username": ( + bag.user.username + if (bag.user and bag.user.username) + else "未知用户" + ), # 创建者用户名 + "update_time": ( + bag.bag_update_time.isoformat() if bag.bag_update_time else None + ), + "qa_status": ( + bag.qa_status.value if bag.qa_status else None + ), # 补充None判断 + "front_start_sec": bag.front_start_sec, + "front_end_sec": bag.front_end_sec, + "qa_user_id": bag.qa_id, # QA操作人ID + "qa_username": qa_username, # 修正后的QA用户名 + "comment1": bag.comment1, + "comment2": bag.comment2, + "comment3": bag.comment3, + "qa_time": ( + bag.qa_confirm_time.isoformat() if bag.qa_confirm_time else None + ), + "high_speed": bag.high_speed, + "urban": bag.urban, + "parking": bag.parking, + "sync_status": bag.sync_status.value, + } + ) + + # 7. 返回响应(与原代码一致) + return jsonify( + { + "code": 200, + "data": bag_files, + "total": total_items, + "page": page, + "pages": total_pages, + "message": "查询成功", + } + ) + + except Exception as e: + print(f"【接口异常】: {str(e)}") + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page if "page" in locals() else 1, + "pages": 0, + "message": f"查询出错:{str(e)}", + } + ), + 500, + ) + + +@data_factory_bp.route("/bag-total-tobe-checked", methods=["GET"]) +@jwt_required() +def bag_total_tobe_checked(): + try: + M = aliased(BagMergeRecord) + + q = ( + db.session.query(func.count(BagFile.id)) + .outerjoin(M, M.src_name == BagFile.file_name) + .filter( + BagFile.status == BagStatus.PROCESSED_NOT_REVIEWED, + BagFile.bag_status == 0, + or_( + M.is_initiator == True, + M.id.is_(None), + ), + ) + ) + + total = q.scalar() + + # 构造响应 + response = { + "code": 200, + "message": "查询成功", + "data": { + "total_tobe_checked": total, # 待审核的总数 + "status": "PROCESSED_NOT_REVIEWED", # 明确查询的状态值 + "query_time": datetime.now().isoformat(), # 查询时间戳 + }, + } + return jsonify(response) + + except Exception as e: + # 异常处理 + return ( + jsonify( + { + "code": 500, + "message": f"查询失败:{str(e)}", + "data": {"total_tobe_checked": 0}, + } + ), + 500, + ) + + +@data_factory_bp.route("/exportretestbaglist", methods=["POST"]) +@jwt_required() +def export_retest_baglist(): + try: + # 1. 解析请求参数(与原查询接口完全一致) + params = request.get_json() or {} + print(f"【导出请求参数】原始参数: {params}") + + # 导出无需分页,忽略page和per_page,仅保留筛选条件 + file_name = params.get("file_name", "").strip() + start_datetime = params.get("start_datetime", "").strip() + end_datetime = params.get("end_datetime", "").strip() + level1_tag = params.get("level1_tag", "") + status_str = params.get("status", "").strip() + user_id = params.get("user_id", "") + qa_status_str = params.get("qa_status", "").strip() + qa_status_enum = None + + # 2. 创建表别名(与原接口一致) + FstLevel1 = aliased(Fst) + FstLevel2 = aliased(Fst) + FstLevel3 = aliased(Fst) + FstLevel4 = aliased(Fst) + QaUser = aliased(User) + M = aliased(BagMergeRecord) # 新增:merge 表别名 + + # === 3. 构建基础查询(注意这里用 db.session.query + outerjoin M)=== + logical_name = func.coalesce(M.joined_name, BagFile.file_name) + + # 3. 构建查询(与原接口一致,但不分页) + query = ( + db.session.query(BagFile, logical_name.label("logical_name")) + .outerjoin(User, BagFile.user_id == User.id) + .outerjoin(QaUser, BagFile.qa_id == QaUser.id) + .outerjoin(FstLevel1, BagFile.level1_tag_id == FstLevel1.id) + .outerjoin(FstLevel2, BagFile.level2_tag_id == FstLevel2.id) + .outerjoin(FstLevel3, BagFile.level3_tag_id == FstLevel3.id) + .outerjoin(FstLevel4, BagFile.level4_tag_id == FstLevel4.id) + .outerjoin(M, M.src_name == BagFile.file_name) # 关键:把 M 左连接进来 + ) + + # 4. 动态添加过滤条件(与原接口完全一致) + conditions = [] + conditions.append(BagFile.bag_status >= 1) + conditions.append(BagFile.sync_status == SyncStatus.SYNC_NOT_READY) + + if user_id: + try: + user_id_int = int(user_id) + conditions.append(BagFile.user_id == user_id_int) + except ValueError: + print(f"【过滤条件】user_id格式错误: {user_id}") + + #if file_name: + # conditions.append(BagFile.file_name.like(f"%{file_name}%")) + + if start_datetime: + try: + start_dt = datetime.fromisoformat(start_datetime) + conditions.append(BagFile.capture_datetime >= start_dt) + except ValueError: + print(f"【过滤条件】开始时间格式错误: {start_datetime}") + + if end_datetime: + try: + end_dt = datetime.fromisoformat(end_datetime) + conditions.append(BagFile.capture_datetime <= end_dt) + except ValueError: + print(f"【过滤条件】结束时间格式错误: {end_datetime}") + + if level1_tag: + try: + level1_id = int(level1_tag) + conditions.append(BagFile.level1_tag_id == level1_id) + except ValueError: + print(f"【过滤条件】level1_tag转换失败: {level1_tag}") + + if status_str: + try: + status_enum = BagStatus[status_str] + conditions.append(BagFile.status == status_enum) + except KeyError: + print(f"【过滤条件】无效状态值: {status_str}") + + if qa_status_str: + try: + qa_status_enum = QaStatus[qa_status_str] + conditions.append(BagFile.qa_status == qa_status_enum) + except KeyError: + print(f"【过滤条件】无效qa_status值: {qa_status_str}") + + # === 新增:只保留 is_initiator / 未合并 的记录 === + conditions.append( + or_( + M.is_initiator == True, # 被 merge 的主 bag + M.id.is_(None), # 完全没 merge 过的 bag + ) + ) + + if conditions: + query = query.filter(and_(*conditions)) + + if file_name: + query= query.filter(logical_name.like(f"%{file_name}%")) + + # 5. 排序(保留排序逻辑,与原接口一致) + query = query.order_by(BagFile.bag_update_time.desc()) + + # 6. 获取所有数据(不分页) + all_data = query.all() # 直接查询所有符合条件的数据 + print(f"【导出数据量】共 {len(all_data)} 条记录") + + bag_ids = [bag.id for bag, _ in all_data] + tag_events_by_bag = defaultdict(list) + fst_name_by_id = {} + if bag_ids: + tag_events_query = TaggingEvents.query.filter( + TaggingEvents.bag_id.in_(bag_ids), + TaggingEvents.is_deleted == False, + TaggingEvents.qa_status.isnot(None), + ) + if qa_status_enum is not None: + tag_events_query = tag_events_query.filter( + TaggingEvents.qa_status == qa_status_enum + ) + tag_events = tag_events_query.order_by(TaggingEvents.ts_event.asc()).all() + + for ev in tag_events: + tag_events_by_bag[ev.bag_id].append(ev) + + tag_ids = set() + for ev in tag_events: + for tag_id in ( + ev.level1_tag_id, + ev.level2_tag_id, + ev.level3_tag_id, + ev.level4_tag_id, + ): + if tag_id: + tag_ids.add(tag_id) + if tag_ids: + fst_name_by_id = { + tag.id: tag.name + for tag in Fst.query.filter(Fst.id.in_(tag_ids)).all() + } + + # 7. 批量查询QA用户信息(优化性能) + qa_ids = [bag.qa_id for bag, _ in all_data if bag.qa_id is not None] + qa_users = ( + {u.id: u for u in User.query.filter(User.id.in_(qa_ids)).all()} + if qa_ids + else {} + ) + + # 8. 生成CSV内容 + output = StringIO() + output.write("\ufeff") + csv_writer = csv.writer(output) + + # 8.1 写入CSV表头(与返回JSON的字段对应) + csv_writer.writerow( + [ + "ID", + "文件名", + "采集时间", + "状态", + "创建时间", + "一级标签", + "二级标签", + "三级标签", + "四级标签", + "bag状态", + "标注人ID", + "标注人用户名", + "标注人的更新时间", + "质检人的更新时间", + "质检状态", + "场景开始秒数", + "场景结束秒数", + "质检人ID", + "质检人用户名", + "备注1", # 对应comment1字段 + "场景类型", + "高速", + "城区", + "parking", + ] + ) + + # 8.2 写入数据行 + for bag, logical_name_value in all_data: + # QA用户名 + qa_username = "" + if bag.qa_id in qa_users: + qa_user = qa_users[bag.qa_id] + qa_username = qa_user.username if qa_user.username else "" + + # 时间格式化 + capture_time = ( + bag.capture_datetime.isoformat() if bag.capture_datetime else "" + ) + create_time = bag.create_time.isoformat() if bag.create_time else "" + update_time = bag.bag_update_time.isoformat() if bag.bag_update_time else "" + qa_time = bag.qa_confirm_time.isoformat() if bag.qa_confirm_time else "" + + # 枚举值处理 + status = bag.status.value if bag.status else "" + + events = tag_events_by_bag.get(bag.id, []) + if events: + for ev in events: + level1_name = fst_name_by_id.get(ev.level1_tag_id, "") + level2_name = fst_name_by_id.get(ev.level2_tag_id, "") + level3_name = fst_name_by_id.get(ev.level3_tag_id, "") + level4_name = fst_name_by_id.get(ev.level4_tag_id, "") + + qa_status = ev.qa_status.value if ev.qa_status else "" + front_start_sec = ( + ev.front_start_sec if ev.front_start_sec is not None else 0 + ) + front_end_sec = ( + ev.front_end_sec if ev.front_end_sec is not None else 0 + ) + comment = ev.note or "" + case_type = ev.case_type + high_speed = ev.high_speed if ev.high_speed is not None else 0 + urban = ev.urban if ev.urban is not None else 0 + parking = ev.parking if ev.parking is not None else 0 + + csv_writer.writerow( + [ + bag.id, + logical_name_value, + capture_time, + status, + create_time, + level1_name, + level2_name, + level3_name, + level4_name, + bag.bag_status, + bag.user_id, + ( + bag.user.username + if (bag.user and bag.user.username) + else "未知用户" + ), + update_time, + qa_time, + qa_status, + front_start_sec, + front_end_sec, + bag.qa_id, + qa_username, + comment, + case_type, + high_speed, + urban, + parking, + ] + ) + else: + level1_name = bag.level1_tag.name if bag.level1_tag else "" + level2_name = bag.level2_tag.name if bag.level2_tag else "" + level3_name = bag.level3_tag.name if bag.level3_tag else "" + level4_name = bag.level4_tag.name if bag.level4_tag else "" + + qa_status = bag.qa_status.value if bag.qa_status else "" + + csv_writer.writerow( + [ + bag.id, + logical_name_value, + capture_time, + status, + create_time, + level1_name, + level2_name, + level3_name, + level4_name, + bag.bag_status, + bag.user_id, + ( + bag.user.username + if (bag.user and bag.user.username) + else "未知用户" + ), + update_time, + qa_time, + qa_status, + bag.front_start_sec if bag.front_start_sec else 0, + bag.front_end_sec, + bag.qa_id, + qa_username, + bag.comment1 or "", + bag.case_type, + bag.high_speed, + bag.urban, + bag.parking, + ] + ) + + # 9. 构建响应(返回CSV文件) + output.seek(0) # 重置缓冲区指针 + response = make_response(output.getvalue()) + + # 设置响应头:指定文件名和CSV格式,确保中文正常显示 + filename = f"retest_bag_export_{datetime.now().strftime('%Y%m%d%H%M%S')}.csv" + response.headers["Content-Disposition"] = f"attachment; filename={filename}" + response.headers["Content-type"] = "text/csv; charset=utf-8" + response.headers["Cache-Control"] = "no-cache" + + return response + + except Exception as e: + print(f"【导出异常】: {str(e)}") + return jsonify({"code": 500, "message": f"导出失败:{str(e)}"}), 500 diff --git a/app/blueprints/data_factory/services.py b/app/blueprints/data_factory/services.py new file mode 100644 index 0000000..be404a0 --- /dev/null +++ b/app/blueprints/data_factory/services.py @@ -0,0 +1,50 @@ +from sqlalchemy.exc import SQLAlchemyError +from datetime import datetime + +from app.models import EventSource, TaggingEvents, VerdictStatus + +def create_tagging_event(db, **kwargs): + """ + 创建并提交TaggingEvents记录 + 参数: + db: SQLAlchemy数据库实例 + kwargs: 字段键值对,支持所有非主键字段 + + 返回: (success: bool, message: str, event: TaggingEvents) + """ + # 1. 创建事件对象并设置属性 + event = TaggingEvents() + + # 2. 动态设置字段值 + valid_fields = { + 'bag_id', 'source', 'rule_version_id', 'reviewer_id', 'verdict', + 'level1_tag_id', 'level2_tag_id', 'level3_tag_id', 'level4_tag_id' + } + + for field, value in kwargs.items(): + if field in valid_fields: + setattr(event, field, value) + # 自动处理特殊字段类型[1,4](@ref) + elif field == 'ts_event' and isinstance(value, datetime): + event.ts_event = value + + # 3. 枚举字段验证[1](@ref) + if 'source' in kwargs and not isinstance(kwargs['source'], EventSource): + return False, "source必须是EventSource枚举类型", None + + if 'verdict' in kwargs and not isinstance(kwargs['verdict'], VerdictStatus): + return False, "verdict必须是VerdictStatus枚举类型", None + + # 4. 提交到数据库[2,4](@ref) + try: + db.session.add(event) + db.session.commit() + return True, "记录创建成功", event + except SQLAlchemyError as e: + db.session.rollback() + # app.logger.error(f"数据库写入失败: {str(e)}") + return False, f"数据库错误: {str(e)}", None + except Exception as e: + db.session.rollback() + # app.logger.error(f"未知错误: {str(e)}") + return False, f"系统错误: {str(e)}", None \ No newline at end of file diff --git a/app/blueprints/label_data/__inin__.py b/app/blueprints/label_data/__inin__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/label_data/rotutes.py b/app/blueprints/label_data/rotutes.py new file mode 100644 index 0000000..34ed55b --- /dev/null +++ b/app/blueprints/label_data/rotutes.py @@ -0,0 +1,294 @@ +from datetime import datetime +from flask import Blueprint, current_app, request, jsonify +from flask_jwt_extended import jwt_required +import requests +from sqlalchemy import func +from app import db +from app.models import Fst +from app.utils.fst_tree import build_tree + + +label_bp = Blueprint('label', __name__) + + +def format_fst_item(fst_item): + """将Fst对象转换为指定格式的字典""" + # 从reserved_json中获取type,如果没有则默认为空字符串 + item_type = "" + if fst_item.reserved_json and "type" in fst_item.reserved_json: + item_type = fst_item.reserved_json["type"] + + return { + "date": fst_item.update_time.strftime('%Y-%m-%d'), # 格式化日期 + "id": fst_item.id, + "name": fst_item.name, + "parentId": None if fst_item.parent_id==591 else fst_item.parent_id, # 注意这里是驼峰命名 + "name_cn": fst_item.name_cn, + "annotation":fst_item.annotation, + "level":fst_item.level + } + +@label_bp.route('/fst-tree', methods=['GET']) +def get_fst_tree(): + """获取所有FST数据并格式化为树形结构列表""" + try: + # 查询所有FST记录 + all_fst = Fst.query.all() + + # 转换为指定格式 + formatted_data = [format_fst_item(item) for item in all_fst] + + # 返回JSON响应 + return jsonify({ + "success": True, + "data": formatted_data + }) + except Exception as e: + return jsonify({ + "success": False, + "error": str(e) + }), 500 + + +@label_bp.route('/create-levelone', methods=['POST']) +@jwt_required() +def create_levelone(): + # 获取请求数据 + data = request.get_json() + + # 验证必要参数 + required_fields = ['name', 'level', 'annotation'] + for field in required_fields: + if field not in data: + return jsonify({'error': f'Missing required field: {field}'}), 400 + + # 验证层级是否为1 + if data['level'] != 1: + return jsonify({'error': 'Level must be 1 for first-level tags'}), 400 + + + try: + # 查询当前最大的id值 + max_id_result = db.session.query(func.max(Fst.id)).first() + max_id = max_id_result[0] if max_id_result[0] is not None else 0 + + # 新id为最大id + 1 + new_id = max_id + 1 + + # 创建新的一级标签 + new_tag = Fst( + id=new_id, + name=data['name'], + level=data['level'], + annotation=data['annotation'], + parent_id=591, # 固定设置parent_id为591 + update_time=datetime.now() # 设置更新时间 + # 其他字段如name_cn、reserved_json、bag_sum如果有默认值可以不用指定 + ) + + # 添加到数据库会话并提交 + db.session.add(new_tag) + db.session.commit() + + # print(f"新标签的ID: {new_tag.id}") + # 返回创建成功的标签信息 + return jsonify({ + 'message': 'First-level tag created successfully', + 'tag': { + 'id': new_tag.id, + 'name': new_tag.name, + 'level': new_tag.level, + 'annotation': new_tag.annotation, + 'parent_id': new_tag.parent_id, + 'update_time': new_tag.update_time.isoformat() + } + }), 201 + + except Exception as e: + # 发生错误时回滚 + db.session.rollback() + return jsonify({'error': str(e)}), 500 + + +@label_bp.route('/update-fst-annotation', methods=['POST']) +@jwt_required() +def update_fst_annotation(): + # 获取请求数据 + data = request.get_json() + + # 验证必要参数 + required_fields = ['name', 'level', 'annotation'] + for field in required_fields: + if field not in data: + return jsonify({'error': f'Missing required field: {field}'}), 400 + + try: + # 根据name和level查询对应的记录 + fst_record = Fst.query.filter_by( + name=data['name'], + level=data['level'] + ).first() + + # 检查记录是否存在 + if not fst_record: + return jsonify({ + 'error': f'No record found with name: {data["name"]} and level: {data["level"]}' + }), 404 + + # 更新annotation字段和更新时间 + fst_record.annotation = data['annotation'] + fst_record.update_time = datetime.now() # 更新时间戳 + + # 提交修改 + db.session.commit() + + # 返回更新成功的信息 + return jsonify({ + 'message': 'Annotation updated successfully', + 'updated_record': { + 'id': fst_record.id, + 'name': fst_record.name, + 'level': fst_record.level, + 'annotation': fst_record.annotation, + 'update_time': fst_record.update_time.isoformat() + } + }), 200 + + except Exception as e: + # 发生错误时回滚 + db.session.rollback() + return jsonify({'error': str(e)}), 500 + + +@label_bp.route('/add-fst', methods=['POST']) +@jwt_required() +def add_fst(): + # 获取请求数据 + data = request.get_json() + + # 验证必要参数 + required_fields = ['name', 'level', 'parentName', 'annotation'] + for field in required_fields: + if field not in data: + return jsonify({'error': f'Missing required field: {field}'}), 400 + + try: + # 根据parentName查询父标签的记录,获取parent_id + parent_record = Fst.query.filter_by(name=data['parentName']).first() + + # 检查父标签是否存在 + if not parent_record: + return jsonify({ + 'error': f'Parent tag not found with name: {data["parentName"]}' + }), 404 + + # 查询当前最大的id值 + max_id_result = db.session.query(func.max(Fst.id)).first() + max_id = max_id_result[0] if max_id_result[0] is not None else 0 + + # 新id为最大id + 1 + new_id = max_id + 1 + + # 创建新的fst记录 + new_fst = Fst( + id=new_id, + name=data['name'], + level=data['level'], + parent_id=parent_record.id, # 使用查询到的父标签ID + annotation=data['annotation'], + update_time=datetime.now() + ) + + # 添加到数据库并提交 + db.session.add(new_fst) + db.session.commit() + + # 返回成功信息 + return jsonify({ + 'message': 'Fst record created successfully', + 'record': { + 'id': new_fst.id, + 'name': new_fst.name, + 'level': new_fst.level, + 'parent_id': new_fst.parent_id, + 'parentName': data['parentName'], + 'annotation': new_fst.annotation, + 'update_time': new_fst.update_time.isoformat() + } + }), 201 + + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 + + + +@label_bp.route("/sync-fst", methods=["POST"]) +def sync_fst(): + # 1. 解析请求参数 + params = request.get_json() or {} + print(f"【请求参数】原始参数: {params}") + + name = params.get("name", "") + parent_name = params.get("parent_name", "") + + # 参数校验 + if not name or not parent_name: + return ( + jsonify( + { + "success": False, + "message": "缺少必要参数(name 或 parent_name)", + } + ), + 400, + ) + + # 2. 转发请求配置 + API_URL = "http://10.0.240.4:5232/api/fst/update" + TIMEOUT = 10 # 超时时间(秒) + data = {"name": name, "parent_name": parent_name} + + try: + # 3. 发送转发请求 + res = requests.post(url=API_URL, json=data, timeout=TIMEOUT) + res.raise_for_status() # 自动抛出 4xx/5xx 状态码的异常 + + # 4. 处理对方 API 的响应(假设返回 JSON 格式) + try: + remote_response = res.json() + except ValueError: + # 对方返回非 JSON 格式响应 + return ( + jsonify( + { + "success": False, + "message": "同步失败:目标接口返回无效格式", + "details": res.text, + } + ), + 500, + ) + + # 5. 返回成功响应 + return jsonify( + { + "success": True, + "message": "同步成功", + "data": remote_response, # 携带对方 API 的返回数据 + } + ) + + except requests.exceptions.RequestException as e: + # 捕获所有 requests 相关异常(超时、连接失败、4xx/5xx 等) + error_msg = f"同步失败:{str(e)}" + print(f"【转发请求错误】{error_msg}") + return ( + jsonify( + { + "success": False, + "message": error_msg, + } + ), + 500, + ) diff --git a/app/blueprints/remote_data/__init__.py b/app/blueprints/remote_data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/remote_data/rotutes.py b/app/blueprints/remote_data/rotutes.py new file mode 100644 index 0000000..2b9e25b --- /dev/null +++ b/app/blueprints/remote_data/rotutes.py @@ -0,0 +1,539 @@ +from datetime import datetime +import re +from flask import Blueprint, current_app, json, request, jsonify +from flask_jwt_extended import jwt_required +import requests +from sqlalchemy import and_, func +from app import db +from app.models import BagFile, Fst +from app.utils.fst_tree import build_tree + + +remote_bp = Blueprint("remote", __name__) + + +def extract_datetime_from_filename(bag_filename): + """ + 从文件名中提取日期和时间。 + 返回包含年月日时分秒的字符串、datetime对象以及视频URL。 + """ + match = re.search(r"_(\d{8})-(\d{6})_", bag_filename) + if not match: + raise ValueError("文件名格式错误,无法提取时间信息") + date_part, time_part = match.groups() + + # 提取年月日时分秒各部分 + year = date_part[:4] + month = date_part[4:6] + day = date_part[6:8] + hour = time_part[:2] + minute = time_part[2:4] + second = time_part[4:6] + + # 年月日时分秒整合到一个变量(字符串格式) + datetime_full = f"{year}-{month}-{day} {hour}:{minute}:{second}" + + # 原有视频路径相关逻辑保持不变 + bag_filename = bag_filename.replace(".bag", "") + video_final_path = f"{bag_filename}- Wide.mp4" + video_cos = f"momenta/videos/{year}/{month}/{day}/{video_final_path}" + video_url = ( + "https://data-miningc01-1318950322.cos.ap-shanghai-adc.myqcloud.com/" + + video_cos + ) + + # 返回整合后的完整日期时间字符串、datetime对象和视频URL + return datetime_full, video_url + + +def get_level1_labels(root_data, target_level1_id, use_label=False): + """ + 收集特定一级标签及其所有子标签的id(或label)为扁平数组 + :param root_data: 原始数据(字典或JSON字符串) + :param target_level1_id: 目标一级标签的id + :param use_label: 若为True则返回label,否则返回id(默认False) + :return: 扁平标签数组(如未找到目标则返回空数组) + """ + # 确保root_data是字典 + if isinstance(root_data, str): + try: + root_data = json.loads(root_data) + except json.JSONDecodeError: + raise ValueError("root_data无法解析为JSON") + if not isinstance(root_data, dict): + raise TypeError("root_data必须是字典或JSON字符串") + + result = [] + key = "label" if use_label else "id" # 选择使用label还是id + + def recursive_collect(node): + """递归收集节点的标签(id或label)""" + if not isinstance(node, dict) or key not in node: + return + # 只添加当前节点的标签(不保留其他字段) + result.append(node[key]) + # 递归处理子节点 + for child in node.get("children", []): + recursive_collect(child) + + # 查找目标一级标签 + target_node = None + for node in root_data.get("children", []): + if ( + isinstance(node, dict) + and node.get("level") == 1 + and node.get("id") == target_level1_id + ): + target_node = node + break + + # 收集目标节点及其所有子标签 + if target_node: + recursive_collect(target_node) + + return result + + +@remote_bp.route("/fstmenu", methods=["GET"]) +def fstmenu(): + # pass + """ + 返回值: + { + path: string + name: string + title: string + component: string + children?: BackendRoute[] + } + + """ + level1_tags = Fst.query.filter(Fst.level == 1).all() + # result = [ + # {"id": tag.id, "name": tag.name, "level": tag.level} for tag in level1_tags + # ] + result = [ + { + "path": tag.name, + "name": tag.name, + "title": tag.name, + "component": "", + } + for tag in level1_tags + ] + return jsonify(result) + + +@remote_bp.route("/fstmenu1", methods=["GET"]) +def fstmenu1(): + # pass + """ + 返回值: + { + path: string + name: string + title: string + component: string + children?: BackendRoute[] + } + + """ + API_URL = "http://10.0.240.4:5232/api/fst/print_tree" + TIMEOUT = 10 # 超时时间(秒) + + try: + response = requests.get(url=API_URL, timeout=TIMEOUT) + # 3. 验证HTTP响应状态 + response.raise_for_status() + level1_results = [] + # 遍历最外层的 children 列表(level=0 的子节点即 level=1) + for node in response.json()[0]["children"]: + # 二次验证 level 是否为 1(避免结构异常) + if node.get("level") == 1: + level1_results.append( + { + "path": node["id"], + "name": node["label"], + "title": node["label"], + "component": "", + } + ) + + for node_park in response.json()[1]["children"]: + # 二次验证 level 是否为 1(避免结构异常) + if node_park.get("level") == 1: + level1_results.append( + { + "path": node_park["id"], + "name": node_park["label"], + "title": node_park["label"], + "component": "", + } + ) + return jsonify(level1_results) + + except Exception as e: + # 其他未捕获异常 + return jsonify({"success": False, "message": f"服务器处理错误:{str(e)}"}) + + +# 根据fst标签返回bag信息----一级标签的所有 +@remote_bp.route("/remote-baglist1", methods=["POST"]) +def query_bag_file_by_fst(): + try: + # 1. 解析核心请求参数(仅保留:分页参数 + Fst 1-4级标签) + params = request.get_json() or {} + print(f"【请求参数】原始参数: {params}") + + # 分页参数(默认第1页,每页20条) + page = params.get("page", 1) + per_page = params.get("per_page", 20) + # Fst 标签参数(1-4级标签,字符串格式ID) + level1_tag = params.get("level1_tag", "").strip() + level2_tag = params.get("level2_tag", "").strip() + level3_tag = params.get("level3_tag", "").strip() + level4_tag = params.get("level4_tag", "").strip() + + # 2. 构建基础查询 + query = BagFile.query + + # 3. 核心过滤:仅保留 Fst 标签筛选条件 + conditions = [] + + # 一级标签过滤(转换为整数ID匹配) + if level1_tag: + try: + conditions.append(BagFile.level1_tag_id == int(level1_tag)) + except ValueError: + print(f"【过滤警告】一级标签ID格式错误: {level1_tag}") + # 二级标签过滤 + if level2_tag: + try: + conditions.append(BagFile.level2_tag_id == int(level2_tag)) + except ValueError: + print(f"【过滤警告】二级标签ID格式错误: {level2_tag}") + # 三级标签过滤 + if level3_tag: + try: + conditions.append(BagFile.level3_tag_id == int(level3_tag)) + except ValueError: + print(f"【过滤警告】三级标签ID格式错误: {level3_tag}") + # 四级标签过滤 + if level4_tag: + try: + conditions.append(BagFile.level4_tag_id == int(level4_tag)) + except ValueError: + print(f"【过滤警告】四级标签ID格式错误: {level4_tag}") + + # 应用标签过滤条件 + if conditions: + query = query.filter(and_(*conditions)) + + # 4. 核心排序:按 bag_update_time 降序(最新更新优先) + query = query.order_by(BagFile.bag_update_time.desc()) + + # 5. 分页查询(页码超出时返回空列表,不报错) + pagination = query.paginate(page=page, per_page=per_page, error_out=False) + total_items = pagination.total # 总数据条数 + total_pages = pagination.pages # 总页数 + + # 6. 数据序列化(仅保留核心字段,包含 Fst 标签信息) + bag_files = [] + for bag in pagination.items: + # 拼接 Fst 标签“中文+英文”名称(提升可读性) + level1_name = f"{bag.level1_tag.name}" if bag.level1_tag else None + level2_name = f"{bag.level2_tag.name}" if bag.level2_tag else None + level3_name = f"{bag.level3_tag.name}" if bag.level3_tag else None + level4_name = f"{bag.level4_tag.name}" if bag.level4_tag else None + + bag_files.append( + { + "id": bag.id, + "file_name": bag.file_name, # BAG文件名 + "capture_datetime": ( + bag.capture_datetime.isoformat() + if bag.capture_datetime + else None + ), # 采集时间 + "bag_update_time": ( + bag.bag_update_time.isoformat() if bag.bag_update_time else None + ), # 排序依据字段 + # Fst 标签核心信息 + "level1_tag_id": bag.level1_tag_id, + "level1_tag_name": level1_name, + "level2_tag_id": bag.level2_tag_id, + "level2_tag_name": level2_name, + "level3_tag_id": bag.level3_tag_id, + "level3_tag_name": level3_name, + "level4_tag_id": bag.level4_tag_id, + "level4_tag_name": level4_name, + # 基础状态字段(按需保留,非核心可删除) + "status": bag.status.name if bag.status else None, + "bag_status": bag.bag_status, + "comment": bag.comment1, + "front_starttime": bag.front_start_sec, + "front_endtime": bag.front_end_sec, + "case_type": "简单场景" if bag.case_type == 1 else "复杂场景", + "highway": "高速" if bag.high_speed == 1 else None, + "city": "城区" if bag.urban == 1 else None, + "driving": "parking" if bag.urban else "driving", + "video_url": bag.video_url, + } + ) + + # 7. 返回精简响应 + return jsonify( + { + "code": 200, + "data": bag_files, + "total": total_items, + "page": page, + "pages": total_pages, + "message": "根据 Fst 标签查询成功", + } + ) + + except Exception as e: + # 异常捕获与响应 + error_msg = f"查询出错:{str(e)}" + print(f"【接口异常】{error_msg}") + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page if "page" in locals() else 1, + "pages": 0, + "message": error_msg, + } + ), + 500, + ) + + +@remote_bp.route("/remote-baglist", methods=["POST"]) +def query_bag_file_by_fst1(): + # 1. 解析核心请求参数(仅保留:分页参数 + Fst 1-4级标签) + params = request.get_json() or {} + print(f"【请求参数】原始参数: {params}") + + # 分页参数(默认第1页,每页20条) + page = params.get("page", 1) + per_page = params.get("per_page", 20) + # Fst 标签参数(1-4级标签,字符串格式ID) + fst_tag_list = params.get("fst_tag", "") + print(f"【请求参数】Fst 标签列表: {fst_tag_list}") + + # 获取过滤的参数 + filter_fst = params.get("filter_fst", []) + + # 把请求到的数据进行处理 + API_LEVEL1_URL = "http://10.0.240.4:5232/api/fst/print_tree" + API_NODES_URL = "http://10.0.240.4:5232/api/fst/bags/nodes" + + API_OTHER_INFO_URL = "http://10.0.240.4:5232/api/bags/fst/nodes" + TIMEOUT = 10 # 超时时间(秒) + + try: + # 如果filter_fst为空,说明为一级标签 + if len(filter_fst) == 0: + response = requests.get(url=API_LEVEL1_URL, timeout=TIMEOUT) + # print(123,response.json()) + # 3. 验证HTTP响应状态 + response.raise_for_status() + # 遍历最外层的 children 列表(level=0 的子节点即 level=1) + driving_tree = response.json()[0] + park_tree = response.json()[1] + # 获取所有的一级标签的子标签,组成一个新的列表 + driving_fst_list = get_level1_labels(driving_tree, fst_tag_list) + park_fst_list = get_level1_labels(park_tree, fst_tag_list) + + if len(driving_fst_list)>0: + fst_list=driving_fst_list + + if len(park_fst_list)>0: + fst_list=park_fst_list + + # print(555,fst_list) + filter_fst = fst_list + + # 查询所有的标签 + query_params = {"page": page, "per_page": per_page} # 页码 # 每页条数 + # bag_files = [] + + if filter_fst: + res_bags = requests.post( + url=API_NODES_URL, + params=query_params, # URL查询参数(自动拼接为 ?page=1&per_page=20) + json=filter_fst, # JSON请求体(自动设置Content-Type头) + timeout=TIMEOUT, # 超时时间(秒) + ) + + # 对查询到结果,循环进行查询 + all_bag_list = res_bags.json()["items"] + total_nums = res_bags.json()["total"] + + # 获取所有的bag_name,组成一个列表 + bag_name_list = [] + for item in all_bag_list: + bag_name = item.get("bag_name") + if bag_name: + bag_name_list.append(bag_name) + + # 查询所有的bagname的列表数据,返回的数据是字典中对应的列表 + bag_other_info_list = requests.post(url=API_OTHER_INFO_URL, json=bag_name_list) + + # 组装数据 + res_list=[] + for row in all_bag_list: + bag_name = row.get("bag_name") + if bag_name: + record={} + record["file_name"]=bag_name + record["level1_tag_name"] = fst_tag_list + record["sub_tag_name"] = row.get('sts') + + # 过滤值 + bag_other_detail=bag_other_info_list.json()[bag_name] + if len(bag_other_detail)==0: + record["comment"] = "" + record["highway"] = "" + record["city"] = "" + record["driving"] = "" + record["front_starttime"] = "" + record["front_endtime"] = "" + if len(bag_other_detail)==1: + record["comment"] = bag_other_detail[0]["comments"] + record["highway"] = "" + record["city"] = "" + record["driving"] = "" + record["front_starttime"] = bag_other_detail[0]["start"] + record["front_endtime"] = bag_other_detail[0]["end"] + if len(bag_other_detail)>1: + # 循环bag_other_detail的值,当row.get('sts')等于某项的name时。 + for info in bag_other_detail: + if info['name']==row.get('sts'): + record["comment"] = info['comments'] + record["highway"] = "" + record["city"] = "" + record["driving"] = "" + record["front_starttime"] = info['start'] + record["front_endtime"] = info['end'] + else: + record["comment"] = "" + record["highway"] = "" + record["city"] = "" + record["driving"] = "" + record["front_starttime"] = "" + record["front_endtime"] = "" + + datetime_full, video_url = extract_datetime_from_filename(bag_name) + record["video_url"] = video_url + record["capture_datetime"] = datetime_full + + res_list.append(record) + + # 7. 返回精简响应 + return jsonify( + { + "code": 200, + "data": res_list, + "total": total_nums, + "page": page, + "pages": page, + "message": "根据 Fst 标签查询成功", + } + ) + + else: + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page if "page" in locals() else 1, + "pages": 0, + "message": "标签数据出错", + } + ), + 500, + ) + except Exception as e: + # 异常捕获与响应 + error_msg = f"查询出错:{str(e)}" + print(f"【接口异常】{error_msg}") + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page if "page" in locals() else 1, + "pages": 0, + "message": error_msg, + } + ), + 500, + ) + + +@remote_bp.route("/sub-fst", methods=["GET"]) +def get_sub_fst1(): + target_label = request.args.get("fst_id") + + API_URL = "http://10.0.240.4:5232/api/fst/print_tree" + TIMEOUT = 10 # 超时时间(秒) + + try: + response = requests.get(url=API_URL, timeout=TIMEOUT) + # 3. 验证HTTP响应状态 + response.raise_for_status() + # 遍历最外层的 children 列表(level=0 的子节点即 level=1) + + result=[] + for node in response.json()[0].get("children", []): + if node.get("level") == 1 and node.get("label") == target_label: + data = node.get("children", []) + if data: + result=data + + for node_park in response.json()[1].get("children", []): + if node_park.get("level") == 1 and node_park.get("label") == target_label: + data_park = node_park.get("children", []) + if data_park: + result=data_park + + return jsonify({"code": 200, "data": result}) # 返回该节点的children + + + return ( + jsonify({"code": 404, "message": "Fst not found"}), + 404, + ) # 未找到匹配节点时返回None + except Exception as e: + return jsonify({"success": False, "message": f"服务器处理错误:{str(e)}"}) + + +@remote_bp.route("/all-fst", methods=["GET"]) +def get_all_fst1(): + type = request.args.get("type") + + API_URL = "http://10.0.240.4:5232/api/fst/print_tree" + TIMEOUT = 10 # 超时时间(秒) + + try: + response = requests.get(url=API_URL, timeout=TIMEOUT) + # 3. 验证HTTP响应状态 + response.raise_for_status() + if type == "driving": + return jsonify({"code": 200, "data": response.json()[0]}) + + if type == "parking": + return jsonify({"code": 200, "data": response.json()[1]}) + except Exception as e: + return jsonify({"success": False, "message": f"服务器处理错误:{str(e)}"}) + + + diff --git a/app/blueprints/vlm/__init__.py b/app/blueprints/vlm/__init__.py new file mode 100644 index 0000000..5caddcd --- /dev/null +++ b/app/blueprints/vlm/__init__.py @@ -0,0 +1,5 @@ +# from flask import Blueprint + +# auth_bp = Blueprint('auth', __name__) + +# from . import routes \ No newline at end of file diff --git a/app/blueprints/vlm/rotutes.py b/app/blueprints/vlm/rotutes.py new file mode 100644 index 0000000..6ce8450 --- /dev/null +++ b/app/blueprints/vlm/rotutes.py @@ -0,0 +1,885 @@ +from datetime import datetime +from functools import lru_cache +import os +import re +import time +import uuid +from flask import Blueprint, current_app, json, request, jsonify +from flask_jwt_extended import get_jwt_identity, jwt_required +import requests +from sqlalchemy import and_, func +from app import db +from app.models import BagFile, BagStatus, Fst, User, VlmFilter +from app import create_app +from app.utils.get_vlm_token import Demo +from app.utils.driving_tree import vlm_data + +vlm_bp = Blueprint("vlm", __name__) + + +def extract_datetime_from_filename(bag_filename): + """ + 从文件名中提取日期和时间。 + 返回包含年月日时分秒的字符串、datetime对象以及视频URL。 + """ + match = re.search(r"_(\d{8})-(\d{6})_", bag_filename) + if not match: + raise ValueError("文件名格式错误,无法提取时间信息") + date_part, time_part = match.groups() + + # 提取年月日时分秒各部分 + year = date_part[:4] + month = date_part[4:6] + day = date_part[6:8] + hour = time_part[:2] + minute = time_part[2:4] + second = time_part[4:6] + + # 年月日时分秒整合到一个变量(字符串格式) + datetime_full = f"{year}-{month}-{day} {hour}:{minute}:{second}" + + # 原有视频路径相关逻辑保持不变 + bag_filename = bag_filename.replace(".bag", "") + video_final_path = f"{bag_filename}- Wide.mp4" + video_cos = f"momenta/videos/{year}/{month}/{day}/{video_final_path}" + video_url = ( + "https://data-miningc01-1318950322.cos.ap-shanghai-adc.myqcloud.com/" + + video_cos + ) + + # 返回整合后的完整日期时间字符串、datetime对象和视频URL + return datetime_full, video_url + + +@lru_cache(maxsize=1) +def get_cached_token(): + TOKEN_EXPIRE_SECONDS = 7200 + """获取缓存的Token,如果过期则重新获取(固定有效期)""" + # 获取Token时记录当前时间(作为获取时间) + token_info = Demo().getAuthToken() + token_info["fetch_time"] = time.time() # 手动添加获取时间 + + # 检查是否过期(当前时间 - 获取时间 > 有效期) + if time.time() - token_info["fetch_time"] >= TOKEN_EXPIRE_SECONDS - 60: + # 提前60秒刷新 + get_cached_token.cache_clear() + new_token = Demo().getAuthToken() + new_token["fetch_time"] = time.time() # 记录新的获取时间 + return new_token + return token_info + + +@vlm_bp.route("/insert-csv", methods=["POST"]) +@jwt_required() +def insert_db_by_csv(): + try: + # 1. 获取上传的CSV文件 + if "file" not in request.files: + return jsonify({"code": 400, "message": "未上传CSV文件"}), 400 + + file = request.files["file"] + if file.filename == "": + return jsonify({"code": 400, "message": "未选择文件"}), 400 + + # 验证文件类型 + if not file.filename.endswith(".csv"): + return jsonify({"code": 400, "message": "仅支持CSV格式文件"}), 400 + + # 2. 直接从form中获取表单字段(无需解析JSON) + # 验证必要的表单参数 + required_fields = ["level1Tag", "status"] + form_params = {} + for field in required_fields: + value = request.form.get(field) + if not value: + return ( + jsonify({"code": 400, "message": f"缺少必要的表单参数: {field}"}), + 400, + ) + form_params[field] = value + + # 额外获取可选的表单字段 + form_params["radioGroup"] = request.form.get("radioGroup", "") + form_params["fileKey"] = request.form.get("fileKey", "") + + # 转换level1Tag为整数 + try: + level1_tag = int(form_params["level1Tag"]) + except ValueError: + return jsonify({"code": 400, "message": "level1Tag必须是整数"}), 400 + + # 验证status是否有效 + status_str = form_params["status"] + try: + status = BagStatus[status_str] # 假设使用枚举类 + except KeyError: + return ( + jsonify({"code": 400, "message": f"无效的status值: {status_str}"}), + 400, + ) + + # 替换bag_status + if form_params["radioGroup"] == "annotation": + bag_status = 0 + if form_params["radioGroup"] == "qa": + bag_status = 1 + + # 插入fst_version字段 + # 获取当前时间 + current_time = datetime.now() + + # 格式化年月日时,用下划线连接 + formatted_time = f"{current_time.year}-{current_time.month:02d}-{current_time.day:02d}-{current_time.hour:02d}" + fst_version = "vlm_" + get_jwt_identity() + "_" + formatted_time + + # 3. 解析CSV文件内容 + import csv + from io import StringIO + + # from datetime import datetime + + # 读取CSV内容 + csv_content = file.stream.read().decode("utf-8") + csv_file = StringIO(csv_content) + csv_reader = csv.DictReader(csv_file) + + # 验证CSV表头 + if "bag_name" not in csv_reader.fieldnames: + return ( + jsonify({"code": 400, "message": "CSV文件缺少必要的'bag_name'列"}), + 400, + ) + + # 4. 组合CSV数据与表单数据,插入数据库 + inserted_count = 0 + skipped_count = 0 + error_records = [] + + for row_num, row in enumerate( + csv_reader, start=2 + ): # 行号从2开始(表头为第1行) + bag_name = row.get("bag_name", "").strip() + + if not bag_name: + skipped_count += 1 + error_records.append( + {"row": row_num, "reason": "bag_name为空", "content": row} + ) + continue + + # 从文件名提取时间和视频URL(复用你的函数) + datetime_full, video_url = extract_datetime_from_filename(bag_name) + + # 组合数据:CSV的bag_name + 表单的level1Tag、status等 + new_bag = BagFile( + file_name=bag_name, + level1_tag_id=level1_tag, # 表单字段 + status=status, # 表单字段 + capture_datetime=datetime_full, + create_time=datetime.now(), + update_time=datetime.now(), + bag_status=bag_status, + sync_status="SYNC_NOT_READY", + user_id=get_jwt_identity(), # 当前用户ID + video_url=video_url, + fst_version=fst_version, + ) + + db.session.add(new_bag) + inserted_count += 1 + + # 提交事务 + db.session.commit() + + # 5. 返回处理结果 + return jsonify( + { + "code": 200, + "message": f"处理完成,成功插入 {inserted_count} 条记录,跳过 {skipped_count} 条记录", + "data": { + "inserted_count": inserted_count, + "skipped_count": skipped_count, + "errors": error_records if skipped_count > 0 else None, + }, + } + ) + + except Exception as e: + db.session.rollback() + print(f"【上传CSV接口异常】: {str(e)}") + return jsonify({"code": 500, "message": f"处理失败:{str(e)}"}), 500 + + +@vlm_bp.route("/get-models", methods=["GET"]) +def get_models(): + result = { + "code": 200, + "data": [ + { + "id": 3, + "name": "图片模型Base", + "url": "http://10.0.220.110:20080", + "type": 0, + "remark": "没有finetune的初始模型\nhttp://10.0.220.110:20080", + "createUserId": 3, + "status": 1, + "createdAt": "2024-11-21T07:36:34.337Z", + "updatedAt": "2025-04-10T08:00:03.727Z", + }, + { + "id": 4, + "name": "图片模型FT4", + "url": "http://10.0.220.226:20081", + "type": 0, + "remark": "第4轮微调模型\nhttp://10.0.220.226:20081", + "createUserId": 3, + "status": 1, + "createdAt": "2025-04-25T07:22:06.986Z", + "updatedAt": "2025-05-09T07:00:22.667Z", + }, + ], + "success": True, + "message": "success", + } + # token = get_cached_token() + # API_URL = "http://10.0.220.110/api/app/model/models-server?modelType=0" + # headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} + # response = requests.get(url=API_URL, headers=headers) + # result = response.json() + return jsonify({"code": 200, "data": result}) + + +@vlm_bp.route("/get-datasets", methods=["GET"]) +def get_datasets(): + # result = { + # "code": 200, + # "data": [ + # { + # "id": 99, + # "name": "Momenta", + # "path": None, + # "type": 0, + # "status": 3, + # "remark": "这是数据集", + # "index_name": "0_33f0ba5e-d00d-4033-b2d4-3a491a347f25", + # "create_user_id": None, + # "is_delete": 0, + # "createdAt": "2025-04-25T09:10:33.072Z", + # "updatedAt": "2025-05-19T15:03:33.366Z", + # "file_count": None, + # }, + # { + # "id": 107, + # "name": "MB", + # "path": None, + # "type": 0, + # "status": 3, + # "remark": "这是数据集", + # "index_name": "0_abcb005e-6782-4b91-877e-4b1cebcf52e7", + # "create_user_id": None, + # "is_delete": 0, + # "createdAt": "2025-05-15T09:49:23.056Z", + # "updatedAt": "2025-05-19T11:35:21.063Z", + # "file_count": None, + # }, + # { + # "id": 124, + # "name": "MB_DC_2508", + # "path": None, + # "type": 0, + # "status": 3, + # "remark": "这是数据集", + # "index_name": "0_35caf344-a572-40d1-bc31-e426b785eaa2", + # "create_user_id": None, + # "is_delete": 0, + # "createdAt": "2025-08-29T01:30:34.199Z", + # "updatedAt": "2025-09-12T07:45:58.658Z", + # "file_count": None, + # }, + # { + # "id": 125, + # "name": "MB_DC_2504_06", + # "path": None, + # "type": 0, + # "status": 3, + # "remark": "这是数据集", + # "index_name": "0_46805e78-738e-439d-9b65-2b5a9cdd5ee5", + # "create_user_id": None, + # "is_delete": 0, + # "createdAt": "2025-09-04T09:54:12.411Z", + # "updatedAt": "2025-09-11T19:37:03.399Z", + # "file_count": None, + # }, + # { + # "id": 126, + # "name": "MB_DC_2507", + # "path": None, + # "type": 0, + # "status": 3, + # "remark": "这是数据集", + # "index_name": "0_14b37c68-cf81-4c5b-b232-43323c7501e7", + # "create_user_id": None, + # "is_delete": 0, + # "createdAt": "2025-09-11T01:47:57.010Z", + # "updatedAt": "2025-09-12T03:45:47.002Z", + # "file_count": None, + # }, + # ], + # "success": True, + # "message": "success", + # } + token = get_cached_token() + API_URL = "http://10.0.220.110/api/app/model/datasets-list?modelId=4" + headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} + response = requests.get(url=API_URL, headers=headers) + result = response.json() + return jsonify({"code": 200, "data": result}) + + +@vlm_bp.route("/get-search", methods=["POST"]) +def get_search_list(): + # result = vlm_data + API_URL = "http://10.0.220.110/api/app/search/4" + data = request.json + result = requests.post(url=API_URL, json=data) + result=result.json() + return jsonify({"code": 200, "data": result}) + + +@vlm_bp.route("/get-alltags", methods=["GET"]) +def get_alltags(): + try: + # 查询所有标签 + all_tags = Fst.query.all() + + # 转换为所需的结构 + result = [] + for tag in all_tags: + tag_data = { + "id": tag.id, + "name": tag.name, + "level": tag.level, + "parent_id": tag.parent_id, + } + result.append(tag_data) + + # 返回JSON响应 + return jsonify(result), 200 + + except Exception as e: + # 错误处理 + return jsonify({"error": str(e)}), 500 + + +@vlm_bp.route("/insert-vlm-filter", methods=["POST"]) +@jwt_required() +def add_vlm_filter(): + """ + 新增VlmFilter记录 + 请求参数: + { + "level1": { + "id": 407, + "name": "TOLL_STATION", + "level": 1 + }, + "level2": { + "id": 616, + "name": "TOLL_STATION_LEAVE", + "level": 2 + }, + "level3": { + "id": 579, + "name": "TOLL_STATION_LEAVE_PASSING_NO_LANE_MARKING_SQUARE_AFTER_ROD", + "level": 3 + }, + "level4": null, + "bagname": "PL162802_event_hmi_console_event_20250827-182132_0.bag", + "comment": "12345", + "status": 0, + "video_url":"", + } + """ + try: + # 1. 获取当前用户ID(从JWT中提取) + current_user_id = get_jwt_identity() + + # 2. 解析请求参数 + params = request.json + + # 3. 验证必要参数 + required_fields = ["level1", "level2", "level3", "bagname", "status"] + if not all(key in params for key in required_fields): + return ( + jsonify( + { + "code": 400, + "message": f"缺少必要参数: {', '.join(required_fields)}", + } + ), + 400, + ) + + # 4. 提取参数值 + level1 = params["level1"] + level2 = params["level2"] + level3 = params["level3"] + level4 = params.get("level4") + bagname = params["bagname"] + comment = params.get("comment", "") + status = params["status"] + video_url = params["video_url"] + + # 5. 提取各级标签ID + level1_tag_id = level1.get("id") if level1 else None + level2_tag_id = level2.get("id") if level2 else None + level3_tag_id = level3.get("id") if level3 else None + level4_tag_id = level4.get("id") if level4 else None + + # 6. 验证标签层级关系和存在性 + # 验证一级标签 + if level1_tag_id is not None: + level1_tag = Fst.query.get(level1_tag_id) + if not level1_tag: + return ( + jsonify( + { + "code": 400, + "message": f"一级标签不存在(ID: {level1_tag_id})", + } + ), + 400, + ) + + # 验证二级标签 + if level2_tag_id is not None: + level2_tag = Fst.query.get(level2_tag_id) + if not level2_tag: + return ( + jsonify( + { + "code": 400, + "message": f"二级标签不存在(ID: {level2_tag_id})", + } + ), + 400, + ) + + if not level1_tag_id: + return ( + jsonify( + {"code": 400, "message": "二级标签存在时,一级标签不能为空"} + ), + 400, + ) + + if level2_tag.parent_id != level1_tag_id: + return ( + jsonify( + { + "code": 400, + "message": f"二级标签的父级ID({level2_tag.parent_id})与一级标签ID({level1_tag_id})不匹配", + } + ), + 400, + ) + + # 验证三级标签 + if level3_tag_id is not None: + level3_tag = Fst.query.get(level3_tag_id) + if not level3_tag: + return ( + jsonify( + { + "code": 400, + "message": f"三级标签不存在(ID: {level3_tag_id})", + } + ), + 400, + ) + + if not level2_tag_id: + return ( + jsonify( + {"code": 400, "message": "三级标签存在时,二级标签不能为空"} + ), + 400, + ) + + if level3_tag.parent_id != level2_tag_id: + return ( + jsonify( + { + "code": 400, + "message": f"三级标签的父级ID({level3_tag.parent_id})与二级标签ID({level2_tag_id})不匹配", + } + ), + 400, + ) + + # 验证四级标签 + if level4_tag_id is not None: + level4_tag = Fst.query.get(level4_tag_id) + if not level4_tag: + return ( + jsonify( + { + "code": 400, + "message": f"四级标签不存在(ID: {level4_tag_id})", + } + ), + 400, + ) + + if not level3_tag_id: + return ( + jsonify( + {"code": 400, "message": "四级标签存在时,三级标签不能为空"} + ), + 400, + ) + + if level4_tag.parent_id != level3_tag_id: + return ( + jsonify( + { + "code": 400, + "message": f"四级标签的父级ID({level4_tag.parent_id})与三级标签ID({level3_tag_id})不匹配", + } + ), + 400, + ) + + # 7. 创建新的VlmFilter记录 + new_vlm = VlmFilter( + bag_name=bagname, + level1_tag_id=level1_tag_id, + level2_tag_id=level2_tag_id, + level3_tag_id=level3_tag_id, + level4_tag_id=level4_tag_id, + comment=comment, + user_id=current_user_id, + # collection_time=datetime.now(), + create_time=datetime.now(), + status=status, + video_url=video_url, + ) + + # 8. 添加到数据库并提交 + db.session.add(new_vlm) + db.session.commit() + + # 9. 返回成功响应 + return ( + jsonify( + { + "code": 200, + "message": "数据插入成功", + "data": { + "id": new_vlm.id, + "bag_name": new_vlm.bag_name, + "level1_tag_id": new_vlm.level1_tag_id, + "level2_tag_id": new_vlm.level2_tag_id, + "level3_tag_id": new_vlm.level3_tag_id, + "level4_tag_id": new_vlm.level4_tag_id, + "user_id": new_vlm.user_id, + "create_time": new_vlm.create_time.strftime( + "%Y-%m-%d %H:%M:%S" + ), + "status": new_vlm.status, + }, + } + ), + 200, + ) + + except Exception as e: + db.session.rollback() + return jsonify({"code": 500, "message": f"服务器错误: {str(e)}"}), 500 + + +@vlm_bp.route("/get-vlm-filter-list", methods=["POST"]) +@jwt_required() +def get_vlm_filter_list(): + try: + # 1. 解析请求参数 + params = request.get_json() or {} + + # 提取分页参数,设置默认值 + page = params.get("page", 1) + per_page = params.get("per_page", 20) + + # 提取过滤参数 + bag_name = params.get("bag_name", "").strip() + level1_tag = params.get("level1_tag", "") + start_datetime = params.get("start_datetime", "").strip() + end_datetime = params.get("end_datetime", "").strip() + user_id = params.get("user_id") + + # 2. 构建基础查询 + query = VlmFilter.query + + # 3. 动态添加过滤条件 + conditions = [] + + # 固定条件:只展示status=0的数据(核心新增) + conditions.append(VlmFilter.status == 0) + + # 袋名模糊查询 + if bag_name: + conditions.append(VlmFilter.bag_name.like(f"%{bag_name}%")) + + # 一级标签查询 + if level1_tag: + try: + level1_id = int(level1_tag) + conditions.append(VlmFilter.level1_tag_id == level1_id) + except ValueError: + print(f"【过滤条件】level1_tag转换失败(非整数): {level1_tag}") + + # 用户ID过滤 + if user_id: + try: + user_id_int = int(user_id) + conditions.append(VlmFilter.user_id == user_id_int) + except ValueError: + print(f"【过滤条件】user_id转换失败(非整数): {user_id}") + + # 时间范围查询(按create_time) + if start_datetime: + try: + start_dt = datetime.fromisoformat(start_datetime) + conditions.append(VlmFilter.create_time >= start_dt) + except ValueError: + print(f"【过滤条件】开始时间格式错误: {start_datetime}") + + if end_datetime: + try: + end_dt = datetime.fromisoformat(end_datetime) + conditions.append(VlmFilter.create_time <= end_dt) + except ValueError: + print(f"【过滤条件】结束时间格式错误: {end_datetime}") + + # 应用所有条件(包含固定的status=0) + if conditions: + query = query.filter(and_(*conditions)) + + # 4. 排序:按create_time降序 + query = query.order_by(VlmFilter.create_time.desc()) + + # 5. 分页查询 + pagination = query.paginate(page=page, per_page=per_page, error_out=False) + total_items = pagination.total + total_pages = pagination.pages + + # 6. 序列化结果 + result_list = [] + for item in pagination.items: + # 获取标签名称 + level1_name = ( + Fst.query.get(item.level1_tag_id).name if item.level1_tag_id else None + ) + level2_name = ( + Fst.query.get(item.level2_tag_id).name if item.level2_tag_id else None + ) + level3_name = ( + Fst.query.get(item.level3_tag_id).name if item.level3_tag_id else None + ) + level4_name = ( + Fst.query.get(item.level4_tag_id).name if item.level4_tag_id else None + ) + + # 获取用户名 + username = User.query.get(item.user_id).username if item.user_id else None + + result_list.append( + { + "id": item.id, + "bag_name": item.bag_name, + "level1_tag_id": item.level1_tag_id, + "level1_tag_name": level1_name, + "level2_tag_id": item.level2_tag_id, + "level2_tag_name": level2_name, + "level3_tag_id": item.level3_tag_id, + "level3_tag_name": level3_name, + "level4_tag_id": item.level4_tag_id, + "level4_tag_name": level4_name, + "video_url": item.video_url, + "comment": item.comment, + "user_id": item.user_id, + "username": username, + "collection_time": ( + item.collection_time.isoformat() + if item.collection_time + else None + ), + "create_time": ( + item.create_time.isoformat() if item.create_time else None + ), + "init_label": item.init_label, + "status": item.status, # 此处返回的status始终为0 + } + ) + + # 7. 返回响应 + return jsonify( + { + "code": 200, + "data": result_list, + "total": total_items, + "page": page, + "pages": total_pages, + "message": "查询成功(仅返回status=0的数据)", + } + ) + + except Exception as e: + print(f"【接口异常】: {str(e)}") + return ( + jsonify( + { + "code": 500, + "data": [], + "total": 0, + "page": page if "page" in locals() else 1, + "pages": 0, + "message": f"查询出错:{str(e)}", + } + ), + 500, + ) + + +@vlm_bp.route("/send-loacldb", methods=["POST"]) +@jwt_required() +def send_filter_vlm_localdb(): + try: + # 1. 解析请求参数 + params = request.get_json() or {} + + # 验证必要参数 + if "data" not in params or not isinstance(params["data"], list): + return ( + jsonify({"code": 400, "message": "缺少必要参数data或data不是数组"}), + 400, + ) + + if "add_status" not in params: + return jsonify({"code": 400, "message": "缺少必要参数add_status"}), 400 + + # 提取参数 + data_list = params["data"] + add_status = params["add_status"] + label_status = params["label_status"] + + # 验证add_status是否为整数 + try: + add_status = int(add_status) + except ValueError: + return jsonify({"code": 400, "message": "add_status必须是整数"}), 400 + + # 初始化统计变量 + inserted_count = 0 + updated_count = 0 + error_records = [] + + # 获取当前用户ID + current_user_id = get_jwt_identity() + current_time = datetime.now() + # 获取当前时间 + current_time = datetime.now() + # 格式化年月日时,用下划线连接 + formatted_time = f"{current_time.year}-{current_time.month:02d}-{current_time.day:02d}-{current_time.hour:02d}" + fst_version = "send_" + get_jwt_identity() + "_" + formatted_time + + # 2. 循环处理每条数据 + for idx, item in enumerate(data_list): + try: + # print("item",item) + # 验证必要字段 + if "bag_name" not in item or not item["bag_name"]: + error_records.append( + { + "index": idx, + "reason": "缺少bag_name或bag_name为空", + "data": item, + } + ) + continue + + bag_name=item["bag_name"] + datetime_full, video_url = extract_datetime_from_filename(bag_name) + + # 创建新的BagFile记录 + new_bag = BagFile( + file_name=bag_name, + capture_datetime=datetime_full, + level1_tag_id=item.get("level1_tag_id"), + level2_tag_id=item.get("level2_tag_id"), + level3_tag_id=item.get("level3_tag_id"), + level4_tag_id=item.get("level4_tag_id"), + video_url=item.get("video_url"), + comment1=item.get("comment"), + user_id=item.get("user_id") or current_user_id, + create_time=( + datetime.fromisoformat(item["create_time"]) + if item.get("create_time") + else current_time + ), + update_time=current_time, + fst_version=fst_version, + bag_status=add_status, # 0是标注,1是质检 + sync_status="SYNC_NOT_READY", + status=BagStatus[label_status], + ) + + print("new_bag", new_bag) + + # 添加到会话 + db.session.add(new_bag) + inserted_count += 1 + + # 3. 更新vlm_filter表 + # 假设根据bag_name和id进行匹配 + vlm_filter = VlmFilter.query.filter_by( + id=item.get("id"), bag_name=item["bag_name"] + ).first() + + if vlm_filter: + vlm_filter.status = 1 # 1是入库 + vlm_filter.init_label = add_status # 0是标注,1是质检 + updated_count += 1 + else: + error_records.append( + { + "index": idx, + "reason": f"未找到对应的vlm_filter记录 (id: {item.get('id')}, bag_name: {item['bag_name']})", + "data": item, + } + ) + except Exception as e: + error_records.append( + {"index": idx, "reason": f"处理错误: {str(e)}", "data": item} + ) + + # 4. 提交事务 + db.session.commit() + + # 5. 返回结果 + return jsonify( + { + "code": 200, + "message": f"批量处理完成,成功插入 {inserted_count} 条记录,{len(error_records)} 条记录处理失败", + "data": { + "inserted_count": inserted_count, + "updated_count": updated_count, + "error_count": len(error_records), + "errors": error_records if error_records else None, + }, + } + ) + + except Exception as e: + db.session.rollback() + print(f"【批量插入接口异常】: {str(e)}") + return jsonify({"code": 500, "message": f"处理失败:{str(e)}"}), 500 diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..06ebb17 --- /dev/null +++ b/app/config.py @@ -0,0 +1,76 @@ +import os + +class Config: + SECRET_KEY = os.environ.get('SECRET_KEY', 'your-secret-key-here') + SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', 'mysql+pymysql://mb:mb12345@150.158.121.95:3306/rulebase?charset=utf8mb4') + SQLALCHEMY_TRACK_MODIFICATIONS = False # 关闭警告 + + + JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY', 'bag_tag') + JWT_ACCESS_TOKEN_EXPIRES = 7200 # 1小时 + + MONGO_URI = os.environ.get('MONGO_URI', 'mongodb://localhost:27017/vlm') + + +# 基础配置 +class BaseConfig: + DEBUG = False + TESTING = False + SECRET_KEY = os.environ.get('SECRET_KEY', 'default-secret-key') + + # 日志配置 + LOG_LEVEL = 'INFO' + LOG_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs') + LOG_FILE_MAX_BYTES = 1024 * 1024 * 10 # 10MB + LOG_FILE_BACKUP_COUNT = 10 + + # MySQL 配置 + SQLALCHEMY_DATABASE_URI = os.environ.get( + 'DATABASE_URL', + 'mysql+pymysql://mb:mb12345@150.158.121.95:3306/rulebase?charset=utf8mb4' + # 'mysql+pymysql://root:mb12345@10.0.220.217:3306/rulebase1?charset=utf8mb4' + # 'mysql+pymysql://root:mb12345@10.204.22.142:3306/rulebase?charset=utf8mb4' + ) + SQLALCHEMY_TRACK_MODIFICATIONS = False + + # MongoDB 配置 + MONGO_URI = os.environ.get('MONGO_URI', 'mongodb://150.158.121.95:27017/vlm') + + JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY', 'bag_tag') + JWT_ACCESS_TOKEN_EXPIRES = 14400 # 4小时 + + +# 开发环境配置 +class DevelopmentConfig(BaseConfig): + DEBUG = True + LOG_LEVEL = 'INFO' + +# 生产环境配置 +class ProductionConfig(BaseConfig): + # 生产环境从环境变量获取所有敏感信息 + # 生产环境专用配置 + # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:mb12345@10.0.220.217:3306/rulebase?charset=utf8mb4' + # MONGO_URI = 'mongodb://localhost:27017/vlm' + + # # 可添加生产环境特有配置 + # SESSION_COOKIE_SECURE = True # 启用安全Cookie + # PERMANENT_SESSION_LIFETIME = 3600 # 会话有效期1小时 + pass + +# 测试环境配置 +class TestingConfig(BaseConfig): + TESTING = True + SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' + MONGODB_SETTINGS = { + 'db': 'test_database', + 'host': 'localhost', + 'port': 27017, + } + +# 配置映射 +config_map = { + 'development': DevelopmentConfig, + # 'production': ProductionConfig, + 'testing': TestingConfig, + 'default': DevelopmentConfig +} \ No newline at end of file diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..5a5f8ba --- /dev/null +++ b/app/models.py @@ -0,0 +1,514 @@ +from datetime import datetime +import enum + +from sqlalchemy import JSON, DateTime, Enum, ForeignKey, Index, func +from app import db + + +class User(db.Model): + __tablename__ = "users" + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + username = db.Column(db.String(50), unique=True, nullable=False) + password = db.Column(db.String(255), nullable=False) + status = db.Column(db.Integer, default=1, comment="用户状态:1-正常,0-禁用") + created_at = db.Column(db.DateTime, default=datetime.now, comment="创建时间") + updated_at = db.Column( + db.DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间" + ) + + # 自引用外键 + created_by = db.Column(db.Integer, db.ForeignKey("users.id")) + updated_by = db.Column(db.Integer, db.ForeignKey("users.id")) + + # 关系定义 + creator = db.relationship( + "User", foreign_keys=[created_by], remote_side=[id], backref="created_users" + ) + updater = db.relationship( + "User", foreign_keys=[updated_by], remote_side=[id], backref="updated_users" + ) + + # 关联关系 + roles = db.relationship( + "Role", + secondary="user_roles", + back_populates="users", + foreign_keys="[UserRole.user_id, UserRole.role_id]", + ) # 明确指定外键) + created_roles = db.relationship( + "Role", backref="creator", foreign_keys="Role.created_by" + ) + updated_roles = db.relationship( + "Role", backref="updater", foreign_keys="Role.updated_by" + ) + + def __repr__(self): + return f"" + + +class Role(db.Model): + __tablename__ = "roles" + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + name = db.Column(db.String(50), unique=True, nullable=False, comment="角色名称") + description = db.Column(db.String(255), comment="角色描述") + status = db.Column(db.Integer, default=1, comment="状态:1-启用,0-禁用") + created_at = db.Column(db.DateTime, default=datetime.now) + updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) + + # 外键字段 + created_by = db.Column(db.Integer, db.ForeignKey("users.id")) + updated_by = db.Column(db.Integer, db.ForeignKey("users.id")) + + # 关系定义 + users = db.relationship( + "User", + secondary="user_roles", + back_populates="roles", + foreign_keys="[UserRole.role_id, UserRole.user_id]", + ) + permissions = db.relationship( + "Permission", secondary="role_permissions", back_populates="roles" + ) + + def __repr__(self): + return f"" + + +class UserRole(db.Model): + __tablename__ = "user_roles" + + user_id = db.Column(db.Integer, db.ForeignKey("users.id"), primary_key=True) + role_id = db.Column(db.Integer, db.ForeignKey("roles.id"), primary_key=True) + created_at = db.Column(db.DateTime, default=datetime.now) + created_by = db.Column(db.Integer, db.ForeignKey("users.id")) + + # 关系定义 + user = db.relationship("User", foreign_keys=[user_id], backref="role_assignments") + role = db.relationship("Role", foreign_keys=[role_id], backref="user_assignments") + creator_rel = db.relationship( + "User", foreign_keys=[created_by], backref="created_assignments" + ) + + def __repr__(self): + return f"" + + +class Permission(db.Model): + __tablename__ = "permissions" + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + code = db.Column( + db.String(100), unique=True, nullable=False, comment="权限码(资源:操作)" + ) + description = db.Column(db.String(255), comment="权限描述") + category = db.Column(db.String(50), comment="权限分类(如用户管理、系统设置)") + created_at = db.Column(db.DateTime, default=datetime.now) + updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) + + # 外键字段 + created_by = db.Column(db.Integer, db.ForeignKey("users.id")) + updated_by = db.Column(db.Integer, db.ForeignKey("users.id")) + + # 关系定义 + roles = db.relationship( + "Role", secondary="role_permissions", back_populates="permissions" + ) + creator = db.relationship( + "User", foreign_keys=[created_by], backref="created_permissions" + ) + updater = db.relationship( + "User", foreign_keys=[updated_by], backref="updated_permissions" + ) + + def __repr__(self): + return f"" + + +class RolePermission(db.Model): + __tablename__ = "role_permissions" + + role_id = db.Column(db.Integer, db.ForeignKey("roles.id"), primary_key=True) + permission_id = db.Column( + db.Integer, db.ForeignKey("permissions.id"), primary_key=True + ) + created_at = db.Column(db.DateTime, default=datetime.now) + created_by = db.Column(db.Integer, db.ForeignKey("users.id")) + + # 关系定义 + role = db.relationship( + "Role", foreign_keys=[role_id], backref="permission_assignments" + ) + permission = db.relationship( + "Permission", foreign_keys=[permission_id], backref="role_assignments" + ) + creator = db.relationship( + "User", foreign_keys=[created_by], backref="created_role_permissions" + ) + + def __repr__(self): + return f"" + + +class Fst(db.Model): + __tablename__ = "fst" + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(255, collation="utf8mb4_unicode_ci"), nullable=False) + parent_id = db.Column(db.Integer, db.ForeignKey("fst.id")) + update_time = db.Column( + db.DateTime, default=func.current_timestamp(), nullable=False + ) + reserved_json = db.Column(JSON) + bag_sum = db.Column(db.Integer) + level = db.Column( + db.SmallInteger, comment="标签层级:0最高,1=一级, 2=二级, 3=三级, 4=四级" + ) + name_cn = db.Column(db.String(255, collation="utf8mb4_unicode_ci"), comment="中文") + annotation = db.Column( + db.String(500, collation="utf8mb4_unicode_ci"), comment="标签注释" + ) + + # 自引用关系(树形结构) + children = db.relationship( + "Fst", backref=db.backref("parent", remote_side=[id]), lazy="dynamic" + ) + + def __repr__(self): + return f"" + + + +class OperationHistory(db.Model): + __tablename__ = "operation_history" + + id = db.Column( + db.BigInteger, primary_key=True, autoincrement=True, comment="主键ID" + ) + user_id = db.Column(db.BigInteger, nullable=False, comment="用户ID") + username = db.Column(db.String(50), nullable=False, comment="用户名") + api_path = db.Column(db.String(255), nullable=False, comment="接口路径") + http_method = db.Column(db.String(10), nullable=False, comment="HTTP方法") + operation_time = db.Column(db.DateTime, default=datetime.now, comment="操作时间") + request_params = db.Column(db.Text, comment="请求参数") + response_code = db.Column(db.Integer, comment="响应状态码") + ip_address = db.Column(db.String(45), comment="客户端IP地址") + user_agent = db.Column(db.String(255), comment="用户代理信息") + operation_result = db.Column(db.Integer, default=1, comment="1=成功,0=失败") + error_message = db.Column(db.String(255), comment="错误信息") + trace_id = db.Column(db.String(50), comment="请求追踪ID") + + # 索引(在SQLAlchemy中通过__table_args__定义) + __table_args__ = ( + db.Index("idx_user_id", "user_id"), + db.Index("idx_operation_time", "operation_time"), + db.Index("idx_api_path", "api_path"), + db.Index("idx_user_operation", "user_id", "operation_time"), + ) + + def __repr__(self): + return f"" + + +# ===== 枚举类型定义 ===== +class BagStatus(enum.Enum): + UNPROCESSED = "UNPROCESSED" + PROCESSED_NOT_A_CANDIDATE = "PROCESSED_NOT_A_CANDIDATE" + PROCESSED_NOT_REVIEWED = "PROCESSED_NOT_REVIEWED" + REVIEW_IN_PROGRESS = "REVIEW_IN_PROGRESS" + RULE_BASED_ACCEPTED = "RULE_BASED_ACCEPTED" + MANUAL_OVERRIDE_ACCEPTED = "MANUAL_OVERRIDE_ACCEPTED" + REVIEWED_BUT_INVALID = "REVIEWED_BUT_INVALID" + + +class EventSource(enum.Enum): + RULE = "RULE" + MANUAL = "MANUAL" + + +class VerdictStatus(enum.Enum): + ACCEPTED = "ACCEPTED" + OVERRIDDEN = "OVERRIDDEN" + + +class OperationResult(enum.Enum): + SUCCESS = 1 + FAILURE = 0 + + +class QaStatus(enum.Enum): + QA_NOT_REVIEWED = "QA_NOT_REVIEWED" + QA_PASSED = "QA_PASSED" + QA_MODIFY = "QA_MODIFY" + QA_INVALID = "QA_INVALID" + + +class SyncStatus(enum.Enum): + SYNC_NOT_READY = "SYNC_NOT_READY" + SYNCED = "SYNCED" + + +# ===== 核心数据模型 ===== + + +class RuleVersions(db.Model): + """规则版本表""" + + __tablename__ = "rule_versions" + + rule_version_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + ruleset_name = db.Column(db.String(128), nullable=False) + version_str = db.Column(db.String(32), nullable=False) + description = db.Column(db.Text) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + + __table_args__ = ( + db.UniqueConstraint("ruleset_name", "version_str", name="uk_ruleset_version"), + ) + + +class Reviewers(db.Model): + """审核人员表""" + + __tablename__ = "reviewers" + + reviewer_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + login_name = db.Column(db.String(64), unique=True, nullable=False) + display_name = db.Column(db.String(128)) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + + +# ===== 业务数据模型 ===== +class BagFile(db.Model): + """BAG文件主表""" + + __tablename__ = "bag_file" + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + file_name = db.Column(db.String(255), nullable=False, comment="bag名称") + event = db.Column(db.String(255), comment="event") + file_path = db.Column(db.String(500)) + capture_datetime = db.Column( + db.DateTime, nullable=False, comment="采集时间(含时分秒)" + ) + vehicle_status = db.Column(JSON, comment="车辆状态JSON") + user_id = db.Column(db.Integer, ForeignKey("users.id"), comment="操作用户id") + create_time = db.Column( + db.DateTime, default=db.func.current_timestamp(), comment="标签的创建时间" + ) + update_time = db.Column( + db.DateTime, + default=db.func.current_timestamp(), + onupdate=db.func.current_timestamp(), + comment="标签的更新时间", + ) + car_state = db.Column(db.SmallInteger, comment="车辆状态: 0=静止, 1=运动") + frame_url = db.Column(db.String(500), comment="图片url") + video_url = db.Column(db.String(500), comment="视频url") + level1_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="一级标签id") + level2_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="二级标签id") + level3_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="三级标签id") + level4_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="四级标签id") + batch_name = db.Column(db.String(255), comment="批次名称") + status = db.Column( + Enum(BagStatus), + nullable=False, + default=BagStatus.PROCESSED_NOT_REVIEWED, + comment="处理的状态", + ) + last_time = db.Column(db.DateTime, comment="最后处理的时间") + last_rule_version_id = db.Column( + db.Integer, + ForeignKey("rule_versions.rule_version_id"), + comment="rule_versions的外键", + ) + front_starttime = db.Column(db.DateTime, comment="前摄像头的开始时间") + front_endtime = db.Column(db.DateTime, comment="前摄像头的结束时间") + case_type = db.Column(db.Integer, comment="1简单场景;2复杂场景") + comment1 = db.Column(db.String(255), comment="注释1") + comment2 = db.Column(db.String(255), comment="注释2") + comment3 = db.Column(db.String(255), comment="注释3") + bag_status = db.Column(db.Integer, comment="标签状态,0开始,1更新") + + # 新增字段 + qa_status = db.Column( + Enum(QaStatus), + nullable=False, + default=QaStatus.QA_NOT_REVIEWED, + comment="质检的状态", + ) + sync_status = db.Column( + Enum(SyncStatus), + nullable=False, + default=SyncStatus.SYNC_NOT_READY, + comment="同步的状态", + ) + fst_version = db.Column(db.String(255), comment="fst版本") + front_start_sec = db.Column(db.Integer, comment="前摄的开始秒") + front_end_sec = db.Column(db.Integer, comment="前摄的结束秒") + + bag_update_time = db.Column( + db.DateTime, default=db.func.current_timestamp(), comment="bag的更新时间" + ) + + qa_confirm_time = db.Column( + db.DateTime, default=db.func.current_timestamp(), comment="qa的确认时间" + ) + + db_time = db.Column( + db.DateTime, + default=db.func.current_timestamp(), + comment="更新到远程数据库的时间", + ) + + qa_id = db.Column(db.Integer, ForeignKey("users.id"),comment="操作用户id") + + high_speed = db.Column(db.Integer, comment="高速,1是,0否") + urban = db.Column(db.Integer, comment="城区,1是,0否") + parking = db.Column(db.Integer, comment="停车,1是,0否") + # 关系定义 + user = db.relationship("User", foreign_keys=[user_id],backref="bag_files") + rule_version = db.relationship("RuleVersions", backref="bag_files") + level1_tag = db.relationship("Fst", foreign_keys=[level1_tag_id]) + level2_tag = db.relationship("Fst", foreign_keys=[level2_tag_id]) + level3_tag = db.relationship("Fst", foreign_keys=[level3_tag_id]) + level4_tag = db.relationship("Fst", foreign_keys=[level4_tag_id]) + qa_user = db.relationship('User', foreign_keys=[qa_id], backref='qa_bag_files') + + + __table_args__ = ( + db.Index("idx_capture_time", "capture_datetime"), + db.Index("status", "status"), + db.Index("idx_bag_file_name", "file_name"), + ) + + +class TaggingEvents(db.Model): + """标签事件记录表""" + + __tablename__ = "tagging_events" + + event_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + bag_id = db.Column( + db.Integer, ForeignKey("bag_file.id"), nullable=False, comment="bag的id" + ) + source = db.Column(Enum(EventSource), nullable=False, comment="来源") + rule_version_id = db.Column( + db.Integer, ForeignKey("rule_versions.rule_version_id"), comment="rule版本id" + ) + # reviewer_id = db.Column(db.Integer, ForeignKey('reviewers.reviewer_id'), + # comment='审核人id') + reviewer_id = db.Column(db.Integer, ForeignKey("users.id"), comment="审核人id") + verdict = db.Column(Enum(VerdictStatus), comment="结论") + ts_event = db.Column( + db.DateTime, default=db.func.current_timestamp(), comment="当前时间" + ) + level1_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="一级标签id") + level2_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="二级标签id") + level3_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="三级标签id") + level4_tag_id = db.Column(db.Integer, ForeignKey("fst.id"), comment="四级标签id") + case_type = db.Column(db.Integer, comment="1简单场景;2复杂场景") + front_starttime = db.Column(db.DateTime, comment="前摄像头开始时间") + front_endtime = db.Column(db.DateTime, comment="前摄像头结束时间") + front_start_sec = db.Column(db.Integer, comment="前摄的开始秒") + front_end_sec = db.Column(db.Integer, comment="前摄的结束秒") + high_speed = db.Column(db.Integer, comment="高速,1是,0否") + urban = db.Column(db.Integer, comment="城区,1是,0否") + parking = db.Column(db.Integer, comment="停车,1是,0否") + qa_status = db.Column( + Enum(QaStatus), + nullable=False, + default=QaStatus.QA_NOT_REVIEWED, + comment="质检状态", + ) + is_deleted = db.Column( + db.Boolean, + nullable=False, + default=False, + comment="soft delete flag", + ) + note = db.Column(db.Text, comment="备注") + + # 关系定义 + bag = db.relationship("BagFile", backref="tagging_events") + rule_version = db.relationship("RuleVersions") + reviewer = db.relationship("User") + level1_tag = db.relationship("Fst", foreign_keys=[level1_tag_id]) + level2_tag = db.relationship("Fst", foreign_keys=[level2_tag_id]) + level3_tag = db.relationship("Fst", foreign_keys=[level3_tag_id]) + level4_tag = db.relationship("Fst", foreign_keys=[level4_tag_id]) + + __table_args__ = (db.Index("idx_evt_bag_ts", "bag_id", "ts_event"),) + + +class VlmFilter(db.Model): + __tablename__ = 'vlm_filter' + + id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键') + bag_name = db.Column(db.String(255), nullable=True, comment='bag的名称') + level1_tag_id = db.Column(db.Integer, db.ForeignKey('fst.id', ondelete='CASCADE', onupdate='CASCADE'), + nullable=True, index=True, comment='一级标签id') + level2_tag_id = db.Column(db.Integer, db.ForeignKey('fst.id', ondelete='CASCADE', onupdate='CASCADE'), + nullable=True, index=True, comment='二级标签id') + level3_tag_id = db.Column(db.Integer, db.ForeignKey('fst.id', ondelete='CASCADE', onupdate='CASCADE'), + nullable=True, index=True, comment='三级标签id') + level4_tag_id = db.Column(db.Integer, db.ForeignKey('fst.id', ondelete='CASCADE', onupdate='CASCADE'), + nullable=True, index=True, comment='四级标签id') + video_url = db.Column(db.String(255), nullable=True, comment='视频路径') + comment = db.Column(db.String(255), nullable=True, comment='备注') + user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE', onupdate='CASCADE'), + nullable=True, index=True, comment='写入的用户') + collection_time = db.Column(db.DateTime, nullable=True, comment='标签采集时间') + create_time = db.Column(db.DateTime, nullable=True, comment='写入的时间') + init_label = db.Column(db.Integer, nullable=True, comment='入库的状态,0是标注,1是质检') + status = db.Column(db.Integer, nullable=True, comment='入库的状态,0是标注,1是质检') + + # 可以根据需要添加关系引用 + level1_tag = db.relationship('Fst', foreign_keys=[level1_tag_id]) + level2_tag = db.relationship('Fst', foreign_keys=[level2_tag_id]) + level3_tag = db.relationship('Fst', foreign_keys=[level3_tag_id]) + level4_tag = db.relationship('Fst', foreign_keys=[level4_tag_id]) + user = db.relationship('User', foreign_keys=[user_id]) + +class BagMergeRecord(db.Model): + __tablename__ = "bag_merge_record" + + id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键') + joined_name = db.Column( + db.String(255), + nullable=False, + index=True, + comment="合并后 bag 名称(joined_name)" + ) + src_name = db.Column( + db.String(255), + nullable=False, + index=True, + comment="参与合并的原始 bag 名称" + ) + is_initiator = db.Column( + db.Boolean, + nullable=False, + default=False, + comment="是否为本次合并操作的主 bag(发起合并的那个 src)", + ) + create_time = db.Column( + db.DateTime, + default=db.func.current_timestamp(), + comment="记录创建时间", + ) + created_by = db.Column( + db.Integer, + db.ForeignKey("users.id"), + index=True, + comment="操作用户 id", + ) + + # 可选:反向关系,如果有需要 + creator = db.relationship("User", backref="bag_merge_records") + + __table_args__ = ( + # 如果希望避免“同一个 joined_name + src_name 被插入多次”,可以加一个联合唯一约束: + # db.UniqueConstraint("joined_name", "src_name", name="uk_joined_src"), + ) diff --git a/app/schemas.py b/app/schemas.py new file mode 100644 index 0000000..e69de29 diff --git a/app/utils/bagname.py b/app/utils/bagname.py new file mode 100644 index 0000000..7e229f8 --- /dev/null +++ b/app/utils/bagname.py @@ -0,0 +1,63 @@ +import re +from datetime import datetime +from typing import Dict, Tuple + +# 你 COS 的公共前缀可以做成默认参数,便于不同环境覆盖 +DEFAULT_COS_PREFIX = "https://data-miningc01-1318950322.cos.ap-shanghai-adc.myqcloud.com/" + +def extract_datetime_from_filename( + bag_filename: str, + cos_prefix: str = DEFAULT_COS_PREFIX, +) -> Tuple[str, Dict[str, str]]: + """ + 从 .bag 文件名中提取采集时间,并生成对应的多视角视频 URL。 + + 期望文件名包含片段:_{YYYYMMDD}-{HHMMSS}_ 或以 .bag 结尾,例如: + PL162802_event_all_time_event_20250416-193015_0.bag + PL123456_event_all_time_event_20250828-221018.bag + xx_20250524-180926_.bag + xx_20250524-180926_3.bag + + 返回: + (datetime_full_str, video_urls) + - datetime_full_str: 'YYYY-MM-DD HH:MM:SS' + - video_urls: COS 上该 bag 的多视角视频 URL 字典 + + 异常: + ValueError: 当文件名不匹配预期格式时抛出 + """ + # 提取日期时间 + match = re.search(r"_(\d{8})-(\d{6})(?:_|\.|$)", bag_filename) + + if not match: + raise ValueError(f"文件名格式错误,无法提取时间信息:{bag_filename}") + + date_part, time_part = match.groups() + year, month, day = date_part[:4], date_part[4:6], date_part[6:8] + hour, minute, second = time_part[:2], time_part[2:4], time_part[4:6] + + datetime_full = f"{year}-{month}-{day} {hour}:{minute}:{second}" + + + print(f'datetime_full:{datetime_full}') + # 生成视频路径(与现有逻辑一致) + # 去掉 .bag 后缀,再补上 " - {View}.mp4" + base = bag_filename[:-4] if bag_filename.endswith(".bag") else bag_filename + view_map = { + "wide": "Wide", + "left": "Left", + "right": "Right", + "rear_left": "Rear Left", + "rear_right": "Rear Right", + "rear": "Rear", + } + video_urls = {} + for key, label in view_map.items(): + video_final_path = f"{base}- {label}.mp4" + # 目录层级:momenta/videos/YYYY/MM/DD/{文件名 - {View}.mp4} + video_key = f"momenta/videos/{year}/{month}/{day}/{video_final_path}" + video_urls[key] = f"{cos_prefix}{video_key}" + + print(f'v{video_urls}') + + return datetime_full, video_urls diff --git a/app/utils/driving_tree.py b/app/utils/driving_tree.py new file mode 100644 index 0000000..1fda84e --- /dev/null +++ b/app/utils/driving_tree.py @@ -0,0 +1,3301 @@ +driving_tree={ + "id": "MB Driving FST V1", + "label": "MB Driving FST V1", + "children": [ + { + "id": "LANE_KEEPING_PERCEPTION", + "label": "LANE_KEEPING_PERCEPTION", + "children": [ + { + "id": "LANE_KEEPING_PERCEPTION_ILLUMINATION", + "label": "LANE_KEEPING_PERCEPTION_ILLUMINATION", + "children": [ + { + "id": "LANE_KEEPING_PERCEPTION_ILLUMINATION_TUNNEL", + "label": "LANE_KEEPING_PERCEPTION_ILLUMINATION_TUNNEL", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_PERCEPTION_ILLUMINATION_NIGHT", + "label": "LANE_KEEPING_PERCEPTION_ILLUMINATION_NIGHT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_KEEPING_PERCEPTION_WEATHER_COND", + "label": "LANE_KEEPING_PERCEPTION_WEATHER_COND", + "children": [ + { + "id": "LANE_KEEPING_PERCEPTION_WEATHER_COND_FOG", + "label": "LANE_KEEPING_PERCEPTION_WEATHER_COND_FOG", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_PERCEPTION_WEATHER_COND_RAIN", + "label": "LANE_KEEPING_PERCEPTION_WEATHER_COND_RAIN", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_PERCEPTION_WEATHER_COND_SNOW_ON_ROAD", + "label": "LANE_KEEPING_PERCEPTION_WEATHER_COND_SNOW_ON_ROAD", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_PERCEPTION_WEATHER_COND_SNOWY_WEATHER", + "label": "LANE_KEEPING_PERCEPTION_WEATHER_COND_SNOWY_WEATHER", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_KEEPING_PERCEPTION_BAD_LANE_MARKING", + "label": "LANE_KEEPING_PERCEPTION_BAD_LANE_MARKING", + "children": [ + { + "id": "LANE_KEEPING_PERCEPTION_BOTH_SIDES", + "label": "LANE_KEEPING_PERCEPTION_BOTH_SIDES", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_PERCEPTION_ONE_SIDE", + "label": "LANE_KEEPING_PERCEPTION_ONE_SIDE", + "children": [ + { + "id": "LANE_KEEPING_PERCEPTION_ONE_SIDE_WIDE_LANE_WIDTH", + "label": "LANE_KEEPING_PERCEPTION_ONE_SIDE_WIDE_LANE_WIDTH", + "children": [], + "level": 4 + }, + { + "id": "LANE_KEEPING_PERCEPTION_ONE_SIDE_REGULAR_LANE_WIDTH", + "label": "LANE_KEEPING_PERCEPTION_ONE_SIDE_REGULAR_LANE_WIDTH", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_KEEPING_ROAD_SHAPE", + "label": "LANE_KEEPING_ROAD_SHAPE", + "children": [ + { + "id": "LANE_KEEPING_LANE_WIDTH", + "label": "LANE_KEEPING_LANE_WIDTH", + "children": [ + { + "id": "LANE_KEEPING_LANE_WIDTH_REGULAR_LANE_WIDTH", + "label": "LANE_KEEPING_LANE_WIDTH_REGULAR_LANE_WIDTH", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_LANE_WIDTH_NARROW_LANE_WIDTH", + "label": "LANE_KEEPING_LANE_WIDTH_NARROW_LANE_WIDTH", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_LANE_WIDTH_WIDE_LANE_WIDTH", + "label": "LANE_KEEPING_LANE_WIDTH_WIDE_LANE_WIDTH", + "children": [ + { + "id": "LANE_KEEPING_LANE_WIDTH_WIDE_ENTRIES", + "label": "LANE_KEEPING_LANE_WIDTH_WIDE_ENTRIES", + "children": [], + "level": 4 + }, + { + "id": "LANE_KEEPING_LANE_WIDTH_WIDE_INTERCHANGES", + "label": "LANE_KEEPING_LANE_WIDTH_WIDE_INTERCHANGES", + "children": [], + "level": 4 + }, + { + "id": "LANE_KEEPING_LANE_WIDTH_WIDE_EXITS", + "label": "LANE_KEEPING_LANE_WIDTH_WIDE_EXITS", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_KEEPING_CURVED_ROAD", + "label": "LANE_KEEPING_CURVED_ROAD", + "children": [ + { + "id": "LANE_KEEPING_SMALL_BEND_HIGHWAY_ENTRY", + "label": "LANE_KEEPING_SMALL_BEND_HIGHWAY_ENTRY", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_LARGE_BEND_FEDERAL_ROAD", + "label": "LANE_KEEPING_LARGE_BEND_FEDERAL_ROAD", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_SMALL_BEND_HIGHWAY_EXIT", + "label": "LANE_KEEPING_SMALL_BEND_HIGHWAY_EXIT", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_CURVED_HIGHWAY", + "label": "LANE_KEEPING_CURVED_HIGHWAY", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_STAIGHT_LANE", + "label": "LANE_KEEPING_STAIGHT_LANE", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_SCURVE_FEDERAL_ROAD", + "label": "LANE_KEEPING_SCURVE_FEDERAL_ROAD", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_WIDE_BEND_ROAD_FEDERAL_ROAD", + "label": "LANE_KEEPING_WIDE_BEND_ROAD_FEDERAL_ROAD", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "TRAFFIC_LIGHT_START_AND_BRAKE", + "label": "TRAFFIC_LIGHT_START_AND_BRAKE", + "children": [ + { + "id": "TRAFFIC_LIGHT_COUNTDOWN", + "label": "TRAFFIC_LIGHT_COUNTDOWN", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_YELLOW_LIGHT_PASSING", + "label": "TRAFFIC_LIGHT_YELLOW_LIGHT_PASSING", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_YELLOW_LIGHT_FLASHING_PASSING", + "label": "TRAFFIC_LIGHT_YELLOW_LIGHT_FLASHING_PASSING", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_FLASHING_PASSING", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_FLASHING_PASSING", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_RED_LIGHT_BRAKE_AND_STOP", + "label": "TRAFFIC_LIGHT_RED_LIGHT_BRAKE_AND_STOP", + "children": [ + { + "id": "TRAFFIC_LIGHT_RED_LIGHT_BRAKE_AS_FIRST_CAR", + "label": "TRAFFIC_LIGHT_RED_LIGHT_BRAKE_AS_FIRST_CAR", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_START", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_START", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_YELLOW_LIGHT_BRAKE_AND_STOP", + "label": "TRAFFIC_LIGHT_YELLOW_LIGHT_BRAKE_AND_STOP", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_FLASHING_BRAKE_AND_STOP", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_FLASHING_BRAKE_AND_STOP", + "children": [], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING", + "children": [ + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_TURN_RIGHT", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_TURN_RIGHT", + "children": [], + "level": 3 + }, + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_GO_STRAIGHT", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_GO_STRAIGHT", + "children": [], + "level": 3 + }, + { + "id": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_TURN_LEFT", + "label": "TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_TURN_LEFT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING", + "label": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING", + "children": [ + { + "id": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_HIDDEN_BY_BIGVEHICLE", + "label": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_HIDDEN_BY_BIGVEHICLE", + "children": [], + "level": 3 + }, + { + "id": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_UNUSED_LIGHT", + "label": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_UNUSED_LIGHT", + "children": [], + "level": 3 + }, + { + "id": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_ABNORMAL", + "label": "TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_ABNORMAL", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "TRAFFIC_LIGHT_RED_LIGHT_WAITING", + "label": "TRAFFIC_LIGHT_RED_LIGHT_WAITING", + "children": [ + { + "id": "TRAFFIC_LIGHT_RED_LIGHT_WAITING_TURN_LEFT", + "label": "TRAFFIC_LIGHT_RED_LIGHT_WAITING_TURN_LEFT", + "children": [], + "level": 3 + }, + { + "id": "TRAFFIC_LIGHT_RED_LIGHT_WAITING_GO_STRAIGHT", + "label": "TRAFFIC_LIGHT_RED_LIGHT_WAITING_GO_STRAIGHT", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "U_TURN", + "label": "U_TURN", + "children": [ + { + "id": "U_TURN_INTERSECTION", + "label": "U_TURN_INTERSECTION", + "children": [ + { + "id": "U_TURN_INTERSECTION_ROUND_TRAFFIC_LIGHT", + "label": "U_TURN_INTERSECTION_ROUND_TRAFFIC_LIGHT", + "children": [], + "level": 3 + }, + { + "id": "U_TURN_INTERSECTION_LEFT_TURN", + "label": "U_TURN_INTERSECTION_LEFT_TURN", + "children": [], + "level": 3 + }, + { + "id": "U_TURN_INTERSECTION_UTURN_LIGHT", + "label": "U_TURN_INTERSECTION_UTURN_LIGHT", + "children": [], + "level": 3 + }, + { + "id": "U_TURN_INTERSECTION_NO_TRAFFIC_LIGHT", + "label": "U_TURN_INTERSECTION_NO_TRAFFIC_LIGHT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "U_TURN_IN_ROAD", + "label": "U_TURN_IN_ROAD", + "children": [ + { + "id": "U_TURN_IN_ROAD_OPENNING_GAP", + "label": "U_TURN_IN_ROAD_OPENNING_GAP", + "children": [], + "level": 3 + }, + { + "id": "U_TURN_IN_ROAD_DASHED_LINE", + "label": "U_TURN_IN_ROAD_DASHED_LINE", + "children": [], + "level": 3 + }, + { + "id": "U_TURN_IN_ROAD_GRID_LINE", + "label": "U_TURN_IN_ROAD_GRID_LINE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "U_TURN_SPECIAL_CASE", + "label": "U_TURN_SPECIAL_CASE", + "children": [], + "level": 2 + }, + { + "id": "U_TURN_BEFORE_INTERSECTION", + "label": "U_TURN_BEFORE_INTERSECTION", + "children": [ + { + "id": "U_TURN_BEFORE_INTERSECTION_DASHED_LINE", + "label": "U_TURN_BEFORE_INTERSECTION_DASHED_LINE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "U_TURN_NARROW_ROAD", + "label": "U_TURN_NARROW_ROAD", + "children": [], + "level": 2 + }, + { + "id": "U_TURN_DEDICATED_LANE", + "label": "U_TURN_DEDICATED_LANE", + "children": [ + { + "id": "U_TURN_DEDICATED_LANE_WITHOUT_TRAFFIC_LIGHT", + "label": "U_TURN_DEDICATED_LANE_WITHOUT_TRAFFIC_LIGHT", + "children": [], + "level": 3 + }, + { + "id": "U_TURN_DEDICATED_LANE_WITH_TRAFFIC_LIGHT", + "label": "U_TURN_DEDICATED_LANE_WITH_TRAFFIC_LIGHT", + "children": [ + { + "id": "U_TURN_DEDICATED_LANE_CIRCLE_LIGHT", + "label": "U_TURN_DEDICATED_LANE_CIRCLE_LIGHT", + "children": [], + "level": 4 + }, + { + "id": "U_TURN_DEDICATED_LANE_LEFT_TURN_LIGHT", + "label": "U_TURN_DEDICATED_LANE_LEFT_TURN_LIGHT", + "children": [], + "level": 4 + }, + { + "id": "U_TURN_DEDICATED_LANE_UTURN_LIGHT ", + "label": "U_TURN_DEDICATED_LANE_UTURN_LIGHT ", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "U_TURN_DEDICATED_LANE_SHORT_UTURN_LIGHT", + "label": "U_TURN_DEDICATED_LANE_SHORT_UTURN_LIGHT", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "MERGE", + "label": "MERGE", + "children": [ + { + "id": "MERGE_LANE_GAP", + "label": "MERGE_LANE_GAP", + "children": [], + "level": 2 + }, + { + "id": "MERGE_TRAFFIC_JAM", + "label": "MERGE_TRAFFIC_JAM", + "children": [], + "level": 2 + }, + { + "id": "MERGE_2_TO_1", + "label": "MERGE_2_TO_1", + "children": [], + "level": 2 + }, + { + "id": "MERGE_3_TO_1", + "label": "MERGE_3_TO_1", + "children": [], + "level": 2 + }, + { + "id": "MERGE_WITH_ORIGINAL_LANE", + "label": "MERGE_WITH_ORIGINAL_LANE", + "children": [], + "level": 2 + }, + { + "id": "MERGE_LEFT_TURN", + "label": "MERGE_LEFT_TURN", + "children": [], + "level": 2 + }, + { + "id": "MERGE_RIGHT_TURN", + "label": "MERGE_RIGHT_TURN", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "TOLL_STATION", + "label": "TOLL_STATION", + "children": [ + { + "id": "TOLL_STATION_LEAVE", + "label": "TOLL_STATION_LEAVE", + "children": [ + { + "id": "TOLL_STATION_LEAVE_DRIVE_OFF_AFTER_ROD_OPEN", + "label": "TOLL_STATION_LEAVE_DRIVE_OFF_AFTER_ROD_OPEN", + "children": [], + "level": 3 + }, + { + "id": "TOLL_STATION_LEAVE_PASSING_NO_LANE_MARKING_SQUARE_AFTER_ROD", + "label": "TOLL_STATION_LEAVE_PASSING_NO_LANE_MARKING_SQUARE_AFTER_ROD", + "children": [], + "level": 3 + }, + { + "id": "TOLL_STATION_LEAVE_SET_SPEED_ADJUST_TO_60kph_AFTER_PASSING_ROD", + "label": "TOLL_STATION_LEAVE_SET_SPEED_ADJUST_TO_60kph_AFTER_PASSING_ROD", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "TOLL_STATION_ENTER", + "label": "TOLL_STATION_ENTER", + "children": [ + { + "id": "TOLL_STATION_ENTER_LANE_SELECTION_AT_SQUARE", + "label": "TOLL_STATION_ENTER_LANE_SELECTION_AT_SQUARE", + "children": [ + { + "id": "TOLL_STATION_ENTER_LANE_SELECTION_ETC_LANE", + "label": "TOLL_STATION_ENTER_LANE_SELECTION_ETC_LANE", + "children": [], + "level": 4 + }, + { + "id": "TOLL_STATION_ENTER_LANE_SELECTION_MANUAL_CHARING_LANE", + "label": "TOLL_STATION_ENTER_LANE_SELECTION_MANUAL_CHARING_LANE", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "TOLL_STATION_ENTER_LANE_SELECTION_BEFORE_SQUARE", + "label": "TOLL_STATION_ENTER_LANE_SELECTION_BEFORE_SQUARE", + "children": [ + { + "id": "TOLL_STATION_PREFER_RIGHT_LANE_WITHOUT_ETC", + "label": "TOLL_STATION_PREFER_RIGHT_LANE_WITHOUT_ETC", + "children": [], + "level": 4 + }, + { + "id": "TOLL_STATION_PREFER_LEFT_LANE_WITH_ETC", + "label": "TOLL_STATION_PREFER_LEFT_LANE_WITH_ETC", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "TOLL_STATION_ENTER_BRAKE_TO_STANDSTILL_BEFORE_CLOSED_ROD", + "label": "TOLL_STATION_ENTER_BRAKE_TO_STANDSTILL_BEFORE_CLOSED_ROD", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_KEEPING_OFFSET_CORRECTION", + "label": "LANE_KEEPING_OFFSET_CORRECTION", + "children": [ + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC_BOUNDARIES", + "label": "LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC_BOUNDARIES", + "children": [ + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_CONES", + "label": "LANE_KEEPING_OFFSET_CORRECTION_CONES", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_GUARDRAILS", + "label": "LANE_KEEPING_OFFSET_CORRECTION_GUARDRAILS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC", + "label": "LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC", + "children": [ + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_SAME_DRIVING_DIRECTION", + "label": "LANE_KEEPING_OFFSET_CORRECTION_SAME_DRIVING_DIRECTION", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_OPPOSITE_DRIVING_DIRECTION", + "label": "LANE_KEEPING_OFFSET_CORRECTION_OPPOSITE_DRIVING_DIRECTION", + "children": [], + "level": 3 + }, + { + "id": "LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC_JAM_ON_SIDE new added", + "label": "LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC_JAM_ON_SIDE new added", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_KEEPING_DODGING", + "label": "LANE_KEEPING_DODGING", + "children": [ + { + "id": "LANE_BORROWING_DODGE_AL", + "label": "LANE_BORROWING_DODGE_AL", + "children": [ + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_OBSTACLES", + "label": "LANE_BORROWING_DODGE_AL_MOVING_OBSTACLES", + "children": [ + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_LARGE_VEHICLE", + "label": "LANE_BORROWING_DODGE_AL_MOVING_LARGE_VEHICLE", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_REVERSING_DRIVING", + "label": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_REVERSING_DRIVING", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_VRU", + "label": "LANE_BORROWING_DODGE_AL_MOVING_VRU", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_VRU_REVERSE", + "label": "LANE_BORROWING_DODGE_AL_MOVING_VRU_REVERSE", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_DOOR_OPEN", + "label": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_DOOR_OPEN", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_PARKING", + "label": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_PARKING", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_CLOSE_PARALLEL", + "label": "LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_CLOSE_PARALLEL", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_OBSTACLES", + "label": "LANE_BORROWING_DODGE_AL_STANDING_OBSTACLES", + "children": [ + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_TRIANGLE_WARNING_SIGNS", + "label": "LANE_BORROWING_DODGE_AL_STANDING_TRIANGLE_WARNING_SIGNS", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_CONSTRUCTION_SIGNS", + "label": "LANE_BORROWING_DODGE_AL_STANDING_CONSTRUCTION_SIGNS", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_CONE_LANE", + "label": "LANE_BORROWING_DODGE_AL_STANDING_CONE_LANE", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_ROADEDGES", + "label": "LANE_BORROWING_DODGE_AL_STANDING_ROADEDGES", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR", + "label": "LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR", + "children": [ + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR_DEAD", + "label": "LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR_DEAD", + "children": [], + "level": 5 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR_TEMPORARY", + "label": "LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR_TEMPORARY", + "children": [], + "level": 5 + } + ], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_GAURDRAIL", + "label": "LANE_BORROWING_DODGE_AL_STANDING_GAURDRAIL", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_CONSTRUCTION_WALLS", + "label": "LANE_BORROWING_DODGE_AL_STANDING_CONSTRUCTION_WALLS", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_FALLING_GOODS", + "label": "LANE_BORROWING_DODGE_AL_STANDING_FALLING_GOODS", + "children": [], + "level": 4 + }, + { + "id": "LANE_BORROWING_DODGE_AL_STANDING_TRAFFIC_PILLARS", + "label": "LANE_BORROWING_DODGE_AL_STANDING_TRAFFIC_PILLARS", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_BORROWING_DODGE_SPLIT_POINT", + "label": "LANE_BORROWING_DODGE_SPLIT_POINT", + "children": [], + "level": 2 + }, + { + "id": "LANE_BORROWING_DODGE_OL", + "label": "LANE_BORROWING_DODGE_OL", + "children": [ + { + "id": "LANE_BORROWING_DODGE_OL_OBJECT", + "label": "LANE_BORROWING_DODGE_OL_OBJECT", + "children": [], + "level": 3 + }, + { + "id": "LANE_BORROWING_DODGE_OL_SOLID_LINE", + "label": "LANE_BORROWING_DODGE_OL_SOLID_LINE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_BORROWING_DODGE_SOLID_LINE", + "label": "LANE_BORROWING_DODGE_SOLID_LINE", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "OBJECT_DISTANCE_CONTROL", + "label": "OBJECT_DISTANCE_CONTROL", + "children": [ + { + "id": "OBJECT_DISTCTRL_MODERATE_LONGIT_DYN", + "label": "OBJECT_DISTCTRL_MODERATE_LONGIT_DYN", + "children": [], + "level": 2 + }, + { + "id": "OBJECT_DISTCTRL_BIG_DISTANCE_RPV", + "label": "OBJECT_DISTCTRL_BIG_DISTANCE_RPV", + "children": [], + "level": 2 + }, + { + "id": "OBJECT_DISTCTRL_HIGH_LONGIT_DYN", + "label": "OBJECT_DISTCTRL_HIGH_LONGIT_DYN", + "children": [ + { + "id": "OBJECT_DISTCTRL_DYNAMIC_RPV", + "label": "OBJECT_DISTCTRL_DYNAMIC_RPV", + "children": [ + { + "id": "OBJECT_DISTCTRL_STRONG_ACCEL_RPV", + "label": "OBJECT_DISTCTRL_STRONG_ACCEL_RPV", + "children": [], + "level": 4 + }, + { + "id": "OBJECT_DISTCTRL_STRONG_DECEL_RPV", + "label": "OBJECT_DISTCTRL_STRONG_DECEL_RPV", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "OBJECT_DISTCTRL_SLOW_OR_STANDING_HIDDEN_RPV", + "label": "OBJECT_DISTCTRL_SLOW_OR_STANDING_HIDDEN_RPV", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_CHANGE_NAVIGATION", + "label": "LANE_CHANGE_NAVIGATION", + "children": [ + { + "id": "LANE_CHANGE_NAV_HIGHWAYTORAMP", + "label": "LANE_CHANGE_NAV_HIGHWAYTORAMP", + "children": [ + { + "id": "LANE_CHANGE_NAV_HIGHWAYTORAMP_NON_CONGESTED", + "label": "LANE_CHANGE_NAV_HIGHWAYTORAMP_NON_CONGESTED", + "children": [], + "level": 3 + }, + { + "id": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED", + "label": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED", + "children": [ + { + "id": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_REDUCE_PASSINGBY_SPEED", + "label": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_REDUCE_PASSINGBY_SPEED", + "children": [], + "level": 4 + }, + { + "id": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_GAP_SEL_SMALL_DISTANCE", + "label": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_GAP_SEL_SMALL_DISTANCE", + "children": [], + "level": 4 + }, + { + "id": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_GAP_SEL_BIG_DISTANCE", + "label": "LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_GAP_SEL_BIG_DISTANCE", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "LANE_CHANGE_NAV_ON_CLOSINGLANE", + "label": "LANE_CHANGE_NAV_ON_CLOSINGLANE", + "children": [ + { + "id": "LANE_CHANGE_NAV_ON_CLOSINGLANE_NON_CONGESTED", + "label": "LANE_CHANGE_NAV_ON_CLOSINGLANE_NON_CONGESTED", + "children": [], + "level": 3 + }, + { + "id": "LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED", + "label": "LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED", + "children": [ + { + "id": "LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED_GAP_SELECTION", + "label": "LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED_GAP_SELECTION", + "children": [], + "level": 4 + }, + { + "id": "LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED_STANDSTILL", + "label": "LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED_STANDSTILL", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CRUISE_SPDLIM", + "label": "CRUISE_SPDLIM", + "children": [ + { + "id": "CRUISE_SPDLIM_LANE_LVL", + "label": "CRUISE_SPDLIM_LANE_LVL", + "children": [ + { + "id": "CRUISE_UPCOMING_SPDLIM_LANE_LVL_UNMOD_SETSPD", + "label": "CRUISE_UPCOMING_SPDLIM_LANE_LVL_UNMOD_SETSPD", + "children": [ + { + "id": "CRUISE_UPCOMING_SPDLIM_MIDDLELANE", + "label": "CRUISE_UPCOMING_SPDLIM_MIDDLELANE", + "children": [], + "level": 4 + }, + { + "id": "CRUISE_UPCOMING_SPDLIM_FASTLANE_LVL", + "label": "CRUISE_UPCOMING_SPDLIM_FASTLANE_LVL", + "children": [], + "level": 4 + }, + { + "id": "CRUISE_UPCOMING_SPDLIM_SLOWLANE_LVL", + "label": "CRUISE_UPCOMING_SPDLIM_SLOWLANE_LVL", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "CRUISE_UPCOMING_SPDLIM_LANE_LVL_LANECHG_TO_SLOWER", + "label": "CRUISE_UPCOMING_SPDLIM_LANE_LVL_LANECHG_TO_SLOWER", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_UPCOMING_SPDLIM_LANE_LVL_LANECHG_TO_FASTER", + "label": "CRUISE_UPCOMING_SPDLIM_LANE_LVL_LANECHG_TO_FASTER", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_SPDLIM_PERCEPTION", + "label": "CRUISE_SPDLIM_PERCEPTION", + "children": [ + { + "id": "CRUISE_SPDLIM_NO_TAKEOVER_FROM_TRAFFICAGENTS", + "label": "CRUISE_SPDLIM_NO_TAKEOVER_FROM_TRAFFICAGENTS", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_SPDLIM_TAKEOVER_FROM_TEMPORARY_SIGNS", + "label": "CRUISE_SPDLIM_TAKEOVER_FROM_TEMPORARY_SIGNS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_SPDLIM_UPCOMING", + "label": "CRUISE_SPDLIM_UPCOMING", + "children": [ + { + "id": "CRUISE_SPDLIM_CHG_TO_HIGHER_VALUE", + "label": "CRUISE_SPDLIM_CHG_TO_HIGHER_VALUE", + "children": [ + { + "id": "CRUISE_SPDLIM_CHG_SETSPD_HIGHER_THAN_NEW_LIMIT", + "label": "CRUISE_SPDLIM_CHG_SETSPD_HIGHER_THAN_NEW_LIMIT", + "children": [], + "level": 4 + }, + { + "id": "CRUISE_SPDLIM_CHG_SETSPD_BETW_OLD_AND_NEW_LIMIT", + "label": "CRUISE_SPDLIM_CHG_SETSPD_BETW_OLD_AND_NEW_LIMIT", + "children": [], + "level": 4 + }, + { + "id": "CRUISE_SPDLIM_CHG_USE_NEW_LIMIT", + "label": "CRUISE_SPDLIM_CHG_USE_NEW_LIMIT", + "children": [], + "level": 4 + }, + { + "id": "CRUISE_SPDLIM_CHG_SETSPD_LOWER_THAN_OLD_LIMIT", + "label": "CRUISE_SPDLIM_CHG_SETSPD_LOWER_THAN_OLD_LIMIT", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "CRUISE_SPDLIM_CHG_TO_LOWER_VALUE", + "label": "CRUISE_SPDLIM_CHG_TO_LOWER_VALUE", + "children": [ + { + "id": "CRUISE_SPDLIM_CHG_TAKEOVER_NEW_LIMIT", + "label": "CRUISE_SPDLIM_CHG_TAKEOVER_NEW_LIMIT", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_SPDLIM_DRIVER", + "label": "CRUISE_SPDLIM_DRIVER", + "children": [ + { + "id": "CRUISE_SPDLIM_TAKEOVER_VIA_RESUME", + "label": "CRUISE_SPDLIM_TAKEOVER_VIA_RESUME", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_SPDLIM_CHANGE_DRIVER_INTERVENT_RESET_SETSPD", + "label": "CRUISE_SPDLIM_CHANGE_DRIVER_INTERVENT_RESET_SETSPD", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_REPEATED_SPD_LIMIT_KEEP_MODIFIED_SETSPD", + "label": "CRUISE_REPEATED_SPD_LIMIT_KEEP_MODIFIED_SETSPD", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_CHANGE _AVOID_EVENT", + "label": "LANE_CHANGE _AVOID_EVENT", + "children": [ + { + "id": "LANE_CHANGE_AVOID_ENTRY_LANE", + "label": "LANE_CHANGE_AVOID_ENTRY_LANE", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_AVOID_BUS_LANE", + "label": "LANE_CHANGE_AVOID_BUS_LANE", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_AVOID_SLOW_SL_LANE", + "label": "LANE_CHANGE_AVOID_SLOW_SL_LANE", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_AVOID_OCCUPIED_VEHICLE", + "label": "LANE_CHANGE_AVOID_OCCUPIED_VEHICLE", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_AVOID_EXIT_LANE", + "label": "LANE_CHANGE_AVOID_EXIT_LANE", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CLOSING_EGO_LANE", + "label": "CLOSING_EGO_LANE", + "children": [ + { + "id": "CLOSING_EGO_LANE_MERGED_INTO_AL_UNOCCUPIED", + "label": "CLOSING_EGO_LANE_MERGED_INTO_AL_UNOCCUPIED", + "children": [], + "level": 2 + }, + { + "id": "CLOSING_EGO_LANE_MERGED_INTO_AL_OCCUPIED", + "label": "CLOSING_EGO_LANE_MERGED_INTO_AL_OCCUPIED", + "children": [ + { + "id": "CLOSING_EGO_LANE_MERGED_INTO_AL_STATIC_CAR", + "label": "CLOSING_EGO_LANE_MERGED_INTO_AL_STATIC_CAR", + "children": [], + "level": 3 + }, + { + "id": "CLOSING_EGO_LANE_MERGED_INTO_AL_HEAVY_TRAFFIC", + "label": "CLOSING_EGO_LANE_MERGED_INTO_AL_HEAVY_TRAFFIC", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "OBJECT_START_AND_STOP", + "label": "OBJECT_START_AND_STOP", + "children": [ + { + "id": "START_STOP_TRAFFIC", + "label": "START_STOP_TRAFFIC", + "children": [ + { + "id": "START_STOP_DESCENT", + "label": "START_STOP_DESCENT", + "children": [], + "level": 3 + }, + { + "id": "START_STOP_PLANE_ROAD", + "label": "START_STOP_PLANE_ROAD", + "children": [], + "level": 3 + }, + { + "id": "START_STOP_ACSCENT", + "label": "START_STOP_ACSCENT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "START_STOP_BRAKING_STANDSTILL", + "label": "START_STOP_BRAKING_STANDSTILL", + "children": [ + { + "id": "START_STOP_BRAKING_STANDING_RPV", + "label": "START_STOP_BRAKING_STANDING_RPV", + "children": [], + "level": 3 + }, + { + "id": "START_STOP_ACCEL_TO_DECEL", + "label": "START_STOP_ACCEL_TO_DECEL", + "children": [], + "level": 3 + }, + { + "id": "START_STOP_LINEAR_DECEL_RPV", + "label": "START_STOP_LINEAR_DECEL_RPV", + "children": [], + "level": 3 + }, + { + "id": "START_STOP_PROGRESSIVE_DECEL_RPV", + "label": "START_STOP_PROGRESSIVE_DECEL_RPV", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "START_STOP_STARTING_RPV", + "label": "START_STOP_STARTING_RPV", + "children": [ + { + "id": "START_STOP_SLOW_STARTING_RPV", + "label": "START_STOP_SLOW_STARTING_RPV", + "children": [], + "level": 3 + }, + { + "id": "START_STOP_QUICK_STARTING_RPV", + "label": "START_STOP_QUICK_STARTING_RPV", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "SPLIT", + "label": "SPLIT", + "children": [ + { + "id": "SPLIT_OBJECT", + "label": "SPLIT_OBJECT", + "children": [], + "level": 2 + }, + { + "id": "SPLIT_ENTER_MAIN_ROAD", + "label": "SPLIT_ENTER_MAIN_ROAD", + "children": [ + { + "id": "SPLIT_ENTER_MAIN_ROAD_CROSS_NON_MOTORIZED_LANE", + "label": "SPLIT_ENTER_MAIN_ROAD_CROSS_NON_MOTORIZED_LANE", + "children": [], + "level": 3 + }, + { + "id": "SPLIT_ENTER_MAIN_ROAD_OCCLUSION", + "label": "SPLIT_ENTER_MAIN_ROAD_OCCLUSION", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "SPLIT_RB", + "label": "SPLIT_RB", + "children": [ + { + "id": "SPLIT_RB_BRIDGE", + "label": "SPLIT_RB_BRIDGE", + "children": [], + "level": 3 + }, + { + "id": "SPLIT_RB_CONE", + "label": "SPLIT_RB_CONE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "SPLIT_1_TO_X", + "label": "SPLIT_1_TO_X", + "children": [ + { + "id": "SPLIT_1_TO_3", + "label": "SPLIT_1_TO_3", + "children": [], + "level": 3 + }, + { + "id": "SPLIT_M2N", + "label": "SPLIT_M2N", + "children": [], + "level": 3 + }, + { + "id": "SPLIT_1_TO_2", + "label": "SPLIT_1_TO_2", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "SPLIT_ENTER_SUBROAD", + "label": "SPLIT_ENTER_SUBROAD", + "children": [ + { + "id": "SPLIT_ENTER_SUBROAD_OCCLUSION", + "label": "SPLIT_ENTER_SUBROAD_OCCLUSION", + "children": [], + "level": 3 + }, + { + "id": "SPLIT_ENTER_SUBROAD_UNDER_EXPRESS", + "label": "SPLIT_ENTER_SUBROAD_UNDER_EXPRESS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "SPLIT_DEDICATED_LANE", + "label": "SPLIT_DEDICATED_LANE", + "children": [ + { + "id": "SPLIT_ENTER_DEDICATED_LEFT_TURN_LANE", + "label": "SPLIT_ENTER_DEDICATED_LEFT_TURN_LANE", + "children": [], + "level": 3 + }, + { + "id": "SPLIT_ENTER_DEDICATED_RIGHT_TURN_LANE", + "label": "SPLIT_ENTER_DEDICATED_RIGHT_TURN_LANE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "SPLIT_EXIT_TUNNEL", + "label": "SPLIT_EXIT_TUNNEL", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CRUISE_ADJACENT_TRAFFIC", + "label": "CRUISE_ADJACENT_TRAFFIC", + "children": [ + { + "id": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_LFT_EGO_PASSES_ON_RGT", + "label": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_LFT_EGO_PASSES_ON_RGT", + "children": [ + { + "id": "CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_LFT_EGO_PASSES_ON_RGT", + "label": "CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_LFT_EGO_PASSES_ON_RGT", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_LFT_EGO_PASSES_ON_RGT", + "label": "CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_LFT_EGO_PASSES_ON_RGT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES", + "label": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES", + "children": [ + { + "id": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES_HAVING_DIFFERENT_SPD", + "label": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES_HAVING_DIFFERENT_SPD", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES_HAVING_SIMILAR_SPD", + "label": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES_HAVING_SIMILAR_SPD", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT", + "label": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT", + "children": [ + { + "id": "CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT", + "label": "CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT", + "label": "CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST", + "label": "CRUISE_ADJAC_TRAFFIC_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST", + "children": [ + { + "id": "CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST", + "label": "CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST", + "label": "CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CROSS_HANDLING", + "label": "CROSS_HANDLING", + "children": [ + { + "id": "LARGE_VEHICLE_CROSS_HANDLING", + "label": "LARGE_VEHICLE_CROSS_HANDLING", + "children": [ + { + "id": "LARGE_VEHICLE_CROSS_RIGHT_TURN", + "label": "LARGE_VEHICLE_CROSS_RIGHT_TURN", + "children": [], + "level": 3 + }, + { + "id": "LARGE_VEHICLE_CROSS_ROADGAP", + "label": "LARGE_VEHICLE_CROSS_ROADGAP", + "children": [], + "level": 3 + }, + { + "id": "LARGE_VEHICLE_CROSS_LEFT_TURN", + "label": "LARGE_VEHICLE_CROSS_LEFT_TURN", + "children": [], + "level": 3 + }, + { + "id": "GO_STRAIGHT_LARGE_VEHICLE_CROSS_DURING_REVERSING", + "label": "GO_STRAIGHT_LARGE_VEHICLE_CROSS_DURING_REVERSING", + "children": [], + "level": 3 + }, + { + "id": "LARGE_VEHICLE_CROSS_GO_STRAIGHT", + "label": "LARGE_VEHICLE_CROSS_GO_STRAIGHT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "VRU_CROSS_HANDLING", + "label": "VRU_CROSS_HANDLING", + "children": [ + { + "id": "VRU_CROSS_FAR", + "label": "VRU_CROSS_FAR", + "children": [], + "level": 3 + }, + { + "id": "OCCLUSION_VRU_CROSS", + "label": "OCCLUSION_VRU_CROSS", + "children": [ + { + "id": "OCCLUDEDBYCAR_VRU_CROSS", + "label": "OCCLUDEDBYCAR_VRU_CROSS", + "children": [], + "level": 4 + }, + { + "id": "OCCLUDEDBYWALL_VRU_CROSS", + "label": "OCCLUDEDBYWALL_VRU_CROSS", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "VRU_CROSS_IN_ROAD_GAP", + "label": "VRU_CROSS_IN_ROAD_GAP", + "children": [], + "level": 3 + }, + { + "id": "VRU_CROSS_GO_STRAIGHT", + "label": "VRU_CROSS_GO_STRAIGHT", + "children": [], + "level": 3 + }, + { + "id": "VRU_CROSS_LEFT_TURN ", + "label": "VRU_CROSS_LEFT_TURN ", + "children": [], + "level": 3 + }, + { + "id": "VRU_CROSS_RIGHT_TURN ", + "label": "VRU_CROSS_RIGHT_TURN ", + "children": [], + "level": 3 + }, + { + "id": "VRU_CROSS_CLOSE", + "label": "VRU_CROSS_CLOSE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "SMALL_VEHICLE_CROSS_HANDLING", + "label": "SMALL_VEHICLE_CROSS_HANDLING", + "children": [ + { + "id": "SMALL_VEHICLE_CROSS_GO_STRAIGHT_ROADGAP", + "label": "SMALL_VEHICLE_CROSS_GO_STRAIGHT_ROADGAP", + "children": [], + "level": 3 + }, + { + "id": "SMALL_VEHICLE_CROSS_DURING_UTURN", + "label": "SMALL_VEHICLE_CROSS_DURING_UTURN", + "children": [], + "level": 3 + }, + { + "id": "SMALL_VEHICLE_CROSS_LEFT_TURN", + "label": "SMALL_VEHICLE_CROSS_LEFT_TURN", + "children": [], + "level": 3 + }, + { + "id": "SMALL_VEHICLE_CROSS_RIGHT_TURN", + "label": "SMALL_VEHICLE_CROSS_RIGHT_TURN", + "children": [], + "level": 3 + }, + { + "id": "SMALL_VEHICLE_CROSS_TRAFFIC_JAM", + "label": "SMALL_VEHICLE_CROSS_TRAFFIC_JAM", + "children": [], + "level": 3 + }, + { + "id": "SMALL_VEHICLE_CROSS_GO_STRAIGHT", + "label": "SMALL_VEHICLE_CROSS_GO_STRAIGHT", + "children": [], + "level": 3 + }, + { + "id": "OCCLUDED_SMALL_VEHICLE_CROSS_GO_STRAIGHT", + "label": "OCCLUDED_SMALL_VEHICLE_CROSS_GO_STRAIGHT", + "children": [], + "level": 3 + }, + { + "id": "SMALL_VEHICLE_CROSS_DURING_REVERSING", + "label": "SMALL_VEHICLE_CROSS_DURING_REVERSING", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "ROUNDABOUT_DRIVING", + "label": "ROUNDABOUT_DRIVING", + "children": [ + { + "id": "ROUNDABOUT_ENTRY", + "label": "ROUNDABOUT_ENTRY", + "children": [], + "level": 2 + }, + { + "id": "ROUNDABOUT_EXIT", + "label": "ROUNDABOUT_EXIT", + "children": [ + { + "id": "ROUNDABOUT_1ST_EXIT", + "label": "ROUNDABOUT_1ST_EXIT", + "children": [ + { + "id": "ROUNDABOUT_1ST_EXIT_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_1ST_EXIT_TRAFFIC_LIGHT", + "children": [], + "level": 4 + }, + { + "id": "ROUNDABOUT_1ST_EXIT_NO_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_1ST_EXIT_NO_TRAFFIC_LIGHT", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "ROUNDABOUT_3RD_EXIT", + "label": "ROUNDABOUT_3RD_EXIT", + "children": [ + { + "id": "ROUNDABOUT_3RD_EXIT_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_3RD_EXIT_TRAFFIC_LIGHT", + "children": [], + "level": 4 + }, + { + "id": "ROUNDABOUT_3RD_EXIT_NO_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_3RD_EXIT_NO_TRAFFIC_LIGHT", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "ROUNDABOUT_4TH_EXIT", + "label": "ROUNDABOUT_4TH_EXIT", + "children": [ + { + "id": "ROUNDABOUT_4TH_EXIT_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_4TH_EXIT_TRAFFIC_LIGHT", + "children": [], + "level": 4 + }, + { + "id": "ROUNDABOUT_4TH_EXIT_NO_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_4TH_EXIT_NO_TRAFFIC_LIGHT", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "ROUNDABOUT_2ND_EXIT", + "label": "ROUNDABOUT_2ND_EXIT", + "children": [ + { + "id": "ROUNDABOUT_2ND_EXIT_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_2ND_EXIT_TRAFFIC_LIGHT", + "children": [], + "level": 4 + }, + { + "id": "ROUNDABOUT_2ND_EXIT_NO_TRAFFIC_LIGHT", + "label": "ROUNDABOUT_2ND_EXIT_NO_TRAFFIC_LIGHT", + "children": [], + "level": 4 + } + ], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "ROUNDABOUT_LANE_CHANGE", + "label": "ROUNDABOUT_LANE_CHANGE", + "children": [], + "level": 2 + }, + { + "id": "ROUNDABOUT_LIGHT_STOP_AND_GO", + "label": "ROUNDABOUT_LIGHT_STOP_AND_GO", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CRUISE_MOTION", + "label": "CRUISE_MOTION", + "children": [ + { + "id": "CRUISE_MOTION_DECEL", + "label": "CRUISE_MOTION_DECEL", + "children": [ + { + "id": "CRUISE_MOTION_ACTIVATE_FASTER_THAN_SETSPD_DECEL", + "label": "CRUISE_MOTION_ACTIVATE_FASTER_THAN_SETSPD_DECEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_DRIVER_OVR_CC_THEN_RELEASE_DECEL", + "label": "CRUISE_MOTION_DRIVER_OVR_CC_THEN_RELEASE_DECEL", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_MOTION_SLOPE", + "label": "CRUISE_MOTION_SLOPE", + "children": [ + { + "id": "CRUISE_MOTION_SLOWDOWN_DESCEND_DECEL", + "label": "CRUISE_MOTION_SLOWDOWN_DESCEND_DECEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_SPEEDUP_ ASCEND_ACCEL", + "label": "CRUISE_MOTION_SPEEDUP_ ASCEND_ACCEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_CCMODE_KEEP_SETSPD", + "label": "CRUISE_MOTION_CCMODE_KEEP_SETSPD", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_MOTION_ACCEL", + "label": "CRUISE_MOTION_ACCEL", + "children": [ + { + "id": "CRUISE_MOTION_STARTUP_SETSPD_50KPH_ACCEL", + "label": "CRUISE_MOTION_STARTUP_SETSPD_50KPH_ACCEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_CUTOUT_BEHIND_SLOW_RPV_ACCEL", + "label": "CRUISE_MOTION_CUTOUT_BEHIND_SLOW_RPV_ACCEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_ACTIVATE_SLOWER_THAN_SETSPD_ACCEL", + "label": "CRUISE_MOTION_ACTIVATE_SLOWER_THAN_SETSPD_ACCEL", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "CRUISE_MOTION_SETSPD", + "label": "CRUISE_MOTION_SETSPD", + "children": [ + { + "id": "CRUISE_MOTION_SETSPD_DECREASE_MORETHAN_10KPH_DECEL", + "label": "CRUISE_MOTION_SETSPD_DECREASE_MORETHAN_10KPH_DECEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_SETSPD_INCREASE_EQUAL_10KPH_ACCEL", + "label": "CRUISE_MOTION_SETSPD_INCREASE_EQUAL_10KPH_ACCEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_SETSPD_INCREASE_MORETHAN_10KPH_ACCEL", + "label": "CRUISE_MOTION_SETSPD_INCREASE_MORETHAN_10KPH_ACCEL", + "children": [], + "level": 3 + }, + { + "id": "CRUISE_MOTION_SETSPD_DECREASE_EQUAL_10KPH_DECEL", + "label": "CRUISE_MOTION_SETSPD_DECREASE_EQUAL_10KPH_DECEL", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CRUISE_TRAFFIC_JAM_APPROACH", + "label": "CRUISE_TRAFFIC_JAM_APPROACH", + "children": [ + { + "id": "CRUISE_TRAFFIC_JAM_APPROACH_MODERATE_TARGET_SPEED", + "label": "CRUISE_TRAFFIC_JAM_APPROACH_MODERATE_TARGET_SPEED", + "children": [], + "level": 2 + }, + { + "id": "CRUISE_TRAFFIC_JAM_APPROACH_SLOW_TARGET_SPEED", + "label": "CRUISE_TRAFFIC_JAM_APPROACH_SLOW_TARGET_SPEED", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "OBJECT_CUTIN", + "label": "OBJECT_CUTIN", + "children": [ + { + "id": "OBJECT_CUTIN_SMALL_VEHICLES", + "label": "OBJECT_CUTIN_SMALL_VEHICLES", + "children": [ + { + "id": "OBJECT_CUTIN_HIGH_LATERAL_SPEED", + "label": "OBJECT_CUTIN_HIGH_LATERAL_SPEED", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_CUTIN_BIG_VEHICLES", + "label": "OBJECT_CUTIN_BIG_VEHICLES", + "children": [ + { + "id": "OBJECT_CUTIN_BIG_VEHICLES_PARTLY_ON_SIDE_WHEN_CUTTING_IN", + "label": "OBJECT_CUTIN_BIG_VEHICLES_PARTLY_ON_SIDE_WHEN_CUTTING_IN", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_CUTIN_BIG_VEHICLES_COMPLETELY_POSITIONED_IN_FRONT", + "label": "OBJECT_CUTIN_BIG_VEHICLES_COMPLETELY_POSITIONED_IN_FRONT", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_CUTIN_STOP_AND_GO_TRAFFIC", + "label": "OBJECT_CUTIN_STOP_AND_GO_TRAFFIC", + "children": [ + { + "id": "OBJECT_CUTIN_STOP_AND_GO_TRAFFIC_CUTIN_OBJ", + "label": "OBJECT_CUTIN_STOP_AND_GO_TRAFFIC_CUTIN_OBJ", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_CUTIN_STOP_AND_GO_TRAFFIC_FOLLOW_DENSLY", + "label": "OBJECT_CUTIN_STOP_AND_GO_TRAFFIC_FOLLOW_DENSLY", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_CUTIN_REGULAR_VEHICLES", + "label": "OBJECT_CUTIN_REGULAR_VEHICLES", + "children": [ + { + "id": "OBJECT_CUTIN_FLUENT_TRAFFIC_CUTIN_FASTER_THAN_EGO", + "label": "OBJECT_CUTIN_FLUENT_TRAFFIC_CUTIN_FASTER_THAN_EGO", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_CUTIN_SUDDEN_AND_CLOSE_CUTIN", + "label": "OBJECT_CUTIN_SUDDEN_AND_CLOSE_CUTIN", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_CUTIN_FLUENT_TRAFFIC_SAME_SPD_SHORT_DIST", + "label": "OBJECT_CUTIN_FLUENT_TRAFFIC_SAME_SPD_SHORT_DIST", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_CUTIN_SLOW_OBJ_ON_ADJ_LANE_AHEAD_OF_CUTIN", + "label": "OBJECT_CUTIN_SLOW_OBJ_ON_ADJ_LANE_AHEAD_OF_CUTIN", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_CUTIN_FLUENT_TRAFFIC_SAME_SPD_REGULAR_DIST", + "label": "OBJECT_CUTIN_FLUENT_TRAFFIC_SAME_SPD_REGULAR_DIST", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_CHANGE_INTERACTION", + "label": "LANE_CHANGE_INTERACTION", + "children": [ + { + "id": "LANE_CHANGE_INTERACTION_DRIVER_TRIGGER", + "label": "LANE_CHANGE_INTERACTION_DRIVER_TRIGGER", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "OBJECT_PERCEPTION_TYPES", + "label": "OBJECT_PERCEPTION_TYPES", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_OVERRIDABLE_OBSTACLES", + "label": "OBJECT_PERCEPTION_TYPES_OVERRIDABLE_OBSTACLES", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_SPEEDBUMPERS_LOAD_LEASHES", + "label": "OBJECT_PERCEPTION_TYPES_SPEEDBUMPERS_LOAD_LEASHES", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_SPEEDBUMPERS", + "label": "OBJECT_PERCEPTION_TYPES_SPEEDBUMPERS", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_PLASTICBAGS", + "label": "OBJECT_PERCEPTION_TYPES_PLASTICBAGS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_VEHICLES_MOVING_TOWARDS_EGO", + "label": "OBJECT_PERCEPTION_TYPES_VEHICLES_MOVING_TOWARDS_EGO", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_VEHICLES_DRIVING_BACKWARDS_TOWARDS_EGO", + "label": "OBJECT_PERCEPTION_TYPES_VEHICLES_DRIVING_BACKWARDS_TOWARDS_EGO", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_VEHICLES_ASCEND_ROLL_BACKWARDS_FROM_STANDSTILL", + "label": "OBJECT_PERCEPTION_TYPES_VEHICLES_ASCEND_ROLL_BACKWARDS_FROM_STANDSTILL", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_ONCOMING VEHICLES", + "label": "OBJECT_PERCEPTION_TYPES_ONCOMING VEHICLES", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_VEHICLES_DRIVING_WRONG_DIRECTION_TOWARDS_EGO", + "label": "OBJECT_PERCEPTION_TYPES_VEHICLES_DRIVING_WRONG_DIRECTION_TOWARDS_EGO", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_VEHICLES_SEVERAL_OBJECTS_ON_EGO_DRIVING_LANE", + "label": "OBJECT_PERCEPTION_TYPES_VEHICLES_SEVERAL_OBJECTS_ON_EGO_DRIVING_LANE", + "children": [], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPESVRUs", + "label": "OBJECT_PERCEPTION_TYPESVRUs", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_PEDESTRIANS", + "label": "OBJECT_PERCEPTION_TYPES_PEDESTRIANS", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_BICYCLES_ESCOOTERS", + "label": "OBJECT_PERCEPTION_TYPES_BICYCLES_ESCOOTERS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_TRICYCLES", + "label": "OBJECT_PERCEPTION_TYPES_TRICYCLES", + "children": [], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_VEHICLES_WITH_LOAD_EXCEEDING_LOADING_AREA", + "label": "OBJECT_PERCEPTION_TYPES_VEHICLES_WITH_LOAD_EXCEEDING_LOADING_AREA", + "children": [], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_BUS", + "label": "OBJECT_PERCEPTION_TYPES_BUS", + "children": [], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_TRUCKS", + "label": "OBJECT_PERCEPTION_TYPES_TRUCKS", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_TOWTRUCK_TOWING_VEHICLES", + "label": "OBJECT_PERCEPTION_TYPES_TOWTRUCK_TOWING_VEHICLES", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_TARPAULIN_TRAILERS", + "label": "OBJECT_PERCEPTION_TYPES_TARPAULIN_TRAILERS", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_FLAT_EMPTY_TRAILERS", + "label": "OBJECT_PERCEPTION_TYPES_FLAT_EMPTY_TRAILERS", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_TARPAULIN_TRAILERS_WITH_VEHICLE_IMAGES", + "label": "OBJECT_PERCEPTION_TYPES_TARPAULIN_TRAILERS_WITH_VEHICLE_IMAGES", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_NON_OVERRIDABLE_OBSTACLES", + "label": "OBJECT_PERCEPTION_TYPES_NON_OVERRIDABLE_OBSTACLES", + "children": [ + { + "id": "OBJECT_PERCEPTION_TYPES_WHEEL", + "label": "OBJECT_PERCEPTION_TYPES_WHEEL", + "children": [], + "level": 3 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_WASHING_MASCHINE_SIZED_OBJECTS", + "label": "OBJECT_PERCEPTION_TYPES_WASHING_MASCHINE_SIZED_OBJECTS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "OBJECT_PERCEPTION_TYPES_MOTORCYCLES", + "label": "OBJECT_PERCEPTION_TYPES_MOTORCYCLES", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "LANE_CHANGE_OVERTAKE", + "label": "LANE_CHANGE_OVERTAKE", + "children": [ + { + "id": "LANE_CHANGE_OVERTAKE_SMALL_VEHICLE", + "label": "LANE_CHANGE_OVERTAKE_SMALL_VEHICLE", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_OVERTAKE_BICYCLIST", + "label": "LANE_CHANGE_OVERTAKE_BICYCLIST", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_OVERTAKE_LARGE_VEHICLE", + "label": "LANE_CHANGE_OVERTAKE_LARGE_VEHICLE", + "children": [], + "level": 2 + }, + { + "id": "LANE_CHANGE_OVERTAKE_TRICYCLIST", + "label": "LANE_CHANGE_OVERTAKE_TRICYCLIST", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CLOSING_ADJACENT_LANE", + "label": "CLOSING_ADJACENT_LANE", + "children": [ + { + "id": "CLOSING_ADJACENT_LANE_LANE_CHANGE_POSSIBLE", + "label": "CLOSING_ADJACENT_LANE_LANE_CHANGE_POSSIBLE", + "children": [], + "level": 2 + }, + { + "id": "CLOSING_ADJACENT_LANE_HEAVY_TRAFFIC_COOPERATRIVE_DRIVING", + "label": "CLOSING_ADJACENT_LANE_HEAVY_TRAFFIC_COOPERATRIVE_DRIVING", + "children": [], + "level": 2 + }, + { + "id": "CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE", + "label": "CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE", + "children": [ + { + "id": "CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE_GET_INFRONT_OBJECT", + "label": "CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE_GET_INFRONT_OBJECT", + "children": [], + "level": 3 + }, + { + "id": "CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE_KEEP_BEHIND_OBJECT", + "label": "CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE_KEEP_BEHIND_OBJECT", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "CONSTRUCTION_SITE", + "label": "CONSTRUCTION_SITE", + "children": [ + { + "id": "CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_PLASTIC_BARRIER", + "label": "CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_PLASTIC_BARRIER", + "children": [], + "level": 2 + }, + { + "id": "CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_CONE", + "label": "CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_CONE", + "children": [], + "level": 2 + }, + { + "id": "CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_CONE", + "label": "CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_CONE", + "children": [], + "level": 2 + }, + { + "id": "CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_PLASTIC_BARRIER", + "label": "CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_PLASTIC_BARRIER", + "children": [], + "level": 2 + }, + { + "id": "CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_WORKZONE_BOARD", + "label": "CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_WORKZONE_BOARD", + "children": [], + "level": 2 + }, + { + "id": "CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_WORKZONE_BOARD", + "label": "CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_WORKZONE_BOARD", + "children": [], + "level": 2 + }, + { + "id": "CONSTRUCTION_SITE_FOLLOW_CHICANE_LANE", + "label": "CONSTRUCTION_SITE_FOLLOW_CHICANE_LANE", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "EGO_LANE_PENETRATION", + "label": "EGO_LANE_PENETRATION", + "children": [ + { + "id": "PENETRATION_POST_TOLL_BOOTH", + "label": "PENETRATION_POST_TOLL_BOOTH", + "children": [], + "level": 2 + }, + { + "id": "PENETRATION_STANDING_VEH_ON_SHOULDER_REMARKABLE_OVERLAP", + "label": "PENETRATION_STANDING_VEH_ON_SHOULDER_REMARKABLE_OVERLAP", + "children": [], + "level": 2 + }, + { + "id": "PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP", + "label": "PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP", + "children": [ + { + "id": "PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP_WITH_DRIVING_AGENTS", + "label": "PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP_WITH_DRIVING_AGENTS", + "children": [], + "level": 3 + }, + { + "id": "PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP_NO_OTHER_AGENTS", + "label": "PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP_NO_OTHER_AGENTS", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "PENETRATION_STANDING_VEH_ON_SHOULDER_MAJOR_OVERLAP", + "label": "PENETRATION_STANDING_VEH_ON_SHOULDER_MAJOR_OVERLAP", + "children": [], + "level": 2 + }, + { + "id": "PENETRATION_WIDE_LANE_SMALL_VEHICLE_NO_OVERTAKE", + "label": "PENETRATION_WIDE_LANE_SMALL_VEHICLE_NO_OVERTAKE", + "children": [], + "level": 2 + }, + { + "id": "PENETRATION_STANDING_VEH_ON_SHOULDER_MINOR_OVERLAP", + "label": "PENETRATION_STANDING_VEH_ON_SHOULDER_MINOR_OVERLAP", + "children": [], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "INTERSECTION", + "label": "INTERSECTION", + "children": [ + { + "id": "INTERSECTION_RIGHT_TURN", + "label": "INTERSECTION_RIGHT_TURN", + "children": [ + { + "id": "INTERSECTION_RIGHT_TURN_1ST_LEFT_LANE", + "label": "INTERSECTION_RIGHT_TURN_1ST_LEFT_LANE", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_RIGHT_TURN_1ST_RIGHT_LANE", + "label": "INTERSECTION_RIGHT_TURN_1ST_RIGHT_LANE", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_RIGHT_TURN_DEDICATED_LANE", + "label": "INTERSECTION_RIGHT_TURN_DEDICATED_LANE", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_RIGHT_TURN_2ND_RIGHT_LANE", + "label": "INTERSECTION_RIGHT_TURN_2ND_RIGHT_LANE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "INTERSECTION_LEFT_TURN", + "label": "INTERSECTION_LEFT_TURN", + "children": [ + { + "id": "INTERSECTION_LEFT_TURN_MOSTRIGHT_LANE", + "label": "INTERSECTION_LEFT_TURN_MOSTRIGHT_LANE", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_LEFT_TURN_1ST_LEFT_LANE", + "label": "INTERSECTION_LEFT_TURN_1ST_LEFT_LANE", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_LEFT_TURN_WAITING_AREA", + "label": "INTERSECTION_LEFT_TURN_WAITING_AREA", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_LEFT_TURN_3RD_LEFT_LANE", + "label": "INTERSECTION_LEFT_TURN_3RD_LEFT_LANE", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_LEFT_TURN_UNPROTECTED", + "label": "INTERSECTION_LEFT_TURN_UNPROTECTED", + "children": [], + "level": 3 + }, + { + "id": "INTERSECTION_LEFT_TURN_2ND_LEFT_LANE", + "label": "INTERSECTION_LEFT_TURN_2ND_LEFT_LANE", + "children": [], + "level": 3 + } + ], + "level": 2 + }, + { + "id": "INTERSECTION_GO_STRAIGHT", + "label": "INTERSECTION_GO_STRAIGHT", + "children": [ + { + "id": "INTERSECTION_GO_STRAIGHT_WITH_STRAIGHT_TRANSFER_AREA", + "label": "INTERSECTION_GO_STRAIGHT_WITH_STRAIGHT_TRANSFER_AREA", + "children": [], + "level": 3 + }, + { + "id": "UNALIGNED_INTERSECTION_GO_STRAIGHT", + "label": "UNALIGNED_INTERSECTION_GO_STRAIGHT", + "children": [ + { + "id": "UNALIGNED_INTERSECTION_GO_STRAIGHT_M2N", + "label": "UNALIGNED_INTERSECTION_GO_STRAIGHT_M2N", + "children": [], + "level": 4 + }, + { + "id": "UNALIGNED_INTERSECTION_GO_STRAIGHT_N2N", + "label": "UNALIGNED_INTERSECTION_GO_STRAIGHT_N2N", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "ALIGNED_INTERSECTION_GO_STRAIGHT", + "label": "ALIGNED_INTERSECTION_GO_STRAIGHT", + "children": [ + { + "id": "ALIGNED_INTERSECTION_GO_STRAIGHT_N2N", + "label": "ALIGNED_INTERSECTION_GO_STRAIGHT_N2N", + "children": [], + "level": 4 + }, + { + "id": "ALIGNED_INTERSECTION_GO_STRAIGHT_M2N", + "label": "ALIGNED_INTERSECTION_GO_STRAIGHT_M2N", + "children": [], + "level": 4 + } + ], + "level": 3 + }, + { + "id": "INTERSECTION_GO_STRAIGHT_MULTI_EXITS", + "label": "INTERSECTION_GO_STRAIGHT_MULTI_EXITS", + "children": [], + "level": 3 + } + ], + "level": 2 + } + ], + "level": 1 + }, + { + "id": "APA_perpendicular_manuvour", + "label": "APA_perpendicular_manuvour", + "children": [], + "level": 1 + }, + { + "id": "APA_MANEUVERING_PERPENDICULAR_REAR_IN", + "label": "APA_MANEUVERING_PERPENDICULAR_REAR_IN", + "children": [], + "level": 1 + }, + { "id": "TSA_HIGHWAY", "label": "TSA_HIGHWAY", "children": [], "level": 1 } + ], + "level": 0 +} + + + +vlm_data={ + "code": 200, + "data": [ + { + "extInfo": { + "_id": { + "$oid": "68aec52c01214c8cc3c70bee" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250802-161238_0.bag.dir/camera_front_wide/1096211220185.jpg", + "filename": "1096211220185.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250802-161238_0.bag", + "sequence": "107/299", + "updateTime": "2025-08-27 16:43:24", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-02 16:12:38", + "location": "31.5709611 | 120.191315104", + "altitude": 0, + "velocity": 0.002 + }, + "filename": "1096211220185.jpg", + "sim": 0.6916784644126892, + "_id": "68b122407462577af35da0a6", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b95415fe2ec03aafbdb673" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_hmi_console_event_20250827-182132_0.bag.dir/camera_front_wide/1635981711300.jpg", + "filename": "1635981711300.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_hmi_console_event_20250827-182132_0.bag", + "sequence": "48/293", + "updateTime": "2025-09-04 16:55:49", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-27 18:21:32", + "location": "29.302628309 | 106.68205268", + "altitude": 0, + "velocity": 3.029 + }, + "filename": "1635981711300.jpg", + "sim": 0.6898674964904785, + "_id": "68ba3f4d4aba36292559b4b1", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aec24e01214c8cc3c709f3" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250801-171103_0.bag.dir/camera_front_wide/1085139453323.jpg", + "filename": "1085139453323.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250801-171103_0.bag", + "sequence": "229/296", + "updateTime": "2025-08-27 16:31:10", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-01 17:11:03", + "location": "31.578819444 | 120.331965061", + "altitude": 0, + "velocity": 0.63 + }, + "filename": "1085139453323.jpg", + "sim": 0.6897129416465759, + "_id": "68b122407462577af35d9f6d", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aecf3701214c8cc3c7148b" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250805-154901_0.bag.dir/camera_front_wide/1144654293142.jpg", + "filename": "1144654293142.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250805-154901_0.bag", + "sequence": "102/298", + "updateTime": "2025-08-27 17:26:15", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-05 15:49:01", + "location": "31.609542643 | 120.304967177", + "altitude": 0, + "velocity": 1.297 + }, + "filename": "1144654293142.jpg", + "sim": 0.6890431046485901, + "_id": "68b122407462577af35da6a8", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68c24d9d63d8efdd3fa75b86" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250831-140139_0.bag.dir/camera_front_wide/1727999766937.jpg", + "filename": "1727999766937.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250831-140139_0.bag", + "sequence": "36/299", + "updateTime": "2025-09-11 12:18:37", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-31 14:01:39", + "location": "29.527240668 | 106.621455078", + "altitude": 0, + "velocity": 1.019 + }, + "filename": "1727999766937.jpg", + "sim": 0.688818097114563, + "_id": "68c377084b825ca1e1035358", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aebf4101214c8cc3c707f1" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250801-141433_0.bag.dir/camera_front_wide/1074532453327.jpg", + "filename": "1074532453327.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250801-141433_0.bag", + "sequence": "49/295", + "updateTime": "2025-08-27 16:18:09", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-01 14:14:33", + "location": "31.574161241 | 120.194082845", + "altitude": 0, + "velocity": 0.004 + }, + "filename": "1074532453327.jpg", + "sim": 0.6883004903793335, + "_id": "68b122407462577af35d9e39", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aee09501214c8cc3c7220a" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250807-183745_0.bag.dir/camera_front_wide/1224732677457.jpg", + "filename": "1224732677457.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250807-183745_0.bag", + "sequence": "268/290", + "updateTime": "2025-08-27 18:40:21", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-07 18:37:45", + "location": "31.276904839 | 121.659675836", + "altitude": 0, + "velocity": 10.683 + }, + "filename": "1224732677457.jpg", + "sim": 0.6880314946174622, + "_id": "68b122407462577af35daf84", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aeeec901214c8cc3c72c88" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250812-174852_0.bag.dir/camera_front_wide/1333794992147.jpg", + "filename": "1333794992147.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250812-174852_0.bag", + "sequence": "9/297", + "updateTime": "2025-08-27 19:40:57", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-12 17:48:52", + "location": "31.049188368 | 121.734710558", + "altitude": 0, + "velocity": 9.602 + }, + "filename": "1333794992147.jpg", + "sim": 0.6879897117614746, + "_id": "68b122407462577af35db62b", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aec88601214c8cc3c70e9d" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250802-181908_0.bag.dir/camera_front_wide/1103800420176.jpg", + "filename": "1103800420176.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250802-181908_0.bag", + "sequence": "99/293", + "updateTime": "2025-08-27 16:57:42", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-02 18:19:08", + "location": "31.551714138 | 120.232113173", + "altitude": 0, + "velocity": 5.681 + }, + "filename": "1103800420176.jpg", + "sim": 0.6878664493560791, + "_id": "68b122407462577af35da276", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68c2469863d8efdd3fa7544e" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250829-163407_0.bag.dir/camera_front_wide/1688033116392.jpg", + "filename": "1688033116392.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250829-163407_0.bag", + "sequence": "7/293", + "updateTime": "2025-09-11 11:48:40", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-29 16:34:07", + "location": "29.348034939 | 106.439004178", + "altitude": 0, + "velocity": 2.894 + }, + "filename": "1688033116392.jpg", + "sim": 0.6876133680343628, + "_id": "68c377084b825ca1e1034e38", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aee3ba01214c8cc3c72437" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250809-150620_0.bag.dir/camera_front_wide/1270454415437.jpg", + "filename": "1270454415437.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250809-150620_0.bag", + "sequence": "300/300", + "updateTime": "2025-08-27 18:53:46", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-09 15:06:20", + "location": "31.373269586 | 121.27126926", + "altitude": 0, + "velocity": 5.591 + }, + "filename": "1270454415437.jpg", + "sim": 0.687574028968811, + "_id": "68b122407462577af35db0d9", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aee3c401214c8cc3c72441" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250809-151150_0.bag.dir/camera_front_wide/1270776915521.jpg", + "filename": "1270776915521.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250809-151150_0.bag", + "sequence": "225/299", + "updateTime": "2025-08-27 18:53:56", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-09 15:11:50", + "location": "31.371829427 | 121.266291233", + "altitude": 0, + "velocity": 0.001 + }, + "filename": "1270776915521.jpg", + "sim": 0.6875728964805603, + "_id": "68b122407462577af35db0de", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aedb9601214c8cc3c71e25" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250807-145115_0.bag.dir/camera_front_wide/1211128677439.jpg", + "filename": "1211128677439.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250807-145115_0.bag", + "sequence": "119/293", + "updateTime": "2025-08-27 18:19:02", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-07 14:51:15", + "location": "31.291532661 | 121.661435276", + "altitude": 0, + "velocity": 7.835 + }, + "filename": "1211128677439.jpg", + "sim": 0.6873101592063904, + "_id": "68b122407462577af35dacf1", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aebcfa01214c8cc3c70651" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250801-124733_0.bag.dir/camera_front_wide/1069332053314.jpg", + "filename": "1069332053314.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250801-124733_0.bag", + "sequence": "245/299", + "updateTime": "2025-08-27 16:08:26", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-01 12:47:33", + "location": "31.572686089 | 120.310155979", + "altitude": 0, + "velocity": 6.372 + }, + "filename": "1069332053314.jpg", + "sim": 0.6871950626373291, + "_id": "68b122407462577af35d9d31", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aee0b901214c8cc3c7221e" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250807-184115_0.bag.dir/camera_front_wide/1224924177446.jpg", + "filename": "1224924177446.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250807-184115_0.bag", + "sequence": "93/301", + "updateTime": "2025-08-27 18:40:57", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-07 18:41:15", + "location": "31.277086046 | 121.668291829", + "altitude": 0, + "velocity": 3.477 + }, + "filename": "1224924177446.jpg", + "sim": 0.687128484249115, + "_id": "68b122407462577af35daf91", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aeeeba01214c8cc3c72c84" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250812-174752_0.bag.dir/camera_front_wide/1333745092155.jpg", + "filename": "1333745092155.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250812-174752_0.bag", + "sequence": "110/298", + "updateTime": "2025-08-27 19:40:42", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-12 17:47:52", + "location": "31.052441406 | 121.735291612", + "altitude": 0, + "velocity": 0.071 + }, + "filename": "1333745092155.jpg", + "sim": 0.6867069005966187, + "_id": "68b122407462577af35db629", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68c24c6563d8efdd3fa75a38" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250830-141543_0.bag.dir/camera_front_wide/1707190633363.jpg", + "filename": "1707190633363.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250830-141543_0.bag", + "sequence": "52/300", + "updateTime": "2025-09-11 12:13:25", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-30 14:15:43", + "location": "29.389651964 | 106.515253092", + "altitude": 0, + "velocity": 6.905 + }, + "filename": "1707190633363.jpg", + "sim": 0.6867032051086426, + "_id": "68c377084b825ca1e1035269", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aebc1101214c8cc3c7059e" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250802-142838_0.bag.dir/camera_front_wide/1089990020168.jpg", + "filename": "1089990020168.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250802-142838_0.bag", + "sequence": "285/294", + "updateTime": "2025-08-27 16:04:33", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-02 14:28:38", + "location": "31.578880208 | 120.33214464", + "altitude": 0, + "velocity": 0.08 + }, + "filename": "1089990020168.jpg", + "sim": 0.42667558789253235, + "_id": "68b103a475b7a887359523a5", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aec52901214c8cc3c70be7" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250802-160938_0.bag.dir/camera_front_wide/1096029620192.jpg", + "filename": "1096029620192.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250802-160938_0.bag", + "sequence": "91/300", + "updateTime": "2025-08-27 16:43:21", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-02 16:09:38", + "location": "31.56832628 | 120.192959256", + "altitude": 0, + "velocity": 0.183 + }, + "filename": "1096029620192.jpg", + "sim": 0.4255579113960266, + "_id": "68b122407462577af35da0a2", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68c251ac63d8efdd3fa76052" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250831-171509_0.bag.dir/camera_front_wide/1739626666959.jpg", + "filename": "1739626666959.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250831-171509_0.bag", + "sequence": "214/299", + "updateTime": "2025-09-11 12:35:56", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-31 17:15:09", + "location": "29.549237196 | 106.631232096", + "altitude": 0, + "velocity": 0.206 + }, + "filename": "1739626666959.jpg", + "sim": 0.42510342597961426, + "_id": "68c377084b825ca1e10356f9", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b94f6ffe2ec03aafbdb43c" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250827-192923_0.bag.dir/camera_front_wide/1640069511293.jpg", + "filename": "1640069511293.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250827-192923_0.bag", + "sequence": "226/297", + "updateTime": "2025-09-04 16:35:59", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-27 19:29:23", + "location": "29.307907444 | 106.616621636", + "altitude": 0, + "velocity": 3.362 + }, + "filename": "1640069511293.jpg", + "sim": 0.42480915784835815, + "_id": "68ba3f4d4aba36292559b32f", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b9401efe2ec03aafbda9cf" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250826-183244_0.bag.dir/camera_front_wide/1615515986246.jpg", + "filename": "1615515986246.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250826-183244_0.bag", + "sequence": "113/297", + "updateTime": "2025-09-04 15:30:38", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-26 18:32:44", + "location": "29.508341471 | 106.860632595", + "altitude": 0, + "velocity": 7.7 + }, + "filename": "1615515986246.jpg", + "sim": 0.42462146282196045, + "_id": "68ba3f4c4aba36292559aaf9", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b94f58fe2ec03aafbdb42e" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250827-192623_0.bag.dir/camera_front_wide/1639889411304.jpg", + "filename": "1639889411304.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250827-192623_0.bag", + "sequence": "225/297", + "updateTime": "2025-09-04 16:35:36", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-27 19:26:23", + "location": "29.303108181 | 106.618081868", + "altitude": 0, + "velocity": 0.434 + }, + "filename": "1639889411304.jpg", + "sim": 0.4243355393409729, + "_id": "68ba3f4d4aba36292559b326", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b9530ffe2ec03aafbdb5df" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_hmi_console_event_20250823-135805_0.bag.dir/camera_front_wide/1557182161551.jpg", + "filename": "1557182161551.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_hmi_console_event_20250823-135805_0.bag", + "sequence": "105/298", + "updateTime": "2025-09-04 16:51:27", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-23 13:58:05", + "location": "31.276628147 | 121.667883301", + "altitude": 0, + "velocity": 0.013 + }, + "filename": "1557182161551.jpg", + "sim": 0.42432811856269836, + "_id": "68ba3f4d4aba36292559b442", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68c24c7c63d8efdd3fa75a68" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250830-141943_0.bag.dir/camera_front_wide/1707447033361.jpg", + "filename": "1707447033361.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250830-141943_0.bag", + "sequence": "216/299", + "updateTime": "2025-09-11 12:13:48", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-30 14:19:43", + "location": "29.39560357 | 106.498536241", + "altitude": 0, + "velocity": 1.526 + }, + "filename": "1707447033361.jpg", + "sim": 0.42413461208343506, + "_id": "68c377084b825ca1e1035291", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68aed3c401214c8cc3c717a3" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250805-184701_0.bag.dir/camera_front_wide/1155334993153.jpg", + "filename": "1155334993153.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250805-184701_0.bag", + "sequence": "119/300", + "updateTime": "2025-08-27 17:45:40", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-05 18:47:01", + "location": "31.579005805 | 120.332031793", + "altitude": 0, + "velocity": 0.023 + }, + "filename": "1155334993153.jpg", + "sim": 0.4239332675933838, + "_id": "68b122407462577af35da88c", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68c246c963d8efdd3fa75482" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250829-164237_0.bag.dir/camera_front_wide/1688553416406.jpg", + "filename": "1688553416406.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250829-164237_0.bag", + "sequence": "110/293", + "updateTime": "2025-09-11 11:49:29", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-29 16:42:37", + "location": "29.338570421 | 106.434472656", + "altitude": 0, + "velocity": 1.957 + }, + "filename": "1688553416406.jpg", + "sim": 0.42333781719207764, + "_id": "68c377084b825ca1e1034e5d", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b92e33fe2ec03aafbd9a54" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250823-135555_0.bag.dir/camera_front_wide/1557062861551.jpg", + "filename": "1557062861551.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250823-135555_0.bag", + "sequence": "212/297", + "updateTime": "2025-09-04 14:14:11", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-23 13:55:55", + "location": "31.277041829 | 121.66828559", + "altitude": 0, + "velocity": 0.299 + }, + "filename": "1557062861551.jpg", + "sim": 0.42324307560920715, + "_id": "68ba3f4c4aba36292559a041", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b94f65fe2ec03aafbdb431" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250827-192723_0.bag.dir/camera_front_wide/1639949311302.jpg", + "filename": "1639949311302.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250827-192723_0.bag", + "sequence": "224/298", + "updateTime": "2025-09-04 16:35:49", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-27 19:27:23", + "location": "29.303089735 | 106.618105197", + "altitude": 0, + "velocity": 3.355 + }, + "filename": "1639949311302.jpg", + "sim": 0.42314666509628296, + "_id": "68ba3f4d4aba36292559b328", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b92e45fe2ec03aafbd9a5d" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250823-135655_0.bag.dir/camera_front_wide/1557111461536.jpg", + "filename": "1557111461536.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250823-135655_0.bag", + "sequence": "98/297", + "updateTime": "2025-09-04 14:14:29", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-23 13:56:55", + "location": "31.276690538 | 121.667999946", + "altitude": 0, + "velocity": 0.498 + }, + "filename": "1557111461536.jpg", + "sim": 0.42302602529525757, + "_id": "68ba3f4c4aba36292559a048", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68af1c5b01214c8cc3c75466" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250819-175151_0.bag.dir/camera_front_wide/1498630556252.jpg", + "filename": "1498630556252.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250819-175151_0.bag", + "sequence": "105/297", + "updateTime": "2025-08-27 22:55:23", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-19 17:51:51", + "location": "31.007894965 | 121.803248427", + "altitude": 0, + "velocity": 9.73 + }, + "filename": "1498630556252.jpg", + "sim": 0.42301303148269653, + "_id": "68b144094aba36292582f39e", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + }, + { + "extInfo": { + "_id": { + "$oid": "68b94f6cfe2ec03aafbdb439" + }, + "sensor": "Wide", + "raw": "mb_raw_rosbag_decode_dirs/PL162802_event_all_time_event_20250827-192853_0.bag.dir/camera_front_wide/1640030811274.jpg", + "filename": "1640030811274.jpg", + "video": "https://video.motionplaces.com/motionplaces.com-0044-c059.mp4", + "rosbag": "PL162802_event_all_time_event_20250827-192853_0.bag", + "sequence": "139/296", + "updateTime": "2025-09-04 16:35:56", + "vehicleId": "", + "city": "", + "incidentTime": "2025-08-27 19:28:53", + "location": "29.306822374 | 106.617701552", + "altitude": 0, + "velocity": 0.262 + }, + "filename": "1640030811274.jpg", + "sim": 0.4228503704071045, + "_id": "68ba3f4d4aba36292559b32d", + "model_name": "图片模型FT4", + "dataset_name": "MB_DC_2508", + "url": "https://images.pexels.com/photos/2325447/pexels-photo-2325447.jpeg", + "tags": [] + } + ] +} diff --git a/app/utils/fst_tree.py b/app/utils/fst_tree.py new file mode 100644 index 0000000..d223f15 --- /dev/null +++ b/app/utils/fst_tree.py @@ -0,0 +1,120 @@ +def build_tree(records): + """ + 构建带层级属性的树形结构 + 返回: 根节点字典 {id, name, children: [...], level} + """ + nodes = {} + root_candidates = set() # 存储可能的根节点ID [2,7](@ref) + + # 创建所有节点(暂不设置level) + for id_str, name, parent_id in records: + try: + node_id = int(id_str) + parent_id_val = int(parent_id) if parent_id and str(parent_id).isdigit() else None + + nodes[node_id] = { + 'id': node_id, + 'label': name, + 'children': [] # level属性稍后通过递归设置 + } + + # 标记根节点候选(父节点不存在或无效) + if parent_id_val is None or parent_id_val not in nodes: + root_candidates.add(node_id) + except (ValueError, TypeError): + continue + + # 构建父子关系 + for id_str, _, parent_id in records: + try: + node_id = int(id_str) + parent_id_val = int(parent_id) if parent_id and str(parent_id).isdigit() else None + + # 连接父子节点 + if parent_id_val in nodes and node_id in nodes: + nodes[parent_id_val]['children'].append(nodes[node_id]) + # 从根候选移除(有父节点说明不是根) + if node_id in root_candidates: + root_candidates.remove(node_id) + except (ValueError, TypeError): + continue + + # ============ 新增核心逻辑:递归设置层级属性 ============ + def set_node_level(node, current_level): + """递归设置节点层级属性(DFS深度优先遍历)[3,7](@ref)""" + node['level'] = current_level # 设置当前节点层级 + for child in node['children']: + set_node_level(child, current_level + 1) # 子节点层级+1 + + # 为所有根节点设置层级 + for root_id in root_candidates: + set_node_level(nodes[root_id], 0) # 根节点层级从0开始 + + # 返回第一个根节点(或None) + return nodes[next(iter(root_candidates))] if root_candidates else None + + +def build_sub_tree(records, target_parent_id=None): + """ + 构建带层级属性的树形结构 + + 参数: + records: 记录列表,格式为[(id_str, name, parent_id)] + target_parent_id: 指定的一级标签ID(作为子树根节点) + + 返回: + 带level属性的子树或完整树结构 + """ + nodes = {} + root_candidates = set() # 存储可能的根节点ID + + # 创建所有节点(暂不设置level) + for id_str, name, parent_id in records: + try: + node_id = int(id_str) + parent_id_val = int(parent_id) if parent_id and str(parent_id).isdigit() else None + + nodes[node_id] = { + 'id': node_id, + 'label': name, + 'children': [] # level属性稍后通过递归设置 + } + + if parent_id_val is None or parent_id_val not in nodes: + root_candidates.add(node_id) + except (ValueError, TypeError): + continue + + # 构建父子关系 + for id_str, _, parent_id in records: + try: + node_id = int(id_str) + parent_id_val = int(parent_id) if parent_id and str(parent_id).isdigit() else None + + if parent_id_val in nodes and node_id in nodes: + nodes[parent_id_val]['children'].append(nodes[node_id]) + if node_id in root_candidates: + root_candidates.remove(node_id) + except (ValueError, TypeError): + continue + + # ============ 新增核心逻辑:递归设置层级属性 ============ + def set_node_level(node, current_level): + """递归设置节点层级属性(DFS深度优先遍历)""" + node['level'] = current_level # 设置当前节点层级 + for child in node['children']: + set_node_level(child, current_level + 1) # 子节点层级+1[8](@ref) + + # 场景1:处理子树 + if target_parent_id is not None: + target_id = int(target_parent_id) + subtree_root = nodes.get(target_id) + if subtree_root: + set_node_level(subtree_root, 1) # 子树根节点从0开始 + return subtree_root + + # 场景2/3:处理完整树或森林 + for root_id in root_candidates: + set_node_level(nodes[root_id], 0) # 每个根节点从0开始[7](@ref) + + return nodes[next(iter(root_candidates))] if root_candidates else nodes \ No newline at end of file diff --git a/app/utils/get_vlm_token.py b/app/utils/get_vlm_token.py new file mode 100644 index 0000000..34e4f55 --- /dev/null +++ b/app/utils/get_vlm_token.py @@ -0,0 +1,29 @@ +import requests + + +class Demo: + def __init__(self): + self.api_key = "bX7pK9mR2nL4qF6s" # 用户的 API Key + self.api_secret = "eJ8wT3hY5cA2vN9uZ1xD7fG4" # 用户的 API Secret + self.host = "http://10.0.220.110" # 接口主地址 + self.headers = {"Content-Type": "application/json", "Authorization": ""} + + # 获取认证token + def getAuthToken(self): + # print("开始登录") + url = f"{self.host}/api/openapi/authenticate" + data = {"apiKey": self.api_key, "apiSecret": self.api_secret} + try: + response = requests.post(url, json=data) + response.raise_for_status() + result = response.json() + + if result["success"]: + self.headers["Authorization"] = f"Bearer {result['data']['token']}" + print("登录vlm成功") + return result["data"]["token"] + else: + raise Exception(f"登录失败: {result['message']}") + except requests.RequestException as e: + print(f"登录请求失败: {e}") + raise diff --git a/app/utils/log_record.py b/app/utils/log_record.py new file mode 100644 index 0000000..c958194 --- /dev/null +++ b/app/utils/log_record.py @@ -0,0 +1,104 @@ +from functools import wraps +from flask import request, g +import json + +from flask_jwt_extended import current_user +from app.models import OperationHistory, User + +from app import db,jwt + +def log_operation(func): + @wraps(func) + def decorated(*args, **kwargs): + log_entry = OperationHistory( + api_path=request.path, + http_method=request.method, + ip_address=request.remote_addr, + request_params=None + # 用户信息暂留空 + ) + # 记录GET参数 + if request.method == "GET": + log_entry.request_params = request.args.to_dict() + + # 记录POST参数(支持JSON/表单/原始数据) + elif request.method == "POST": + if request.is_json: + res=request.get_json(silent=True) or None + json_str = json.dumps(res,ensure_ascii=False) + log_entry.request_params = json_str + elif request.form: + json_str = json.dumps(request.form.to_dict(),ensure_ascii=False) + log_entry.request_params =json_str + elif request.data: + json_str = json.dumps({"raw_data": request.data.decode('utf-8')[:500]},ensure_ascii=False) + # 原始数据截取前500字符 + log_entry.request_params =json_str + + + try: + response = func(*args, **kwargs) # 执行原函数(触发 JWT 验证) + log_entry.user_id = current_user.id # 此时 current_user 已就绪 + log_entry.username = current_user.username + log_entry.response_code = response.status_code + return response + except Exception as e: + log_entry.error_message = str(e) + log_entry.operation_result = 0 + raise + finally: + db.session.add(log_entry) + db.session.commit() + return decorated + + +# def log_operation(func): +# @wraps(func) +# def decorated(*args, **kwargs): +# # 初始化日志对象(示例结构) +# log_entry = { +# "path": request.path, +# "method": request.method, +# "ip": request.remote_addr, +# "params": None # 待填充 +# } + +# try: +# # ---- 核心:记录请求参数 ---- +# if request.method == "GET": +# params = request.args.to_dict() +# log_entry["params"] = filter_sensitive_data(params) + +# elif request.method == "POST": +# if request.is_json: +# json_data = request.get_json(silent=True) or {} +# log_entry["params"] = filter_sensitive_data(json_data) +# elif request.form: +# form_data = request.form.to_dict() +# log_entry["params"] = filter_sensitive_data(form_data) +# elif request.files: +# log_entry["files"] = [f.filename for f in request.files.values()] + +# # ---- 执行原函数 ---- +# start_time = time() +# response = func(*args, **kwargs) +# duration = time() - start_time + +# # ---- 记录响应 ---- +# log_entry["status"] = response.status_code +# log_entry["duration"] = f"{duration:.3f}s" +# return response + +# except Exception as e: +# log_entry["error"] = str(e) +# raise +# finally: +# # 实际存储到数据库/文件(此处打印示例) +# current_app.logger.info(json.dumps(log_entry, ensure_ascii=False)) + +# return decorated + +# JWT 用户回调 +@jwt.user_lookup_loader +def load_user(jwt_header, jwt_data): + return User.query.get(jwt_data["sub"]) \ No newline at end of file diff --git a/app/utils/password_hasher.py b/app/utils/password_hasher.py new file mode 100644 index 0000000..e52fdec --- /dev/null +++ b/app/utils/password_hasher.py @@ -0,0 +1,38 @@ +import hashlib + +def hash_password(password: str) -> str: + """ + 使用 MD5 对密码进行加密(不推荐用于生产环境) + + 参数: + password (str): 明文密码 + + 返回: + str: MD5 加密后的密码(32 位十六进制字符串) + """ + # 创建 MD5 哈希对象 + md5 = hashlib.md5() + + # 更新哈希对象内容(需将字符串编码为 bytes) + md5.update(password.encode('utf-8')) + + # 获取十六进制表示的哈希值 + return md5.hexdigest() + + +def check_password(plain_password: str, hashed_password: str) -> bool: + """ + 验证密码是否匹配(MD5 版本) + + 参数: + plain_password (str): 明文密码 + hashed_password (str): MD5 加密后的密码 + + 返回: + bool: 密码是否匹配 + """ + # 计算明文密码的 MD5 值 + plain_password_md5 = hash_password(plain_password) + + # 比较两个 MD5 值是否相同 + return plain_password_md5 == hashed_password \ No newline at end of file diff --git a/app/utils/remote_db.py b/app/utils/remote_db.py new file mode 100644 index 0000000..e69de29 diff --git a/app/utils/response_dict.py b/app/utils/response_dict.py new file mode 100644 index 0000000..f0cb147 --- /dev/null +++ b/app/utils/response_dict.py @@ -0,0 +1,18 @@ +from flask import jsonify + + +response={ + 'code':0, + 'data':{}, + 'error':'', + 'message':'', + + } + + +def api_response(code=200, message="success", data=None): + return jsonify({ + "code": code, + "message": message, + "data": data + }), code \ No newline at end of file diff --git a/build-docker-image.sh b/build-docker-image.sh new file mode 100644 index 0000000..60e50b6 --- /dev/null +++ b/build-docker-image.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +ENV_NAME="${1:-test}" +IMAGE_REPO="${2:-}" +CUSTOM_TAG="${3:-}" +DOCKERFILE="${SCRIPT_DIR}/Dockerfile" + +if [[ "${IMAGE_REPO}" == *":"* ]]; then + echo "IMAGE_NAME should not include a tag. Pass the tag as the third argument." >&2 + exit 1 +fi + +case "${ENV_NAME}" in + prod) + APP_PORT=5222 + DEFAULT_IMAGE_REPO="fst-app-release" + ;; + test) + APP_PORT=5228 + DEFAULT_IMAGE_REPO="fst-app-test" + ;; + *) + echo "ENV_NAME must be 'prod' or 'test' (got: ${ENV_NAME})." >&2 + exit 1 + ;; +esac + +if [[ -z "${IMAGE_REPO}" ]]; then + IMAGE_REPO="${DEFAULT_IMAGE_REPO}" +fi + +if ! command -v docker >/dev/null 2>&1; then + echo "docker not found. Please install Docker first." >&2 + exit 1 +fi + +BUILD_TIME=$(date +%Y%m%d%H%M) +TAG_SUFFIX="${CUSTOM_TAG:-${BUILD_TIME}}" +IMAGE_NAME="${IMAGE_REPO}:${TAG_SUFFIX}" + +echo "Building image '${IMAGE_NAME}' with APP_PORT=${APP_PORT}" +docker build "${SCRIPT_DIR}" -f "${DOCKERFILE}" -t "${IMAGE_NAME}" --build-arg APP_PORT="${APP_PORT}" + +echo "Build complete." +echo "Run example: docker run -d -p ${APP_PORT}:${APP_PORT} --name ${IMAGE_NAME} ${IMAGE_NAME}" diff --git a/dev-debug.sh b/dev-debug.sh new file mode 100644 index 0000000..a1c7852 --- /dev/null +++ b/dev-debug.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +PORT="${1:-5228}" + +VENV_BIN="${SCRIPT_DIR}/venv/bin" +PYTHON="python3" +FLASK="flask" + +if [[ -x "${VENV_BIN}/python" ]]; then + PYTHON="${VENV_BIN}/python" +fi + +if [[ -x "${VENV_BIN}/flask" ]]; then + FLASK="${VENV_BIN}/flask" +fi + +if [[ ! -x "${PYTHON}" ]]; then + echo "Python not found. Create or activate a venv under ${SCRIPT_DIR}/venv first." >&2 + exit 1 +fi + +export PYTHONUNBUFFERED=1 +export FLASK_ENV=development + +if [[ -x "${FLASK}" ]]; then + exec "${FLASK}" --app run:app run --host 0.0.0.0 --port "${PORT}" --debug +fi + +exec "${PYTHON}" -m flask --app run:app run --host 0.0.0.0 --port "${PORT}" --debug diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2861ab2 Binary files /dev/null and b/requirements.txt differ diff --git a/rulebase.sql b/rulebase.sql new file mode 100644 index 0000000..5da6916 --- /dev/null +++ b/rulebase.sql @@ -0,0 +1,1198 @@ +/* + Navicat Premium Dump SQL + + Source Server : 127.0.0.1 + Source Server Type : MySQL + Source Server Version : 50739 (5.7.39-log) + Source Host : localhost:3306 + Source Schema : rulebase + + Target Server Type : MySQL + Target Server Version : 50739 (5.7.39-log) + File Encoding : 65001 + + Date: 08/08/2025 17:12:50 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for bag_file +-- ---------------------------- +DROP TABLE IF EXISTS `bag_file`; +CREATE TABLE `bag_file` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'bag名称', + `file_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `capture_datetime` datetime NOT NULL COMMENT '采集时间(含时分秒)', + `vehicle_status` json NULL COMMENT '车辆状态JSON', + `user_id` int(11) NULL DEFAULT NULL COMMENT '操作用户id', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '标签的创建时间', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '标签的更新时间', + `car_state` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '车辆状态: 0=静止, 1=运动', + `frame_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '图片url', + `video_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '视频url', + `level1_tag_id` int(11) NULL DEFAULT NULL COMMENT '一级标签id', + `level2_tag_id` int(11) NULL DEFAULT NULL COMMENT '二级标签id', + `level3_tag_id` int(11) NULL DEFAULT NULL COMMENT '三级标签id', + `level4_tag_id` int(11) NULL DEFAULT NULL COMMENT '四级标签id', + `batch_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '批次名称', + `status` enum('UNPROCESSED','PROCESSED_NOT_A_CANDIDATE','PROCESSED_NOT_REVIEWED','REVIEW_IN_PROGRESS','RULE_BASED_ACCEPTED','MANUAL_OVERRIDE_ACCEPTED','REVIEWED_BUT_INVALID','') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'PROCESSED_NOT_REVIEWED' COMMENT '处理的状态', + `last_time` datetime NULL DEFAULT NULL COMMENT '最后处理的时间', + `last_rule_version_id` int(11) NULL DEFAULT NULL COMMENT 'rule_versions的外键', + `front_starttime` datetime NULL DEFAULT NULL COMMENT '前摄像头的开始时间', + `front_endtime` datetime NULL DEFAULT NULL COMMENT '前摄像头的结束时间', + `case_type` int(11) NULL DEFAULT NULL COMMENT '1简单场景;2复杂场景', + `comment1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '注释1', + `comment2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '注释2', + `comment3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '注释3', + `bag_status` int(11) NULL DEFAULT NULL COMMENT '标签状态,0 未处理,1 已处理,2再处理', + `qa_status` enum('QA_NOT_REVIEWED','QA_PASSED','QA_FAILED','QA_SKIPPED') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'QA_NOT_REVIEWED' COMMENT '质检的状态', + `sync_status` enum('SYNC_NOT_READY','SYNCED') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'SYNC_NOT_READY' COMMENT '同步的状态', + `fst_version` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'fst版本', + `front_start_sec` int(11) NULL DEFAULT NULL COMMENT '前摄的开始秒', + `front_end_sec` int(11) NULL DEFAULT NULL COMMENT '前摄的结束秒', + `bag_update_time` datetime NULL DEFAULT NULL COMMENT 'bag的更新时间', + `qa_confirm_time` datetime NULL DEFAULT NULL COMMENT 'qa的确认时间', + `qa_id` int(11) NULL DEFAULT NULL COMMENT 'qa的id', + `db_time` datetime NULL DEFAULT NULL COMMENT '更新到远程数据库的时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `file_path`(`file_path`) USING BTREE, + INDEX `idx_capture_time`(`capture_datetime`) USING BTREE, + INDEX `bag_oper_1`(`user_id`) USING BTREE, + INDEX `status`(`status`) USING BTREE, + INDEX `l1`(`level1_tag_id`) USING BTREE, + INDEX `l2`(`level2_tag_id`) USING BTREE, + INDEX `l3`(`level3_tag_id`) USING BTREE, + INDEX `l4`(`level4_tag_id`) USING BTREE, + INDEX `last_v1`(`last_rule_version_id`) USING BTREE, + INDEX `qa_id`(`qa_id`) USING BTREE, + CONSTRAINT `bag_oper_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `l1` FOREIGN KEY (`level1_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `l2` FOREIGN KEY (`level2_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `l3` FOREIGN KEY (`level3_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `l4` FOREIGN KEY (`level4_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `last_v1` FOREIGN KEY (`last_rule_version_id`) REFERENCES `rule_versions` (`rule_version_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `qa_id` FOREIGN KEY (`qa_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE = InnoDB AUTO_INCREMENT = 255 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of bag_file +-- ---------------------------- +INSERT INTO `bag_file` VALUES (1, 'PL123456_event_all_time_event_20250618-104808.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250618-104808.bag.dir', '2025-06-18 10:48:08', NULL, 1, '2025-07-08 16:48:13', '2025-08-08 16:01:20', 1, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'REVIEWED_BUT_INVALID', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 1, 'QA_PASSED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, '2025-08-08 16:01:20', 1, NULL); +INSERT INTO `bag_file` VALUES (2, 'PL123456_event_all_time_event_20250524-180926.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250524-180926.bag.dir', '2025-05-24 18:09:26', NULL, 1, '2025-07-08 16:48:13', '2025-07-31 14:23:59', 1, NULL, NULL, 395, 386, 648, NULL, NULL, 'MANUAL_OVERRIDE_ACCEPTED', NULL, 1, '2025-05-24 18:09:29', '2025-05-24 18:09:42', 1, NULL, NULL, NULL, 1, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (3, 'PL123456_event_all_time_event_20250801-091646.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250801-091646.bag.dir', '2025-08-01 09:16:46', NULL, 1, '2025-07-08 16:48:13', '2025-07-31 14:26:50', 1, NULL, NULL, 393, 390, NULL, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-08-01 09:16:56', '2025-08-01 09:17:06', 2, NULL, NULL, NULL, 1, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (4, 'PL123456_event_all_time_event_20250817-025047.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250817-025047.bag.dir', '2025-08-17 02:50:47', NULL, 1, '2025-07-08 16:48:13', '2025-08-08 14:21:02', 0, NULL, NULL, 385, 725, 508, NULL, NULL, 'MANUAL_OVERRIDE_ACCEPTED', NULL, 1, '2025-08-17 02:50:52', '2025-08-17 02:51:09', 2, NULL, NULL, NULL, 1, 'QA_PASSED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (5, 'PL123456_event_all_time_event_20250713-075942.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250713-075942.bag.dir', '2025-07-13 07:59:42', NULL, 1, '2025-07-08 16:48:13', '2025-08-01 17:26:44', 1, NULL, NULL, 402, 625, NULL, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-07-13 07:59:47', '2025-07-13 07:59:58', 1, '测试1 ', '8月1 日的测试评论', '', 1, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (6, 'PL123456_event_all_time_event_20250719-165337.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250719-165337.bag.dir', '2025-07-19 16:53:37', NULL, 1, '2025-07-08 16:49:11', '2025-08-08 14:24:54', 1, NULL, NULL, 392, 672, 480, NULL, NULL, 'MANUAL_OVERRIDE_ACCEPTED', NULL, 1, '2025-07-19 16:53:37', '2025-07-19 16:53:53', 1, '数据存在问题', '时间不准确', '数据不完整', 1, 'QA_PASSED', 'SYNCED', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (7, 'PL123456_event_all_time_event_20250414-185634.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250414-185634.bag.dir', '2025-04-14 18:56:34', NULL, 1, '2025-07-08 16:49:11', '2025-08-06 11:14:17', 1, NULL, NULL, 455, 488, 690, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-04-14 18:56:34', '2025-04-14 18:56:50', 1, '', '', '', 1, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (8, 'PL123456_event_all_time_event_20250803-072420.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250803-072420.bag.dir', '2025-08-03 07:24:20', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 1, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (9, 'PL123456_event_all_time_event_20250721-172833.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250721-172833.bag.dir', '2025-07-21 17:28:33', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 1, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (10, 'PL123456_event_all_time_event_20250603-063949.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250603-063949.bag.dir', '2025-06-03 06:39:49', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 0, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (11, 'PL123456_event_all_time_event_20250608-093802.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250608-093802.bag.dir', '2025-06-08 09:38:02', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 1, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (12, 'PL123456_event_all_time_event_20250614-070018.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250614-070018.bag.dir', '2025-06-14 07:00:18', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 1, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (13, 'PL123456_event_all_time_event_20250410-152513.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250410-152513.bag.dir', '2025-04-10 15:25:13', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 1, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (14, 'PL123456_event_all_time_event_20250514-004702.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250514-004702.bag.dir', '2025-05-14 00:47:02', NULL, 1, '2025-07-08 16:49:11', '2025-07-31 13:32:53', 1, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (15, 'PL123456_event_all_time_event_20250426-111146.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250426-111146.bag.dir', '2025-04-26 11:11:46', NULL, 1, '2025-07-08 16:49:11', '2025-07-01 13:32:53', 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (16, 'PL123456_event_all_time_event_20250704-094844.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250704-094844.bag.dir', '2025-07-04 09:48:44', NULL, 4, '2025-07-08 16:49:11', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (17, 'PL123456_event_all_time_event_20250415-215827.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250415-215827.bag.dir', '2025-04-15 21:58:27', NULL, 1, '2025-07-08 16:49:11', NULL, 0, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (18, 'PL123456_event_all_time_event_20250508-025150.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250508-025150.bag.dir', '2025-05-08 02:51:50', NULL, 3, '2025-07-08 16:49:11', NULL, 0, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (19, 'PL123456_event_all_time_event_20250815-021512.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250815-021512.bag.dir', '2025-08-15 02:15:12', NULL, 3, '2025-07-08 16:49:11', NULL, 0, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (20, 'PL123456_event_all_time_event_20250626-224155.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250626-224155.bag.dir', '2025-06-26 22:41:55', NULL, 2, '2025-07-08 16:49:11', NULL, 1, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (21, 'PL123456_event_all_time_event_20250508-052137.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250508-052137.bag.dir', '2025-05-08 05:21:37', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (22, 'PL123456_event_all_time_event_20250626-152108.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250626-152108.bag.dir', '2025-06-26 15:21:08', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (23, 'PL123456_event_all_time_event_20250711-011610.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250711-011610.bag.dir', '2025-07-11 01:16:10', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 691, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (24, 'PL123456_event_all_time_event_20250514-161651.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250514-161651.bag.dir', '2025-05-14 16:16:51', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 726, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (25, 'PL123456_event_all_time_event_20250606-070134.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250606-070134.bag.dir', '2025-06-06 07:01:34', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 730, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (26, 'PL123456_event_all_time_event_20250803-075935.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250803-075935.bag.dir', '2025-08-03 07:59:35', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (27, 'PL123456_event_all_time_event_20250810-033052.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250810-033052.bag.dir', '2025-08-10 03:30:52', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (28, 'PL123456_event_all_time_event_20250407-045556.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250407-045556.bag.dir', '2025-04-07 04:55:56', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (29, 'PL123456_event_all_time_event_20250406-013608.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250406-013608.bag.dir', '2025-04-06 01:36:08', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (30, 'PL123456_event_all_time_event_20250719-164301.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250719-164301.bag.dir', '2025-07-19 16:43:01', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (31, 'PL123456_event_all_time_event_20250521-054030.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250521-054030.bag.dir', '2025-05-21 05:40:30', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (32, 'PL123456_event_all_time_event_20250814-021005.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250814-021005.bag.dir', '2025-08-14 02:10:05', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (33, 'PL123456_event_all_time_event_20250506-142732.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250506-142732.bag.dir', '2025-05-06 14:27:32', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (34, 'PL123456_event_all_time_event_20250531-170751.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250531-170751.bag.dir', '2025-05-31 17:07:51', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (35, 'PL123456_event_all_time_event_20250627-230112.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250627-230112.bag.dir', '2025-06-27 23:01:12', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (36, 'PL123456_event_all_time_event_20250724-115014.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250724-115014.bag.dir', '2025-07-24 11:50:14', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (37, 'PL123456_event_all_time_event_20250714-020644.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250714-020644.bag.dir', '2025-07-14 02:06:44', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (38, 'PL123456_event_all_time_event_20250413-104759.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250413-104759.bag.dir', '2025-04-13 10:47:59', NULL, 1, '2025-07-08 16:49:46', '2025-07-31 13:32:53', 1, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (39, 'PL123456_event_all_time_event_20250420-191944.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250420-191944.bag.dir', '2025-04-20 19:19:44', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (40, 'PL123456_event_all_time_event_20250602-074016.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250602-074016.bag.dir', '2025-06-02 07:40:16', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (41, 'PL123456_event_all_time_event_20250822-010143.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250822-010143.bag.dir', '2025-08-22 01:01:43', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (42, 'PL123456_event_all_time_event_20250504-234028.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250504-234028.bag.dir', '2025-05-04 23:40:28', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (43, 'PL123456_event_all_time_event_20250412-022041.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250412-022041.bag.dir', '2025-04-12 02:20:41', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (44, 'PL123456_event_all_time_event_20250705-213155.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250705-213155.bag.dir', '2025-07-05 21:31:55', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (45, 'PL123456_event_all_time_event_20250613-225315.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250613-225315.bag.dir', '2025-06-13 22:53:15', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (46, 'PL123456_event_all_time_event_20250617-215149.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250617-215149.bag.dir', '2025-06-17 21:51:49', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (47, 'PL123456_event_all_time_event_20250723-105412.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250723-105412.bag.dir', '2025-07-23 10:54:12', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (48, 'PL123456_event_all_time_event_20250621-182220.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250621-182220.bag.dir', '2025-06-21 18:22:20', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (49, 'PL123456_event_all_time_event_20250504-112156.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250504-112156.bag.dir', '2025-05-04 11:21:56', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (50, 'PL123456_event_all_time_event_20250809-055320.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250809-055320.bag.dir', '2025-08-09 05:53:20', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (51, 'PL123456_event_all_time_event_20250530-135149.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250530-135149.bag.dir', '2025-05-30 13:51:49', NULL, 1, '2025-07-08 16:49:46', '2025-07-31 13:32:53', 1, NULL, NULL, 691, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (52, 'PL123456_event_all_time_event_20250729-135319.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250729-135319.bag.dir', '2025-07-29 13:53:19', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (53, 'PL123456_event_all_time_event_20250727-152935.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250727-152935.bag.dir', '2025-07-27 15:29:35', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (54, 'PL123456_event_all_time_event_20250413-104306.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250413-104306.bag.dir', '2025-04-13 10:43:06', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (55, 'PL123456_event_all_time_event_20250609-103737.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250609-103737.bag.dir', '2025-06-09 10:37:37', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (56, 'PL123456_event_all_time_event_20250427-005459.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250427-005459.bag.dir', '2025-04-27 00:54:59', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (57, 'PL123456_event_all_time_event_20250525-032619.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250525-032619.bag.dir', '2025-05-25 03:26:19', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (58, 'PL123456_event_all_time_event_20250804-170140.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250804-170140.bag.dir', '2025-08-04 17:01:40', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (59, 'PL123456_event_all_time_event_20250811-053620.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250811-053620.bag.dir', '2025-08-11 05:36:20', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (60, 'PL123456_event_all_time_event_20250731-101455.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250731-101455.bag.dir', '2025-07-31 10:14:55', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (61, 'PL123456_event_all_time_event_20250829-051055.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250829-051055.bag.dir', '2025-08-29 05:10:55', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (62, 'PL123456_event_all_time_event_20250610-105533.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250610-105533.bag.dir', '2025-06-10 10:55:33', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (63, 'PL123456_event_all_time_event_20250511-042530.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250511-042530.bag.dir', '2025-05-11 04:25:30', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (64, 'PL123456_event_all_time_event_20250530-232109.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250530-232109.bag.dir', '2025-05-30 23:21:09', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (65, 'PL123456_event_all_time_event_20250828-221018.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250828-221018.bag.dir', '2025-08-28 22:10:18', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (66, 'PL123456_event_all_time_event_20250708-085501.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250708-085501.bag.dir', '2025-07-08 08:55:01', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (67, 'PL123456_event_all_time_event_20250421-220644.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250421-220644.bag.dir', '2025-04-21 22:06:44', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (68, 'PL123456_event_all_time_event_20250424-045224.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250424-045224.bag.dir', '2025-04-24 04:52:24', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (69, 'PL123456_event_all_time_event_20250610-015521.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250610-015521.bag.dir', '2025-06-10 01:55:21', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (70, 'PL123456_event_all_time_event_20250423-173437.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250423-173437.bag.dir', '2025-04-23 17:34:37', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (71, 'PL123456_event_all_time_event_20250502-161711.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250502-161711.bag.dir', '2025-05-02 16:17:11', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (72, 'PL123456_event_all_time_event_20250416-055542.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250416-055542.bag.dir', '2025-04-16 05:55:42', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (73, 'PL123456_event_all_time_event_20250820-090607.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250820-090607.bag.dir', '2025-08-20 09:06:07', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (74, 'PL123456_event_all_time_event_20250507-180447.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250507-180447.bag.dir', '2025-05-07 18:04:47', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (75, 'PL123456_event_all_time_event_20250820-101620.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250820-101620.bag.dir', '2025-08-20 10:16:20', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (76, 'PL123456_event_all_time_event_20250826-014332.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250826-014332.bag.dir', '2025-08-26 01:43:32', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (77, 'PL123456_event_all_time_event_20250428-060844.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250428-060844.bag.dir', '2025-04-28 06:08:44', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (78, 'PL123456_event_all_time_event_20250502-144826.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250502-144826.bag.dir', '2025-05-02 14:48:26', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (79, 'PL123456_event_all_time_event_20250814-120018.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250814-120018.bag.dir', '2025-08-14 12:00:18', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (80, 'PL123456_event_all_time_event_20250717-072719.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250717-072719.bag.dir', '2025-07-17 07:27:19', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (81, 'PL123456_event_all_time_event_20250511-160112.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250511-160112.bag.dir', '2025-05-11 16:01:12', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (82, 'PL123456_event_all_time_event_20250501-043104.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250501-043104.bag.dir', '2025-05-01 04:31:04', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (83, 'PL123456_event_all_time_event_20250827-232730.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250827-232730.bag.dir', '2025-08-27 23:27:30', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (84, 'PL123456_event_all_time_event_20250819-201637.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250819-201637.bag.dir', '2025-08-19 20:16:37', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (85, 'PL123456_event_all_time_event_20250617-200145.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250617-200145.bag.dir', '2025-06-17 20:01:45', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (86, 'PL123456_event_all_time_event_20250502-174038.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250502-174038.bag.dir', '2025-05-02 17:40:38', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (87, 'PL123456_event_all_time_event_20250720-233146.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250720-233146.bag.dir', '2025-07-20 23:31:46', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (88, 'PL123456_event_all_time_event_20250714-001352.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250714-001352.bag.dir', '2025-07-14 00:13:52', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (89, 'PL123456_event_all_time_event_20250421-185131.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250421-185131.bag.dir', '2025-04-21 18:51:31', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (90, 'PL123456_event_all_time_event_20250404-080332.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250404-080332.bag.dir', '2025-04-04 08:03:32', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (91, 'PL123456_event_all_time_event_20250608-134447.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250608-134447.bag.dir', '2025-06-08 13:44:47', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (92, 'PL123456_event_all_time_event_20250727-211852.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250727-211852.bag.dir', '2025-07-27 21:18:52', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (93, 'PL123456_event_all_time_event_20250423-101932.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250423-101932.bag.dir', '2025-04-23 10:19:32', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (94, 'PL123456_event_all_time_event_20250801-123412.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250801-123412.bag.dir', '2025-08-01 12:34:12', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (95, 'PL123456_event_all_time_event_20250527-115407.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250527-115407.bag.dir', '2025-05-27 11:54:07', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (96, 'PL123456_event_all_time_event_20250529-220038.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250529-220038.bag.dir', '2025-05-29 22:00:38', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (97, 'PL123456_event_all_time_event_20250430-175059.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250430-175059.bag.dir', '2025-04-30 17:50:59', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (98, 'PL123456_event_all_time_event_20250704-150721.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250704-150721.bag.dir', '2025-07-04 15:07:21', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (99, 'PL123456_event_all_time_event_20250820-131507.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250820-131507.bag.dir', '2025-08-20 13:15:07', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (100, 'PL123456_event_all_time_event_20250430-205911.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250430-205911.bag.dir', '2025-04-30 20:59:11', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (101, 'PL123456_event_all_time_event_20250830-203453.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250830-203453.bag.dir', '2025-08-30 20:34:53', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 691, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (102, 'PL123456_event_all_time_event_20250616-170343.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250616-170343.bag.dir', '2025-06-16 17:03:43', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (103, 'PL123456_event_all_time_event_20250721-033759.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250721-033759.bag.dir', '2025-07-21 03:37:59', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (104, 'PL123456_event_all_time_event_20250713-192906.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250713-192906.bag.dir', '2025-07-13 19:29:06', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (105, 'PL123456_event_all_time_event_20250808-230540.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250808-230540.bag.dir', '2025-08-08 23:05:40', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (106, 'PL123456_event_all_time_event_20250519-221803.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250519-221803.bag.dir', '2025-05-19 22:18:03', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (107, 'PL123456_event_all_time_event_20250731-031348.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250731-031348.bag.dir', '2025-07-31 03:13:48', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (108, 'PL123456_event_all_time_event_20250616-201907.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250616-201907.bag.dir', '2025-06-16 20:19:07', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (109, 'PL123456_event_all_time_event_20250615-090710.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250615-090710.bag.dir', '2025-06-15 09:07:10', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (110, 'PL123456_event_all_time_event_20250731-173211.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250731-173211.bag.dir', '2025-07-31 17:32:11', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (111, 'PL123456_event_all_time_event_20250827-125110.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250827-125110.bag.dir', '2025-08-27 12:51:10', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (112, 'PL123456_event_all_time_event_20250805-151657.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250805-151657.bag.dir', '2025-08-05 15:16:57', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (113, 'PL123456_event_all_time_event_20250520-095717.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250520-095717.bag.dir', '2025-05-20 09:57:17', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (114, 'PL123456_event_all_time_event_20250622-121405.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250622-121405.bag.dir', '2025-06-22 12:14:05', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (115, 'PL123456_event_all_time_event_20250811-212911.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250811-212911.bag.dir', '2025-08-11 21:29:11', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (116, 'PL123456_event_all_time_event_20250812-013410.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250812-013410.bag.dir', '2025-08-12 01:34:10', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (117, 'PL123456_event_all_time_event_20250724-142756.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250724-142756.bag.dir', '2025-07-24 14:27:56', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (118, 'PL123456_event_all_time_event_20250509-183327.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250509-183327.bag.dir', '2025-05-09 18:33:27', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (119, 'PL123456_event_all_time_event_20250529-120441.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250529-120441.bag.dir', '2025-05-29 12:04:41', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (120, 'PL123456_event_all_time_event_20250827-215823.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250827-215823.bag.dir', '2025-08-27 21:58:23', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (121, 'PL123456_event_all_time_event_20250607-090701.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250607-090701.bag.dir', '2025-06-07 09:07:01', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (122, 'PL123456_event_all_time_event_20250514-135823.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250514-135823.bag.dir', '2025-05-14 13:58:23', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (123, 'PL123456_event_all_time_event_20250516-024645.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250516-024645.bag.dir', '2025-05-16 02:46:45', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (124, 'PL123456_event_all_time_event_20250711-000642.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250711-000642.bag.dir', '2025-07-11 00:06:42', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (125, 'PL123456_event_all_time_event_20250419-063018.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250419-063018.bag.dir', '2025-04-19 06:30:18', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (126, 'PL123456_event_all_time_event_20250505-094942.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250505-094942.bag.dir', '2025-05-05 09:49:42', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (127, 'PL123456_event_all_time_event_20250613-192702.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250613-192702.bag.dir', '2025-06-13 19:27:02', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (128, 'PL123456_event_all_time_event_20250715-111441.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250715-111441.bag.dir', '2025-07-15 11:14:41', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (129, 'PL123456_event_all_time_event_20250721-151647.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250721-151647.bag.dir', '2025-07-21 15:16:47', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (130, 'PL123456_event_all_time_event_20250404-231550.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250404-231550.bag.dir', '2025-04-04 23:15:50', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (131, 'PL123456_event_all_time_event_20250519-052433.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250519-052433.bag.dir', '2025-05-19 05:24:33', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (132, 'PL123456_event_all_time_event_20250509-170219.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250509-170219.bag.dir', '2025-05-09 17:02:19', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (133, 'PL123456_event_all_time_event_20250404-105429.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250404-105429.bag.dir', '2025-04-04 10:54:29', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (134, 'PL123456_event_all_time_event_20250525-020221.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250525-020221.bag.dir', '2025-05-25 02:02:21', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (135, 'PL123456_event_all_time_event_20250511-005652.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250511-005652.bag.dir', '2025-05-11 00:56:52', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (136, 'PL123456_event_all_time_event_20250416-150923.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250416-150923.bag.dir', '2025-04-16 15:09:23', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (137, 'PL123456_event_all_time_event_20250711-054457.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250711-054457.bag.dir', '2025-07-11 05:44:57', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (138, 'PL123456_event_all_time_event_20250729-101836.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250729-101836.bag.dir', '2025-07-29 10:18:36', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (139, 'PL123456_event_all_time_event_20250721-134449.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250721-134449.bag.dir', '2025-07-21 13:44:49', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (140, 'PL123456_event_all_time_event_20250709-173329.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250709-173329.bag.dir', '2025-07-09 17:33:29', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (141, 'PL123456_event_all_time_event_20250603-103045.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250603-103045.bag.dir', '2025-06-03 10:30:45', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (142, 'PL123456_event_all_time_event_20250416-112157.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250416-112157.bag.dir', '2025-04-16 11:21:57', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (143, 'PL123456_event_all_time_event_20250831-104302.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250831-104302.bag.dir', '2025-08-31 10:43:02', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (144, 'PL123456_event_all_time_event_20250504-204014.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250504-204014.bag.dir', '2025-05-04 20:40:14', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (145, 'PL123456_event_all_time_event_20250713-210742.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250713-210742.bag.dir', '2025-07-13 21:07:42', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (146, 'PL123456_event_all_time_event_20250823-004359.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250823-004359.bag.dir', '2025-08-23 00:43:59', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (147, 'PL123456_event_all_time_event_20250430-051030.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250430-051030.bag.dir', '2025-04-30 05:10:30', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (148, 'PL123456_event_all_time_event_20250504-050615.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250504-050615.bag.dir', '2025-05-04 05:06:15', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (149, 'PL123456_event_all_time_event_20250727-214210.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250727-214210.bag.dir', '2025-07-27 21:42:10', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (150, 'PL123456_event_all_time_event_20250805-110540.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250805-110540.bag.dir', '2025-08-05 11:05:40', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (151, 'PL123456_event_all_time_event_20250413-074005.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250413-074005.bag.dir', '2025-04-13 07:40:05', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (152, 'PL123456_event_all_time_event_20250426-230809.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250426-230809.bag.dir', '2025-04-26 23:08:09', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (153, 'PL123456_event_all_time_event_20250610-140157.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250610-140157.bag.dir', '2025-06-10 14:01:57', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (154, 'PL123456_event_all_time_event_20250802-124737.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250802-124737.bag.dir', '2025-08-02 12:47:37', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (155, 'PL123456_event_all_time_event_20250519-063034.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250519-063034.bag.dir', '2025-05-19 06:30:34', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (156, 'PL123456_event_all_time_event_20250701-112412.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250701-112412.bag.dir', '2025-07-01 11:24:12', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (157, 'PL123456_event_all_time_event_20250412-220718.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250412-220718.bag.dir', '2025-04-12 22:07:18', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (158, 'PL123456_event_all_time_event_20250609-061229.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250609-061229.bag.dir', '2025-06-09 06:12:29', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (159, 'PL123456_event_all_time_event_20250416-183508.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250416-183508.bag.dir', '2025-04-16 18:35:08', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (160, 'PL123456_event_all_time_event_20250716-110749.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250716-110749.bag.dir', '2025-07-16 11:07:49', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (161, 'PL123456_event_all_time_event_20250813-233849.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250813-233849.bag.dir', '2025-08-13 23:38:49', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (162, 'PL123456_event_all_time_event_20250803-002627.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250803-002627.bag.dir', '2025-08-03 00:26:27', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (163, 'PL123456_event_all_time_event_20250624-061757.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250624-061757.bag.dir', '2025-06-24 06:17:57', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (164, 'PL123456_event_all_time_event_20250530-081118.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250530-081118.bag.dir', '2025-05-30 08:11:18', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (165, 'PL123456_event_all_time_event_20250528-032746.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250528-032746.bag.dir', '2025-05-28 03:27:46', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (166, 'PL123456_event_all_time_event_20250406-032838.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250406-032838.bag.dir', '2025-04-06 03:28:38', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (167, 'PL123456_event_all_time_event_20250420-230247.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250420-230247.bag.dir', '2025-04-20 23:02:47', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (168, 'PL123456_event_all_time_event_20250514-020336.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250514-020336.bag.dir', '2025-05-14 02:03:36', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (169, 'PL123456_event_all_time_event_20250821-131003.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250821-131003.bag.dir', '2025-08-21 13:10:03', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (170, 'PL123456_event_all_time_event_20250420-170215.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250420-170215.bag.dir', '2025-04-20 17:02:15', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (171, 'PL123456_event_all_time_event_20250725-135326.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250725-135326.bag.dir', '2025-07-25 13:53:26', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (172, 'PL123456_event_all_time_event_20250726-162721.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250726-162721.bag.dir', '2025-07-26 16:27:21', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (173, 'PL123456_event_all_time_event_20250705-184646.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250705-184646.bag.dir', '2025-07-05 18:46:46', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (174, 'PL123456_event_all_time_event_20250409-105551.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250409-105551.bag.dir', '2025-04-09 10:55:51', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (175, 'PL123456_event_all_time_event_20250407-030155.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250407-030155.bag.dir', '2025-04-07 03:01:55', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (176, 'PL123456_event_all_time_event_20250806-205245.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250806-205245.bag.dir', '2025-08-06 20:52:45', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (177, 'PL123456_event_all_time_event_20250515-013747.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250515-013747.bag.dir', '2025-05-15 01:37:47', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (178, 'PL123456_event_all_time_event_20250405-012518.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250405-012518.bag.dir', '2025-04-05 01:25:18', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (179, 'PL123456_event_all_time_event_20250514-054104.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250514-054104.bag.dir', '2025-05-14 05:41:04', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (180, 'PL123456_event_all_time_event_20250617-062622.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250617-062622.bag.dir', '2025-06-17 06:26:22', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (181, 'PL123456_event_all_time_event_20250815-013740.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250815-013740.bag.dir', '2025-08-15 01:37:40', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (182, 'PL123456_event_all_time_event_20250829-130346.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250829-130346.bag.dir', '2025-08-29 13:03:46', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (183, 'PL123456_event_all_time_event_20250623-075031.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250623-075031.bag.dir', '2025-06-23 07:50:31', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (184, 'PL123456_event_all_time_event_20250420-005759.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250420-005759.bag.dir', '2025-04-20 00:57:59', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (185, 'PL123456_event_all_time_event_20250503-212238.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250503-212238.bag.dir', '2025-05-03 21:22:38', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (186, 'PL123456_event_all_time_event_20250513-013310.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250513-013310.bag.dir', '2025-05-13 01:33:10', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (187, 'PL123456_event_all_time_event_20250625-205540.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250625-205540.bag.dir', '2025-06-25 20:55:40', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (188, 'PL123456_event_all_time_event_20250412-110625.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250412-110625.bag.dir', '2025-04-12 11:06:25', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (189, 'PL123456_event_all_time_event_20250721-034807.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250721-034807.bag.dir', '2025-07-21 03:48:07', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (190, 'PL123456_event_all_time_event_20250810-124145.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250810-124145.bag.dir', '2025-08-10 12:41:45', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (191, 'PL123456_event_all_time_event_20250628-043846.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250628-043846.bag.dir', '2025-06-28 04:38:46', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (192, 'PL123456_event_all_time_event_20250411-230544.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250411-230544.bag.dir', '2025-04-11 23:05:44', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (193, 'PL123456_event_all_time_event_20250614-164753.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250614-164753.bag.dir', '2025-06-14 16:47:53', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (194, 'PL123456_event_all_time_event_20250730-122400.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250730-122400.bag.dir', '2025-07-30 12:24:00', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (195, 'PL123456_event_all_time_event_20250604-003705.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250604-003705.bag.dir', '2025-06-04 00:37:05', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (196, 'PL123456_event_all_time_event_20250401-021412.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250401-021412.bag.dir', '2025-04-01 02:14:12', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (197, 'PL123456_event_all_time_event_20250420-033439.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250420-033439.bag.dir', '2025-04-20 03:34:39', NULL, 3, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (198, 'PL123456_event_all_time_event_20250727-013718.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250727-013718.bag.dir', '2025-07-27 01:37:18', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (199, 'PL123456_event_all_time_event_20250713-042155.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250713-042155.bag.dir', '2025-07-13 04:21:55', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 691, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (200, 'PL123456_event_all_time_event_20250805-114130.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250805-114130.bag.dir', '2025-08-05 11:41:30', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 732, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (201, 'PL123456_event_all_time_event_20250629-061058.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250629-061058.bag.dir', '2025-06-29 06:10:58', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (202, 'PL123456_event_all_time_event_20250501-165604.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250501-165604.bag.dir', '2025-05-01 16:56:04', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 746, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (203, 'PL123456_event_all_time_event_20250604-163153.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250604-163153.bag.dir', '2025-06-04 16:31:53', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 385, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (204, 'PL123456_event_all_time_event_20250515-024839.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250515-024839.bag.dir', '2025-05-15 02:48:39', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (205, 'PL123456_event_all_time_event_20250411-085742.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250411-085742.bag.dir', '2025-04-11 08:57:42', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (206, 'PL123456_event_all_time_event_20250808-140018.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250808-140018.bag.dir', '2025-08-08 14:00:18', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (207, 'PL123456_event_all_time_event_20250727-013115.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250727-013115.bag.dir', '2025-07-27 01:31:15', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (208, 'PL123456_event_all_time_event_20250619-085846.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250619-085846.bag.dir', '2025-06-19 08:58:46', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 407, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (209, 'PL123456_event_all_time_event_20250616-033312.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250616-033312.bag.dir', '2025-06-16 03:33:12', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (210, 'PL123456_event_all_time_event_20250502-071853.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250502-071853.bag.dir', '2025-05-02 07:18:53', NULL, 1, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (211, 'PL123456_event_all_time_event_20250805-063622.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250805-063622.bag.dir', '2025-08-05 06:36:22', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (212, 'PL123456_event_all_time_event_20250423-173244.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250423-173244.bag.dir', '2025-04-23 17:32:44', NULL, 1, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 537, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (213, 'PL123456_event_all_time_event_20250623-141719.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250623-141719.bag.dir', '2025-06-23 14:17:19', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 542, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (214, 'PL123456_event_all_time_event_20250621-180534.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250621-180534.bag.dir', '2025-06-21 18:05:34', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (215, 'PL123456_event_all_time_event_20250427-064620.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250427-064620.bag.dir', '2025-04-27 06:46:20', NULL, 2, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (216, 'PL123456_event_all_time_event_20250520-112725.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250520-112725.bag.dir', '2025-05-20 11:27:25', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (217, 'PL123456_event_all_time_event_20250507-194532.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250507-194532.bag.dir', '2025-05-07 19:45:32', NULL, 4, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (218, 'PL123456_event_all_time_event_20250717-140139.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250717-140139.bag.dir', '2025-07-17 14:01:39', NULL, 3, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (219, 'PL123456_event_all_time_event_20250724-110121.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250724-110121.bag.dir', '2025-07-24 11:01:21', NULL, 4, '2025-07-08 16:49:46', NULL, 0, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (220, 'PL123456_event_all_time_event_20250718-202355.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250718-202355.bag.dir', '2025-07-18 20:23:55', NULL, 2, '2025-07-08 16:49:46', NULL, 1, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (221, 'PL123456_event_all_time_event_20250617-143517.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250617-143517.bag.dir', '2025-06-17 14:35:17', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 13:54:41', 1, NULL, NULL, 663, 437, 441, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-06-17 14:35:29', '2025-06-17 14:35:33', 1, '', '', '', 1, 'QA_PASSED', 'SYNCED', NULL, 12, 16, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (222, 'PL123456_event_all_time_event_20250728-001415.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250728-001415.bag.dir', '2025-07-28 00:14:15', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 13:53:43', 0, NULL, NULL, 385, 459, 430, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-07-28 00:14:15', '2025-07-28 00:14:31', 1, '', '', '', 2, 'QA_FAILED', 'SYNCED', NULL, NULL, 16, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (223, 'PL123456_event_all_time_event_20250520-123029.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250520-123029.bag.dir', '2025-05-20 12:30:29', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 15:56:00', 0, NULL, NULL, 679, 543, 706, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-05-20 12:30:29', '2025-05-20 12:30:45', 1, '', '', '', 1, 'QA_PASSED', 'SYNC_NOT_READY', NULL, NULL, 16, '2025-08-08 15:56:00', '2025-08-08 15:56:01', 1, '2025-08-08 15:56:00'); +INSERT INTO `bag_file` VALUES (224, 'PL123456_event_all_time_event_20250408-230424.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250408-230424.bag.dir', '2025-04-08 23:04:24', NULL, 2, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (225, 'PL123456_event_all_time_event_20250815-185208.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250815-185208.bag.dir', '2025-08-15 18:52:08', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 13:54:30', 1, NULL, NULL, 385, 425, 593, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-08-15 18:52:08', '2025-08-15 18:52:24', 1, '', '', '', 2, 'QA_FAILED', 'SYNCED', NULL, NULL, 16, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (226, 'PL123456_event_all_time_event_20250529-171417.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250529-171417.bag.dir', '2025-05-29 17:14:17', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 15:56:36', 0, NULL, NULL, 392, 558, 498, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-05-29 17:14:17', '2025-05-29 17:14:33', 1, '', '', '', 2, 'QA_FAILED', 'SYNC_NOT_READY', NULL, NULL, 16, '2025-08-08 15:56:36', '2025-08-08 15:56:37', NULL, '2025-08-08 15:56:36'); +INSERT INTO `bag_file` VALUES (227, 'PL123456_event_all_time_event_20250526-032529.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250526-032529.bag.dir', '2025-05-26 03:25:29', NULL, 3, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 734, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (228, 'PL123456_event_all_time_event_20250415-180438.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250415-180438.bag.dir', '2025-04-15 18:04:38', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 15:58:35', 0, NULL, NULL, 385, 425, 593, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-04-15 18:04:38', '2025-04-15 18:04:54', 1, '', '', '', 2, 'QA_FAILED', 'SYNC_NOT_READY', NULL, NULL, 16, '2025-08-08 15:58:35', '2025-08-08 15:58:35', NULL, '2025-08-08 15:58:35'); +INSERT INTO `bag_file` VALUES (229, 'PL123456_event_all_time_event_20250528-155143.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250528-155143.bag.dir', '2025-05-28 15:51:43', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 16:01:06', 0, NULL, NULL, 385, 425, 593, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-05-28 15:51:43', '2025-05-28 15:51:59', 1, '', '', '', 2, 'QA_FAILED', 'SYNC_NOT_READY', NULL, NULL, 16, '2025-08-08 16:00:43', '2025-08-08 16:01:06', NULL, NULL); +INSERT INTO `bag_file` VALUES (230, 'PL123456_event_all_time_event_20250814-100803.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250814-100803.bag.dir', '2025-08-14 10:08:03', NULL, 3, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 392, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (231, 'PL123456_event_all_time_event_20250717-214147.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250717-214147.bag.dir', '2025-07-17 21:41:47', NULL, 1, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (232, 'PL123456_event_all_time_event_20250408-134641.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250408-134641.bag.dir', '2025-04-08 13:46:41', NULL, 1, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 395, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (233, 'PL123456_event_all_time_event_20250823-041456.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250823-041456.bag.dir', '2025-08-23 04:14:56', NULL, 3, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 402, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (234, 'PL123456_event_all_time_event_20250408-023704.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250408-023704.bag.dir', '2025-04-08 02:37:04', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 14:19:05', 0, NULL, NULL, 407, 616, 579, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-04-08 02:37:05', '2025-04-08 02:37:19', 1, '', '', '', 1, 'QA_NOT_REVIEWED', 'SYNCED', NULL, 1, 15, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (235, 'PL123456_event_all_time_event_20250507-082720.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250507-082720.bag.dir', '2025-05-07 08:27:20', NULL, 4, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 455, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (236, 'PL123456_event_all_time_event_20250616-235753.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250616-235753.bag.dir', '2025-06-16 23:57:53', NULL, 4, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 504, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (237, 'PL123456_event_all_time_event_20250509-111455.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250509-111455.bag.dir', '2025-05-09 11:14:55', NULL, 4, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 531, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (238, 'PL123456_event_all_time_event_20250430-053908.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250430-053908.bag.dir', '2025-04-30 05:39:08', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 14:24:47', 0, NULL, NULL, 537, 400, 655, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-04-30 05:39:11', '2025-04-30 05:39:20', 1, '', '', '', 1, 'QA_NOT_REVIEWED', 'SYNCED', NULL, 3, 12, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (239, 'PL123456_event_all_time_event_20250416-013528.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250416-013528.bag.dir', '2025-04-16 01:35:28', NULL, 1, '2025-07-08 16:50:16', '2025-08-08 14:23:15', 1, NULL, NULL, 385, 425, 649, NULL, NULL, 'RULE_BASED_ACCEPTED', NULL, 1, '2025-04-16 01:35:28', '2025-04-16 01:35:44', 1, '', '', '', 2, 'QA_FAILED', 'SYNCED', NULL, NULL, 16, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (240, 'PL123456_event_all_time_event_20250418-122955.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250418-122955.bag.dir', '2025-04-18 12:29:55', NULL, 3, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 550, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (241, 'PL123456_event_all_time_event_20250410-172025.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250410-172025.bag.dir', '2025-04-10 17:20:25', NULL, 3, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 564, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (242, 'PL123456_event_all_time_event_20250515-131304.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250515-131304.bag.dir', '2025-05-15 13:13:04', NULL, 3, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 607, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (243, 'PL123456_event_all_time_event_20250526-013025.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250526-013025.bag.dir', '2025-05-26 01:30:25', NULL, 3, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 393, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (244, 'PL123456_event_all_time_event_20250622-235132.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250622-235132.bag.dir', '2025-06-22 23:51:32', NULL, 1, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 629, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (245, 'PL123456_event_all_time_event_20250823-125556.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250823-125556.bag.dir', '2025-08-23 12:55:56', NULL, 4, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 633, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (246, 'PL123456_event_all_time_event_20250530-053800.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250530-053800.bag.dir', '2025-05-30 05:38:00', NULL, 4, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 660, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (247, 'PL123456_event_all_time_event_20250601-173355.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250601-173355.bag.dir', '2025-06-01 17:33:55', NULL, 4, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 663, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (248, 'PL123456_event_all_time_event_20250512-022426.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250512-022426.bag.dir', '2025-05-12 02:24:26', NULL, 3, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 673, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (249, 'PL123456_event_all_time_event_20250813-112108.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250813-112108.bag.dir', '2025-08-13 11:21:08', NULL, 4, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (250, 'PL123456_event_all_time_event_20250520-010934.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250520-010934.bag.dir', '2025-05-20 01:09:34', NULL, 1, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (251, 'PL123456_event_all_time_event_20250515-104525.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250515-104525.bag.dir', '2025-05-15 10:45:25', NULL, 4, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 691, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (252, 'PL123456_event_all_time_event_20250827-174125.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250827-174125.bag.dir', '2025-08-27 17:41:25', NULL, 3, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 679, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (253, 'PL123456_event_all_time_event_20250519-072302.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250519-072302.bag.dir', '2025-05-19 07:23:02', NULL, 3, '2025-07-08 16:50:16', NULL, 1, NULL, NULL, 681, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `bag_file` VALUES (254, 'PL123456_event_all_time_event_20250514-032240.bag', 'mb_ab_cd_mm_test/PL123456_event_all_time_event_20250514-032240.bag.dir', '2025-05-14 03:22:40', NULL, 1, '2025-07-08 16:50:16', NULL, 0, NULL, NULL, 691, NULL, NULL, NULL, NULL, 'PROCESSED_NOT_REVIEWED', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, 'QA_NOT_REVIEWED', 'SYNC_NOT_READY', NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for bag_file_fst_relation +-- ---------------------------- +DROP TABLE IF EXISTS `bag_file_fst_relation`; +CREATE TABLE `bag_file_fst_relation` ( + `bag_file_id` int(11) UNSIGNED NOT NULL, + `fst_id` int(11) NOT NULL, + `tag_level` tinyint(4) NOT NULL COMMENT '关联的标签层级(冗余存储)', + `status` tinyint(4) NULL DEFAULT NULL COMMENT '处理状态', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `user_id` int(11) NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`bag_file_id`, `fst_id`) USING BTREE, + INDEX `fst_id`(`fst_id`) USING BTREE, + INDEX `update_user`(`user_id`) USING BTREE, + CONSTRAINT `bag_file_fst_relation_ibfk_2` FOREIGN KEY (`fst_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `update_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of bag_file_fst_relation +-- ---------------------------- +INSERT INTO `bag_file_fst_relation` VALUES (1, 385, 1, NULL, NULL, 1); +INSERT INTO `bag_file_fst_relation` VALUES (1, 395, 1, NULL, NULL, 1); +INSERT INTO `bag_file_fst_relation` VALUES (1, 421, 2, NULL, NULL, 1); +INSERT INTO `bag_file_fst_relation` VALUES (1, 425, 2, NULL, NULL, 1); +INSERT INTO `bag_file_fst_relation` VALUES (1, 593, 3, NULL, NULL, 1); +INSERT INTO `bag_file_fst_relation` VALUES (2, 392, 1, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (2, 402, 1, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (2, 407, 1, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (2, 558, 2, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (2, 596, 4, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (2, 600, 1, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (2, 644, 3, NULL, NULL, 2); +INSERT INTO `bag_file_fst_relation` VALUES (3, 390, 2, NULL, NULL, NULL); +INSERT INTO `bag_file_fst_relation` VALUES (3, 393, 1, NULL, NULL, NULL); +INSERT INTO `bag_file_fst_relation` VALUES (4, 385, 1, NULL, NULL, NULL); +INSERT INTO `bag_file_fst_relation` VALUES (5, 392, 1, 0, '2025-07-15 17:22:39', 2); +INSERT INTO `bag_file_fst_relation` VALUES (5, 498, 3, 0, '2025-07-15 17:22:39', 2); +INSERT INTO `bag_file_fst_relation` VALUES (5, 558, 2, 0, '2025-07-15 17:22:39', 2); +INSERT INTO `bag_file_fst_relation` VALUES (6, 392, 1, 1, '2025-07-16 09:52:29', 2); +INSERT INTO `bag_file_fst_relation` VALUES (6, 498, 3, 1, '2025-07-16 09:52:29', 2); +INSERT INTO `bag_file_fst_relation` VALUES (6, 558, 2, 1, '2025-07-16 09:52:29', 2); + +-- ---------------------------- +-- Table structure for bag_update +-- ---------------------------- +DROP TABLE IF EXISTS `bag_update`; +CREATE TABLE `bag_update` ( + `id` int(11) NOT NULL COMMENT '主键', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `number` int(11) NULL DEFAULT NULL COMMENT '更新数量', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of bag_update +-- ---------------------------- + +-- ---------------------------- +-- Table structure for fst +-- ---------------------------- +DROP TABLE IF EXISTS `fst`; +CREATE TABLE `fst` ( + `id` int(11) NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `parent_id` int(11) NULL DEFAULT NULL, + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `reserved_json` json NULL, + `bag_sum` int(11) NULL DEFAULT NULL, + `level` tinyint(4) NULL DEFAULT NULL COMMENT '标签层级:0最高,1=一级, 2=二级, 3=三级, 4=四级', + `name_cn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '中文', + `annotation` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签解释', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of fst +-- ---------------------------- +INSERT INTO `fst` VALUES (385, 'LANE_KEEPING_PERCEPTION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (386, 'U_TURN_INTERSECTION', 395, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (387, 'ROUNDABOUT_1ST_EXIT_TRAFFIC_LIGHT', 426, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (388, 'LANE_CHANGE_INTERACTION_DRIVER_TRIGGER', 681, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (389, 'OBJECT_CUTIN_STOP_AND_GO_TRAFFIC_CUTIN_OBJ', 685, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (390, 'TRAFFIC_LIGHT_COUNTDOWN', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (391, 'CRUISE_SPDLIM_TAKEOVER_VIA_RESUME', 700, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (392, 'LANE_KEEPING_ROAD_SHAPE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (393, 'TRAFFIC_LIGHT_START_AND_BRAKE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (394, 'LANE_BORROWING_DODGE_AL_STANDING_TRIANGLE_WARNING_SIGNS', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (395, 'U_TURN', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (396, 'MERGE_LANE_GAP', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (397, 'TOLL_STATION_ENTER_LANE_SELECTION_ETC_LANE', 457, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (398, 'LANE_BORROWING_DODGE_AL_MOVING_OBSTACLES', 454, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (399, 'SPLIT_ENTER_DEDICATED_LEFT_TURN_LANE', 676, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (400, 'LANE_CHANGE_NAV_HIGHWAYTORAMP', 537, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (401, 'INTERSECTION_GO_STRAIGHT_WITH_STRAIGHT_TRANSFER_AREA', 711, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (402, 'MERGE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (403, 'CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_PLASTIC_BARRIER', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (404, 'CRUISE_ADJAC_TRAFFIC_CONVOY_ON_LFT_EGO_PASSES_ON_RGT', 629, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (405, 'CRUISE_MOTION_SLOWDOWN_DESCEND_DECEL', 635, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (406, 'ROUNDABOUT_3RD_EXIT_TRAFFIC_LIGHT', 534, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (407, 'TOLL_STATION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (408, 'OBJECT_PERCEPTION_TYPES_PEDESTRIANS', 551, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (409, 'START_STOP_BRAKING_STANDING_RPV', 753, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (410, 'LANE_BORROWING_DODGE_AL_STANDING_CONSTRUCTION_SIGNS', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (411, 'U_TURN_DEDICATED_LANE_WITHOUT_TRAFFIC_LIGHT', 765, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (412, 'SMALL_VEHICLE_CROSS_GO_STRAIGHT_ROADGAP', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (413, 'OBJECT_PERCEPTION_TYPES_SPEEDBUMPERS_LOAD_LEASHES', 439, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (414, 'CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST', 727, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (415, 'SPLIT_OBJECT', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (416, 'LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_REDUCE_PASSINGBY_SPEED', 674, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (417, 'TRAFFIC_LIGHT_RED_LIGHT_WAITING_TURN_LEFT', 747, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (418, 'LANE_CHANGE_AVOID_ENTRY_LANE', 550, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (419, 'OBJECT_PERCEPTION_TYPES_TOWTRUCK_TOWING_VEHICLES', 756, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (420, 'CRUISE_MOTION_STARTUP_SETSPD_50KPH_ACCEL', 645, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (421, 'U_TURN_IN_ROAD', 395, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (422, 'LANE_CHANGE_AVOID_BUS_LANE', 550, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (423, 'LANE_KEEPING_SMALL_BEND_HIGHWAY_ENTRY', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (424, 'UNALIGNED_INTERSECTION_GO_STRAIGHT', 711, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (425, 'LANE_KEEPING_PERCEPTION_ILLUMINATION', 385, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (426, 'ROUNDABOUT_1ST_EXIT', 600, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (427, 'LANE_KEEPING_PERCEPTION_ONE_SIDE_WIDE_LANE_WIDTH', 639, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (428, 'OBJECT_PERCEPTION_TYPES_VEHICLES_DRIVING_BACKWARDS_TOWARDS_EGO', 490, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (429, 'OBJECT_PERCEPTION_TYPES_WHEEL', 763, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (430, 'LANE_KEEPING_PERCEPTION_WEATHER_COND_FOG', 459, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (431, 'CRUISE_SPDLIM_CHANGE_DRIVER_INTERVENT_RESET_SETSPD', 700, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (432, 'LANE_CHANGE_OVERTAKE_SMALL_VEHICLE', 726, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (433, 'ROUNDABOUT_ENTRY', 660, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (434, 'SMALL_VEHICLE_CROSS_DURING_UTURN', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (435, 'TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_HIDDEN_BY_BIGVEHICLE', 678, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (436, 'OBJECT_CUTIN_FLUENT_TRAFFIC_CUTIN_FASTER_THAN_EGO', 720, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (437, 'CRUISE_MOTION_DECEL', 663, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (438, 'SPLIT_ENTER_MAIN_ROAD', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (439, 'OBJECT_PERCEPTION_TYPES_OVERRIDABLE_OBSTACLES', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (440, 'PENETRATION_POST_TOLL_BOOTH', 734, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (441, 'CRUISE_MOTION_ACTIVATE_FASTER_THAN_SETSPD_DECEL', 437, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (442, 'LARGE_VEHICLE_CROSS_RIGHT_TURN', 509, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (443, 'VRU_CROSS_FAR', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (444, 'LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_GAP_SEL_SMALL_DISTANCE', 674, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (445, 'UNALIGNED_INTERSECTION_GO_STRAIGHT_M2N', 424, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (446, 'LANE_KEEPING_OFFSET_CORRECTION_SAME_DRIVING_DIRECTION', 712, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (447, 'CRUISE_UPCOMING_SPDLIM_MIDDLELANE', 466, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (448, 'TOLL_STATION_PREFER_RIGHT_LANE_WITHOUT_ETC', 610, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (449, 'CRUISE_MOTION_DRIVER_OVR_CC_THEN_RELEASE_DECEL', 437, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (450, 'ROUNDABOUT_1ST_EXIT_NO_TRAFFIC_LIGHT', 426, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (451, 'SMALL_VEHICLE_CROSS_LEFT_TURN', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (452, 'CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST', 727, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (453, 'TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_UNUSED_LIGHT', 678, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (454, 'LANE_BORROWING_DODGE_AL', 504, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (455, 'LANE_KEEPING_OFFSET_CORRECTION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (456, 'INTERSECTION_RIGHT_TURN_1ST_LEFT_LANE', 475, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (457, 'TOLL_STATION_ENTER_LANE_SELECTION_AT_SQUARE', 702, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (458, 'MERGE_TRAFFIC_JAM', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (459, 'LANE_KEEPING_PERCEPTION_WEATHER_COND', 385, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (460, 'CRUISE_SPDLIM_LANE_LVL', 542, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (461, 'TRAFFIC_LIGHT_RED_LIGHT_WAITING_GO_STRAIGHT', 747, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (462, 'INTERSECTION_RIGHT_TURN_1ST_RIGHT_LANE', 475, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (463, 'U_TURN_IN_ROAD_OPENNING_GAP', 421, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (464, 'OBJECT_PERCEPTION_TYPES_BICYCLES_ESCOOTERS', 551, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (465, 'CLOSING_EGO_LANE_MERGED_INTO_AL_STATIC_CAR', 701, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (466, 'CRUISE_UPCOMING_SPDLIM_LANE_LVL_UNMOD_SETSPD', 460, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (467, 'LANE_BORROWING_DODGE_AL_MOVING_LARGE_VEHICLE', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (468, 'CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_CONE', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (469, 'LANE_BORROWING_DODGE_AL_STANDING_CONE_LANE', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (470, 'CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES_HAVING_DIFFERENT_SPD', 491, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (471, 'U_TURN_DEDICATED_LANE_WITH_TRAFFIC_LIGHT', 765, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (472, 'SPLIT_1_TO_3', 585, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (473, 'LANE_KEEPING_PERCEPTION_WEATHER_COND_RAIN', 459, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (474, 'MERGE_2_TO_1', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (475, 'INTERSECTION_RIGHT_TURN', 746, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (476, 'CRUISE_TRAFFIC_JAM_APPROACH_MODERATE_TARGET_SPEED', 673, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (477, 'ROUNDABOUT_3RD_EXIT_NO_TRAFFIC_LIGHT', 534, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (478, 'TRAFFIC_LIGHT_YELLOW_LIGHT_PASSING', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (479, 'TRAFFIC_LIGHT_YELLOW_LIGHT_FLASHING_PASSING', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (480, 'LANE_KEEPING_LARGE_BEND_FEDERAL_ROAD', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (481, 'LANE_KEEPING_PERCEPTION_WEATHER_COND_SNOW_ON_ROAD', 459, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (482, 'SPLIT_RB_BRIDGE', 547, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (483, 'U_TURN_INTERSECTION_ROUND_TRAFFIC_LIGHT', 386, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (484, 'LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_REVERSING_DRIVING', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (485, 'SPLIT_M2N', 585, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (486, 'START_STOP_SLOW_STARTING_RPV', 754, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (487, 'U_TURN_IN_ROAD_DASHED_LINE', 421, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (488, 'LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC_BOUNDARIES', 455, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (489, 'SPLIT_1_TO_2', 585, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (490, 'OBJECT_PERCEPTION_TYPES_VEHICLES_MOVING_TOWARDS_EGO', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (491, 'CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES', 629, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (492, 'CRUISE_SPDLIM_PERCEPTION', 542, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (493, 'CRUISE_MOTION_SETSPD_DECREASE_MORETHAN_10KPH_DECEL', 752, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (494, 'MERGE_3_TO_1', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (495, 'LANE_BORROWING_DODGE_AL_STANDING_ROADEDGES', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (496, 'LANE_CHANGE_AVOID_SLOW_SL_LANE', 550, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (497, 'OBJECT_PERCEPTION_TYPES_VEHICLES_ASCEND_ROLL_BACKWARDS_FROM_STANDSTILL', 490, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (498, 'LANE_KEEPING_LANE_WIDTH_REGULAR_LANE_WIDTH', 558, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (499, 'OBJECT_DISTCTRL_MODERATE_LONGIT_DYN', 531, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (500, 'PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP_WITH_DRIVING_AGENTS', 584, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (501, 'LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR_DEAD', 561, '2025-06-25 16:09:06', NULL, NULL, 5, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (502, 'CRUISE_UPCOMING_SPDLIM_LANE_LVL_LANECHG_TO_SLOWER', 460, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (503, 'LANE_BORROWING_DODGE_SPLIT_POINT', 504, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (504, 'LANE_KEEPING_DODGING', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (505, 'CRUISE_UPCOMING_SPDLIM_LANE_LVL_LANECHG_TO_FASTER', 460, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (506, 'CRUISE_MOTION_CUTOUT_BEHIND_SLOW_RPV_ACCEL', 645, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (507, 'U_TURN_INTERSECTION_LEFT_TURN', 386, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (508, 'LANE_KEEPING_PERCEPTION_BOTH_SIDES', 725, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (509, 'LARGE_VEHICLE_CROSS_HANDLING', 633, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (510, 'LANE_CHANGE_OVERTAKE_BICYCLIST', 726, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (511, 'CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_LFT_EGO_PASSES_ON_RGT', 404, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (512, 'INTERSECTION_RIGHT_TURN_DEDICATED_LANE', 475, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (513, 'LANE_KEEPING_SMALL_BEND_HIGHWAY_EXIT', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (514, 'OCCLUSION_VRU_CROSS', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (515, 'SMALL_VEHICLE_CROSS_RIGHT_TURN', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (516, 'OBJECT_PERCEPTION_TYPES_ONCOMING VEHICLES', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (517, 'SPLIT_ENTER_SUBROAD_OCCLUSION', 597, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (518, 'LANE_BORROWING_DODGE_OL_OBJECT', 620, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (519, 'LANE_BORROWING_DODGE_AL_MOVING_VRU', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (520, 'OBJECT_DISTCTRL_DYNAMIC_RPV', 686, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (521, 'U_TURN_SPECIAL_CASE', 395, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (522, 'LANE_BORROWING_DODGE_OL_SOLID_LINE', 620, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (523, 'LANE_CHANGE_NAV_ON_CLOSINGLANE_NON_CONGESTED', 570, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (524, 'TOLL_STATION_LEAVE_DRIVE_OFF_AFTER_ROD_OPEN', 616, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (525, 'TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_TURN_RIGHT', 622, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (526, 'TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_GO_STRAIGHT', 622, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (527, 'ALIGNED_INTERSECTION_GO_STRAIGHT', 711, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (528, 'CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT', 715, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (529, 'LARGE_VEHICLE_CROSS_ROADGAP', 509, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (530, 'OBJECT_PERCEPTION_TYPES_VEHICLES_SEVERAL_OBJECTS_ON_EGO_DRIVING_LANE', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (531, 'OBJECT_DISTANCE_CONTROL', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (532, 'INTERSECTION_LEFT_TURN_MOSTRIGHT_LANE', 636, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (533, 'U_TURN_DEDICATED_LANE_SHORT_UTURN_LIGHT', 765, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (534, 'ROUNDABOUT_3RD_EXIT', 600, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (535, 'LANE_KEEPING_PERCEPTION_WEATHER_COND_SNOWY_WEATHER', 459, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (536, 'OBJECT_CUTIN_SUDDEN_AND_CLOSE_CUTIN', 720, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (537, 'LANE_CHANGE_NAVIGATION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (538, 'CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE_GET_INFRONT_OBJECT', 675, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (539, 'CRUISE_TRAFFIC_JAM_APPROACH_SLOW_TARGET_SPEED', 673, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (540, 'LANE_BORROWING_DODGE_AL_MOVING_VRU_REVERSE', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (541, 'LANE_CHANGE_OVERTAKE_LARGE_VEHICLE', 726, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (542, 'CRUISE_SPDLIM', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (543, 'OBJECT_CUTIN_SMALL_VEHICLES', 679, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (544, 'TRAFFIC_LIGHT_GREEN_LIGHT_FLASHING_PASSING', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (545, 'TRAFFIC_LIGHT_RED_LIGHT_BRAKE_AND_STOP', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (546, 'SMALL_VEHICLE_CROSS_TRAFFIC_JAM', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (547, 'SPLIT_RB', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (548, 'OBJECT_CUTIN_BIG_VEHICLES', 679, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (549, 'CRUISE_SPDLIM_CHG_SETSPD_HIGHER_THAN_NEW_LIMIT', 601, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (550, 'LANE_CHANGE _AVOID_EVENT', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (551, 'OBJECT_PERCEPTION_TYPESVRUs', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (552, 'OBJECT_CUTIN_STOP_AND_GO_TRAFFIC_FOLLOW_DENSLY', 685, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (553, 'SMALL_VEHICLE_CROSS_GO_STRAIGHT', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (554, 'U_TURN_DEDICATED_LANE_CIRCLE_LIGHT', 471, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (555, 'CRUISE_SPDLIM_NO_TAKEOVER_FROM_TRAFFICAGENTS', 492, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (556, 'VRU_CROSS_IN_ROAD_GAP', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (557, 'TOLL_STATION_PREFER_LEFT_LANE_WITH_ETC', 610, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (558, 'LANE_KEEPING_LANE_WIDTH', 392, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (559, 'OBJECT_DISTCTRL_SLOW_OR_STANDING_HIDDEN_RPV', 686, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (560, 'START_STOP_QUICK_STARTING_RPV', 754, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (561, 'LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (562, 'CLOSING_ADJACENT_LANE_LANE_CHANGE_POSSIBLE', 730, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (563, 'LARGE_VEHICLE_CROSS_LEFT_TURN', 509, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (564, 'CLOSING_EGO_LANE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (565, 'CLOSING_EGO_LANE_MERGED_INTO_AL_HEAVY_TRAFFIC', 701, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (566, 'LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED', 570, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (567, 'START_STOP_ACCEL_TO_DECEL', 753, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (568, 'LANE_KEEPING_LANE_WIDTH_WIDE_ENTRIES', 644, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (569, 'LANE_BORROWING_DODGE_AL_STANDING_GAURDRAIL', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (570, 'LANE_CHANGE_NAV_ON_CLOSINGLANE', 537, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (571, 'OBJECT_CUTIN_BIG_VEHICLES_PARTLY_ON_SIDE_WHEN_CUTTING_IN', 548, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (572, 'LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED_GAP_SELECTION', 566, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (573, 'LANE_CHANGE_AVOID_OCCUPIED_VEHICLE', 550, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (574, 'TRAFFIC_LIGHT_GREEN_LIGHT_START', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (575, 'INTERSECTION_RIGHT_TURN_2ND_RIGHT_LANE', 475, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (576, 'OBJECT_PERCEPTION_TYPES_TRICYCLES', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (577, 'CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_CONE', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (578, 'LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_DOOR_OPEN', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (579, 'TOLL_STATION_LEAVE_PASSING_NO_LANE_MARKING_SQUARE_AFTER_ROD', 616, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (580, 'PENETRATION_STANDING_VEH_ON_SHOULDER_REMARKABLE_OVERLAP', 734, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (581, 'OBJECT_DISTCTRL_BIG_DISTANCE_RPV', 531, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (582, 'INTERSECTION_GO_STRAIGHT_MULTI_EXITS', 711, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (583, 'LANE_CHANGE_NAV_ON_CLOSINGLANE_CONGESTED_STANDSTILL', 566, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (584, 'PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP', 734, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (585, 'SPLIT_1_TO_X', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (586, 'LANE_KEEPING_OFFSET_CORRECTION_CONES', 488, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (587, 'ROUNDABOUT_4TH_EXIT_TRAFFIC_LIGHT', 588, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (588, 'ROUNDABOUT_4TH_EXIT', 600, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (589, 'LANE_KEEPING_CURVED_HIGHWAY', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (590, 'CRUISE_MOTION_SETSPD_INCREASE_EQUAL_10KPH_ACCEL', 752, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (591, 'MB Driving FST V1', NULL, '2025-06-25 16:09:06', NULL, NULL, 0, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (592, 'TRAFFIC_LIGHT_RED_LIGHT_BRAKE_AS_FIRST_CAR', 545, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (593, 'LANE_KEEPING_PERCEPTION_ILLUMINATION_TUNNEL', 425, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (594, 'U_TURN_IN_ROAD_GRID_LINE', 421, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (595, 'CRUISE_SPDLIM_CHG_SETSPD_BETW_OLD_AND_NEW_LIMIT', 601, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (596, 'LANE_KEEPING_LANE_WIDTH_WIDE_INTERCHANGES', 644, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (597, 'SPLIT_ENTER_SUBROAD', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (598, 'TRAFFIC_LIGHT_YELLOW_LIGHT_BRAKE_AND_STOP', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (599, 'START_STOP_DESCENT', 618, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (600, 'ROUNDABOUT_EXIT', 660, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (601, 'CRUISE_SPDLIM_CHG_TO_HIGHER_VALUE', 608, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (602, 'U_TURN_DEDICATED_LANE_LEFT_TURN_LIGHT', 471, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (603, 'PENETRATION_STANDING_VEH_ON_SHOULDER_MAJOR_OVERLAP', 734, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (604, 'CRUISE_SPDLIM_CHG_TAKEOVER_NEW_LIMIT', 630, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (605, 'OCCLUDED_SMALL_VEHICLE_CROSS_GO_STRAIGHT', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (606, 'LANE_KEEPING_PERCEPTION_ONE_SIDE_REGULAR_LANE_WIDTH', 639, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (607, 'OBJECT_START_AND_STOP', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (608, 'CRUISE_SPDLIM_UPCOMING', 542, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (609, 'OBJECT_PERCEPTION_TYPES_VEHICLES_WITH_LOAD_EXCEEDING_LOADING_AREA', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (610, 'TOLL_STATION_ENTER_LANE_SELECTION_BEFORE_SQUARE', 702, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (611, 'LANE_KEEPING_LANE_WIDTH_NARROW_LANE_WIDTH', 558, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (612, 'TRAFFIC_LIGHT_GREEN_LIGHT_FLASHING_BRAKE_AND_STOP', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (613, 'SPLIT', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (614, 'LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED_GAP_SEL_BIG_DISTANCE', 674, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (615, 'START_STOP_PLANE_ROAD', 618, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (616, 'TOLL_STATION_LEAVE', 407, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (617, 'CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_PLASTIC_BARRIER', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (618, 'START_STOP_TRAFFIC', 607, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (619, 'CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE_KEEP_BEHIND_OBJECT', 675, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (620, 'LANE_BORROWING_DODGE_OL', 504, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (621, 'VRU_CROSS_HANDLING', 633, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (622, 'TRAFFIC_LIGHT_GREEN_LIGHT_PASSING', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (623, 'LANE_BORROWING_DODGE_AL_STANDING_CONSTRUCTION_WALLS', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (624, 'CLOSING_EGO_LANE_MERGED_INTO_AL_UNOCCUPIED', 564, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (625, 'MERGE_WITH_ORIGINAL_LANE', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (626, 'CRUISE_MOTION_SETSPD_INCREASE_MORETHAN_10KPH_ACCEL', 752, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (627, 'SMALL_VEHICLE_CROSS_HANDLING', 633, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (628, 'CLOSING_ADJACENT_LANE_HEAVY_TRAFFIC_COOPERATRIVE_DRIVING', 730, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (629, 'CRUISE_ADJACENT_TRAFFIC', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (630, 'CRUISE_SPDLIM_CHG_TO_LOWER_VALUE', 608, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (631, 'SPLIT_ENTER_MAIN_ROAD_CROSS_NON_MOTORIZED_LANE', 438, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (632, 'LANE_CHANGE_OVERTAKE_TRICYCLIST', 726, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (633, 'CROSS_HANDLING', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (634, 'LANE_KEEPING_STAIGHT_LANE', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (635, 'CRUISE_MOTION_SLOPE', 663, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (636, 'INTERSECTION_LEFT_TURN', 746, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (637, 'LANE_BORROWING_DODGE_AL_STANDING_FALLING_GOODS', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (638, 'SPLIT_RB_CONE', 547, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (639, 'LANE_KEEPING_PERCEPTION_ONE_SIDE', 725, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (640, 'START_STOP_LINEAR_DECEL_RPV', 753, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (641, 'OBJECT_CUTIN_FLUENT_TRAFFIC_SAME_SPD_SHORT_DIST', 720, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (642, 'OBJECT_DISTCTRL_STRONG_ACCEL_RPV', 520, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (643, 'TRAFFIC_LIGHT_GREEN_LIGHT_PASSING_TURN_LEFT', 622, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (644, 'LANE_KEEPING_LANE_WIDTH_WIDE_LANE_WIDTH', 558, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (645, 'CRUISE_MOTION_ACCEL', 663, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (646, 'CONSTRUCTION_SITE_LANE_CHANGE_TO_AVOID_WORKZONE_BOARD', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (647, 'CRUISE_UPCOMING_SPDLIM_FASTLANE_LVL', 466, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (648, 'U_TURN_INTERSECTION_UTURN_LIGHT', 386, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (649, 'LANE_KEEPING_PERCEPTION_ILLUMINATION_NIGHT', 425, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (650, 'CRUISE_ADJAC_TRAFFIC_FAST_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT', 715, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (651, 'ROUNDABOUT_2ND_EXIT_TRAFFIC_LIGHT', 659, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (652, 'VRU_CROSS_GO_STRAIGHT', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (653, 'OBJECT_PERCEPTION_TYPES_SPEEDBUMPERS', 439, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (654, 'OBJECT_PERCEPTION_TYPES_TARPAULIN_TRAILERS', 756, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (655, 'LANE_CHANGE_NAV_HIGHWAYTORAMP_NON_CONGESTED', 400, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (656, 'PENETRATION_STANDING_WIDE_LANE_SMALL_OVERLAP_NO_OTHER_AGENTS', 584, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (657, 'CRUISE_MOTION_ACTIVATE_SLOWER_THAN_SETSPD_ACCEL', 645, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (658, 'VRU_CROSS_LEFT_TURN ', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (659, 'ROUNDABOUT_2ND_EXIT', 600, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (660, 'ROUNDABOUT_DRIVING', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (661, 'CRUISE_SPDLIM_CHG_USE_NEW_LIMIT', 601, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (662, 'ROUNDABOUT_2ND_EXIT_NO_TRAFFIC_LIGHT', 659, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (663, 'CRUISE_MOTION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (664, 'U_TURN_DEDICATED_LANE_UTURN_LIGHT ', 471, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (665, 'SPLIT_ENTER_DEDICATED_RIGHT_TURN_LANE', 676, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (666, 'ALIGNED_INTERSECTION_GO_STRAIGHT_N2N', 527, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (667, 'LANE_BORROWING_DODGE_AL_STANDING_OBSTACLES', 454, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (668, 'LANE_BORROWING_DODGE_AL_STANDING_TRAFFIC_PILLARS', 667, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (669, 'OBJECT_CUTIN_BIG_VEHICLES_COMPLETELY_POSITIONED_IN_FRONT', 548, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (670, 'CRUISE_UPCOMING_SPDLIM_SLOWLANE_LVL', 466, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (671, 'VRU_CROSS_RIGHT_TURN ', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (672, 'LANE_KEEPING_CURVED_ROAD', 392, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (673, 'CRUISE_TRAFFIC_JAM_APPROACH', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (674, 'LANE_CHANGE_NAV_HIGHWAYTORAMP_CONGESTED', 400, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (675, 'CLOSING_ADJACENT_LANE_PASSINGBY_CLOSING_LANE', 730, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (676, 'SPLIT_DEDICATED_LANE', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (677, 'INTERSECTION_LEFT_TURN_1ST_LEFT_LANE', 636, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (678, 'TRAFFIC_LIGHT_BLACK_LIGHT_PASSING', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (679, 'OBJECT_CUTIN', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (680, 'START_STOP_ACSCENT', 618, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (681, 'LANE_CHANGE_INTERACTION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (682, 'START_STOP_PROGRESSIVE_DECEL_RPV', 753, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (683, 'OBJECT_DISTCTRL_STRONG_DECEL_RPV', 520, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (684, 'CRUISE_MOTION_SPEEDUP_ ASCEND_ACCEL', 635, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (685, 'OBJECT_CUTIN_STOP_AND_GO_TRAFFIC', 679, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (686, 'OBJECT_DISTCTRL_HIGH_LONGIT_DYN', 531, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (687, 'CRUISE_ADJAC_TRAFFIC_SLOW_CONVOY_ON_LFT_EGO_PASSES_ON_RGT', 404, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (688, 'TOLL_STATION_LEAVE_SET_SPEED_ADJUST_TO_60kph_AFTER_PASSING_ROD', 616, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (689, 'GO_STRAIGHT_LARGE_VEHICLE_CROSS_DURING_REVERSING', 509, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (690, 'LANE_KEEPING_OFFSET_CORRECTION_GUARDRAILS', 488, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (691, 'OBJECT_PERCEPTION_TYPES', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (692, 'CRUISE_REPEATED_SPD_LIMIT_KEEP_MODIFIED_SETSPD', 700, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (693, 'CONSTRUCTION_SITE_BRAKE_TO_STANDSTILL_BEFORE_WORKZONE_BOARD', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (694, 'SPLIT_EXIT_TUNNEL', 613, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (695, 'CRUISE_SPDLIM_CHG_SETSPD_LOWER_THAN_OLD_LIMIT', 601, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (696, 'OBJECT_PERCEPTION_TYPES_FLAT_EMPTY_TRAILERS', 756, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (697, 'CRUISE_ADJAC_TRAFFIC_CONVOY_ON_BOTH_SIDES_HAVING_SIMILAR_SPD', 491, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (698, 'CRUISE_MOTION_CCMODE_KEEP_SETSPD', 635, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (699, 'LANE_BORROWING_DODGE_SOLID_LINE', 504, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (700, 'CRUISE_SPDLIM_DRIVER', 542, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (701, 'CLOSING_EGO_LANE_MERGED_INTO_AL_OCCUPIED', 564, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (702, 'TOLL_STATION_ENTER', 407, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (703, 'OBJECT_PERCEPTION_TYPES_BUS', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (704, 'U_TURN_BEFORE_INTERSECTION_DASHED_LINE', 735, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (705, 'U_TURN_INTERSECTION_NO_TRAFFIC_LIGHT', 386, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (706, 'OBJECT_CUTIN_HIGH_LATERAL_SPEED', 543, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (707, 'SPLIT_ENTER_SUBROAD_UNDER_EXPRESS', 597, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (708, 'LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_PARKING', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (709, 'LARGE_VEHICLE_CROSS_GO_STRAIGHT', 509, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (710, 'CRUISE_SPDLIM_TAKEOVER_FROM_TEMPORARY_SIGNS', 492, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (711, 'INTERSECTION_GO_STRAIGHT', 746, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (712, 'LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC', 455, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (713, 'TRAFFIC_LIGHT_BLACK_LIGHT_PASSING_ABNORMAL', 678, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (714, 'INTERSECTION_LEFT_TURN_WAITING_AREA', 636, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (715, 'CRUISE_ADJAC_TRAFFIC_CONVOY_ON_RIGHT_EGO_PASSES_ON_LFT', 629, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (716, 'ROUNDABOUT_LANE_CHANGE', 660, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (717, 'LANE_KEEPING_OFFSET_CORRECTION_OPPOSITE_DRIVING_DIRECTION', 712, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (718, 'OBJECT_PERCEPTION_TYPES_PLASTICBAGS', 439, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (719, 'LANE_KEEPING_SCURVE_FEDERAL_ROAD', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (720, 'OBJECT_CUTIN_REGULAR_VEHICLES', 679, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (721, 'SMALL_VEHICLE_CROSS_DURING_REVERSING', 627, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (722, 'LANE_KEEPING_LANE_WIDTH_WIDE_EXITS', 644, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (723, 'OBJECT_CUTIN_SLOW_OBJ_ON_ADJ_LANE_AHEAD_OF_CUTIN', 720, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (724, 'LANE_BORROWING_DODGE_AL_STANDING_STATIC_CAR_TEMPORARY', 561, '2025-06-25 16:09:06', NULL, NULL, 5, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (725, 'LANE_KEEPING_PERCEPTION_BAD_LANE_MARKING', 385, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (726, 'LANE_CHANGE_OVERTAKE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (727, 'CRUISE_ADJAC_TRAFFIC_CONVOY_ON_RGT_EGO_PASSES_ON_LFT_MOST', 629, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (728, 'LANE_KEEPING_OFFSET_CORRECTION_TRAFFIC_JAM_ON_SIDE new added', 712, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (729, 'ALIGNED_INTERSECTION_GO_STRAIGHT_M2N', 527, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (730, 'CLOSING_ADJACENT_LANE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (731, 'OBJECT_PERCEPTION_TYPES_VEHICLES_DRIVING_WRONG_DIRECTION_TOWARDS_EGO', 516, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (732, 'CONSTRUCTION_SITE', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (733, 'ROUNDABOUT_4TH_EXIT_NO_TRAFFIC_LIGHT', 588, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (734, 'EGO_LANE_PENETRATION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (735, 'U_TURN_BEFORE_INTERSECTION', 395, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (736, 'MERGE_LEFT_TURN', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (737, 'VRU_CROSS_CLOSE', 621, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (738, 'TOLL_STATION_ENTER_BRAKE_TO_STANDSTILL_BEFORE_CLOSED_ROD', 702, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (739, 'PENETRATION_WIDE_LANE_SMALL_VEHICLE_NO_OVERTAKE', 734, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (740, 'INTERSECTION_LEFT_TURN_3RD_LEFT_LANE', 636, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (741, 'OBJECT_PERCEPTION_TYPES_WASHING_MASCHINE_SIZED_OBJECTS', 763, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (742, 'UNALIGNED_INTERSECTION_GO_STRAIGHT_N2N', 424, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (743, 'CRUISE_MOTION_SETSPD_DECREASE_EQUAL_10KPH_DECEL', 752, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (744, 'U_TURN_NARROW_ROAD', 395, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (745, 'TOLL_STATION_ENTER_LANE_SELECTION_MANUAL_CHARING_LANE', 457, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (746, 'INTERSECTION', 591, '2025-06-25 16:09:06', NULL, NULL, 1, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (747, 'TRAFFIC_LIGHT_RED_LIGHT_WAITING', 393, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (748, 'LANE_KEEPING_WIDE_BEND_ROAD_FEDERAL_ROAD', 672, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (749, 'ROUNDABOUT_LIGHT_STOP_AND_GO', 660, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (750, 'OCCLUDEDBYCAR_VRU_CROSS', 514, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (751, 'CONSTRUCTION_SITE_FOLLOW_CHICANE_LANE', 732, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (752, 'CRUISE_MOTION_SETSPD', 663, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (753, 'START_STOP_BRAKING_STANDSTILL', 607, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (754, 'START_STOP_STARTING_RPV', 607, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (755, 'OCCLUDEDBYWALL_VRU_CROSS', 514, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (756, 'OBJECT_PERCEPTION_TYPES_TRUCKS', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (757, 'LANE_CHANGE_AVOID_EXIT_LANE', 550, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (758, 'PENETRATION_STANDING_VEH_ON_SHOULDER_MINOR_OVERLAP', 734, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (759, 'OBJECT_CUTIN_FLUENT_TRAFFIC_SAME_SPD_REGULAR_DIST', 720, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (760, 'LANE_BORROWING_DODGE_AL_MOVING_SMALL_VEHICLE_CLOSE_PARALLEL', 398, '2025-06-25 16:09:06', NULL, NULL, 4, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (761, 'OBJECT_PERCEPTION_TYPES_TARPAULIN_TRAILERS_WITH_VEHICLE_IMAGES', 756, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (762, 'MERGE_RIGHT_TURN', 402, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (763, 'OBJECT_PERCEPTION_TYPES_NON_OVERRIDABLE_OBSTACLES', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (764, 'OBJECT_PERCEPTION_TYPES_MOTORCYCLES', 691, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (765, 'U_TURN_DEDICATED_LANE', 395, '2025-06-25 16:09:06', NULL, NULL, 2, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (766, 'INTERSECTION_LEFT_TURN_UNPROTECTED', 636, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (767, 'INTERSECTION_LEFT_TURN_2ND_LEFT_LANE', 636, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); +INSERT INTO `fst` VALUES (768, 'SPLIT_ENTER_MAIN_ROAD_OCCLUSION', 438, '2025-06-25 16:09:06', NULL, NULL, 3, NULL, '这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是,这是标签描述,这个标签的意思是'); + +-- ---------------------------- +-- Table structure for operation_history +-- ---------------------------- +DROP TABLE IF EXISTS `operation_history`; +CREATE TABLE `operation_history` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_id` bigint(20) UNSIGNED NOT NULL COMMENT '用户ID', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名(冗余存储,方便查询)', + `api_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '接口路径', + `http_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'HTTP方法(GET/POST/PUT/DELETE等)', + `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数(存储JSON格式)', + `response_code` int(11) NULL DEFAULT NULL COMMENT '响应状态码', + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端IP地址', + `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户代理信息', + `operation_result` tinyint(4) NOT NULL DEFAULT 1 COMMENT '操作结果(1=成功,0=失败)', + `error_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息(失败时记录)', + `trace_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求追踪ID(用于分布式系统)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_user_id`(`user_id`) USING BTREE, + INDEX `idx_operation_time`(`operation_time`) USING BTREE, + INDEX `idx_api_path`(`api_path`) USING BTREE, + INDEX `idx_user_operation`(`user_id`, `operation_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 83 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户接口操作历史记录表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of operation_history +-- ---------------------------- +INSERT INTO `operation_history` VALUES (1, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-10 09:43:18', NULL, 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (2, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-10 10:11:11', '{\"id\": null, \"page\": 1, \"per_page\": 20, \"name\": \"\", \"tag_id\": \"\", \"start_time\": \"\", \"end_time\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (3, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-10 10:14:03', '{\"id\": null, \"page\": 1, \"per_page\": 20, \"name\": \"\", \"tag_id\": \"\", \"start_time\": \"\", \"end_time\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (4, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 15:41:11', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (5, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:29:35', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (6, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:29:41', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 1}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (7, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:29:53', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (8, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:30:05', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 1}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (9, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:32:06', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (10, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:33:05', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (11, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:33:12', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (12, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:38:20', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', NULL, '127.0.0.1', NULL, 0, '\'tuple\' object has no attribute \'status_code\'', NULL); +INSERT INTO `operation_history` VALUES (13, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:41:06', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', NULL, '127.0.0.1', NULL, 0, '\'tuple\' object has no attribute \'status_code\'', NULL); +INSERT INTO `operation_history` VALUES (14, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:41:10', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', NULL, '127.0.0.1', NULL, 0, '\'tuple\' object has no attribute \'status_code\'', NULL); +INSERT INTO `operation_history` VALUES (15, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:42:24', '{\"page\": 1, \"per_page\": 50, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (16, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:42:52', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (17, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:43:08', '{\"page\": 2, \"per_page\": 5, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (18, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:44:27', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": 0}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (19, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:44:36', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (20, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:45:32', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"PL123456_event_all_time_event_20250618-104808.bag\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (21, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:46:25', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"PL123456_event_all_time_event_20250524-180926.bag\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (22, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:48:30', '{\"id\": null, \"page\": 1, \"per_page\": 20, \"name\": \"\", \"tag_id\": \"\", \"start_time\": \"\", \"end_time\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (23, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:49:35', '{\"id\": null, \"page\": 1, \"per_page\": 20, \"name\": \"1\", \"tag_id\": \"\", \"start_time\": \"\", \"end_time\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (24, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:49:41', '{\"id\": null, \"page\": 1, \"per_page\": 20, \"name\": \"\", \"tag_id\": \"1\", \"start_time\": \"\", \"end_time\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (25, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:50:04', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"PL123456_event_all_time_event_20250524-180926.bag\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (26, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:56:47', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"PL123456_event_all_time_event_20250524-180926.bag\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (27, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:58:02', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"PL123456_event_all_time_event_20250524-180926.bag\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (28, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:58:42', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (29, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:59:53', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"id\": 1, \"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (30, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 16:59:58', '{\"page\": 1, \"per_page\": 5, \"filters\": {\"id\": 1, \"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (31, 1, 'admin', '/api/data/baglist', 'POST', '2025-07-14 17:00:18', '{\"page\": 1, \"per_page\": 5, \"id\": 1, \"filters\": {\"file_name\": \"\", \"start_datetime\": \"\", \"end_datetime\": \"\", \"first_tag_id\": null, \"status\": null}, \"sort\": {\"field\": \"capture_datetime\", \"order\": \"desc\"}}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (32, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:26:04', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (33, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:26:35', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (34, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:31:50', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (35, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:32:23', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (36, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:32:35', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (37, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:34:07', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (38, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:34:17', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (39, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:34:20', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (40, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:35:35', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (41, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:35:55', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (42, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:37:20', '{\"userid\": \"1\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (43, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:38:36', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (44, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:38:38', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (45, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:39:03', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (46, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:39:26', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (47, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:39:46', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (48, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:40:29', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (49, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:40:32', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (50, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:42:04', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (51, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:42:26', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (52, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:42:47', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (53, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:43:03', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (54, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:43:28', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (55, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:43:45', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (56, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:44:01', '{\"userid\": \"\", \"bag_file_id\": \"1\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (57, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:44:07', '{\"userid\": \"\", \"bag_file_id\": \"2\", \"status\": \"\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (58, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:45:48', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (59, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:45:51', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (60, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:46:06', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (61, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:46:12', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (62, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:46:41', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (63, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:46:52', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (64, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:46:58', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (65, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:47:08', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (66, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:47:11', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (67, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:47:14', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"385\", \"fst_id\": \"\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (68, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-15 15:47:30', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"385\"}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (69, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:34:49', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"385\", \"page\": 1, \"per_page\": 10}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (70, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:34:58', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 10}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (71, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:35:04', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (72, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:36:00', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (73, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:36:17', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (74, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:38:08', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (75, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:40:06', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (76, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:40:56', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (77, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:41:10', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (78, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:41:32', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 1}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (79, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:41:40', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 10}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (80, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:42:06', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 10}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (81, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:42:12', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 3}', 200, '127.0.0.1', NULL, 1, NULL, NULL); +INSERT INTO `operation_history` VALUES (82, 1, 'admin', '/api/data/data-list', 'POST', '2025-07-16 09:43:00', '{\"userid\": \"\", \"bag_file_id\": \"\", \"status\": \"\", \"fst_id\": \"\", \"page\": 1, \"per_page\": 3}', 200, '127.0.0.1', NULL, 1, NULL, NULL); + +-- ---------------------------- +-- Table structure for permissions +-- ---------------------------- +DROP TABLE IF EXISTS `permissions`; +CREATE TABLE `permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '权限码(资源:操作)', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '权限描述', + `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '权限分类(如用户管理、系统设置)', + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` int(11) NULL DEFAULT NULL, + `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_by` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `code`(`code`) USING BTREE, + INDEX `created_by`(`created_by`) USING BTREE, + INDEX `updated_by`(`updated_by`) USING BTREE, + CONSTRAINT `permissions_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `permissions_ibfk_2` FOREIGN KEY (`updated_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of permissions +-- ---------------------------- +INSERT INTO `permissions` VALUES (1, 'user:manage', '用户管理(全部权限)', '用户管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (2, 'user:view', '查看用户', '用户管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (3, 'user:create', '创建用户', '用户管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (4, 'user:edit', '编辑用户', '用户管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (5, 'user:delete', '删除用户', '用户管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (6, 'content:manage', '内容管理(全部权限)', '内容管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (7, 'content:view', '查看内容', '内容管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (8, 'content:create', '创建内容', '内容管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (9, 'content:edit', '编辑内容', '内容管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (10, 'content:delete', '删除内容', '内容管理', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); +INSERT INTO `permissions` VALUES (11, 'system:config', '系统配置', '系统设置', '2025-07-07 10:41:59', 1, '2025-07-07 10:41:59', NULL); + +-- ---------------------------- +-- Table structure for reviewers +-- ---------------------------- +DROP TABLE IF EXISTS `reviewers`; +CREATE TABLE `reviewers` ( + `reviewer_id` int(11) NOT NULL AUTO_INCREMENT, + `login_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `display_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`reviewer_id`) USING BTREE, + UNIQUE INDEX `login_name`(`login_name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of reviewers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for role_permissions +-- ---------------------------- +DROP TABLE IF EXISTS `role_permissions`; +CREATE TABLE `role_permissions` ( + `role_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`role_id`, `permission_id`) USING BTREE, + INDEX `permission_id`(`permission_id`) USING BTREE, + INDEX `created_by`(`created_by`) USING BTREE, + CONSTRAINT `role_permissions_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `role_permissions_ibfk_2` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `role_permissions_ibfk_3` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of role_permissions +-- ---------------------------- +INSERT INTO `role_permissions` VALUES (1, 1, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 2, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 3, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 4, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 5, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 6, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 7, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 8, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 9, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 10, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (1, 11, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (2, 6, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (2, 7, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (2, 8, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (2, 9, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (2, 10, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (3, 2, '2025-07-07 10:41:59', 1); +INSERT INTO `role_permissions` VALUES (3, 7, '2025-07-07 10:41:59', 1); + +-- ---------------------------- +-- Table structure for roles +-- ---------------------------- +DROP TABLE IF EXISTS `roles`; +CREATE TABLE `roles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '角色描述', + `status` tinyint(4) NULL DEFAULT 1 COMMENT '状态:1-启用,0-禁用', + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` int(11) NULL DEFAULT NULL, + `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_by` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `name`(`name`) USING BTREE, + INDEX `created_by`(`created_by`) USING BTREE, + INDEX `updated_by`(`updated_by`) USING BTREE, + CONSTRAINT `roles_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `roles_ibfk_2` FOREIGN KEY (`updated_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of roles +-- ---------------------------- +INSERT INTO `roles` VALUES (1, 'admin', '系统管理员', 1, '2025-07-07 10:41:34', 1, '2025-07-07 10:41:34', NULL); +INSERT INTO `roles` VALUES (2, 'editor', '内容编辑', 1, '2025-07-07 10:41:34', 1, '2025-07-07 10:41:34', NULL); +INSERT INTO `roles` VALUES (3, 'user', '普通用户', 1, '2025-07-07 10:41:34', 1, '2025-07-07 10:41:34', NULL); + +-- ---------------------------- +-- Table structure for rule_versions +-- ---------------------------- +DROP TABLE IF EXISTS `rule_versions`; +CREATE TABLE `rule_versions` ( + `rule_version_id` int(20) NOT NULL AUTO_INCREMENT COMMENT '版本id', + `ruleset_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', + `version_str` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '版本字符串', + `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '描述', + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`rule_version_id`) USING BTREE, + UNIQUE INDEX `uk_ruleset_version`(`ruleset_name`, `version_str`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rule_versions +-- ---------------------------- +INSERT INTO `rule_versions` VALUES (1, '版本1.0', '初始测试版本', NULL, '2025-07-24 15:21:25'); + +-- ---------------------------- +-- Table structure for tagging_events +-- ---------------------------- +DROP TABLE IF EXISTS `tagging_events`; +CREATE TABLE `tagging_events` ( + `event_id` int(11) NOT NULL AUTO_INCREMENT, + `bag_id` int(11) UNSIGNED NOT NULL COMMENT 'bag的id', + `source` enum('RULE','MANUAL') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '来源', + `rule_version_id` int(11) NULL DEFAULT NULL COMMENT 'rule版本id', + `reviewer_id` int(11) NULL DEFAULT NULL COMMENT '审核人id', + `verdict` enum('ACCEPTED','OVERRIDDEN') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '结论', + `ts_event` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '当前时间', + `level1_tag_id` int(11) NULL DEFAULT NULL COMMENT '一级标签id', + `level2_tag_id` int(11) NULL DEFAULT NULL COMMENT '二级标签id', + `level3_tag_id` int(11) NULL DEFAULT NULL COMMENT '三级标签id', + `level4_tag_id` int(11) NULL DEFAULT NULL COMMENT '四级标签id', + `case_type` int(11) NULL DEFAULT NULL COMMENT '场景1简单,2复杂', + PRIMARY KEY (`event_id`) USING BTREE, + INDEX `idx_evt_bag_ts`(`bag_id`, `ts_event`) USING BTREE, + INDEX `fk_evt_rule_version`(`rule_version_id`) USING BTREE, + INDEX `fk_evt_l1`(`level1_tag_id`) USING BTREE, + INDEX `fk_evt_l2`(`level2_tag_id`) USING BTREE, + INDEX `fk_evt_l3`(`level3_tag_id`) USING BTREE, + INDEX `fk_evt_l4`(`level4_tag_id`) USING BTREE, + INDEX `user`(`reviewer_id`) USING BTREE, + CONSTRAINT `fb` FOREIGN KEY (`bag_id`) REFERENCES `bag_file` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_evt_l1` FOREIGN KEY (`level1_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_evt_l2` FOREIGN KEY (`level2_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_evt_l3` FOREIGN KEY (`level3_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_evt_l4` FOREIGN KEY (`level4_tag_id`) REFERENCES `fst` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_evt_rule_version` FOREIGN KEY (`rule_version_id`) REFERENCES `rule_versions` (`rule_version_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `user` FOREIGN KEY (`reviewer_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE = InnoDB AUTO_INCREMENT = 41 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tagging_events +-- ---------------------------- +INSERT INTO `tagging_events` VALUES (2, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-18 10:14:41', 385, NULL, NULL, NULL, 1); +INSERT INTO `tagging_events` VALUES (3, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-23 15:36:18', 392, 558, NULL, NULL, 1); +INSERT INTO `tagging_events` VALUES (4, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-18 10:31:53', 385, NULL, NULL, NULL, 1); +INSERT INTO `tagging_events` VALUES (5, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-17 14:55:39', 385, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (6, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-17 14:58:26', 385, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (7, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-17 15:01:30', 385, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (8, 1, 'RULE', NULL, 1, 'ACCEPTED', '2025-07-17 15:04:50', 385, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (9, 13, 'RULE', 1, 1, NULL, '2025-07-25 16:12:48', 564, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (10, 14, 'RULE', NULL, 1, NULL, '2025-07-25 16:26:42', 607, 618, 599, NULL, NULL); +INSERT INTO `tagging_events` VALUES (11, 15, 'RULE', NULL, 1, NULL, '2025-07-25 16:36:02', 393, 390, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (12, 38, 'RULE', 1, 1, NULL, '2025-07-29 14:28:58', 537, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (13, 51, 'RULE', NULL, 1, NULL, '2025-07-29 14:52:32', 691, 530, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (14, 1, 'RULE', 1, 1, NULL, '2025-07-31 13:43:07', 385, NULL, NULL, NULL, NULL); +INSERT INTO `tagging_events` VALUES (15, 2, 'RULE', NULL, 1, NULL, '2025-07-31 14:23:59', 395, 386, 648, NULL, 1); +INSERT INTO `tagging_events` VALUES (16, 3, 'RULE', NULL, 1, NULL, '2025-07-31 14:26:50', 393, 390, NULL, NULL, 2); +INSERT INTO `tagging_events` VALUES (17, 4, 'RULE', NULL, 1, NULL, '2025-07-31 16:00:25', 385, 725, 508, NULL, 2); +INSERT INTO `tagging_events` VALUES (18, 5, 'RULE', NULL, 1, NULL, '2025-08-01 17:26:44', 402, 625, NULL, NULL, 1); +INSERT INTO `tagging_events` VALUES (19, 6, 'RULE', NULL, 1, NULL, '2025-08-01 17:28:15', 392, 672, 480, NULL, 1); +INSERT INTO `tagging_events` VALUES (20, 7, 'RULE', NULL, 1, NULL, '2025-08-06 11:14:17', 455, 488, 690, NULL, 1); +INSERT INTO `tagging_events` VALUES (21, 221, 'RULE', NULL, 1, NULL, '2025-08-07 14:16:34', 663, 437, 441, NULL, 1); +INSERT INTO `tagging_events` VALUES (22, 238, 'RULE', NULL, 1, NULL, '2025-08-07 14:19:36', 537, 400, 655, NULL, 1); +INSERT INTO `tagging_events` VALUES (23, 225, 'RULE', NULL, 1, NULL, '2025-08-07 14:24:47', 691, 516, 731, NULL, 1); +INSERT INTO `tagging_events` VALUES (24, 234, 'RULE', NULL, 1, NULL, '2025-08-07 14:29:05', 407, 616, 579, NULL, 1); +INSERT INTO `tagging_events` VALUES (25, 225, 'RULE', NULL, 1, NULL, '2025-08-07 14:51:07', 385, 459, 473, NULL, 1); +INSERT INTO `tagging_events` VALUES (26, 225, 'RULE', NULL, 1, NULL, '2025-08-07 14:55:24', 385, 425, 593, NULL, 1); +INSERT INTO `tagging_events` VALUES (27, 225, 'RULE', NULL, 1, NULL, '2025-08-07 14:57:58', 385, 425, 593, NULL, 1); +INSERT INTO `tagging_events` VALUES (28, 225, 'RULE', NULL, 1, NULL, '2025-08-07 15:01:41', 385, 425, 593, NULL, 1); +INSERT INTO `tagging_events` VALUES (29, 225, 'RULE', NULL, 1, NULL, '2025-08-07 15:02:16', 385, 425, 593, NULL, 1); +INSERT INTO `tagging_events` VALUES (30, 222, 'RULE', NULL, 1, NULL, '2025-08-07 16:45:41', 673, 476, NULL, NULL, 1); +INSERT INTO `tagging_events` VALUES (31, 222, 'RULE', NULL, 1, NULL, '2025-08-07 16:46:03', 385, 459, 430, NULL, 1); +INSERT INTO `tagging_events` VALUES (32, 239, 'RULE', NULL, 1, NULL, '2025-08-07 16:49:18', 542, 460, 466, 447, 1); +INSERT INTO `tagging_events` VALUES (33, 239, 'RULE', NULL, 1, NULL, '2025-08-07 16:49:34', 385, 425, 649, NULL, 1); +INSERT INTO `tagging_events` VALUES (34, 223, 'RULE', NULL, 1, NULL, '2025-08-08 15:44:23', 679, 543, 706, NULL, 1); +INSERT INTO `tagging_events` VALUES (35, 226, 'RULE', NULL, 1, NULL, '2025-08-08 15:56:19', 732, 403, NULL, NULL, 1); +INSERT INTO `tagging_events` VALUES (36, 226, 'RULE', NULL, 1, NULL, '2025-08-08 15:56:37', 392, 558, 498, NULL, 1); +INSERT INTO `tagging_events` VALUES (37, 228, 'RULE', NULL, 1, NULL, '2025-08-08 15:57:58', 746, 475, 456, NULL, 1); +INSERT INTO `tagging_events` VALUES (38, 228, 'RULE', NULL, 1, NULL, '2025-08-08 15:58:35', 385, 425, 593, NULL, 1); +INSERT INTO `tagging_events` VALUES (39, 229, 'RULE', NULL, 1, NULL, '2025-08-08 16:00:43', 385, 425, 593, NULL, 1); +INSERT INTO `tagging_events` VALUES (40, 229, 'RULE', NULL, 1, NULL, '2025-08-08 16:01:06', 385, 425, 593, NULL, 1); + +-- ---------------------------- +-- Table structure for user_roles +-- ---------------------------- +DROP TABLE IF EXISTS `user_roles`; +CREATE TABLE `user_roles` ( + `user_id` int(11) NOT NULL, + `role_id` int(11) NOT NULL, + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, + `created_by` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`user_id`, `role_id`) USING BTREE, + INDEX `role_id`(`role_id`) USING BTREE, + INDEX `created_by`(`created_by`) USING BTREE, + CONSTRAINT `user_roles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `user_roles_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `user_roles_ibfk_3` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of user_roles +-- ---------------------------- +INSERT INTO `user_roles` VALUES (1, 1, '2025-07-07 10:41:59', 1); +INSERT INTO `user_roles` VALUES (2, 2, '2025-07-07 10:41:59', 1); +INSERT INTO `user_roles` VALUES (3, 3, '2025-07-07 10:41:59', 1); +INSERT INTO `user_roles` VALUES (4, 1, '2025-07-08 14:41:25', 1); +INSERT INTO `user_roles` VALUES (4, 3, '2025-07-08 14:41:25', 1); +INSERT INTO `user_roles` VALUES (5, 1, '2025-07-16 17:43:27', 1); +INSERT INTO `user_roles` VALUES (5, 3, '2025-07-16 17:43:27', 1); +INSERT INTO `user_roles` VALUES (6, 1, '2025-07-16 17:45:48', 1); +INSERT INTO `user_roles` VALUES (6, 3, '2025-07-16 17:45:48', 1); +INSERT INTO `user_roles` VALUES (7, 1, '2025-07-16 17:49:05', 1); +INSERT INTO `user_roles` VALUES (7, 3, '2025-07-16 17:49:05', 1); +INSERT INTO `user_roles` VALUES (8, 1, '2025-07-16 17:49:37', 1); +INSERT INTO `user_roles` VALUES (8, 3, '2025-07-16 17:49:37', 1); +INSERT INTO `user_roles` VALUES (9, 1, '2025-07-16 17:49:46', 1); +INSERT INTO `user_roles` VALUES (9, 3, '2025-07-16 17:49:46', 1); + +-- ---------------------------- +-- Table structure for users +-- ---------------------------- +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `status` tinyint(4) NULL DEFAULT 1 COMMENT '用户状态:1-正常,0-禁用', + `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `created_by` int(11) NULL DEFAULT NULL COMMENT '创建人ID', + `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `updated_by` int(11) NULL DEFAULT NULL COMMENT '更新人ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `username`(`username`) USING BTREE, + INDEX `created_by`(`created_by`) USING BTREE, + INDEX `updated_by`(`updated_by`) USING BTREE, + CONSTRAINT `users_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `users_ibfk_2` FOREIGN KEY (`updated_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of users +-- ---------------------------- +INSERT INTO `users` VALUES (1, 'admin', '827ccb0eea8a706c4c34a16891f84e7b', 1, '2025-07-07 10:33:44', NULL, '2025-07-08 10:45:03', NULL); +INSERT INTO `users` VALUES (2, 'editor', '827ccb0eea8a706c4c34a16891f84e7b', 1, '2025-07-07 10:33:44', 1, '2025-07-08 10:45:08', NULL); +INSERT INTO `users` VALUES (3, 'user', '827ccb0eea8a706c4c34a16891f84e7b', 1, '2025-07-07 10:33:44', 1, '2025-07-08 10:45:12', NULL); +INSERT INTO `users` VALUES (4, 'new_user', '4a2eceb70fd812b7877354a85f633e45', 0, '2025-07-08 14:41:25', 1, '2025-07-09 10:28:26', NULL); +INSERT INTO `users` VALUES (5, 'new_user1', '4a2eceb70fd812b7877354a85f633e45', 0, '2025-07-16 17:43:27', 1, '2025-07-16 17:51:11', NULL); +INSERT INTO `users` VALUES (6, 'new_user2', '4a2eceb70fd812b7877354a85f633e45', 1, '2025-07-16 17:45:48', 1, '2025-07-16 17:45:48', NULL); +INSERT INTO `users` VALUES (7, 'new_user3', '4a2eceb70fd812b7877354a85f633e45', 1, '2025-07-16 17:49:05', 1, '2025-07-16 17:49:05', NULL); +INSERT INTO `users` VALUES (8, 'new_user4', '4a2eceb70fd812b7877354a85f633e45', 1, '2025-07-16 17:49:37', 1, '2025-07-16 17:49:37', NULL); +INSERT INTO `users` VALUES (9, 'new_user5', '4a2eceb70fd812b7877354a85f633e45', 1, '2025-07-16 17:49:46', 1, '2025-07-16 17:49:46', NULL); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/run.py b/run.py new file mode 100644 index 0000000..8b5b7f5 --- /dev/null +++ b/run.py @@ -0,0 +1,9 @@ +from app import create_app + +app = create_app() + + +if __name__ == '__main__': + app.run(host='0.0.0.0',debug=True,port=5000) + # app.run(host='0.0.0.0',port=5222,debug=False) + # app.run(host='0.0.0.0',port=5000,debug=False)