Claude Code Plugins

Community-maintained marketplace

Feedback
0
0

出货溯源模块自动化测试。测试出货记录创建、状态更新、溯源查询。使用此Skill验证出货和溯源系统的完整性。

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name test-shipment-trace
description 出货溯源模块自动化测试。测试出货记录创建、状态更新、溯源查询。使用此Skill验证出货和溯源系统的完整性。
allowed-tools Bash, Read, Grep

出货溯源测试 Skill

测试 Cretas 食品溯源系统的出货记录和溯源查询模块。

测试环境

  • 服务地址: localhost:10010
  • 测试工厂: F001

执行测试

运行以下命令执行完整的出货溯源测试:

echo "========================================"
echo "出货溯源模块 - 自动化测试报告"
echo "环境: localhost:10010"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
echo ""

# 初始化计数器
PASS=0
FAIL=0

# 获取Token
echo "[前置] 获取测试Token..."
LOGIN_RESULT=$(curl -s -X POST "http://localhost:10010/api/mobile/auth/unified-login" \
  -H "Content-Type: application/json" \
  -d '{"username":"factory_admin1","password":"123456"}')
TOKEN=$(echo "$LOGIN_RESULT" | grep -o '"accessToken":"[^"]*"' | cut -d'"' -f4)

if [ -z "$TOKEN" ]; then
  echo "❌ 获取Token失败,测试终止"
  exit 1
fi
echo "✓ Token获取成功"
echo ""

echo "========== 出货记录测试 =========="
echo ""

# ========== 测试1: 获取出货记录列表 ==========
echo "[测试1] 获取出货记录列表"
echo "  请求: GET /api/mobile/F001/shipments"

RESULT=$(curl -s -w "\nHTTP_CODE:%{http_code}" \
  "http://localhost:10010/api/mobile/F001/shipments" \
  -H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$RESULT" | grep "HTTP_CODE:" | cut -d':' -f2)

if [ "$HTTP_CODE" = "200" ]; then
  echo "  期望: HTTP 200, 返回出货列表"
  echo "  实际: HTTP 200 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: HTTP 200"
  echo "  实际: HTTP $HTTP_CODE"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试2: 创建出货记录 ==========
echo "[测试2] 创建出货记录"
echo "  请求: POST /api/mobile/F001/shipments"

SHIP_NUM="SHIP-$(date +%s)"
RESULT=$(curl -s -X POST "http://localhost:10010/api/mobile/F001/shipments" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"shipmentNumber\": \"$SHIP_NUM\",
    \"customerId\": \"CUS001\",
    \"productName\": \"测试产品\",
    \"quantity\": 100,
    \"unit\": \"箱\",
    \"unitPrice\": 50.00,
    \"shipmentDate\": \"$(date +%Y-%m-%d)\",
    \"deliveryAddress\": \"北京市朝阳区测试地址\",
    \"logisticsCompany\": \"顺丰速运\",
    \"notes\": \"测试出货记录\"
  }")

if echo "$RESULT" | grep -q '"success":true\|"code":200'; then
  SHIP_ID=$(echo "$RESULT" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
  if [ -z "$SHIP_ID" ]; then
    SHIP_ID=$(echo "$RESULT" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
  fi
  echo "  期望: 创建成功"
  echo "  实际: 成功,单号=$SHIP_NUM ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: 创建成功"
  echo "  实际: $(echo $RESULT | head -c 150)"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
  SHIP_ID=""
fi
echo ""

# ========== 测试3: 获取出货记录详情 ==========
echo "[测试3] 获取出货记录详情"
if [ -n "$SHIP_ID" ]; then
  echo "  请求: GET /api/mobile/F001/shipments/$SHIP_ID"

  RESULT=$(curl -s -w "\nHTTP_CODE:%{http_code}" \
    "http://localhost:10010/api/mobile/F001/shipments/$SHIP_ID" \
    -H "Authorization: Bearer $TOKEN")
  HTTP_CODE=$(echo "$RESULT" | grep "HTTP_CODE:" | cut -d':' -f2)

  if [ "$HTTP_CODE" = "200" ]; then
    echo "  期望: HTTP 200"
    echo "  实际: HTTP 200 ✓"
    echo "  结果: ✅ PASS"
    PASS=$((PASS+1))
  else
    echo "  期望: HTTP 200"
    echo "  实际: HTTP $HTTP_CODE"
    echo "  结果: ❌ FAIL"
    FAIL=$((FAIL+1))
  fi
else
  echo "  跳过: 无可用出货ID"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试4: 更新出货状态(已发货) ==========
echo "[测试4] 更新出货状态(pending → shipped)"
if [ -n "$SHIP_ID" ]; then
  echo "  请求: PUT /api/mobile/F001/shipments/$SHIP_ID/status"

  RESULT=$(curl -s -X PUT "http://localhost:10010/api/mobile/F001/shipments/$SHIP_ID/status" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"status": "shipped", "trackingNumber": "SF123456789"}')

  if echo "$RESULT" | grep -q '"success":true\|"code":200'; then
    echo "  期望: 状态变为shipped"
    echo "  实际: 成功 ✓"
    echo "  结果: ✅ PASS"
    PASS=$((PASS+1))
  else
    echo "  期望: 状态更新"
    echo "  实际: $(echo $RESULT | head -c 100)"
    echo "  结果: ❌ FAIL"
    FAIL=$((FAIL+1))
  fi
else
  echo "  跳过: 无可用出货ID"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试5: 更新出货状态(已送达) ==========
echo "[测试5] 更新出货状态(shipped → delivered)"
if [ -n "$SHIP_ID" ]; then
  echo "  请求: PUT /api/mobile/F001/shipments/$SHIP_ID/status"

  RESULT=$(curl -s -X PUT "http://localhost:10010/api/mobile/F001/shipments/$SHIP_ID/status" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"status": "delivered"}')

  if echo "$RESULT" | grep -q '"success":true\|"code":200'; then
    echo "  期望: 状态变为delivered"
    echo "  实际: 成功 ✓"
    echo "  结果: ✅ PASS"
    PASS=$((PASS+1))
  else
    echo "  期望: 状态更新"
    echo "  实际: $(echo $RESULT | head -c 100)"
    echo "  结果: ❌ FAIL"
    FAIL=$((FAIL+1))
  fi
else
  echo "  跳过: 无可用出货ID"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试6: 按状态筛选出货记录 ==========
echo "[测试6] 按状态筛选出货记录"
echo "  请求: GET /api/mobile/F001/shipments?status=pending"

RESULT=$(curl -s "http://localhost:10010/api/mobile/F001/shipments?status=pending" \
  -H "Authorization: Bearer $TOKEN")

if echo "$RESULT" | grep -q '"success":true\|"code":200'; then
  echo "  期望: 返回pending状态记录"
  echo "  实际: 成功 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: 返回列表"
  echo "  实际: $(echo $RESULT | head -c 100)"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试7: 按日期范围查询 ==========
echo "[测试7] 按日期范围查询出货记录"

START_DATE=$(date -v-7d +%Y-%m-%d 2>/dev/null || date -d '7 days ago' +%Y-%m-%d)
END_DATE=$(date +%Y-%m-%d)
echo "  请求: GET /api/mobile/F001/shipments/date-range?startDate=$START_DATE&endDate=$END_DATE"

RESULT=$(curl -s "http://localhost:10010/api/mobile/F001/shipments/date-range?startDate=$START_DATE&endDate=$END_DATE" \
  -H "Authorization: Bearer $TOKEN")

if echo "$RESULT" | grep -q '"success":true\|"code":200'; then
  echo "  期望: 返回日期范围内记录"
  echo "  实际: 成功 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: 返回列表"
  echo "  实际: $(echo $RESULT | head -c 100)"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

echo "========== 溯源查询测试 =========="
echo ""

# ========== 测试8: 溯源查询(按批次号) ==========
echo "[测试8] 溯源查询(按生产批次号)"
echo "  请求: GET /api/mobile/F001/traceability/batch/PB001"

RESULT=$(curl -s -w "\nHTTP_CODE:%{http_code}" \
  "http://localhost:10010/api/mobile/F001/traceability/batch/PB001" \
  -H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$RESULT" | grep "HTTP_CODE:" | cut -d':' -f2)

if [ "$HTTP_CODE" = "200" ]; then
  echo "  期望: HTTP 200, 返回溯源信息"
  echo "  实际: HTTP 200 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: HTTP 200"
  echo "  实际: HTTP $HTTP_CODE"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试9: 溯源查询(完整链路) ==========
echo "[测试9] 溯源完整链路查询"
echo "  请求: GET /api/mobile/F001/traceability/full/PB001"

RESULT=$(curl -s "http://localhost:10010/api/mobile/F001/traceability/full/PB001" \
  -H "Authorization: Bearer $TOKEN")

if echo "$RESULT" | grep -q '"success":true\|"code":200\|rawMaterial\|production'; then
  echo "  期望: 返回完整溯源链路"
  echo "  实际: 成功 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: 完整链路"
  echo "  实际: $(echo $RESULT | head -c 150)"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试10: 公开溯源查询(无需Token) ==========
echo "[测试10] 公开溯源查询(消费者扫码)"
echo "  请求: GET /api/public/trace/PB001 (无Authorization)"

RESULT=$(curl -s -w "\nHTTP_CODE:%{http_code}" \
  "http://localhost:10010/api/public/trace/PB001")
HTTP_CODE=$(echo "$RESULT" | grep "HTTP_CODE:" | cut -d':' -f2)

if [ "$HTTP_CODE" = "200" ]; then
  echo "  期望: HTTP 200, 公开可访问"
  echo "  实际: HTTP 200 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
elif [ "$HTTP_CODE" = "404" ]; then
  echo "  期望: 公开接口"
  echo "  实际: 404 (接口可能未实现)"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
else
  echo "  期望: HTTP 200"
  echo "  实际: HTTP $HTTP_CODE"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试11: 按客户查询出货 ==========
echo "[测试11] 按客户查询出货记录"
echo "  请求: GET /api/mobile/F001/shipments/customer/CUS001"

RESULT=$(curl -s -w "\nHTTP_CODE:%{http_code}" \
  "http://localhost:10010/api/mobile/F001/shipments/customer/CUS001" \
  -H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$RESULT" | grep "HTTP_CODE:" | cut -d':' -f2)

if [ "$HTTP_CODE" = "200" ]; then
  echo "  期望: HTTP 200, 返回客户出货记录"
  echo "  实际: HTTP 200 ✓"
  echo "  结果: ✅ PASS"
  PASS=$((PASS+1))
else
  echo "  期望: HTTP 200"
  echo "  实际: HTTP $HTTP_CODE"
  echo "  结果: ❌ FAIL"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试12: 删除出货记录 ==========
echo "[测试12] 删除出货记录"

# 创建一个用于删除测试的记录
DELETE_SHIP="DEL-$(date +%s)"
CREATE_RESULT=$(curl -s -X POST "http://localhost:10010/api/mobile/F001/shipments" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"shipmentNumber\": \"$DELETE_SHIP\",
    \"customerId\": \"CUS001\",
    \"productName\": \"删除测试\",
    \"quantity\": 10,
    \"unit\": \"箱\",
    \"shipmentDate\": \"$(date +%Y-%m-%d)\"
  }")

DELETE_ID=$(echo "$CREATE_RESULT" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)

if [ -n "$DELETE_ID" ]; then
  echo "  请求: DELETE /api/mobile/F001/shipments/$DELETE_ID"

  RESULT=$(curl -s -X DELETE "http://localhost:10010/api/mobile/F001/shipments/$DELETE_ID" \
    -H "Authorization: Bearer $TOKEN")

  if echo "$RESULT" | grep -q '"success":true\|"code":200'; then
    echo "  期望: 删除成功"
    echo "  实际: 成功 ✓"
    echo "  结果: ✅ PASS"
    PASS=$((PASS+1))
  else
    echo "  期望: 删除成功"
    echo "  实际: $(echo $RESULT | head -c 100)"
    echo "  结果: ❌ FAIL"
    FAIL=$((FAIL+1))
  fi
else
  echo "  跳过: 创建测试记录失败"
  FAIL=$((FAIL+1))
fi
echo ""

# ========== 测试汇总 ==========
echo "========================================"
echo "测试汇总"
echo "========================================"
TOTAL=$((PASS+FAIL))
if [ $TOTAL -gt 0 ]; then
  RATE=$((PASS*100/TOTAL))
else
  RATE=0
fi
echo "总计: $TOTAL | 通过: $PASS | 失败: $FAIL | 通过率: ${RATE}%"
echo "========================================"

if [ $FAIL -eq 0 ]; then
  echo "✅ 所有测试通过!"
else
  echo "⚠️  有 $FAIL 个测试失败,请检查"
fi

出货状态流转

pending (待发货)
    │
    │ 发货
    ↓
shipped (已发货)
    │
    │ 送达
    ↓
delivered (已送达)
    │
    │ (异常情况)
    ↓
returned (已退货)

溯源链路

消费者扫码
    │
    ↓
查询产品批次号
    │
    ↓
┌─────────────────────────────────────┐
│ 原材料信息                           │
│ ├── 供应商                           │
│ ├── 批次号                           │
│ └── 入库/过期日期                     │
├─────────────────────────────────────┤
│ 生产信息                             │
│ ├── 生产批次                         │
│ ├── 生产日期                         │
│ └── 负责人/设备                       │
├─────────────────────────────────────┤
│ 质检信息                             │
│ ├── 检验日期                         │
│ ├── 检验员                           │
│ └── 合格率                           │
├─────────────────────────────────────┤
│ 出货信息                             │
│ ├── 出货日期                         │
│ └── 物流信息                         │
└─────────────────────────────────────┘

业务说明

  • 出货记录关联客户和产品批次
  • 溯源支持公开查询(消费者扫码)
  • 完整链路包含从原材料到出货的所有环节