| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #!/usr/bin/env bash
- set -euo pipefail
- # Default demo backend URL. Override with:
- # BASE_URL=http://localhost:8080 ./scripts/demo-registration/registration-tool-flow.sh
- BASE_URL="${BASE_URL:-http://localhost:8080}"
- PROJECT_ID="${PROJECT_ID:-demo-registration}"
- TRACE_ID="${TRACE_ID:-trace-demo-registration-$(date +%Y%m%d%H%M%S)}"
- PATIENT_ID="${PATIENT_ID:-patient_demo_001}"
- PATIENT_PHONE="${PATIENT_PHONE:-13800000001}"
- PATIENT_ID_CARD="${PATIENT_ID_CARD:-110101199001010011}"
- PATIENT_NAME="${PATIENT_NAME:-张三}"
- DEPARTMENT_ID="${DEPARTMENT_ID:-dept_neurology}"
- DOCTOR_ID="${DOCTOR_ID:-doctor_neuro_001}"
- SCHEDULE_ID="${SCHEDULE_ID:-schedule_neuro_001_d1_am}"
- SCHEDULE_DATE="${SCHEDULE_DATE:-}"
- LOCK_ID="${LOCK_ID:-}"
- ORDER_ID="${ORDER_ID:-}"
- has_jq=false
- if command -v jq >/dev/null 2>&1; then
- has_jq=true
- fi
- json_quote() {
- if [ "$has_jq" = true ]; then
- jq -Rn --arg value "$1" '$value'
- return
- fi
- printf '"%s"' "$(printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g')"
- }
- extract_json_string() {
- local json="$1"
- local filter="$2"
- if [ "$has_jq" = false ]; then
- return 1
- fi
- printf '%s' "$json" | jq -er "$filter // empty"
- }
- request_body() {
- local tool_call_id="$1"
- local risk_level="$2"
- local input_json="$3"
- cat <<JSON
- {
- "toolCallId": "$tool_call_id",
- "context": {
- "projectId": "$PROJECT_ID",
- "traceId": "$TRACE_ID"
- },
- "input": $input_json,
- "riskLevel": "$risk_level"
- }
- JSON
- }
- get_catalog() {
- echo
- echo "GET ${BASE_URL}/tools/catalog"
- echo "Expected markers for invoke responses: mock=true, status=success"
- curl -sS \
- -H "Accept: application/json" \
- "${BASE_URL}/tools/catalog"
- echo
- }
- invoke_tool() {
- local tool_name="$1"
- local risk_level="$2"
- local input_json="$3"
- local idempotency_key="${4:-}"
- local tool_call_id="demo-${tool_name//./-}-$(date +%s)"
- local body
- body="$(request_body "$tool_call_id" "$risk_level" "$input_json")"
- echo >&2
- echo "POST ${BASE_URL}/tools/${tool_name}/invoke" >&2
- if [ -n "$idempotency_key" ]; then
- echo "X-Emoon-Idempotency-Key: ${idempotency_key}" >&2
- fi
- echo "Expected markers: mock=true, status=success" >&2
- case "$tool_name" in
- payment.*)
- echo "Expected payment marker: mockPayment=true" >&2
- ;;
- esac
- if [ -n "$idempotency_key" ]; then
- curl -sS \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- -H "X-Emoon-Idempotency-Key: ${idempotency_key}" \
- -d "$body" \
- "${BASE_URL}/tools/${tool_name}/invoke"
- else
- curl -sS \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- -d "$body" \
- "${BASE_URL}/tools/${tool_name}/invoke"
- fi
- echo >&2
- }
- require_dynamic_id() {
- local name="$1"
- local value="$2"
- local hint="$3"
- if [ -n "$value" ]; then
- return
- fi
- cat >&2 <<EOF
- Missing ${name}.
- Install jq to auto-extract dynamic IDs, or rerun with ${name}=... after copying it from the previous response.
- ${hint}
- EOF
- exit 1
- }
- echo "Demo registration tool flow"
- echo "BASE_URL=${BASE_URL}"
- echo "PROJECT_ID=${PROJECT_ID}"
- echo "TRACE_ID=${TRACE_ID}"
- echo "Seed values: patientId=${PATIENT_ID}, departmentId=${DEPARTMENT_ID}, doctorId=${DOCTOR_ID}, scheduleId=${SCHEDULE_ID}"
- if [ "$has_jq" = false ]; then
- echo "jq not found: the script will still issue fixed-ID reads/writes, but dynamic lockId/orderId extraction requires jq or LOCK_ID/ORDER_ID env overrides."
- fi
- get_catalog
- search_patient_response="$(invoke_tool \
- "his.searchPatient" \
- "L2_SENSITIVE_READ" \
- "{\"phone\":$(json_quote "$PATIENT_PHONE"),\"idCard\":$(json_quote "$PATIENT_ID_CARD")}")"
- printf '%s\n' "$search_patient_response"
- departments_response="$(invoke_tool \
- "his.queryDepartments" \
- "L1_QUERY" \
- "{}")"
- printf '%s\n' "$departments_response"
- doctors_response="$(invoke_tool \
- "his.queryDoctors" \
- "L1_QUERY" \
- "{\"departmentId\":$(json_quote "$DEPARTMENT_ID")}")"
- printf '%s\n' "$doctors_response"
- schedule_input="{\"doctorId\":$(json_quote "$DOCTOR_ID")}"
- if [ -n "$SCHEDULE_DATE" ]; then
- schedule_input="{\"doctorId\":$(json_quote "$DOCTOR_ID"),\"date\":$(json_quote "$SCHEDULE_DATE")}"
- fi
- schedules_response="$(invoke_tool \
- "his.querySchedules" \
- "L1_QUERY" \
- "$schedule_input")"
- printf '%s\n' "$schedules_response"
- lock_idempotency_key="demo-lock-${TRACE_ID}"
- lock_response="$(invoke_tool \
- "his.lockSchedule" \
- "L3_BUSINESS_WRITE" \
- "{\"scheduleId\":$(json_quote "$SCHEDULE_ID"),\"patientId\":$(json_quote "$PATIENT_ID")}" \
- "$lock_idempotency_key")"
- printf '%s\n' "$lock_response"
- if [ -z "$LOCK_ID" ] && [ "$has_jq" = true ]; then
- LOCK_ID="$(extract_json_string "$lock_response" '.data.result.lock.lockId')"
- fi
- require_dynamic_id "LOCK_ID" "$LOCK_ID" "Expected path with jq: .data.result.lock.lockId"
- order_idempotency_key="demo-payment-order-${TRACE_ID}"
- order_response="$(invoke_tool \
- "payment.createOrder" \
- "L4_FINANCIAL_ACTION" \
- "{\"lockId\":$(json_quote "$LOCK_ID")}" \
- "$order_idempotency_key")"
- printf '%s\n' "$order_response"
- if [ -z "$ORDER_ID" ] && [ "$has_jq" = true ]; then
- ORDER_ID="$(extract_json_string "$order_response" '.data.result.order.orderId')"
- fi
- require_dynamic_id "ORDER_ID" "$ORDER_ID" "Expected path with jq: .data.result.order.orderId"
- paid_idempotency_key="demo-mark-paid-${TRACE_ID}"
- paid_response="$(invoke_tool \
- "payment.markMockPaid" \
- "L4_FINANCIAL_ACTION" \
- "{\"orderId\":$(json_quote "$ORDER_ID")}" \
- "$paid_idempotency_key")"
- printf '%s\n' "$paid_response"
- registration_idempotency_key="demo-registration-${TRACE_ID}"
- registration_response="$(invoke_tool \
- "his.createRegistration" \
- "L3_BUSINESS_WRITE" \
- "{\"lockId\":$(json_quote "$LOCK_ID"),\"orderId\":$(json_quote "$ORDER_ID"),\"patientId\":$(json_quote "$PATIENT_ID"),\"patientName\":$(json_quote "$PATIENT_NAME"),\"patientIdCard\":$(json_quote "$PATIENT_ID_CARD"),\"patientPhone\":$(json_quote "$PATIENT_PHONE"),\"departmentId\":$(json_quote "$DEPARTMENT_ID"),\"doctorId\":$(json_quote "$DOCTOR_ID"),\"slotId\":$(json_quote "$SCHEDULE_ID")}" \
- "$registration_idempotency_key")"
- printf '%s\n' "$registration_response"
- echo
- echo "Flow complete. Expected final markers: mock=true, status=success"
|