#!/usr/bin/env bash # 验证"改了模型文件 → 执行的操作定义随之改变"(针对 MetaRule 阈值)。 # 前置:后端已在 8080 运行(./start.sh 或 cd engine && mvn spring-boot:run)。 set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" BASE="http://localhost:8080" MODEL="$ROOT/models/MetaRule-business.yaml" # 明细 1 件 × 7997 → 引擎服务端重算 totalAmount=7997(无视 master 传入值,防篡改) ORDER='{"master":{"customerId":"C001","totalCurrency":"CNY","createTime":"2026-07-20T10:00:00"}, "details":{"OrderItem":[{"productId":"P003","quantity":1,"itemPrice":7997,"itemCurrency":"CNY"}], "PaymentTerm":[{"paymentType":"现金","dueDays":0}], "DeliveryAddressEntity":[{"province":"广东","city":"深圳","district":"南山","streetDetail":"x","receiverName":"张三","receiverPhone":"13800001111"}]}}' say() { printf "\n\033[1m%s\033[0m\n" "$1"; } exec_order() { curl -s -X POST "$BASE/api/scene/SCENE_CREATE_ORDER/execute" -H 'Content-Type: application/json' -d "$ORDER"; } field() { python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('$1'))"; } curl -s -o /dev/null "$BASE/api/meta/models" || { echo "后端未就绪,请先启动 8080"; exit 1; } say "A) 改动前:普通用户 C001,金额 7997 (< 50000)" echo "$ORDER" | exec_order /dev/null 2>&1 || true R=$(exec_order); echo " success=$(echo "$R" | field success)" say "B) 仅改模型:single_order_max_amount 50000 -> 100(无代码改动)" perl -0pi -e 's/defaultValue: 50000/defaultValue: 100/' "$MODEL" curl -s -X POST "$BASE/api/meta/reload" -H 'X-Principal: backend_admin' >/dev/null; echo " 已热重载" say "C) 改动后:同一笔订单 (7997 > 100) 应被 REJECT" R=$(exec_order) echo " success=$(echo "$R" | field success) stage=$(echo "$R" | field stage) message=$(echo "$R" | field message)" say "D) 恢复模型 100 -> 50000 并重载" perl -0pi -e 's/defaultValue: 100\b/defaultValue: 50000/' "$MODEL" curl -s -X POST "$BASE/api/meta/reload" -H 'X-Principal: backend_admin' >/dev/null; echo " 已恢复" say "结论:同一请求、仅改 YAML,结果从『通过』变为『拦截』——行为源于模型而非代码。"