feat: CVAT 标注引擎、我的标注收件箱与 ADAS Cuboid 送标

- 统一标注引擎为 CVAT:客户端/配置/格式转换、iframe 标注页、docker-compose.cvat.yml 与 no_auth 补丁
- 移除 Label Studio 相关配置与构建脚本,清理 embedded.bak 备份与误提交的 node_modules
- 新增「我的标注」:跨 Campaign 收件箱、逐张清单、CVAT frame 跳转
- 飞书任务分配:通讯录同步选人、按量分配、分配后 DM 通知(含 my-tasks 链接)
- ADAS cuboid_7cls 数据湖接入:workflow 路径、register-batch、开标上传与标注同步
- 数据湖挂载 AS_DATA_LAKE_ROOT、datasets/adas 符号链接、reset_labeling 运维脚本
- 补充 docs/HANDOVER.md 项目交接文档

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-15 17:25:28 +08:00
parent e72bc061c5
commit 672ef61e17
5281 changed files with 5194 additions and 1315918 deletions

View File

@@ -1,7 +0,0 @@
#!/usr/bin/env bash
# HSAP 前端构建(已迁移至 platform/web/ Vite 独立项目)
# 本脚本保留作为向后兼容入口,实际构建委托给 build_web.sh
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
echo "[build] 使用新构建系统 platform/web/ (Vite)..."
exec bash "$ROOT/scripts/build_web.sh"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Build HSAP standalone frontend from platform/web/ and deploy to platform/ui-hsap/dist/
# Build HSAP frontend from platform/web/ platform/ui-hsap/dist/
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
@@ -11,50 +11,7 @@ echo "[web] Building..."
npm run build
DIST="$ROOT/platform/ui-hsap/dist"
# Copy Label Studio Editor legacy build for /annotate/
EDITOR_SRC="${LABEL_STUDIO_DIST:-${ROOT}/../workspace/BK2/label-studio/web/dist/apps/hsap-platform}"
if [ -d "$EDITOR_SRC" ]; then
mkdir -p "$DIST/annotate"
cp -r "$EDITOR_SRC"/* "$DIST/annotate/"
# Copy webpack chunks to dist root (webpack publicPath="/" loads them from root)
for f in editor.js 849.js 710.js 408.js 63.js main.css editor.css; do
[ -f "$DIST/annotate/$f" ] && cp "$DIST/annotate/$f" "$DIST/$f"
done
# Custom annotate index.html
cat > "$DIST/annotate/index.html" << 'HTMLEOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>HSAP · 标注编辑器</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/annotate/main.css" />
<link rel="stylesheet" href="/annotate/editor.css" />
</head>
<body>
<div id="root"></div>
<script>
(function() {
var p = new URLSearchParams(location.search);
var cid = p.get('c');
if (cid) {
history.replaceState(null, '', '/labeling/campaigns/' + cid + '/annotate');
}
})();
</script>
<script src="/annotate/main.js"></script>
</body>
</html>
HTMLEOF
echo "[web] Annotate editor (legacy LS) deployed from $EDITOR_SRC"
else
echo "[web] ⚠ annotate editor source not found at $EDITOR_SRC"
fi
rm -rf "$DIST/annotate"
echo "[web] Build complete → $DIST"
echo "[web] Files:"
ls -lh "$DIST/index.html" "$DIST/assets/" | head -8

View File

@@ -1,9 +1,11 @@
#!/usr/bin/env bash
# 一键启动完整开发环境postgres + redis + platform + worker
# 一键启动 HSAP 平台 + 内置 CVAT 标注引擎
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
COMPOSE_FILES=(-f docker-compose.yml -f docker-compose.cvat.yml)
if [[ ! -f .env ]]; then
cp .env.example .env
echo "已创建 .env默认挂载本仓库大文件数据可设置 AS_WORKSPACE_ROOT"
@@ -14,20 +16,27 @@ if [[ -d "$DEFAULT_WS/DMS" ]] && ! grep -q '^AS_WORKSPACE_ROOT=' .env 2>/dev/nul
echo "已写入 AS_WORKSPACE_ROOT=$DEFAULT_WS"
fi
if ! grep -q '^CVAT_HOST=' .env 2>/dev/null; then
echo "CVAT_HOST=http://hsap-cvat-server:8080" >> .env
fi
if ! grep -q '^CVAT_PUBLIC_URL=' .env 2>/dev/null; then
echo "CVAT_PUBLIC_URL=http://127.0.0.1:8080" >> .env
fi
if ! command -v docker >/dev/null 2>&1; then
echo "未安装 Docker。Ubuntu: sudo apt install docker.io docker-compose-v2"
echo "或: https://docs.docker.com/engine/install/"
exit 1
fi
docker compose up -d --build "$@"
docker compose "${COMPOSE_FILES[@]}" up -d --build "$@"
echo ""
echo "服务:"
echo " 平台 UI+API http://127.0.0.1:${AS_PLATFORM_PORT:-8787}"
echo " PostgreSQL localhost:${AS_DB_PORT:-5432}"
echo " Redis localhost:${AS_REDIS_PORT:-6379}"
echo " HSAP 平台 http://127.0.0.1:${AS_PLATFORM_PORT:-8787}"
echo " CVAT 标注画布 http://127.0.0.1:${CVAT_PORT:-8080} (由 HSAP 嵌入,无需单独登录)"
echo " PostgreSQL localhost:${AS_DB_PORT:-5432}"
echo " Redis localhost:${AS_REDIS_PORT:-6379}"
echo ""
echo "React 热更新: docker compose --profile dev up -d web-dev → :5173"
echo "日志: docker compose logs -f platform worker"
echo "停止: docker compose down"
echo "日志: docker compose ${COMPOSE_FILES[*]} logs -f platform worker cvat_server"
echo "停止: docker compose ${COMPOSE_FILES[*]} down"

38
scripts/reset_labeling.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/usr/bin/env bash
# 清空送标/标注相关记录,保留平台账号与配置
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
echo "==> 清空 PostgreSQL 送标/标注表"
docker exec hsap-postgres psql -U as_platform -d as_platform <<'SQL'
TRUNCATE labeling_reviews, labeling_export_jobs, labeling_task_assignments, labeling_campaign_access, labeling_campaigns CASCADE;
TRUNCATE dataset_candidates, batch_deliveries CASCADE;
SQL
if curl -sf http://127.0.0.1:8080/api/tasks?page_size=100 -H 'Accept: application/vnd.cvat+json; version=2.0' >/dev/null 2>&1; then
echo "==> 清空 CVAT Task"
python3 - <<'PY'
import json, urllib.request
req = urllib.request.Request(
"http://127.0.0.1:8080/api/tasks?page_size=100",
headers={"Accept": "application/vnd.cvat+json; version=2.0"},
)
with urllib.request.urlopen(req) as r:
data = json.load(r)
for t in data.get("results", []):
tid = t["id"]
del_req = urllib.request.Request(
f"http://127.0.0.1:8080/api/tasks/{tid}",
method="DELETE",
headers={"Accept": "application/vnd.cvat+json; version=2.0"},
)
try:
urllib.request.urlopen(del_req)
print(f" deleted CVAT task #{tid} {t.get('name')}")
except Exception as e:
print(f" skip task #{tid}: {e}")
PY
fi
echo "==> 完成。数据湖目录: ${AS_DATA_LAKE:-$ROOT/../data/送标}"