test_all_salary_calculation_protection.sh 6.38 KB
#!/bin/bash

# 测试所有薪酬计算服务的保护逻辑
# 验证已锁定和已确认的记录不会被覆盖

BASE_URL="http://localhost:2011"
YEAR=2025
MONTH=12

echo "============================================================"
echo "薪酬计算保护逻辑测试"
echo "============================================================"
echo ""
echo "测试目标:"
echo "1. 验证所有9个薪酬计算接口是否正常工作"
echo "2. 确认已锁定或已确认的记录不会被覆盖"
echo "3. 检查日志输出是否正确"
echo ""
echo "测试月份: ${YEAR}${MONTH}月"
echo "============================================================"
echo ""

# 获取Token
echo "1. 获取认证Token..."
TOKEN=$(curl -s -X POST "${BASE_URL}/api/oauth/Login" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "account=admin&password=e10adc3949ba59abbe56e057f20f883e" | \
  python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('data', {}).get('token', ''))" 2>/dev/null)

if [ -z "$TOKEN" ]; then
  echo "❌ 获取Token失败,请检查:"
  echo "   - 后端服务是否运行"
  echo "   - 服务地址是否正确(默认:http://localhost:2011)"
  echo "   - 登录账号密码是否正确"
  exit 1
fi

echo "✅ Token获取成功"
echo ""

# 测试函数
test_salary_calculation() {
  local name=$1
  local endpoint=$2
  local description=$3
  
  echo "------------------------------------------------------------"
  echo "测试: ${name}"
  echo "接口: ${endpoint}"
  echo "------------------------------------------------------------"
  
  # 调用计算接口
  start_time=$(date +%s)
  response=$(curl -s -X POST "${BASE_URL}${endpoint}?year=${YEAR}&month=${MONTH}" \
    -H "Authorization: ${TOKEN}" \
    -H "Content-Type: application/json" \
    -w "\n%{http_code}")
  
  end_time=$(date +%s)
  elapsed=$((end_time - start_time))
  
  http_code=$(echo "$response" | tail -n 1)
  body=$(echo "$response" | sed '$d')
  
  echo "响应时间: ${elapsed}秒"
  echo "HTTP状态码: ${http_code}"
  
  if [ "$http_code" = "200" ]; then
    # 检查响应内容
    code=$(echo "$body" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('code', ''))" 2>/dev/null)
    
    if [ "$code" = "200" ]; then
      msg=$(echo "$body" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('msg', ''))" 2>/dev/null)
      echo "✅ ${name} - 计算成功"
      if [ ! -z "$msg" ]; then
        echo "   消息: ${msg}"
      fi
      echo ""
      return 0
    else
      error_msg=$(echo "$body" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('msg', '未知错误'))" 2>/dev/null)
      echo "❌ ${name} - 计算失败"
      echo "   错误: ${error_msg}"
      echo "   响应: ${body:0:200}"
      echo ""
      return 1
    fi
  else
    echo "❌ ${name} - HTTP错误: ${http_code}"
    echo "   响应: ${body:0:200}"
    echo ""
    return 1
  fi
}

# 测试所有薪酬计算接口
echo "2. 开始测试所有薪酬计算接口..."
echo ""

success_count=0
fail_count=0

# 1. 健康师工资
if test_salary_calculation "健康师工资" \
  "/api/Extend/LqSalary/calculate/health-coach" \
  "健康师薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 2. 店长工资
if test_salary_calculation "店长工资" \
  "/api/Extend/LqStoreManagerSalary/calculate/store-manager" \
  "店长薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 3. 主任工资
if test_salary_calculation "主任工资" \
  "/api/Extend/LqDirectorSalary/calculate/director" \
  "主任薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 4. 店助工资
if test_salary_calculation "店助工资" \
  "/api/Extend/LqAssistantSalary/calculate/assistant" \
  "店助薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 5. 科技部老师工资
if test_salary_calculation "科技部老师工资" \
  "/api/Extend/LqTechTeacherSalary/calculate/tech-teacher" \
  "科技部老师薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 6. 大项目部老师工资
if test_salary_calculation "大项目部老师工资" \
  "/api/Extend/LqMajorProjectTeacherSalary/calculate/major-project-teacher" \
  "大项目部老师薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 7. 大项目主管工资
if test_salary_calculation "大项目主管工资" \
  "/api/Extend/LqMajorProjectDirectorSalary/calculate/major-project-director" \
  "大项目主管薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 8. 科技部总经理工资
if test_salary_calculation "科技部总经理工资" \
  "/api/Extend/LqTechGeneralManagerSalary/calculate/tech-general-manager" \
  "科技部总经理薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi
sleep 1

# 9. 事业部总经理工资
if test_salary_calculation "事业部总经理工资" \
  "/api/Extend/LqBusinessUnitManagerSalary/calculate/business-unit-manager" \
  "事业部总经理薪酬服务"; then
  ((success_count++))
else
  ((fail_count++))
fi

# 输出测试总结
echo "============================================================"
echo "测试总结"
echo "============================================================"
echo "总测试数: 9"
echo "✅ 成功: ${success_count}"
echo "❌ 失败: ${fail_count}"
echo ""

if [ $fail_count -eq 0 ]; then
  echo "✅ 所有薪酬计算接口测试通过!"
else
  echo "⚠️  有 ${fail_count} 个接口测试失败,请检查日志"
fi

echo ""
echo "============================================================"
echo "测试说明"
echo "============================================================"
echo "1. 接口调用成功后,请检查后端日志:"
echo "   - 是否显示'跳过了 N 条已锁定或已确认的工资记录'"
echo "   - 确认已锁定或已确认的记录数量是否正确"
echo ""
echo "2. 检查数据库中已锁定或已确认的记录:"
echo "   - 扣款项目是否被保留"
echo "   - 补贴项目是否被保留"
echo "   - 其他导入的数据是否被保留"
echo ""
echo "3. 验证方法:"
echo "   - 导入Excel添加扣款项目"
echo "   - 锁定部分记录"
echo "   - 员工确认部分记录"
echo "   - 再次计算工资"
echo "   - 检查已锁定/已确认的记录,扣款项目应该被保留"
echo "============================================================"