feat: 初始化零工后端代码
This commit is contained in:
114
gig-poc/infrastructure/scripts/acceptance-e2e.sh
Executable file
114
gig-poc/infrastructure/scripts/acceptance-e2e.sh
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
API_BASE="${API_BASE:-http://127.0.0.1:8000}"
|
||||
BOOTSTRAP_ON_RUN="${BOOTSTRAP_ON_RUN:-true}"
|
||||
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP_DIR"' EXIT
|
||||
|
||||
step() {
|
||||
echo "[ACCEPTANCE] $1"
|
||||
}
|
||||
|
||||
fail() {
|
||||
echo "[ACCEPTANCE][FAIL] $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
parse_json() {
|
||||
PY_EXPR="$1"
|
||||
INPUT_FILE="$2"
|
||||
python3 - "$PY_EXPR" "$INPUT_FILE" <<'PY'
|
||||
import json
|
||||
import sys
|
||||
|
||||
expr = sys.argv[1]
|
||||
path = sys.argv[2]
|
||||
data = json.loads(open(path, "r", encoding="utf-8").read())
|
||||
safe_builtins = {"bool": bool, "len": len, "str": str}
|
||||
value = eval(expr, {"__builtins__": safe_builtins}, {"data": data})
|
||||
if isinstance(value, (dict, list)):
|
||||
print(json.dumps(value, ensure_ascii=False))
|
||||
elif value is None:
|
||||
print("")
|
||||
else:
|
||||
print(str(value))
|
||||
PY
|
||||
}
|
||||
|
||||
step "健康检查"
|
||||
curl -fsS "${API_BASE}/health" >"$TMP_DIR/health.json" || fail "health 接口不可用"
|
||||
|
||||
if [ "$BOOTSTRAP_ON_RUN" = "true" ]; then
|
||||
step "执行 bootstrap"
|
||||
curl -fsS -X POST "${API_BASE}/poc/ingest/bootstrap" >"$TMP_DIR/bootstrap.json" || fail "bootstrap 失败"
|
||||
fi
|
||||
|
||||
step "抽取岗位"
|
||||
curl -fsS -X POST "${API_BASE}/poc/extract/job" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text":"明天下午南山会展中心需要2个签到协助,5小时,150/人,女生优先"}' \
|
||||
>"$TMP_DIR/extract_job.json" || fail "岗位抽取调用失败"
|
||||
[ "$(parse_json "bool(data.get('success'))" "$TMP_DIR/extract_job.json")" = "True" ] || fail "岗位抽取失败"
|
||||
parse_json "data.get('data')" "$TMP_DIR/extract_job.json" >"$TMP_DIR/job.json"
|
||||
JOB_ID="$(parse_json "data.get('data', {}).get('job_id')" "$TMP_DIR/extract_job.json")"
|
||||
[ -n "$JOB_ID" ] || fail "岗位抽取缺少 job_id"
|
||||
|
||||
step "岗位入库"
|
||||
python3 - "$TMP_DIR/job.json" >"$TMP_DIR/ingest_job_payload.json" <<'PY'
|
||||
import json
|
||||
import sys
|
||||
job = json.loads(open(sys.argv[1], "r", encoding="utf-8").read())
|
||||
print(json.dumps({"job": job}, ensure_ascii=False))
|
||||
PY
|
||||
curl -fsS -X POST "${API_BASE}/poc/ingest/job" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data @"$TMP_DIR/ingest_job_payload.json" \
|
||||
>"$TMP_DIR/ingest_job.json" || fail "岗位入库失败"
|
||||
|
||||
step "岗位匹配工人"
|
||||
curl -fsS -X POST "${API_BASE}/poc/match/workers" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"job_id\":\"${JOB_ID}\",\"top_n\":3}" \
|
||||
>"$TMP_DIR/match_workers.json" || fail "岗位匹配工人失败"
|
||||
MATCH_ID_1="$(parse_json "((data.get('items') or [{}])[0]).get('match_id')" "$TMP_DIR/match_workers.json")"
|
||||
[ -n "$MATCH_ID_1" ] || fail "岗位匹配工人未返回 match_id"
|
||||
|
||||
step "解释匹配(岗位->工人)"
|
||||
curl -fsS "${API_BASE}/poc/match/explain/${MATCH_ID_1}" >"$TMP_DIR/explain_1.json" || fail "匹配解释失败(岗位->工人)"
|
||||
|
||||
step "抽取工人"
|
||||
curl -fsS -X POST "${API_BASE}/poc/extract/worker" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text":"我做过商场促销和活动签到,也能做登记和引导,周末都能接,福田南山都方便。"}' \
|
||||
>"$TMP_DIR/extract_worker.json" || fail "工人抽取调用失败"
|
||||
[ "$(parse_json "bool(data.get('success'))" "$TMP_DIR/extract_worker.json")" = "True" ] || fail "工人抽取失败"
|
||||
parse_json "data.get('data')" "$TMP_DIR/extract_worker.json" >"$TMP_DIR/worker.json"
|
||||
WORKER_ID="$(parse_json "data.get('data', {}).get('worker_id')" "$TMP_DIR/extract_worker.json")"
|
||||
[ -n "$WORKER_ID" ] || fail "工人抽取缺少 worker_id"
|
||||
|
||||
step "工人入库"
|
||||
python3 - "$TMP_DIR/worker.json" >"$TMP_DIR/ingest_worker_payload.json" <<'PY'
|
||||
import json
|
||||
import sys
|
||||
worker = json.loads(open(sys.argv[1], "r", encoding="utf-8").read())
|
||||
print(json.dumps({"worker": worker}, ensure_ascii=False))
|
||||
PY
|
||||
curl -fsS -X POST "${API_BASE}/poc/ingest/worker" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data @"$TMP_DIR/ingest_worker_payload.json" \
|
||||
>"$TMP_DIR/ingest_worker.json" || fail "工人入库失败"
|
||||
|
||||
step "工人匹配岗位"
|
||||
curl -fsS -X POST "${API_BASE}/poc/match/jobs" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"worker_id\":\"${WORKER_ID}\",\"top_n\":3}" \
|
||||
>"$TMP_DIR/match_jobs.json" || fail "工人匹配岗位失败"
|
||||
MATCH_ID_2="$(parse_json "((data.get('items') or [{}])[0]).get('match_id')" "$TMP_DIR/match_jobs.json")"
|
||||
[ -n "$MATCH_ID_2" ] || fail "工人匹配岗位未返回 match_id"
|
||||
|
||||
step "解释匹配(工人->岗位)"
|
||||
curl -fsS "${API_BASE}/poc/match/explain/${MATCH_ID_2}" >"$TMP_DIR/explain_2.json" || fail "匹配解释失败(工人->岗位)"
|
||||
|
||||
step "链路验收通过:抽取 -> 入库 -> 匹配 -> 解释"
|
||||
Reference in New Issue
Block a user