Commit Graph

17 Commits

Author SHA1 Message Date
Pine b9b5e2e2ff feat(task): 任务中心扫码接单(多端) —— 服务端任务状态机/端口/迁移
- Task 加 task_code/tags/display_priority/claimed_by/claimed_at/doing_at;新增 TaskClaim 流水表。
- TaskService 加 claimed/doing/completed 状态机(claim/start_doing/complete),grab 并入 claim。
- TaskRepository 加 list_published/get_by_code/update/claim/set_doing + TaskClaimRepository;挂 Database。
- 端口:
  · opc  /tasks/grab-by-code、/tasks/{id}/doing、/tasks/{id}/complete
  · operator POST /tasks(auto task_code) + PATCH /tasks/:id
  · park  /park/api/tasks(大屏展示,含 scan_payload 二维码载荷)
  · training /api/tasks/claim-by-code、/api/tasks/my(小程序 C 端账号→OPC 身份 find-or-create 领单)
- 迁移 0008(tasks 加列 + task_claims)已应用+stamp;seed 补 task_code/tags/grab demo。
- tests/test_task_claim.py(自包含内存库, 状态机+流水+list_published), 直接 async 校验通过。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 18:40:35 +08:00
Pine 5f0acfa79e feat(park): 视频识别剥离,per-tenant 配置接入 park-vision 独立服务
- 删除 vision_yolo/vision_llm 及路由 /api/vision/frame|llm(保留遥测 event),去除 ultralytics 依赖
- 视频识别改为每园区(per-tenant)配置,经 park_settings(kv) 键 vision_api:<tid> 存取
- /park/api/vision/config GET/PUT(园区端读写本园区识别地址,可局域网);bind 下发含 vision_api
- 新增 alembic 0004(tenant_id 可空) / 0005(park_settings 表),迁移脚本执行
2026-08-25 01:52:23 +08:00
Pine 634ed22dcd fix(park): 园区子应用加 CORS(allow_origins=*) — 大屏跨域预检 405/ACAO 拒绝
大屏(Vite dev :1420 / Tauri tauri.localhost)与 server-core(:8090) 不同源;app.park 独立
FastAPI 未加 CORS → OPTIONS 预检 405、ACAO 拒绝。加 CORSMiddleware(allow_origins=['*']),
TestClient 验证 /park/api/config 与预检均 200 且带 ACAO。
2026-08-24 20:38:32 +08:00
Pine 585277b724 fix(park): /park/api/config 补顶层 mqtt_url/username/password — 兼容大屏 bootstrap 取 MQTT/API 引导
大屏 main.jsx 读 cfg.mqtt_url/mqtt_username/mqtt_password;此前仅返回嵌套 mqtt{},
大屏回退到构建期旧地址。补顶层字段(取 server-core .env MQTT_WS_URL/凭据)。
2026-08-24 20:33:15 +08:00
Pine b6315f69b0 feat(park): 大屏设备绑定流 — 永久设备ID+连接码+园区端绑定+MQTT下发设备token
- park_screens 加 status/code/code_expires/bound_at、tenant_id 可空(alembic 0002)。
- auth 加 create/parse_device_token {tenant_id,device_id}。
- tenants 加 ensures_device/set_device_code/find_device_by_code/bind_device/unbind_device。
- 端点:/park/api/devices/register、/park/api/devices/{device_id}/code(8位码TTL10min)、
  /park/tenants/{tid}/screens/bind-by-code(校验码→绑定→MQTT opc/display/bind/<dev> 下发 token)、
  /park/api/devices/{device_id}/unbind。_resolve_tenant 支持设备 token。
- 验证(TestClient):register→code→建园区→绑码(bound/命名)→设备token取数据返回绑定园区。
2026-08-24 20:10:46 +08:00
Pine 5752b3816d refactor(park): 园区数据层迁唯一总库(async SQLAlchemy) — 去 raw sqlite3/park.db
- tenants.py 改为 async SQLAlchemy(ParkTenant/Company/KbDoc/Screen,共享 _ASYNC_ENGINE),
  不再开独立 park.db、不再 init_db;建表/种子走 alembic+seed.py。
- 同步只读 accessor(list_tenants_sync/list_companies_sync/get_tenant_data_sync/get_agent_sync)
  供 sim_engine 同步 tick/tools 用。
- sim_engine.get_engine 改读 get_tenant_data_sync;refresh_engine(tenant_id, data)。
- routers 全部 tenants 调用改 await,_resolve_tenant 改 async;app.py 移除 init_db;
  tools._query_companies 用 list_companies_sync。修复 ensure_default_tenant(T001)、Row→dict。
- 验证(migrate+seed+TestClient):tenants/companies/screens/screen/data/agent/kb/snapshot/display 全 200。
2026-08-24 20:01:03 +08:00
Pine e4d4dbd8c9 fix(park): 大屏前端契约对齐 — update_check download_url=/download、media 返回 relative_path
大屏 api.js 以 getApiBase()(=/park) + 相对路径拼接,download_url 应 '/' 相对、media 应 relative_path。
2026-08-24 19:45:28 +08:00
Pine 47d2a1b62b feat(park): 补全大屏迁移端点+静态资源 — 迁自 park-desktop/backend(可删原后端)
- 新增 /park/api/upload、/api/state、/api/control、/api/playlist(|add/remove/play)、/api/media/add-url、
  /api/delete、/park/download、/park/api/update/check(安装包取 serverdata/park/installers)。
- 迁入 app/park/static(admin.css/js + voice-worklets),挂 /park/static。
- media/data.json/安装包 落 serverdata/park/(gitignored 运行数据)。
- TestClient 冒烟:health/settings/playlist/media/control/download/update/static 均 200。
2026-08-24 19:44:26 +08:00
Pine 88882553a9 feat(园区端): 园区状态(禁用/启用)+联级删除 — 禁用禁止登录,删除一并删资源
park_tenants 增 status 列(migration)、set_status、/park/tenants/{id}/status 端点;
/ park/auth/login 对被禁用园区返回 403;delete_tenant 联级删 企业/知识库/屏幕+引擎缓存;
_summary 含 status。TestClient:禁用→登录403、启用→200、删除→资源清零。
2026-08-24 19:05:16 +08:00
Pine 6458d5eb98 feat(园区端): 园区不再自建账号 — 改为绑定已有平台账号为管理员
create_tenant 不再建账号(admin 留空);/park/tenants POST 仅名称/简介;新增 /park/tenants/{id}/bind|unbind;
/park/auth/login 改为校验平台账号密码 + 该账号已绑定为某园区管理员(签发 tenant token)。
park_tenants 增 admin_username 列(init_db 迁移)。TestClient:创建(无账号)→绑定pine→pine登录园区端成功。
2026-08-24 18:46:41 +08:00
Pine 0448ab57ab fix(park): /park/tenants PUT 改用 TenantPatch(exclude_none) — 仅改管理员账号不再清空名称/简介
平台端管理园区账号(改 username/password)时,原 TenantBody 默认 name/intro 会被写入覆盖;
改用全可选 TenantPatch + exclude_none,只 patch 提供的字段。TestClient 验证保存账号保留名称/简介。
2026-08-24 18:28:14 +08:00
Pine d26d3dc3fa feat(park): /park/api/screen/data 支持全量数据编辑(动态/区域/产业构成/营收/成立时间等)
ScreenBody 增 intro/feed/zones/industryMix/address/phone/email/region/revenue_total/revenue_tax;
update_screen 全量写入 data_json 并 refresh_engine;screen_view 返回 zones/industryMix/feed/region。
TestClient:PUT 名称+两段简介+动态+区域+产业+营收+成立时间 → snapshot 反映。
2026-08-24 18:09:23 +08:00
Pine 81f4dfd0ad feat(park): 园区多租户 — SQLite(tenants表+companies+kb) + 每租户引擎 + 认证 + 作用域隔离
- tenants.py:park_tenants/park_companies/park_kb_docs 三表(serverdata/park/park.db),
  每园区独立 name/intro(两段式)/auth(账密 salted hash)/data(大屏锚点)/agent/kb;
  ensure_default_tenant 自愈建默认园区+灌 39 家企业。
- sim_engine 重构为 SimEngine(data)——每租户独立实例,get_engine(tid)/refresh_engine(tid)。
- auth.py:/park/auth/login(账密→长效 tenant JWT)、/park/auth/me、require_tenant(401)。
- mqtt:register/publish_command/publish_tick 按 tenant_id 作用域(拓扑为 command/tid/clientId)。
- routers:/park/tenants CRUD + 全部数据/指令端点租户作用域(authorization token 或 ?tenant_id)。
- app.py lifespan init_db + 逐租户 tick/publish;tools._query_companies 读租户库。
- .gitignore 增 serverdata/park/。TestClient:建租户/登录/快照隔离/企业CRUD/指令鉴权(无token401) 全过。
2026-08-24 18:06:51 +08:00
Pine 21cfab58fa feat(park): 子应用 lifespan 接入 s2s 实时语音栈(S2S_ENABLED=1 时后台起 :8765)
导入 .s2s_bridge.start_s2s_backend 并以 stop 事件控制;依赖 speech_to_speech
(vendor/s2s-cloud),启用前需 uv pip install -e app/park/vendor/s2s-cloud。
2026-08-24 17:29:37 +08:00
Pine 064b06ecf0 feat(park): 全量迁入园区重模块 llm/rag/asr/s2s/vision + 重依赖
迁入 app/park:llm(对话)、rag(双路向量知识库)、tools/ai_tools(智能体工具)、
asr(语音识别)、s2s_bridge(实时语音桥)、vision_yolo/vision_llm(人脸/多模态)、
knowledge/*.md、vendor/s2s-cloud(s2s 云化栈);routers 补 /api/ai|kb|asr|vision|
s2s|tools 端点。智能体提示词/企业名录改读 park_config 主数据源。pyproject 加重依赖
(dashscope/numpy/openai/torch/transformers/ultralytics/websockets/soundfile/scipy/
nltk/jinja2)。TestClient 冒烟:ai/chat(无 Key 走本地规则)、kb、s2s、tools、display 均 200。
2026-08-24 17:28:53 +08:00
Pine 03ba0810ae feat(park): 园区主数据源 park_config + /park 写端点(企业/智能体/知识库/大屏数据)
新增 app/park/park_config.py(serverdata/park/park_config.json 主数据源,企业默认自 sim_engine
COMPANIES 39 家导入);routers.py 增 /park/api/park/companies CRUD、/park/api/agent/config、
/park/api/kb/docs CRUD+reindex、/park/api/screen/data GET/PUT;/park/api/config 的 api_base
修正为 /park 前缀(避免大屏 request() /api 双写)。TestClient 冒烟通过。
2026-08-24 17:11:17 +08:00
Pine 4d4d38fe0f feat(park): 园区子应用 app/park 骨架迁入 — dispatcher /park 前缀分流
迁自 park-desktop/backend/app:config(数据目录→serverdata/park)/storage/sim_engine/
mqtt/event_bus + 精简 routers(health/settings/config/dashboard/park/companies/display/
events) + app.py 子应用(lifespan 起 MQTT hub+tick 线程, include_router prefix=/park)。
dispatcher.py 增 ROUTE_PARK_PREFIX + _prefix_app,与 app.training(/api)、app.main 分流。
pyproject 增 paho-mqtt(MQTT 必需)。AI/知识库/语音/视觉重模块延后全量迁入。
2026-08-24 16:57:27 +08:00