#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试所有薪酬计算服务的保护逻辑 验证已锁定和已确认的记录不会被覆盖 """ import requests import time # API配置 BASE_URL = "http://localhost:2011" LOGIN_URL = f"{BASE_URL}/api/oauth/Login" # 所有薪酬计算接口 SALARY_SERVICES = [ { "name": "健康师工资", "endpoint": "/api/Extend/LqSalary/calculate/health-coach", "description": "健康师薪酬服务" }, { "name": "店长工资", "endpoint": "/api/Extend/LqStoreManagerSalary/calculate", "description": "店长薪酬服务" }, { "name": "主任工资", "endpoint": "/api/Extend/LqDirectorSalary/calculate", "description": "主任薪酬服务" }, { "name": "店助工资", "endpoint": "/api/Extend/LqAssistantSalary/calculate", "description": "店助薪酬服务" }, { "name": "科技部老师工资", "endpoint": "/api/Extend/LqTechTeacherSalary/calculate", "description": "科技部老师薪酬服务" }, { "name": "大项目部老师工资", "endpoint": "/api/Extend/LqMajorProjectTeacherSalary/calculate", "description": "大项目部老师薪酬服务" }, { "name": "大项目主管工资", "endpoint": "/api/Extend/LqMajorProjectDirectorSalary/calculate", "description": "大项目主管薪酬服务" }, { "name": "科技部总经理工资", "endpoint": "/api/Extend/LqTechGeneralManagerSalary/calculate", "description": "科技部总经理薪酬服务" }, { "name": "事业部总经理工资", "endpoint": "/api/Extend/LqBusinessUnitManagerSalary/calculate", "description": "事业部总经理薪酬服务" } ] def get_token(): """获取登录token""" data = { "account": "admin", "password": "e10adc3949ba59abbe56e057f20f883e" # 123456的MD5 } headers = { "Content-Type": "application/x-www-form-urlencoded" } try: response = requests.post(LOGIN_URL, data=data, headers=headers, timeout=10) if response.status_code == 200: result = response.json() if result.get("code") == 200 and result.get("data"): token = result["data"].get("token") return token print(f"❌ 获取token失败: {response.status_code}") print(f"响应: {response.text[:200]}") except Exception as e: print(f"❌ 请求异常: {str(e)}") return None def test_salary_calculation(service_info, year, month, token): """测试单个薪酬计算接口""" name = service_info["name"] endpoint = service_info["endpoint"] url = f"{BASE_URL}{endpoint}" headers = { "Authorization": token, "Content-Type": "application/json" } params = { "year": year, "month": month } print(f"\n{'='*70}") print(f"测试: {name}") print(f"{'='*70}") print(f"接口: {endpoint}") print(f"参数: year={year}, month={month}") try: start_time = time.time() response = requests.post(url, json=params, headers=headers, timeout=60) elapsed_time = time.time() - start_time print(f"响应时间: {elapsed_time:.2f}秒") print(f"状态码: {response.status_code}") if response.status_code == 200: try: result = response.json() if result.get("code") == 200: print(f"✅ {name} - 计算成功") msg = result.get("msg", "") if msg: print(f" 消息: {msg}") return True else: print(f"❌ {name} - 计算失败") print(f" 错误代码: {result.get('code')}") print(f" 错误信息: {result.get('msg', '未知错误')}") return False except: # 可能是字符串响应 text = response.text[:200] if "操作成功" in text or "成功" in text: print(f"✅ {name} - 计算成功") print(f" 响应: {text}") return True else: print(f"⚠️ {name} - 响应格式异常") print(f" 响应: {text}") return False else: print(f"❌ {name} - HTTP错误: {response.status_code}") print(f" 响应: {response.text[:200]}") return False except requests.exceptions.Timeout: print(f"❌ {name} - 请求超时(超过60秒)") return False except Exception as e: print(f"❌ {name} - 请求异常: {str(e)}") return False def main(): """主测试函数""" print("="*70) print("薪酬计算保护逻辑测试") print("="*70) print("\n测试目标:") print("1. 验证所有9个薪酬计算接口是否正常工作") print("2. 确认已锁定或已确认的记录不会被覆盖") print("3. 检查日志输出是否正确") print("\n" + "="*70) # 获取token print("\n1. 获取认证Token...") token = get_token() if not token: print("❌ 无法获取Token,请检查:") print(" - 后端服务是否运行") print(" - 服务地址是否正确(默认:http://localhost:2011)") print(" - 登录账号密码是否正确") return print("✅ Token获取成功") # 测试参数 year = 2025 month = 12 print(f"\n2. 开始测试所有薪酬计算接口...") print(f" 测试月份: {year}年{month}月") print(f"\n{'='*70}") # 测试结果统计 success_count = 0 fail_count = 0 results = [] # 测试每个服务 for i, service in enumerate(SALARY_SERVICES, 1): print(f"\n[{i}/{len(SALARY_SERVICES)}] 测试 {service['name']}...") success = test_salary_calculation(service, year, month, token) results.append({ "name": service["name"], "endpoint": service["endpoint"], "success": success }) if success: success_count += 1 else: fail_count += 1 # 避免请求过快 if i < len(SALARY_SERVICES): time.sleep(1) # 输出测试总结 print(f"\n{'='*70}") print("测试总结") print(f"{'='*70}") print(f"总测试数: {len(SALARY_SERVICES)}") print(f"✅ 成功: {success_count}") print(f"❌ 失败: {fail_count}") print(f"\n详细结果:") for result in results: status = "✅ 通过" if result["success"] else "❌ 失败" print(f" {status} - {result['name']}") print(f"\n{'='*70}") print("测试说明:") print("1. 接口调用成功后,请检查后端日志:") print(" - 是否显示'跳过了 N 条已锁定或已确认的工资记录'") print(" - 确认已锁定或已确认的记录数量是否正确") print("2. 检查数据库中已锁定或已确认的记录:") print(" - 扣款项目是否被保留") print(" - 补贴项目是否被保留") print(" - 其他导入的数据是否被保留") print(f"{'='*70}") if __name__ == '__main__': main()