# coding=utf-8 import os import time CAIHUI_DATABASE = { 'name': os.environ.get('DISH_DB_NAME', 'goods'), 'host': os.environ.get('CARC_CRAWLER_DB_HOST', '127.0.0.1'), 'port': int(os.environ.get('CARC_CRAWLER_DB_PORT', 3306)), 'user': os.environ.get('CARC_CRAWLER_DB_USER', 'root'), 'password': os.environ.get('CARC_CRAWLER_DB_PASSWORD', '123456'), } # SQLite 本地临时缓存(识别读此库;变更后从 MySQL 拉取刷新) DISH_SQLITE_PATH = os.environ.get( 'DISH_SQLITE_PATH', os.path.join(os.path.dirname(__file__), 'dish_templates.db'), ) # 本机基地编码(学菜写入 source_base_id;结果 API 的 base_id 默认也用它) # 建议填管理系统返回的 code,例如「上海路基地-1788059884828-e55vu」 DISH_BASE_CODE = os.environ.get('DISH_BASE_CODE', 'BASE_LOCAL_01') DISH_BASE_NAME = os.environ.get('DISH_BASE_NAME', '奥体基地') DISH_BASE_REGION = os.environ.get('DISH_BASE_REGION', '') # 管理系统:公开接口(X-API-Key) # 完整 Key 见 docs/第三方接口文档_mgmt.md(含 dish_ 前缀) DISH_MGMT_API_ORIGIN = os.environ.get( 'DISH_MGMT_API_ORIGIN', 'https://cpsb.ruimeida.cc', ).rstrip('/') DISH_MGMT_API_URL = os.environ.get( 'DISH_MGMT_API_URL', f'{DISH_MGMT_API_ORIGIN}/api/public/bases', ) DISH_MGMT_RESULT_API_URL = os.environ.get( 'DISH_MGMT_RESULT_API_URL', f'{DISH_MGMT_API_ORIGIN}/api/public/recognition-orders', ) DISH_MGMT_MEAL_API_URL = os.environ.get( 'DISH_MGMT_MEAL_API_URL', f'{DISH_MGMT_API_ORIGIN}/api/public/meal-schedules/today', ) DISH_MGMT_DEVICE_STATUS_URL = os.environ.get( 'DISH_MGMT_DEVICE_STATUS_URL', f'{DISH_MGMT_API_ORIGIN}/api/public/devices/status', ) DISH_MGMT_DISHES_API_URL = os.environ.get( 'DISH_MGMT_DISHES_API_URL', f'{DISH_MGMT_API_ORIGIN}/api/public/dishes', ) DISH_MGMT_DISH_LEARNING_STATUS_URL = os.environ.get( 'DISH_MGMT_DISH_LEARNING_STATUS_URL', f'{DISH_MGMT_API_ORIGIN}/api/public/dishes/learning-status', ) DISH_MGMT_API_KEY = os.environ.get( 'DISH_MGMT_API_KEY', 'dish_a4f7a1287198179fdc6a6571aa14064c2afc6338c6730e2b668ac5be15bdf769', ) DISH_MGMT_API_TIMEOUT = float(os.environ.get('DISH_MGMT_API_TIMEOUT', '10')) DISH_MGMT_SYNC_ON_START = os.environ.get('DISH_MGMT_SYNC_ON_START', '1') == '1' DISH_MGMT_MEAL_ON_START = os.environ.get('DISH_MGMT_MEAL_ON_START', '1') == '1' # 本机设备(上报设备状态) DISH_DEVICE_CODE = os.environ.get('DISH_DEVICE_CODE', '') or os.environ.get('DISH_BASE_CODE', DISH_BASE_CODE) DISH_DEVICE_NAME = os.environ.get('DISH_DEVICE_NAME', '') or os.environ.get('DISH_BASE_NAME', DISH_BASE_NAME) DISH_DEVICE_STATUS_INTERVAL = int(os.environ.get('DISH_DEVICE_STATUS_INTERVAL', '60')) # 秒 DISH_DEVICE_STATUS_ENABLED = os.environ.get('DISH_DEVICE_STATUS_ENABLED', '1') == '1' # 启动时是否从 MySQL 拉取;后台定时同步间隔(秒,含上传队列 flush + 拉取) DISH_SYNC_ON_START = os.environ.get('DISH_SYNC_ON_START', '1') == '1' DISH_SYNC_INTERVAL = int(os.environ.get('DISH_SYNC_INTERVAL', 300)) # 默认 5 分钟 # 识别框是否显示「似xx 检xx」(默认关;需要时 set DISH_SHOW_BOX_SCORES=1) DISH_SHOW_BOX_SCORES = os.environ.get('DISH_SHOW_BOX_SCORES', '0') == '1' # 当前餐段匹配:有当日排餐时仅在「今日当前餐段」菜品中比对,未命中直接未知(不回退大库) # 1) 最高分 ≥ 0.80 → 认定;2) 未达 0.80 但最高分 > 0.75 → 仍认定;否则未知 DISH_MEAL_SMALL_LIB_THRESHOLD = float(os.environ.get('DISH_MEAL_SMALL_LIB_THRESHOLD', '0.80')) DISH_MEAL_SMALL_LIB_SOFT_THRESHOLD = float(os.environ.get('DISH_MEAL_SMALL_LIB_SOFT_THRESHOLD', '0.75')) # 早于该时刻且尚无当日排餐 → 不做当前餐段限制,直接走大库 DISH_MEAL_CUTOFF_HOUR = int(os.environ.get('DISH_MEAL_CUTOFF_HOUR', '7')) # 每餐开始前多少分钟拉取排餐(默认 60 = 开餐前 1 小时) DISH_MEAL_PREFETCH_MINUTES = int(os.environ.get('DISH_MEAL_PREFETCH_MINUTES', '60')) # 尚无餐段信息时的兜底拉取时刻(启动后第一次排餐未到位时用) DISH_MEAL_REFRESH_HOUR = int(os.environ.get('DISH_MEAL_REFRESH_HOUR', '6')) DISH_MEAL_REFRESH_MINUTE = int(os.environ.get('DISH_MEAL_REFRESH_MINUTE', '0')) # 实时扫描:未知菜写入待学习前的最短稳定秒数(客人放盘短,默认 1 秒) # 盘子移走时不刷入,避免移盘过程中的误检未知 DISH_LIVE_PENDING_STABLE_SECONDS = float(os.environ.get('DISH_LIVE_PENDING_STABLE_SECONDS', '1.0')) # 运动判定:从动到静后需保持静止的秒数,达到后 YOLO 识别一次;持续静止不再识别, # 须再经历「静→动→静」才触发下一次 DISH_LIVE_STILL_HOLD_SECONDS = float(os.environ.get('DISH_LIVE_STILL_HOLD_SECONDS', '0.1')) # 已有订单时,菜品区域相似度阈值(更低=更宽松,手在中间晃仍算静止,减少误触发) DISH_LIVE_MOTION_SIM_WITH_ORDER = float(os.environ.get('DISH_LIVE_MOTION_SIM_WITH_ORDER', '0.970')) # 同一批菜品订单防抖:菜名未变不重复存图/统计;短间隔内亦抑制重复落单 DISH_LIVE_ORDER_DEBOUNCE_SECONDS = float(os.environ.get('DISH_LIVE_ORDER_DEBOUNCE_SECONDS', '0.5')) # 无餐盘持续该秒数后清场解锁,允许下一盘(含相同菜名)重新存图/上报 DISH_LIVE_ORDER_CLEAR_HOLD_SECONDS = float(os.environ.get('DISH_LIVE_ORDER_CLEAR_HOLD_SECONDS', '0.5')) DEBUG = True LOG_DIR = os.path.join(os.getcwd(), f'log/{time.strftime("%Y-%m-%d")}.log') LOG_FORMAT = '{level: <8} {time:YYYY-MM-DD HH:mm:ss.SSS} - {name}:{function} - {message}'