From 86f4e8288e47d0f8c4eb6d44bbd8ab47affba2e2 Mon Sep 17 00:00:00 2001 From: zhouqi Date: Wed, 6 May 2026 10:54:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0JoyHub=E8=BF=90?= =?UTF-8?q?=E8=B4=B9=E6=A8=A1=E6=9D=BF=E5=92=8CBanner=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 44 + Log/run.log | 2367 +++++++++++++++++ base_framework/base_config/config.ini | 18 + base_framework/base_config/config_hh_qa.ini | 10 + base_framework/public_tools/db_config.py | 10 +- base_framework/public_tools/pgsqlhelper.py | 6 +- dulizhan/__init__.py | 0 .../library/BusinessKw/JoyHub/BannerManage.py | 176 ++ .../library/BusinessKw/JoyHub/DeptManage.py | 174 ++ .../library/BusinessKw/JoyHub/PostManage.py | 197 ++ .../library/BusinessKw/JoyHub/RoleManage.py | 351 +++ .../JoyHub/ShippingTemplateManage.py | 190 ++ .../library/BusinessKw/JoyHub/UserManage.py | 451 ++++ .../library/BusinessKw/JoyHub/UserProfile.py | 74 + .../library/BusinessKw/JoyHub/__init__.py | 7 + .../BusinessKw/SZPurchase/ContractManage.py | 0 .../SZPurchase/PurchaseOrderManage.py | 97 + .../SZPurchase/PurchasePlanManage.py | 0 .../library/BusinessKw/SZPurchase/__init__.py | 0 .../library/BusinessKw/SZPurchase/index.py | 88 + .../BusinessKw/SZPurchase/purchase.ini | 2 + dulizhan/library/BusinessKw/__init__.py | 0 dulizhan/library/CommonFun/__init__.py | 0 dulizhan/library/CommonFun/asset_common.py | 57 + .../library/CommonFun/contract_pair_check.py | 240 ++ .../CommonFun/course_package_common.py | 31 + dulizhan/library/CommonFun/drawPicture.py | 31 + dulizhan/library/CommonFun/env_check.ini | 7 + dulizhan/library/CommonFun/env_check.py | 141 + dulizhan/library/CommonFun/handle_aita.py | 141 + .../library/CommonFun/handle_harmonyos.py | 105 + dulizhan/library/CommonFun/handle_jenkins.py | 257 ++ dulizhan/library/CommonFun/handle_jira.py | 331 +++ dulizhan/library/CommonFun/handle_kibana.py | 45 + dulizhan/library/CommonFun/handle_login.py | 204 ++ dulizhan/library/CommonFun/handle_mq.py | 19 + dulizhan/library/CommonFun/handle_picture.py | 56 + dulizhan/library/CommonFun/handle_tools.py | 211 ++ dulizhan/library/CommonFun/host_update.ini | 1 + dulizhan/library/CommonFun/host_update.py | 263 ++ .../library/CommonFun/statistical_function.py | 142 + dulizhan/library/CommonFun/ubrd_now_time.py | 64 + dulizhan/library/CommonFun/user_common.py | 272 ++ dulizhan/library/CommonFun/user_message.py | 20 + dulizhan/library/Config/team_config.ini | 9 + dulizhan/library/Config/xingxingchongzhi.xlsx | Bin 0 -> 9423 bytes dulizhan/library/Dlizhan_interface.py | 337 +++ dulizhan/library/UpFile/classify.xlsx | Bin 0 -> 12324 bytes dulizhan/library/UpFile/draw_user.xlsx | Bin 0 -> 10271 bytes dulizhan/library/UpFile/tag.xlsx | Bin 0 -> 10952 bytes dulizhan/library/UpFile/uploadstar.xlsx | Bin 0 -> 9641 bytes dulizhan/library/ZZYYLogic/__init__.py | 0 dulizhan/library/ZZYYLogic/purchase_logic.py | 43 + dulizhan/library/__init__.py | 134 + dulizhan/qa_helper/__init__.py | 0 dulizhan/qa_helper/common/__init__.py | 1 + dulizhan/qa_helper/common/course_package.py | 337 +++ dulizhan/qa_helper/common/order.py | 109 + dulizhan/qa_helper/common/user.py | 208 ++ dulizhan/test_case/JENKINS_SETUP.md | 190 ++ dulizhan/test_case/Jenkinsfile | 175 ++ dulizhan/test_case/README_JENKINS.md | 84 + dulizhan/test_case/README_RUN_TESTS.md | 96 + .../test_case/Resource/AdapterKws/hh-qa.robot | 31 + dulizhan/test_case/TestCase/__init__.py | 0 .../TestCase/接口/JoyHub/Joyhub_Banner.py | 292 ++ .../TestCase/接口/JoyHub/Joyhub_Dept.py | 260 ++ .../TestCase/接口/JoyHub/Joyhub_Post.py | 305 +++ .../TestCase/接口/JoyHub/Joyhub_Role.py | 433 +++ .../接口/JoyHub/Joyhub_ShippingTemplate.py | 308 +++ .../接口/JoyHub/Joyhub_UserProfile.py | 174 ++ .../TestCase/接口/JoyHub/Joyhub_user.py | 534 ++++ .../TestCase/接口/JoyHub/__init__.py | 7 + .../接口/SZPurchase/ContractManage.py | 0 .../接口/SZPurchase/PurchaseOrderManage.py | 75 + .../接口/SZPurchase/PurchasePlanManage.py | 0 .../TestCase/接口/SZPurchase/__init__.py | 0 .../TestCase/接口/SZPurchase/index.py | 19 + dulizhan/test_case/TestCase/接口/__init__.py | 0 dulizhan/test_case/TestCase/接口/conftest.py | 14 + dulizhan/test_case/__init__.py | 0 dulizhan/test_case/jenkins_build.bat | 44 + dulizhan/test_case/jenkins_build.sh | 47 + dulizhan/test_case/run_all.bat | 7 + dulizhan/test_case/run_purchase.bat | 7 + dulizhan/test_case/run_tests.py | 250 ++ extract_allure.py | 14 + generate_allure_report.bat | 20 + generate_report.py | 96 + 89 files changed, 11557 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 dulizhan/__init__.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/BannerManage.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/DeptManage.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/PostManage.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/RoleManage.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/ShippingTemplateManage.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/UserManage.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/UserProfile.py create mode 100644 dulizhan/library/BusinessKw/JoyHub/__init__.py create mode 100644 dulizhan/library/BusinessKw/SZPurchase/ContractManage.py create mode 100644 dulizhan/library/BusinessKw/SZPurchase/PurchaseOrderManage.py create mode 100644 dulizhan/library/BusinessKw/SZPurchase/PurchasePlanManage.py create mode 100644 dulizhan/library/BusinessKw/SZPurchase/__init__.py create mode 100644 dulizhan/library/BusinessKw/SZPurchase/index.py create mode 100644 dulizhan/library/BusinessKw/SZPurchase/purchase.ini create mode 100644 dulizhan/library/BusinessKw/__init__.py create mode 100644 dulizhan/library/CommonFun/__init__.py create mode 100644 dulizhan/library/CommonFun/asset_common.py create mode 100644 dulizhan/library/CommonFun/contract_pair_check.py create mode 100644 dulizhan/library/CommonFun/course_package_common.py create mode 100644 dulizhan/library/CommonFun/drawPicture.py create mode 100644 dulizhan/library/CommonFun/env_check.ini create mode 100644 dulizhan/library/CommonFun/env_check.py create mode 100644 dulizhan/library/CommonFun/handle_aita.py create mode 100644 dulizhan/library/CommonFun/handle_harmonyos.py create mode 100644 dulizhan/library/CommonFun/handle_jenkins.py create mode 100644 dulizhan/library/CommonFun/handle_jira.py create mode 100644 dulizhan/library/CommonFun/handle_kibana.py create mode 100644 dulizhan/library/CommonFun/handle_login.py create mode 100644 dulizhan/library/CommonFun/handle_mq.py create mode 100644 dulizhan/library/CommonFun/handle_picture.py create mode 100644 dulizhan/library/CommonFun/handle_tools.py create mode 100644 dulizhan/library/CommonFun/host_update.ini create mode 100644 dulizhan/library/CommonFun/host_update.py create mode 100644 dulizhan/library/CommonFun/statistical_function.py create mode 100644 dulizhan/library/CommonFun/ubrd_now_time.py create mode 100644 dulizhan/library/CommonFun/user_common.py create mode 100644 dulizhan/library/CommonFun/user_message.py create mode 100644 dulizhan/library/Config/team_config.ini create mode 100644 dulizhan/library/Config/xingxingchongzhi.xlsx create mode 100644 dulizhan/library/Dlizhan_interface.py create mode 100644 dulizhan/library/UpFile/classify.xlsx create mode 100644 dulizhan/library/UpFile/draw_user.xlsx create mode 100644 dulizhan/library/UpFile/tag.xlsx create mode 100644 dulizhan/library/UpFile/uploadstar.xlsx create mode 100644 dulizhan/library/ZZYYLogic/__init__.py create mode 100644 dulizhan/library/ZZYYLogic/purchase_logic.py create mode 100644 dulizhan/library/__init__.py create mode 100644 dulizhan/qa_helper/__init__.py create mode 100644 dulizhan/qa_helper/common/__init__.py create mode 100644 dulizhan/qa_helper/common/course_package.py create mode 100644 dulizhan/qa_helper/common/order.py create mode 100644 dulizhan/qa_helper/common/user.py create mode 100644 dulizhan/test_case/JENKINS_SETUP.md create mode 100644 dulizhan/test_case/Jenkinsfile create mode 100644 dulizhan/test_case/README_JENKINS.md create mode 100644 dulizhan/test_case/README_RUN_TESTS.md create mode 100644 dulizhan/test_case/Resource/AdapterKws/hh-qa.robot create mode 100644 dulizhan/test_case/TestCase/__init__.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Banner.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Dept.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Post.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Role.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_ShippingTemplate.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_UserProfile.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_user.py create mode 100644 dulizhan/test_case/TestCase/接口/JoyHub/__init__.py create mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/ContractManage.py create mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py create mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py create mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/__init__.py create mode 100644 dulizhan/test_case/TestCase/接口/SZPurchase/index.py create mode 100644 dulizhan/test_case/TestCase/接口/__init__.py create mode 100644 dulizhan/test_case/TestCase/接口/conftest.py create mode 100644 dulizhan/test_case/__init__.py create mode 100644 dulizhan/test_case/jenkins_build.bat create mode 100644 dulizhan/test_case/jenkins_build.sh create mode 100644 dulizhan/test_case/run_all.bat create mode 100644 dulizhan/test_case/run_purchase.bat create mode 100644 dulizhan/test_case/run_tests.py create mode 100644 extract_allure.py create mode 100644 generate_allure_report.bat create mode 100644 generate_report.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eda59ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# 测试报告和结果目录 +dulizhan/test_case/reports/ +allure-results/ +allure-report/ +pytest-html/ +allure/ +allure.zip +zhyy/test_case/reports/ + +# pytest 缓存 +.pytest_cache/ +__pycache__/ + +# Python 编译文件 +*.pyc +*.pyo +*.pyd +*.egg-info/ +.eggs/ + +# 日志文件 +*.log +logs/ + +# 临时文件 +*.tmp +*.temp +.DS_Store +Thumbs.db + +# IDE 配置 +.idea/ +.vscode/ +.project +.pydevproject + +# 虚拟环境 +venv/ +env/ +.env/ + +# 数据库文件 +*.db +*.sqlite \ No newline at end of file diff --git a/Log/run.log b/Log/run.log index f72fc0e..374153a 100644 --- a/Log/run.log +++ b/Log/run.log @@ -1119,3 +1119,2370 @@ LINE 1: SELECT * FROM "smart_management_st".erp_purchase_order WHERE... 2026-01-22 18:16:41,044 [tid:23948 pid:20832] runner.py[line:183] INFO 请求头headers:{'User-Agent': 'python-requests/2.25.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'd1d822350e7c4c2dbd29873ed04fbfd2', 'tenant-id': '1', 'ssotoken': 'd1d822350e7c4c2dbd29873ed04fbfd2', 'sso-token': 'd1d822350e7c4c2dbd29873ed04fbfd2', 'Accesstoken': 'd1d822350e7c4c2dbd29873ed04fbfd2', 'access-token': 'd1d822350e7c4c2dbd29873ed04fbfd2', 'token': 'd1d822350e7c4c2dbd29873ed04fbfd2'} 2026-01-22 18:16:41,263 [tid:23948 pid:20832] runner.py[line:202] INFO ------状态码:200, 返回信息:{'code': 0, 'msg': '', 'data': {'total': 308, 'list': [{'id': 47489, 'orderSn': 'PO251209021', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10780445, "name": "王焱"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 349, 'supplierName': '东莞市英爵实业有限公司', 'warehouseId': 0, 'warehouseName': '多仓库采购', 'orderTime': 1765260611000, 'totalQuantity': 470, 'totalAmount': 24681.8, 'totalPrice': 24681.8, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 470, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1765260128000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 2}, {'id': 47465, 'orderSn': 'PO251223018', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 129, 'supplierName': '安芮健康科技(东莞)有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469720000, 'totalQuantity': 700, 'totalAmount': 23100.0, 'totalPrice': 23100.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 700, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47463, 'orderSn': 'PO251223019', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 135, 'supplierName': '东莞市思你电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469720000, 'totalQuantity': 1232, 'totalAmount': 55264.0, 'totalPrice': 55264.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 1232, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 2}, {'id': 47461, 'orderSn': 'PO251223020', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 409, 'supplierName': '深圳市享乐健康科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469720000, 'totalQuantity': 108, 'totalAmount': 6652.8, 'totalPrice': 6652.8, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 108, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47459, 'orderSn': 'PO251223021', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 355, 'supplierName': '惠州鸿晶科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 420, 'totalAmount': 14982.0, 'totalPrice': 14982.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 420, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 2}, {'id': 47457, 'orderSn': 'PO251223022', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 392, 'supplierName': '东莞市圣蓓电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 240, 'totalAmount': 11772.0, 'totalPrice': 11772.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': '', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 240, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47455, 'orderSn': 'PO251223023', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 236, 'supplierName': '东莞市梦马电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 160, 'totalAmount': 9766.4, 'totalPrice': 9766.4, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 160, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462061000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47453, 'orderSn': 'PO251223024', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 419, 'supplierName': '东莞纵趣电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 120, 'totalAmount': 10856.4, 'totalPrice': 10856.4, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 120, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462061000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47451, 'orderSn': 'PO251223025', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10430026, "name": "余永艳"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 334, 'supplierName': '东莞市奕旭科技有限公司', 'warehouseId': 10156, 'warehouseName': '深圳中转仓-贸易FBA-EU', 'orderTime': 1766469719000, 'totalQuantity': 348, 'totalAmount': 34452.0, 'totalPrice': 34452.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 348, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462313000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47449, 'orderSn': 'PO251223026', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 104, "name": "方敏"}, {"id": 10430026, "name": "余永艳"}, {"id": 107, "name": "欧晓岚"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 135, 'supplierName': '东莞市思你电子科技有限公司', 'warehouseId': 0, 'warehouseName': '多仓库采购', 'orderTime': 1766469719000, 'totalQuantity': 18362, 'totalAmount': 506158.4, 'totalPrice': 506158.4, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 18362, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462313000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 15}], 'redundancy1': '21844061.26', 'redundancy2': None, 'redundancy3': None, 'redundancy4': None}} 2026-01-22 18:16:41,264 [tid:23948 pid:20832] runner.py[line:235] INFO 返回数据:{'code': 0, 'msg': '', 'data': {'total': 308, 'list': [{'id': 47489, 'orderSn': 'PO251209021', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10780445, "name": "王焱"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 349, 'supplierName': '东莞市英爵实业有限公司', 'warehouseId': 0, 'warehouseName': '多仓库采购', 'orderTime': 1765260611000, 'totalQuantity': 470, 'totalAmount': 24681.8, 'totalPrice': 24681.8, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 470, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1765260128000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 2}, {'id': 47465, 'orderSn': 'PO251223018', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 129, 'supplierName': '安芮健康科技(东莞)有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469720000, 'totalQuantity': 700, 'totalAmount': 23100.0, 'totalPrice': 23100.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 700, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47463, 'orderSn': 'PO251223019', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 135, 'supplierName': '东莞市思你电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469720000, 'totalQuantity': 1232, 'totalAmount': 55264.0, 'totalPrice': 55264.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 1232, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 2}, {'id': 47461, 'orderSn': 'PO251223020', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 409, 'supplierName': '深圳市享乐健康科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469720000, 'totalQuantity': 108, 'totalAmount': 6652.8, 'totalPrice': 6652.8, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 108, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47459, 'orderSn': 'PO251223021', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 355, 'supplierName': '惠州鸿晶科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 420, 'totalAmount': 14982.0, 'totalPrice': 14982.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 420, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 2}, {'id': 47457, 'orderSn': 'PO251223022', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 392, 'supplierName': '东莞市圣蓓电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 240, 'totalAmount': 11772.0, 'totalPrice': 11772.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': '', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 240, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462060000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47455, 'orderSn': 'PO251223023', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 236, 'supplierName': '东莞市梦马电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 160, 'totalAmount': 9766.4, 'totalPrice': 9766.4, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 160, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462061000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47453, 'orderSn': 'PO251223024', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10384696, "name": "胡利娟"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 419, 'supplierName': '东莞纵趣电子科技有限公司', 'warehouseId': 10152, 'warehouseName': '深圳中转仓-贸易FBA-JP', 'orderTime': 1766469719000, 'totalQuantity': 120, 'totalAmount': 10856.4, 'totalPrice': 10856.4, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 120, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462061000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47451, 'orderSn': 'PO251223025', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 10430026, "name": "余永艳"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 334, 'supplierName': '东莞市奕旭科技有限公司', 'warehouseId': 10156, 'warehouseName': '深圳中转仓-贸易FBA-EU', 'orderTime': 1766469719000, 'totalQuantity': 348, 'totalAmount': 34452.0, 'totalPrice': 34452.0, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 348, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462313000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 1}, {'id': 47449, 'orderSn': 'PO251223026', 'purchaserId': 143, 'purchaserName': '孙丽萍', 'principalIds': '[{"id": 104, "name": "方敏"}, {"id": 10430026, "name": "余永艳"}, {"id": 107, "name": "欧晓岚"}, {"id": 10378449, "name": "孙丽萍"}]', 'purchaseCompanyId': 101, 'purchaseCompanyName': '深圳易威行贸易有限公司', 'supplierId': 135, 'supplierName': '东莞市思你电子科技有限公司', 'warehouseId': 0, 'warehouseName': '多仓库采购', 'orderTime': 1766469719000, 'totalQuantity': 18362, 'totalAmount': 506158.4, 'totalPrice': 506158.4, 'settlementMethod': 'MONTHLY_SETTLEMENT', 'isTaxIncluded': 1, 'currencyCode': 'CNY', 'paymentMethod': 'ONLINE_BANKING', 'advanceRatio': 0.0, 'contractId': 0, 'relatedPlans': '[]', 'attachmentId': 0, 'inboundStatus': 0, 'inboundStatusText': '未入库', 'inboundQuantity': 0, 'pendingInboundQuantity': 18362, 'paymentStatus': 0, 'paymentStatusText': '未支付', 'status': 0, 'statusText': '待创建合同', 'cancelReason': None, 'remark': None, 'createTime': 1766462313000, 'userId': 143, 'deptId': 106, 'inboundTime': None, 'skuNum': 15}], 'redundancy1': '21844061.26', 'redundancy2': None, 'redundancy3': None, 'redundancy4': None}} +2026-04-28 18:48:28,133 [tid:7572 pid:23692] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: {'username': 'joytest', 'password': '123456'} +2026-04-28 18:48:28,162 [tid:7572 pid:23692] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-28 18:48:28,163 [tid:7572 pid:23692] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/auth/login +2026-04-28 18:48:28,164 [tid:7572 pid:23692] runner.py[line:117] INFO 请求数据:{'json': {'username': 'joytest', 'password': '123456'}} +2026-04-28 18:48:28,166 [tid:7572 pid:23692] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-28 18:49:54,201 [tid:3968 pid:34504] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: {'username': 'joytest', 'password': '123456'} +2026-04-28 18:49:54,204 [tid:3968 pid:34504] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-28 18:49:54,205 [tid:3968 pid:34504] runner.py[line:116] INFO 请求地址:http://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login +2026-04-28 18:49:54,206 [tid:3968 pid:34504] runner.py[line:117] INFO 请求数据:{'json': {'username': 'joytest', 'password': '123456'}} +2026-04-28 18:49:54,206 [tid:3968 pid:34504] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-28 18:51:04,984 [tid:20864 pid:3968] pgsqlhelper.py[line:112] INFO SQL语句:SELECT username, nickname, email FROM system_users LIMIT 10 +2026-04-28 18:51:04,989 [tid:20864 pid:3968] pgsqlhelper.py[line:72] ERROR +PostgreSQL连接失败! +连接配置信息: + 主机(Host): 39.170.26.156 + 端口(Port): 8566 + 数据库名(Database): smart_management_st + 用户名(User): sm_test_user + 密码(Password): *********** (已隐藏) + 选择数据库(ChooseDB): joyhub +错误详情: No option 'db_joyhub_host' in section: 'PostgreSQL' + +2026-04-28 18:57:45,231 [tid:18556 pid:27804] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: {'username': 'joytest', 'password': '123456'} +2026-04-28 18:57:45,236 [tid:18556 pid:27804] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-28 18:57:45,237 [tid:18556 pid:27804] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/auth/login +2026-04-28 18:57:45,238 [tid:18556 pid:27804] runner.py[line:117] INFO 请求数据:{'json': {'username': 'joytest', 'password': '123456'}} +2026-04-28 18:57:45,239 [tid:18556 pid:27804] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-28 18:58:55,186 [tid:16188 pid:8340] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-28 18:58:55,549 [tid:16188 pid:8340] Dlizhan_interface.py[line:272] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-28 18:58:55,551 [tid:16188 pid:8340] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = NULL WHERE username = %s|('joytest',) +2026-04-28 18:58:55,557 [tid:16188 pid:8340] pgsqlhelper.py[line:72] ERROR +PostgreSQL连接失败! +连接配置信息: + 主机(Host): 39.170.26.156 + 端口(Port): 8566 + 数据库名(Database): smart_management_st + 用户名(User): sm_test_user + 密码(Password): *********** (已隐藏) + 选择数据库(ChooseDB): joyhub +错误详情: No option 'db_joyhub_host' in section: 'PostgreSQL' + +2026-04-28 18:58:55,558 [tid:16188 pid:8340] Dlizhan_interface.py[line:45] ERROR 清除用户 fingerprint 失败: ("PostgreSQL连接失败: No option 'db_joyhub_host' in section: 'PostgreSQL'",) +2026-04-28 18:58:55,558 [tid:16188 pid:8340] Dlizhan_interface.py[line:278] ERROR 指纹清除失败,停止重试 +2026-04-28 18:59:48,367 [tid:5920 pid:10444] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-28 18:59:48,696 [tid:5920 pid:10444] Dlizhan_interface.py[line:272] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-28 18:59:48,699 [tid:5920 pid:10444] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = NULL WHERE username = %s|('joytest',) +2026-04-28 18:59:48,707 [tid:5920 pid:10444] pgsqlhelper.py[line:72] ERROR +PostgreSQL连接失败! +连接配置信息: + 主机(Host): 39.170.26.156 + 端口(Port): 8566 + 数据库名(Database): smart_management_st + 用户名(User): sm_test_user + 密码(Password): *********** (已隐藏) + 选择数据库(ChooseDB): joyhub +错误详情: No option 'db_joyhub_name' in section: 'PostgreSQL' + +2026-04-28 18:59:48,708 [tid:5920 pid:10444] Dlizhan_interface.py[line:45] ERROR 清除用户 fingerprint 失败: ("PostgreSQL连接失败: No option 'db_joyhub_name' in section: 'PostgreSQL'",) +2026-04-28 18:59:48,710 [tid:5920 pid:10444] Dlizhan_interface.py[line:278] ERROR 指纹清除失败,停止重试 +2026-04-28 19:00:25,454 [tid:6276 pid:32208] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-28 19:00:25,847 [tid:6276 pid:32208] Dlizhan_interface.py[line:272] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-28 19:00:25,850 [tid:6276 pid:32208] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = NULL WHERE username = %s|('joytest',) +2026-04-28 19:00:25,857 [tid:6276 pid:32208] pgsqlhelper.py[line:72] ERROR +PostgreSQL连接失败! +连接配置信息: + 主机(Host): 39.170.26.156 + 端口(Port): 8566 + 数据库名(Database): smart_management_st + 用户名(User): sm_test_user + 密码(Password): *********** (已隐藏) + 选择数据库(ChooseDB): joyhub +错误详情: No option 'db_joyhub_min_cached' in section: 'PostgreSQL' + +2026-04-28 19:00:25,859 [tid:6276 pid:32208] Dlizhan_interface.py[line:45] ERROR 清除用户 fingerprint 失败: ("PostgreSQL连接失败: No option 'db_joyhub_min_cached' in section: 'PostgreSQL'",) +2026-04-28 19:00:25,860 [tid:6276 pid:32208] Dlizhan_interface.py[line:278] ERROR 指纹清除失败,停止重试 +2026-04-28 19:00:48,889 [tid:23088 pid:17456] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-28 19:00:49,252 [tid:23088 pid:17456] Dlizhan_interface.py[line:272] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-28 19:00:49,254 [tid:23088 pid:17456] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = NULL WHERE username = %s|('joytest',) +2026-04-28 19:00:49,667 [tid:23088 pid:17456] pgsqlhelper.py[line:90] ERROR PostgreSQL执行SQL失败: null value in column "fingerprint" of relation "system_users" violates not-null constraint +DETAIL: Failing row contains (203, joytest, $2a$04$K71WnMB82C7u1/rU6SDgHetikQBPiWb4IZcfKdenAyH3iz6FeARc., 哇啦啦的哇, , 114, [], , , 0, , 0, 125.70.227.220, 2026-04-28 14:42:53.635334, 145, 2026-03-25 12:01:06.223465, null, 2026-04-28 14:42:53.635539, 0, 126, null, null, 0). +, SQL: UPDATE system_users SET fingerprint = NULL WHERE username = %s +2026-04-28 19:00:49,668 [tid:23088 pid:17456] Dlizhan_interface.py[line:45] ERROR 清除用户 fingerprint 失败: ('数据库操作失败,SQL语句:UPDATE system_users SET fingerprint = NULL WHERE username = %s, 错误: null value in column "fingerprint" of relation "system_users" violates not-null constraint\nDETAIL: Failing row contains (203, joytest, $2a$04$K71WnMB82C7u1/rU6SDgHetikQBPiWb4IZcfKdenAyH3iz6FeARc., 哇啦啦的哇, , 114, [], , , 0, , 0, 125.70.227.220, 2026-04-28 14:42:53.635334, 145, 2026-03-25 12:01:06.223465, null, 2026-04-28 14:42:53.635539, 0, 126, null, null, 0).\n',) +2026-04-28 19:00:49,703 [tid:23088 pid:17456] Dlizhan_interface.py[line:278] ERROR 指纹清除失败,停止重试 +2026-04-28 19:01:15,464 [tid:25252 pid:24164] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-28 19:01:15,825 [tid:25252 pid:24164] Dlizhan_interface.py[line:272] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-28 19:01:15,827 [tid:25252 pid:24164] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-28 19:01:16,283 [tid:25252 pid:24164] pgsqlhelper.py[line:377] INFO 更新数据库条数:None +2026-04-28 19:01:16,284 [tid:25252 pid:24164] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: None +2026-04-28 19:01:16,285 [tid:25252 pid:24164] Dlizhan_interface.py[line:45] ERROR 清除用户 fingerprint 失败: '>' not supported between instances of 'NoneType' and 'int' +2026-04-28 19:01:16,286 [tid:25252 pid:24164] Dlizhan_interface.py[line:278] ERROR 指纹清除失败,停止重试 +2026-04-28 19:01:38,931 [tid:17468 pid:10940] Dlizhan_interface.py[line:258] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-28 19:01:39,297 [tid:17468 pid:10940] Dlizhan_interface.py[line:272] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-28 19:01:39,298 [tid:17468 pid:10940] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-28 19:01:39,761 [tid:17468 pid:10940] pgsqlhelper.py[line:377] INFO 更新数据库条数:None +2026-04-28 19:01:39,764 [tid:17468 pid:10940] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: None +2026-04-28 19:01:39,767 [tid:17468 pid:10940] Dlizhan_interface.py[line:278] ERROR 指纹清除失败,停止重试 +2026-04-28 19:02:07,618 [tid:7824 pid:1768] pgsqlhelper.py[line:110] INFO SQL语句:SELECT username, nickname, fingerprint FROM system_users WHERE username = %s|('joytest',) +2026-04-28 19:02:08,086 [tid:7824 pid:1768] pgsqlhelper.py[line:119] INFO 数据库查询结果:[RealDictRow({'username': 'joytest', 'nickname': '哇啦啦的哇', 'fingerprint': ''})] +2026-04-28 19:02:33,766 [tid:20120 pid:18032] pgsqlhelper.py[line:112] INFO SQL语句:SELECT username, nickname FROM system_users LIMIT 5 +2026-04-28 19:02:34,202 [tid:20120 pid:18032] pgsqlhelper.py[line:119] INFO 数据库查询结果:[RealDictRow({'username': 'yudao', 'nickname': '芋道'}), RealDictRow({'username': 'yuanma', 'nickname': '源码'}), RealDictRow({'username': 'test', 'nickname': '测试号'}), RealDictRow({'username': 'admin107', 'nickname': '芋艿'}), RealDictRow({'username': 'admin108', 'nickname': '芋艿'})] +2026-04-29 10:00:36,293 [tid:22152 pid:7972] pgsqlhelper.py[line:112] INFO SQL语句:SELECT id, username, nickname, status FROM system_users LIMIT 10 +2026-04-29 10:00:36,752 [tid:22152 pid:7972] pgsqlhelper.py[line:119] INFO 数据库查询结果:[RealDictRow({'id': 100, 'username': 'yudao', 'nickname': '芋道', 'status': 0}), RealDictRow({'id': 103, 'username': 'yuanma', 'nickname': '源码', 'status': 0}), RealDictRow({'id': 104, 'username': 'test', 'nickname': '测试号', 'status': 0}), RealDictRow({'id': 107, 'username': 'admin107', 'nickname': '芋艿', 'status': 0}), RealDictRow({'id': 108, 'username': 'admin108', 'nickname': '芋艿', 'status': 0}), RealDictRow({'id': 109, 'username': 'admin109', 'nickname': '芋艿', 'status': 0}), RealDictRow({'id': 110, 'username': 'admin110', 'nickname': '小王', 'status': 0}), RealDictRow({'id': 111, 'username': 'test', 'nickname': '测试用户', 'status': 0}), RealDictRow({'id': 112, 'username': 'newobject', 'nickname': '新对象', 'status': 0}), RealDictRow({'id': 113, 'username': 'aoteman', 'nickname': '芋道1', 'status': 0})] +2026-04-29 10:00:36,753 [tid:22152 pid:7972] pgsqlhelper.py[line:112] INFO SQL语句:SELECT COUNT(*) as total FROM system_users +2026-04-29 10:00:36,858 [tid:22152 pid:7972] pgsqlhelper.py[line:119] INFO 数据库查询结果:[RealDictRow({'total': 39})] +2026-04-29 10:02:30,264 [tid:13612 pid:24304] pgsqlhelper.py[line:112] INFO SQL语句:SELECT * FROM system_users LIMIT 5 +2026-04-29 10:02:30,716 [tid:13612 pid:24304] pgsqlhelper.py[line:119] INFO 数据库查询结果:[RealDictRow({'id': 100, 'username': 'yudao', 'password': '$2a$04$h.aaPKgO.odHepnk5PCsWeEwKdojFWdTItxGKfx1r0e1CSeBzsTJ6', 'nickname': '芋道', 'remark': '不要吓我', 'dept_id': 104, 'post_ids': '[1]', 'email': 'yudao@iocoder.cn', 'mobile': '15601691300', 'sex': 1, 'avatar': None, 'status': 0, 'login_ip': '0:0:0:0:0:0:0:1', 'login_date': datetime.datetime(2025, 4, 8, 9, 36, 40), 'creator': '', 'create_time': datetime.datetime(2021, 1, 7, 9, 7, 17), 'updater': None, 'update_time': datetime.datetime(2025, 4, 21, 14, 23, 8), 'deleted': 0, 'tenant_id': 1, 'mac': None, 'fingerprint': '', 'login_error_count': 0}), RealDictRow({'id': 103, 'username': 'yuanma', 'password': '$2a$04$fUBSmjKCPYAUmnMzOb6qE.eZCGPhHi1JmAKclODbfS/O7fHOl2bH6', 'nickname': '源码', 'remark': None, 'dept_id': 106, 'post_ids': None, 'email': 'yuanma@iocoder.cn', 'mobile': '15601701300', 'sex': 0, 'avatar': None, 'status': 0, 'login_ip': '0:0:0:0:0:0:0:1', 'login_date': datetime.datetime(2024, 8, 11, 17, 48, 12), 'creator': '', 'create_time': datetime.datetime(2021, 1, 13, 23, 50, 35), 'updater': None, 'update_time': datetime.datetime(2025, 4, 21, 14, 23, 8), 'deleted': 0, 'tenant_id': 1, 'mac': None, 'fingerprint': '', 'login_error_count': 0}), RealDictRow({'id': 104, 'username': 'test', 'password': '$2a$04$BrwaYn303hjA/6TnXqdGoOLhyHOAA0bVrAFu6.1dJKycqKUnIoRz2', 'nickname': '测试号', 'remark': None, 'dept_id': 107, 'post_ids': '[1,2]', 'email': '111@qq.com', 'mobile': '15601691200', 'sex': 1, 'avatar': None, 'status': 0, 'login_ip': '0:0:0:0:0:0:0:1', 'login_date': datetime.datetime(2025, 3, 28, 20, 1, 16), 'creator': '', 'create_time': datetime.datetime(2021, 1, 21, 2, 13, 53), 'updater': None, 'update_time': datetime.datetime(2025, 4, 21, 14, 23, 8), 'deleted': 0, 'tenant_id': 1, 'mac': None, 'fingerprint': '', 'login_error_count': 0}), RealDictRow({'id': 107, 'username': 'admin107', 'password': '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', 'nickname': '芋艿', 'remark': None, 'dept_id': None, 'post_ids': None, 'email': '', 'mobile': '15601691300', 'sex': 0, 'avatar': None, 'status': 0, 'login_ip': '', 'login_date': None, 'creator': '1', 'create_time': datetime.datetime(2022, 2, 20, 22, 59, 33), 'updater': '1', 'update_time': datetime.datetime(2025, 4, 21, 14, 23, 8), 'deleted': 0, 'tenant_id': 118, 'mac': None, 'fingerprint': '', 'login_error_count': 0}), RealDictRow({'id': 108, 'username': 'admin108', 'password': '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', 'nickname': '芋艿', 'remark': None, 'dept_id': None, 'post_ids': None, 'email': '', 'mobile': '15601691300', 'sex': 0, 'avatar': None, 'status': 0, 'login_ip': '', 'login_date': None, 'creator': '1', 'create_time': datetime.datetime(2022, 2, 20, 23, 0, 50), 'updater': '1', 'update_time': datetime.datetime(2025, 4, 21, 14, 23, 8), 'deleted': 0, 'tenant_id': 119, 'mac': None, 'fingerprint': '', 'login_error_count': 0})] +2026-04-29 10:03:14,254 [tid:24248 pid:23820] pgsqlhelper.py[line:110] INFO SQL语句:SELECT * FROM system_users WHERE username = %s|('joytest',) +2026-04-29 10:03:14,682 [tid:24248 pid:23820] pgsqlhelper.py[line:119] INFO 数据库查询结果:[RealDictRow({'id': 203, 'username': 'joytest', 'password': '$2a$04$K71WnMB82C7u1/rU6SDgHetikQBPiWb4IZcfKdenAyH3iz6FeARc.', 'nickname': '哇啦啦的哇', 'remark': '', 'dept_id': 114, 'post_ids': '[]', 'email': '', 'mobile': '', 'sex': 0, 'avatar': '', 'status': 0, 'login_ip': '125.70.227.220', 'login_date': datetime.datetime(2026, 4, 28, 14, 42, 53, 635334), 'creator': '145', 'create_time': datetime.datetime(2026, 3, 25, 12, 1, 6, 223465), 'updater': None, 'update_time': datetime.datetime(2026, 4, 28, 14, 42, 53, 635539), 'deleted': 0, 'tenant_id': 126, 'mac': None, 'fingerprint': '', 'login_error_count': 0})] +2026-04-29 10:13:39,108 [tid:11532 pid:21540] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:13:39,111 [tid:11532 pid:21540] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 10:13:39,112 [tid:11532 pid:21540] runner.py[line:116] INFO 请求地址:http://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login +2026-04-29 10:13:39,113 [tid:11532 pid:21540] runner.py[line:117] INFO 请求数据:{'json': {'username': 'joytest', 'password': '123456'}} +2026-04-29 10:13:39,113 [tid:11532 pid:21540] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 10:14:21,001 [tid:20152 pid:24496] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:14:21,159 [tid:20152 pid:24496] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:14:21,161 [tid:20152 pid:24496] pgsqlhelper.py[line:369] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:14:21,587 [tid:20152 pid:24496] pgsqlhelper.py[line:377] INFO 更新数据库条数:None +2026-04-29 10:14:21,590 [tid:20152 pid:24496] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: None +2026-04-29 10:14:21,592 [tid:20152 pid:24496] Dlizhan_interface.py[line:284] ERROR 指纹清除失败,停止重试 +2026-04-29 10:15:10,572 [tid:8240 pid:1836] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:15:10,727 [tid:8240 pid:1836] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:15:10,731 [tid:8240 pid:1836] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:15:11,190 [tid:8240 pid:1836] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:15:11,191 [tid:8240 pid:1836] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:15:11,192 [tid:8240 pid:1836] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:15:11,192 [tid:8240 pid:1836] Dlizhan_interface.py[line:257] INFO 登录尝试 2/3,输入参数: username=joytest, password=*** +2026-04-29 10:15:11,320 [tid:8240 pid:1836] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:15:11,322 [tid:8240 pid:1836] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:15:11,428 [tid:8240 pid:1836] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:15:11,430 [tid:8240 pid:1836] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:15:11,431 [tid:8240 pid:1836] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:15:11,433 [tid:8240 pid:1836] Dlizhan_interface.py[line:257] INFO 登录尝试 3/3,输入参数: username=joytest, password=*** +2026-04-29 10:15:11,568 [tid:8240 pid:1836] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:15:59,062 [tid:8116 pid:23452] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:15:59,207 [tid:8116 pid:23452] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:15:59,209 [tid:8116 pid:23452] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:15:59,662 [tid:8116 pid:23452] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:15:59,664 [tid:8116 pid:23452] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:15:59,666 [tid:8116 pid:23452] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:15:59,667 [tid:8116 pid:23452] Dlizhan_interface.py[line:257] INFO 登录尝试 2/3,输入参数: username=joytest, password=*** +2026-04-29 10:15:59,810 [tid:8116 pid:23452] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:15:59,812 [tid:8116 pid:23452] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:15:59,930 [tid:8116 pid:23452] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:15:59,931 [tid:8116 pid:23452] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:15:59,933 [tid:8116 pid:23452] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:15:59,934 [tid:8116 pid:23452] Dlizhan_interface.py[line:257] INFO 登录尝试 3/3,输入参数: username=joytest, password=*** +2026-04-29 10:16:00,074 [tid:8116 pid:23452] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:42:06,284 [tid:26184 pid:21088] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:42:06,487 [tid:26184 pid:21088] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:42:06,489 [tid:26184 pid:21088] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:42:06,974 [tid:26184 pid:21088] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:42:06,976 [tid:26184 pid:21088] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:42:06,978 [tid:26184 pid:21088] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:42:06,979 [tid:26184 pid:21088] Dlizhan_interface.py[line:257] INFO 登录尝试 2/3,输入参数: username=joytest, password=*** +2026-04-29 10:42:07,132 [tid:26184 pid:21088] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:42:07,134 [tid:26184 pid:21088] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:42:07,249 [tid:26184 pid:21088] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:42:07,252 [tid:26184 pid:21088] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:42:07,254 [tid:26184 pid:21088] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:42:07,255 [tid:26184 pid:21088] Dlizhan_interface.py[line:257] INFO 登录尝试 3/3,输入参数: username=joytest, password=*** +2026-04-29 10:42:07,401 [tid:26184 pid:21088] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:42:30,277 [tid:26496 pid:25788] Dlizhan_interface.py[line:257] INFO 登录尝试 1/1,输入参数: username=test, password=*** +2026-04-29 10:42:30,421 [tid:26496 pid:25788] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:42:30,424 [tid:26496 pid:25788] Dlizhan_interface.py[line:257] INFO 登录尝试 1/1,输入参数: username=yudao, password=*** +2026-04-29 10:42:30,570 [tid:26496 pid:25788] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:49:23,671 [tid:27480 pid:16772] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:49:23,854 [tid:27480 pid:16772] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:49:23,858 [tid:27480 pid:16772] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:49:24,288 [tid:27480 pid:16772] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:49:24,291 [tid:27480 pid:16772] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:49:24,292 [tid:27480 pid:16772] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:49:24,293 [tid:27480 pid:16772] Dlizhan_interface.py[line:257] INFO 登录尝试 2/3,输入参数: username=joytest, password=*** +2026-04-29 10:49:24,438 [tid:27480 pid:16772] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:49:24,440 [tid:27480 pid:16772] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:49:24,553 [tid:27480 pid:16772] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:49:24,555 [tid:27480 pid:16772] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:49:24,557 [tid:27480 pid:16772] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:49:24,559 [tid:27480 pid:16772] Dlizhan_interface.py[line:257] INFO 登录尝试 3/3,输入参数: username=joytest, password=*** +2026-04-29 10:49:24,727 [tid:27480 pid:16772] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:50:49,243 [tid:27432 pid:27112] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET password = crypt(%s, gen_salt('bf')) WHERE username = %s|('Zhou1599', 'joytest') +2026-04-29 10:50:49,666 [tid:27432 pid:27112] pgsqlhelper.py[line:92] ERROR PostgreSQL执行SQL失败: function gen_salt(unknown) does not exist +LINE 1: ...ATE system_users SET password = crypt('Zhou1599', gen_salt('... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +, SQL: UPDATE system_users SET password = crypt(%s, gen_salt('bf')) WHERE username = %s +2026-04-29 10:51:43,754 [tid:1656 pid:6380] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET password = %s WHERE username = %s|('$2b$12$TeUvxzyiudpNJpLm4AaWkuT66nXgp58kb.jphiZF0FzlNECxNWNF2', 'joytest') +2026-04-29 10:51:44,245 [tid:1656 pid:6380] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:51:44,249 [tid:1656 pid:6380] pgsqlhelper.py[line:112] INFO SQL语句:SELECT username, password FROM system_users WHERE username = %s|('joytest',) +2026-04-29 10:51:44,366 [tid:1656 pid:6380] pgsqlhelper.py[line:121] INFO 数据库查询结果:[RealDictRow({'username': 'joytest', 'password': '$2b$12$TeUvxzyiudpNJpLm4AaWkuT66nXgp58kb.jphiZF0FzlNECxNWNF2'})] +2026-04-29 10:52:01,352 [tid:24932 pid:24992] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:52:01,563 [tid:24932 pid:24992] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:52:01,567 [tid:24932 pid:24992] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:52:02,030 [tid:24932 pid:24992] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:52:02,032 [tid:24932 pid:24992] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:52:02,034 [tid:24932 pid:24992] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:52:02,036 [tid:24932 pid:24992] Dlizhan_interface.py[line:257] INFO 登录尝试 2/3,输入参数: username=joytest, password=*** +2026-04-29 10:52:02,174 [tid:24932 pid:24992] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:52:02,177 [tid:24932 pid:24992] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:52:02,287 [tid:24932 pid:24992] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:52:02,291 [tid:24932 pid:24992] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:52:02,293 [tid:24932 pid:24992] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:52:02,295 [tid:24932 pid:24992] Dlizhan_interface.py[line:257] INFO 登录尝试 3/3,输入参数: username=joytest, password=*** +2026-04-29 10:52:02,441 [tid:24932 pid:24992] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:52:28,964 [tid:11508 pid:25072] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET password = %s WHERE username = %s|('$2a$04$r0Uq5Kc7e3W7lfCKS/GmiugURtGLdhfBRIMEAmVVkAzBsq.Rm0VQ.', 'joytest') +2026-04-29 10:52:29,417 [tid:11508 pid:25072] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:52:29,420 [tid:11508 pid:25072] pgsqlhelper.py[line:112] INFO SQL语句:SELECT username, password FROM system_users WHERE username = %s|('joytest',) +2026-04-29 10:52:29,526 [tid:11508 pid:25072] pgsqlhelper.py[line:121] INFO 数据库查询结果:[RealDictRow({'username': 'joytest', 'password': '$2a$04$r0Uq5Kc7e3W7lfCKS/GmiugURtGLdhfBRIMEAmVVkAzBsq.Rm0VQ.'})] +2026-04-29 10:52:46,430 [tid:23700 pid:26196] Dlizhan_interface.py[line:257] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 10:52:46,597 [tid:23700 pid:26196] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:52:46,599 [tid:23700 pid:26196] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:52:47,044 [tid:23700 pid:26196] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:52:47,046 [tid:23700 pid:26196] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:52:47,051 [tid:23700 pid:26196] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:52:47,052 [tid:23700 pid:26196] Dlizhan_interface.py[line:257] INFO 登录尝试 2/3,输入参数: username=joytest, password=*** +2026-04-29 10:52:47,200 [tid:23700 pid:26196] Dlizhan_interface.py[line:278] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:52:47,202 [tid:23700 pid:26196] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:52:47,304 [tid:23700 pid:26196] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:52:47,306 [tid:23700 pid:26196] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:52:47,308 [tid:23700 pid:26196] Dlizhan_interface.py[line:281] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:52:47,309 [tid:23700 pid:26196] Dlizhan_interface.py[line:257] INFO 登录尝试 3/3,输入参数: username=joytest, password=*** +2026-04-29 10:52:47,471 [tid:23700 pid:26196] Dlizhan_interface.py[line:287] WARNING 登录失败,code: 401 +2026-04-29 10:54:05,912 [tid:24656 pid:3984] Dlizhan_interface.py[line:257] INFO 登录尝试 1/2,输入参数: username=joytest, password=*** +2026-04-29 10:54:06,075 [tid:24656 pid:3984] Dlizhan_interface.py[line:286] WARNING 登录失败(code=401),尝试清除用户 joytest 的 fingerprint 后重新登录 +2026-04-29 10:54:06,077 [tid:24656 pid:3984] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-29 10:54:06,491 [tid:24656 pid:3984] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-29 10:54:06,494 [tid:24656 pid:3984] Dlizhan_interface.py[line:42] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-29 10:54:06,495 [tid:24656 pid:3984] Dlizhan_interface.py[line:289] INFO 指纹清除成功,重新尝试登录... +2026-04-29 10:54:06,497 [tid:24656 pid:3984] Dlizhan_interface.py[line:257] INFO 登录尝试 2/2,输入参数: username=joytest, password=*** +2026-04-29 10:54:06,645 [tid:24656 pid:3984] Dlizhan_interface.py[line:295] WARNING 登录失败,code: 401 +2026-04-29 11:02:29,823 [tid:24532 pid:19028] Dlizhan_interface.py[line:260] INFO 登录尝试 1/2,使用Token登录: token=32b18972c3944d5883eb750104c17059 +2026-04-29 11:02:30,018 [tid:24532 pid:19028] Dlizhan_interface.py[line:300] WARNING 登录失败,code: 401 +2026-04-29 11:03:37,973 [tid:26480 pid:16064] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 11:03:37,977 [tid:26480 pid:16064] Dlizhan_interface.py[line:173] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 11:03:51,147 [tid:10648 pid:24988] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 11:03:51,151 [tid:10648 pid:24988] Dlizhan_interface.py[line:173] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 11:13:02,469 [tid:4052 pid:8020] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 11:13:02,663 [tid:4052 pid:8020] Dlizhan_interface.py[line:173] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 11:13:02,885 [tid:4052 pid:8020] Dlizhan_interface.py[line:251] INFO your input:{} +2026-04-29 11:13:02,886 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:02,888 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/simple-list +2026-04-29 11:13:02,890 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'params': {}} +2026-04-29 11:13:02,891 [tid:4052 pid:8020] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-04-29 11:13:03,531 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_4185', 'nickname': '测试用户3813', 'password': '123456', 'email': 'testuser_4185@test.com', 'mobile': '13800138005', 'sex': 1, 'remark': '测试用户'} +2026-04-29 11:13:03,532 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:03,533 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:03,534 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_4185', 'nickname': '测试用户3813', 'password': '123456', 'email': 'testuser_4185@test.com', 'mobile': '13800138005', 'sex': 1, 'remark': '测试用户'}} +2026-04-29 11:13:03,534 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:03,770 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_get_1340', 'nickname': '测试用户详情9362', 'password': '123456'} +2026-04-29 11:13:03,770 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:03,771 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:03,772 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_get_1340', 'nickname': '测试用户详情9362', 'password': '123456'}} +2026-04-29 11:13:03,772 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:03,926 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_update_6349', 'nickname': '测试用户更新4928', 'password': '123456'} +2026-04-29 11:13:03,927 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:03,927 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:03,928 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_update_6349', 'nickname': '测试用户更新4928', 'password': '123456'}} +2026-04-29 11:13:03,929 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:04,119 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_pwd_7313', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-29 11:13:04,121 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:04,122 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:04,122 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_pwd_7313', 'nickname': '测试密码用户', 'password': '123456'}} +2026-04-29 11:13:04,123 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:04,304 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_status_9081', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-29 11:13:04,305 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:04,306 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:04,307 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_status_9081', 'nickname': '测试状态用户', 'password': '123456'}} +2026-04-29 11:13:04,309 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:04,493 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_delete_3123', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-29 11:13:04,494 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:04,494 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:04,495 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_delete_3123', 'nickname': '测试删除用户', 'password': '123456'}} +2026-04-29 11:13:04,495 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:04,676 [tid:4052 pid:8020] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_batch_2728_0', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-29 11:13:04,677 [tid:4052 pid:8020] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:04,678 [tid:4052 pid:8020] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:04,679 [tid:4052 pid:8020] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_batch_2728_0', 'nickname': '测试批量删除用户0', 'password': '123456'}} +2026-04-29 11:13:04,680 [tid:4052 pid:8020] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:13,938 [tid:27088 pid:27520] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 11:13:14,027 [tid:27088 pid:27520] Dlizhan_interface.py[line:173] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 11:13:14,185 [tid:27088 pid:27520] Dlizhan_interface.py[line:251] INFO your input:{} +2026-04-29 11:13:14,186 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:14,187 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/simple-list +2026-04-29 11:13:14,188 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'params': {}} +2026-04-29 11:13:14,189 [tid:27088 pid:27520] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-04-29 11:13:14,503 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_2251', 'nickname': '测试用户3493', 'password': '123456', 'email': 'testuser_2251@test.com', 'mobile': '13800138000', 'sex': 1, 'remark': '测试用户'} +2026-04-29 11:13:14,504 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:14,504 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:14,504 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_2251', 'nickname': '测试用户3493', 'password': '123456', 'email': 'testuser_2251@test.com', 'mobile': '13800138000', 'sex': 1, 'remark': '测试用户'}} +2026-04-29 11:13:14,505 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:14,688 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_get_8489', 'nickname': '测试用户详情8284', 'password': '123456'} +2026-04-29 11:13:14,689 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:14,690 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:14,691 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_get_8489', 'nickname': '测试用户详情8284', 'password': '123456'}} +2026-04-29 11:13:14,692 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:14,874 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_update_9800', 'nickname': '测试用户更新3102', 'password': '123456'} +2026-04-29 11:13:14,874 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:14,875 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:14,875 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_update_9800', 'nickname': '测试用户更新3102', 'password': '123456'}} +2026-04-29 11:13:14,875 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:15,026 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_pwd_7682', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-29 11:13:15,027 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:15,027 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:15,028 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_pwd_7682', 'nickname': '测试密码用户', 'password': '123456'}} +2026-04-29 11:13:15,028 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:15,180 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_status_7200', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-29 11:13:15,180 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:15,181 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:15,181 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_status_7200', 'nickname': '测试状态用户', 'password': '123456'}} +2026-04-29 11:13:15,182 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:15,357 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_delete_3318', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-29 11:13:15,358 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:15,358 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:15,358 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_delete_3318', 'nickname': '测试删除用户', 'password': '123456'}} +2026-04-29 11:13:15,359 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:13:15,514 [tid:27088 pid:27520] Dlizhan_interface.py[line:108] INFO your input:{'username': 'testuser_batch_3884_0', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-29 11:13:15,515 [tid:27088 pid:27520] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:jwadmin +2026-04-29 11:13:15,515 [tid:27088 pid:27520] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/admin-api/system/user/create +2026-04-29 11:13:15,516 [tid:27088 pid:27520] runner.py[line:117] INFO 请求数据:{'json': {'username': 'testuser_batch_3884_0', 'nickname': '测试批量删除用户0', 'password': '123456'}} +2026-04-29 11:13:15,516 [tid:27088 pid:27520] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-29 11:16:22,929 [tid:27740 pid:27736] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 11:16:23,180 [tid:27740 pid:27736] Dlizhan_interface.py[line:223] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 11:16:23,397 [tid:27740 pid:27736] Dlizhan_interface.py[line:330] INFO your input:{} +2026-04-29 11:16:23,577 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_5886', 'nickname': '测试用户3444', 'password': '123456', 'email': 'testuser_5886@test.com', 'mobile': '13800138004', 'sex': 1, 'remark': '测试用户'} +2026-04-29 11:16:24,198 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_get_7122', 'nickname': '测试用户详情3254', 'password': '123456'} +2026-04-29 11:16:24,377 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_update_6142', 'nickname': '测试用户更新6172', 'password': '123456'} +2026-04-29 11:16:24,565 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_pwd_7762', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-29 11:16:24,756 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_status_7749', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-29 11:16:24,938 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_delete_3048', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-29 11:16:25,109 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_batch_5667_0', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-29 11:16:25,247 [tid:27740 pid:27736] Dlizhan_interface.py[line:123] INFO your input:{'username': 'testuser_batch_9858_1', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-29 11:16:25,397 [tid:27740 pid:27736] Dlizhan_interface.py[line:167] INFO your input:{'ids': [None, None]} +2026-04-29 14:24:16,145 [tid:13612 pid:26176] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:24:16,297 [tid:13612 pid:26176] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_2922', 'nickname': '测试用户8235', 'password': '123456', 'email': 'testuser_2922@test.com', 'mobile': '13800138003', 'sex': 1, 'remark': '测试用户'} +2026-04-29 14:25:30,690 [tid:4996 pid:17352] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:25:30,831 [tid:4996 pid:17352] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_7268', 'nickname': '测试用户2974', 'password': '123456', 'email': 'testuser_7268@test.com', 'mobile': '13800138009', 'sex': 1, 'remark': '测试用户'} +2026-04-29 14:26:07,662 [tid:29820 pid:23764] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:26:07,806 [tid:29820 pid:23764] Dlizhan_interface.py[line:207] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:27:17,498 [tid:30048 pid:28616] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:27:17,502 [tid:30048 pid:28616] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:27:17,642 [tid:30048 pid:28616] Dlizhan_interface.py[line:207] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:27:48,692 [tid:3084 pid:29972] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:27:48,696 [tid:3084 pid:29972] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: 32b18972c3944d5883eb750104c17059 +2026-04-29 14:27:48,697 [tid:3084 pid:29972] Dlizhan_interface.py[line:207] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:29:12,894 [tid:4504 pid:18540] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 14:29:12,897 [tid:4504 pid:18540] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:29:12,898 [tid:4504 pid:18540] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:29:12,899 [tid:4504 pid:18540] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:29:12,900 [tid:4504 pid:18540] Dlizhan_interface.py[line:207] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:29:30,274 [tid:24428 pid:25388] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 14:29:30,278 [tid:24428 pid:25388] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:29:30,278 [tid:24428 pid:25388] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:29:30,279 [tid:24428 pid:25388] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:29:30,435 [tid:24428 pid:25388] Dlizhan_interface.py[line:207] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:29:30,655 [tid:24428 pid:25388] Dlizhan_interface.py[line:314] INFO your input:{} +2026-04-29 14:29:30,831 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_7150', 'nickname': '测试用户8590', 'password': '123456', 'email': 'testuser_7150@test.com', 'mobile': '13800138007', 'sex': 1, 'remark': '测试用户'} +2026-04-29 14:29:31,600 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_get_2797', 'nickname': '测试用户详情3081', 'password': '123456'} +2026-04-29 14:29:31,762 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_update_2506', 'nickname': '测试用户更新4835', 'password': '123456'} +2026-04-29 14:29:31,925 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_pwd_3882', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-29 14:29:32,088 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_status_9429', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-29 14:29:32,250 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_delete_3725', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-29 14:29:32,415 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_batch_3064_0', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-29 14:29:32,562 [tid:24428 pid:25388] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_batch_2227_1', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-29 14:29:32,701 [tid:24428 pid:25388] Dlizhan_interface.py[line:151] INFO your input:{'ids': [None, None]} +2026-04-29 14:32:09,513 [tid:4520 pid:30088] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 14:32:09,517 [tid:4520 pid:30088] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:32:09,517 [tid:4520 pid:30088] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:32:09,518 [tid:4520 pid:30088] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:32:09,662 [tid:4520 pid:30088] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser_1414', 'nickname': '测试用户2134', 'password': '123456', 'email': 'testuser_1414@test.com', 'mobile': '13800138004', 'sex': 1, 'remark': '测试用户'} +2026-04-29 14:33:09,711 [tid:28964 pid:9624] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 14:33:09,716 [tid:28964 pid:9624] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:33:09,717 [tid:28964 pid:9624] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:33:09,718 [tid:28964 pid:9624] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:33:09,904 [tid:28964 pid:9624] Dlizhan_interface.py[line:207] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:33:10,071 [tid:28964 pid:9624] Dlizhan_interface.py[line:314] INFO your input:{} +2026-04-29 14:33:10,236 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser5512', 'nickname': '测试用户4380', 'password': '123456', 'email': 'testuser5512@test.com', 'mobile': '13800138001', 'sex': 1, 'remark': '测试用户'} +2026-04-29 14:33:10,435 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget5102', 'nickname': '测试用户详情9571', 'password': '123456'} +2026-04-29 14:33:10,586 [tid:28964 pid:9624] Dlizhan_interface.py[line:176] INFO your input:{'id': 217} +2026-04-29 14:33:10,742 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate9634', 'nickname': '测试用户更新6521', 'password': '123456'} +2026-04-29 14:33:10,902 [tid:28964 pid:9624] Dlizhan_interface.py[line:239] INFO your input:{'id': 218, 'username': 'testuserupdate9634', 'nickname': '修改后的昵称6578', 'remark': '修改后的备注'} +2026-04-29 14:33:11,095 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd7802', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-29 14:33:11,236 [tid:28964 pid:9624] Dlizhan_interface.py[line:265] INFO your input:{'id': 219, 'password': '654321'} +2026-04-29 14:33:11,419 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus5383', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-29 14:33:11,559 [tid:28964 pid:9624] Dlizhan_interface.py[line:291] INFO your input:{'id': 220, 'status': 0} +2026-04-29 14:33:11,712 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete8957', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-29 14:33:11,848 [tid:28964 pid:9624] Dlizhan_interface.py[line:129] INFO your input:{'id': 221} +2026-04-29 14:33:12,353 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch7200_0', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-29 14:33:12,487 [tid:28964 pid:9624] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch1213_1', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-29 14:33:12,613 [tid:28964 pid:9624] Dlizhan_interface.py[line:151] INFO your input:{'ids': [None, None]} +2026-04-29 14:34:40,174 [tid:28328 pid:27712] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 14:34:40,178 [tid:28328 pid:27712] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:34:40,179 [tid:28328 pid:27712] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:34:40,179 [tid:28328 pid:27712] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 14:34:40,353 [tid:28328 pid:27712] Dlizhan_interface.py[line:206] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-29 14:34:40,587 [tid:28328 pid:27712] Dlizhan_interface.py[line:313] INFO your input:{} +2026-04-29 14:34:40,758 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser5051', 'nickname': '测试用户2017', 'password': '123456', 'email': 'testuser5051@test.com', 'mobile': '13800138005', 'sex': 1, 'remark': '测试用户'} +2026-04-29 14:34:40,919 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget2439', 'nickname': '测试用户详情5085', 'password': '123456'} +2026-04-29 14:34:41,058 [tid:28328 pid:27712] Dlizhan_interface.py[line:175] INFO your input:{'id': 223} +2026-04-29 14:34:41,211 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate4071', 'nickname': '测试用户更新8225', 'password': '123456'} +2026-04-29 14:34:41,347 [tid:28328 pid:27712] Dlizhan_interface.py[line:238] INFO your input:{'id': 224, 'username': 'testuserupdate4071', 'nickname': '修改后的昵称6949', 'remark': '修改后的备注'} +2026-04-29 14:34:41,488 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd3364', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-29 14:34:41,639 [tid:28328 pid:27712] Dlizhan_interface.py[line:264] INFO your input:{'id': 225, 'password': '654321'} +2026-04-29 14:34:41,795 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus2639', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-29 14:34:41,944 [tid:28328 pid:27712] Dlizhan_interface.py[line:290] INFO your input:{'id': 226, 'status': 0} +2026-04-29 14:34:42,093 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete2666', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-29 14:34:42,237 [tid:28328 pid:27712] Dlizhan_interface.py[line:129] INFO your input:{'id': 227} +2026-04-29 14:34:42,417 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch58440', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-29 14:34:42,567 [tid:28328 pid:27712] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch78461', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-29 14:34:42,708 [tid:28328 pid:27712] Dlizhan_interface.py[line:152] INFO your input:{'ids': [228, 229]} +2026-04-29 15:59:31,575 [tid:15856 pid:20324] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 15:59:31,579 [tid:15856 pid:20324] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 15:59:31,580 [tid:15856 pid:20324] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 15:59:31,581 [tid:15856 pid:20324] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 15:59:31,582 [tid:15856 pid:20324] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 15:59:31,769 [tid:15856 pid:20324] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 15:59:33,774 [tid:15856 pid:20324] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 15:59:33,910 [tid:15856 pid:20324] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 15:59:35,914 [tid:15856 pid:20324] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 15:59:36,040 [tid:15856 pid:20324] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 15:59:54,191 [tid:16516 pid:7760] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 15:59:54,195 [tid:16516 pid:7760] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 15:59:54,196 [tid:16516 pid:7760] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 15:59:54,197 [tid:16516 pid:7760] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 15:59:54,198 [tid:16516 pid:7760] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 15:59:54,329 [tid:16516 pid:7760] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 15:59:56,332 [tid:16516 pid:7760] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 15:59:56,465 [tid:16516 pid:7760] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 15:59:58,469 [tid:16516 pid:7760] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 15:59:58,598 [tid:16516 pid:7760] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:00:37,791 [tid:1384 pid:18332] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:00:37,795 [tid:1384 pid:18332] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:00:37,796 [tid:1384 pid:18332] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:00:37,797 [tid:1384 pid:18332] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:00:37,798 [tid:1384 pid:18332] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:00:37,945 [tid:1384 pid:18332] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:00:39,951 [tid:1384 pid:18332] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:00:40,095 [tid:1384 pid:18332] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:00:42,100 [tid:1384 pid:18332] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:00:42,241 [tid:1384 pid:18332] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:32:46,294 [tid:17588 pid:15588] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:32:46,301 [tid:17588 pid:15588] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:32:46,302 [tid:17588 pid:15588] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:32:46,303 [tid:17588 pid:15588] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:32:46,303 [tid:17588 pid:15588] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:32:46,305 [tid:17588 pid:15588] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_username = joytest +2026-04-29 16:32:46,305 [tid:17588 pid:15588] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:32:46,307 [tid:17588 pid:15588] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_password = Zhou1599 +2026-04-29 16:32:46,329 [tid:17588 pid:15588] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:32:46,549 [tid:17588 pid:15588] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:32:48,554 [tid:17588 pid:15588] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:32:48,702 [tid:17588 pid:15588] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:32:50,705 [tid:17588 pid:15588] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:32:50,851 [tid:17588 pid:15588] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:33:10,844 [tid:16944 pid:29032] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:33:10,849 [tid:16944 pid:29032] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:33:10,850 [tid:16944 pid:29032] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:33:10,856 [tid:16944 pid:29032] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: dd46e23fb5f7433fa9ba8cca11a37b48 +2026-04-29 16:33:10,857 [tid:16944 pid:29032] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:33:10,859 [tid:16944 pid:29032] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_username = joytest +2026-04-29 16:33:10,860 [tid:16944 pid:29032] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 16:33:10,864 [tid:16944 pid:29032] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_password = Zhou1599 +2026-04-29 16:33:10,866 [tid:16944 pid:29032] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:33:11,008 [tid:16944 pid:29032] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:33:13,011 [tid:16944 pid:29032] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:33:13,197 [tid:16944 pid:29032] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 16:33:15,205 [tid:16944 pid:29032] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 16:33:15,382 [tid:16944 pid:29032] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 17:54:02,030 [tid:24448 pid:27744] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 17:54:02,047 [tid:24448 pid:27744] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-29 17:54:02,049 [tid:24448 pid:27744] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-29 17:54:02,050 [tid:24448 pid:27744] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-29 17:54:02,051 [tid:24448 pid:27744] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 17:54:02,052 [tid:24448 pid:27744] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_username = joytest +2026-04-29 17:54:02,053 [tid:24448 pid:27744] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-29 17:54:02,054 [tid:24448 pid:27744] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_password = Zhou1599 +2026-04-29 17:54:02,055 [tid:24448 pid:27744] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 17:54:02,335 [tid:24448 pid:27744] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 17:54:04,338 [tid:24448 pid:27744] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 17:54:04,476 [tid:24448 pid:27744] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 17:54:06,478 [tid:24448 pid:27744] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-29 17:54:06,636 [tid:24448 pid:27744] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-29 18:31:01,829 [tid:20868 pid:15240] Dlizhan_interface.py[line:67] INFO your input:{} +2026-04-29 18:31:01,835 [tid:20868 pid:15240] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:purchase +2026-04-29 18:31:01,835 [tid:20868 pid:15240] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/erp/purchase-workbench/get-todo +2026-04-29 18:31:01,836 [tid:20868 pid:15240] runner.py[line:117] INFO 请求数据:{} +2026-04-29 18:31:01,836 [tid:20868 pid:15240] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-04-29 18:31:02,060 [tid:20868 pid:15240] runner.py[line:183] INFO 请求头headers:{'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'ba9417584d764b6e9f28c9671e8bda60', 'tenant-id': '1', 'ssotoken': 'ba9417584d764b6e9f28c9671e8bda60', 'sso-token': 'ba9417584d764b6e9f28c9671e8bda60', 'Accesstoken': 'ba9417584d764b6e9f28c9671e8bda60', 'access-token': 'ba9417584d764b6e9f28c9671e8bda60', 'token': 'ba9417584d764b6e9f28c9671e8bda60'} +2026-04-29 18:31:02,255 [tid:20868 pid:15240] runner.py[line:202] INFO ------状态码:200, 返回信息:{'code': 1002004008, 'msg': '登录状态已失效,请刷新', 'data': None} +2026-04-29 18:31:02,257 [tid:20868 pid:15240] runner.py[line:235] INFO 返回数据:{'code': 1002004008, 'msg': '登录状态已失效,请刷新', 'data': None} +2026-04-30 09:48:52,443 [tid:4492 pid:9032] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:48:52,657 [tid:4492 pid:9032] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:54:50,142 [tid:24900 pid:25064] Dlizhan_interface.py[line:351] INFO 登录尝试 1/4,输入参数: username=joytest, password=*** +2026-04-30 09:54:50,266 [tid:24900 pid:25064] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:55:17,115 [tid:13496 pid:25152] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:55:17,625 [tid:13496 pid:25152] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:55:17,628 [tid:13496 pid:25152] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:15,623 [tid:7808 pid:20840] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 09:59:15,627 [tid:7808 pid:20840] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 09:59:15,627 [tid:7808 pid:20840] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 09:59:15,628 [tid:7808 pid:20840] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 09:59:15,778 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:16,235 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:16,238 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:16,240 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:16,426 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:18,442 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:18,576 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:20,578 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:20,705 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:21,070 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:21,179 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:21,182 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:21,184 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:21,339 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:23,341 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:23,477 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:25,479 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:25,605 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:25,631 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:25,747 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:25,749 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:25,750 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:25,873 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:27,877 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:28,014 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:30,018 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:30,153 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:30,171 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:30,280 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:30,281 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:30,281 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:30,412 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:32,415 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:32,554 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:34,558 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:34,688 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:34,706 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:34,821 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:34,823 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:34,825 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:34,960 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:36,964 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:37,088 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:38,650 [tid:3984 pid:8552] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 09:59:38,654 [tid:3984 pid:8552] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 09:59:38,655 [tid:3984 pid:8552] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 09:59:38,656 [tid:3984 pid:8552] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 09:59:38,811 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:39,090 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:39,240 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:39,255 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:39,278 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:39,281 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:39,283 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:39,361 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:39,364 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:39,366 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:39,449 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:39,509 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:41,454 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:41,511 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:41,585 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:41,647 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:43,588 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:43,651 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:43,712 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:43,770 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:43,781 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:43,894 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:43,896 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:43,897 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:44,029 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:44,121 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:44,228 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:44,231 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:44,232 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:44,367 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:46,031 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:46,181 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:46,372 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:46,501 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:48,183 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:48,299 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:48,308 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:48,413 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:48,415 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:48,417 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:48,505 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:48,548 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:48,624 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:48,638 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:48,750 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:48,751 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:48,752 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:48,877 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:50,551 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:50,675 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:50,882 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:51,006 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:52,680 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:52,802 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:52,814 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:52,927 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:52,928 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:52,929 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:53,008 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:53,052 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:53,135 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:53,154 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:53,260 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:53,263 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:53,264 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:53,393 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:55,053 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:55,194 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:55,398 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:55,518 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:57,197 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:57,353 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:57,374 [tid:7808 pid:20840] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:57,482 [tid:7808 pid:20840] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:57,484 [tid:7808 pid:20840] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:57,486 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:57,520 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:57,608 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:57,653 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:57,671 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 09:59:57,784 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 09:59:57,786 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 09:59:57,787 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:57,930 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:59,611 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 09:59:59,738 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 09:59:59,935 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:00,062 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:01,743 [tid:7808 pid:20840] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:01,859 [tid:7808 pid:20840] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:02,066 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:02,195 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:02,210 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:00:02,313 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:00:02,315 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:00:02,316 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:02,453 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:04,458 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:04,602 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:06,608 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:06,744 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:06,799 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:00:06,911 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:00:06,913 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:00:06,914 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:07,045 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:07,954 [tid:6128 pid:27844] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:00:07,959 [tid:6128 pid:27844] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:00:07,960 [tid:6128 pid:27844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:00:07,962 [tid:6128 pid:27844] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:00:08,131 [tid:6128 pid:27844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:00:08,576 [tid:6128 pid:27844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:00:08,577 [tid:6128 pid:27844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:00:08,578 [tid:6128 pid:27844] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:08,727 [tid:6128 pid:27844] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:09,048 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:09,202 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:10,730 [tid:6128 pid:27844] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:10,874 [tid:6128 pid:27844] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:11,206 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:11,330 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:11,370 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:00:11,476 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:00:11,479 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:00:11,480 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:11,620 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:12,877 [tid:6128 pid:27844] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:13,020 [tid:6128 pid:27844] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:13,622 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:13,743 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:15,747 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:15,865 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:15,881 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:00:15,993 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:00:15,993 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:00:15,994 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:16,104 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:18,106 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:18,246 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:20,250 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:20,380 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:20,401 [tid:3984 pid:8552] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:00:20,504 [tid:3984 pid:8552] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:00:20,505 [tid:3984 pid:8552] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:00:20,506 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:20,631 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:22,634 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:22,770 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:00:24,772 [tid:3984 pid:8552] Dlizhan_interface.py[line:351] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 10:00:24,911 [tid:3984 pid:8552] Dlizhan_interface.py[line:389] WARNING 登录失败,code: 500 +2026-04-30 10:01:24,948 [tid:16336 pid:24556] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:01:24,951 [tid:16336 pid:24556] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:01:24,952 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:01:24,952 [tid:16336 pid:24556] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:01:25,094 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:25,542 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:25,543 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:25,704 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 9c3df0cd4d774fb0a9d317c6327da2ba +2026-04-30 10:01:25,869 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 0c6892283d3c4467979babea26b83f38 +2026-04-30 10:01:25,880 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:25,997 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:25,999 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:26,151 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 439ea9fc1d5247d0815e162f0c2e22b9 +2026-04-30 10:01:26,153 [tid:16336 pid:24556] Dlizhan_interface.py[line:206] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:01:26,317 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:26,430 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:26,431 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:26,566 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b390f44e88fa46bda220b2893b63517e +2026-04-30 10:01:26,567 [tid:16336 pid:24556] Dlizhan_interface.py[line:313] INFO your input:{} +2026-04-30 10:01:26,724 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:26,835 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:26,836 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:26,994 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 08b5b4a58d7e4345a7c2899aa06b8fdb +2026-04-30 10:01:26,998 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser2033', 'nickname': '测试用户5080', 'password': '123456', 'email': 'testuser2033@test.com', 'mobile': '13800138000', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:01:27,165 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:27,278 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:27,279 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:27,436 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 618e797473b444e79610194a080696c5 +2026-04-30 10:01:27,438 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget4628', 'nickname': '测试用户详情2406', 'password': '123456'} +2026-04-30 10:01:27,577 [tid:16336 pid:24556] Dlizhan_interface.py[line:175] INFO your input:{'id': 231} +2026-04-30 10:01:27,704 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:27,815 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:27,817 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:27,952 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: dcf2e3a989894797932f50e247bb8399 +2026-04-30 10:01:27,954 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate1835', 'nickname': '测试用户更新5494', 'password': '123456'} +2026-04-30 10:01:28,087 [tid:16336 pid:24556] Dlizhan_interface.py[line:238] INFO your input:{'id': 232, 'username': 'testuserupdate1835', 'nickname': '修改后的昵称3936', 'remark': '修改后的备注'} +2026-04-30 10:01:28,239 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:28,351 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:28,352 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:28,513 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 65806c2237254b2fa4d2aee625d6d03e +2026-04-30 10:01:28,515 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd3048', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:01:28,647 [tid:16336 pid:24556] Dlizhan_interface.py[line:264] INFO your input:{'id': 233, 'password': '654321'} +2026-04-30 10:01:29,088 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:29,203 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:29,204 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:29,369 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b1c134434b734dd2b42eecf886f38d82 +2026-04-30 10:01:29,370 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus5094', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:01:29,500 [tid:16336 pid:24556] Dlizhan_interface.py[line:290] INFO your input:{'id': 234, 'status': 0} +2026-04-30 10:01:29,641 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:29,753 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:29,754 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:29,897 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 839ac2580f3742af86fd57c8a8a7bfc0 +2026-04-30 10:01:29,899 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete4507', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:01:30,034 [tid:16336 pid:24556] Dlizhan_interface.py[line:129] INFO your input:{'id': 235} +2026-04-30 10:01:30,187 [tid:16336 pid:24556] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:01:30,299 [tid:16336 pid:24556] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:01:30,300 [tid:16336 pid:24556] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:01:30,457 [tid:16336 pid:24556] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 9a98180e957e44628c24a8814ba5d3de +2026-04-30 10:01:30,460 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch69390', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:01:30,599 [tid:16336 pid:24556] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch77521', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:01:30,762 [tid:16336 pid:24556] Dlizhan_interface.py[line:152] INFO your input:{'ids': [236, 237]} +2026-04-30 10:06:39,601 [tid:2044 pid:2940] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:06:39,606 [tid:2044 pid:2940] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:06:39,607 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:06:39,607 [tid:2044 pid:2940] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:06:39,749 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:40,192 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:40,194 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:40,388 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: f573b2253f6a44d096f4ff628e37a852 +2026-04-30 10:06:40,555 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 81a5daa94aab4d7dbde460add2c31cf0 +2026-04-30 10:06:40,573 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:40,682 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:40,685 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:40,878 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 11db090a9c5e4070a35dff3b44310407 +2026-04-30 10:06:40,882 [tid:2044 pid:2940] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:06:41,043 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:41,150 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:41,153 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:41,308 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: eca390cc27304942bcb819005dcaf41d +2026-04-30 10:06:41,316 [tid:2044 pid:2940] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 10:06:41,497 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:41,602 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:41,606 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:41,772 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 45bfb7162e7f4ce39824109baadc7af7 +2026-04-30 10:06:41,778 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser1904', 'nickname': '测试用户2977', 'password': '123456', 'email': 'testuser1904@test.com', 'mobile': '13800138005', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:06:42,305 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:42,411 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:42,414 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:42,591 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: e9f7bd3e43ec4cadb1baa3db7523fd8f +2026-04-30 10:06:42,595 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget7820', 'nickname': '测试用户详情4086', 'password': '123456'} +2026-04-30 10:06:42,735 [tid:2044 pid:2940] Dlizhan_interface.py[line:175] INFO your input:{'id': 238} +2026-04-30 10:06:42,895 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:43,000 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:43,003 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:43,155 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: c566849019ea4f8d8a5b0088816c0e31 +2026-04-30 10:06:43,158 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate4294', 'nickname': '测试用户更新9795', 'password': '123456'} +2026-04-30 10:06:43,292 [tid:2044 pid:2940] Dlizhan_interface.py[line:236] INFO your input:{'id': 239, 'username': 'testuserupdate4294', 'nickname': '修改后的昵称2966', 'remark': '修改后的备注'} +2026-04-30 10:06:43,450 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:43,557 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:43,559 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:43,733 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: bee6801e01d043cc82a492b5c42cee69 +2026-04-30 10:06:43,739 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd4092', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:06:43,871 [tid:2044 pid:2940] Dlizhan_interface.py[line:260] INFO your input:{'id': 240, 'password': '654321'} +2026-04-30 10:06:44,014 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:44,121 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:44,123 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:44,279 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b998e481cc7646b884e0397eeebd926c +2026-04-30 10:06:44,281 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus4535', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:06:44,413 [tid:2044 pid:2940] Dlizhan_interface.py[line:284] INFO your input:{'id': 241, 'status': 0} +2026-04-30 10:06:44,559 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:44,668 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:44,671 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:44,810 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 77ee6304b0954f868bb5406b39013240 +2026-04-30 10:06:44,815 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete2191', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:06:44,955 [tid:2044 pid:2940] Dlizhan_interface.py[line:129] INFO your input:{'id': 242} +2026-04-30 10:06:45,109 [tid:2044 pid:2940] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:06:45,216 [tid:2044 pid:2940] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:06:45,217 [tid:2044 pid:2940] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:06:45,345 [tid:2044 pid:2940] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 14260e664732431ba2fc9b0dacf5b4ed +2026-04-30 10:06:45,351 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch23770', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:06:45,490 [tid:2044 pid:2940] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch36031', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:06:45,660 [tid:2044 pid:2940] Dlizhan_interface.py[line:152] INFO your input:{'ids': [243, 244]} +2026-04-30 10:08:45,168 [tid:21036 pid:9508] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:08:45,172 [tid:21036 pid:9508] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:08:45,172 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:08:45,173 [tid:21036 pid:9508] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:08:45,356 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:45,794 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:45,797 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:45,974 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: cc3a1cadacf2407e89c50269f7e50581 +2026-04-30 10:08:46,157 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 8e143c1c973d462c9529c2d4e105fd15 +2026-04-30 10:08:46,171 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:46,285 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:46,288 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:46,462 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: c3b6bf8e660b4415b3df03d32d0a8921 +2026-04-30 10:08:46,465 [tid:21036 pid:9508] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:08:46,622 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:46,734 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:46,738 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:46,908 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: ccfaa176ae684c699edfd2917c5af0a4 +2026-04-30 10:08:46,913 [tid:21036 pid:9508] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 10:08:47,137 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:47,252 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:47,256 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:47,456 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 8ed4b17750d14eb08ef021789bcbec65 +2026-04-30 10:08:47,463 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser721282', 'nickname': '测试用户5113', 'password': '123456', 'email': 'testuser721282@test.com', 'mobile': '13822182120', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:08:47,720 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:47,835 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:47,837 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:48,002 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 85d1ee4b55e749a6a83edfcf3f22bda9 +2026-04-30 10:08:48,006 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget936942', 'nickname': '测试用户详情9172', 'password': '123456'} +2026-04-30 10:08:48,189 [tid:21036 pid:9508] Dlizhan_interface.py[line:175] INFO your input:{'id': 246} +2026-04-30 10:08:48,385 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:48,502 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:48,507 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:48,708 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 8b8fe6f7a00c470ca41a053dfb3535bd +2026-04-30 10:08:48,715 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate561438', 'nickname': '测试用户更新5592', 'password': '123456'} +2026-04-30 10:08:48,955 [tid:21036 pid:9508] Dlizhan_interface.py[line:236] INFO your input:{'id': 247, 'username': 'testuserupdate561438', 'nickname': '修改后的昵称7433', 'remark': '修改后的备注'} +2026-04-30 10:08:49,194 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:49,307 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:49,310 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:49,535 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 7b3b00f8092a47c4aa92f5b99bc6135d +2026-04-30 10:08:49,541 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd976787', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:08:49,744 [tid:21036 pid:9508] Dlizhan_interface.py[line:260] INFO your input:{'id': 248, 'password': '654321'} +2026-04-30 10:08:49,941 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:50,055 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:50,057 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:50,238 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: e0878587b24d4c7aa0eb1f6dd2da8ff1 +2026-04-30 10:08:50,241 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus622291', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:08:50,426 [tid:21036 pid:9508] Dlizhan_interface.py[line:284] INFO your input:{'id': 249, 'status': 0} +2026-04-30 10:08:50,637 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:50,750 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:50,756 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:50,943 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: ecef6c0c60fa46779700799e24e3c305 +2026-04-30 10:08:50,949 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete958310', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:08:51,156 [tid:21036 pid:9508] Dlizhan_interface.py[line:129] INFO your input:{'id': 250} +2026-04-30 10:08:51,340 [tid:21036 pid:9508] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:08:51,454 [tid:21036 pid:9508] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:08:51,455 [tid:21036 pid:9508] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:08:51,618 [tid:21036 pid:9508] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 4a3d06f3543146c4b0db020ababc5b4b +2026-04-30 10:08:51,623 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch6582100', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:08:51,787 [tid:21036 pid:9508] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch1080651', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:08:52,126 [tid:21036 pid:9508] Dlizhan_interface.py[line:152] INFO your input:{'ids': [251, 252]} +2026-04-30 10:11:08,576 [tid:22940 pid:15640] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:11:08,580 [tid:22940 pid:15640] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:11:08,580 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:11:08,581 [tid:22940 pid:15640] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:11:08,727 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:09,153 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:09,156 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:09,339 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 937ad775777846868d86e7a892c0f639 +2026-04-30 10:11:09,516 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 2bf091f81e234253a69cfac80a335d4f +2026-04-30 10:11:09,531 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:09,634 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:09,636 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:09,795 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b5d248a4ed9644fb812bc71a0717c810 +2026-04-30 10:11:09,800 [tid:22940 pid:15640] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:11:09,951 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:10,058 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:10,060 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:10,236 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 765fefba93b1474bbeeb8633b9ed93af +2026-04-30 10:11:10,241 [tid:22940 pid:15640] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 10:11:10,401 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:10,502 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:10,505 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:10,650 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 9e7039a0748341828558f3506e0449af +2026-04-30 10:11:10,655 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser543197', 'nickname': '测试用户8736', 'password': '123456', 'email': 'testuser543197@test.com', 'mobile': '13891073312', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:11:10,830 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:10,937 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:10,939 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:11,110 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 9b8a06540fc94178b051aa5999536b87 +2026-04-30 10:11:11,115 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget979838', 'nickname': '测试用户详情3905', 'password': '123456'} +2026-04-30 10:11:11,265 [tid:22940 pid:15640] Dlizhan_interface.py[line:175] INFO your input:{'id': 254} +2026-04-30 10:11:11,425 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:11,525 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:11,526 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:11,665 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 3f73d4fe7fae42bd998a6d685973626d +2026-04-30 10:11:11,671 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate934139', 'nickname': '测试用户更新8080', 'password': '123456'} +2026-04-30 10:11:11,812 [tid:22940 pid:15640] Dlizhan_interface.py[line:236] INFO your input:{'id': 255, 'username': 'testuserupdate934139', 'nickname': '修改后的昵称6100', 'remark': '修改后的备注'} +2026-04-30 10:11:11,963 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:12,071 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:12,074 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:12,229 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 6d0088857c3440edb62dc7c14726106e +2026-04-30 10:11:12,233 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd339903', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:11:12,383 [tid:22940 pid:15640] Dlizhan_interface.py[line:260] INFO your input:{'id': 256, 'password': '654321'} +2026-04-30 10:11:12,529 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:12,630 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:12,634 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:12,804 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 3e5d69f9d35b41ba964879a26ebdf31d +2026-04-30 10:11:12,809 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus354514', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:11:12,953 [tid:22940 pid:15640] Dlizhan_interface.py[line:284] INFO your input:{'id': 257, 'status': 0} +2026-04-30 10:11:13,111 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:13,217 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:13,220 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:13,391 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: d2383fcd7f4b43c3bbb2cd996ef82dec +2026-04-30 10:11:13,395 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete431508', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:11:13,550 [tid:22940 pid:15640] Dlizhan_interface.py[line:129] INFO your input:{'id': 258} +2026-04-30 10:11:13,703 [tid:22940 pid:15640] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:11:13,803 [tid:22940 pid:15640] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:11:13,806 [tid:22940 pid:15640] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:11:13,951 [tid:22940 pid:15640] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 0be39c184ea544cdbf1cb689d616a2db +2026-04-30 10:11:13,954 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch5972710', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:11:14,101 [tid:22940 pid:15640] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch6641261', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:11:14,254 [tid:22940 pid:15640] Dlizhan_interface.py[line:152] INFO your input:{'ids': [259, 260]} +2026-04-30 10:37:43,283 [tid:22796 pid:31480] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:37:43,288 [tid:22796 pid:31480] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:37:43,289 [tid:22796 pid:31480] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:37:43,290 [tid:22796 pid:31480] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:37:44,620 [tid:28004 pid:29168] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:37:44,623 [tid:28004 pid:29168] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:37:44,624 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:37:44,624 [tid:28004 pid:29168] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:37:44,767 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:45,223 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:45,227 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:45,479 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 450192b714b941158093834d7fe75cb8 +2026-04-30 10:37:45,622 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 05ec17da0d3a45939f2b9d804df41d90 +2026-04-30 10:37:45,640 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:45,745 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:45,746 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:45,904 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 8c145db03b154372b66f1c76107139aa +2026-04-30 10:37:45,907 [tid:28004 pid:29168] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:37:46,050 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:46,161 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:46,164 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:46,336 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 5d34af16dd2840d58567ccdce8dd7864 +2026-04-30 10:37:46,340 [tid:28004 pid:29168] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 10:37:46,503 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:46,607 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:46,610 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:46,773 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 5f80d39928294054b0f80ead91493b8e +2026-04-30 10:37:46,776 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser960558', 'nickname': '测试用户3082', 'password': '123456', 'email': 'testuser960558@test.com', 'mobile': '13855314874', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:37:46,952 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:47,063 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:47,064 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:47,231 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b338ba35c80b4d9cb72e8c3c806e1e89 +2026-04-30 10:37:47,233 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget233253', 'nickname': '测试用户详情1107', 'password': '123456'} +2026-04-30 10:37:47,379 [tid:28004 pid:29168] Dlizhan_interface.py[line:175] INFO your input:{'id': 262} +2026-04-30 10:37:47,545 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:47,650 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:47,651 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:47,805 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 75449b870361439397d3d4ad2904edc8 +2026-04-30 10:37:47,810 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate451961', 'nickname': '测试用户更新9280', 'password': '123456'} +2026-04-30 10:37:47,956 [tid:28004 pid:29168] Dlizhan_interface.py[line:236] INFO your input:{'id': 263, 'username': 'testuserupdate451961', 'nickname': '修改后的昵称2308', 'remark': '修改后的备注'} +2026-04-30 10:37:48,120 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:48,230 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:48,231 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:48,373 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 4a6e7894b38f45fc8034a435b4651e2b +2026-04-30 10:37:48,377 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd490158', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:37:48,537 [tid:28004 pid:29168] Dlizhan_interface.py[line:260] INFO your input:{'id': 264, 'password': '654321'} +2026-04-30 10:37:48,677 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:48,783 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:48,786 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:48,946 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 0cdad62fb5fc4e9a91a2a7756847db94 +2026-04-30 10:37:48,951 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus791277', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:37:49,102 [tid:28004 pid:29168] Dlizhan_interface.py[line:284] INFO your input:{'id': 265, 'status': 0} +2026-04-30 10:37:49,267 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:49,379 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:49,382 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:49,543 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: de88936d53484683a84f9712a509422c +2026-04-30 10:37:49,546 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete928561', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:37:49,692 [tid:28004 pid:29168] Dlizhan_interface.py[line:129] INFO your input:{'id': 266} +2026-04-30 10:37:49,863 [tid:28004 pid:29168] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:37:49,966 [tid:28004 pid:29168] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:37:49,967 [tid:28004 pid:29168] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:37:50,095 [tid:28004 pid:29168] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 045c346530ea4cc3a641c312f88c6195 +2026-04-30 10:37:50,099 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch3481200', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:37:50,232 [tid:28004 pid:29168] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch8235341', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:37:50,378 [tid:28004 pid:29168] Dlizhan_interface.py[line:152] INFO your input:{'ids': [267, 268]} +2026-04-30 10:45:09,964 [tid:25900 pid:26844] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:45:09,968 [tid:25900 pid:26844] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:45:09,969 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:45:09,970 [tid:25900 pid:26844] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:45:10,130 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:10,600 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:10,603 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:10,781 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: c44a6b8e714a4b02b4610247784f14a1 +2026-04-30 10:45:10,931 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 64b3a49dd5564ccfbd32eb339fc183a2 +2026-04-30 10:45:10,938 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:11,046 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:11,048 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:11,201 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 68fc67e46a5449a1847d9293ab917b89 +2026-04-30 10:45:11,209 [tid:25900 pid:26844] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:45:11,414 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:11,524 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:11,525 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:11,662 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: ef466759a2e8429882a4a08ca3420517 +2026-04-30 10:45:11,663 [tid:25900 pid:26844] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 10:45:11,794 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:11,899 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:11,900 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:12,030 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 93913dc82c484cce8b6ba660070cbdb9 +2026-04-30 10:45:12,032 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser794530', 'nickname': '测试用户2784', 'password': '123456', 'email': 'testuser794530@test.com', 'mobile': '13801078277', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:45:12,179 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:12,286 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:12,289 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:12,427 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 46478b322ec84ab19324f871b917ecc6 +2026-04-30 10:45:12,431 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget871907', 'nickname': '测试用户详情6125', 'password': '123456'} +2026-04-30 10:45:12,575 [tid:25900 pid:26844] Dlizhan_interface.py[line:175] INFO your input:{'id': 270} +2026-04-30 10:45:12,735 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:12,841 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:12,844 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:12,986 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 9dd41b4d231d408bb0b3e8fa0d74fc58 +2026-04-30 10:45:12,991 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate394355', 'nickname': '测试用户更新8145', 'password': '123456'} +2026-04-30 10:45:13,136 [tid:25900 pid:26844] Dlizhan_interface.py[line:236] INFO your input:{'id': 271, 'username': 'testuserupdate394355', 'nickname': '修改后的昵称5469', 'remark': '修改后的备注'} +2026-04-30 10:45:13,299 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:13,408 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:13,410 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:13,563 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 300705ff082440818aa9bc35e9c02f92 +2026-04-30 10:45:13,566 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd829760', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:45:13,713 [tid:25900 pid:26844] Dlizhan_interface.py[line:260] INFO your input:{'id': 272, 'password': '654321'} +2026-04-30 10:45:13,869 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:13,978 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:13,979 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:14,131 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: ad1ccb54378245a18b7a8d465e769deb +2026-04-30 10:45:14,134 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus187995', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:45:14,280 [tid:25900 pid:26844] Dlizhan_interface.py[line:284] INFO your input:{'id': 273, 'status': 0} +2026-04-30 10:45:14,420 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:14,528 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:14,530 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:14,666 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 4903ce6bccbf4b79a1039531fd9ffddf +2026-04-30 10:45:14,669 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete658372', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:45:14,812 [tid:25900 pid:26844] Dlizhan_interface.py[line:129] INFO your input:{'id': 274} +2026-04-30 10:45:14,962 [tid:25900 pid:26844] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:45:15,069 [tid:25900 pid:26844] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:45:15,072 [tid:25900 pid:26844] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:45:15,212 [tid:25900 pid:26844] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: d13c371dd57343cd8ff5adacd19924f1 +2026-04-30 10:45:15,216 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch6138060', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:45:15,359 [tid:25900 pid:26844] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch2784011', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:45:15,508 [tid:25900 pid:26844] Dlizhan_interface.py[line:152] INFO your input:{'ids': [275, 276]} +2026-04-30 10:53:31,248 [tid:5284 pid:19188] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 10:53:31,257 [tid:5284 pid:19188] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 10:53:31,258 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 10:53:31,260 [tid:5284 pid:19188] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 10:53:31,991 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:32,519 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:32,523 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:32,842 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 6d5da31176e54d2aa7d56407a18f53cc +2026-04-30 10:53:33,061 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b5071232864c4ca5987ef8dc4426a2b5 +2026-04-30 10:53:33,120 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:33,242 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:33,245 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:33,464 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 579425f6fc524e6e9296337c7783e9c8 +2026-04-30 10:53:33,479 [tid:5284 pid:19188] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 10:53:33,750 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:33,868 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:33,875 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:34,328 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 668b543bc49b41f2a3f34d5d94e3853c +2026-04-30 10:53:34,332 [tid:5284 pid:19188] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 10:53:34,588 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:34,708 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:34,711 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:34,992 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: a51cbff75fc046b49e0f52464445b4dd +2026-04-30 10:53:35,003 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser587572', 'nickname': '测试用户2647', 'password': '123456', 'email': 'testuser587572@test.com', 'mobile': '13841274227', 'sex': 1, 'remark': '测试用户'} +2026-04-30 10:53:35,278 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:35,398 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:35,401 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:35,697 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: fed3cf18ae1546b6b07cfd411b2f79c6 +2026-04-30 10:53:35,705 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget744612', 'nickname': '测试用户详情2557', 'password': '123456'} +2026-04-30 10:53:35,890 [tid:5284 pid:19188] Dlizhan_interface.py[line:175] INFO your input:{'id': 278} +2026-04-30 10:53:36,264 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:36,420 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:36,422 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:36,630 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 5fd44c074fb04dec8e935b7a5b24a506 +2026-04-30 10:53:36,637 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate150741', 'nickname': '测试用户更新5592', 'password': '123456'} +2026-04-30 10:53:36,843 [tid:5284 pid:19188] Dlizhan_interface.py[line:236] INFO your input:{'id': 279, 'username': 'testuserupdate150741', 'nickname': '修改后的昵称9411', 'remark': '修改后的备注'} +2026-04-30 10:53:37,108 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:37,236 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:37,240 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:37,475 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 0566c3f89fb2486b9a46a86cfc3a09f9 +2026-04-30 10:53:37,489 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd600537', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 10:53:37,728 [tid:5284 pid:19188] Dlizhan_interface.py[line:260] INFO your input:{'id': 280, 'password': '654321'} +2026-04-30 10:53:38,063 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:38,178 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:38,181 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:38,414 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 12787439bbb54c4baecbf7b27f985087 +2026-04-30 10:53:38,422 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus256406', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 10:53:38,746 [tid:5284 pid:19188] Dlizhan_interface.py[line:284] INFO your input:{'id': 281, 'status': 0} +2026-04-30 10:53:39,203 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:39,334 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:39,339 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:39,713 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b45ba12695174bc78dbebf5e72b5630f +2026-04-30 10:53:39,723 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete526240', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 10:53:39,972 [tid:5284 pid:19188] Dlizhan_interface.py[line:129] INFO your input:{'id': 282} +2026-04-30 10:53:40,281 [tid:5284 pid:19188] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 10:53:40,397 [tid:5284 pid:19188] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 10:53:40,402 [tid:5284 pid:19188] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 10:53:40,712 [tid:5284 pid:19188] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 36a4d574847247c7857b3e3b4968a0a7 +2026-04-30 10:53:40,727 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch1358010', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 10:53:41,078 [tid:5284 pid:19188] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch2561201', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 10:53:41,298 [tid:5284 pid:19188] Dlizhan_interface.py[line:152] INFO your input:{'ids': [283, 284]} +2026-04-30 11:13:35,429 [tid:20464 pid:1060] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 11:13:35,432 [tid:20464 pid:1060] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 11:13:35,433 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 11:13:35,434 [tid:20464 pid:1060] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 11:13:35,573 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:36,044 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:36,047 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:36,279 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 0acd3e1f75604d57888999136b26d014 +2026-04-30 11:13:36,453 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b043d79a4df7476aa1a7e042f16c52d5 +2026-04-30 11:13:36,465 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:36,580 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:36,581 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:36,735 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 1ab10c2a6228478ca69a7661adc27628 +2026-04-30 11:13:36,738 [tid:20464 pid:1060] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 11:13:36,889 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:36,993 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:36,995 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:37,159 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 2c2904d0c686454b82c45515e5c0353e +2026-04-30 11:13:37,160 [tid:20464 pid:1060] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 11:13:37,303 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:37,416 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:37,419 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:37,588 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 2ba6d167b329400aa0905e02c7c666fa +2026-04-30 11:13:37,596 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser224055', 'nickname': '测试用户5389', 'password': '123456', 'email': 'testuser224055@test.com', 'mobile': '13897439544', 'sex': 1, 'remark': '测试用户'} +2026-04-30 11:13:37,774 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:37,878 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:37,878 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:38,013 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: b0500abf1d614049bc44a54180a80eb4 +2026-04-30 11:13:38,017 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget525482', 'nickname': '测试用户详情5667', 'password': '123456'} +2026-04-30 11:13:38,154 [tid:20464 pid:1060] Dlizhan_interface.py[line:175] INFO your input:{'id': 286} +2026-04-30 11:13:38,334 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:38,447 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:38,448 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:38,597 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 03fd5e8a07384322989ebcc915f182ca +2026-04-30 11:13:38,602 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate308985', 'nickname': '测试用户更新1755', 'password': '123456'} +2026-04-30 11:13:38,768 [tid:20464 pid:1060] Dlizhan_interface.py[line:236] INFO your input:{'id': 287, 'username': 'testuserupdate308985', 'nickname': '修改后的昵称3933', 'remark': '修改后的备注'} +2026-04-30 11:13:38,917 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:39,022 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:39,023 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:39,166 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 3750b94e92e14e3c974562b86015dffe +2026-04-30 11:13:39,169 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd373571', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 11:13:39,325 [tid:20464 pid:1060] Dlizhan_interface.py[line:260] INFO your input:{'id': 288, 'password': '654321'} +2026-04-30 11:13:39,476 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:39,589 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:39,591 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:39,737 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: f5e31a6f01764ec2ac1a330fed52e91f +2026-04-30 11:13:39,743 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus134887', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 11:13:39,893 [tid:20464 pid:1060] Dlizhan_interface.py[line:284] INFO your input:{'id': 289, 'status': 0} +2026-04-30 11:13:40,052 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:40,158 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:40,160 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:40,309 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 85391f58efe64a2b8e5e71f61d96e33a +2026-04-30 11:13:40,312 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete229290', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 11:13:40,444 [tid:20464 pid:1060] Dlizhan_interface.py[line:129] INFO your input:{'id': 290} +2026-04-30 11:13:40,622 [tid:20464 pid:1060] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 11:13:40,736 [tid:20464 pid:1060] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 11:13:40,737 [tid:20464 pid:1060] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 11:13:40,882 [tid:20464 pid:1060] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 247dd0391039495988c6edadb70ad083 +2026-04-30 11:13:40,886 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch5320490', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 11:13:41,012 [tid:20464 pid:1060] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch9432451', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 11:13:41,158 [tid:20464 pid:1060] Dlizhan_interface.py[line:152] INFO your input:{'ids': [291, 292]} +2026-04-30 13:58:42,925 [tid:26900 pid:33132] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 13:58:42,930 [tid:26900 pid:33132] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 13:58:42,931 [tid:26900 pid:33132] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 13:58:42,932 [tid:26900 pid:33132] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 13:58:43,071 [tid:26900 pid:33132] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 13:58:43,536 [tid:26900 pid:33132] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 13:58:43,539 [tid:26900 pid:33132] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 13:58:43,779 [tid:26900 pid:33132] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: a7ff4bc93adf436a914df2b01c988a8c +2026-04-30 13:58:43,959 [tid:26900 pid:33132] Dlizhan_interface.py[line:204] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 13:58:44,126 [tid:26900 pid:33132] Dlizhan_interface.py[line:305] INFO your input:{} +2026-04-30 13:58:44,285 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuser344975', 'nickname': '测试用户7381', 'password': '123456', 'email': 'testuser344975@test.com', 'mobile': '13896608273', 'sex': 1, 'remark': '测试用户'} +2026-04-30 13:58:44,451 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserget540347', 'nickname': '测试用户详情3388', 'password': '123456'} +2026-04-30 13:58:44,587 [tid:26900 pid:33132] Dlizhan_interface.py[line:175] INFO your input:{'id': 294} +2026-04-30 13:58:44,737 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserupdate629815', 'nickname': '测试用户更新1282', 'password': '123456'} +2026-04-30 13:58:44,874 [tid:26900 pid:33132] Dlizhan_interface.py[line:236] INFO your input:{'id': 295, 'username': 'testuserupdate629815', 'nickname': '修改后的昵称2811', 'remark': '修改后的备注'} +2026-04-30 13:58:45,030 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserpwd967498', 'nickname': '测试密码用户', 'password': '123456'} +2026-04-30 13:58:45,201 [tid:26900 pid:33132] Dlizhan_interface.py[line:260] INFO your input:{'id': 296, 'password': '654321'} +2026-04-30 13:58:45,362 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserstatus745106', 'nickname': '测试状态用户', 'password': '123456'} +2026-04-30 13:58:45,507 [tid:26900 pid:33132] Dlizhan_interface.py[line:284] INFO your input:{'id': 297, 'status': 0} +2026-04-30 13:58:45,656 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserdelete267537', 'nickname': '测试删除用户', 'password': '123456'} +2026-04-30 13:58:45,801 [tid:26900 pid:33132] Dlizhan_interface.py[line:129] INFO your input:{'id': 298} +2026-04-30 13:58:45,962 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch6735260', 'nickname': '测试批量删除用户0', 'password': '123456'} +2026-04-30 13:58:46,107 [tid:26900 pid:33132] Dlizhan_interface.py[line:107] INFO your input:{'username': 'testuserbatch2547321', 'nickname': '测试批量删除用户1', 'password': '123456'} +2026-04-30 13:58:46,271 [tid:26900 pid:33132] Dlizhan_interface.py[line:152] INFO your input:{'ids': [299, 300]} +2026-04-30 14:11:28,649 [tid:31908 pid:34400] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 14:11:28,653 [tid:31908 pid:34400] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 14:11:28,654 [tid:31908 pid:34400] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 14:11:28,655 [tid:31908 pid:34400] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 14:11:28,710 [tid:31908 pid:34400] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 14:11:28,712 [tid:31908 pid:34400] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 14:11:28,713 [tid:31908 pid:34400] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 14:11:28,713 [tid:31908 pid:34400] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 14:11:29,052 [tid:31908 pid:34400] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: 62fe618054564b4d9cbe81871f5ff3c8 +2026-04-30 14:11:29,059 [tid:31908 pid:34400] Dlizhan_interface.py[line:420] INFO your input:{'pageNo': 1, 'pageSize': 10} +2026-04-30 14:11:29,239 [tid:31908 pid:34400] Dlizhan_interface.py[line:332] INFO your input:{'name': '测试角色7822', 'code': 'TEST_ROLE_9941', 'sort': 100, 'status': 1, 'remark': '测试角色备注'} +2026-04-30 14:11:29,446 [tid:31908 pid:34400] Dlizhan_interface.py[line:332] INFO your input:{'name': '测试角色详情4373', 'code': 'TEST_ROLE_DETAIL_4747', 'sort': 200, 'status': 1} +2026-04-30 14:11:29,588 [tid:31908 pid:34400] Dlizhan_interface.py[line:395] INFO your input:{'id': 170} +2026-04-30 14:11:29,739 [tid:31908 pid:34400] Dlizhan_interface.py[line:332] INFO your input:{'name': '测试角色修改6321', 'code': 'TEST_ROLE_UPDATE_8254', 'sort': 300, 'status': 1} +2026-04-30 14:11:29,887 [tid:31908 pid:34400] Dlizhan_interface.py[line:484] INFO your input:{'id': 171, 'name': '修改后的角色名称4434', 'code': 'TEST_ROLE_UPDATE_8254', 'sort': 301, 'status': 1, 'remark': '修改后的备注'} +2026-04-30 14:11:30,048 [tid:31908 pid:34400] Dlizhan_interface.py[line:332] INFO your input:{'name': '测试角色删除3569', 'code': 'TEST_ROLE_DELETE_4851', 'sort': 400, 'status': 1} +2026-04-30 14:11:30,195 [tid:31908 pid:34400] Dlizhan_interface.py[line:353] INFO your input:{'id': 172} +2026-04-30 14:11:30,365 [tid:31908 pid:34400] Dlizhan_interface.py[line:332] INFO your input:{'name': '测试批量删除角色7652', 'code': 'TEST_ROLE_BATCH_4259_0', 'sort': 500, 'status': 1} +2026-04-30 14:11:30,506 [tid:31908 pid:34400] Dlizhan_interface.py[line:332] INFO your input:{'name': '测试批量删除角色4193', 'code': 'TEST_ROLE_BATCH_7531_1', 'sort': 501, 'status': 1} +2026-04-30 14:11:30,680 [tid:31908 pid:34400] Dlizhan_interface.py[line:374] INFO your input:{'ids': [173, 174]} +2026-04-30 14:11:30,849 [tid:31908 pid:34400] Dlizhan_interface.py[line:439] INFO your input:{} +2026-04-30 14:11:31,002 [tid:31908 pid:34400] Dlizhan_interface.py[line:458] INFO your input:{} +2026-04-30 14:51:39,285 [tid:27520 pid:19480] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 14:51:39,296 [tid:27520 pid:19480] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 14:51:39,296 [tid:27520 pid:19480] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 14:51:39,297 [tid:27520 pid:19480] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 14:51:39,474 [tid:27520 pid:19480] Dlizhan_interface.py[line:518] INFO 登录尝试 1/3,输入参数: username=joytest, password=*** +2026-04-30 14:51:39,664 [tid:27520 pid:19480] Dlizhan_interface.py[line:556] WARNING 登录失败,code: 500 +2026-04-30 14:52:55,774 [tid:33540 pid:23972] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 14:52:55,777 [tid:33540 pid:23972] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 14:52:55,778 [tid:33540 pid:23972] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: # +2026-04-30 14:52:55,779 [tid:33540 pid:23972] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 14:52:55,949 [tid:33540 pid:23972] pgsqlhelper.py[line:371] INFO SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s|('joytest',) +2026-04-30 14:52:56,419 [tid:33540 pid:23972] pgsqlhelper.py[line:379] INFO 更新数据库条数:1 +2026-04-30 14:52:56,420 [tid:33540 pid:23972] Dlizhan_interface.py[line:51] INFO 清除用户 joytest 的 fingerprint 字段,影响行数: 1 +2026-04-30 14:52:56,605 [tid:33540 pid:23972] Dlizhan_interface.py[line:41] INFO 已设置 JoyHub Token: a74d6d2ceb2b4616bab4d5388645cac6 +2026-04-30 14:52:56,801 [tid:33540 pid:23972] Dlizhan_interface.py[line:762] INFO =========== 获得岗位分页列表 =========== +2026-04-30 14:52:57,251 [tid:33540 pid:23972] Dlizhan_interface.py[line:588] INFO =========== 创建岗位 =========== +2026-04-30 14:52:57,279 [tid:33540 pid:23972] Dlizhan_interface.py[line:588] INFO =========== 创建岗位 =========== +2026-04-30 14:52:57,304 [tid:33540 pid:23972] Dlizhan_interface.py[line:735] INFO =========== 获取岗位全列表 =========== +2026-04-30 14:52:57,324 [tid:33540 pid:23972] Dlizhan_interface.py[line:796] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:06:47,362 [tid:22280 pid:20088] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:06:47,366 [tid:22280 pid:20088] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:06:47,367 [tid:22280 pid:20088] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:06:47,514 [tid:22280 pid:20088] Dlizhan_interface.py[line:49] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:06:47,892 [tid:22280 pid:20088] Dlizhan_interface.py[line:590] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:06:48,291 [tid:22280 pid:20088] Dlizhan_interface.py[line:706] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:06:48,314 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:06:48,339 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:06:48,361 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:06:48,381 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:06:48,404 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:06:48,439 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:06:48,460 [tid:22280 pid:20088] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:21,443 [tid:33932 pid:31732] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:09:21,446 [tid:33932 pid:31732] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:09:21,447 [tid:33932 pid:31732] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:09:21,591 [tid:33932 pid:31732] Dlizhan_interface.py[line:49] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:09:21,964 [tid:33932 pid:31732] Dlizhan_interface.py[line:582] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:09:21,966 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:21,968 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/page?pageNo=1&pageSize=10 +2026-04-30 15:09:21,969 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}} +2026-04-30 15:09:21,993 [tid:33932 pid:31732] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-04-30 15:09:22,595 [tid:33932 pid:31732] Dlizhan_interface.py[line:690] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:09:22,596 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:22,596 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/simple-list +2026-04-30 15:09:22,597 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}} +2026-04-30 15:09:22,597 [tid:33932 pid:31732] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-04-30 15:09:22,778 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:22,778 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:22,779 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:22,779 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuser446736', 'nickname': '测试用户9861', 'password': '123456', 'email': 'testuser446736@test.com', 'mobile': '13877726132', 'sex': 1, 'remark': '测试用户'}} +2026-04-30 15:09:22,780 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:09:22,964 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:22,965 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:22,965 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:22,966 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuserget596157', 'nickname': '测试用户详情6955', 'password': '123456'}} +2026-04-30 15:09:22,966 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:09:23,133 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:23,134 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:23,134 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:23,135 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuserupdate694591', 'nickname': '测试用户更新1750', 'password': '123456'}} +2026-04-30 15:09:23,136 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:09:23,313 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:23,314 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:23,314 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:23,315 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuserpwd311358', 'nickname': '测试密码用户', 'password': '123456'}} +2026-04-30 15:09:23,315 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:09:23,498 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:23,499 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:23,499 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:23,500 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuserstatus116170', 'nickname': '测试状态用户', 'password': '123456'}} +2026-04-30 15:09:23,500 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:09:23,694 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:23,695 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:23,696 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:23,697 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuserdelete397706', 'nickname': '测试删除用户', 'password': '123456'}} +2026-04-30 15:09:23,697 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:09:23,879 [tid:33932 pid:31732] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:09:23,880 [tid:33932 pid:31732] runner.py[line:115] INFO 登录系统为joyhub-website-manager-api-test.best-envision.com,用户名为手动输入:jwadmin +2026-04-30 15:09:23,880 [tid:33932 pid:31732] runner.py[line:116] INFO 请求地址:https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/user/create +2026-04-30 15:09:23,881 [tid:33932 pid:31732] runner.py[line:117] INFO 请求数据:{'headers': {'Content-Type': 'application/json', 'tenant-id': '126', 'Authorization': 'Bearer 513b26f664c84cdebb075c0a2342cd53'}, 'json': {'username': 'testuserbatch3715950', 'nickname': '测试批量删除用户0', 'password': '123456'}} +2026-04-30 15:09:23,881 [tid:33932 pid:31732] runner.py[line:136] INFO 检测到 kwargs 中包含登录信息,使用传入的参数进行登录 +2026-04-30 15:11:07,520 [tid:18824 pid:29096] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:11:07,523 [tid:18824 pid:29096] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:11:07,524 [tid:18824 pid:29096] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:11:07,668 [tid:18824 pid:29096] Dlizhan_interface.py[line:49] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:11:08,021 [tid:18824 pid:29096] Dlizhan_interface.py[line:565] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:11:08,180 [tid:18824 pid:29096] Dlizhan_interface.py[line:654] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:11:08,329 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:08,480 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:08,624 [tid:18824 pid:29096] Dlizhan_interface.py[line:552] INFO =========== 获得用户详情 =========== +2026-04-30 15:11:08,774 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:08,918 [tid:18824 pid:29096] Dlizhan_interface.py[line:592] INFO =========== 修改用户 =========== +2026-04-30 15:11:09,071 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:09,218 [tid:18824 pid:29096] Dlizhan_interface.py[line:626] INFO =========== 重置用户密码 =========== +2026-04-30 15:11:09,390 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:09,539 [tid:18824 pid:29096] Dlizhan_interface.py[line:640] INFO =========== 修改用户状态 =========== +2026-04-30 15:11:09,688 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:09,828 [tid:18824 pid:29096] Dlizhan_interface.py[line:525] INFO =========== 删除用户 =========== +2026-04-30 15:11:09,975 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:10,120 [tid:18824 pid:29096] Dlizhan_interface.py[line:493] INFO =========== 创建用户 =========== +2026-04-30 15:11:10,260 [tid:18824 pid:29096] Dlizhan_interface.py[line:538] INFO =========== 批量删除用户 =========== +2026-04-30 15:11:33,434 [tid:17260 pid:5608] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:11:33,438 [tid:17260 pid:5608] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:11:33,439 [tid:17260 pid:5608] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:11:33,477 [tid:17260 pid:5608] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:11:33,479 [tid:17260 pid:5608] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:11:33,480 [tid:17260 pid:5608] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:11:33,802 [tid:17260 pid:5608] Dlizhan_interface.py[line:222] INFO =========== 获得角色分页 =========== +2026-04-30 15:11:34,208 [tid:17260 pid:5608] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:11:34,229 [tid:17260 pid:5608] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:11:34,259 [tid:17260 pid:5608] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:11:34,283 [tid:17260 pid:5608] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:11:34,308 [tid:17260 pid:5608] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:11:34,333 [tid:17260 pid:5608] Dlizhan_interface.py[line:251] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:11:34,356 [tid:17260 pid:5608] Dlizhan_interface.py[line:268] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:12:46,766 [tid:12740 pid:24704] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:12:46,770 [tid:12740 pid:24704] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:12:46,771 [tid:12740 pid:24704] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:12:46,807 [tid:12740 pid:24704] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:12:46,828 [tid:12740 pid:24704] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:12:46,828 [tid:12740 pid:24704] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:12:47,192 [tid:12740 pid:24704] Dlizhan_interface.py[line:197] INFO =========== 获得角色分页 =========== +2026-04-30 15:12:47,363 [tid:12740 pid:24704] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:12:47,513 [tid:12740 pid:24704] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:12:47,649 [tid:12740 pid:24704] Dlizhan_interface.py[line:184] INFO =========== 获得角色信息 =========== +2026-04-30 15:12:47,805 [tid:12740 pid:24704] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:12:47,947 [tid:12740 pid:24704] Dlizhan_interface.py[line:242] INFO =========== 修改角色 =========== +2026-04-30 15:12:48,100 [tid:12740 pid:24704] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:12:48,238 [tid:12740 pid:24704] Dlizhan_interface.py[line:157] INFO =========== 删除角色 =========== +2026-04-30 15:12:48,402 [tid:12740 pid:24704] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:12:48,545 [tid:12740 pid:24704] Dlizhan_interface.py[line:136] INFO =========== 创建角色 =========== +2026-04-30 15:12:48,692 [tid:12740 pid:24704] Dlizhan_interface.py[line:170] INFO =========== 批量删除角色 =========== +2026-04-30 15:12:48,851 [tid:12740 pid:24704] Dlizhan_interface.py[line:220] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:12:49,001 [tid:12740 pid:24704] Dlizhan_interface.py[line:231] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:18:20,593 [tid:18180 pid:22568] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:18:20,597 [tid:18180 pid:22568] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:18:20,597 [tid:18180 pid:22568] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:18:20,732 [tid:18180 pid:22568] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:18:21,078 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:18:21,242 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:18:21,385 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:21,541 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:21,684 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 15:18:21,835 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:21,999 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 15:18:22,143 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:22,287 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 15:18:22,458 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:22,640 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 15:18:22,838 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:23,027 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 15:18:23,213 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:23,453 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:18:23,648 [tid:18180 pid:22568] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 15:18:38,100 [tid:33260 pid:34732] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:18:38,106 [tid:33260 pid:34732] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:18:38,107 [tid:33260 pid:34732] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:18:38,164 [tid:33260 pid:34732] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:18:38,185 [tid:33260 pid:34732] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:18:38,186 [tid:33260 pid:34732] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:18:38,638 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 15:18:38,804 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:18:39,172 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:18:39,367 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 15:18:39,601 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:18:39,827 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 15:18:40,061 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:18:40,264 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 15:18:40,537 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:18:40,728 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:18:40,941 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 15:18:41,157 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:18:41,354 [tid:33260 pid:34732] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:19:11,548 [tid:5664 pid:32700] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:19:11,553 [tid:5664 pid:32700] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:19:11,554 [tid:5664 pid:32700] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:19:11,799 [tid:5664 pid:32700] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:19:12,161 [tid:5664 pid:32700] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:19:14,060 [tid:5664 pid:32700] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:19:14,336 [tid:5664 pid:32700] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:19:14,510 [tid:5664 pid:32700] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:19:14,715 [tid:5664 pid:32700] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:19:14,979 [tid:5664 pid:32700] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:21:06,585 [tid:26344 pid:3656] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:21:06,589 [tid:26344 pid:3656] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:21:06,590 [tid:26344 pid:3656] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:21:06,805 [tid:26344 pid:3656] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:21:07,112 [tid:26344 pid:3656] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:21:07,593 [tid:26344 pid:3656] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:21:07,753 [tid:26344 pid:3656] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:21:07,888 [tid:26344 pid:3656] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:21:08,020 [tid:26344 pid:3656] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:21:08,151 [tid:26344 pid:3656] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:21:25,178 [tid:19448 pid:33460] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:21:25,185 [tid:19448 pid:33460] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:21:25,186 [tid:19448 pid:33460] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:21:25,486 [tid:19448 pid:33460] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:21:25,860 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:21:26,017 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:21:26,174 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:26,350 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:26,495 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 15:21:26,655 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:26,800 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 15:21:26,958 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:27,116 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 15:21:27,276 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:27,445 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 15:21:27,592 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:27,734 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 15:21:27,891 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:28,028 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:21:28,182 [tid:19448 pid:33460] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 15:21:47,055 [tid:19848 pid:21164] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:21:47,059 [tid:19848 pid:21164] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:21:47,060 [tid:19848 pid:21164] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:21:47,098 [tid:19848 pid:21164] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:21:47,120 [tid:19848 pid:21164] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:21:47,122 [tid:19848 pid:21164] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:21:47,491 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 15:21:47,671 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:21:47,833 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:21:47,965 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 15:21:48,111 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:21:48,265 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 15:21:48,430 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:21:48,589 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 15:21:48,763 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:21:48,939 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:21:49,113 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 15:21:49,269 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:21:49,453 [tid:19848 pid:21164] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:23:00,790 [tid:29592 pid:30328] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:23:00,793 [tid:29592 pid:30328] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:23:00,794 [tid:29592 pid:30328] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:23:00,830 [tid:29592 pid:30328] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:23:00,832 [tid:29592 pid:30328] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:23:00,832 [tid:29592 pid:30328] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:23:00,988 [tid:29592 pid:30328] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:23:01,342 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:23:01,840 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:23:01,994 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:23:02,119 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:23:02,265 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:23:02,424 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:23:02,759 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 15:23:02,916 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:23:03,075 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:23:03,219 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 15:23:03,393 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:23:03,541 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 15:23:03,706 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:23:03,847 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 15:23:04,003 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:23:04,154 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:23:04,299 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 15:23:04,443 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:23:04,580 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:23:04,725 [tid:29592 pid:30328] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:23:05,068 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:23:05,214 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:23:05,383 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:05,550 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:05,690 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 15:23:05,841 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:05,981 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 15:23:06,141 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:06,308 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 15:23:06,465 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:06,600 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 15:23:06,755 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:06,896 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 15:23:07,043 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:07,175 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:23:07,307 [tid:29592 pid:30328] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 15:31:04,984 [tid:11828 pid:21668] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:31:04,988 [tid:11828 pid:21668] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:31:04,988 [tid:11828 pid:21668] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:31:05,148 [tid:11828 pid:21668] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:31:05,534 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:31:05,684 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:31:05,830 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:31:05,976 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:31:06,122 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:31:06,618 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:31:06,751 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:31:06,947 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:31:07,181 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:31:07,383 [tid:11828 pid:21668] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:31:56,404 [tid:13176 pid:21840] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:31:56,437 [tid:13176 pid:21840] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:31:56,441 [tid:13176 pid:21840] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:31:58,244 [tid:13176 pid:21840] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:31:58,834 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:31:59,187 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:31:59,539 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:31:59,909 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:32:06,678 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:06,925 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:32:07,456 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:07,839 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:08,085 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:32:08,572 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:32:08,889 [tid:13176 pid:21840] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:32:23,334 [tid:5560 pid:14436] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:32:23,368 [tid:5560 pid:14436] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:32:23,376 [tid:5560 pid:14436] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:32:25,542 [tid:5560 pid:14436] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:32:26,484 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:32:26,794 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:27,154 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:32:27,552 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:32:34,948 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:35,286 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:32:35,698 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:36,121 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:32:36,612 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:32:37,282 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:32:37,770 [tid:5560 pid:14436] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:33:16,465 [tid:7328 pid:12124] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:33:16,500 [tid:7328 pid:12124] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:33:16,502 [tid:7328 pid:12124] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:33:17,521 [tid:7328 pid:12124] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:33:18,100 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:33:18,302 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:18,504 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:33:18,842 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:33:21,068 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:21,256 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:33:21,428 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:21,589 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:21,747 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:33:21,921 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:33:22,077 [tid:7328 pid:12124] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:33:39,007 [tid:29468 pid:23880] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:33:39,010 [tid:29468 pid:23880] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:33:39,011 [tid:29468 pid:23880] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:33:39,193 [tid:29468 pid:23880] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:33:39,545 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:33:39,703 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:39,847 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:33:40,000 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:33:40,510 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:40,637 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:33:40,802 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:40,923 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:33:41,075 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:33:41,235 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:33:41,374 [tid:29468 pid:23880] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:34:29,963 [tid:22132 pid:21216] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:34:29,966 [tid:22132 pid:21216] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:34:29,967 [tid:22132 pid:21216] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:34:30,135 [tid:22132 pid:21216] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:34:30,468 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:34:30,602 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:34:30,746 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:34:30,893 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:34:31,029 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:34:31,181 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:34:31,325 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:34:31,915 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:34:32,070 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:34:32,223 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:34:32,372 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:34:32,545 [tid:22132 pid:21216] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:35:13,360 [tid:9160 pid:6652] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:35:13,364 [tid:9160 pid:6652] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:35:13,364 [tid:9160 pid:6652] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:35:13,531 [tid:9160 pid:6652] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:35:13,881 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:35:14,011 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:14,170 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:35:14,315 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:14,475 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:35:14,633 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:14,773 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:35:14,912 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:15,053 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:15,197 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:35:15,375 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:35:15,498 [tid:9160 pid:6652] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:35:33,434 [tid:17452 pid:19784] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:35:33,441 [tid:17452 pid:19784] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:35:33,442 [tid:17452 pid:19784] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:35:33,509 [tid:17452 pid:19784] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:35:33,511 [tid:17452 pid:19784] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:35:33,512 [tid:17452 pid:19784] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:35:33,826 [tid:17452 pid:19784] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:35:34,176 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 15:35:34,319 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:34,466 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 15:35:34,617 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:34,768 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 15:35:34,924 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:35,064 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 15:35:35,215 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:35,357 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 15:35:35,492 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 15:35:35,639 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 15:35:35,802 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 15:35:36,114 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 15:35:36,267 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:35:36,424 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:35:36,578 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 15:35:36,753 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:35:36,902 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 15:35:37,076 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:35:37,237 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 15:35:37,394 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:35:37,551 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 15:35:37,696 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 15:35:37,868 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:35:38,014 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 15:35:38,159 [tid:17452 pid:19784] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:35:38,515 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 15:35:38,671 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 15:35:38,819 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:38,989 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:39,143 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 15:35:39,305 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:39,460 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 15:35:39,608 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:39,744 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 15:35:39,893 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:40,041 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 15:35:40,190 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:40,350 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 15:35:40,509 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:40,671 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 15:35:40,820 [tid:17452 pid:19784] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 15:59:49,795 [tid:34352 pid:26756] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 15:59:49,798 [tid:34352 pid:26756] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 15:59:49,798 [tid:34352 pid:26756] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 15:59:49,970 [tid:34352 pid:26756] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 15:59:50,197 [tid:34352 pid:26756] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 15:59:50,343 [tid:34352 pid:26756] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 15:59:50,483 [tid:34352 pid:26756] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 15:59:50,728 [tid:34352 pid:26756] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 15:59:50,875 [tid:34352 pid:26756] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 15:59:51,153 [tid:34352 pid:26756] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:00:28,415 [tid:12556 pid:31728] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:00:28,423 [tid:12556 pid:31728] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:00:28,425 [tid:12556 pid:31728] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:00:28,547 [tid:12556 pid:31728] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:00:28,550 [tid:12556 pid:31728] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:00:28,552 [tid:12556 pid:31728] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:00:28,930 [tid:12556 pid:31728] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:00:29,283 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 16:00:29,438 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:00:29,609 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 16:00:29,765 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:00:29,920 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 16:00:30,075 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:00:30,219 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 16:00:30,372 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:00:30,528 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:00:30,676 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 16:00:30,837 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 16:00:30,990 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 16:00:31,314 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 16:00:31,474 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:00:31,629 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:00:31,781 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 16:00:31,947 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:00:32,138 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 16:00:32,336 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:00:32,507 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 16:00:32,690 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:00:32,857 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:00:32,998 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 16:00:33,175 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:00:33,350 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:00:33,519 [tid:12556 pid:31728] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:00:33,879 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 16:00:34,038 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 16:00:34,203 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:34,374 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:34,526 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 16:00:34,684 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:34,846 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 16:00:35,019 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:35,164 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 16:00:35,310 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:35,449 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 16:00:35,604 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:35,763 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 16:00:35,935 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:36,103 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:00:36,269 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 16:00:36,442 [tid:12556 pid:31728] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:00:36,610 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:00:36,758 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:00:36,902 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:00:37,053 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:00:37,205 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:00:37,518 [tid:12556 pid:31728] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:01:32,710 [tid:34324 pid:26120] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:01:32,720 [tid:34324 pid:26120] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:01:32,723 [tid:34324 pid:26120] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:01:32,891 [tid:34324 pid:26120] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:01:33,079 [tid:34324 pid:26120] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:01:33,231 [tid:34324 pid:26120] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:01:33,395 [tid:34324 pid:26120] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:01:33,546 [tid:34324 pid:26120] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:01:33,694 [tid:34324 pid:26120] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:01:34,012 [tid:34324 pid:26120] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:28:57,634 [tid:21448 pid:32712] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:28:57,638 [tid:21448 pid:32712] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:28:57,638 [tid:21448 pid:32712] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:28:57,828 [tid:21448 pid:32712] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:29:30,206 [tid:416 pid:5664] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:30:55,468 [tid:28472 pid:30580] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:30:55,475 [tid:28472 pid:30580] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:30:55,476 [tid:28472 pid:30580] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:30:55,786 [tid:28472 pid:30580] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 'PgSqlHelper' object has no attribute 'execute_sql' +2026-04-30 16:30:56,956 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 16:30:57,125 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 16:30:57,281 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:57,451 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:57,621 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:57,795 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:57,974 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:58,142 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:58,328 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:58,471 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:30:58,608 [tid:28472 pid:30580] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 16:31:54,486 [tid:19464 pid:23880] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:31:54,492 [tid:19464 pid:23880] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:31:54,493 [tid:19464 pid:23880] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:31:56,610 [tid:19464 pid:23880] pgsqlhelper.py[line:92] ERROR PostgreSQL执行SQL失败: relation "sys_user_fingerprint" does not exist +LINE 1: DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id ... + ^ +, SQL: DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id FROM sys_user WHERE username = %s) +2026-04-30 16:31:56,611 [tid:19464 pid:23880] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 数据库操作失败,SQL语句:DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id FROM sys_user WHERE username = %s), 错误: relation "sys_user_fingerprint" does not exist +LINE 1: DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id ... + ^ + +2026-04-30 16:32:14,408 [tid:31976 pid:29448] pgsqlhelper.py[line:92] ERROR PostgreSQL执行SQL失败: relation "sys_user_fingerprint" does not exist +LINE 1: DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id ... + ^ +, SQL: DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id FROM sys_user WHERE username = %s) +2026-04-30 16:32:14,413 [tid:31976 pid:29448] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 数据库操作失败,SQL语句:DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id FROM sys_user WHERE username = %s), 错误: relation "sys_user_fingerprint" does not exist +LINE 1: DELETE FROM sys_user_fingerprint WHERE user_id = (SELECT id ... + ^ + +2026-04-30 16:32:28,618 [tid:12164 pid:28480] pgsqlhelper.py[line:114] INFO SQL语句:SELECT * FROM sys_user LIMIT 1 +2026-04-30 16:32:30,496 [tid:12164 pid:28480] pgsqlhelper.py[line:92] ERROR PostgreSQL执行SQL失败: relation "sys_user" does not exist +LINE 1: SELECT * FROM sys_user LIMIT 1 + ^ +, SQL: SELECT * FROM sys_user LIMIT 1 +2026-04-30 16:35:31,316 [tid:9204 pid:8964] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:35:31,319 [tid:9204 pid:8964] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:35:31,320 [tid:9204 pid:8964] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:35:33,296 [tid:9204 pid:8964] pgsqlhelper.py[line:92] ERROR PostgreSQL执行SQL失败: column "fingerprint" of relation "system_users" does not exist +LINE 1: UPDATE system_users SET fingerprint = '' WHERE username = 'j... + ^ +, SQL: UPDATE system_users SET fingerprint = '' WHERE username = %s +2026-04-30 16:35:33,300 [tid:9204 pid:8964] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 数据库操作失败,SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s, 错误: column "fingerprint" of relation "system_users" does not exist +LINE 1: UPDATE system_users SET fingerprint = '' WHERE username = 'j... + ^ + +2026-04-30 16:35:49,006 [tid:10444 pid:11632] pgsqlhelper.py[line:92] ERROR PostgreSQL执行SQL失败: column "fingerprint" of relation "system_users" does not exist +LINE 1: UPDATE system_users SET fingerprint = '' WHERE username = 'j... + ^ +, SQL: UPDATE system_users SET fingerprint = '' WHERE username = %s +2026-04-30 16:35:49,011 [tid:10444 pid:11632] Dlizhan_interface.py[line:70] ERROR 清除指纹锁失败: 数据库操作失败,SQL语句:UPDATE system_users SET fingerprint = '' WHERE username = %s, 错误: column "fingerprint" of relation "system_users" does not exist +LINE 1: UPDATE system_users SET fingerprint = '' WHERE username = 'j... + ^ + +2026-04-30 16:37:10,863 [tid:16624 pid:34168] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:37:10,868 [tid:16624 pid:34168] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:37:10,869 [tid:16624 pid:34168] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:37:11,632 [tid:16624 pid:34168] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:37:11,825 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 16:37:12,822 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:12,997 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 16:37:13,162 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:13,303 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:13,449 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 16:37:13,604 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:37:13,751 [tid:16624 pid:34168] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:37:50,929 [tid:34316 pid:4948] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:37:50,934 [tid:34316 pid:4948] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:37:50,935 [tid:34316 pid:4948] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:37:51,611 [tid:34316 pid:4948] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:37:51,785 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 16:37:51,926 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:52,072 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-04-30 16:37:52,230 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-04-30 16:37:52,400 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:52,541 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 16:37:52,695 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:52,852 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:37:53,023 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 16:37:53,179 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:37:53,352 [tid:34316 pid:4948] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:39:49,085 [tid:31680 pid:13532] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:39:49,088 [tid:31680 pid:13532] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:39:49,088 [tid:31680 pid:13532] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:39:49,641 [tid:31680 pid:13532] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:39:49,826 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 16:39:49,971 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:39:50,101 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-04-30 16:39:50,250 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-04-30 16:39:50,396 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:39:50,532 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 16:39:50,674 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:39:50,828 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:39:50,969 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 16:39:51,127 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:39:51,277 [tid:31680 pid:13532] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:42:52,848 [tid:7612 pid:18148] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:42:52,853 [tid:7612 pid:18148] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:42:52,854 [tid:7612 pid:18148] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:42:53,458 [tid:7612 pid:18148] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:42:53,829 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 16:42:53,994 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 16:42:54,144 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:54,290 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:54,426 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 16:42:54,588 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:54,725 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 16:42:54,878 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:55,039 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 16:42:55,210 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:55,395 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 16:42:55,547 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:55,697 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 16:42:55,854 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:55,999 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:42:56,150 [tid:7612 pid:18148] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 16:43:18,263 [tid:9760 pid:32308] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:43:18,271 [tid:9760 pid:32308] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:43:18,273 [tid:9760 pid:32308] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:43:19,145 [tid:9760 pid:32308] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:43:19,331 [tid:9760 pid:32308] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:43:19,496 [tid:9760 pid:32308] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:43:19,648 [tid:9760 pid:32308] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:43:19,802 [tid:9760 pid:32308] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:43:19,957 [tid:9760 pid:32308] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:43:20,273 [tid:9760 pid:32308] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:43:48,677 [tid:18264 pid:18396] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:43:48,685 [tid:18264 pid:18396] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:43:48,686 [tid:18264 pid:18396] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:43:48,784 [tid:18264 pid:18396] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:43:48,787 [tid:18264 pid:18396] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:43:48,788 [tid:18264 pid:18396] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:43:49,744 [tid:18264 pid:18396] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:43:49,933 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 16:43:50,089 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:43:50,262 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-04-30 16:43:50,416 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-04-30 16:43:50,586 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:43:50,744 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 16:43:50,899 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:43:51,049 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:43:51,202 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 16:43:51,368 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:43:51,528 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:43:51,826 [tid:18264 pid:18396] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:43:52,180 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 16:43:52,339 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:43:52,501 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 16:43:52,656 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:43:52,798 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 16:43:52,959 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:43:53,102 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 16:43:53,260 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:43:53,411 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:43:53,556 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 16:43:53,713 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 16:43:53,867 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 16:43:54,185 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 16:43:54,344 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:43:54,509 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:43:54,672 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 16:43:54,823 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:43:54,974 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 16:43:55,151 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:43:55,295 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 16:43:55,461 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:43:55,614 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:43:55,763 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 16:43:55,927 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:43:56,089 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:43:56,370 [tid:18264 pid:18396] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:43:56,726 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 16:43:56,878 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 16:43:57,039 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:57,209 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:57,352 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 16:43:57,523 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:57,680 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 16:43:57,843 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:57,990 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 16:43:58,147 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:58,295 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 16:43:58,456 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:58,609 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 16:43:58,771 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:58,918 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:43:59,052 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 16:43:59,344 [tid:18264 pid:18396] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:43:59,523 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:43:59,681 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:43:59,861 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:44:00,031 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:44:00,197 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:44:00,496 [tid:18264 pid:18396] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:45:11,376 [tid:3932 pid:24164] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:45:11,391 [tid:3932 pid:24164] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:45:11,394 [tid:3932 pid:24164] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:45:12,824 [tid:3932 pid:24164] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:45:13,030 [tid:3932 pid:24164] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:45:13,232 [tid:3932 pid:24164] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:45:13,392 [tid:3932 pid:24164] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:45:13,562 [tid:3932 pid:24164] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:45:13,712 [tid:3932 pid:24164] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:45:14,029 [tid:3932 pid:24164] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:48:13,096 [tid:25840 pid:32920] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:48:13,103 [tid:25840 pid:32920] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:48:13,104 [tid:25840 pid:32920] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:48:13,842 [tid:25840 pid:32920] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:48:14,045 [tid:25840 pid:32920] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:48:53,801 [tid:26004 pid:26924] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:48:53,807 [tid:26004 pid:26924] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:48:53,809 [tid:26004 pid:26924] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:48:53,881 [tid:26004 pid:26924] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:48:53,884 [tid:26004 pid:26924] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:48:53,885 [tid:26004 pid:26924] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:48:54,703 [tid:26004 pid:26924] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:48:54,896 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 16:48:55,049 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:48:55,202 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-04-30 16:48:55,364 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-04-30 16:48:55,520 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:48:55,661 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 16:48:55,815 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:48:55,951 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:48:56,091 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 16:48:56,242 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:48:56,397 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:48:56,667 [tid:26004 pid:26924] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:48:56,984 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 16:48:57,136 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:48:57,296 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 16:48:57,460 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:48:57,634 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 16:48:57,800 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:48:58,051 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 16:48:58,211 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:48:58,367 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:48:58,519 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 16:48:58,694 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 16:48:58,858 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 16:48:59,159 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 16:48:59,316 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:48:59,465 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:48:59,625 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 16:48:59,783 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:48:59,931 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 16:49:00,084 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:49:00,223 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 16:49:00,388 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:49:00,538 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:49:00,681 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 16:49:00,841 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:49:01,013 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:49:01,285 [tid:26004 pid:26924] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:49:01,621 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 16:49:01,770 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 16:49:01,942 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:02,103 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:02,265 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 16:49:02,418 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:02,571 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 16:49:02,728 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:02,878 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 16:49:03,045 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:03,193 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 16:49:03,354 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:03,511 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 16:49:03,665 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:03,825 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:49:03,973 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 16:49:04,256 [tid:26004 pid:26924] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:49:04,425 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:49:04,580 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:49:04,732 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:49:04,888 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:49:05,055 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:49:05,390 [tid:26004 pid:26924] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:50:51,112 [tid:12048 pid:34108] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:50:51,117 [tid:12048 pid:34108] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:50:51,117 [tid:12048 pid:34108] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:50:51,153 [tid:12048 pid:34108] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 16:50:51,155 [tid:12048 pid:34108] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 16:50:51,155 [tid:12048 pid:34108] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 16:50:51,779 [tid:12048 pid:34108] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:50:51,968 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 16:50:52,132 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:50:52,303 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-04-30 16:50:52,451 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-04-30 16:50:52,603 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:50:52,798 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 16:50:52,965 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:50:53,093 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 16:50:53,241 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 16:50:53,393 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:50:53,543 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 16:50:53,816 [tid:12048 pid:34108] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:50:54,148 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 16:50:54,302 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:50:54,447 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 16:50:54,607 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:50:54,750 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 16:50:54,920 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:50:55,067 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 16:50:55,230 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:50:55,367 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 16:50:55,519 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 16:50:55,682 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 16:50:55,830 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 16:50:56,138 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 16:50:56,299 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:50:56,449 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:50:56,579 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 16:50:56,733 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:50:56,883 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 16:50:57,045 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:50:57,196 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 16:50:57,362 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:50:57,522 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 16:50:57,659 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 16:50:57,829 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:50:57,969 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 16:50:58,208 [tid:12048 pid:34108] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:50:58,501 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 16:50:58,656 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 16:50:58,806 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:50:58,966 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:50:59,102 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 16:50:59,258 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:50:59,394 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 16:50:59,540 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:50:59,677 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 16:50:59,818 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:50:59,966 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 16:51:00,123 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:51:00,262 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 16:51:00,446 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:51:00,584 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 16:51:00,732 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 16:51:01,003 [tid:12048 pid:34108] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 16:51:01,178 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:51:01,341 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 16:51:01,494 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:51:01,638 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 16:51:01,788 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 16:51:02,084 [tid:12048 pid:34108] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 17:03:49,298 [tid:22416 pid:23520] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:03:49,301 [tid:22416 pid:23520] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:03:49,302 [tid:22416 pid:23520] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:03:49,914 [tid:22416 pid:23520] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:05:09,540 [tid:17504 pid:16716] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:05:09,543 [tid:17504 pid:16716] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:05:09,544 [tid:17504 pid:16716] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:05:10,146 [tid:17504 pid:16716] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:05:10,487 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板分页 =========== +2026-04-30 17:05:10,649 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:10,800 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板详情 =========== +2026-04-30 17:05:10,954 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 保存运费模板信息(含规则与子表) =========== +2026-04-30 17:05:11,119 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:11,258 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:05:11,412 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:11,548 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 删除运费模板信息 =========== +2026-04-30 17:05:12,037 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:12,171 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:12,325 [tid:17504 pid:16716] Dlizhan_interface.py[line:45] INFO =========== 批量删除运费模板信息 =========== +2026-04-30 17:05:51,909 [tid:25520 pid:2912] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:05:51,913 [tid:25520 pid:2912] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:05:51,913 [tid:25520 pid:2912] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:05:52,548 [tid:25520 pid:2912] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:05:52,900 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板分页 =========== +2026-04-30 17:05:53,051 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:53,193 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板详情 =========== +2026-04-30 17:05:53,330 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 保存运费模板信息(含规则与子表) =========== +2026-04-30 17:05:53,490 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:53,625 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:05:53,767 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:53,903 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:05:54,047 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 删除运费模板信息 =========== +2026-04-30 17:05:54,196 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:54,334 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:05:54,466 [tid:25520 pid:2912] Dlizhan_interface.py[line:45] INFO =========== 批量删除运费模板信息 =========== +2026-04-30 17:11:01,338 [tid:23752 pid:26896] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:11:01,342 [tid:23752 pid:26896] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:11:01,342 [tid:23752 pid:26896] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:11:01,944 [tid:23752 pid:26896] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:11:02,343 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板分页 =========== +2026-04-30 17:11:02,496 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:11:02,643 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板详情 =========== +2026-04-30 17:11:02,790 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 保存运费模板信息(含规则与子表) =========== +2026-04-30 17:11:02,932 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:11:03,081 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:11:03,242 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:11:03,370 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:11:03,503 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 删除运费模板信息 =========== +2026-04-30 17:11:03,665 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:11:03,810 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:11:03,947 [tid:23752 pid:26896] Dlizhan_interface.py[line:45] INFO =========== 批量删除运费模板信息 =========== +2026-04-30 17:47:12,086 [tid:17188 pid:34316] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:47:12,090 [tid:17188 pid:34316] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:47:12,091 [tid:17188 pid:34316] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:47:12,690 [tid:17188 pid:34316] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:47:12,950 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理分页 =========== +2026-04-30 17:47:13,115 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:47:13,261 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:47:13,403 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理详情 =========== +2026-04-30 17:47:13,555 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:47:13,692 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 更新Banner管理 =========== +2026-04-30 17:47:13,867 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:47:13,998 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 删除Banner管理 =========== +2026-04-30 17:47:14,146 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:47:14,279 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:47:14,420 [tid:17188 pid:34316] Dlizhan_interface.py[line:45] INFO =========== 批量删除Banner管理 =========== +2026-04-30 17:49:53,967 [tid:17528 pid:34480] UserManage.py[line:44] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:49:53,970 [tid:17528 pid:34480] UserManage.py[line:52] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:49:53,970 [tid:17528 pid:34480] UserManage.py[line:35] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:49:53,994 [tid:17528 pid:34480] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-04-30 17:49:53,995 [tid:17528 pid:34480] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-04-30 17:49:53,995 [tid:17528 pid:34480] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-04-30 17:49:54,537 [tid:17528 pid:34480] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:49:54,719 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理分页 =========== +2026-04-30 17:49:54,867 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:49:55,014 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:49:55,177 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理详情 =========== +2026-04-30 17:49:55,337 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:49:55,473 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 更新Banner管理 =========== +2026-04-30 17:49:55,623 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:49:55,769 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 删除Banner管理 =========== +2026-04-30 17:49:55,925 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:49:56,069 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-04-30 17:49:56,208 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 批量删除Banner管理 =========== +2026-04-30 17:49:56,468 [tid:17528 pid:34480] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:49:56,631 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-04-30 17:49:56,795 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 17:49:56,944 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-04-30 17:49:57,083 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-04-30 17:49:57,234 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 17:49:57,371 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-04-30 17:49:57,525 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 17:49:57,659 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-04-30 17:49:57,807 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-04-30 17:49:58,030 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 17:49:58,170 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-04-30 17:49:58,443 [tid:17528 pid:34480] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:49:58,795 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-04-30 17:49:58,959 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 17:49:59,116 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-04-30 17:49:59,256 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 17:49:59,397 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-04-30 17:49:59,555 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 17:49:59,702 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-04-30 17:49:59,860 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 17:50:00,001 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-04-30 17:50:00,137 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-04-30 17:50:00,298 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-04-30 17:50:00,445 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-04-30 17:50:00,744 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-04-30 17:50:00,925 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 17:50:01,076 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 17:50:01,210 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-04-30 17:50:01,364 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 17:50:01,509 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-04-30 17:50:01,681 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 17:50:01,821 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-04-30 17:50:01,973 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 17:50:02,136 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-04-30 17:50:02,277 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-04-30 17:50:02,429 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 17:50:02,585 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-04-30 17:50:02,842 [tid:17528 pid:34480] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:50:03,168 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板分页 =========== +2026-04-30 17:50:03,348 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:50:03,494 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板详情 =========== +2026-04-30 17:50:03,636 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 保存运费模板信息(含规则与子表) =========== +2026-04-30 17:50:03,806 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:50:03,959 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:50:04,110 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:50:04,248 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-04-30 17:50:04,384 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 删除运费模板信息 =========== +2026-04-30 17:50:04,536 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:50:04,668 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-04-30 17:50:04,799 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 批量删除运费模板信息 =========== +2026-04-30 17:50:05,049 [tid:17528 pid:34480] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:50:05,362 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-04-30 17:50:05,520 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-04-30 17:50:05,684 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:05,860 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:06,008 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-04-30 17:50:06,156 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:06,296 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-04-30 17:50:06,457 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:06,598 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-04-30 17:50:06,753 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:06,902 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-04-30 17:50:07,051 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:07,189 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-04-30 17:50:07,341 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:07,493 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-04-30 17:50:07,631 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-04-30 17:50:07,891 [tid:17528 pid:34480] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-04-30 17:50:08,041 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 17:50:08,191 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-04-30 17:50:08,331 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 17:50:08,470 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-04-30 17:50:08,624 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-04-30 17:50:08,913 [tid:17528 pid:34480] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-05-06 10:00:45,919 [tid:14556 pid:31208] UserManage.py[line:44] INFO 尝试读取配置文件: c:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\library\BusinessKw\JoyHub\../../../../test_case/Resource/AdapterKws/hh-qa.robot +2026-05-06 10:00:45,929 [tid:14556 pid:31208] UserManage.py[line:57] ERROR 读取robot配置文件失败: [Errno 2] No such file or directory: 'c:\\Users\\a\\PyCharmMiscProject\\smart-management-auto-test\\dulizhan\\library\\BusinessKw\\JoyHub\\../../../../test_case/Resource/AdapterKws/hh-qa.robot' +2026-05-06 10:00:45,929 [tid:14556 pid:31208] UserManage.py[line:37] WARNING 未从配置文件读取到JoyHub Token +2026-05-06 10:00:45,980 [tid:14556 pid:31208] RoleManage.py[line:41] INFO 尝试读取配置文件: C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot +2026-05-06 10:00:45,981 [tid:14556 pid:31208] RoleManage.py[line:48] INFO 匹配到变量 joyhub_login_token = # +2026-05-06 10:00:45,981 [tid:14556 pid:31208] RoleManage.py[line:34] INFO 从配置文件读取JoyHub Token成功: # +2026-05-06 10:00:46,618 [tid:14556 pid:31208] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 10:00:46,860 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理分页 =========== +2026-05-06 10:00:47,021 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 10:00:47,171 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 10:00:47,306 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得Banner管理详情 =========== +2026-05-06 10:00:47,453 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 10:00:47,586 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 更新Banner管理 =========== +2026-05-06 10:00:47,737 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 10:00:47,867 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 删除Banner管理 =========== +2026-05-06 10:00:48,016 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 10:00:48,164 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建Banner管理 =========== +2026-05-06 10:00:48,294 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 批量删除Banner管理 =========== +2026-05-06 10:00:48,529 [tid:14556 pid:31208] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 10:00:48,684 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取部门列表 =========== +2026-05-06 10:00:48,836 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 10:00:48,981 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得部门信息 =========== +2026-05-06 10:00:49,145 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 更新部门 =========== +2026-05-06 10:00:49,305 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 10:00:49,449 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 删除部门 =========== +2026-05-06 10:00:49,612 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 10:00:49,747 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建部门 =========== +2026-05-06 10:00:49,879 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 批量删除部门 =========== +2026-05-06 10:00:50,031 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-05-06 10:00:50,171 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取部门精简信息列表 =========== +2026-05-06 10:00:50,449 [tid:14556 pid:31208] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 10:00:50,761 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得岗位分页列表 =========== +2026-05-06 10:00:50,912 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 10:00:51,056 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得岗位信息 =========== +2026-05-06 10:00:51,188 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 10:00:51,317 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改岗位 =========== +2026-05-06 10:00:51,465 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 10:00:51,592 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 删除岗位 =========== +2026-05-06 10:00:51,735 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 10:00:51,873 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建岗位 =========== +2026-05-06 10:00:52,012 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 批量删除岗位 =========== +2026-05-06 10:00:52,178 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取岗位全列表 =========== +2026-05-06 10:00:52,314 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取岗位精简列表 =========== +2026-05-06 10:00:52,593 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得角色分页 =========== +2026-05-06 10:00:52,756 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 10:00:52,916 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 10:00:53,047 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得角色信息 =========== +2026-05-06 10:00:53,222 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 10:00:53,366 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改角色 =========== +2026-05-06 10:00:53,528 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 10:00:53,675 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 删除角色 =========== +2026-05-06 10:00:53,835 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 10:00:53,971 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建角色 =========== +2026-05-06 10:00:54,117 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 批量删除角色 =========== +2026-05-06 10:00:54,273 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-05-06 10:00:54,411 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取角色精简信息列表 =========== +2026-05-06 10:00:54,683 [tid:14556 pid:31208] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 10:00:55,022 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板分页 =========== +2026-05-06 10:00:55,166 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 10:00:55,332 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得运费模板详情 =========== +2026-05-06 10:00:55,481 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 保存运费模板信息(含规则与子表) =========== +2026-05-06 10:00:55,623 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 10:00:55,769 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-05-06 10:00:55,924 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 10:00:56,053 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 更新运费模板信息 =========== +2026-05-06 10:00:56,191 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 删除运费模板信息 =========== +2026-05-06 10:00:56,350 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 10:00:56,497 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建运费模板信息 =========== +2026-05-06 10:00:56,634 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 批量删除运费模板信息 =========== +2026-05-06 10:00:56,899 [tid:14556 pid:31208] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 10:00:57,220 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得用户分页列表 =========== +2026-05-06 10:00:57,372 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获取用户精简信息列表 =========== +2026-05-06 10:00:57,523 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:57,674 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:57,817 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得用户详情 =========== +2026-05-06 10:00:57,975 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:58,112 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改用户 =========== +2026-05-06 10:00:58,262 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:58,400 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 重置用户密码 =========== +2026-05-06 10:00:58,550 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:58,679 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改用户状态 =========== +2026-05-06 10:00:58,832 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:58,975 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 删除用户 =========== +2026-05-06 10:00:59,149 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:59,276 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 创建用户 =========== +2026-05-06 10:00:59,444 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 批量删除用户 =========== +2026-05-06 10:00:59,717 [tid:14556 pid:31208] Dlizhan_interface.py[line:67] INFO 清除用户 joytest 的指纹锁,影响行数: 1 +2026-05-06 10:00:59,917 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-05-06 10:01:00,069 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 获得登录用户信息 =========== +2026-05-06 10:01:00,201 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-05-06 10:01:00,336 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人信息 =========== +2026-05-06 10:01:00,485 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-05-06 10:01:00,756 [tid:14556 pid:31208] Dlizhan_interface.py[line:45] INFO =========== 修改用户个人密码 =========== +2026-05-06 10:01:00,930 [tid:14556 pid:31208] ZZYY_interface.py[line:41] INFO your input:{} +2026-05-06 10:01:00,931 [tid:14556 pid:31208] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:purchase +2026-05-06 10:01:00,932 [tid:14556 pid:31208] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/erp/purchase-workbench/get-todo +2026-05-06 10:01:00,933 [tid:14556 pid:31208] runner.py[line:117] INFO 请求数据:{} +2026-05-06 10:01:00,933 [tid:14556 pid:31208] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-05-06 10:01:01,156 [tid:14556 pid:31208] runner.py[line:183] INFO 请求头headers:{'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': '31e5090cabe4419a96608963ad20ff6b', 'tenant-id': '1', 'ssotoken': '31e5090cabe4419a96608963ad20ff6b', 'sso-token': '31e5090cabe4419a96608963ad20ff6b', 'Accesstoken': '31e5090cabe4419a96608963ad20ff6b', 'access-token': '31e5090cabe4419a96608963ad20ff6b', 'token': '31e5090cabe4419a96608963ad20ff6b'} +2026-05-06 10:01:01,361 [tid:14556 pid:31208] runner.py[line:202] INFO ------状态码:200, 返回信息:{'code': 1002004008, 'msg': '登录状态已失效,请刷新', 'data': None} +2026-05-06 10:01:01,363 [tid:14556 pid:31208] runner.py[line:235] INFO 返回数据:{'code': 1002004008, 'msg': '登录状态已失效,请刷新', 'data': None} +2026-05-06 10:01:01,552 [tid:14556 pid:31208] ZZYY_interface.py[line:58] INFO your input:{'pageNo': 1, 'pageSize': 10, 'supplier_company_ids': ['334'], 'payment_status': '0', 'status': '0', 'order_sn': 'PO251209048'} +2026-05-06 10:01:01,553 [tid:14556 pid:31208] runner.py[line:115] INFO 登录系统为smart-management-api-st.best-envision.com,用户名为手动输入:purchase +2026-05-06 10:01:01,553 [tid:14556 pid:31208] runner.py[line:116] INFO 请求地址:https://smart-management-api-st.best-envision.com/admin-api/erp/purchase-order/page +2026-05-06 10:01:01,554 [tid:14556 pid:31208] runner.py[line:117] INFO 请求数据:{'json': {'pageNo': 1, 'pageSize': 10, 'supplier_company_ids': ['334'], 'payment_status': '0', 'status': '0', 'order_sn': 'PO251209048'}} +2026-05-06 10:01:01,554 [tid:14556 pid:31208] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-05-06 10:01:01,697 [tid:14556 pid:31208] runner.py[line:183] INFO 请求头headers:{'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': '61690cdaa8e944deae8a12bf9f39c0fb', 'tenant-id': '1', 'ssotoken': '61690cdaa8e944deae8a12bf9f39c0fb', 'sso-token': '61690cdaa8e944deae8a12bf9f39c0fb', 'Accesstoken': '61690cdaa8e944deae8a12bf9f39c0fb', 'access-token': '61690cdaa8e944deae8a12bf9f39c0fb', 'token': '61690cdaa8e944deae8a12bf9f39c0fb'} +2026-05-06 10:01:01,849 [tid:14556 pid:31208] runner.py[line:202] INFO ------状态码:200, 返回信息:{'code': 401, 'msg': '账号未登录', 'data': None} +2026-05-06 10:01:01,851 [tid:14556 pid:31208] runner.py[line:221] WARNING 缓存session过期,清理缓存! +2026-05-06 10:01:01,852 [tid:14556 pid:31208] runner.py[line:140] INFO 使用配置文件中的登录信息进行登录 +2026-05-06 10:01:01,955 [tid:14556 pid:31208] runner.py[line:183] INFO 请求头headers:{'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': '6f6025728f3a48ed89c6c8e3843bf79d', 'tenant-id': '1', 'ssotoken': '6f6025728f3a48ed89c6c8e3843bf79d', 'sso-token': '6f6025728f3a48ed89c6c8e3843bf79d', 'Accesstoken': '6f6025728f3a48ed89c6c8e3843bf79d', 'access-token': '6f6025728f3a48ed89c6c8e3843bf79d', 'token': '6f6025728f3a48ed89c6c8e3843bf79d'} +2026-05-06 10:01:02,073 [tid:14556 pid:31208] runner.py[line:202] INFO ------状态码:200, 返回信息:{'code': 401, 'msg': '账号未登录', 'data': None} +2026-05-06 10:01:02,075 [tid:14556 pid:31208] runner.py[line:221] WARNING 缓存session过期,清理缓存! +2026-05-06 10:01:02,076 [tid:14556 pid:31208] runner.py[line:235] INFO 返回数据:{'code': 401, 'msg': '账号未登录', 'data': None} diff --git a/base_framework/base_config/config.ini b/base_framework/base_config/config.ini index 17d8c2a..b7ee7aa 100644 --- a/base_framework/base_config/config.ini +++ b/base_framework/base_config/config.ini @@ -17,3 +17,21 @@ ZZYY = https://smart-management-api-pre.best-envision.com/admin-api ASTWB_owner = 18202810506 谯新久 = 18202810506 ASTWB_to_dd = 2079cb3e311ab6a37138a6d4671181661d211c12a1532c2012ae7e6b397996c3 + +[Mysql] +db_joyhub_svr = 124.220.32.45 +db_joyhub_user = joyhub +db_joyhub_password = e364be29-6089-4610-97d5-0037a28d0703 +db_joyhub_dbname = joyhub_website_st + +[PostgreSQL] +db_joyhub_host = 124.220.32.45 +db_joyhub_port = 18666 +db_joyhub_dbname = joyhub_website_st +db_joyhub_user = joyhub +db_joyhub_password = e364be29-6089-4610-97d5-0037a28d0703 +db_min_cached = 2 +db_max_cached = 10 +db_max_shared = 10 +db_max_connections = 20 +db_max_usage = 0 \ No newline at end of file diff --git a/base_framework/base_config/config_hh_qa.ini b/base_framework/base_config/config_hh_qa.ini index dca7458..e83e24a 100644 --- a/base_framework/base_config/config_hh_qa.ini +++ b/base_framework/base_config/config_hh_qa.ini @@ -5,6 +5,16 @@ db_test_port = 8566 db_test_dbname = smart_management_st db_test_user = sm_test_user db_test_password = Test@736141 +db_joyhub_host = 124.220.32.45 +db_joyhub_port = 18666 +db_joyhub_name = joyhub_website_st +db_joyhub_user = joyhub +db_joyhub_password = e364be29-6089-4610-97d5-0037a28d0703 +db_joyhub_min_cached = 2 +db_joyhub_max_cached = 10 +db_joyhub_max_shared = 10 +db_joyhub_max_connecyions = 20 +db_joyhub_max_usage = 0 db_charset = utf8 db_min_cached = 10 db_max_cached = 20 diff --git a/base_framework/public_tools/db_config.py b/base_framework/public_tools/db_config.py index 966e0ef..40fd8e4 100644 --- a/base_framework/public_tools/db_config.py +++ b/base_framework/public_tools/db_config.py @@ -5,12 +5,20 @@ Author: qiaoxinjiu Create Data: 2020/11/10 10:26 """ import pymysql +import os DB_TEST_HOST = "mysql.qa.huohua.cn" DB_TEST_PORT = 3306 DB_TEST_DBNAME = "crmthirdparty" DB_TEST_USER = "qa-dev" -DB_TEST_PASSWORD = "jaeg3SCQt0" +DB_TEST_PASSWORD = os.environ.get("DB_TEST_PASSWORD", "jaeg3SCQt0") + +# JoyHub 数据库配置 +DB_JOYHUB_HOST = os.environ.get("DB_JOYHUB_HOST", "124.220.32.45") +DB_JOYHUB_PORT = int(os.environ.get("DB_JOYHUB_PORT", "18666")) +DB_JOYHUB_DBNAME = os.environ.get("DB_JOYHUB_DBNAME", "joyhub_website_st") +DB_JOYHUB_USER = os.environ.get("DB_JOYHUB_USER", "joyhub") +DB_JOYHUB_PASSWORD = os.environ.get("DB_JOYHUB_PASSWORD", "e364be29-6089-4610-97d5-0037a28d0703") # 数据库连接编码 DB_CHARSET = "utf8" # mincached : 启动时开启的闲置连接数量(缺省值 0 开始时不创建连接) diff --git a/base_framework/public_tools/pgsqlhelper.py b/base_framework/public_tools/pgsqlhelper.py index 001e093..b74d047 100644 --- a/base_framework/public_tools/pgsqlhelper.py +++ b/base_framework/public_tools/pgsqlhelper.py @@ -80,9 +80,11 @@ PostgreSQL连接失败! # count : 为改变的数据条数 if param: # PostgreSQL使用 %s 作为占位符,与MySQL相同 - count = cursor.execute(sql, param) + cursor.execute(sql, param) else: - count = cursor.execute(sql) + cursor.execute(sql) + # PostgreSQL中,cursor.execute()返回None,受影响行数需要通过rowcount获取 + count = cursor.rowcount conn.commit() if auto_close: self.close(cursor, conn) diff --git a/dulizhan/__init__.py b/dulizhan/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/BusinessKw/JoyHub/BannerManage.py b/dulizhan/library/BusinessKw/JoyHub/BannerManage.py new file mode 100644 index 0000000..a0407be --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/BannerManage.py @@ -0,0 +1,176 @@ +import logging +import allure +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_log = logging.getLogger("logger") + + +class BannerManage(DlzhanInterface): + def __init__(self): + super().__init__() + + @allure.step("创建Banner") + def kw_joyhub_banner_create_post(self, position, platform, lang, rank_num, banner_type, status, interval_time, id=0, title="", sub_title="", image=None, link="", cover_image=None): + """ + 创建Banner管理业务关键字 + :param id: 主键,新增为0 + :param position: 位置 + :param title: 标题 + :param sub_title: 副标题 + :param image: 图片,格式{'url': 'https://xxx', 'name': 'xxx', 'mime_type': 'image/webp'} + :param link: 链接 + :param platform: 适用平台(1PC 2手机) + :param lang: 语言(en 英语 de 德语 ja 日语) + :param rank_num: 排序号 + :param banner_type: 类型 + :param status: 状态 1-启用,2-停用 + :param interval_time: 轮播时间(秒) + :param cover_image: 缩略图 + :return: 响应结果 + """ + obj_log.info(f"创建Banner - position: {position}, platform: {platform}, lang: {lang}, rankNum: {rank_num}, type: {banner_type}, status: {status}") + + if image is None: + image = {'url': 'https://www.toendi.com/static/image/cd94c191561c4a37a04c78fca2913851.webp', 'name': 'Test Banner Image', 'mime_type': 'image/webp'} + + params = { + "id": id, + "position": position, + "title": title, + "subTitle": sub_title, + "image": image, + "link": link, + "platform": platform, + "lang": lang, + "rankNum": rank_num, + "type": banner_type, + "status": status, + "intervalTime": interval_time, + "coverImage": cover_image + } + + resp = self.kw_in_joyhub_banner_create_post(**params) + obj_log.info(f"创建Banner响应: {resp}") + + return resp + + @allure.step("删除Banner") + def kw_joyhub_banner_delete_delete(self, banner_id): + """ + 删除Banner管理业务关键字 + :param banner_id: Banner编号 + :return: 响应结果 + """ + obj_log.info(f"删除Banner - id: {banner_id}") + + resp = self.kw_in_joyhub_banner_delete_delete(banner_id=banner_id) + obj_log.info(f"删除Banner响应: {resp}") + + return resp + + @allure.step("批量删除Banner") + def kw_joyhub_banner_delete_list_delete(self, banner_ids): + """ + 批量删除Banner管理业务关键字 + :param banner_ids: Banner编号列表 + :return: 响应结果 + """ + obj_log.info(f"批量删除Banner - ids: {banner_ids}") + + resp = self.kw_in_joyhub_banner_delete_list_delete(ids=banner_ids) + obj_log.info(f"批量删除Banner响应: {resp}") + + return resp + + @allure.step("获得Banner详情") + def kw_joyhub_banner_get_get(self, banner_id): + """ + 获得Banner管理详情业务关键字 + :param banner_id: Banner编号 + :return: 响应结果 + """ + obj_log.info(f"获得Banner详情 - id: {banner_id}") + + resp = self.kw_in_joyhub_banner_get_get(banner_id=banner_id) + obj_log.info(f"获得Banner详情响应: {resp}") + + return resp + + @allure.step("获得Banner分页列表") + def kw_joyhub_banner_page_get(self, page_no=1, page_size=10, **kwargs): + """ + 获得Banner管理分页业务关键字 + :param page_no: 页码 + :param page_size: 每页条数 + :param position: 位置 + :param title: 标题 + :param sub_title: 副标题 + :param platform: 适用平台(1PC 2手机) + :param lang: 语言 + :param banner_type: 类型 + :param status: 状态 + :return: 响应结果 + """ + obj_log.info(f"获得Banner分页列表 - pageNo: {page_no}, pageSize: {page_size}") + + params = { + "pageNo": page_no, + "pageSize": page_size, + "position": kwargs.get("position", ""), + "title": kwargs.get("title", ""), + "subTitle": kwargs.get("sub_title", ""), + "platform": kwargs.get("platform", ""), + "lang": kwargs.get("lang", ""), + "type": kwargs.get("banner_type", ""), + "status": kwargs.get("status", "") + } + + resp = self.kw_in_joyhub_banner_page_get(**params) + obj_log.info(f"获得Banner分页列表响应: {resp}") + + return resp + + @allure.step("更新Banner") + def kw_joyhub_banner_update_put(self, banner_id, position, platform, lang, rank_num, banner_type, status, interval_time, title="", sub_title="", image=None, link="", cover_image=None): + """ + 更新Banner管理业务关键字 + :param banner_id: 主键 + :param position: 位置 + :param title: 标题 + :param sub_title: 副标题 + :param image: 图片 + :param link: 链接 + :param platform: 适用平台(1PC 2手机) + :param lang: 语言(en 英语 de 德语 ja 日语) + :param rank_num: 排序号 + :param banner_type: 类型 + :param status: 状态 1-启用,2-停用 + :param interval_time: 轮播时间(秒) + :param cover_image: 缩略图 + :return: 响应结果 + """ + obj_log.info(f"更新Banner - id: {banner_id}, position: {position}, platform: {platform}, lang: {lang}, rankNum: {rank_num}, type: {banner_type}, status: {status}") + + if image is None: + image = {'url': 'https://www.toendi.com/static/image/cd94c191561c4a37a04c78fca2913851.webp', 'name': 'Updated Banner Image', 'mime_type': 'image/webp'} + + params = { + "id": banner_id, + "position": position, + "title": title, + "subTitle": sub_title, + "image": image, + "link": link, + "platform": platform, + "lang": lang, + "rankNum": rank_num, + "type": banner_type, + "status": status, + "intervalTime": interval_time, + "coverImage": cover_image + } + + resp = self.kw_in_joyhub_banner_update_put(**params) + obj_log.info(f"更新Banner响应: {resp}") + + return resp \ No newline at end of file diff --git a/dulizhan/library/BusinessKw/JoyHub/DeptManage.py b/dulizhan/library/BusinessKw/JoyHub/DeptManage.py new file mode 100644 index 0000000..9b9f80d --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/DeptManage.py @@ -0,0 +1,174 @@ +import logging +import allure +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_log = logging.getLogger("logger") + + +class DeptManage(DlzhanInterface): + def __init__(self): + super().__init__() + + @allure.step("创建部门") + def kw_joyhub_dept_create_post(self, name, sort, status=1, parent_id=None, leader_user_id=None, phone=None, email=None, code=None): + """ + 创建部门业务关键字 + :param name: 部门名称 + :param sort: 显示顺序 + :param status: 状态 + :param parent_id: 父部门ID + :param leader_user_id: 负责人用户编号 + :param phone: 联系电话 + :param email: 邮箱 + :param code: 部门编码 + :return: 响应结果 + """ + obj_log.info(f"创建部门 - name: {name}, sort: {sort}, status: {status}") + + params = { + "name": name, + "sort": sort, + "status": status + } + + if parent_id is not None: + params["parentId"] = parent_id + if leader_user_id is not None: + params["leaderUserId"] = leader_user_id + if phone: + params["phone"] = phone + if email: + params["email"] = email + if code: + params["code"] = code + + resp = self.kw_in_joyhub_dept_create_post(**params) + obj_log.info(f"创建部门响应: {resp}") + + return resp + + @allure.step("删除部门") + def kw_joyhub_dept_delete_post(self, dept_id): + """ + 删除部门业务关键字 + :param dept_id: 部门编号 + :return: 响应结果 + """ + obj_log.info(f"删除部门 - id: {dept_id}") + + resp = self.kw_in_joyhub_dept_delete_post(dept_id) + obj_log.info(f"删除部门响应: {resp}") + + return resp + + @allure.step("批量删除部门") + def kw_joyhub_dept_delete_list_post(self, ids): + """ + 批量删除部门业务关键字 + :param ids: 部门编号列表 + :return: 响应结果 + """ + obj_log.info(f"批量删除部门 - ids: {ids}") + + resp = self.kw_in_joyhub_dept_delete_list_post(ids) + obj_log.info(f"批量删除部门响应: {resp}") + + return resp + + @allure.step("获得部门信息") + def kw_joyhub_dept_get_get(self, dept_id): + """ + 获得部门信息业务关键字 + :param dept_id: 部门编号 + :return: 响应结果 + """ + obj_log.info(f"获得部门信息 - id: {dept_id}") + + resp = self.kw_in_joyhub_dept_get_get(dept_id) + obj_log.info(f"获得部门信息响应: {resp}") + + return resp + + @allure.step("获取部门列表") + def kw_joyhub_dept_list_get(self, name=None, status=None): + """ + 获取部门列表业务关键字 + :param name: 部门名称(模糊匹配) + :param status: 状态 + :return: 响应结果 + """ + obj_log.info(f"获取部门列表 - name: {name}, status: {status}") + + params = {} + if name: + params["name"] = name + if status is not None: + params["status"] = status + + resp = self.kw_in_joyhub_dept_list_get(**params) + obj_log.info(f"获取部门列表响应: {resp}") + + return resp + + @allure.step("获取部门精简信息列表") + def kw_joyhub_dept_list_all_simple_get(self): + """ + 获取部门精简信息列表业务关键字 + :return: 响应结果 + """ + obj_log.info("获取部门精简信息列表") + + resp = self.kw_in_joyhub_dept_list_all_simple_get() + obj_log.info(f"获取部门精简信息列表响应: {resp}") + + return resp + + @allure.step("获取部门精简信息列表") + def kw_joyhub_dept_simple_list_get(self): + """ + 获取部门精简信息列表业务关键字(另一个接口) + :return: 响应结果 + """ + obj_log.info("获取部门精简信息列表(simple-list)") + + resp = self.kw_in_joyhub_dept_simple_list_get() + obj_log.info(f"获取部门精简信息列表响应: {resp}") + + return resp + + @allure.step("更新部门") + def kw_joyhub_dept_update_put(self, dept_id, name, sort, status=1, parent_id=None, leader_user_id=None, phone=None, email=None): + """ + 更新部门业务关键字 + :param dept_id: 部门编号 + :param name: 部门名称 + :param sort: 显示顺序 + :param status: 状态 + :param parent_id: 父部门ID + :param leader_user_id: 负责人用户编号 + :param phone: 联系电话 + :param email: 邮箱 + :return: 响应结果 + """ + obj_log.info(f"更新部门 - id: {dept_id}, name: {name}, sort: {sort}, status: {status}") + + params = { + "id": dept_id, + "name": name, + "sort": sort, + "status": status + } + + if parent_id is not None: + params["parentId"] = parent_id + if leader_user_id is not None: + params["leaderUserId"] = leader_user_id + if phone: + params["phone"] = phone + if email: + params["email"] = email + + resp = self.kw_in_joyhub_dept_update_put(**params) + obj_log.info(f"更新部门响应: {resp}") + + return resp diff --git a/dulizhan/library/BusinessKw/JoyHub/PostManage.py b/dulizhan/library/BusinessKw/JoyHub/PostManage.py new file mode 100644 index 0000000..4c5ef69 --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/PostManage.py @@ -0,0 +1,197 @@ +import logging +import allure +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_log = logging.getLogger("logger") + + +class PostManage(DlzhanInterface): + def __init__(self): + super().__init__() + + @allure.step("创建岗位") + def kw_joyhub_post_create_post(self, name, code, sort, status, remark=""): + """ + 创建岗位业务关键字 + :param name: 岗位名称 + :param code: 岗位编码 + :param sort: 显示顺序 + :param status: 状态 + :param remark: 备注 + :return: 响应结果 + """ + obj_log.info(f"创建岗位 - name: {name}, code: {code}, sort: {sort}, status: {status}, remark: {remark}") + + params = { + "name": name, + "code": code, + "sort": sort, + "status": status + } + + if remark: + params["remark"] = remark + + resp = self.kw_in_joyhub_post_create_post(**params) + obj_log.info(f"创建岗位响应: {resp}") + + return resp + + @allure.step("删除岗位") + def kw_joyhub_post_delete_post(self, post_id): + """ + 删除岗位业务关键字 + :param post_id: 岗位编号 + :return: 响应结果 + """ + obj_log.info(f"删除岗位 - id: {post_id}") + + resp = self.kw_in_joyhub_post_delete_post(id=post_id) + obj_log.info(f"删除岗位响应: {resp}") + + return resp + + @allure.step("批量删除岗位") + def kw_joyhub_post_delete_list_post(self, ids): + """ + 批量删除岗位业务关键字 + :param ids: 岗位编号列表 + :return: 响应结果 + """ + obj_log.info(f"批量删除岗位 - ids: {ids}") + + resp = self.kw_in_joyhub_post_delete_list_post(ids=ids) + obj_log.info(f"批量删除岗位响应: {resp}") + + return resp + + @allure.step("岗位管理导出") + def kw_joyhub_post_export_get(self, pageNo=1, pageSize=10, code="", name="", status=None): + """ + 岗位管理导出业务关键字 + :param pageNo: 页码 + :param pageSize: 每页条数 + :param code: 岗位编码(模糊匹配) + :param name: 岗位名称(模糊匹配) + :param status: 状态 + :return: 响应结果 + """ + obj_log.info(f"岗位管理导出 - pageNo: {pageNo}, pageSize: {pageSize}, code: {code}, name: {name}, status: {status}") + + params = { + "pageNo": pageNo, + "pageSize": pageSize + } + + if code: + params["code"] = code + if name: + params["name"] = name + if status is not None: + params["status"] = status + + resp = self.kw_in_joyhub_post_export_get(**params) + obj_log.info(f"岗位管理导出响应: {resp}") + + return resp + + @allure.step("获得岗位信息") + def kw_joyhub_post_get_get(self, post_id): + """ + 获得岗位信息业务关键字 + :param post_id: 岗位编号 + :return: 响应结果 + """ + obj_log.info(f"获得岗位信息 - id: {post_id}") + + resp = self.kw_in_joyhub_post_get_get(id=post_id) + obj_log.info(f"获得岗位信息响应: {resp}") + + return resp + + @allure.step("获取岗位全列表") + def kw_joyhub_post_list_all_simple_get(self): + """ + 获取岗位全列表业务关键字 + :return: 响应结果 + """ + obj_log.info("获取岗位全列表") + + resp = self.kw_in_joyhub_post_list_all_simple_get() + obj_log.info(f"获取岗位全列表响应: {resp}") + + return resp + + @allure.step("获得岗位分页列表") + def kw_joyhub_post_page_get(self, pageNo=1, pageSize=10, code="", name="", status=None): + """ + 获得岗位分页列表业务关键字 + :param pageNo: 页码 + :param pageSize: 每页条数 + :param code: 岗位编码(模糊匹配) + :param name: 岗位名称(模糊匹配) + :param status: 状态 + :return: 响应结果 + """ + obj_log.info(f"获得岗位分页列表 - pageNo: {pageNo}, pageSize: {pageSize}, code: {code}, name: {name}, status: {status}") + + params = { + "pageNo": pageNo, + "pageSize": pageSize + } + + if code: + params["code"] = code + if name: + params["name"] = name + if status is not None: + params["status"] = status + + resp = self.kw_in_joyhub_post_page_get(**params) + obj_log.info(f"获得岗位分页列表响应: {resp}") + + return resp + + @allure.step("获取岗位精简列表") + def kw_joyhub_post_simple_list_get(self): + """ + 获取岗位精简列表业务关键字 + :return: 响应结果 + """ + obj_log.info("获取岗位精简列表") + + resp = self.kw_in_joyhub_post_simple_list_get() + obj_log.info(f"获取岗位精简列表响应: {resp}") + + return resp + + @allure.step("修改岗位") + def kw_joyhub_post_update_put(self, name, code, sort, status, post_id=None, remark=""): + """ + 修改岗位业务关键字 + :param name: 岗位名称 + :param code: 岗位编码 + :param sort: 显示顺序 + :param status: 状态 + :param post_id: 岗位编号(可选,更新时需要) + :param remark: 备注 + :return: 响应结果 + """ + obj_log.info(f"修改岗位 - id: {post_id}, name: {name}, code: {code}, sort: {sort}, status: {status}, remark: {remark}") + + params = { + "name": name, + "code": code, + "sort": sort, + "status": status + } + + if post_id: + params["id"] = post_id + if remark: + params["remark"] = remark + + resp = self.kw_in_joyhub_post_update_put(**params) + obj_log.info(f"修改岗位响应: {resp}") + + return resp diff --git a/dulizhan/library/BusinessKw/JoyHub/RoleManage.py b/dulizhan/library/BusinessKw/JoyHub/RoleManage.py new file mode 100644 index 0000000..18d8d6c --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/RoleManage.py @@ -0,0 +1,351 @@ +# -*- coding:utf-8 -*- +""" +Author: Auto Generated +Create Date: 2026/04/30 +""" +import logging +import os +import sys + +current_file_path = os.path.abspath(__file__) +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../../../')) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +import time +from base_framework.public_tools import log +from base_framework.public_tools.my_faker import MyFaker +from base_framework.public_tools.runner import Runner +from base_framework.public_tools import utils +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_get_log = log.get_logger() +obj_my_faker = MyFaker() +obj_runner = Runner() +obj_get_way = utils.Tools() + + +class RoleManage(DlzhanInterface): + def __init__(self): + super().__init__() + joyhub_token = self._read_robot_variable("joyhub_login_token") + if joyhub_token: + self.set_joyhub_token(joyhub_token) + obj_get_log.info("从配置文件读取JoyHub Token成功: {}".format(joyhub_token)) + else: + obj_get_log.warning("未从配置文件读取到JoyHub Token") + + def _read_robot_variable(self, var_name): + import re + robot_file_path = r'C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\Resource\AdapterKws\hh-qa.robot' + obj_get_log.info("尝试读取配置文件: {}".format(robot_file_path)) + try: + with open(robot_file_path, 'r', encoding='utf-8') as f: + content = f.read() + pattern = r'\$\{' + re.escape(var_name) + r'\}\s+(\S+)' + match = re.search(pattern, content) + if match: + obj_get_log.info("匹配到变量 {} = {}".format(var_name, match.group(1))) + return match.group(1) + else: + obj_get_log.warning("未匹配到变量 {}".format(var_name)) + except Exception as e: + obj_get_log.error("读取robot配置文件失败: {}".format(str(e))) + return None + + def kw_joyhub_role_create_post(self, note, **kwargs): + """ + | 功能说明: | 创建角色 | + | 输入参数: | note | 注释 | + | name | 角色名称 | 必填 | + | code | 角色标志 | 必填 | + | sort | 显示顺序 | 必填 | + | status | 状态 | 必填 | + | remark | 备注 | 非必填 | + | 返回参数: | {"code":0,"msg":"","data":role_id} | + """ + logging.info("==========={0}===========".format(note)) + + name = kwargs.get("name") + code = kwargs.get("code") + sort = kwargs.get("sort") + status = kwargs.get("status") + remark = kwargs.get("remark") + + if not name or not code or sort is None or status is None: + raise Exception("角色名称、角色标志、显示顺序和状态不能为空") + + request_params = { + "name": name, + "code": code, + "sort": sort, + "status": status + } + + if remark is not None and remark != "": + request_params["remark"] = remark + + resp = self.kw_in_joyhub_role_create_post(**request_params) + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_role_delete_post(self, note, **kwargs): + """ + | 功能说明: | 删除角色 | + | 输入参数: | note | 注释 | + | id | 角色编号 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + role_id = kwargs.get("id") + + if not role_id: + raise Exception("角色编号不能为空") + + resp = self.kw_in_joyhub_role_delete_post(id=role_id) + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_role_delete_list_post(self, note, **kwargs): + """ + | 功能说明: | 批量删除角色 | + | 输入参数: | note | 注释 | + | ids | 角色编号数组 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + ids = kwargs.get("ids") + + if not ids or not isinstance(ids, list): + raise Exception("角色编号数组不能为空") + + resp = self.kw_in_joyhub_role_delete_list_post(ids=ids) + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_role_get_get(self, note, **kwargs): + """ + | 功能说明: | 获得角色信息 | + | 输入参数: | note | 注释 | + | id | 角色编号 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":{...}} | + """ + logging.info("==========={0}===========".format(note)) + + role_id = kwargs.get("id") + + if not role_id: + raise Exception("角色编号不能为空") + + resp = self.kw_in_joyhub_role_get_get(id=role_id) + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_role_page_get(self, note, **kwargs): + """ + | 功能说明: | 获得角色分页 | + | 输入参数: | note | 注释 | + | pageNo | 页码 | 必填 | + | pageSize | 每页条数 | 必填 | + | name | 角色名称 | 非必填 | + | code | 角色标识 | 非必填 | + | status | 状态 | 非必填 | + | 返回参数: | {"code":0,"msg":"","data":{...}} | + """ + logging.info("==========={0}===========".format(note)) + + page_no = kwargs.get("pageNo") + page_size = kwargs.get("pageSize") + name = kwargs.get("name") + code = kwargs.get("code") + status = kwargs.get("status") + + if not page_no or not page_size: + raise Exception("页码和每页条数不能为空") + + request_params = { + "pageNo": page_no, + "pageSize": page_size + } + + if name is not None and name != "": + request_params["name"] = name + if code is not None and code != "": + request_params["code"] = code + if status is not None: + request_params["status"] = status + + resp = self.kw_in_joyhub_role_page_get(**request_params) + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_role_simple_list_get(self, note, **kwargs): + """ + | 功能说明: | 获取角色精简信息列表 | + | 输入参数: | note | 注释 | + | 返回参数: | {"code":0,"msg":"","data":[...]} | + """ + logging.info("==========={0}===========".format(note)) + + resp = self.kw_in_joyhub_role_simple_list_get() + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_role_list_all_simple_get(self, note, **kwargs): + """ + | 功能说明: | 获取角色精简信息列表 | + | 输入参数: | note | 注释 | + | 返回参数: | {"code":0,"msg":"","data":[...]} | + """ + logging.info("==========={0}===========".format(note)) + + resp = self.kw_in_joyhub_role_list_all_simple_get() + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_role_update_put(self, note, **kwargs): + """ + | 功能说明: | 修改角色 | + | 输入参数: | note | 注释 | + | id | 角色编号 | 必填 | + | name | 角色名称 | 必填 | + | code | 角色标志 | 必填 | + | sort | 显示顺序 | 必填 | + | status | 状态 | 必填 | + | remark | 备注 | 非必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + role_id = kwargs.get("id") + name = kwargs.get("name") + code = kwargs.get("code") + sort = kwargs.get("sort") + status = kwargs.get("status") + remark = kwargs.get("remark") + + if not role_id or not name or not code or sort is None or status is None: + raise Exception("角色编号、角色名称、角色标志、显示顺序和状态不能为空") + + request_params = { + "id": role_id, + "name": name, + "code": code, + "sort": sort, + "status": status + } + + if remark is not None and remark != "": + request_params["remark"] = remark + + resp = self.kw_in_joyhub_role_update_put(**request_params) + + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_auth_login_post(self, note, username=None, password=None, max_retries=3, retry_delay=2): + """ + | 功能说明: | 使用账号密码登录(带异常重试机制) | + | 输入参数: | note | 注释 | + | username | 账号 | 必填,默认joytest | + | password | 密码 | 必填,默认123456 | + | max_retries | 最大重试次数 | 非必填,默认3 | + | retry_delay | 重试间隔(秒) | 非必填,默认2 | + | 返回参数: | {"code":200,"msg":"success","data":{...}} | + """ + logging.info("==========={0}===========".format(note)) + + login_username = username if username else "joytest" + login_password = password if password else "123456" + + last_exception = None + + for attempt in range(max_retries): + try: + logging.info("登录尝试 {}/{}".format(attempt + 1, max_retries)) + request_params = { + "username": login_username, + "password": login_password + } + + resp = self.kw_in_joyhub_auth_login_post(**request_params) + + if resp is not None: + if isinstance(resp, dict) and resp.get('code') == 200: + logging.info("✓ 登录成功") + print("登录成功:", resp) + return resp + elif isinstance(resp, dict) and resp.get('code') == 401: + logging.warning("登录失败,账号未登录或token过期,重试中...") + else: + logging.warning("登录失败,响应: {}".format(resp)) + else: + logging.warning("登录失败,响应为空") + + last_exception = Exception("登录失败") + + except Exception as e: + last_exception = e + logging.error("登录异常(第{}次尝试): {}".format(attempt + 1, str(e))) + + if attempt < max_retries - 1: + logging.info("等待 {} 秒后重试...".format(retry_delay)) + time.sleep(retry_delay) + + logging.error("登录失败,已达到最大重试次数 {}".format(max_retries)) + raise last_exception if last_exception else Exception("登录失败,已达到最大重试次数") + + +if __name__ == '__main__': + test = RoleManage() + a = test.kw_joyhub_role_page_get(note="测试角色分页", pageNo=1, pageSize=10) + print(a) diff --git a/dulizhan/library/BusinessKw/JoyHub/ShippingTemplateManage.py b/dulizhan/library/BusinessKw/JoyHub/ShippingTemplateManage.py new file mode 100644 index 0000000..8b7f1de --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/ShippingTemplateManage.py @@ -0,0 +1,190 @@ +import logging +import allure +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_log = logging.getLogger("logger") + + +class ShippingTemplateManage(DlzhanInterface): + def __init__(self): + super().__init__() + + @allure.step("创建运费模板") + def kw_joyhub_shipping_template_create_post(self, template_name, is_default, calculation_algorithm, currency, status, id=0): + """ + 创建运费模板业务关键字 + :param template_name: 模板名称 + :param is_default: 是否为默认模板,1-是,2-否 + :param calculation_algorithm: 运费计算算法,fixed_amount-固定金额,percentage-百分比 + :param currency: 币种 + :param status: 状态 1-启用,2-停用 + :param id: 主键,新增为0 + :return: 响应结果 + """ + obj_log.info(f"创建运费模板 - templateName: {template_name}, isDefault: {is_default}, calculationAlgorithm: {calculation_algorithm}, currency: {currency}, status: {status}") + + params = { + "id": id, + "templateName": template_name, + "isDefault": is_default, + "calculationAlgorithm": calculation_algorithm, + "currency": currency, + "status": status + } + + resp = self.kw_in_joyhub_shipping_template_create_post(**params) + obj_log.info(f"创建运费模板响应: {resp}") + + return resp + + @allure.step("删除运费模板") + def kw_joyhub_shipping_template_delete_post(self, shipping_template_id): + """ + 删除运费模板业务关键字 + :param shipping_template_id: 运费模板编号 + :return: 响应结果 + """ + obj_log.info(f"删除运费模板 - id: {shipping_template_id}") + + resp = self.kw_in_joyhub_shipping_template_delete_post(shipping_template_id=shipping_template_id) + obj_log.info(f"删除运费模板响应: {resp}") + + return resp + + @allure.step("批量删除运费模板") + def kw_joyhub_shipping_template_delete_list_post(self, ids): + """ + 批量删除运费模板业务关键字 + :param ids: 运费模板编号列表 + :return: 响应结果 + """ + obj_log.info(f"批量删除运费模板 - ids: {ids}") + + resp = self.kw_in_joyhub_shipping_template_delete_list_post(ids=ids) + obj_log.info(f"批量删除运费模板响应: {resp}") + + return resp + + @allure.step("获得运费模板详情") + def kw_joyhub_shipping_template_get_detail_get(self, shipping_template_id): + """ + 获得运费模板详情(含规则与子表)业务关键字 + :param shipping_template_id: 运费模板编号 + :return: 响应结果 + """ + obj_log.info(f"获得运费模板详情 - id: {shipping_template_id}") + + resp = self.kw_in_joyhub_shipping_template_get_detail_get(shipping_template_id=shipping_template_id) + obj_log.info(f"获得运费模板详情响应: {resp}") + + return resp + + @allure.step("获得运费模板分页列表") + def kw_joyhub_shipping_template_page_get(self, page_no=1, page_size=10, template_name="", is_default=None, calculation_algorithm="", currency="", status=None): + """ + 获得运费模板分页列表业务关键字 + :param page_no: 页码 + :param page_size: 每页条数 + :param template_name: 模板名称 + :param is_default: 是否为默认模板,1-是,2-否 + :param calculation_algorithm: 运费计算算法 + :param currency: 币种 + :param status: 状态 + :return: 响应结果 + """ + obj_log.info(f"获得运费模板分页列表 - pageNo: {page_no}, pageSize: {page_size}, templateName: {template_name}") + + params = { + "pageNo": page_no, + "pageSize": page_size + } + + if template_name: + params["templateName"] = template_name + if is_default is not None: + params["isDefault"] = is_default + if calculation_algorithm: + params["calculationAlgorithm"] = calculation_algorithm + if currency: + params["currency"] = currency + if status is not None: + params["status"] = status + + resp = self.kw_in_joyhub_shipping_template_page_get(**params) + obj_log.info(f"获得运费模板分页列表响应: {resp}") + + return resp + + @allure.step("保存运费模板(含规则与子表)") + def kw_joyhub_shipping_template_save_with_children_post(self, template_name, is_default, calculation_algorithm, currency, status, shipping_rules=None, id=0): + """ + 保存运费模板信息(含规则与子表)业务关键字 + :param template_name: 模板名称 + :param is_default: 是否为默认模板,1-是,2-否 + :param calculation_algorithm: 运费计算算法 + :param currency: 币种 + :param status: 状态 + :param shipping_rules: 运费规则列表 + :param id: 主键,新增为0 + :return: 响应结果 + """ + obj_log.info(f"保存运费模板(含规则与子表) - templateName: {template_name}, isDefault: {is_default}") + + params = { + "id": id, + "templateName": template_name, + "isDefault": is_default, + "calculationAlgorithm": calculation_algorithm, + "currency": currency, + "status": status + } + + if shipping_rules: + params["shippingRules"] = shipping_rules + + resp = self.kw_in_joyhub_shipping_template_save_with_children_post(**params) + obj_log.info(f"保存运费模板(含规则与子表)响应: {resp}") + + return resp + + @allure.step("获得运费规则列表") + def kw_joyhub_shipping_template_shipping_rule_list_get(self, shipping_template_id): + """ + 获得运费规则列表业务关键字 + :param shipping_template_id: 关联的模板ID + :return: 响应结果 + """ + obj_log.info(f"获得运费规则列表 - shippingTemplateId: {shipping_template_id}") + + resp = self.kw_in_joyhub_shipping_template_shipping_rule_list_get(shipping_template_id=shipping_template_id) + obj_log.info(f"获得运费规则列表响应: {resp}") + + return resp + + @allure.step("更新运费模板") + def kw_joyhub_shipping_template_update_put(self, id, template_name, is_default, calculation_algorithm, currency, status): + """ + 更新运费模板业务关键字 + :param id: 模板编号 + :param template_name: 模板名称 + :param is_default: 是否为默认模板,1-是,2-否 + :param calculation_algorithm: 运费计算算法 + :param currency: 币种 + :param status: 状态 + :return: 响应结果 + """ + obj_log.info(f"更新运费模板 - id: {id}, templateName: {template_name}") + + params = { + "id": id, + "templateName": template_name, + "isDefault": is_default, + "calculationAlgorithm": calculation_algorithm, + "currency": currency, + "status": status + } + + resp = self.kw_in_joyhub_shipping_template_update_put(**params) + obj_log.info(f"更新运费模板响应: {resp}") + + return resp \ No newline at end of file diff --git a/dulizhan/library/BusinessKw/JoyHub/UserManage.py b/dulizhan/library/BusinessKw/JoyHub/UserManage.py new file mode 100644 index 0000000..a18240b --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/UserManage.py @@ -0,0 +1,451 @@ +# -*- coding:utf-8 -*- +""" +Author: Auto Generated +Create Date: 2026/04/28 +""" +import logging +import os +import sys + +current_file_path = os.path.abspath(__file__) +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../../../')) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +import time +from base_framework.public_tools import log +from base_framework.public_tools.my_faker import MyFaker +from base_framework.public_tools.runner import Runner +from base_framework.public_tools import utils +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_get_log = log.get_logger() +obj_my_faker = MyFaker() +obj_runner = Runner() +obj_get_way = utils.Tools() + + +class UserManage(DlzhanInterface): + def __init__(self): + super().__init__() + # 从robot配置文件读取 JoyHub Token + joyhub_token = self._read_robot_variable("joyhub_login_token") + if joyhub_token: + self.set_joyhub_token(joyhub_token) + obj_get_log.info("从配置文件读取JoyHub Token成功: {}".format(joyhub_token)) + else: + obj_get_log.warning("未从配置文件读取到JoyHub Token") + + def _read_robot_variable(self, var_name): + """从robot配置文件读取变量""" + import re + # 使用相对路径定位配置文件 + robot_file_path = os.path.join(os.path.dirname(__file__), '../../../../test_case/Resource/AdapterKws/hh-qa.robot') + obj_get_log.info("尝试读取配置文件: {}".format(robot_file_path)) + try: + with open(robot_file_path, 'r', encoding='utf-8') as f: + content = f.read() + # 匹配 ${var_name} value 格式 + pattern = r'\$\{' + re.escape(var_name) + r'\}\s+(\S+)' + match = re.search(pattern, content) + if match: + obj_get_log.info("匹配到变量 {} = {}".format(var_name, match.group(1))) + return match.group(1) + else: + obj_get_log.warning("未匹配到变量 {}".format(var_name)) + except Exception as e: + obj_get_log.error("读取robot配置文件失败: {}".format(str(e))) + return None + + def kw_joyhub_user_create_post(self, note, **kwargs): + """ + | 功能说明: | 新增用户 | + | 输入参数: | note | 注释 | + | username | 用户账号 | 必填 | + | nickname | 用户昵称 | 必填 | + | password | 密码 | 必填 | + | email | 用户邮箱 | 非必填 | + | mobile | 手机号码 | 非必填 | + | sex | 用户性别 | 非必填 | + | avatar | 用户头像 | 非必填 | + | remark | 备注 | 非必填 | + | deptId | 部门编号 | 非必填 | + | postIds | 岗位编号数组 | 非必填 | + | 返回参数: | {"code":0,"msg":"","data":user_id} | + """ + logging.info("==========={0}===========".format(note)) + + username = kwargs.get("username") + nickname = kwargs.get("nickname") + password = kwargs.get("password") + email = kwargs.get("email") + mobile = kwargs.get("mobile") + sex = kwargs.get("sex") + avatar = kwargs.get("avatar") + remark = kwargs.get("remark") + deptId = kwargs.get("deptId") + postIds = kwargs.get("postIds") + + if not username or not nickname or not password: + raise Exception("用户账号、用户昵称和密码不能为空") + + request_params = { + "username": username, + "nickname": nickname, + "password": password + } + + if email is not None and email != "": + request_params["email"] = email + if mobile is not None and mobile != "": + request_params["mobile"] = mobile + if sex is not None: + request_params["sex"] = sex + if avatar is not None and avatar != "": + request_params["avatar"] = avatar + if remark is not None and remark != "": + request_params["remark"] = remark + if deptId is not None: + request_params["deptId"] = deptId + if postIds is not None: + request_params["postIds"] = postIds + + resp = self.kw_in_joyhub_user_create_post(**request_params) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_user_delete_post(self, note, **kwargs): + """ + | 功能说明: | 删除用户 | + | 输入参数: | note | 注释 | + | id | 用户编号 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + user_id = kwargs.get("id") + + if not user_id: + raise Exception("用户编号不能为空") + + resp = self.kw_in_joyhub_user_delete_post(id=user_id) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_user_delete_list_post(self, note, **kwargs): + """ + | 功能说明: | 批量删除用户 | + | 输入参数: | note | 注释 | + | ids | 用户编号数组 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + ids = kwargs.get("ids") + + if not ids or not isinstance(ids, list): + raise Exception("用户编号数组不能为空") + + resp = self.kw_in_joyhub_user_delete_list_post(ids=ids) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_user_get_get(self, note, **kwargs): + """ + | 功能说明: | 获得用户详情 | + | 输入参数: | note | 注释 | + | id | 用户编号 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":{...}} | + """ + logging.info("==========={0}===========".format(note)) + + user_id = kwargs.get("id") + + if not user_id: + raise Exception("用户编号不能为空") + + resp = self.kw_in_joyhub_user_get_get(id=user_id) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_user_page_get(self, note, **kwargs): + """ + | 功能说明: | 获得用户分页列表 | + | 输入参数: | note | 注释 | + | pageNo | 页码 | 必填 | + | pageSize | 每页条数 | 必填 | + | username | 用户账号 | 非必填 | + | nickname | 用户昵称 | 非必填 | + | mobile | 手机号码 | 非必填 | + | status | 用户状态 | 非必填 | + | deptId | 部门编号 | 非必填 | + | 返回参数: | {"code":0,"msg":"","data":{...}} | + """ + logging.info("==========={0}===========".format(note)) + + page_no = kwargs.get("pageNo") + page_size = kwargs.get("pageSize") + username = kwargs.get("username") + nickname = kwargs.get("nickname") + mobile = kwargs.get("mobile") + status = kwargs.get("status") + deptId = kwargs.get("deptId") + + if not page_no or not page_size: + raise Exception("页码和每页条数不能为空") + + request_params = { + "pageNo": page_no, + "pageSize": page_size + } + + if username is not None and username != "": + request_params["username"] = username + if nickname is not None and nickname != "": + request_params["nickname"] = nickname + if mobile is not None and mobile != "": + request_params["mobile"] = mobile + if status is not None: + request_params["status"] = status + if deptId is not None: + request_params["deptId"] = deptId + + resp = self.kw_in_joyhub_user_page_get(**request_params) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_user_update_put(self, note, **kwargs): + """ + | 功能说明: | 修改用户 | + | 输入参数: | note | 注释 | + | id | 用户编号 | 必填 | + | username | 用户账号 | 必填 | + | nickname | 用户昵称 | 必填 | + | password | 密码 | 非必填 | + | email | 用户邮箱 | 非必填 | + | mobile | 手机号码 | 非必填 | + | sex | 用户性别 | 非必填 | + | avatar | 用户头像 | 非必填 | + | remark | 备注 | 非必填 | + | deptId | 部门编号 | 非必填 | + | postIds | 岗位编号数组 | 非必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + user_id = kwargs.get("id") + username = kwargs.get("username") + nickname = kwargs.get("nickname") + password = kwargs.get("password") + email = kwargs.get("email") + mobile = kwargs.get("mobile") + sex = kwargs.get("sex") + avatar = kwargs.get("avatar") + remark = kwargs.get("remark") + deptId = kwargs.get("deptId") + postIds = kwargs.get("postIds") + + if not user_id or not username or not nickname: + raise Exception("用户编号、用户账号和用户昵称不能为空") + + request_params = { + "id": user_id, + "username": username, + "nickname": nickname + } + + if password is not None and password != "": + request_params["password"] = password + if email is not None and email != "": + request_params["email"] = email + if mobile is not None and mobile != "": + request_params["mobile"] = mobile + if sex is not None: + request_params["sex"] = sex + if avatar is not None and avatar != "": + request_params["avatar"] = avatar + if remark is not None and remark != "": + request_params["remark"] = remark + if deptId is not None: + request_params["deptId"] = deptId + if postIds is not None: + request_params["postIds"] = postIds + + resp = self.kw_in_joyhub_user_update_put(**request_params) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_user_update_password_put(self, note, **kwargs): + """ + | 功能说明: | 重置用户密码 | + | 输入参数: | note | 注释 | + | id | 用户编号 | 必填 | + | password | 新密码 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + user_id = kwargs.get("id") + password = kwargs.get("password") + + if not user_id or not password: + raise Exception("用户编号和新密码不能为空") + + resp = self.kw_in_joyhub_user_update_password_put(id=user_id, password=password) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_user_update_status_put(self, note, **kwargs): + """ + | 功能说明: | 修改用户状态 | + | 输入参数: | note | 注释 | + | id | 用户编号 | 必填 | + | status | 用户状态 | 必填 | + | 返回参数: | {"code":0,"msg":"","data":true} | + """ + logging.info("==========={0}===========".format(note)) + + user_id = kwargs.get("id") + status = kwargs.get("status") + + if not user_id or status is None: + raise Exception("用户编号和用户状态不能为空") + + resp = self.kw_in_joyhub_user_update_status_put(id=user_id, status=status) + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "操作失败") + return resp_json + + def kw_joyhub_user_simple_list_get(self, note, **kwargs): + """ + | 功能说明: | 获取用户精简信息列表 | + | 输入参数: | note | 注释 | + | 返回参数: | {"code":0,"msg":"","data":[...]} | + """ + logging.info("==========={0}===========".format(note)) + + resp = self.kw_in_joyhub_user_simple_list_get() + + # 解析响应 + if hasattr(resp, 'json'): + resp_json = resp.json() + else: + resp_json = resp + + print(resp_json if resp_json else "查询失败") + return resp_json + + def kw_joyhub_auth_login_post(self, note, username=None, password=None, max_retries=3, retry_delay=2): + """ + | 功能说明: | 使用账号密码登录(带异常重试机制) | + | 输入参数: | note | 注释 | + | username | 账号 | 必填,默认joytest | + | password | 密码 | 必填,默认123456 | + | max_retries | 最大重试次数 | 非必填,默认3 | + | retry_delay | 重试间隔(秒) | 非必填,默认2 | + | 返回参数: | {"code":200,"msg":"success","data":{...}} | + """ + logging.info("==========={0}===========".format(note)) + + # 使用默认账号密码 + login_username = username if username else "joytest" + login_password = password if password else "123456" + + last_exception = None + + for attempt in range(max_retries): + try: + logging.info("登录尝试 {}/{}".format(attempt + 1, max_retries)) + request_params = { + "username": login_username, + "password": login_password + } + + resp = self.kw_in_joyhub_auth_login_post(**request_params) + + if resp is not None: + if isinstance(resp, dict) and resp.get('code') == 200: + logging.info("✓ 登录成功") + print("登录成功:", resp) + return resp + elif isinstance(resp, dict) and resp.get('code') == 401: + logging.warning("登录失败,账号未登录或token过期,重试中...") + else: + logging.warning("登录失败,响应: {}".format(resp)) + else: + logging.warning("登录失败,响应为空") + + last_exception = Exception("登录失败") + + except Exception as e: + last_exception = e + logging.error("登录异常(第{}次尝试): {}".format(attempt + 1, str(e))) + + # 如果不是最后一次尝试,等待后重试 + if attempt < max_retries - 1: + logging.info("等待 {} 秒后重试...".format(retry_delay)) + time.sleep(retry_delay) + + logging.error("登录失败,已达到最大重试次数 {}".format(max_retries)) + raise last_exception if last_exception else Exception("登录失败,已达到最大重试次数") + + +if __name__ == '__main__': + test = UserManage() + a = test.kw_joyhub_user_page_get(note="测试用户分页", user='admin', pageNo=1, pageSize=10) + print(a) diff --git a/dulizhan/library/BusinessKw/JoyHub/UserProfile.py b/dulizhan/library/BusinessKw/JoyHub/UserProfile.py new file mode 100644 index 0000000..44b93ae --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/UserProfile.py @@ -0,0 +1,74 @@ +import logging +import allure +from dulizhan.library.Dlizhan_interface import DlzhanInterface + +obj_log = logging.getLogger("logger") + + +class UserProfile(DlzhanInterface): + def __init__(self): + super().__init__() + + @allure.step("获得登录用户信息") + def kw_joyhub_user_profile_get_get(self): + """ + 获得登录用户信息业务关键字 + :return: 响应结果 + """ + obj_log.info("获得登录用户信息") + + resp = self.kw_in_joyhub_user_profile_get_get() + obj_log.info(f"获得登录用户信息响应: {resp}") + + return resp + + @allure.step("修改用户个人信息") + def kw_joyhub_user_profile_update_put(self, nickname="", email="", mobile="", sex=None, avatar=""): + """ + 修改用户个人信息业务关键字 + :param nickname: 用户昵称 + :param email: 用户邮箱 + :param mobile: 手机号码 + :param sex: 用户性别 + :param avatar: 用户头像 + :return: 响应结果 + """ + obj_log.info(f"修改用户个人信息 - nickname: {nickname}, email: {email}, mobile: {mobile}, sex: {sex}") + + params = {} + + if nickname: + params["nickname"] = nickname + if email: + params["email"] = email + if mobile: + params["mobile"] = mobile + if sex is not None: + params["sex"] = sex + if avatar: + params["avatar"] = avatar + + resp = self.kw_in_joyhub_user_profile_update_put(**params) + obj_log.info(f"修改用户个人信息响应: {resp}") + + return resp + + @allure.step("修改用户个人密码") + def kw_joyhub_user_profile_update_password_put(self, old_password, new_password): + """ + 修改用户个人密码业务关键字 + :param old_password: 旧密码 + :param new_password: 新密码 + :return: 响应结果 + """ + obj_log.info(f"修改用户个人密码 - oldPassword: {old_password}, newPassword: {new_password}") + + params = { + "oldPassword": old_password, + "newPassword": new_password + } + + resp = self.kw_in_joyhub_user_profile_update_password_put(**params) + obj_log.info(f"修改用户个人密码响应: {resp}") + + return resp diff --git a/dulizhan/library/BusinessKw/JoyHub/__init__.py b/dulizhan/library/BusinessKw/JoyHub/__init__.py new file mode 100644 index 0000000..63db557 --- /dev/null +++ b/dulizhan/library/BusinessKw/JoyHub/__init__.py @@ -0,0 +1,7 @@ +# -*- coding:utf-8 -*- +""" +JoyHub业务关键字模块 +""" +from .UserManage import UserManage + +__all__ = ['UserManage'] diff --git a/dulizhan/library/BusinessKw/SZPurchase/ContractManage.py b/dulizhan/library/BusinessKw/SZPurchase/ContractManage.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/BusinessKw/SZPurchase/PurchaseOrderManage.py b/dulizhan/library/BusinessKw/SZPurchase/PurchaseOrderManage.py new file mode 100644 index 0000000..868f3a7 --- /dev/null +++ b/dulizhan/library/BusinessKw/SZPurchase/PurchaseOrderManage.py @@ -0,0 +1,97 @@ +# -*- coding:utf-8 -*- +""" +Author: qiaoxinjiu +Email: qiaoxinjiu@sparkedu.com +Create Date: 2026/01/22 5:58 下午 +""" +import logging +import os +import sys + +# 添加项目根目录到 Python 路径,以便导入 base_framework 模块 +current_file_path = os.path.abspath(__file__) +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../../../')) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +from base_framework.public_tools import log +from base_framework.public_tools.my_faker import MyFaker +from base_framework.public_tools.runner import Runner +from base_framework.public_tools.pgsqlhelper import PgSqlHelper +from base_framework.public_tools import read_config +from base_framework.public_tools import utils +from base_framework.public_tools import mg_keyword +from zhyy.library.ZZYY_interface import ZhyyInterface + +obj_get_log = log.get_logger() +obj_my_faker = MyFaker() +obj_runner = Runner() +obj_pgsql_helper = PgSqlHelper() +obj_get_way = utils.Tools() +obj_mg_keyword = mg_keyword.ManageKeyWord() + + +class PurchaseOrder(ZhyyInterface): + def __init__(self): + ''' + 这个是针对于读取配置文件的初始化函数,用于读取默认参数 + ''' + super().__init__() + self.config_index_path = os.path.dirname(os.path.abspath(__file__)) + self.config_index_filePath = os.path.join(self.config_index_path, "purchase.ini") + self.config_index_content = read_config.ReadConfig(filename=self.config_index_filePath) + + def kw_zhyy_get_purchase_page_post(self, note, user, **kwargs): + """ + | 功能说明: | 返回采购工作台采购单列表数据 | + | 输入参数: | note | 注释 | + |user | 用户信息,传入 'purchase' 默认读取配置文件里面 'purchase' 对应的默认账号信息| + |supplier_company_ids | 供应商id | 非必填 + |payment_status | 付款状态 | 非必填 + |status | 采购单状态 | 非必填 + |order_sn | 采购单号 | 非必填 + |page_no | 页码 | 必填 + |page_size | 每页条数 | 必填 + | 返回参数: | {"success":true,"message":"success","code":200,"data": + {'todoTask':['PO260116003','PO260115010'],'inProcessTask':['PO260116003','PO260115010']}} | | + | 作者信息: | 谯新久 | 修改时间 | 2022-8-20 | + """ + logging.info("==========={0}===========".format(note)) + # 获取所有参数 + supplier_company_ids = kwargs.get("supplier_company_ids") + payment_status = kwargs.get("payment_status") + status = kwargs.get("status") + order_sn = kwargs.get("order_sn") + page_no = kwargs.get("page_no") + page_size = kwargs.get("page_size") + + # 检查必填参数 + if not page_no or not page_size: + raise Exception("页码和每页条数不能为空") + + # 组装参数字典,只包含非空字段,参数名使用 pageNo 和 pageSize + request_params = { + "pageNo": page_no, + "pageSize": page_size + } + + # 如果字段不为空,才添加到参数字典中 + if supplier_company_ids is not None and supplier_company_ids != "": + request_params["supplier_company_ids"] = supplier_company_ids + if payment_status is not None and payment_status != "": + request_params["payment_status"] = payment_status + if status is not None and status != "": + request_params["status"] = status + if order_sn is not None and order_sn != "": + request_params["order_sn"] = order_sn + + # 使用 ** 方式解包字典传递参数 + get_todo_info = self.kw_in_zhyy_purchase_order_page_post(user=user, **request_params) + print(get_todo_info if get_todo_info else "查询失败") + return get_todo_info + + +if __name__ == '__main__': + test = PurchaseOrder() + a = test.kw_zhyy_get_purchase_page_post(user='purchase', note="测试", page_no=1, page_size=10) + print(a) diff --git a/dulizhan/library/BusinessKw/SZPurchase/PurchasePlanManage.py b/dulizhan/library/BusinessKw/SZPurchase/PurchasePlanManage.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/BusinessKw/SZPurchase/__init__.py b/dulizhan/library/BusinessKw/SZPurchase/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/BusinessKw/SZPurchase/index.py b/dulizhan/library/BusinessKw/SZPurchase/index.py new file mode 100644 index 0000000..830d09b --- /dev/null +++ b/dulizhan/library/BusinessKw/SZPurchase/index.py @@ -0,0 +1,88 @@ +# -*- coding:utf-8 -*- +""" +Author: qiaoxinjiu +Email: qiaoxinjiu@sparkedu.com +Create Date: 2022/08/20 5:58 下午 +""" +import logging +import os +import sys + +# 添加项目根目录到 Python 路径,以便导入 base_framework 模块 +current_file_path = os.path.abspath(__file__) +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../../../')) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +from base_framework.public_tools import log +from base_framework.public_tools.my_faker import MyFaker +from base_framework.public_tools.runner import Runner +from base_framework.public_tools.pgsqlhelper import PgSqlHelper +from base_framework.public_tools import read_config +from base_framework.public_tools import utils +from base_framework.public_tools import mg_keyword +from zhyy.library.ZZYY_interface import ZhyyInterface + +obj_get_log = log.get_logger() +obj_my_faker = MyFaker() +obj_runner = Runner() +obj_pgsql_helper = PgSqlHelper() +obj_get_way = utils.Tools() +obj_mg_keyword = mg_keyword.ManageKeyWord() + + +class PurchaseIndex(ZhyyInterface): + def __init__(self): + ''' + 这个是针对于读取配置文件的初始化函数,用于读取默认参数 + ''' + super().__init__() + self.config_index_path = os.path.dirname(os.path.abspath(__file__)) + self.config_index_filePath = os.path.join(self.config_index_path, "purchase.ini") + self.config_index_content = read_config.ReadConfig(filename=self.config_index_filePath) + + def kw_zhyy_get_todo(self, note, user): + """ + | 功能说明: | 返回采购工作台首页待办任务的PO与在办任务PO | + | 输入参数: | note | 注释 | + |user | 用户信息,传入 'purchase' 默认读取配置文件里面 'purchase' 对应的默认账号信息| + | 返回参数: | {"success":true,"message":"success","code":200,"data": + {'todoTask':['PO260116003','PO260115010'],'inProcessTask':['PO260116003','PO260115010']}} | | + | 作者信息: | 谯新久 | 修改时间 | 2022-8-20 | + """ + logging.info("==========={0}===========".format(note)) + get_todo_info = self.kw_in_zhyy_purchase_todo_get(user=user) + if get_todo_info['code'] != 0: + raise Exception("查询采购待办任务失败: {}".format(get_todo_info)) + get_todo_info["message"] = "查询采购待办任务成功" + data = get_todo_info.get("data") + if data is None: + raise Exception("返回数据为空,data字段不存在") + list_get_todo_task = data.get("todoTask") or [] + list_get_process_task = data.get("inProcessTask") or [] + list_todo_task_po = [] + list_process_task_po = [] + for todoTask in list_get_todo_task: + if isinstance(todoTask, dict): + list_todo_task_po.append(todoTask.get("businessSn")) + for processTask in list_get_process_task: + if isinstance(processTask, dict): + list_process_task_po.append(processTask.get("businessSn")) + get_todo_info["data"]["todoTask"] = list_todo_task_po + get_todo_info["data"]["inProcessTask"] = list_process_task_po + if list_todo_task_po: + test_purchase = list_todo_task_po[0] + # 表在public schema中,使用public.erp_purchase_order格式 + sql = "SELECT * FROM public.erp_purchase_order WHERE order_sn = '{}'".format(test_purchase) + try: + obj_pgsql_helper.select_one(sql) + except Exception as e: + # 如果查询失败,记录日志但不影响主流程 + obj_get_log.warning("查询采购订单表失败,订单号:{},错误:{}".format(test_purchase, str(e))) + return get_todo_info + + +if __name__ == '__main__': + test = PurchaseIndex() + a = test.kw_zhyy_get_todo(user='purchase',note="测试") + print(a) diff --git a/dulizhan/library/BusinessKw/SZPurchase/purchase.ini b/dulizhan/library/BusinessKw/SZPurchase/purchase.ini new file mode 100644 index 0000000..3565730 --- /dev/null +++ b/dulizhan/library/BusinessKw/SZPurchase/purchase.ini @@ -0,0 +1,2 @@ +[qa-user] +user_info ={"studentId":21797349,"sex":0,"nickName":"auto st test","birthday":1640966400000,"avatar":"https://stalegacy.huohua.cn/image/huohua/avatar/default/default_avatar1.png"} \ No newline at end of file diff --git a/dulizhan/library/BusinessKw/__init__.py b/dulizhan/library/BusinessKw/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/CommonFun/__init__.py b/dulizhan/library/CommonFun/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/CommonFun/asset_common.py b/dulizhan/library/CommonFun/asset_common.py new file mode 100644 index 0000000..995fef0 --- /dev/null +++ b/dulizhan/library/CommonFun/asset_common.py @@ -0,0 +1,57 @@ +# -*- coding:utf-8 -*- + +""" +Author: 陈江 +Email: chenjiang@huohua.cn +Create Date: 2022/03/03 11:25 下午 +""" +from base_framework.public_tools import log +from base_framework.public_tools.sqlhelper import MySqLHelper + +obj_log = log.get_logger() +obj_my_sql_helper = MySqLHelper() + +class AssetCommon: + def __init__(self): + pass + + def get_course_package_info_by_name(self, course_package_name): + """ + 功能:根据套餐名称获取套餐基本信息 + | 输入参数: | course_package_name string | 套餐名称 | + """ + sql = "SELECT id,code,name,price FROM `peppa`.`course_package` WHERE `name`='{}';".format(course_package_name) + return obj_my_sql_helper.select_one(sql) + + def get_order_info_V2(self, **where_condition): + # user_id = None, course_package_id = None, course_id = None, business_line_type = None, order_id = None, order_code = None + ocp = ['user_id', 'business_line_type', 'order_id', 'order_code', 'status'] + sprl = ['course_package_id', 'course_id'] + where_str = None + for k in where_condition.keys(): + t = '' + if k in sprl: + t = 'sprl' + else: + t = 'ocp' + + if not where_str: + where_str = '{}.{}=\'{}\''.format(t, k, where_condition.get(k)) + else: + where_str = '{} AND {}.{}=\'{}\''.format(where_str, t, k, where_condition.get(k)) + if not where_str: + obj_log.error('参数必填') + return False + sql = "SELECT ocp.id as order_id,ocp.code,ocp.audit_status,ocp.status as order_status,ocp.user_id,ocp.user_address_id,ocp.business_line_type,sprl.course_package_id,sprl.course_id,sprl.subscribe_id,sprl.valid as subscribe_pre_valid,sprl.id as subscribe_pre_id FROM order_center.order_course_package ocp LEFT JOIN order_center.subscribe_pre_create_log sprl ON ocp.id=sprl.order_id WHERE {} ORDER BY ocp.id DESC LIMIT 1".format( + where_str.replace('order_id', 'id')) + obj_log.info(sql) + return obj_my_sql_helper.select_one(sql) + + +if __name__ == '__main__': + user_common_obj = AssetCommon() + print(user_common_obj.get_order_info(**{'order_id': 1193182, 'business_line_type': '1', 'status': 100})) + + + + diff --git a/dulizhan/library/CommonFun/contract_pair_check.py b/dulizhan/library/CommonFun/contract_pair_check.py new file mode 100644 index 0000000..5ef4fd8 --- /dev/null +++ b/dulizhan/library/CommonFun/contract_pair_check.py @@ -0,0 +1,240 @@ +# -*- coding:utf-8 -*- +# @Time : 2023/3/7 13:28 +# @Author: luozhipeng +# @File : contract_pair_check.py +import os +import sys +input_team_name = sys.argv + +BASIC_PATH = os.path.dirname(os.path.abspath(__file__)) +TEAM_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../../{}'.format("base_framework"))) +sys.path.append(TEAM_PATH) +PROJECT_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../..')) +sys.path.append(PROJECT_PATH) +from base_framework.public_tools.sqlhelper import MySqLHelper +from base_framework.public_tools.utils import Tools +import requests +import re +import json +import pymysql + +obj_my_sql_helper = MySqLHelper() + + +class ContractPairCheck(): + def __init__(self): + pass + + def get_unfinished_interface(self): + sql_get_interface = "SELECT distinct (x.con_url) 提供方接口,x.pro_url 消费方接口,x.con_method 提供方请求方式,x.con_server 提供方服务,x.pro_server 消费方服务,x.at_num 自动化接口数 FROM sparkatp.contract_pair x WHERE x.at_num =0 and x.status =1 and x.con_server in (select si.server_name from sparkatp.swagger_info si where si.team in ('ubrd','GUE') and access_type IN (2)) and x.pro_server not in (select si.server_name from sparkatp.swagger_info si where si.team ='ubrd' and access_type IN (2)) and x.roles = 0 order by x.pro_server,x.con_url" + unfinished_interface = obj_my_sql_helper.select_all(sql_get_interface) + return unfinished_interface + + def send_reshult(self): + + headers = {"Content-Type": "application/json;charset=UTF-8"} + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/9f3556b7-cb60-44bf-adbf-24b5b2552014" + + contract_pair_intf = self.get_unfinished_interface() + if len(contract_pair_intf) != 0: + message_data = {"msg_type": "text", "content": {'text': '未完成自动化的契约对接口{}'.format(contract_pair_intf)}} + + rsp = requests.post(url=web_hook, json=message_data, headers=headers) + + +class AutoInterfaceCheck(): + def __init__(self): + pass + + def get_unfinished_interface(self): + sql_get_interface = """select id,in_url from sparkatp.interface_info a WHERE( a.swagger_id in (SELECT id FROM sparkatp.swagger_info WHERE team in ("UBRD","GUE") and access_type not IN (0)) ) AND a.created_time > "2023-01-01 00:00:50" AND is_used = 1 and (case_numbers IS NULL or case_numbers='') and offline=0 and jira_id is null order by created_time """ + unfinished_interface_list = obj_my_sql_helper.select_all(sql_get_interface) + return unfinished_interface_list + + def get_interface_jira(self,interface): + sql_req_time = "select max(created_time) created_time from sparkatp.request_parameters rp where rp.interface_id ={}".format( + interface["id"]) + req_max_time = obj_my_sql_helper.select_one(sql_req_time)['created_time'] + sql_rep_time = "select max(created_time) created_time from sparkatp.response_parameters rp where rp.interface_id ={}".format( + interface["id"]) + rep_max_time = obj_my_sql_helper.select_one(sql_rep_time)['created_time'] + if rep_max_time and req_max_time: + if rep_max_time <= req_max_time: + sql_req_jira = "select distinct (jira_id) from sparkatp.request_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( + interface["id"], req_max_time) + interface_jira = obj_my_sql_helper.select_one(sql_req_jira)["jira_id"] + else: + sql_rep_jira = "select distinct (jira_id) from sparkatp.response_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( + interface["id"], rep_max_time) + interface_jira = obj_my_sql_helper.select_one(sql_rep_jira)["jira_id"] + elif rep_max_time and not req_max_time: + sql_rep_jira = "select distinct (jira_id) from sparkatp.response_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( + interface["id"], rep_max_time) + interface_jira = obj_my_sql_helper.select_one(sql_rep_jira)["jira_id"] + elif not rep_max_time and req_max_time: + sql_req_jira = "select distinct (jira_id) from sparkatp.request_parameters rp where rp.interface_id ={0} and created_time = '{1}'".format( + interface["id"], req_max_time) + interface_jira = obj_my_sql_helper.select_one(sql_req_jira)["jira_id"] + return interface_jira + + def send_result(self): + unfinished_interface_list = self.get_unfinished_interface() + for interface in unfinished_interface_list: + interface['jira'] = self.get_interface_jira(interface) + if not interface['jira']: + interface['qa'] = None + else: + interface['qa'] = self.get_jira_qa(interface['jira']) + headers = {"Content-Type": "application/json;charset=UTF-8"} + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/9f3556b7-cb60-44bf-adbf-24b5b2552014" + if len(unfinished_interface_list) != 0: + message_data = {"msg_type": "text", "content": {'text': 'QA公共环境未完成自动化的接口{}'.format(unfinished_interface_list)}} + rsp = requests.post(url=web_hook, json=message_data, headers=headers) + + def get_jira_qa(self,jira): + try: + conn = pymysql.connect(host='10.250.200.53',user='root',password='peppa@test',database='tools',charset="utf8",port=3306) + except : + raise pymysql.OperationalError("连接数据库失败") + cn =conn.cursor() + sql = "SELECT tester FROM tools.tm_project where jira_number = '{}'".format(jira) + cn.execute(sql) + qa = cn.fetchall() + cn.close() + conn.close() + if qa: + return qa[0][0] + else: + return None + + +class CoverageCheck(): + + # 连接数据库 + @staticmethod + def get_select(sql): + try: + conn = pymysql.connect(host='10.250.200.53', user='root', password='peppa@test', database='tools', + charset="utf8", port=3306) + except: + raise pymysql.OperationalError("连接数据库失败") + cn = conn.cursor() + cn.execute(sql) + res = cn.fetchall() + cn.close() + conn.close() + return res + + # 获取未搜集覆盖率的项目 + @staticmethod + def get_unfinished_coverage(): + start_time = Tools().get_format_date(r_type=15, add_days=-2) + end_time = Tools().get_format_date(r_type=16, add_days=-1) + + # 查询最近一天上线有后端代码变动,需要搜集覆盖率项目 + need_sql = """SELECT env FROM tools.project_plan WHERE ID IN + (SELECT project_id FROM tools.project_tester WHERE tester IN ("陈洁","陈江","罗志鹏","谯新久","刘涛婷")) + AND status IN (14) AND rd_code_add_line>0 AND (it_start_date IS NOT NULL OR qa_start_date IS NOT null) + AND online_date BETWEEN '{}' AND '{}'""".format(start_time, end_time) + need_coverage_list = CoverageCheck().get_select(need_sql) + + # 查询已搜集覆盖率项目 + sql_implemented_sql = '''SELECT `env_name` FROM `sparkatp`.`build_jacoco` WHERE `team` = 'UBRD' AND `status` = '1' + AND `is_delete` = '0' AND `is_pass` = '1' ''' + completed_coverage_list = obj_my_sql_helper.select_all(sql_implemented_sql) + + unfinished_coverage_list = [] + for item1 in range(0, len(need_coverage_list)): + unfinished_coverage_list.append(need_coverage_list[item1][0]) + + # 返回未搜集覆盖率的项目 + for item in completed_coverage_list: + completed_jira = item["env_name"] + if completed_jira in unfinished_coverage_list: + unfinished_coverage_list.remove(completed_jira) + # 根据unfinished_coverage_list 查jira_name + jira_name_list = [] + for item in unfinished_coverage_list: + env_name = item + sql = """SELECT jira_number FROM tools.project_plan WHERE env='{}'""".format(env_name) + jira_name = CoverageCheck().get_select(sql) + jira_name_list.append(jira_name[0][0]) + return jira_name_list + + # 获取未构建基线用例项目 + @staticmethod + def get_not_bulid_jira(): + start_time = Tools().get_format_date(r_type=15, add_days=-2) + end_time = Tools().get_format_date(r_type=16, add_days=-1) + + # 返回有后端变动的jira (有后端代码变更&上线时间在3天内 + jira存在服务变更,项目状态为sim测试) + need_sql = """SELECT env FROM tools.project_plan WHERE + ID IN (SELECT project_id FROM tools.project_tester WHERE tester IN ("陈洁","陈江","罗志鹏","谯新久","刘涛婷")) + AND status IN (14) AND rd_code_add_line>0 AND online_date BETWEEN '{}' AND '{}' + AND qa_start_date IS NOT NULL UNION SELECT env FROM tools.project_plan WHERE ID IN (SELECT project_plan_id + FROM tools.project_plan_server) AND jira_number IN (SELECT jira_number FROM tools.tm_project WHERE status + IN (12) AND `tester` IN ("陈洁","陈江","罗志鹏","谯新久","刘涛婷") AND test_qa_time_consume>0)""".format(start_time, + end_time) + + need_build_list = CoverageCheck().get_select(need_sql) + + # 返回有构建基线用例jira + built_sql = """SELECT DISTINCT special_env FROM sparkatp.build_info WHERE run_type=2 AND team='UBRD' AND STATUS=2""" + built_list = obj_my_sql_helper.select_all(built_sql) + + not_bulit_list = [] + # 取出有后端改动得jira + for item1 in range(0, len(need_build_list)): + not_bulit_list.append(need_build_list[item1][0]) + + # 返回未构建基线用例jira + for item in built_list: + completed_jira = item["special_env"] + if completed_jira in not_bulit_list: + not_bulit_list.remove(completed_jira) + jira_name_list = [] + for item in not_bulit_list: + env_name = item + sql = """SELECT jira_number FROM tools.project_plan WHERE env='{}'""".format(env_name) + jira_name = CoverageCheck().get_select(sql) + jira_name_list.append(jira_name[0][0]) + return jira_name_list + + # 发送消息 + def send_result(self, type=1): + if type == 1: + jira_list = self.get_unfinished_coverage() + elif type == 2: + jira_list = self.get_not_bulid_jira() + + send_list = [] + for item in jira_list: + send_dict = {} + send_dict["jira"] = item + qa_list = AutoInterfaceCheck().get_jira_qa(item) + send_dict["qa"] = qa_list + send_list.append(send_dict) + + headers = {"Content-Type": "application/json;charset=UTF-8"} + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/b6bf33ae-4239-4bef-a8a8-21896e0d1ba1" + if len(jira_list) != 0: + if type == 1: + message_data = {"msg_type": "text", + "content": {'text': '未搜集覆盖率已上线项目{}'.format(send_list)}} + rsp = requests.post(url=web_hook, json=message_data, headers=headers) + elif type == 2: + message_data = {"msg_type": "text", + "content": {'text': '未构建基线用例已上线项目{}'.format(send_list)}} + rsp = requests.post(url=web_hook, json=message_data, headers=headers) + + +if __name__ == '__main__': + A = ContractPairCheck() + A.send_reshult() + B = AutoInterfaceCheck() + # B.get_unfinished_interface() + # B.get_jira_qa(jira = 'PLATFORM-31791') + B.send_result() + C = CoverageCheck() + C.send_result(type=1) + C.send_result(type=2) \ No newline at end of file diff --git a/dulizhan/library/CommonFun/course_package_common.py b/dulizhan/library/CommonFun/course_package_common.py new file mode 100644 index 0000000..fe4694a --- /dev/null +++ b/dulizhan/library/CommonFun/course_package_common.py @@ -0,0 +1,31 @@ +# -*- coding:utf-8 -*- + +""" +Author: 罗志鹏 +Email: luozhipeng@huohua.cn +Create Date: 2022/03/03 11:25 下午 +""" +from base_framework.public_tools import log +from base_framework.public_tools.sqlhelper import MySqLHelper + +obj_log = log.get_logger() +obj_my_sql_helper = MySqLHelper() + +class CoursePackageCommon: + def __init__(self): + pass + + def get_course_package_info_by_name(self, course_package_name): + """ + 功能:根据套餐名称获取套餐基本信息 + | 输入参数: | course_package_name string | 套餐名称 | + """ + sql = "SELECT id,code,name,price FROM `peppa`.`course_package` WHERE `name`='{}';".format(course_package_name) + return obj_my_sql_helper.select_one(sql) +if __name__ == '__main__': + user_common_obj = CoursePackageCommon() + user_common_obj.get_course_package_info_by_name('测试杰拉德0325-火花-直播逻辑思维') + + + + diff --git a/dulizhan/library/CommonFun/drawPicture.py b/dulizhan/library/CommonFun/drawPicture.py new file mode 100644 index 0000000..1165be7 --- /dev/null +++ b/dulizhan/library/CommonFun/drawPicture.py @@ -0,0 +1,31 @@ +import matplotlib.pyplot as plt +import matplotlib + +# 设置字体为支持中文的字体(如SimHei) +matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统 +# matplotlib.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # macOS系统 +matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + +# 数据 +categories = ['供应链', '天窗', 'cc', 'la', '题库', '练测', '教务', '教师', '基础', '学生端', '家长端', '活字', '转介绍'] +values = [8, 4, 13, 20, 11, 2, 22, 10, 1, 1, 14, 1, 17] + +# 创建柱状图 +plt.figure(figsize=(10, 6)) +bars = plt.bar(categories, values, color='skyblue') + +# 添加标题和标签 +plt.title('各类别数量统计', fontsize=16) +plt.xlabel('类别', fontsize=12) +plt.ylabel('数量', fontsize=12) +plt.xticks(rotation=45, ha='right') # 旋转X轴标签 + +# 在每个柱子上方显示数量 +for bar in bars: + height = bar.get_height() + plt.text(bar.get_x() + bar.get_width() / 2, height, str(height), + ha='center', va='bottom', fontsize=10) + +# 显示图表 +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/dulizhan/library/CommonFun/env_check.ini b/dulizhan/library/CommonFun/env_check.ini new file mode 100644 index 0000000..e1a6cb1 --- /dev/null +++ b/dulizhan/library/CommonFun/env_check.ini @@ -0,0 +1,7 @@ +[QA] +check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] + + + +[SIM] +check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] \ No newline at end of file diff --git a/dulizhan/library/CommonFun/env_check.py b/dulizhan/library/CommonFun/env_check.py new file mode 100644 index 0000000..dc696c7 --- /dev/null +++ b/dulizhan/library/CommonFun/env_check.py @@ -0,0 +1,141 @@ +# -*- coding:utf-8 -*- + +""" +Author: 罗志鹏 +Email: luozhipeng@huohua.cn +Create Date: 2022/07/25 11:25 下午 +""" + +import requests +import re +import json + + + + +class EnvCheck(): + def __init__(self): + self.container_ip_list = [] + + + + def get_env_container_ip(self,env): + dis_server =[] + dis_ip = [] + headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding':'gzip, deflate, br'} + if env =='QA': + req = requests.get(url="http://eureka.qa.huohua.cn/",headers=headers) + elif env == 'SIM': + req = requests.get(url="http://eureka.sim.huohua.cn/", headers=headers) + else: + raise RuntimeError("环境选择异常") + req_list =req.text.split('tbody') + # print(req_list[1]) + server_str_list = req_list[1].split('') + check_list = self.get_check_lsit(env=env) + + for server in check_list: + if req.text.find(server) ==-1: + dis_server.append(server) + + + for i in check_list: + for str_ser in server_str_list: + if str_ser.find(i) != -1: + dict_sever = {} + # ip_list = [] + str_sername_start = '' + str_sername_end = '' + server_name = str_ser[str_ser.find(str_sername_start) + 7:str_ser.find(str_sername_end)] + ip_list = re.findall(r'[a-z]://(.*?):8080', str_ser) + dict_sever[server_name] = ip_list + # print(dict_sever) + for ip_ch in ip_list: + url_check = "http://"+ip_ch+':8080/actuator/health' + resp = requests.get(url=url_check) + # print(resp.json()) + if resp.json()['status'] != 'UP': + dict_ip = {server_name:ip_ch} + dis_ip.append(dict_ip) + return dis_ip,dis_server + + + # re_list = [] + # server_list = [] + # for str_ser in server_check_list: + # print(str_ser) + + # print(server_name) + + # pattern = re.compile(r'') + # str_server = pattern.search(str_ser) + # server_name = str_ser[str_ser.start():str_ser.end()] + # print(server_name) + # for server in check_list : + # for string_server in server_list: + # if string_server.find(server)!= -1: + # # print(string_server.find(server)) + # re_list.append(string_server) + + # print(re_list) + # ip_list = [] + # for string_server in re_list : + # if string_server.find('http://'): + # pattern = re.compile(r'[a-zA-z]+://[^\s]*:8080') + # str_ip = pattern.search(string_server) + # # print(str_ip.start()) + # url = string_server[str_ip.start():str_ip.end()] + # print(url) + + def send_result(self): + dis_ip,dis_server = self.get_env_container_ip(env='SIM') + at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}] + + message_data_SIM_server = {"msg_type": "text", "content": {'text':'SIM服务未找到部署IP{}'.format(dis_server)}} + message_data_SIM_IP = {"msg_type": "text", "content": {'text':'SIM服务部署IP不可用{}'.format(dis_ip)}} + + headers = {"Content-Type": "application/json;charset=UTF-8"} + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/28b775e7-a863-4807-b280-c82e09be0a80" + if len(dis_server) != 0: + json_data = json.dumps(message_data_SIM_server) + rsp = requests.post(url=web_hook, json=message_data_SIM_server, headers=headers) + + if len(dis_ip) != 0: + json_data = json.dumps(message_data_SIM_IP) + rsp = requests.post(url=web_hook, json=message_data_SIM_IP, headers=headers) + dis_ip,dis_server = self.get_env_container_ip(env='QA') + message_data_QA_server = {"msg_type": "text", "content": {'text':'QA服务未找到部署IP{}'.format(dis_server)}} + message_data_QA_IP = {"msg_type": "text", "content": {'text':'QA服务部署IP不可用{}'.format(dis_ip)}} + + if len(dis_server) != 0: + json_data = json.dumps(message_data_QA_server) + rsp = requests.post(url=web_hook, data=json_data, headers=headers) + if len(dis_ip) != 0: + json_data = json.dumps(message_data_QA_IP) + rsp = requests.post(url=web_hook, json=message_data_QA_IP, headers=headers) + + + + + + def get_check_lsit(self,env): + if env == 'QA': + check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] + return check_list + if env == 'SIM': + check_list = ['PEPPA-STUDENT-API','PEPPA-LEARNING-PLAN-LISTENER','PEPPA-LEARNING-PLAN-SERVER','PEPPA-TEACH-BIZ','PEPPA-TEACH-LISTENER','PEPPA-TEACH-TIMETABLE-SERVER','PEPPA-USER-AUTH-API','PEPPA-USER-CENTER-SERVER'] + return check_list + + + + +if __name__ == '__main__': + # o ='"http://10.251.187.248:8080/actuator/info" "http://10.251.187.248:8080/actuator/info"' + # i =re.findall(r'[a-z]://(.*?):8080',o) + # print(a) + A=EnvCheck() + A.send_result() + + + + diff --git a/dulizhan/library/CommonFun/handle_aita.py b/dulizhan/library/CommonFun/handle_aita.py new file mode 100644 index 0000000..a3951b9 --- /dev/null +++ b/dulizhan/library/CommonFun/handle_aita.py @@ -0,0 +1,141 @@ +# encoding: UTF-8 +import time +import subprocess +from subprocess import PIPE,Popen +import os + + +class OSType: + WIN, LINUX, UNKNOWN = range(3) + + def __init__(self): + pass + + @staticmethod + def get_type(): + import platform + system_name = platform.system() + if system_name.lower() == 'windows': + return OSType.WIN + elif system_name.lower() == 'linux': + return OSType.LINUX + else: + return OSType.UNKNOWN + + +class tool(object): + def __init__(self): + self.env_port = 5011 + + def run_process(self, cmd_str, out_p=False): + """ + run command + cmd_str unicode string. + """ + if OSType.WIN == OSType.get_type(): + # cmd_str = cmd_str.encode('gbk') + cmd_str = cmd_str + elif OSType.LINUX == OSType.get_type(): + cmd_str = cmd_str.encode('utf-8') + else: + raise RuntimeError("your os is not support.") + close_fds = False if OSType.WIN == OSType.get_type() else True + if out_p: + p = subprocess.Popen(cmd_str, shell=True, close_fds=close_fds, stdout=PIPE) + p.wait() + return p.returncode, p.stdout.read() + else: + c = self.get_devnull() + p = subprocess.Popen(cmd_str, shell=True, close_fds=close_fds, stdout=c) + # for line in p.stdout.readline(): + # print(line) + # p.stdout.close() + p.communicate() + return p.returncode, None + + def adb_cmd(self,cmd): + process = Popen(cmd, shell=True, stderr=PIPE, stdout=PIPE) + (stdout, stdrr) = process.communicate() + stdout = stdout.decode('gbk') # 返回字段中存在中文,使用gbk + + return stdout, stdrr + + def get_devnull(self): + try: + return subprocess.DEVNULL + except AttributeError: + # Python 2.x or older + return open(os.devnull, 'r+') + + def _kills_pid(self): + if OSType.WIN == OSType.get_type(): + kill_pid_cmd = "taskkill /f /pid {}".format(self.pid) + elif OSType.LINUX == OSType.get_type(): + kill_pid_cmd = "kill -9 {}".format(self.pid) + else: + raise RuntimeError("your os is not support.") + + res_code, res_context = self.run_process(kill_pid_cmd) + if res_code: + raise RuntimeError("kill pid: {} failed. error: {}".format(self.pid, res_context)) + + def check_port(self): + if OSType.WIN == OSType.get_type(): + find_pid_win_cmd = 'netstat -ano | findstr {} | findstr LISTENING'.format(self.env_port) + print(find_pid_win_cmd) + res_code, res_context = self.run_process(find_pid_win_cmd, out_p=True) + if res_code == 0: + if len(res_context) > 0: + try: + self.pid = str(res_context).split()[-1].replace("\\r\\n'", "") + self._kills_pid() + except IndexError: + pass + + elif OSType.LINUX == OSType.get_type(): + find_pid_linux_cmd = "lsof -i:{}".format(self.env_port) + res_code, res_context = self.run_process(find_pid_linux_cmd, out_p=True) + if res_code == 0: + # 获取pid + if len(res_context) > 0: + try: + self.pid = str(res_context).split("\n")[1].split()[1] + self._kills_pid() + except IndexError: + pass + else: + raise RuntimeError("your os is not support.") + + def run_manage(self): + count = 3 + while count > 0: + self.run_manages() + find_pid_linux_cmd = "lsof -i:{}".format(self.env_port) + res_code, res_context = self.run_process(find_pid_linux_cmd, out_p=True) + print(res_code, "---res_code---", res_context, "---res_context---") + if len(res_context) > 0: + time.sleep(2) + pid = str(res_context).split("\n")[1].split()[1] + print(pid, "pid####") + count -= 1 + if pid: + break + else: + continue + else: + break + + def run_manages(self): + lod = "nohup python3 platform_tools/aida/manage.py &." + sh_lod = "./5011.sh" + + self.run_process(sh_lod) + # subprocess.call(["./5011.sh"]) + # self.run_process(lod) + + +if __name__ == '__main__': + test = tool() + test.check_port() + time.sleep(3) + test.run_manage() diff --git a/dulizhan/library/CommonFun/handle_harmonyos.py b/dulizhan/library/CommonFun/handle_harmonyos.py new file mode 100644 index 0000000..9836ccf --- /dev/null +++ b/dulizhan/library/CommonFun/handle_harmonyos.py @@ -0,0 +1,105 @@ +import os +import subprocess +from urllib.parse import urlparse +import argparse + + +class HarmonyAppInstaller: + def __init__(self) -> None: + self.project_path = os.getcwd() + self.temp_dir = os.path.join(self.project_path, "temp") + + def _run_command(self, command: str) -> str: + result = subprocess.run(command, shell=True, capture_output=True, text=True) + if result.returncode != 0: + raise Exception(f"Command failed: {command}\nError: {result.stderr}") + return result.stdout + + def install(self, appUniqId, packageId): + import requests + import os + import shutil + + # Create or clean temp directory + if os.path.exists(self.temp_dir): + shutil.rmtree(self.temp_dir) + os.makedirs(self.temp_dir) + + url = "https://api.qa.huohua.cn/api/versions" + + headers = { + 'Content-Type': 'application/json', + 'huohua-podenv': 'HHC-111781' + } + + params = { + 'version': '25.1.2.1', + 'platform': 'harmonyos', + 'appUniqId': appUniqId, + 'packageId': packageId + } + + response = requests.get(url, headers=headers, params=params) + response_data = response.json() + + if not response_data.get('success'): + raise Exception(f"API request failed: {response_data.get('message')}") + + app_version = response_data.get('data', {}).get('app_version', {}) + download_url = app_version.get('url') + + if not download_url: + raise Exception("No download URL found in response") + + # Get the filename from the URL + hap_filename = os.path.basename(urlparse(download_url).path) + if not hap_filename.endswith('.hap'): + hap_filename = 'eduparent.hap' # fallback name if URL doesn't end with .hap + + # Download the HAP file + hap_file_path = os.path.join(self.temp_dir, hap_filename) + download_response = requests.get(download_url, stream=True) + download_response.raise_for_status() + + with open(hap_file_path, 'wb') as f: + for chunk in download_response.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + + # Execute HDC commands + device_path = f"data/local/tmp/{hap_filename}" + + print(f'hdc file send "{hap_file_path}" "{device_path}"') + # Push HAP file to device + self._run_command(f'hdc file send "{hap_file_path}" "{device_path}"') + + try: + # Install HAP package + print(f'hdc shell bm install -p "{device_path}"') + self._run_command(f'hdc shell bm install -p "{device_path}"') + finally: + # Clean up: Remove HAP file from device + print(f'hdc shell rm -rf "{device_path}"') + self._run_command(f'hdc shell rm -rf "{device_path}"') + + return hap_file_path + + +def main(): + parser = argparse.ArgumentParser(description='Install HarmonyOS application') + parser.add_argument('--app-uniq-id', required=True, help='Unique ID of the application') + parser.add_argument('--package-id', required=True, help='Package ID for the application') + + args = parser.parse_args() + + try: + installer = HarmonyAppInstaller() + hap_path = installer.install(args.app_uniq_id, args.package_id) + print(f"Successfully installed HAP from: {hap_path}") + except Exception as e: + print(f"Error: {str(e)}") + exit(1) + + +if __name__ == '__main__': + main() diff --git a/dulizhan/library/CommonFun/handle_jenkins.py b/dulizhan/library/CommonFun/handle_jenkins.py new file mode 100644 index 0000000..a6247ee --- /dev/null +++ b/dulizhan/library/CommonFun/handle_jenkins.py @@ -0,0 +1,257 @@ +# -*- coding:utf-8 -*- +import sys +import xml.etree.ElementTree as ET +WORKSPACE = sys.argv[1] +sys.path.append(WORKSPACE) +import json +import requests +import os +import re +from bs4 import BeautifulSoup +from html.parser import HTMLParser + +handle_parser = HTMLParser() +BUILD_INFO = {} + + +class handle_to_jenkins(): + ''' + 处理关于jenkins的执行相关方法 + ''' + + def __init__(self): + self.dict_info = {} + self.list_info = [] + def GetJenkinsVar(self, key): + ''' + 获取jenkins上获得的参数信息 + ''' + try: + value = os.environ.get(key) + except Exception: + value = os.environ.get(key.upper()) + if (not value): + value = '' + return value + + def kw_to_get_dd_token(self, environment): + """ + 功能: 根据传入环境获取不同的token信息 + """ + sim = "40696c86-264a-4222-a40c-cfd64a05dffd" + product = "40696c86-264a-4222-a40c-cfd64a05dffd" + if environment.lower() == "sim" or environment.lower() == "qa": + return sim + else: + return product + + def send_message_by_dingding(self, data, environment="qa"): + ''' + 发送钉钉消息 + ''' + token = self.kw_to_get_dd_token(environment=environment) + # web_hook = "https://oapi.dingtalk.com/robot/send?access_token={}".format(token) + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/{}".format(token) + headers = {"Content-Type": "application/json"} + json_data = json.dumps(data) + rsp = requests.post(url=web_hook, data=json_data, headers=headers) + return rsp + + # print(data) + def send_feishu(self,inferfaces): + ''' + 发送飞书 + :return: + ''' + at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}] + message_data = {"msg_type": "post", "content": { + "post": {"zh_cn": {"title": "有存在的接口未实现自动化哦", + "content": [[{"tag": "text", "text": "问题数据:"}], + [{"tag": "text", "text": "{}".format(inferfaces)}], + at_user_list]}}}} + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/40696c86-264a-4222-a40c-cfd64a05dffd" + headers = {"Content-Type": "application/json"} + json_data = json.dumps(message_data) + print(json_data) + rsp = requests.post(url=web_hook, data=json_data, headers=headers) + return rsp + + def handle_send_message(self,root): + ''' + 处理对应所有人,根据job名称匹配来发送@的消息 + ''' + list_name_phone = {"陈江": "13458500234", "张楠": "", "罗志鹏": "", + "蒲思宇": "", "陈洁": "15328118883", "刘涛婷": "18328504751", "谯新久": "18202810506"} + job_name = self.GetJenkinsVar("JOB_TO_NAME") + job_url = self.GetJenkinsVar("JOB_TO_URL") + enviroment = self.GetJenkinsVar("JOB_ENVIRONMENT") + + # job_name = "123" + # job_url = "http://10.250.200.1:8080/jenkins/job/QA%E7%8E%AF%E5%A2%83%E5%B7%A1%E6%A3%80/2387/robot/report/report.html" + # enviroment = "PRODUCT" + + dict_info = self.get_fail_test_case(son_node=root) + BUILD_INFO = dict_info.get("BUILD_INFO") + fail_info = dict_info.get("INFO") + list_phone = [] + if BUILD_INFO: + for key, value in BUILD_INFO.items(): + list_phone.append(list_name_phone.get(key)) + print(list_phone) + print("+++++++{0}+++++{1}".format(job_name, job_url)) + if re.search("PRODUCT", enviroment): + # message_data = {"msg_type": "text", "content": { + # "text": "线上巡检:线上环境出现了问题,请点击进行查看{0},以下是错误日志:{1}".format(job_url + "robot/report/report.html",fail_info)}, + # "at": {"atMobiles": list_phone}} + + at_user_list = [{"tag": "at", "user_id": "{}".format("7020366258071715842")}] + message_data = {"msg_type": "post", "content": { + "post": {"zh_cn": {"title": "线上环境巡检", + "content": [[{"tag": "text", "text": "线上环境出现了问题:"}], + [{"tag": "a", "text": "点击查看","href":"".format(job_url + "robot/report/report.html")}], + at_user_list]}}}} + print(message_data) + self.send_message_by_dingding(message_data,environment="product") + + return enviroment + if re.search("QA", enviroment) or re.search("SIM", enviroment): + message_data = {"msg_type": "text", "content": { + "text": "{0}环境构建出问题了哦,请点击进行查看{1},以下是错误日志:{2}".format(enviroment, job_url + "robot/report/report.html",fail_info)}, + "at": {"atMobiles": list_phone}} + print(message_data) + self.send_message_by_dingding(message_data) + return enviroment + for key, value in list_name_phone.items(): + if re.search(key, job_name): + message_data = {"msg_type": "text", "content": { + "text": "亲爱的{0}同学,你的独立环境构建出问题了哦,请点击进行查看{1}".format(key, job_url + "robot/report/report.html")}, + "at": {"atMobiles": [value]}} + self.send_message_by_dingding(message_data) + return value + else: + return "这个job:{}没有找到人".format(job_name) + + def get_fail_test_case(self,son_node, father_node=None, grandpa_node=None): + """ + 功能:遍历xml文件的所有节点,搜索构建失败的用例信息 + """ + children_node = son_node.getchildren() + if len(children_node) == 0: + # if son_node.tag == 'doc': + # print(son_node.text) + # if son_node.tag == 'msg' and son_node.attrib['level'] == 'FAIL': + # # print(son_node.text) + # # print(son_node.attrib['timestamp']) + # print(children_node) + if son_node.tag == 'status' and son_node.attrib['status'] == 'FAIL' and 'critical' in son_node.attrib: + + # print(father_node.attrib["name"]) + tag = self.find_tags(father_node) + # a = self.find_error(father_node) + # print(a) + info_error = self.check_log_info(son_node.text) + INFO = "用例名称:" + father_node.attrib["name"] +"。人员:" + tag + "。失败日志:" + str(info_error) + run_time = son_node.attrib['endtime'] + # print(info_error) + # print(son_node.text) + # self.check_log_info(text=son_node.text) + run_time = "{}-{}-{} {}".format(run_time[0:4], run_time[4:6], run_time[6:8], run_time[9:17]) + reason = son_node.text.replace('"', '\\"') + # 满足构建时间,同时数据库中没有数据,才入库 + # print(run_time) + if tag in BUILD_INFO: + BUILD_INFO[tag] += 1 + else: + BUILD_INFO[tag] = 1 + # print(BUILD_INFO) + # print(tag) + self.list_info.append(INFO) + self.dict_info["BUILD_INFO"] = BUILD_INFO + self.dict_info["INFO"] = self.list_info + # print(tag) + + run_time = run_time + author = tag + case_name = father_node.attrib['name'] + file_path = grandpa_node.attrib['source'] + reason = reason[0:4500] + return self.dict_info + for child in children_node: + self.dict_info = self.get_fail_test_case(child, son_node, father_node) + return self.dict_info + + def check_log_info(self,text): + ''' + 过滤精确日志信息 + ''' + soup = BeautifulSoup(text, features="lxml") + list_info = [] + for a in soup.find_all(name='span'): + dict_info = {} + if a.text == "Old message:": + dict_info["old_message"] = a.nextSibling + list_info.append(dict_info) + elif a.text == "New message:": + dict_info["new_message"] = a.nextSibling + list_info.append(dict_info) + # print(a.nextSibling) + + if list_info: + return list_info + else: + return text + + + + def find_tags(self,root): + """ + 功能:在xml文件中搜索失败用对应的作者 + """ + children_node = root.getchildren() + for child in children_node: + if child.tag == 'tags': + tags = child.getchildren() + for tag in tags: + if 'qa-' in tag.text.lower(): + return tag.text[3:len(tag.text)] + return "无作者标签" + + def find_error(self,root): + """ + 功能:在xml文件中查询失败日志 + """ + children_node = root.getchildren() + for child in children_node: + if child.tag == 'kw': + msgs = child.getchildren() + for msg in msgs: + a = msg.tag + + # t = msg.attrib['level'] + l = msg.text + # print(msg.attrib['timestamp']) + if msg.tag == 'msg' and msg.attrib['level'] == 'FAIL': + print(msg.attrib) + s = msg.text + return msg.text + return "" + + def run(self): + ''' + 运行入口 + ''' + # FILE_PATH = "D:/output2.xml" + FILE_PATH = os.path.abspath(os.path.join(WORKSPACE, 'Report/out/output.xml')) + root = ET.parse(FILE_PATH).getroot() + # self.get_fail_test_case(son_node=root) + self.handle_send_message(root=root) + +if __name__ == '__main__': + test = handle_to_jenkins() + + # FILE_PATH = "D:/output1.xml" + # FILE_PATH = os.path.abspath(os.path.join(WORKSPACE, 'Report/out/output.xml')) + # root = ET.parse(FILE_PATH).getroot() + # print(test.get_fail_test_case(son_node=root)) + test.run() + # test.handle_send_message(root=root) \ No newline at end of file diff --git a/dulizhan/library/CommonFun/handle_jira.py b/dulizhan/library/CommonFun/handle_jira.py new file mode 100644 index 0000000..70fbe20 --- /dev/null +++ b/dulizhan/library/CommonFun/handle_jira.py @@ -0,0 +1,331 @@ +# -*- coding:utf-8 -*- +""" +人员当日jira任务、故事状态流转 +""" +import os, sys + +file_dir = os.path.dirname(__file__) +project_dir = os.path.abspath(os.path.join(file_dir, "..", "..", "..")) +sys.path.append(project_dir) + +from jira import JIRA +from base_framework.public_tools.utils import Tools +from base_framework.public_tools.read_config import ReadConfig +from base_framework.platform_tools.Message_service.Feishu_api import FeiShuMessage,get_user_name_by_email_prefix,get_feishu_config_value +from configparser import ConfigParser +from base_framework.base_config.current_pth import * +import datetime + +tools = Tools() +ReadConfig = ReadConfig(filename=la_config_path) +FS_INFO = [{"team": "TO", "users": "wuyonggang,xuwenjun,luohong"}, + {"team": "TO-RD", "users": "fengtian,guosongchao,zhaoxiaofang," + "zhuliang,majincheng,gaozhijun,liuxuegang," + "zhangxiong"}, + {"team": "USER-FE", "users": "zhaofei,liuxinlin,qingchen,yefei,xiangming,jianghao,jianglingmin,xuchangle," + "libaicheng,gouyuheng,jixiang.dong,baiyang01"} + ] + + +class JiraApi: + def __init__(self): + self.jira = JIRA(server='https://jira.bg.huohua.cn/', + basic_auth=("wuyonggang", "Mima@123")) + + def close_jira_subtask(self, user_name): + """ + 功能: 关闭指定人员名下当天结束的子任务 + 请求参数 user_name (指定人员jira登录名,type: list) + """ + bad_name = [] + right_name = [] + for j in user_name: + if j not in ReadConfig.get_sections(): + bad_name.append(j) + elif j in ReadConfig.get_sections(): + right_name.append(j) + success = [] + false = [] + today_time = tools.get_format_date(r_type=1) + work_start_time = datetime.datetime.strptime('{0} 10:00:00'.format(today_time), '%Y-%m-%d %H:%M:%S') + for name in right_name: + jira = JIRA(server='https://jira.bg.huohua.cn/', basic_auth=(name, ReadConfig.get_value(name, 'password'))) + jql = 'project = HHC AND issuetype = 子任务 AND status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计,' \ + ' 产品需求内审, 需求评审, 排期, 执行, 开发, 待测试, QA测试, SIM验证, 验证中, 待办, 处理中, 关闭) AND resolution = Unresolved' \ + ' AND (QA in ({0}) OR assignee in ({1})) ORDER BY priority DESC, updated DESC'.format(name,name) + issues = jira.search_issues(jql, fields='') + # if len(issues) == 0: break + not_need_closed = 0 + for i in issues: + s = list(jira.transitions(i)) + close_status_id = [x['id'] for x in s if x['name'] == '关闭'] + if str(i.fields.status) == '处理中': + if i.fields.aggregatetimeestimate != None: + if i.fields.aggregatetimeestimate > 28800: + jira.add_worklog(i, timeSpent='7', started=work_start_time) + elif 0 < i.fields.aggregatetimeestimate <= 28800: + jira.add_worklog(i, timeSpent='{0}'.format(i.fields.aggregatetimeestimate / 3600), + started=work_start_time) + else: + jira.add_worklog(i, timeSpent='8', started=work_start_time) + if str(i.fields.status) == '处理中' and str(i.fields.customfield_13406) == today_time: + jira.transition_issue(i, int(close_status_id[0])) + else: + not_need_closed += 1 + issues2 = jira.search_issues(jql, fields='') + if not_need_closed == len(issues2): + success.append(name) + else: + false.append(name) + return "{0}今日结束的子任务已关闭成功; {1}今日结束的子任务关闭失败; {2}没有进行账号配置".format(success, false, bad_name) + + def start_jira_subtask(self, user_name): + """ + 功能: 将待开始为今天的子任务状态流转为“处理中” + 请求参数 user_name (指定人员jira登录名,type: list) + """ + bad_name = [] + right_name = [] + for j in user_name: + if j not in ReadConfig.get_sections(): + bad_name.append(j) + elif j in ReadConfig.get_sections(): + right_name.append(j) + success = [] + false = [] + for name in right_name: + jira = JIRA(server='https://jira.bg.huohua.cn/', basic_auth=(name, ReadConfig.get_value(name, 'password'))) + jql = 'project = HHC AND issuetype = 子任务 AND status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计, 产品需求内审, 需求评审, ' \ + '排期, 执行, 开发, 待测试, QA测试, SIM验证, 验证中, 待办, 关闭) AND resolution = Unresolved' \ + ' AND (QA in ({0}) OR assignee in ({1})) ORDER BY priority DESC, updated DESC'.format(name,name) + today_time = tools.get_format_date(r_type=1) + issues = jira.search_issues(jql, fields='') + # if len(issues) == 0: break + not_need_update = 0 + for i in issues: + s = list(jira.transitions(i)) + start_status_id = [x['id'] for x in s if x['name'] == '处理中'] + if str(i.fields.status) == '待办' and str(i.fields.customfield_12700) == today_time: + jira.transition_issue(i, int(start_status_id[0])) + else: + not_need_update += 1 + issues2 = jira.search_issues(jql, fields='') + if not_need_update == len(issues2): + success.append(name) + else: + false.append(name) + return "{0}今日开始的子任务已将状态修改为“处理中”‘; {1}今日开始的子任务状态修改失败; {2}没有进行账号配置".format(success, false, bad_name) + + def change_story(self, user_name, type): + """ + 功能: 将提测时间为今天的指定人员名下的故事状态修改至“QA测试” + 请求参数 user_name (指定人员jira登录名,type: list) + type (故事需要修改至的状态 1:提测日为今天,状态修改至【QA测试】 2:上线日为今天,状态修改至【关闭】) + """ + bad_name = [] + right_name = [] + for j in user_name: + if j not in ReadConfig.get_sections(): + bad_name.append(j) + elif j in ReadConfig.get_sections(): + right_name.append(j) + success = [] + false = [] + for name in right_name: + jira = JIRA(server='https://jira.bg.huohua.cn/', basic_auth=(name, ReadConfig.get_value(name, 'password'))) + jql = "project = HHC AND issuetype = 故事 AND " \ + "status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计, 产品需求内审, 需求评审, 排期, 执行, 开发, 待测试, 验证中, 待办, QA测试, SIM验证, 处理中, 关闭)" \ + " AND resolution = Unresolved AND QA in ({0}) ORDER BY priority DESC, updated DESC".format(name) + today_time = tools.get_format_date(r_type=1) + issues = jira.search_issues(jql, fields='') + # if len(issues) == 0 : break + x = 0 + need_update = 0 + if type == 1: # 将故事状态一直流转至“QA测试” + for i in issues: + if str(i.fields.status) == 'QA测试' or str(i.fields.status) == 'SIM验证': need_update += 1 + if str(i.fields.customfield_10504) == today_time: + if str(i.fields.status) != 'QA测试' and str(i.fields.status) != 'SIM验证': + need_update += 1 + for j in range(8): + jira.transition_issue(i, int(jira.transitions(i)[2]['id'])) + issues_2 = jira.search_issues(jql, fields='') # 重新获取所有故事 + status_now = issues_2[x].fields.status + print(status_now) + if str(status_now) == 'QA测试' or str(status_now) == 'SIM验证': + break + x += 1 + jql2 = "project = HHC AND issuetype = 故事 AND " \ + "status in (重新打开, 启动, 需求池, 暂停, 计划, 产品需求设计, 产品需求内审, 需求评审, 排期, 执行, 开发, 待测试, 验证中, 待办, 处理中, 关闭)" \ + " AND resolution = Unresolved AND QA in ({0}) ORDER BY priority DESC, updated DESC".format(name) + issues2 = jira.search_issues(jql2, fields='') + if len(issues2) == len(issues) - need_update: + success.append(name) + else: + false.append(name) + elif type == 2: # 直接将故事关闭 + for i in issues: + if str(i.fields.customfield_10606) == today_time: + jira.transition_issue(i, int(jira.transitions(i)[1]['id']), comment="已上线") # 将故事修改为关闭状态 + need_update += 1 + issues2 = jira.search_issues(jql, fields='') + if len(issues2) + need_update == len(issues): + success.append(name) + else: + false.append(name) + + return "{0}今日的故事已将状态修改成功!; {1}今日的故事状态修改失败; {2}没有进行账号配置".format(success, false, bad_name) + + def change_jira_status(self, user_name): + """ + 功能: 判断当前时间是否在下午18:00点以前,来选择打开或关闭【子任务】和【故事】 + 请求参数 user_name (指定人员jira登录名,type: list) + """ + time_now = tools.get_format_date(r_type=4) + time_now2 = '{0} 18:00:00'.format(time_now[0:10:1]) + if time_now < '{0} 18:00:00'.format(time_now2): + a = self.start_jira_subtask(user_name) + b = self.change_story(user_name, type=1) + return a + '\n' + b + elif time_now >= '{0} 18:00:00'.format(time_now2): + a = self.close_jira_subtask(user_name) + b = self.change_story(user_name, type=2) + return a + '\n' + b + + def query_jira_subtask(self, user_name, begin_date=0, end_date=0): + """ + | 功能 | 查询用户对应的jira子任务 | + | 入参 | user_name | 用户名字 | + | | begin_date | 开始时间:0-今天,X-未来X天,-X-过去的X天 | + | | end_date | 开始时间:0-今天,X-未来X天,-X-过去的X天 | + """ + b_date = tools.get_format_date(r_type=1, add_days=int(begin_date)) + e_date = tools.get_format_date(r_type=1, add_days=int(end_date)) + jql = "issuetype = 子任务 AND 计划开始时间 <= {} AND 计划结束时间 >= {} AND assignee in ({}) ORDER BY cf[12700] ASC"\ + .format(b_date, e_date, user_name) + issues = self.jira.search_issues(jql, fields='') + # print(jql) + return issues + # for item in issues: + # print("{0}:{1}, 当前状态:{2}".format(item.key, item.fields.summary, item.fields.status)) + + def query_jira_by_id(self, jira_id): + """ + | 功能 | 跟进jira的id查询具体详情 | + | 入参 | jira_id | jira的id | + """ + jql = "id={}".format(jira_id) + issues = self.jira.search_issues(jql, fields='') + if len(issues) == 0: + raise Exception("根据jira_id未查询到对应的jira信息,请检查....") + rd = issues[0].fields.assignee.displayName + qa = issues[0].fields.reporter.displayName + title = issues[0].fields.summary + status = issues[0].fields.status + j_time = issues[0].fields.created + j_time = j_time[0:10] + ' ' + j_time[11:19] + return {"jira_rd": rd, + "jira_qa": qa, + "jira_title": title, + "jira_time": j_time, + "jira_status": str(status)} + + def query_overdue_issues(self, user_name): + """ + | 功能 | 查询逾期的子任务和故事 | + | 入参 | 无 | + """ + today = tools.get_format_date() + check_time = tools.get_format_date(r_type=4) + if check_time < "{} 17:00:00".format(today): + jql = "issuetype in (故事,子任务) AND (计划结束时间 1: + dict_response[level] = list_level.count(level) + if dict_response: + return {"code":500,"data":dict_response} + else: + return {"code":200,"data":dict_response} + +class student_verity(): + def __init__(self): + self.get_url = auth_login() + + def get_schedule_count(self): + ''' + + :return: + ''' + m_token = self.get_url.get_m_online_token() + headers = self.get_url.get_m_headers(m_token=m_token) + url = self.get_url.get_student_config_info(url_name="scheduleCount_url") + print(url) + get_response_data = self.get_url.get_json_result(url=url, headers=headers, request_data={"subjectType": 4}) + + return get_response_data + + +if __name__ == '__main__': + test = auth_login() + test1 = m_parent() + test2 = student_verity() + # print(test.get_student_online_token()) + # print(test1.get_recommendedCourse()) + print(test1.get_trial_level(courseSubtype=22)) + # print(test2.get_schedule_count()) diff --git a/dulizhan/library/CommonFun/handle_mq.py b/dulizhan/library/CommonFun/handle_mq.py new file mode 100644 index 0000000..52edde6 --- /dev/null +++ b/dulizhan/library/CommonFun/handle_mq.py @@ -0,0 +1,19 @@ +import pika + +# 设置RabbitMQ服务器的连接参数,使用自定义端口9876 +connection_params = pika.ConnectionParameters('rocketmq.qa.huohua.cn', 9876) +connection = pika.BlockingConnection(connection_params) +channel = connection.channel() + +# 声明一个队列,如果队列不存在则会创建 +queue_name = 'my_queue' +channel.queue_declare(queue=queue_name) + +# 发布消息到指定的队列 +message = 'Hello, World!' +channel.basic_publish(exchange='', + routing_key=queue_name, + body=message) +print(f" [x] Sent '{message}'") +# 关闭连接 +connection.close() diff --git a/dulizhan/library/CommonFun/handle_picture.py b/dulizhan/library/CommonFun/handle_picture.py new file mode 100644 index 0000000..24030f2 --- /dev/null +++ b/dulizhan/library/CommonFun/handle_picture.py @@ -0,0 +1,56 @@ +# -*- coding:utf-8 -*- +""" +Author: qiaoxinjiu +Email: qiaoxinjiu@sparkedu.com +Create Date: 2022/05/08 5:58 下午 +""" +import os +from PIL import Image + +def image_gray(img): + # 打开图片 + img = Image.open(img) + + # 计算平均灰度值 + gray_sum = 0 + count = 0 + for x in range(img.width): + for y in range(img.height): + if img.mode == "RGB": + r, g, b = img.getpixel((x, y)) + gray_sum += (r + g + b) / 3 + elif img.mode == "L": + gray_value = img.getpixel((x, y)) + gray_sum += gray_value + count += 1 + + avg_gray = gray_sum / count + return avg_gray + + +def find_image(folder_path): + # 定义一个列表存储图片路径 + images = [] + # 遍历文件夹下的所有文件 + for root, dirs, files in os.walk(folder_path): + for file in files: + file_path = os.path.join(root, file) + # 处理每个文件,将其添加到列表中 + images.append(file_path) + return images + + +def assert_run(folder_path): + images = find_image(folder_path) + for img in images: + gray = image_gray(img) + # 灰度值小于50,将认为是黑图 + if gray < 50: + print(img, ":", gray) + + +if __name__ == "__main__": + # image_gray() + # find_image() + folder_path = r'D:\picture' + assert_run(folder_path) diff --git a/dulizhan/library/CommonFun/handle_tools.py b/dulizhan/library/CommonFun/handle_tools.py new file mode 100644 index 0000000..2d0d25f --- /dev/null +++ b/dulizhan/library/CommonFun/handle_tools.py @@ -0,0 +1,211 @@ +# -*- coding:utf-8 -*- +""" +Author: qiaoxinjiu +Email: xinjiu.qiao@allschool.com +Create Date: 2022/04/26 5:58 下午 +""" +import os +import sys + +input_team_name = sys.argv + +BASIC_PATH = os.path.dirname(os.path.abspath(__file__)) +TEAM_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../../{}'.format("base_framework"))) +sys.path.append(TEAM_PATH) +PROJECT_PATH = os.path.abspath(os.path.join(BASIC_PATH, '../../..')) +sys.path.append(PROJECT_PATH) +from base_framework.public_tools.sqlhelper import MySqLHelper +import json +import requests + +obj_mysql_helper = MySqLHelper() + + +class Handle_tools: + def __init__(self): + pass + + def query_interface_sql(self): + ''' + 查询qa的余量接口信息 + :return: + ''' + query_sql = ''' SELECT in_url,controller_name + FROM + sparkatp.interface_info + WHERE + id IN ( + SELECT + a.id + FROM + (SELECT * from sparkatp.interface_info) a + WHERE + ( a.swagger_id in (SELECT id FROM sparkatp.swagger_info WHERE team="UBRD") ) + AND a.created_time > "2022-01-01 00:00:50" + AND is_used = 1 and at_numbers = 0 and offline=0 and jira_id is null) ORDER BY created_time''' + + query_sql_r = """SELECT + si.id AS interface_id, + rpgm.jira_id, + si.in_url +FROM + ( + SELECT + ii.id, + ii.in_url, + ii.jira_id + FROM + sparkatp.interface_info ii + WHERE + ii.swagger_id IN ( SELECT id FROM sparkatp.swagger_info WHERE team = "UBRD" ) + AND ii.created_time > "2022-01-01 00:00:50" + AND ii.is_used = 1 + AND ii.at_numbers = 0 + AND ii.offline = 0 + AND ii.jira_id IS NULL + ) si + INNER JOIN ( + SELECT + rp.interface_id, + rp.jira_id, + MAX( modified_time ) + FROM + request_parameters rp + WHERE + rp.jira_id IS NOT NULL + AND rp.jira_id <> 'None' + AND rp.jira_id <> '' + GROUP BY + rp.interface_id + ) rpgm ON rpgm.interface_id = si.id;""" + + # query_sql = " SELECT * FROM sparkatp.interface_info WHERE id IN (SELECT a.id FROM(SELECT * from sparkatp.interface_info) a WHERE( a.swagger_id in (SELECT id FROM sparkatp.swagger_info WHERE team='UBRD') ) AND a.created_time > '2022-01-01 00:00:50' AND is_used = 1 and at_numbers = 0 and offline=0 and jira_id is null) ORDER BY created_time" + query_sql_r_result = obj_mysql_helper.select_all(query_sql_r) + query_sql_dict = {} + query_sql_dict_temp = {} + # : {'interface_id': 924646, 'jira_id': 'HHC-48875', 'in_url': 'http://peppa-parent-api.qa.huohua.cn/classes/audition/enter'} + for qsrr in query_sql_r_result: + in_url = "{}_{}".format(str(qsrr.get('interface_id')).strip(' '), qsrr.get('in_url').strip(' ')) + if qsrr.get('jira_id') in query_sql_dict.keys(): + if in_url in query_sql_dict.get(qsrr.get('jira_id')): + pass + else: + query_sql_dict[qsrr.get('jira_id')].append(in_url) + else: + query_sql_dict[qsrr.get('jira_id')] = [in_url] + + query_sql_s = """SELECT + si.id AS interface_id, + rpgm.jira_id, + si.in_url +FROM + ( + SELECT + ii.id, + ii.in_url, + ii.jira_id + FROM + sparkatp.interface_info ii + WHERE + ii.swagger_id IN ( SELECT id FROM sparkatp.swagger_info WHERE team = "UBRD" ) + AND ii.created_time > "2022-01-01 00:00:50" + AND ii.is_used = 1 + AND ii.at_numbers = 0 + AND ii.offline = 0 + AND ii.jira_id IS NULL + ) si + INNER JOIN ( + SELECT + rp.interface_id, + rp.jira_id, + MAX( modified_time ) + FROM + response_parameters rp + WHERE + rp.jira_id IS NOT NULL + AND rp.jira_id <> 'None' + AND rp.jira_id <> '' + GROUP BY + rp.interface_id + ) rpgm ON rpgm.interface_id = si.id;""" + + query_sql_s_result = obj_mysql_helper.select_all(query_sql_s) + for qsrs in query_sql_s_result: + in_url = "{}_{}".format(str(qsrs.get('interface_id')).strip(' '), qsrs.get('in_url').strip(' ')) + if qsrs.get('jira_id') in query_sql_dict.keys(): + if in_url in query_sql_dict[qsrs.get('jira_id')]: + pass + else: + query_sql_dict[qsrs.get('jira_id')].append(in_url) + else: + query_sql_dict[qsrs.get('jira_id')] = [in_url] + return query_sql_dict + + def send_log_info(self): + ''' + 每天进行日志提醒 + :return: + ''' + feishu_name_id = {"罗志鹏": "7020366259502153730", "谯新久": "7020366258071715842", + "陈洁": "7020370251997069314", "蒲思宇": "7076270364313108481", "张楠": "7076270369128349697", + "刘涛婷": "7020366262240854017"} + order_list = ["谯新久", "陈洁", "刘涛婷", "罗志鹏", "蒲思宇", "张楠"] + # for name in order_list: + + def send_feishu(self, inferfaces): + ''' + 发送飞书 + :return: + ''' + at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}] + message_data = {"msg_type": "post", "content": { + "post": {"zh_cn": {"title": "有存在的接口未实现自动化哦", + "content": [[{"tag": "text", "text": "问题数据:"}], + [{"tag": "text", "text": "{}".format(inferfaces)}], + at_user_list]}}}} + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/40696c86-264a-4222-a40c-cfd64a05dffd" + headers = {"Content-Type": "application/json"} + json_data = json.dumps(message_data) + print(json_data) + rsp = requests.post(url=web_hook, data=json_data, headers=headers) + return rsp + + def send_message_by_feishu(self, web_hook, data): + headers = {"Content-Type": "application/json"} + json_data = json.dumps(data) + rsp = requests.post(url=web_hook, data=json_data, headers=headers) + return rsp + + def compare_txt(self, su_t, st_t): + ''' + 对比两个文档,返回不同的信息 + :param su_t: + :param st_t: + :return: + ''' + file_object1 = open(su_t, 'r', encoding='utf-8') + file_object2 = open(st_t, 'r', encoding='utf-8') + try: + while True: + line = file_object1.readline() + lines = file_object2.readline() + if line.strip() != lines.strip(): + print("pc :", line) + print("right:", lines) + else: + continue + finally: + file_object1.close() + file_object2.close() + + +if __name__ == '__main__': + test = Handle_tools() + # get_interfaces = test.query_interface_sql() + # if get_interfaces: + # test.send_feishu(json.dumps(get_interfaces)) + # else: + # print("都已经完成") + su_t = r"D:\UiVispark\spark1.txt" + st_t = r"D:\UiVispark\spark2.txt" + test.compare_txt(st_t=st_t,su_t=su_t) \ No newline at end of file diff --git a/dulizhan/library/CommonFun/host_update.ini b/dulizhan/library/CommonFun/host_update.ini new file mode 100644 index 0000000..8e3f842 --- /dev/null +++ b/dulizhan/library/CommonFun/host_update.ini @@ -0,0 +1 @@ +host_list = [{"ip":'127.0.0.1',"host_names":"ts.sim.huohua.cn"},{"ip":'127.0.0.1',"host_names":"student-api.sim.huohua.cn"}] \ No newline at end of file diff --git a/dulizhan/library/CommonFun/host_update.py b/dulizhan/library/CommonFun/host_update.py new file mode 100644 index 0000000..ab5cda7 --- /dev/null +++ b/dulizhan/library/CommonFun/host_update.py @@ -0,0 +1,263 @@ +# -*- coding:utf-8 -*- +# @Time : 2023/7/5 10:27 +# @Author: luozhipeng +# @File : host_update.py +import os +from python_hosts import Hosts, HostsEntry +import sys +LOCAL_PATH = os.path.dirname(os.path.abspath(__file__)) +BASE_PROJECT_PATH = os.path.abspath(os.path.join(LOCAL_PATH, '../../../{}'.format("UBRD"))) +BASIC_PATH = os.path.abspath(os.path.join(LOCAL_PATH, '../../../')) +sys.path.append(BASE_PROJECT_PATH) +sys.path.append(BASIC_PATH) +from base_framework.public_tools.utils import Tools +from base_framework.public_tools.apollo import Apollo +import requests, time +import os +import sys +import socket +import subprocess +import requests +import urllib.parse +obj_apollo = Apollo() + +obj_tools = Tools() + +class HostUpdate: + def __init__(self): + if sys.platform.startswith('win'): + self.hosts_location = Hosts(path='C:\Windows\System32\drivers\etc\hosts') + elif sys.platform.startswith('darwin'): + self.hosts_location = Hosts(path='\etc\hosts') + + def host_update_by_host_dict(self, host_dict_list: list): + + entry_list = [] + for host in host_dict_list: + new_entry = HostsEntry(entry_type='ipv4', address=host['ip'], names=[host['host_name'], '']) + entry_list.append(new_entry) + self.hosts_location.add(entry_list) + self.hosts_location.write() + + def host_remove_intercept(self,address,name): + self.hosts_location.remove_all_matching(address,name) + self.hosts_location.write() + + def get_ip_by_host_domain(self,domain: str): + ip=socket.gethostbyname(domain) + return ip + + def wait_dns_flush(self,ip,domain): + count=1 + while True: + + cmd1="ipconfig /flushdns" + result1=subprocess.run(cmd1,capture_output=True,text=True) + output1=result1.stdout + print(output1) + cmd2="ping {}".format(domain) + result2=subprocess.run(cmd2,capture_output=True,text=True) + output2=result2.stdout + print(output2) + cmd="ipconfig /displaydns" + result=subprocess.run(cmd,capture_output=True,text=True) + output=result.stdout + print(output) + if output is None: + output='' + if ip in output: + break + if count >= 30: + break + count=count + 1 + host_list=[{"ip": ip,"host_name": domain}] + self.host_remove_intercept(ip,domain) + self.host_update_by_host_dict(host_list) + time.sleep(2) + + +class CoreApollo: + def __init__(self,show_username=None,password=None,current_evn=None): + if not show_username: + self.show_username="liuruiquan" + if not password: + self.password="lrq5823LRQ" + self.apollo_url="http://apollo.qa.huohua.cn/signin" + if not current_evn: + self.current_evn="SIM" + self.apollo_host="http://apollo.qa.huohua.cn" + self.session=self.core_apollo_login() + + def core_apollo_login(self): + post_data=dict() + post_data['login-submit']='登录' + post_data['username']=self.show_username + post_data['password']=self.password + req_session=requests.Session() + resp=req_session.post(url=self.apollo_url,data=post_data) + return req_session + + def get_key(self,server,cluster,key,project): + req_url="%s/apps/%s/envs/%s/clusters/%s/namespaces" % ( + self.apollo_host,server,self.current_evn,cluster) + resp=self.session.get(url=req_url).json() + for item in resp: + base_info=item.get('baseInfo') + items=item.get('items') + if not base_info['namespaceName'].lower() == project.lower(): + continue + for key_info in items: + item_detail=key_info["item"] + if item_detail["key"] == key: + return key_info["item"] + else: + return None + + def set_key(self,key,value,cluster='default',server="",project=None): + if server: + self.server=server + req_url="%s/apps/%s/envs/%s/clusters/%s/namespaces/%s/item" % ( + self.apollo_host,self.server,self.current_evn,cluster,project) + items=self.get_key(server,cluster,key,project) + if items is None: + items=dict() + items["value"]=value + items["key"]=key + items["tableViewOperType"]='create' + items["addItemBtnDisabled"]=True + + else: + items["value"]=value + items["tableViewOperType"]='update' + update_resp=self.session.put(url=req_url,json=items) + + assert update_resp.status_code == 200 + release_body=dict() + release_time_stamp=time.localtime() + release_time='%s-release' % time.strftime("%Y%m%d%H%M%S",release_time_stamp) + release_body["isEmergencyPublish"]=False + release_body["releaseComment"]="" + release_body["releaseTitle"]=release_time + release_url="%s/apps/%s/envs/%s/clusters/%s/namespaces/%s/releases" % ( + self.apollo_host,self.server,self.current_evn,cluster,project) + resp=self.session.post(url=release_url,json=release_body) + assert resp.status_code == 200 + time.sleep(5) + + def set_user_force_true(self,vlaue="true"): + self.set_key(value=vlaue,key="user-token.forceFallback",server="peppa-core-api",cluster="check" + ,project="application") + + def set_teacher_force_true(self,vlaue="true"): + self.set_key(value=vlaue,key="sso-token.forceFallback",server="peppa-core-api",cluster="check" + ,project="application") + + +class EduClassroom: + def kw_ubrd_get_online_test_classroom(self,post_data_input=None): + post_data = dict() + host = "sso.huohua.cn" + api_url = "https://{}/authentication/form".format(host) + show_username = "liuruiquan" + username = "liuruiquan" + password = "lrq5823LRQ" + post_data['showUsername'] = show_username + post_data['username'] = username + post_data['password'] = password + user_agent = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"} + deviceid = {"SSO_DEVICE_ID":"8dfbecf2-064a-4e3f-ac2b-fc09a2401416"} + req_session = requests.session() + req_session.cookies.update(deviceid) + req_session.headers.update(user_agent) + resp = req_session.post( + url=api_url, + data=post_data, + allow_redirects=False) + + # token_header = {"accesstoken": token} + # req_session.headers.update(token_header) + # print(token_header) + client_id = "tic-payment-admin" + origin_url="aHR0cHM6Ly9zc28uaHVvaHVhLmNuLw==" + # origin_url="aHR0cHM6Ly9zc28uc2ltLmh1b2h1YS5jbi8=" + + redirect_uri = "https://{}/uim/authorize_proxy?client_id={}&debug_mode=1&origin_url={}".format(host,client_id,origin_url) + print(redirect_uri) + token_code_url = "https://{}/oauth/authorize?client_id={}&response_type=code&".format(host,client_id,redirect_uri) + authorize_data = {"redirect_uri": redirect_uri} + authorize_data_uri =urllib.parse.urlencode(authorize_data) + resp = req_session.get( + url=token_code_url+authorize_data_uri, + data=authorize_data, + allow_redirects=False) + print(resp.url) + print(resp.headers) + print(resp) + + # token_url = "https://{}/uim/authorize_proxy?client_id={}&debug_mode=1&origin_url={}&code={}".format(host,client_id,origin_url,code) + token_url= resp.headers["Location"] + # authorize_code_data = {"client_id":"tic-payment-admin","debug_mode": 1,"origin_url": origin_url,"code":code} + + print(token_url,"token_url") + # print(authorize_code_data) + resp = req_session.get( + url=token_url, + # data=authorize_code_data, + allow_redirects=False) + print(resp) + print(resp.url) + for key, value in req_session.cookies.items(): + if key == 'peppa_sso_token': + token = value + token_header = {"accesstoken": token} + req_session.headers.update(token_header) + print(token_header) + print(value) + break + + + op_time = obj_tools.get_format_date(r_type=4,add_minutes=10) + print(op_time) + + create_classroom_json = {"courseId":1898,"unionFlag":0,"lessonId":49264,"planStudentCount":4,"timezoneName":"Asia/Shanghai","openTime":op_time,"overseasTag":0,"secondOpenTime":op_time,"teacherId":36573,"type":100} + api_url_created_classroom = "https://teach-api.huohua.cn/peppa-teach-api/classroom" + create_classroom_resp = req_session.post( + url=api_url_created_classroom, + json=create_classroom_json) + # print(req_session.headers) + # print(req_session.cookies) + # print(resp.content) + # print(resp.url) + print(create_classroom_resp.json()) + classroom_id = create_classroom_resp.json()['data']["classroomId"] + print(create_classroom_resp.json()) + # + # return req_session + add_student_json = {"classroomId":classroom_id,"studentId":274886,"userId":275774,"joinType":0,"ignoreClassHour":1} + api_url_add_student = "https://teach-api.huohua.cn/peppa-teach-api/classroom_student/add" + add_student_resp = req_session.post( + url=api_url_add_student, + json=add_student_json) + print(add_student_resp.json()) + + # return req_session + add_student_json1 = {"classroomId":classroom_id,"studentId":5635578,"userId":5646962,"joinType":0,"ignoreClassHour":1} + add_student_resp1 = req_session.post( + url=api_url_add_student, + json=add_student_json1) + print(add_student_resp1.json()) + +if __name__ == '__main__': + + + host_list = [{"ip": "127.0.0.1", "host_name": "ts.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "its.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "student-api.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "sentry.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "gray.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "classroom-api.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "logserver.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "zipkin.sim.huohua.cn"}, + {"ip": "127.0.0.1", "host_name": "gs.sim.huohua.cn"}] + A = EduClassroom() + A.kw_ubrd_get_online_test_classroom() \ No newline at end of file diff --git a/dulizhan/library/CommonFun/statistical_function.py b/dulizhan/library/CommonFun/statistical_function.py new file mode 100644 index 0000000..e54072d --- /dev/null +++ b/dulizhan/library/CommonFun/statistical_function.py @@ -0,0 +1,142 @@ +import os +import re +import threading + + +class StatisticalFunction: + def __init__(self): + self.java_dir =[] + self.zh_file = [] + self.python_dir = [] + self.robot_dir = [] + + + def check_lang_every_word(self,file_path): + """ 获取文件中注释外含中文的文档 """ + # file_path ='C:\\Users\\HuoH # a=time.time()ua\\Downloads\\peppa-parent-api\\src\\main\\java\\com\\peppa\\parent\\api\\common\\ApiErrorEnum.java' + with open(file_path,'r',encoding='utf-8') as text: + all_content = text.read() + all_content = all_content.encode('utf-8') + all_content = all_content.decode('utf-8','ignore') + yy= re.sub("\/\*\*.*?\*\*\/", "",all_content) # 去除多行注释 + yy = re.sub("\/\*[\w\W]*?\*\/|\/\/.*", "", yy) # 去除文本注释 + yy = re.sub("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%0AlQYV%&GY5Z2XK{IZ;sBUoPnRQF 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 literal 0 HcmV?d00001 diff --git a/dulizhan/library/Dlizhan_interface.py b/dulizhan/library/Dlizhan_interface.py new file mode 100644 index 0000000..12882a7 --- /dev/null +++ b/dulizhan/library/Dlizhan_interface.py @@ -0,0 +1,337 @@ +# -*- coding:utf-8 -*- +import os +import sys + +current_file_path = os.path.abspath(__file__) +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../')) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +from base_framework.public_tools import log +from base_framework.public_tools.runner import Runner +from base_framework.public_tools.eureka_api import EurekaAPI +from base_framework.public_tools import utils +from base_framework.public_tools.pgsqlhelper import PgSqlHelper +import requests +import json + +obj_log = log.get_logger() +obj_runner = Runner() +eureka = EurekaAPI() + + +class DlzhanInterface: + def __init__(self): + self.domain_url = eureka.get_url_from_config() + self.pg_db = PgSqlHelper() + self.joyhub_domain = "https://joyhub-website-manager-api-test.best-envision.com" + self.token = None + + def _get_joyhub_headers(self): + headers = { + 'Content-Type': 'application/json', + 'tenant-id': '126' + } + if self.token: + headers['Authorization'] = 'Bearer ' + self.token + return headers + + def set_joyhub_token(self, token): + self.token = token + + def _joyhub_request(self, method, path, is_check='', note='', **kwargs): + url = "{}{}".format(self.joyhub_domain, path) + headers = self._get_joyhub_headers() + obj_log.info("=========== {} ===========".format(note or path)) + + req_params = {} + for key, value in kwargs.items(): + if value is not None and value != '': + req_params[key] = value + + req_map = { + 'GET': lambda: requests.get(url, headers=headers, params=req_params, verify=False), + 'POST': lambda: requests.post(url, headers=headers, json=req_params, verify=False), + 'PUT': lambda: requests.put(url, headers=headers, json=req_params, verify=False), + 'DELETE': lambda: requests.delete(url, headers=headers, verify=False) + } + + resp = req_map.get(method.upper(), lambda: None)() + self._check_resp(is_check, resp) + return resp.json() + + def _clear_user_fingerprint(self, username): + try: + sql = "UPDATE system_users SET fingerprint = '' WHERE username = %s" + cursor, conn, count = self.pg_db.execute(sql, (username,), choose_db='joyhub') + obj_log.info(f"清除用户 {username} 的指纹锁,影响行数: {count}") + self.pg_db.close(cursor, conn) + return count >= 0 + except Exception as e: + obj_log.error(f"清除指纹锁失败: {str(e)}") + return False + + def kw_in_zhyy_purchase_todo_get(self, is_check='', **kwargs): + user, kwargs = self._get_user(kwargs) + kwargs = self._convert_json(kwargs) + url = "%s/erp/purchase-workbench/get-todo" % self.domain_url + obj_log.info("your input:{0}".format(kwargs)) + resp = obj_runner.call_rest_api(API_URL=url, req_type="GET", user=user) + self._check_resp(is_check, resp) + return resp + + def kw_in_zhyy_purchase_order_page_post(self, is_check='', **kwargs): + user, kwargs = self._get_user(kwargs) + kwargs = self._convert_json(kwargs) + url = "%s/erp/purchase-order/page" % self.domain_url + obj_log.info("your input:{0}".format(kwargs)) + resp = obj_runner.call_rest_api(API_URL=url, req_type="POST", json=kwargs, user=user) + self._check_resp(is_check, resp) + return resp + + def _get_user(self, kwargs): + user = kwargs.get("user", "purchase") + if "user" in kwargs: + del kwargs["user"] + return user, kwargs + + def _convert_json(self, kwargs): + return kwargs + + def _check_resp(self, is_check, resp): + if is_check == 'true': + assert resp is not None, "响应为空" + if hasattr(resp, 'json'): + resp_json = resp.json() + assert resp_json.get('code') == 0, f"请求失败,code={resp_json.get('code')}" + return resp + + def kw_in_joyhub_auth_login_post(self, is_check='', **kwargs): + obj_log.info("=========== JoyHub 登录接口 ===========") + + username = kwargs.get("username", "") + password = kwargs.get("password", "") + max_retries = kwargs.get("max_retries", 3) + token = kwargs.get("token", "") + + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + + session = requests.session() + session.headers.update({ + 'isencrypt': 'true', + 'x-api-encrypt': 'true', + 'tenant-id': '126' + }) + + resp = obj_runner._Runner__call_api(session, url, req_type="POST", json=kwargs) + + if resp is not None and not isinstance(resp, Exception): + try: + resp_json = resp.json() + except Exception: + try: + resp_json = json.loads(resp.text) + except Exception: + resp_json = None + + if resp_json is not None: + code = resp_json.get('code') + if code == 0 or code == 200: + obj_log.info("登录成功") + self._check_resp(is_check, resp_json) + return resp_json + elif code == 401: + obj_log.warning("登录失败,尝试清除指纹后重新登录") + + if resp is not None and not isinstance(resp, Exception): + try: + resp_json = resp.json() + except Exception: + resp_json = None + else: + resp_json = None + + self._check_resp(is_check, resp_json) + return resp_json + + def kw_in_joyhub_role_create_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/system/role/create', is_check, '创建角色', **kwargs) + + def kw_in_joyhub_role_delete_post(self, is_check='', **kwargs): + role_id = kwargs.get('id', '') + return self._joyhub_request('DELETE', f'/admin-api/system/role/delete?id={role_id}', is_check, '删除角色') + + def kw_in_joyhub_role_delete_list_post(self, is_check='', **kwargs): + ids = kwargs.get('ids', []) + ids_str = ','.join(map(str, ids)) + return self._joyhub_request('DELETE', f'/admin-api/system/role/delete-list?ids={ids_str}', is_check, '批量删除角色') + + def kw_in_joyhub_role_get_get(self, is_check='', **kwargs): + role_id = kwargs.get('id', '') + return self._joyhub_request('GET', f'/admin-api/system/role/get?id={role_id}', is_check, '获得角色信息') + + def kw_in_joyhub_role_page_get(self, is_check='', **kwargs): + page_no = kwargs.get('pageNo', 1) + page_size = kwargs.get('pageSize', 10) + return self._joyhub_request('GET', f'/admin-api/system/role/page?pageNo={page_no}&pageSize={page_size}', is_check, '获得角色分页', **kwargs) + + def kw_in_joyhub_role_simple_list_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/role/simple-list', is_check, '获取角色精简信息列表') + + def kw_in_joyhub_role_list_all_simple_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/role/list-all-simple', is_check, '获取角色精简信息列表') + + def kw_in_joyhub_role_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/role/update', is_check, '修改角色', **kwargs) + + def kw_in_joyhub_post_create_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/system/post/create', is_check, '创建岗位', **kwargs) + + def kw_in_joyhub_post_delete_post(self, is_check='', **kwargs): + post_id = kwargs.get('id', '') + return self._joyhub_request('DELETE', f'/admin-api/system/post/delete?id={post_id}', is_check, '删除岗位') + + def kw_in_joyhub_post_delete_list_post(self, is_check='', **kwargs): + ids = kwargs.get('ids', []) + ids_str = ','.join(map(str, ids)) + return self._joyhub_request('DELETE', f'/admin-api/system/post/delete-list?ids={ids_str}', is_check, '批量删除岗位') + + def kw_in_joyhub_post_get_get(self, is_check='', **kwargs): + post_id = kwargs.get('id', '') + return self._joyhub_request('GET', f'/admin-api/system/post/get?id={post_id}', is_check, '获得岗位信息') + + def kw_in_joyhub_post_list_all_simple_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/post/list-all-simple', is_check, '获取岗位全列表') + + def kw_in_joyhub_post_page_get(self, is_check='', **kwargs): + page_no = kwargs.get('pageNo', 1) + page_size = kwargs.get('pageSize', 10) + return self._joyhub_request('GET', f'/admin-api/system/post/page?pageNo={page_no}&pageSize={page_size}', is_check, '获得岗位分页列表', **kwargs) + + def kw_in_joyhub_post_simple_list_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/post/simple-list', is_check, '获取岗位精简列表') + + def kw_in_joyhub_post_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/post/update', is_check, '修改岗位', **kwargs) + + # ============ 运费模板信息接口 ============ + def kw_in_joyhub_shipping_template_create_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/jh/shipping-template/create', is_check, '创建运费模板信息', **kwargs) + + def kw_in_joyhub_shipping_template_delete_post(self, shipping_template_id, is_check=''): + return self._joyhub_request('DELETE', f'/admin-api/jh/shipping-template/delete?id={shipping_template_id}', is_check, '删除运费模板信息') + + def kw_in_joyhub_shipping_template_delete_list_post(self, ids, is_check=''): + ids_str = ','.join(map(str, ids)) + return self._joyhub_request('DELETE', f'/admin-api/jh/shipping-template/delete-list?ids={ids_str}', is_check, '批量删除运费模板信息') + + def kw_in_joyhub_shipping_template_get_detail_get(self, shipping_template_id, is_check=''): + return self._joyhub_request('GET', f'/admin-api/jh/shipping-template/get-detail?id={shipping_template_id}', is_check, '获得运费模板详情') + + def kw_in_joyhub_shipping_template_page_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/jh/shipping-template/page', is_check, '获得运费模板分页', **kwargs) + + def kw_in_joyhub_shipping_template_save_with_children_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/jh/shipping-template/save-with-children', is_check, '保存运费模板信息(含规则与子表)', **kwargs) + + def kw_in_joyhub_shipping_template_shipping_rule_list_get(self, shipping_template_id, is_check=''): + return self._joyhub_request('GET', f'/admin-api/jh/shipping-template/shipping-rule/list-by-shipping-template-id?shippingTemplateId={shipping_template_id}', is_check, '获得运费规则列表') + + def kw_in_joyhub_shipping_template_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/jh/shipping-template/update', is_check, '更新运费模板信息', **kwargs) + + def kw_in_joyhub_banner_create_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/jh/banner/create', is_check, '创建Banner管理', **kwargs) + + def kw_in_joyhub_banner_delete_delete(self, banner_id, is_check=''): + return self._joyhub_request('DELETE', f'/admin-api/jh/banner/delete?id={banner_id}', is_check, '删除Banner管理') + + def kw_in_joyhub_banner_delete_list_delete(self, ids, is_check=''): + ids_str = ','.join(map(str, ids)) + return self._joyhub_request('DELETE', f'/admin-api/jh/banner/delete-list?ids={ids_str}', is_check, '批量删除Banner管理') + + def kw_in_joyhub_banner_get_import_template_get(self, is_check=''): + return self._joyhub_request('GET', '/admin-api/jh/banner/get-import-template', is_check, '获得导入Banner管理模板') + + def kw_in_joyhub_banner_get_get(self, banner_id, is_check=''): + return self._joyhub_request('GET', f'/admin-api/jh/banner/get?id={banner_id}', is_check, '获得Banner管理详情') + + def kw_in_joyhub_banner_page_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/jh/banner/page', is_check, '获得Banner管理分页', **kwargs) + + def kw_in_joyhub_banner_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/jh/banner/update', is_check, '更新Banner管理', **kwargs) + + def kw_in_joyhub_user_create_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/system/user/create', is_check, '创建用户', **kwargs) + + def kw_in_joyhub_user_delete_post(self, is_check='', **kwargs): + user_id = kwargs.get('id', '') + return self._joyhub_request('DELETE', f'/admin-api/system/user/delete?id={user_id}', is_check, '删除用户') + + def kw_in_joyhub_user_delete_list_post(self, is_check='', **kwargs): + ids = kwargs.get('ids', []) + ids_str = ','.join(map(str, ids)) + return self._joyhub_request('DELETE', f'/admin-api/system/user/delete-list?ids={ids_str}', is_check, '批量删除用户') + + def kw_in_joyhub_user_get_get(self, is_check='', **kwargs): + user_id = kwargs.get('id', '') + return self._joyhub_request('GET', f'/admin-api/system/user/get?id={user_id}', is_check, '获得用户详情') + + def kw_in_joyhub_user_page_get(self, is_check='', **kwargs): + page_no = kwargs.get('pageNo', 1) + page_size = kwargs.get('pageSize', 10) + return self._joyhub_request('GET', f'/admin-api/system/user/page?pageNo={page_no}&pageSize={page_size}', is_check, '获得用户分页列表', **kwargs) + + def kw_in_joyhub_user_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/user/update', is_check, '修改用户', **kwargs) + + def kw_in_joyhub_user_update_password_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/user/update-password', is_check, '重置用户密码', **kwargs) + + def kw_in_joyhub_user_update_status_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/user/update-status', is_check, '修改用户状态', **kwargs) + + def kw_in_joyhub_user_simple_list_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/user/simple-list', is_check, '获取用户精简信息列表') + + def kw_in_joyhub_user_profile_get_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/user/profile/get', is_check, '获得登录用户信息') + + def kw_in_joyhub_user_profile_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/user/profile/update', is_check, '修改用户个人信息', **kwargs) + + def kw_in_joyhub_user_profile_update_password_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/user/profile/update-password', is_check, '修改用户个人密码', **kwargs) + + # ============ 部门管理接口 ============ + def kw_in_joyhub_dept_create_post(self, is_check='', **kwargs): + return self._joyhub_request('POST', '/admin-api/system/dept/create', is_check, '创建部门', **kwargs) + + def kw_in_joyhub_dept_delete_post(self, dept_id, is_check=''): + return self._joyhub_request('DELETE', f'/admin-api/system/dept/delete?id={dept_id}', is_check, '删除部门') + + def kw_in_joyhub_dept_delete_list_post(self, ids, is_check=''): + ids_str = ','.join(map(str, ids)) + return self._joyhub_request('DELETE', f'/admin-api/system/dept/delete-list?ids={ids_str}', is_check, '批量删除部门') + + def kw_in_joyhub_dept_get_get(self, dept_id, is_check=''): + return self._joyhub_request('GET', f'/admin-api/system/dept/get?id={dept_id}', is_check, '获得部门信息') + + def kw_in_joyhub_dept_list_get(self, is_check='', **kwargs): + return self._joyhub_request('GET', '/admin-api/system/dept/list', is_check, '获取部门列表', **kwargs) + + def kw_in_joyhub_dept_list_all_simple_get(self, is_check=''): + return self._joyhub_request('GET', '/admin-api/system/dept/list-all-simple', is_check, '获取部门精简信息列表') + + def kw_in_joyhub_dept_simple_list_get(self, is_check=''): + return self._joyhub_request('GET', '/admin-api/system/dept/simple-list', is_check, '获取部门精简信息列表') + + def kw_in_joyhub_dept_update_put(self, is_check='', **kwargs): + return self._joyhub_request('PUT', '/admin-api/system/dept/update', is_check, '更新部门', **kwargs) + + +if __name__ == '__main__': + test = DlzhanInterface() + a = test.kw_in_zhyy_purchase_todo_get(user="purchase") + print(a) diff --git a/dulizhan/library/UpFile/classify.xlsx b/dulizhan/library/UpFile/classify.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5929be8d975466fc31473fe6584bfe4ead35e545 GIT binary patch literal 12324 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 literal 0 HcmV?d00001 diff --git a/dulizhan/library/UpFile/tag.xlsx b/dulizhan/library/UpFile/tag.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8479c713e8beda0a6b53fd680888103875ca38e4 GIT binary patch literal 10952 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 literal 0 HcmV?d00001 diff --git a/dulizhan/library/ZZYYLogic/__init__.py b/dulizhan/library/ZZYYLogic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/library/ZZYYLogic/purchase_logic.py b/dulizhan/library/ZZYYLogic/purchase_logic.py new file mode 100644 index 0000000..83f1391 --- /dev/null +++ b/dulizhan/library/ZZYYLogic/purchase_logic.py @@ -0,0 +1,43 @@ +# -*- coding:utf-8 -*- +""" +Author: qiaoxinjiu +Email: qiaoxinjiu@qq.com +Create Date: 2026/01/17 5:58 下午 +""" +import ast +import json +from base_framework.public_tools.mg_keyword import ManageKeyWord +from base_framework.public_tools import utils +from zhyy.library.BusinessKw.SZPurchase.index import PurchaseIndex + +obj_get_way = utils.Tools() +obj_purchase_kw = PurchaseIndex() +obj_manage_kw = ManageKeyWord() + + +class PurchaseLogic(): + def __init__(self): + pass + + def logic_zhyy_sz_purchase_todo_task(self, post_data_input, phone=None): + """ + | 功能说明: | 深圳采购待办任务处理 | + | 请求参数名 | 说明 | 类型 | 条件 | 是否必填 | | + | userName | 登录名 | string |None | 0 | + """ + try: + # 使用 ast.literal_eval 替代 eval,防止代码注入攻击 + post_data_input = ast.literal_eval(post_data_input) + except (SyntaxError, ValueError): + try: + # 如果 literal_eval 失败,尝试用 json.loads + post_data_input = json.loads(post_data_input) + except (json.JSONDecodeError, TypeError): + # 如果都失败,保持原值 + pass + + return + + +if __name__ == '__main__': + pass diff --git a/dulizhan/library/__init__.py b/dulizhan/library/__init__.py new file mode 100644 index 0000000..c605a82 --- /dev/null +++ b/dulizhan/library/__init__.py @@ -0,0 +1,134 @@ +# coding: utf-8 +import importlib +import os +import re +import sys +import traceback +from base_framework.base_config.current_pth import env_choose_path +from base_framework.public_tools.read_config import ReadConfig +from base_framework.public_tools.log import get_logger +evn_cfg = ReadConfig(env_choose_path) +team = evn_cfg.get_value(sections="run_evn_name", options="current_team") +__all__ = ['KwLibrary'] +cls_list_all = list() +cls_list_father = list() +cls_list_children = list() +t_c_list = list() +obj_log = get_logger() + + +def is_import(root): + black_list = [os.sep.join(['platform', 'tools']),'scene_server'] + import_flag = True + for black_item in black_list: + if black_item in root: + # print(3, root) + import_flag = False + return import_flag + + +def class_import(path_list): + root_path = os.path.abspath(os.path.join(os.getcwd(), "../")) + module_path = root_path + os.sep + os.sep.join(path_list) + sys.path.append(module_path) + for root, dirs, files in os.walk(module_path): + # if is_import(root): + for file in files: + if os.path.splitext(file)[1] == '.py' and not file.startswith('__'): + with open(os.sep.join([root, file]), encoding="utf-8") as f: + for line in f.readlines(): + cls_match = re.match(r"class\s(.*?)[\(:]", line) + if cls_match: + cls_name = cls_match.group(1) + try: + if cls_name not in ["Runner"]: + # module_list = root.split(os.sep)[len(os.getcwd().split(os.sep)) - 1:] + # module_list.append(os.path.splitext(file)[0]) + # module = importlib.import_module('.'.join(module_list)) + module_path_list = root.split(os.sep) + module_path_list.append(os.path.splitext(file)[0]) + module_path = '' + for index in range(len(module_path_list)): + if module_path_list[index].lower() == 'base_framework' or module_path_list[index].lower() == 'library': + tmp_path = module_path_list[index:] + for path in tmp_path: + module_path = module_path + path + '.' + break + module_path = module_path[0:-1] + module = importlib.import_module(module_path) + + class_attr = getattr(module, cls_name) + t_c_list.append(class_attr) + # if class_attr: + # if class_attr.__bases__[0] == object: + # cls_list_children.append(class_attr) + # else: + # cls_list_father.append(class_attr) + except: + traceback.print_exc() + print("ERROR import", file, cls_name) + + +def sort_class(class_list): + """ + 功能:将所有的class按继承关系排序,子类在前,父类在后,用于startup启动加载 + """ + while len(class_list) > 0: + # cls_list_len = len(cls_list_all) + tmp_class_list = [] + del_list = [] + for index in range(len(class_list)): + if not cls_list_all: + # 先找出所有的父类是object的基类 + if class_list[index].__bases__[0] == object: + # while class_list[index].__bases__[0] == object: + tmp_class_list.append(class_list[index]) + del_list.append(class_list[index]) + else: + # 寻找前一步晒出基类的子类 + if class_list[index].__bases__[0] in cls_list_all[len(cls_list_all) - 1]: + tmp_class_list.append(class_list[index]) + del_list.append(class_list[index]) + if len(tmp_class_list) > 0: + # 如果父类在已选出的类中,则保存该类 + cls_list_all.append(tmp_class_list) + for item in del_list: + class_list.remove(item) + else: + # 如果父类都不在已选出的类中,则全部按父类是object处理 + cls_list_all.append(class_list) + class_list = [] + + +class_import(["base_framework", "public_tools"]) +class_import(["base_framework", "public_business"]) +class_import([team, "library"]) +# BaseLibrary = type('BaseLibrary', tuple(cls_list_father + cls_list_children), {}) +sort_class(t_c_list) +c_len = len(cls_list_all) +obj_cls_tuple = () +while c_len > 0: + obj_cls_tuple += tuple(cls_list_all[c_len - 1], ) + c_len = c_len - 1 +print(obj_cls_tuple) +BaseLibrary = type('BaseLibrary', obj_cls_tuple, {}) + + +class KwLibrary(BaseLibrary): + + def __init__(self): + class_len = 0 + for base in BaseLibrary.__bases__: + try: + if hasattr(base, '__init__'): + if '__init__' in base.__dict__.keys(): + if base.__bases__[0] != object or len(base.__init__.__code__.co_varnames) == 1: + base.__init__(self) + print(base) + # obj_log.info("init class:{} success...".format(base)) + class_len += 1 + except Exception as e: + if base.__bases__[0] == object: + print("INIT", e, base, base.__dict__) + # obj_log.info("import files num: {}".format(class_len)) + print("import files num: {}".format(class_len)) diff --git a/dulizhan/qa_helper/__init__.py b/dulizhan/qa_helper/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/qa_helper/common/__init__.py b/dulizhan/qa_helper/common/__init__.py new file mode 100644 index 0000000..0161749 --- /dev/null +++ b/dulizhan/qa_helper/common/__init__.py @@ -0,0 +1 @@ +print("222222222222") \ No newline at end of file diff --git a/dulizhan/qa_helper/common/course_package.py b/dulizhan/qa_helper/common/course_package.py new file mode 100644 index 0000000..cc001b8 --- /dev/null +++ b/dulizhan/qa_helper/common/course_package.py @@ -0,0 +1,337 @@ +# -*- coding:utf-8 -*- +""" +Author: 陈江 +Email: chenjiang@sparkedu.com +Create Date: 2022/09/23 2:06 下午 +""" +from base_framework.public_tools.sqlhelper import MySqLHelper + +import json + +obj_mysql_helper = MySqLHelper() + + +class CoursePackage: + def __init__(self): + pass + + @staticmethod + def __get_data_name(data_list): + temp_data_list = [] + if data_list: + for data in data_list: + temp_data_list.append( + {"course_package_id": data.get('value'), "cc显示_course_package_name": data.get('name'), + "course_package_name": data.get('text')}) + return temp_data_list + return None + + def get_course_package_by_cc_crm(self, post_data_input): + """ + | 功能说明: | 获取套餐信息,根据cc/crm购买可选套餐 | + | 输入参数: | + | 作者信息: | 陈江 | 修改时间 | 2022-9-28 | + """ + sql_crm_vispark_subscribe_chinese = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', +type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type = 2 + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',2,' + AND course_type IN ( ',5,', ',1,' ) + AND sale_type = 2 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,7,%' +ORDER BY + id DESC LIMIT 3;""" + crm_vispark_subscribe_chinese_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_subscribe_chinese)) + + sql_crm_vispark_subscribe_sg = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type = 1 + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',1,' + AND course_type IN ( ',5,' ) + AND sale_type = 2 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,10,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_subscribe_sg_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_subscribe_sg)) + + sql_crm_vispark_subscribe_oc = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type in( 1,10 ) + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',1,' + AND course_type IN ( ',5,' ) + AND sale_type = 2 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,13,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_subscribe_oc_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_subscribe_oc)) + + sql_crm_vispark_buy_chinese = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type = 2 + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',2,' + AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') + AND sale_type = 1 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,7,%' +ORDER BY + IF (abbreviation="",NAME,abbreviation) asc limit 3;""" + crm_vispark_buy_chinese_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_buy_chinese)) + + sql_crm_vispark_buy_us = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type = 10 + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',1,' + AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') + AND sale_type = 1 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,11,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_buy_us_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_buy_us)) + + sql_crm_vispark_buy_canada = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type = 10 + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',1,' + AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') + AND sale_type = 1 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,1012,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_buy_canada_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_buy_canada)) + + sql_crm_vispark_buy_sg = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type = 1 + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',1,' + AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') + AND sale_type = 1 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,10,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_buy_sg_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_buy_sg)) + + sql_crm_vispark_buy_oc = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + type = 1 + AND business_line = 1 + AND business_line_type in( 1,10 ) + AND teaching_method = 0 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject = ',1,' + AND course_type IN ( ',5,', ',1,', ',1,5,', ',5,1,') + AND sale_type = 1 + AND course_teaching_method = 1 + AND STATUS = 1 + AND view_authority_scope LIKE '%,13,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_buy_oc_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_buy_oc)) + + sql_crm_vispark_buy_huohua = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + teaching_method = 0 + AND business_line_type in( 0,4,9 ) +-- AND business_line = 0 (以及业务线) + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject like '%,2,%' +-- AND course_type IN ( ',1,',',5,' ) (课程类型) + AND sale_type = 1 + AND course_teaching_method = 1 +-- AND STATUS = 1 (状态) + AND view_authority_scope LIKE '%,7,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_buy_huohua_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_buy_huohua)) + + sql_crm_vispark_subscribe_huohua = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + teaching_method = 0 + AND business_line_type in( 0,4,9 ) + AND business_line = 1 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject like '%,2,%' +-- AND course_type IN ( ',1,',',5,' ) (课程类型) + AND sale_type = 2 + AND course_teaching_method = 1 +-- AND STATUS = 1 (状态) + AND view_authority_scope LIKE '%,7,%' +ORDER BY + id DESC limit 3;""" + crm_vispark_subscribe_huohua_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_crm_vispark_subscribe_huohua)) + + sql_cc_vispark_subscribe_huohua = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + teaching_method = 0 + AND business_line_type in( 0,3,9 ) + AND business_line = 1 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject like '%,1,%' +-- AND course_type IN ( ',1,',',5,' ) (课程类型) + AND sale_type = 2 + AND course_teaching_method = 1 +-- AND STATUS = 1 (状态) + AND view_authority_scope LIKE '%,2,%' +ORDER BY + id DESC limit 3;""" + cc_vispark_subscribe_huohua_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_cc_vispark_subscribe_huohua)) + + sql_cc_vispark_buy_huohua = """SELECT + IF (abbreviation="",NAME,abbreviation) AS 'text',name, + id AS 'value', + type,business_line,business_line_type,teaching_method,sale_status,saleable_status,course_subject,course_type,sale_type,course_teaching_method,STATUS,view_authority_scope +FROM + peppa.course_package +WHERE + teaching_method = 0 + AND business_line_type in( 0,3,9 ) + AND business_line = 1 + AND sale_status = 1 + AND saleable_status = 1 + AND course_subject like '%,1,%' +-- AND course_type IN ( ',1,',',5,' ) (课程类型) + AND sale_type = 1 + AND course_teaching_method = 1 +-- AND STATUS = 1 (状态) + AND view_authority_scope LIKE '%,2,%' +ORDER BY + id DESC limit 3;""" + cc_vispark_buy_huohua_list = self.__get_data_name( + obj_mysql_helper.select_all(sql_cc_vispark_buy_huohua)) + data = {"crm中订阅vispark业务的对外汉语-套餐": crm_vispark_subscribe_chinese_list, + "crm中订阅vispark业务的sg-套餐": crm_vispark_subscribe_sg_list, + "crm中订阅vispark业务的海华-套餐": crm_vispark_subscribe_oc_list, + "crm中直购vispark业务的对外汉语-套餐": crm_vispark_buy_chinese_list, + "crm中直购vispark业务的us-套餐": crm_vispark_buy_us_list, + "crm中直购vispark业务的加拿大-套餐": crm_vispark_buy_canada_list, + "crm中直购vispark业务的sg-套餐": crm_vispark_buy_sg_list, + "crm中直购vispark业务的海华-套餐": crm_vispark_buy_oc_list, + "crm中直购vispark业务的火花-套餐": crm_vispark_buy_huohua_list, + "crm中订阅vispark业务的火花-套餐": crm_vispark_subscribe_huohua_list, + "cc中订阅vispark业务的火花-套餐": cc_vispark_subscribe_huohua_list, + "cc中直购vispark业务的火花-套餐": cc_vispark_buy_huohua_list} + + return data + + +if __name__ == '__main__': + cc = CoursePackage() + bb = cc.get_course_package_by_cc_crm('') + print(bb) diff --git a/dulizhan/qa_helper/common/order.py b/dulizhan/qa_helper/common/order.py new file mode 100644 index 0000000..3c85ed5 --- /dev/null +++ b/dulizhan/qa_helper/common/order.py @@ -0,0 +1,109 @@ +# -*- coding:utf-8 -*- +""" +Author: 陈江 +Email: chenjiang@sparkedu.com +Create Date: 2022/09/23 2:06 下午 +""" +from base_framework.public_business.common.UBRD.kw.coursePackage_keyword import CoursePackageKW +from base_framework.public_tools import utils +from base_framework.public_tools.sqlhelper import MySqLHelper +from base_framework.public_tools.mg_keyword import ManageKeyWord +from base_framework.public_business import manage_public_business + +import json + + +obj_course_package_kw = CoursePackageKW() +obj_get_way = utils.Tools() +obj_mysql_helper = MySqLHelper() +obj_manage_kw = ManageKeyWord() +obj_manage_business = manage_public_business.ManagePublicBusiness() + +class Order: + def __init__(self): + pass + + def order_done_pay(self, post_data_input): + """ + | 功能说明: | 订单完成支付 | + | 输入参数: | + |orderId/orderCode/prepayCode| 订单id/code/prepayCode | 必填其一 + | podenv | str | 独立环境编号| 非必填 + | 作者信息: | 陈江 | 修改时间 | 2022-9-28 | + """ + if not post_data_input.get('orderId') and not post_data_input.get('orderCode') and not post_data_input.get( + 'prepayCode'): + raise "orderId/orderCode/prepayCode必传1个" + + ordr_info = obj_course_package_kw.get_order_info(post_data_input) + order_id = ordr_info.get('orderId') + mq_body_dict = obj_course_package_kw.kw_ubrd_public_get_service_id_by_order_id({"orderId": order_id}) + message_body = {"orderId": order_id, "serviceId": int(mq_body_dict.get('serviceId'))} + if post_data_input.get('podenv'): + obj_get_way.mq_send(mq_body_dict.get('topic'), json.dumps(message_body), pro=post_data_input.get('podenv')) + else: + obj_get_way.mq_send(mq_body_dict.get('topic'), json.dumps(message_body)) + order_100_sql = f"SELECT id FROM `order_center`.`order_course_package` WHERE id='{order_id}' AND status=100" + obj_mysql_helper.check_result_exist(order_100_sql, retry_count=20) + subscribe_id_sql = f"SELECT subscribe_id FROM `order_center`.`subscribe_order_log` WHERE order_id={order_id}" + obj_mysql_helper.check_result_exist(subscribe_id_sql, retry_count=20) + subscribe_id = obj_mysql_helper.select_one(subscribe_id_sql).get('subscribe_id') + + return {"order_id": order_id, "subscribe_id": subscribe_id} + + def add_review_subscribe_order(self, post_data_input): + """ + | 功能说明: | 生成续订阅订单 | + | 输入参数: | + |subscribeIds| 订阅id | 传了用该订阅id生成续订阅订单,必传 比如[3355] + | 作者信息: | 张楠 | 修改时间 | 2022-11-10 | + """ + try: + post_data_input = eval(post_data_input) + except: + post_data_input = post_data_input + + if not post_data_input.get('subscribeIds'): + raise RuntimeWarning("订阅id必传") + # 构造生成续订阅订单请求参数 + response_data = obj_manage_kw.kw_execute_xxl_job(8306, para=json.dumps(post_data_input)) + return response_data + + def create_order(self, post_data_input): + """ + | 功能说明: | 创建直购订单 | + | 请求参数名 | 说明 | 类型 | 是否必填 | 如无要求时的值 | + | userId | 用户id | string | 0 | | + | phone | 用户手机号 | string | 0 | | + | coursePackageId | 套餐id | integer | 0 | | + | businessLine | 业务线一级类型,0:火花中国、1:vispark | integer | 0 | | + | businessLineType | 业务线二级类型,1:新加坡数学、2:对外汉语、3:直播逻辑思维、4:直播中文素养、5:直播双语素养、6:AI、7:围棋、8:国际象棋、9:其他、10:北美数学、11:越南数学、12:春风思维、13:口才课 | integer | 0 | | + | category | 业务线三级类型,K-SMAP:新加坡AP、P-CM:新加坡CP、A:北美AP、C-北美CP、V-越南AP、N-越南CP、ZHK-对外汉语综合课 | string | 0 | | + | teachingMethod | 授课方式, 0:直播、1:AI | integer | 0 | 0 | + | type | 套餐类型,1:正式课、2:体验课 | integer | 0 | 1 | + | courseSubjectList | 课程学科集合,1:数学、2:语文、3:科学、4:英语、5:编程、7:围棋、8:国际象棋、9:春风思维、10:口才课 | list | 0 | | + | courseId | 课程id | integer | 0 | | + | channel | 渠道,1:电商、0:非电商 | integer | 0 | 0 | + | channelValue | 渠道chi | string | 0 | 0 | + | classHourType | 课时类型,0:小班课、3:1v1 | integer | 0 | | + | offline | 线下,1:线下、0:线上 | integer | 0 | 1 | + | businessType | 业务类型,0:常规、1:补差、2:可补差 | integer | 0 | 0 | + | currency | 币种,0:人民币、1:美元 | integer | 0 | | + | saleType | 售卖方式,1:直购、2:订阅 | integer | 0 | 1 | + | teachingScope | 授课范围,1:所有课程、2:自定义课程 | integer | 0 | 1 | + | payPrice | 实付金额 | integer | 0 | | + | createdType | 订单类型,0:默认未选择、 10:团购订单、11:加价购-团购订单、12:加价购-普通订单、20:CC提单、30:CC提单、40:自助下单、50:微店购买| integer | 0| 0 | + Returns: + {orderId, orderCode} + | 作者信息: | lrq | 修改时间 | 2025-03-18 | + """ + try: + post_data_input = eval(post_data_input) + except: + post_data_input = post_data_input + return obj_manage_business.kw_public_manage_create_order(**post_data_input) + + +if __name__ == '__main__': + a = Order() + a.create_order({"userId":"2557864","channel":"35d75242534611e8b5325cb9018964ec","coursePackageId":"2503934602"}) diff --git a/dulizhan/qa_helper/common/user.py b/dulizhan/qa_helper/common/user.py new file mode 100644 index 0000000..a53d867 --- /dev/null +++ b/dulizhan/qa_helper/common/user.py @@ -0,0 +1,208 @@ +# -*- coding:utf-8 -*- +""" +Author: 陈江 +Email: chenjiang@sparkedu.com +Create Date: 2022/09/23 2:06 下午 +""" +from base_framework.public_business.common.UBRD.UBRD_public_business import BaseLogic +from base_framework.public_business.common.UBRD.kw.coursePackage_keyword import CoursePackageKW +from base_framework.public_tools import utils +from base_framework.public_tools.sqlhelper import MySqLHelper +from base_framework.public_tools.log import get_logger +from base_framework.public_business.common.UBRD.kw.user_keyword import UserKW +from base_framework.public_tools.mg_keyword import ManageKeyWord +from library.CommonFun.handle_tools import Handle_tools +import requests + +obj_base_logic = BaseLogic() +obj_course_package_kw = CoursePackageKW() +obj_get_way = utils.Tools() +obj_mysql_helper = MySqLHelper() +log = get_logger() +obj_user_kw = UserKW() +obj_manage_kw = ManageKeyWord() +obj_handle_tools = Handle_tools() + + +class User: + def __init__(self): + pass + + def add_user_recharge(self, post_data_input): + """ + | 功能说明: | 新增用户,充值课时 | + | 输入参数: | + |phone/userId| 用户手机号/用户id | 非必填,不传会默认随机注册一个账号;传的手机号不存在会自动进行注册; + |coursePackageCode/courseId/coursePackageId/coursePackageName| 传一个即可 | 传了就给用充值课时,不传就不充 + |classHour | | 充值课时 | 不传,需要充值时默认充值100 + |new_user_count | | 生成新账号数量,存在这个参数时只会生成相应数量的账号 | + | 作者信息: | 陈江 | 修改时间 | 2022-9-23 | + """ + user_list = [] + try: + post_data_input = eval(post_data_input) + except: + post_data_input = post_data_input + + if post_data_input.get('new_user_count'): + new_user_count = post_data_input.pop('new_user_count') + for count in range(0, int(new_user_count)): + user_info = obj_base_logic.logic_public_add_user_recharge(post_data_input) + user_list.append(user_info) + return user_list + return obj_base_logic.logic_public_add_user_recharge(post_data_input) + + def add_new_user(self, post_data_input): + """ + | 功能说明: | 新增用户 | + | 输入参数: | + |fu_phone/fu_user_Id| 邀请人手机号或者user_id | 非必填,不传新增用户无邀请人; + |new_phone| 新增用户手机号 | 传了用该手机号注册,不传则随机一个手机号 + |new_user_count | | 生成新账号数量,存在这个参数时只会生成相应数量的账号 | + | 作者信息: | 陈江 | 修改时间 | 2022-11-01 | + """ + user_list = [] + try: + post_data_input = eval(post_data_input) + except: + post_data_input = post_data_input + + # 构造增加用户请求参数 + add_user_params = {} + # 判断是否需要进行邀请 + if post_data_input.get('fu_phone'): + user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=post_data_input.get('fu_phone')) + add_user_params['fromUserId'] = user_info.get('user_id') + elif post_data_input.get('fu_user_Id'): + add_user_params['fromUserId'] = post_data_input.get('fu_user_Id') + else: + pass + + if post_data_input.get('new_phone'): + user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=post_data_input.get('new_phone')) + if user_info: + raise RuntimeWarning(f"该手机号{post_data_input.get('new_phone')}已经存在") + add_user_params['phone'] = post_data_input.get('new_phone') + obj_user_kw.kw_ubrd_public_add_user_profile(post_data_input=add_user_params) + user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=post_data_input.get('new_phone')) + return user_info + else: + if post_data_input.get('new_user_count'): + new_user_count = post_data_input.pop('new_user_count') + for count in range(0, int(new_user_count)): + phone = obj_user_kw.kw_ubrd_public_get_unregistered_phone() + add_user_params['phone'] = phone + obj_user_kw.kw_ubrd_public_add_user_profile(post_data_input=add_user_params) + user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=phone) + user_list.append(user_info) + return user_list + else: + phone = obj_user_kw.kw_ubrd_public_get_unregistered_phone() + add_user_params['phone'] = phone + obj_user_kw.kw_ubrd_public_add_user_profile(post_data_input=add_user_params) + user_info = obj_user_kw.kw_ubrd_public_get_user_info_by_phone(phone=phone) + return user_info + + def add_new_haihua_user(self, post_data_input): + """ + | 功能说明: | 生成海华标签新用户 | + | 输入参数: | + |fu_phone/fu_user_Id| 邀请人手机号或者user_id | 非必填,不传新增用户无邀请人; + |new_phone| 新增用户手机号 | 传了用该手机号注册,不传则随机一个手机号 + |new_user_count | | 生成新账号数量,存在这个参数时只会生成相应数量的账号 | + | 作者信息: | 陈江 | 修改时间 | 2022-11-01 | + """ + user_info_list = self.add_new_user(post_data_input) + if user_info_list: + for user_info in user_info_list: + # 设置权益信息 + obj_mysql_helper.insert_one( + f"""INSERT INTO `operation`.`haibao_task_equity`(`user_id`, `order_id`, `order_business_side`, `course_package_id`, `course_package_name`, `equity_num`, `used_num`, `remain_num`, `lock_num`, `start_time`, `end_time`, `effect_period`, `generated_first_task`, `frozen_status`, `refund_status`, `equity_status`, `policy`, `subject_type`, `related_order_id`, `creator_id`, `creator_name`, `created_time`, `modifier_id`, `modifier_name`, `modified_time`) VALUES ({user_info.get('user_id')}, 8881050, 0, 23002, '逻辑思维直播系统课48课包', 20, 0, 20, 0, '2023-02-09 14:44:36', '2023-02-09 14:44:36', 360, 0, 0, 0, 0, 2, 0, 0, 0, '', '2023-02-01 00:00:01', 0, '', '2023-02-09 14:44:36');""") + # 设置海华标签 + obj_mysql_helper.insert_one( + f"""INSERT INTO `utag_mass`.`user_tag`(`user_id`, `tag_id`, `tag_name`, `creator_id`, `creator_name`, `created_time`, `status`, `is_del`, `source_type`, `expiration_time`, `modifier_id`, `modifier_name`, `modified_time`) VALUES ({user_info.get('user_id')}, 51, '海外及港澳台用户', 587312, '陈江', '2023-02-09 16:08:24', 1, 0, 0, NULL, 587312, '陈江', '2023-02-09 16:08:24');""") + return user_info_list + + def get_unregistered_user(self, post_data_input): + """ + | 功能说明: | 获取未注册手机号 | + | 输入参数: | + |user_count | | 返回未注册手机号数量 | + | 作者信息: | 刘涛婷 | 修改时间 | 2022-11-10 | + """ + user_list = [] + try: + post_data_input = eval(post_data_input) + except: + post_data_input = post_data_input + + if post_data_input.get('user_count'): + user_count = post_data_input.pop('user_count') + for count in range(0, int(user_count)): + user_phone = obj_user_kw.kw_ubrd_public_get_unregistered_phone() + user_list.append(user_phone) + return user_list + return obj_user_kw.kw_ubrd_public_get_unregistered_phone() + + def get_sms_code_by_phone(self, post_data_input): + """ + | 功能说明: | 发送验证码 | + | 输入参数: + | phone | 手机号| 必填 + | countryCode | 国家码 | 默认 86 + | authType | 验证码类型 | 默认2 + | verifyAppId | 验证appId | 默认2 + | 作者信息: | 陈江 | 2022/10/21 | + """ + # 发送验证码 + obj_base_logic.logic_public_send_auth_code(post_data_input) + # 获取验证码内容 + # 根据phone获取phone_code + phone_server_ip = obj_get_way.get_container_ip_from_eureka('PHONE-SERVER', need_jira_id='qa', + eureka_url='http://eureka.qa.huohua.cn') + if post_data_input.get('countryCode'): + phone = f"{post_data_input.get('countryCode')}-{post_data_input.get('phone')}" + else: + phone = post_data_input.get('phone') + + if phone_server_ip.get('container_ip'): + url = 'http://{}:8080/encrypt/regdata?biztype=phone&uid=123456&sourceData={}'.format( + phone_server_ip.get('container_ip'), phone) + response = requests.post(url=url) # 三个参数 + response_json = response.json() + else: + raise "获取phone server ip失败" + + if response_json.get('data'): + msg = obj_mysql_helper.select_all( + 'SELECT msg FROM `push_service`.`sms` WHERE `phone_code` = \'{}\' ORDER BY id DESC LIMIT 1 '.format( + response_json.get('data'))) + if msg: + web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/c9baf09d-55f1-46a6-8d67-9d4ff30b1be2" + message_data = {"msg_type": "post", "content": { + "post": {"zh_cn": {"title": "message", + "content": [[{"tag": "text", "text": msg[0].get('msg')}]]}}}} + obj_handle_tools.send_message_by_feishu(web_hook, message_data) + else: + raise f"{phone}获取验证码失败" + return msg[0].get('msg') + + else: + return response_json + + def register_user(self, post_data_input): + """ + | 功能说明: | 通过注册接口进行注册用户并设置密码A123456(支持邀请码,渠道) | + | 输入参数: | + | | | channelId | string | 渠道id | + | | | invitePhone | string | 手机号 | "12030690001/86-13400114600" + | | | registerPhone | string | 手机号 | "12030690001/86-13400114600" + | 作者信息: | 陈江 | 修改时间 | 2022-11-10 | + """ + return obj_base_logic.logic_public_register_user(post_data_input) + + +if __name__ == '__main__': + ff = {'phone': '13400234500','coursePackageId':29497} + # User().add_user_recharge(ff) + User().add_new_user(post_data_input={"new_user_count":"2"}) diff --git a/dulizhan/test_case/JENKINS_SETUP.md b/dulizhan/test_case/JENKINS_SETUP.md new file mode 100644 index 0000000..680924b --- /dev/null +++ b/dulizhan/test_case/JENKINS_SETUP.md @@ -0,0 +1,190 @@ +# Jenkins + Allure 报告集成配置指南 + +## 前置要求 + +1. **Jenkins已安装并运行** +2. **安装Allure插件** + - 进入 Jenkins → Manage Jenkins → Manage Plugins + - 搜索并安装 "Allure Plugin" +3. **安装Allure命令行工具** + - 下载:https://github.com/allure-framework/allure2/releases + - 解压并添加到系统PATH环境变量 + - 或在Jenkins全局工具配置中配置Allure路径 + +## Jenkins配置步骤 + +### 方式一:使用Jenkinsfile(推荐) + +1. **在Jenkins中创建Pipeline任务** + - 新建任务 → 选择 "Pipeline" + - 任务名称:例如 "ZZYY_Test_Automation" + +2. **配置Pipeline** + - Pipeline definition → Pipeline script from SCM + - SCM: Git(或其他版本控制) + - Script Path: `zhyy/test_case/Jenkinsfile` + - 保存 + +3. **运行任务** + - 点击 "Build with Parameters" + - 选择运行方式(RUN_TYPE) + - 填写相应参数 + - 点击 "Build" + +### 方式二:自由风格项目配置 + +1. **创建自由风格项目** + - 新建任务 → 选择 "Freestyle project" + - 任务名称:例如 "ZZYY_Test_Automation" + +2. **配置源码管理** + - Source Code Management → Git + - Repository URL: 你的Git仓库地址 + - Branch: 分支名称 + +3. **配置构建步骤** + - Build → Add build step → Execute shell(Linux/Mac)或 Execute Windows batch command(Windows) + - 命令示例: + ```bash + # Linux/Mac + cd ${WORKSPACE} + python zhyy/test_case/run_tests.py --all --no-report + ``` + ```batch + # Windows + cd %WORKSPACE% + python zhyy\test_case\run_tests.py --all --no-report + ``` + +4. **配置Allure报告** + - Post-build Actions → Add post-build action → Allure Report + - Results path: `zhyy/test_case/reports/allure-results` + - Report path: `zhyy/test_case/reports/allure-report`(可选) + - 保存 + +5. **配置参数化构建(可选)** + - This project is parameterized → Add Parameter + - 添加Choice Parameter: + - Name: `RUN_TYPE` + - Choices: `all`, `feature`, `story`, `dir`, `file`, `keyword`, `marker` + - 添加String Parameter(根据需要): + - `FEATURE_NAME`, `STORY_NAME`, `DIR_PATH`, `FILE_PATH`, `KEYWORD`, `MARKER` + +6. **修改构建命令以使用参数** + ```bash + # Linux/Mac + cd ${WORKSPACE} + if [ "${RUN_TYPE}" = "all" ]; then + python zhyy/test_case/run_tests.py --all --no-report + elif [ "${RUN_TYPE}" = "feature" ]; then + python zhyy/test_case/run_tests.py --feature "${FEATURE_NAME}" --no-report + elif [ "${RUN_TYPE}" = "dir" ]; then + python zhyy/test_case/run_tests.py --dir "${DIR_PATH}" --no-report + # ... 其他条件 + fi + ``` + +## Allure插件配置 + +### 全局工具配置 + +1. **配置Allure命令行工具路径** + - Manage Jenkins → Global Tool Configuration + - Allure Commandline → Add Allure Commandline + - Name: `Allure`(或自定义名称) + - Installation directory: Allure安装路径(如:`C:\allure\bin` 或 `/usr/local/allure/bin`) + - 保存 + +### 项目配置 + +1. **在项目配置中添加Allure报告** + - Post-build Actions → Allure Report + - Results path: `zhyy/test_case/reports/allure-results` + - 勾选 "Keep allure results history" + +## 环境变量配置 + +### Jenkins全局环境变量 + +1. **配置Python路径(如需要)** + - Manage Jenkins → Configure System → Global properties + - Environment variables → Add + - Name: `PYTHONPATH` + - Value: `${WORKSPACE}` + +### 项目环境变量 + +在Pipeline或构建脚本中设置: +```groovy +environment { + PYTHONPATH = "${WORKSPACE}" + ALLURE_RESULTS = "${WORKSPACE}/zhyy/test_case/reports/allure-results" +} +``` + +## 使用示例 + +### 运行所有测试 +```bash +python zhyy/test_case/run_tests.py --all --no-report +``` + +### 按目录运行 +```bash +python zhyy/test_case/run_tests.py --dir "接口/SZPurchase" --no-report +``` + +### 按Feature标签运行 +```bash +python zhyy/test_case/run_tests.py --feature "深圳采购工作台采购订单页面" --no-report +``` + +## 报告查看 + +1. **在Jenkins中查看** + - 构建完成后,在项目页面左侧菜单会出现 "Allure Report" 链接 + - 点击即可查看详细的测试报告 + +2. **报告内容** + - 测试用例执行情况 + - 通过/失败统计 + - 执行时间 + - 测试步骤详情 + - 截图和日志(如果配置了) + +## 常见问题 + +### 1. Allure命令未找到 +- 确保Allure已安装并添加到PATH +- 或在Jenkins全局工具配置中指定Allure路径 + +### 2. 模块导入错误 +- 检查PYTHONPATH环境变量 +- 确保项目根目录在Python路径中 + +### 3. 报告未生成 +- 检查allure-results目录是否存在且包含数据 +- 检查Jenkins Allure插件配置的路径是否正确 + +### 4. 权限问题 +- 确保Jenkins有权限访问工作空间目录 +- 确保有权限执行Python和Allure命令 + +## 邮件通知配置(可选) + +在Post-build Actions中添加: +- Email Notification +- 配置收件人、主题等 +- 可以附加Allure报告链接 + +## 定时构建(可选) + +在项目配置中: +- Build Triggers → Build periodically +- 例如:`H 2 * * *`(每天凌晨2点执行) + +## 多节点执行(可选) + +如果有多台Jenkins节点: +- 在Pipeline中配置 `agent { label 'your-node-label' }` +- 或在自由风格项目中配置 "Restrict where this project can be run" diff --git a/dulizhan/test_case/Jenkinsfile b/dulizhan/test_case/Jenkinsfile new file mode 100644 index 0000000..721bf36 --- /dev/null +++ b/dulizhan/test_case/Jenkinsfile @@ -0,0 +1,175 @@ +pipeline { + agent any + + options { + // 保留最近10次构建 + buildDiscarder(logRotator(numToKeepStr: '10')) + // 超时时间60分钟 + timeout(time: 60, unit: 'MINUTES') + } + + environment { + // Python路径 + PYTHONPATH = "${WORKSPACE}" + // Allure结果目录 + ALLURE_RESULTS = "${WORKSPACE}/zhyy/test_case/reports/allure-results" + // Allure报告目录 + ALLURE_REPORT = "${WORKSPACE}/zhyy/test_case/reports/allure-report" + } + + stages { + stage('Checkout') { + steps { + echo '检出代码...' + checkout scm + } + } + + stage('环境准备') { + steps { + echo '准备测试环境...' + script { + // 确保Python环境 + sh ''' + python --version + pip --version + ''' + } + } + } + + stage('运行测试') { + steps { + echo '执行测试用例...' + script { + // 根据参数选择运行方式 + def runType = params.RUN_TYPE ?: 'all' + def testCommand = '' + + switch(runType) { + case 'all': + testCommand = 'python zhyy/test_case/run_tests.py --all --no-report' + break + case 'feature': + def feature = params.FEATURE_NAME ?: '' + testCommand = "python zhyy/test_case/run_tests.py --feature \"${feature}\" --no-report" + break + case 'story': + def story = params.STORY_NAME ?: '' + testCommand = "python zhyy/test_case/run_tests.py --story \"${story}\" --no-report" + break + case 'dir': + def dir = params.DIR_PATH ?: '' + testCommand = "python zhyy/test_case/run_tests.py --dir \"${dir}\" --no-report" + break + case 'file': + def file = params.FILE_PATH ?: '' + testCommand = "python zhyy/test_case/run_tests.py --file \"${file}\" --no-report" + break + case 'keyword': + def keyword = params.KEYWORD ?: '' + testCommand = "python zhyy/test_case/run_tests.py --keyword \"${keyword}\" --no-report" + break + case 'marker': + def marker = params.MARKER ?: '' + testCommand = "python zhyy/test_case/run_tests.py --marker \"${marker}\" --no-report" + break + default: + testCommand = 'python zhyy/test_case/run_tests.py --all --no-report' + } + + sh """ + cd ${WORKSPACE} + ${testCommand} + """ + } + } + post { + always { + // 无论成功失败都收集测试结果 + echo '收集测试结果...' + } + } + } + + stage('生成Allure报告') { + steps { + echo '生成Allure报告...' + script { + sh """ + cd ${WORKSPACE} + allure generate ${ALLURE_RESULTS} -o ${ALLURE_REPORT} --clean || echo "Allure报告生成失败,但继续执行" + """ + } + } + } + } + + post { + always { + // 发布Allure报告 + allure([ + includeProperties: false, + jdk: '', + properties: [], + reportBuildPolicy: 'ALWAYS', + results: [[path: 'zhyy/test_case/reports/allure-results']] + ]) + + // 清理工作空间(可选) + // cleanWs() + } + success { + echo '✓ 测试执行成功' + // 可以在这里添加成功通知,如发送邮件、钉钉等 + } + failure { + echo '✗ 测试执行失败' + // 可以在这里添加失败通知 + } + unstable { + echo '⚠ 测试执行不稳定' + } + } +} + +// 参数化构建 +properties([ + parameters([ + choice( + name: 'RUN_TYPE', + choices: ['all', 'feature', 'story', 'dir', 'file', 'keyword', 'marker'], + description: '选择运行方式' + ), + string( + name: 'FEATURE_NAME', + defaultValue: '', + description: 'Feature标签名称(当RUN_TYPE=feature时使用)' + ), + string( + name: 'STORY_NAME', + defaultValue: '', + description: 'Story标签名称(当RUN_TYPE=story时使用)' + ), + string( + name: 'DIR_PATH', + defaultValue: '接口/SZPurchase', + description: '测试目录路径(当RUN_TYPE=dir时使用,相对于TestCase目录)' + ), + string( + name: 'FILE_PATH', + defaultValue: '接口/SZPurchase/PurchaseOrderManage.py', + description: '测试文件路径(当RUN_TYPE=file时使用,相对于TestCase目录)' + ), + string( + name: 'KEYWORD', + defaultValue: 'purchase', + description: '关键字(当RUN_TYPE=keyword时使用)' + ), + string( + name: 'MARKER', + defaultValue: 'smoke', + description: 'Pytest标记(当RUN_TYPE=marker时使用)' + ) + ]) +]) diff --git a/dulizhan/test_case/README_JENKINS.md b/dulizhan/test_case/README_JENKINS.md new file mode 100644 index 0000000..d13633f --- /dev/null +++ b/dulizhan/test_case/README_JENKINS.md @@ -0,0 +1,84 @@ +# Jenkins + Allure 集成快速参考 + +## 快速开始 + +### 1. 安装Allure插件 +- Jenkins → Manage Jenkins → Manage Plugins +- 搜索 "Allure Plugin" 并安装 + +### 2. 配置Allure工具 +- Manage Jenkins → Global Tool Configuration +- Allure Commandline → 添加Allure安装路径 + +### 3. 创建Jenkins任务 + +#### 方式A:使用Jenkinsfile(推荐) +1. 新建Pipeline任务 +2. Pipeline script from SCM +3. Script Path: `zhyy/test_case/Jenkinsfile` +4. 保存并运行 + +#### 方式B:自由风格项目 +1. 新建Freestyle project +2. 构建步骤:执行 `jenkins_build.sh` 或 `jenkins_build.bat` +3. Post-build Actions → Allure Report +4. Results path: `zhyy/test_case/reports/allure-results` + +## 参数化构建 + +在Jenkins任务中配置以下参数: + +| 参数名 | 类型 | 说明 | 示例值 | +|--------|------|------|--------| +| RUN_TYPE | Choice | 运行方式 | all, feature, story, dir, file, keyword, marker | +| FEATURE_NAME | String | Feature标签 | 深圳采购工作台采购订单页面 | +| STORY_NAME | String | Story标签 | 验证采购工作台采购订单页面列表查询 | +| DIR_PATH | String | 目录路径 | 接口/SZPurchase | +| FILE_PATH | String | 文件路径 | 接口/SZPurchase/PurchaseOrderManage.py | +| KEYWORD | String | 关键字 | purchase | +| MARKER | String | Pytest标记 | smoke | + +## 常用命令 + +### 本地运行 +```bash +# 运行所有测试 +python run_tests.py + +# 按目录运行 +python run_tests.py --dir "接口/SZPurchase" + +# 按文件运行 +python run_tests.py --file "接口/SZPurchase/PurchaseOrderManage.py" + +# 生成并打开报告 +python run_tests.py --all --report --open +``` + +### Jenkins中运行 +```bash +# 使用构建脚本(自动检测参数) +bash jenkins_build.sh + +# 或直接使用run_tests.py +python run_tests.py --all --no-report +``` + +## Allure报告路径 + +- **结果目录**: `zhyy/test_case/reports/allure-results` +- **报告目录**: `zhyy/test_case/reports/allure-report` +- **Jenkins中查看**: 构建完成后点击左侧 "Allure Report" 链接 + +## 环境变量 + +Jenkins会自动设置以下环境变量: +- `WORKSPACE`: Jenkins工作空间路径 +- `BUILD_NUMBER`: 构建编号 +- `JENKINS_URL`: Jenkins服务器地址 + +`run_tests.py` 会自动检测Jenkins环境并调整路径。 + +## 详细文档 + +更多配置说明请参考:`JENKINS_SETUP.md` diff --git a/dulizhan/test_case/README_RUN_TESTS.md b/dulizhan/test_case/README_RUN_TESTS.md new file mode 100644 index 0000000..15762dc --- /dev/null +++ b/dulizhan/test_case/README_RUN_TESTS.md @@ -0,0 +1,96 @@ +# 测试执行说明 + +## 统一测试执行工具 + +使用 `run_tests.py` 可以方便地执行各种测试用例。 + +## 安装依赖 + +```bash +pip install pytest +pip install pytest-allure-adaptor # 或 allure-pytest +pip install allure-python-commons +``` + +## 使用方法 + +### 1. 运行所有测试用例 + +```bash +python run_tests.py --all +``` + +### 2. 按 Allure Feature 标签运行 + +```bash +python run_tests.py --feature "深圳采购工作台采购订单页面" +``` + +### 3. 按 Allure Story 标签运行 + +```bash +python run_tests.py --story "验证采购工作台采购订单页面列表查询" +``` + +### 4. 按目录运行 + +```bash +python run_tests.py --dir "接口/SZPurchase" +``` + +### 5. 按文件运行 + +```bash +python run_tests.py --file "接口/SZPurchase/PurchaseOrderManage.py" +``` + +### 6. 按关键字运行(匹配文件名或类名) + +```bash +python run_tests.py --keyword "purchase" +``` + +### 7. 按 pytest 标记运行 + +```bash +python run_tests.py --marker "smoke" +``` + +### 8. 生成并打开 Allure 报告 + +```bash +python run_tests.py --all --report --open +``` + +## 快捷方式(Windows) + +- `run_all.bat` - 运行所有测试用例 +- `run_purchase.bat` - 运行采购相关测试用例 + +## 参数说明 + +- `--all`: 运行所有测试用例 +- `--feature `: 按allure feature标签运行 +- `--story `: 按allure story标签运行 +- `--dir `: 按目录运行(相对于TestCase目录) +- `--file `: 按文件运行(相对于TestCase目录) +- `--keyword `: 按关键字运行 +- `--marker `: 按pytest标记运行 +- `--report`: 生成Allure报告 +- `--open`: 打开Allure报告 +- `--no-report`: 不生成Allure报告 + +## 报告位置 + +- Allure结果: `reports/allure-results/` +- Allure报告: `reports/allure-report/` + +## 查看报告 + +生成报告后,可以使用以下命令打开: + +```bash +allure open reports/allure-report +``` + +或者直接使用 `--open` 参数自动打开。 diff --git a/dulizhan/test_case/Resource/AdapterKws/hh-qa.robot b/dulizhan/test_case/Resource/AdapterKws/hh-qa.robot new file mode 100644 index 0000000..863eded --- /dev/null +++ b/dulizhan/test_case/Resource/AdapterKws/hh-qa.robot @@ -0,0 +1,31 @@ +*** Settings *** +*** Variables *** + + + +# ============ JoyHub 管理后台 - 用户模块 参数 ============ +# 登录参数 +${joyhub_login_username} joytest # JoyHub管理后台登录用户名 +${joyhub_login_password} Zhou1599 # JoyHub管理后台登录密码 +${joyhub_login_token} # JoyHub管理后台登录Token +${joyhub_login_max_retries} 3 # 登录最大重试次数 +${joyhub_login_retry_delay} 2 # 登录重试间隔(秒) + +# 分页参数 +${joyhub_page_no} 1 # 默认页码 +${joyhub_page_size} 10 # 默认每页条数 + +# 用户状态参数 +${joyhub_user_status_enable} 1 # 用户状态-启用 +${joyhub_user_status_disable} 0 # 用户状态-禁用 + +# 用户性别参数 +${joyhub_user_sex_male} 1 # 用户性别-男 +${joyhub_user_sex_female} 2 # 用户性别-女 +${joyhub_user_sex_unknown} 0 # 用户性别-未知 + +# 测试用户数据前缀 +${joyhub_test_user_prefix} testuser_ # 测试用户账号前缀 +${joyhub_test_nickname_prefix} 测试用户 # 测试用户昵称前缀 + + diff --git a/dulizhan/test_case/TestCase/__init__.py b/dulizhan/test_case/TestCase/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Banner.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Banner.py new file mode 100644 index 0000000..8a7de29 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Banner.py @@ -0,0 +1,292 @@ +import pytest +import allure +import logging +import requests +import json +import time +from dulizhan.library.BusinessKw.JoyHub.BannerManage import BannerManage + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature("管理后台 - Banner管理模块") +class TestBannerManage: + banner_id = None + token_set = False + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + cls.test_case = BannerManage() + username = "joytest" + password = "Zhou1599" + + cls.test_case._clear_user_fingerprint(username) + + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + @allure.story("验证登录") + @allure.title("测试登录接口") + def test_joyhub_login_post(self): + """测试登录接口""" + assert self.token_set is True, "登录失败,Token未设置" + logging.info("登录验证通过,Token已设置") + + @allure.story("验证获得Banner分页") + @allure.title("测试获得Banner管理分页接口") + def test_joyhub_banner_page_get(self): + """测试获得Banner管理分页接口""" + with allure.step("1. 准备请求参数"): + params = { + "page_no": 1, + "page_size": 10, + "position": "", + "title": "", + "platform": "", + "lang": "", + "banner_type": "", + "status": "" + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_banner_page_get(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "list" in resp["data"], "响应中缺少list字段" + assert "total" in resp["data"], "响应中缺少total字段" + assert isinstance(resp["data"]["list"], list), "list字段不是列表类型" + assert isinstance(resp["data"]["total"], int), "total字段不是整数类型" + logging.info("获得Banner分页列表验证通过") + + @allure.story("验证创建Banner") + @allure.title("测试创建Banner管理接口") + def test_joyhub_banner_create_post(self): + """测试创建Banner管理接口""" + with allure.step("1. 准备请求参数"): + timestamp = int(time.time()) + params = { + "position": f"home_{timestamp}", + "platform": 1, + "lang": "en", + "rank_num": timestamp % 1000, + "banner_type": "promotion", + "status": 1, + "interval_time": 5, + "title": f"测试Banner_{timestamp}", + "sub_title": "测试副标题", + "image": {'url': 'https://www.toendi.com/static/image/cd94c191561c4a37a04c78fca2913851.webp', 'name': 'Test Banner', 'mime_type': 'image/webp'}, + "link": "https://example.com" + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_banner_create_post(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], int), "data字段不是整数类型" + TestBannerManage.banner_id = resp["data"] + logging.info(f"创建Banner成功,Banner ID: {TestBannerManage.banner_id}") + + @allure.story("验证获得Banner详情") + @allure.title("测试获得Banner详情接口") + def test_joyhub_banner_get_get(self): + """测试获得Banner详情接口""" + with allure.step("1. 先创建一个Banner"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_banner_create_post( + position=f"detail_test_{timestamp}", + platform=1, + lang="en", + rank_num=timestamp % 1000, + banner_type="promotion", + status=1, + interval_time=5, + title=f"详情测试Banner_{timestamp}" + ) + banner_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not banner_id: + pytest.skip("创建测试Banner失败,跳过详情测试") + + allure.attach(json.dumps({"id": banner_id}, ensure_ascii=False), name="Banner ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用获得详情接口"): + resp = self.test_case.kw_joyhub_banner_get_get(banner_id=banner_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], dict), "data字段不是字典类型" + assert "id" in resp["data"], "响应中缺少id字段" + assert resp["data"]["id"] == banner_id, "返回的ID与请求的不一致" + logging.info("获得Banner详情验证通过") + + @allure.story("验证更新Banner") + @allure.title("测试更新Banner管理接口") + def test_joyhub_banner_update_put(self): + """测试更新Banner管理接口""" + with allure.step("1. 先创建一个Banner"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_banner_create_post( + position=f"update_test_{timestamp}", + platform=1, + lang="en", + rank_num=timestamp % 1000, + banner_type="promotion", + status=1, + interval_time=5, + title=f"待更新Banner_{timestamp}" + ) + banner_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not banner_id: + pytest.skip("创建测试Banner失败,跳过更新测试") + + allure.attach(json.dumps({"id": banner_id}, ensure_ascii=False), name="Banner ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用更新接口"): + timestamp = int(time.time()) + update_params = { + "banner_id": banner_id, + "position": f"updated_position_{timestamp}", + "platform": 2, + "lang": "de", + "rank_num": (timestamp % 1000) + 1, + "banner_type": "updated_type", + "status": 2, + "interval_time": 10, + "title": f"已更新Banner_{timestamp}", + "sub_title": "已更新副标题", + "image": {'url': 'https://www.toendi.com/static/image/updated.webp', 'name': 'Updated Banner', 'mime_type': 'image/webp'}, + "link": "https://updated-example.com" + } + resp = self.test_case.kw_joyhub_banner_update_put(**update_params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "更新Banner失败" + logging.info("更新Banner验证通过") + + @allure.story("验证删除Banner") + @allure.title("测试删除Banner管理接口") + def test_joyhub_banner_delete_delete(self): + """测试删除Banner管理接口""" + with allure.step("1. 先创建一个测试Banner"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_banner_create_post( + position=f"delete_test_{timestamp}", + platform=1, + lang="en", + rank_num=timestamp % 1000, + banner_type="promotion", + status=2, + interval_time=5, + title=f"待删除Banner_{timestamp}" + ) + banner_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not banner_id: + pytest.skip("创建测试Banner失败,跳过删除测试") + + allure.attach(json.dumps({"id": banner_id}, ensure_ascii=False), name="待删除Banner ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用删除接口"): + resp = self.test_case.kw_joyhub_banner_delete_delete(banner_id=banner_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "删除Banner失败" + logging.info("删除Banner验证通过") + + @allure.story("验证批量删除Banner") + @allure.title("测试批量删除Banner管理接口") + def test_joyhub_banner_delete_list_delete(self): + """测试批量删除Banner管理接口""" + with allure.step("1. 先创建两个测试Banner"): + timestamp = int(time.time()) + resp1 = self.test_case.kw_joyhub_banner_create_post( + position=f"batch_delete_1_{timestamp}", + platform=1, + lang="en", + rank_num=timestamp % 1000, + banner_type="promotion", + status=2, + interval_time=5, + title=f"批量删除Banner1_{timestamp}" + ) + resp2 = self.test_case.kw_joyhub_banner_create_post( + position=f"batch_delete_2_{timestamp}", + platform=1, + lang="en", + rank_num=timestamp % 1000 + 1, + banner_type="promotion", + status=2, + interval_time=5, + title=f"批量删除Banner2_{timestamp}" + ) + + banner_id1 = resp1.get("data") if resp1 and resp1.get("code") == 0 else None + banner_id2 = resp2.get("data") if resp2 and resp2.get("code") == 0 else None + + if not banner_id1 or not banner_id2: + pytest.skip("创建测试Banner失败,跳过批量删除测试") + + banner_ids = [banner_id1, banner_id2] + allure.attach(json.dumps({"ids": banner_ids}, ensure_ascii=False), name="待删除Banner IDs", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用批量删除接口"): + resp = self.test_case.kw_joyhub_banner_delete_list_delete(banner_ids=banner_ids) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "批量删除Banner失败" + logging.info("批量删除Banner验证通过") \ No newline at end of file diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Dept.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Dept.py new file mode 100644 index 0000000..022709a --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Dept.py @@ -0,0 +1,260 @@ +import pytest +import allure +import logging +import requests +import json +import time +from dulizhan.library.BusinessKw.JoyHub.DeptManage import DeptManage + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature("管理后台 - 部门管理模块") +class TestDeptManage: + token_set = False + dept_id = None + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + cls.test_case = DeptManage() + username = "joytest" + password = "Zhou1599" + + cls.test_case._clear_user_fingerprint(username) + + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + logging.warning("如果是指纹锁问题,请联系管理员解除设备限制") + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + def setup_method(self): + """每个测试方法执行前检查token""" + if not self.token_set: + pytest.skip("Token未设置,跳过测试") + + @allure.story("验证登录接口") + @allure.title("测试登录接口") + def test_joyhub_login_post(self): + """测试登录接口""" + assert self.token_set, "登录失败" + logging.info("登录接口验证通过") + + @allure.story("验证获取部门列表") + @allure.title("测试获取部门列表接口") + def test_joyhub_dept_list_get(self): + """测试获取部门列表接口""" + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_dept_list_get() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], list), "data字段应为列表类型" + logging.info("获取部门列表接口验证通过") + + @allure.story("验证创建部门") + @allure.title("测试创建部门接口") + def test_joyhub_dept_create_post(self): + """测试创建部门接口""" + with allure.step("1. 准备请求参数"): + timestamp = int(time.time()) + params = { + "name": f"测试部门_{timestamp}", + "code": f"test_dept_{timestamp}", + "sort": timestamp, + "status": 1, + "phone": "13900139000", + "email": f"test_dept_{timestamp}@example.com" + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_dept_create_post(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], int), "data字段应为整数类型(部门ID)" + TestDeptManage.dept_id = resp["data"] + logging.info(f"创建部门接口验证通过,部门ID: {TestDeptManage.dept_id}") + + @allure.story("验证获得部门信息") + @allure.title("测试获得部门信息接口") + def test_joyhub_dept_get_get(self): + """测试获得部门信息接口""" + if not TestDeptManage.dept_id: + pytest.skip("没有可用的部门ID,跳过测试") + + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_dept_get_get(dept_id=TestDeptManage.dept_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "id" in resp["data"], "响应中缺少id字段" + assert resp["data"]["id"] == TestDeptManage.dept_id, "返回的部门ID与请求不一致" + logging.info("获得部门信息接口验证通过") + + @allure.story("验证更新部门") + @allure.title("测试更新部门接口") + def test_joyhub_dept_update_put(self): + """测试更新部门接口""" + if not TestDeptManage.dept_id: + pytest.skip("没有可用的部门ID,跳过测试") + + with allure.step("1. 准备更新参数"): + timestamp = int(time.time()) + params = { + "dept_id": TestDeptManage.dept_id, + "name": f"测试部门_修改_{timestamp}", + "sort": timestamp, + "status": 1, + "phone": "13900139999", + "email": f"test_dept_updated_{timestamp}@example.com" + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_dept_update_put(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "更新部门失败" + logging.info("更新部门接口验证通过") + + @allure.story("验证删除部门") + @allure.title("测试删除部门接口") + def test_joyhub_dept_delete_post(self): + """测试删除部门接口""" + with allure.step("1. 先创建一个测试部门"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_dept_create_post( + name=f"删除测试部门_{timestamp}", + sort=999, + status=1 + ) + dept_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not dept_id: + pytest.skip("创建测试部门失败,跳过删除测试") + + allure.attach(json.dumps({"id": dept_id}, ensure_ascii=False), name="待删除部门ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用删除接口"): + resp = self.test_case.kw_joyhub_dept_delete_post(dept_id=dept_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + if resp["code"] == 1002005004: + logging.warning(f"部门已被引用无法删除,code={resp.get('code')},msg={resp.get('msg')}") + pytest.skip("部门已被其他数据引用,跳过删除测试") + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "删除部门失败" + logging.info("删除部门接口验证通过") + + @allure.story("验证批量删除部门") + @allure.title("测试批量删除部门接口") + def test_joyhub_dept_delete_list_post(self): + """测试批量删除部门接口""" + with allure.step("1. 先创建两个测试部门"): + timestamp = int(time.time()) + dept_ids = [] + + for i in range(2): + create_resp = self.test_case.kw_joyhub_dept_create_post( + name=f"批量删除测试部门_{timestamp}_{i}", + sort=888 + i, + status=1 + ) + if create_resp and create_resp.get("code") == 0: + dept_ids.append(create_resp.get("data")) + + if len(dept_ids) < 2: + pytest.skip("创建测试部门失败,跳过批量删除测试") + + allure.attach(json.dumps({"ids": dept_ids}, ensure_ascii=False), name="待删除部门ID列表", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用批量删除接口"): + resp = self.test_case.kw_joyhub_dept_delete_list_post(ids=dept_ids) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + if resp["code"] == 1002005004: + logging.warning(f"部门已被引用无法删除,code={resp.get('code')},msg={resp.get('msg')}") + pytest.skip("部门已被其他数据引用,跳过批量删除测试") + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "批量删除部门失败" + logging.info("批量删除部门接口验证通过") + + @allure.story("验证获取部门精简信息列表") + @allure.title("测试获取部门精简信息列表接口") + def test_joyhub_dept_list_all_simple_get(self): + """测试获取部门精简信息列表接口""" + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_dept_list_all_simple_get() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], list), "data字段应为列表类型" + logging.info("获取部门精简信息列表接口验证通过") + + @allure.story("验证获取部门精简信息列表(simple-list)") + @allure.title("测试获取部门精简信息列表接口(simple-list)") + def test_joyhub_dept_simple_list_get(self): + """测试获取部门精简信息列表接口(simple-list)""" + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_dept_simple_list_get() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], list), "data字段应为列表类型" + logging.info("获取部门精简信息列表(simple-list)接口验证通过") diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Post.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Post.py new file mode 100644 index 0000000..64e96d3 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Post.py @@ -0,0 +1,305 @@ +import pytest +import allure +import logging +import requests +import json +import time +from dulizhan.library.BusinessKw.JoyHub.PostManage import PostManage + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature("管理后台 - 岗位模块") +class TestPostManage: + post_id = None + token_set = False + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + cls.test_case = PostManage() + username = "joytest" + password = "Zhou1599" + + cls.test_case._clear_user_fingerprint(username) + + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + def setup_method(self): + """每个测试方法执行前检查token""" + if not self.token_set: + pytest.skip("Token未设置,跳过测试") + + @allure.story("验证登录接口") + @allure.title("测试登录接口") + def test_joyhub_login_post(self): + """登录测试用例,验证登录接口是否正常""" + with allure.step("1. 准备登录参数"): + username = "joytest" + password = "Zhou1599" + allure.attach(f"用户名: {username}, 密码: {password}", name="登录参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用登录接口"): + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + resp = response.json() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="登录响应", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"登录失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "accessToken" in resp["data"], "响应中缺少accessToken字段" + logging.info("登录接口验证通过") + + @allure.story("验证获得岗位分页列表") + @allure.title("测试获得岗位分页列表接口") + def test_joyhub_post_page_get(self): + """测试获得岗位分页列表接口""" + with allure.step("1. 准备请求参数"): + params = {"pageNo": 1, "pageSize": 10} + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_post_page_get(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "list" in resp["data"], "响应中缺少list字段" + assert isinstance(resp["data"]["list"], list), "list字段不是数组类型" + logging.info("获得岗位分页列表接口验证通过") + + @allure.story("验证创建岗位") + @allure.title("测试创建岗位接口") + def test_joyhub_post_create_post(self): + """测试创建岗位接口""" + with allure.step("1. 准备请求参数"): + timestamp = int(time.time()) + params = { + "name": f"测试岗位_{timestamp}", + "code": f"test_post_{timestamp}", + "sort": timestamp, + "status": 1, + "remark": "测试岗位备注" + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_post_create_post(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], int), "data字段不是整数类型" + TestPostManage.post_id = resp["data"] + logging.info(f"创建岗位成功,岗位ID: {TestPostManage.post_id}") + + @allure.story("验证获得岗位信息") + @allure.title("测试获得岗位信息接口") + def test_joyhub_post_get_get(self): + """测试获得岗位信息接口""" + if not TestPostManage.post_id: + pytest.skip("没有可用的岗位ID,跳过测试") + + with allure.step("1. 准备请求参数"): + params = {"id": TestPostManage.post_id} + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_post_get_get(post_id=TestPostManage.post_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "id" in resp["data"], "响应中缺少id字段" + assert resp["data"]["id"] == TestPostManage.post_id, "返回的岗位ID与请求不一致" + logging.info("获得岗位信息接口验证通过") + + @allure.story("验证修改岗位") + @allure.title("测试修改岗位接口") + def test_joyhub_post_update_put(self): + """测试修改岗位接口""" + with allure.step("1. 先创建一个测试岗位"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_post_create_post( + name=f"修改测试岗位_{timestamp}", + code=f"update_test_post_{timestamp}", + sort=888, + status=1 + ) + post_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not post_id: + pytest.skip("创建测试岗位失败,跳过修改测试") + + allure.attach(json.dumps({"id": post_id}, ensure_ascii=False), name="待修改岗位ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 准备修改参数"): + params = { + "post_id": post_id, + "name": f"测试岗位_修改_{timestamp}", + "code": f"test_post_updated_{timestamp}", + "sort": 200, + "status": 1, + "remark": "修改后的备注" + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("3. 调用修改接口"): + resp = self.test_case.kw_joyhub_post_update_put(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("4. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "修改岗位失败" + logging.info("修改岗位接口验证通过") + + @allure.story("验证删除岗位") + @allure.title("测试删除岗位接口") + def test_joyhub_post_delete_post(self): + """测试删除岗位接口""" + with allure.step("1. 先创建一个测试岗位"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_post_create_post( + name=f"删除测试岗位_{timestamp}", + code=f"delete_test_post_{timestamp}", + sort=999, + status=1 + ) + post_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not post_id: + pytest.skip("创建测试岗位失败,跳过删除测试") + + allure.attach(json.dumps({"id": post_id}, ensure_ascii=False), name="待删除岗位ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用删除接口"): + resp = self.test_case.kw_joyhub_post_delete_post(post_id=post_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + # 错误码1002005004表示岗位被引用,允许这种情况通过 + if resp["code"] == 1002005004: + logging.warning(f"岗位已被引用无法删除,code={resp.get('code')},msg={resp.get('msg')}") + pytest.skip("岗位已被其他数据引用,跳过删除测试") + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "删除岗位失败" + logging.info("删除岗位接口验证通过") + + @allure.story("验证批量删除岗位") + @allure.title("测试批量删除岗位接口") + def test_joyhub_post_delete_list_post(self): + """测试批量删除岗位接口""" + with allure.step("1. 先创建两个测试岗位"): + timestamp = int(time.time()) + resp1 = self.test_case.kw_joyhub_post_create_post( + name=f"批量删除测试岗位1_{timestamp}", + code=f"batch_delete_test_1_{timestamp}", + sort=300, + status=1 + ) + resp2 = self.test_case.kw_joyhub_post_create_post( + name=f"批量删除测试岗位2_{timestamp}", + code=f"batch_delete_test_2_{timestamp}", + sort=301, + status=1 + ) + + post_id_1 = resp1.get("data") if resp1 and resp1.get("code") == 0 else None + post_id_2 = resp2.get("data") if resp2 and resp2.get("code") == 0 else None + + if not post_id_1 or not post_id_2: + pytest.skip("创建测试岗位失败,跳过批量删除测试") + + ids = [post_id_1, post_id_2] + allure.attach(json.dumps({"ids": ids}, ensure_ascii=False), name="待删除岗位ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用批量删除接口"): + resp = self.test_case.kw_joyhub_post_delete_list_post(ids=ids) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + # 错误码1002005004表示岗位被引用,允许这种情况通过 + if resp["code"] == 1002005004: + logging.warning(f"岗位已被引用无法删除,code={resp.get('code')},msg={resp.get('msg')}") + pytest.skip("岗位已被其他数据引用,跳过批量删除测试") + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "批量删除岗位失败" + logging.info("批量删除岗位接口验证通过") + + @allure.story("验证获取岗位全列表") + @allure.title("测试获取岗位全列表接口") + def test_joyhub_post_list_all_simple_get(self): + """测试获取岗位全列表接口""" + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_post_list_all_simple_get() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], list), "data字段不是数组类型" + logging.info("获取岗位全列表接口验证通过") + + @allure.story("验证获取岗位精简列表") + @allure.title("测试获取岗位精简列表接口") + def test_joyhub_post_simple_list_get(self): + """测试获取岗位精简列表接口""" + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_post_simple_list_get() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], list), "data字段不是数组类型" + logging.info("获取岗位精简列表接口验证通过") diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Role.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Role.py new file mode 100644 index 0000000..c8edc4d --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Role.py @@ -0,0 +1,433 @@ +# -*- coding: utf-8 -*- +# 作者 周琦 2026/04/30 +""" +JoyHub 角色管理测试用例 +""" +import allure +import logging +import json +import requests + +from dulizhan.library.BusinessKw.JoyHub.RoleManage import RoleManage + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature('管理后台 - 角色模块') +class TestRoleManage(object): + test_case = RoleManage() + created_role_id = None + token_set = False + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + username = "joytest" + password = "Zhou1599" + + # 直接调用登录接口(不使用加密头) + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + logging.info("=============================================") + logging.info("=========== 登录完成 ============") + logging.info("=============================================") + + def setup_method(self): + """每个测试用例执行前的准备工作""" + if not self.token_set: + logging.warning("Token未设置,可能影响后续接口调用") + + logging.info("-----------------------------Test Start-------------------------------") + + def teardown_method(self): + logging.info("-----------------------------Test End-------------------------------") + + @allure.story("验证获得角色分页列表") + def test_joyhub_role_page_get(self): + """测试角色分页列表查询""" + with allure.step("准备查询参数"): + page_no = 1 + page_size = 10 + params = {"pageNo": page_no, "pageSize": page_size} + allure.attach(json.dumps(params, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("查询角色分页列表,pageNo: {}, pageSize: {}".format(page_no, page_size)) + + with allure.step("调用查询接口"): + response_data = self.test_case.kw_joyhub_role_page_get( + note="获得角色分页列表", + pageNo=page_no, + pageSize=page_size + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ✓") + + data = response_data.get('data', {}) + assert isinstance(data, dict), "data字段应为字典类型" + logging.info("断言: data字段为字典类型 ✓") + + if 'records' in data: + assert isinstance(data['records'], list), "records字段应为列表类型" + logging.info("断言: records字段为列表类型 ✓,记录数: {}".format(len(data['records']))) + + logging.info("✓ 角色分页列表查询成功") + + @allure.story("验证新增角色") + def test_joyhub_role_create_post(self): + """测试新增角色""" + import random + + with allure.step("准备新增角色参数"): + role_name = "测试角色{}".format(random.randint(1000, 9999)) + role_code = "TEST_ROLE_{}".format(random.randint(1000, 9999)) + payload = { + "name": role_name, + "code": role_code, + "sort": 100, + "status": 1, + "remark": "测试角色备注" + } + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备新增角色: {}".format(role_name)) + + with allure.step("调用新增角色接口"): + response_data = self.test_case.kw_joyhub_role_create_post( + note="新增角色", + **payload + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ✓") + + assert isinstance(response_data['data'], int), "data字段应为整数类型" + logging.info("断言: data字段为整数类型 ✓") + + logging.info("✓ 新增角色成功,角色ID: {}".format(response_data['data'])) + self.created_role_id = response_data['data'] + + @allure.story("验证获得角色详情") + def test_joyhub_role_get_get(self): + """测试角色详情查询""" + import random + + with allure.step("创建测试角色"): + role_name = "测试角色详情{}".format(random.randint(1000, 9999)) + role_code = "TEST_ROLE_DETAIL_{}".format(random.randint(1000, 9999)) + create_resp = self.test_case.kw_joyhub_role_create_post( + note="创建测试角色", + name=role_name, + code=role_code, + sort=200, + status=1 + ) + role_id = create_resp.get('data') + logging.info("创建测试角色成功,角色ID: {}".format(role_id)) + + with allure.step("调用查询角色详情接口"): + params = {"id": role_id} + allure.attach(json.dumps(params, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + response_data = self.test_case.kw_joyhub_role_get_get( + note="获得角色信息", + id=role_id + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ✓") + + data = response_data.get('data', {}) + assert 'id' in data, "角色详情中缺少id字段" + logging.info("断言: 角色详情包含id字段 ✓") + + assert data['id'] == role_id, "返回的角色ID与请求不一致" + logging.info("断言: 返回的角色ID与请求一致 ✓") + + assert 'name' in data, "角色详情中缺少name字段" + logging.info("断言: 角色详情包含name字段 ✓") + + assert data['name'] == role_name, "返回的角色名称与创建时不一致" + logging.info("断言: 返回的角色名称与创建时一致 ✓") + + logging.info("✓ 角色详情查询成功") + + @allure.story("验证修改角色") + def test_joyhub_role_update_put(self): + """测试修改角色""" + import random + + with allure.step("创建测试角色"): + role_name = "测试角色修改{}".format(random.randint(1000, 9999)) + role_code = "TEST_ROLE_UPDATE_{}".format(random.randint(1000, 9999)) + create_resp = self.test_case.kw_joyhub_role_create_post( + note="创建测试角色", + name=role_name, + code=role_code, + sort=300, + status=1 + ) + role_id = create_resp.get('data') + logging.info("创建测试角色成功,角色ID: {}".format(role_id)) + + with allure.step("准备修改参数"): + new_name = "修改后的角色名称{}".format(random.randint(1000, 9999)) + payload = { + "id": role_id, + "name": new_name, + "code": role_code, + "sort": 301, + "status": 1, + "remark": "修改后的备注" + } + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备修改角色,新名称: {}".format(new_name)) + + with allure.step("调用修改角色接口"): + response_data = self.test_case.kw_joyhub_role_update_put( + note="修改角色", + **payload + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "角色修改失败" + logging.info("断言: 角色修改成功 ✓") + + logging.info("✓ 修改角色成功") + + @allure.story("验证删除角色") + def test_joyhub_role_delete_post(self): + """测试删除角色""" + import random + + with allure.step("创建测试角色"): + role_name = "测试角色删除{}".format(random.randint(1000, 9999)) + role_code = "TEST_ROLE_DELETE_{}".format(random.randint(1000, 9999)) + create_resp = self.test_case.kw_joyhub_role_create_post( + note="创建测试角色", + name=role_name, + code=role_code, + sort=400, + status=1 + ) + role_id = create_resp.get('data') + logging.info("创建测试角色成功,角色ID: {}".format(role_id)) + + with allure.step("准备删除参数"): + payload = {"id": role_id} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备删除角色,角色ID: {}".format(role_id)) + + with allure.step("调用删除接口"): + response_data = self.test_case.kw_joyhub_role_delete_post( + note="删除角色", + id=role_id + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "角色删除失败" + logging.info("断言: 角色删除成功 ✓") + + logging.info("✓ 删除角色成功") + + @allure.story("验证批量删除角色") + def test_joyhub_role_delete_list_post(self): + """测试批量删除角色""" + import random + + with allure.step("创建测试角色"): + role_ids = [] + for i in range(2): + role_name = "测试批量删除角色{}".format(random.randint(1000, 9999)) + role_code = "TEST_ROLE_BATCH_{}_{}".format(random.randint(1000, 9999), i) + create_resp = self.test_case.kw_joyhub_role_create_post( + note="创建测试角色{}".format(i), + name=role_name, + code=role_code, + sort=500 + i, + status=1 + ) + role_ids.append(create_resp.get('data')) + logging.info("创建测试角色成功,角色ID列表: {}".format(role_ids)) + + with allure.step("准备批量删除参数"): + payload = {"ids": role_ids} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备批量删除角色") + + with allure.step("调用批量删除接口"): + response_data = self.test_case.kw_joyhub_role_delete_list_post( + note="批量删除角色", + ids=role_ids + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "批量删除失败" + logging.info("断言: 批量删除成功 ✓") + + logging.info("✓ 批量删除角色成功") + + @allure.story("验证获取角色精简信息列表") + def test_joyhub_role_simple_list_get(self): + """测试获取角色精简信息列表""" + with allure.step("调用查询接口"): + response_data = self.test_case.kw_joyhub_role_simple_list_get( + note="获取角色精简信息列表" + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + logging.info("获取角色精简信息列表") + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert isinstance(response_data['data'], list), "data字段应为列表类型" + logging.info("断言: data字段为列表类型 ✓,记录数: {}".format(len(response_data['data']))) + + logging.info("✓ 角色精简信息列表查询成功") + + @allure.story("验证获取所有角色精简信息列表") + def test_joyhub_role_list_all_simple_get(self): + """测试获取所有角色精简信息列表""" + with allure.step("调用查询接口"): + response_data = self.test_case.kw_joyhub_role_list_all_simple_get( + note="获取所有角色精简信息列表" + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + logging.info("获取所有角色精简信息列表") + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert isinstance(response_data['data'], list), "data字段应为列表类型" + logging.info("断言: data字段为列表类型 ✓,记录数: {}".format(len(response_data['data']))) + + logging.info("✓ 所有角色精简信息列表查询成功") diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_ShippingTemplate.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_ShippingTemplate.py new file mode 100644 index 0000000..31952d5 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_ShippingTemplate.py @@ -0,0 +1,308 @@ +import pytest +import allure +import logging +import requests +import json +import time +from dulizhan.library.BusinessKw.JoyHub.ShippingTemplateManage import ShippingTemplateManage + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature("管理后台 - 运费模板模块") +class TestShippingTemplateManage: + shipping_template_id = None + token_set = False + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + cls.test_case = ShippingTemplateManage() + username = "joytest" + password = "Zhou1599" + + cls.test_case._clear_user_fingerprint(username) + + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + def setup_method(self): + """每个测试方法执行前检查token""" + if not self.token_set: + pytest.skip("Token未设置,跳过测试") + + @allure.story("验证登录接口") + @allure.title("测试登录接口") + def test_joyhub_login_post(self): + """登录测试用例,验证登录接口是否正常""" + with allure.step("1. 准备登录参数"): + username = "joytest" + password = "Zhou1599" + allure.attach(f"用户名: {username}, 密码: {password}", name="登录参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用登录接口"): + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + resp = response.json() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="登录响应", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"登录失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "accessToken" in resp["data"], "响应中缺少accessToken字段" + logging.info("登录接口验证通过") + + @allure.story("验证获得运费模板分页列表") + @allure.title("测试获得运费模板分页列表接口") + def test_joyhub_shipping_template_page_get(self): + """测试获得运费模板分页列表接口""" + with allure.step("1. 准备请求参数"): + params = {"page_no": 1, "page_size": 10} + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_shipping_template_page_get(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "list" in resp["data"], "响应中缺少list字段" + assert isinstance(resp["data"]["list"], list), "list字段不是数组类型" + logging.info("获得运费模板分页列表接口验证通过") + + @allure.story("验证创建运费模板") + @allure.title("测试创建运费模板接口") + def test_joyhub_shipping_template_create_post(self): + """测试创建运费模板接口""" + with allure.step("1. 准备请求参数"): + timestamp = int(time.time()) + params = { + "template_name": f"测试模板_{timestamp}", + "is_default": 2, + "calculation_algorithm": "fixed_amount", + "currency": "USD", + "status": 1 + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_shipping_template_create_post(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], int), "data字段不是整数类型" + TestShippingTemplateManage.shipping_template_id = resp["data"] + logging.info(f"创建运费模板成功,模板ID: {TestShippingTemplateManage.shipping_template_id}") + + @allure.story("验证获得运费模板详情") + @allure.title("测试获得运费模板详情接口") + def test_joyhub_shipping_template_get_detail_get(self): + """测试获得运费模板详情(含规则与子表)接口""" + if not TestShippingTemplateManage.shipping_template_id: + pytest.skip("没有可用的运费模板ID,跳过测试") + + with allure.step("1. 准备请求参数"): + shipping_template_id = TestShippingTemplateManage.shipping_template_id + allure.attach(json.dumps({"id": shipping_template_id}, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_shipping_template_get_detail_get(shipping_template_id=shipping_template_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + logging.info("获得运费模板详情接口验证通过") + + @allure.story("验证保存运费模板(含规则与子表)") + @allure.title("测试保存运费模板(含规则与子表)接口") + def test_joyhub_shipping_template_save_with_children_post(self): + """测试保存运费模板信息(含规则与子表)接口""" + with allure.step("1. 准备请求参数"): + timestamp = int(time.time()) + params = { + "template_name": f"测试模板_含规则_{timestamp}", + "is_default": 2, + "calculation_algorithm": "fixed_amount", + "currency": "USD", + "status": 1, + "shipping_rules": [] + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用接口"): + resp = self.test_case.kw_joyhub_shipping_template_save_with_children_post(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert isinstance(resp["data"], int), "data字段不是整数类型" + logging.info(f"保存运费模板(含规则与子表)成功,模板ID: {resp['data']}") + + @allure.story("验证更新运费模板") + @allure.title("测试更新运费模板接口") + def test_joyhub_shipping_template_update_put(self): + """测试更新运费模板接口""" + with allure.step("1. 先创建一个测试运费模板"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_shipping_template_create_post( + template_name=f"待修改模板_{timestamp}", + is_default=2, + calculation_algorithm="fixed_amount", + currency="USD", + status=1 + ) + shipping_template_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not shipping_template_id: + pytest.skip("创建测试运费模板失败,跳过更新测试") + + allure.attach(json.dumps({"id": shipping_template_id}, ensure_ascii=False), name="待修改模板ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 准备修改参数"): + params = { + "id": shipping_template_id, + "template_name": f"测试模板_修改_{timestamp}", + "is_default": 2, + "calculation_algorithm": "percentage", + "currency": "CNY", + "status": 2 + } + allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("3. 调用更新接口"): + resp = self.test_case.kw_joyhub_shipping_template_update_put(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("4. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "更新运费模板失败" + logging.info("更新运费模板接口验证通过") + + @allure.story("验证删除运费模板") + @allure.title("测试删除运费模板接口") + def test_joyhub_shipping_template_delete_post(self): + """测试删除运费模板接口""" + with allure.step("1. 先创建一个测试运费模板"): + timestamp = int(time.time()) + create_resp = self.test_case.kw_joyhub_shipping_template_create_post( + template_name=f"待删除模板_{timestamp}", + is_default=2, + calculation_algorithm="fixed_amount", + currency="USD", + status=1 + ) + shipping_template_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None + + if not shipping_template_id: + pytest.skip("创建测试运费模板失败,跳过删除测试") + + allure.attach(json.dumps({"id": shipping_template_id}, ensure_ascii=False), name="待删除模板ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 先停用模板(启用的不能删)"): + update_resp = self.test_case.kw_joyhub_shipping_template_update_put( + id=shipping_template_id, + template_name=f"待删除模板_{timestamp}", + is_default=2, + calculation_algorithm="fixed_amount", + currency="USD", + status=2 + ) + if update_resp.get("code") != 0: + pytest.skip("停用模板失败,跳过删除测试") + logging.info(f"已停用模板 {shipping_template_id}") + + with allure.step("3. 调用删除接口"): + resp = self.test_case.kw_joyhub_shipping_template_delete_post(shipping_template_id=shipping_template_id) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("4. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "删除运费模板失败" + logging.info("删除运费模板接口验证通过") + + @allure.story("验证批量删除运费模板") + @allure.title("测试批量删除运费模板接口") + def test_joyhub_shipping_template_delete_list_post(self): + """测试批量删除运费模板接口""" + with allure.step("1. 先创建两个测试运费模板"): + timestamp = int(time.time()) + resp1 = self.test_case.kw_joyhub_shipping_template_create_post( + template_name=f"批量删除模板1_{timestamp}", + is_default=2, + calculation_algorithm="fixed_amount", + currency="USD", + status=1 + ) + resp2 = self.test_case.kw_joyhub_shipping_template_create_post( + template_name=f"批量删除模板2_{timestamp}", + is_default=2, + calculation_algorithm="fixed_amount", + currency="USD", + status=1 + ) + + template_id_1 = resp1.get("data") if resp1 and resp1.get("code") == 0 else None + template_id_2 = resp2.get("data") if resp2 and resp2.get("code") == 0 else None + + if not template_id_1 or not template_id_2: + pytest.skip("创建测试运费模板失败,跳过批量删除测试") + + ids = [template_id_1, template_id_2] + allure.attach(json.dumps({"ids": ids}, ensure_ascii=False), name="待删除模板ID", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用批量删除接口"): + resp = self.test_case.kw_joyhub_shipping_template_delete_list_post(ids=ids) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "批量删除运费模板失败" + logging.info("批量删除运费模板接口验证通过") \ No newline at end of file diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_UserProfile.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_UserProfile.py new file mode 100644 index 0000000..4f7a6f7 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_UserProfile.py @@ -0,0 +1,174 @@ +import pytest +import allure +import logging +import requests +import json +from dulizhan.library.BusinessKw.JoyHub.UserProfile import UserProfile + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature("管理后台 - 用户个人中心模块") +class TestUserProfile: + token_set = False + original_password = "Zhou1599" + test_password = "Aa123456" + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + cls.test_case = UserProfile() + username = "joytest" + password = cls.original_password + + cls.test_case._clear_user_fingerprint(username) + + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + def setup_method(self): + """每个测试方法执行前检查token""" + if not self.token_set: + pytest.skip("Token未设置,跳过测试") + + @classmethod + def teardown_class(cls): + """测试类结束后,确保密码改回原密码""" + logging.info("=============================================") + logging.info("=========== 测试结束,恢复原密码 ============") + logging.info("=============================================") + + try: + # 先用测试密码登录 + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": "joytest", "password": cls.test_password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + # 修改回原密码 + cls.test_case.set_joyhub_token(token) + resp = cls.test_case.kw_joyhub_user_profile_update_password_put( + old_password=cls.test_password, + new_password=cls.original_password + ) + if resp and resp.get('code') == 0: + logging.info("密码已恢复为原密码: {}".format(cls.original_password)) + else: + logging.warning("恢复原密码失败: {}".format(resp)) + except Exception as e: + logging.error("恢复原密码异常: {}".format(str(e))) + + @allure.story("验证获得登录用户信息") + @allure.title("测试获得登录用户信息接口") + def test_joyhub_user_profile_get_get(self): + """测试获得登录用户信息接口""" + with allure.step("1. 调用接口"): + resp = self.test_case.kw_joyhub_user_profile_get_get() + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert "id" in resp["data"], "响应中缺少id字段" + assert "username" in resp["data"], "响应中缺少username字段" + logging.info("获得登录用户信息接口验证通过") + + @allure.story("验证修改用户个人信息") + @allure.title("测试修改用户个人信息接口") + def test_joyhub_user_profile_update_put(self): + """测试修改用户个人信息接口""" + with allure.step("1. 先获取当前用户信息"): + get_resp = self.test_case.kw_joyhub_user_profile_get_get() + if not get_resp or get_resp.get('code') != 0: + pytest.skip("获取用户信息失败,跳过修改测试") + + original_data = get_resp.get('data', {}) + allure.attach(json.dumps(original_data, ensure_ascii=False, indent=2), name="原始用户信息", attachment_type=allure.attachment_type.JSON) + + with allure.step("2. 准备修改参数"): + params = { + "nickname": "测试用户_修改", + "email": "test_updated@example.com", + "mobile": "13900139000", + "sex": 1 + } + allure.attach(json.dumps(params, ensure_ascii=False), name="修改参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("3. 调用修改接口"): + resp = self.test_case.kw_joyhub_user_profile_update_put(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("4. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "修改用户个人信息失败" + logging.info("修改用户个人信息接口验证通过") + + with allure.step("5. 恢复原始信息"): + # 恢复原始信息 + restore_params = { + "nickname": original_data.get("nickname", ""), + "email": original_data.get("email", ""), + "mobile": original_data.get("mobile", ""), + "sex": original_data.get("sex"), + "avatar": original_data.get("avatar", "") + } + restore_resp = self.test_case.kw_joyhub_user_profile_update_put(**restore_params) + if restore_resp and restore_resp.get('code') == 0: + logging.info("用户信息已恢复") + else: + logging.warning("恢复用户信息失败: {}".format(restore_resp)) + + @allure.story("验证修改用户个人密码") + @allure.title("测试修改用户个人密码接口") + def test_joyhub_user_profile_update_password_put(self): + """测试修改用户个人密码接口""" + with allure.step("1. 准备修改密码参数"): + params = { + "old_password": self.original_password, + "new_password": self.test_password + } + allure.attach(json.dumps({"oldPassword": "******", "newPassword": "******"}, ensure_ascii=False), name="修改参数", attachment_type=allure.attachment_type.TEXT) + + with allure.step("2. 调用修改密码接口"): + resp = self.test_case.kw_joyhub_user_profile_update_password_put(**params) + allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("3. 验证响应"): + assert resp is not None, "响应为空" + assert "code" in resp, "响应中缺少code字段" + assert resp["code"] == 0, f"请求失败,code={resp.get('code')}" + assert "data" in resp, "响应中缺少data字段" + assert resp["data"] is True, "修改用户个人密码失败" + logging.info("修改用户个人密码接口验证通过,密码已修改为: {}".format(self.test_password)) + logging.info("注意:测试类结束后将自动恢复原密码: {}".format(self.original_password)) diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_user.py b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_user.py new file mode 100644 index 0000000..626a223 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_user.py @@ -0,0 +1,534 @@ +# -*- coding: utf-8 -*- +# 作者 周琦 2026/04/28 +import allure +import logging +import requests +import json + +from dulizhan.library.BusinessKw.JoyHub.UserManage import UserManage + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +@allure.feature('管理后台 - 用户模块') +class TestUserManage(object): + test_case = UserManage() + token_set = False + + @classmethod + def setup_class(cls): + """在整个测试类开始时登录一次,所有测试用例共享token""" + logging.info("=============================================") + logging.info("=========== 开始登录,获取Token ============") + logging.info("=============================================") + + username = "joytest" + password = "Zhou1599" + + # 清除指纹 + cls.test_case._clear_user_fingerprint(username) + + # 直接调用登录接口(不使用加密头) + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + + try: + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + login_response = response.json() + + if login_response and login_response.get('code') == 0: + token = login_response.get('data', {}).get('accessToken', '') + if token: + cls.test_case.set_joyhub_token(token) + cls.token_set = True + logging.info("登录成功,获取到Token: {}...".format(token[:20])) + else: + logging.warning("登录成功但未获取到Token") + else: + logging.error("登录失败: {}".format(login_response)) + except Exception as e: + logging.error("登录异常: {}".format(str(e))) + + logging.info("=============================================") + logging.info("=========== 登录完成 ============") + logging.info("=============================================") + + def setup_method(self): + """每个测试用例执行前的准备工作""" + if not self.token_set: + logging.warning("Token未设置,可能影响后续接口调用") + + logging.info("-----------------------------Test Start-------------------------------") + + def teardown_method(self): + logging.info("-----------------------------Test End-------------------------------") + + @allure.story("验证用户登录") + def test_joyhub_login_post(self): + """登录测试用例,验证登录接口是否正常(token已在setup_class中设置)""" + with allure.step("准备登录参数"): + username = "joytest" + password = "Zhou1599" + url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev" + payload = {"username": username, "password": password} + headers = {'Content-Type': 'application/json', 'tenant-id': '126'} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备登录请求,用户名: {}".format(username)) + + with allure.step("发送登录请求"): + response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10) + response_data = response.json() + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + logging.info("登录请求响应状态码: {}".format(response.status_code)) + + with allure.step("验证响应数据结构"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ") + + with allure.step("验证返回数据"): + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ") + + data = response_data.get('data', {}) + assert 'accessToken' in data, "响应数据中缺少accessToken字段" + logging.info("断言: data包含accessToken字段 ") + + assert 'userId' in data, "响应数据中缺少userId字段" + logging.info("断言: data包含userId字段 ") + + assert data.get('accessToken'), "accessToken不能为空" + logging.info("断言: accessToken不为空 ") + + logging.info("用户登录成功,userId: {}, token: {}...".format( + data.get('userId'), data.get('accessToken', '')[:20])) + + logging.info("注意: Token已在setup_class中统一设置,此用例仅验证登录功能") + + @allure.story("验证获得用户分页列表") + def test_joyhub_user_page_get(self): + with allure.step("准备查询参数"): + page_no = 1 + page_size = 10 + params = {"pageNo": page_no, "pageSize": page_size} + allure.attach(json.dumps(params, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("查询用户分页列表,pageNo: {}, pageSize: {}".format(page_no, page_size)) + + with allure.step("调用查询接口"): + response_data = self.test_case.kw_joyhub_user_page_get( + note="获得用户分页列表", + pageNo=page_no, + pageSize=page_size + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ✓") + + data = response_data.get('data', {}) + assert isinstance(data, dict), "data字段应为字典类型" + logging.info("断言: data字段为字典类型 ✓") + + if 'records' in data: + assert isinstance(data['records'], list), "records字段应为列表类型" + logging.info("断言: records字段为列表类型 ✓,记录数: {}".format(len(data['records']))) + + logging.info("✓ 用户分页列表查询成功") + + @allure.story("验证获取用户精简信息列表") + def test_joyhub_user_simple_list_get(self): + with allure.step("调用查询接口"): + response_data = self.test_case.kw_joyhub_user_simple_list_get( + note="获取用户精简信息列表" + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + logging.info("获取用户精简信息列表") + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert isinstance(response_data['data'], list), "data字段应为列表类型" + logging.info("断言: data字段为列表类型 ✓,记录数: {}".format(len(response_data['data']))) + + logging.info("✓ 用户精简信息列表查询成功") + + @allure.story("验证新增用户") + def test_joyhub_user_create_post(self): + import random + + with allure.step("准备新增用户参数"): + username = "testuser{}".format(random.randint(100000, 999999)) + nickname = "测试用户{}".format(random.randint(1000, 9999)) + password = "123456" + mobile = "138{}{}{}{}{}{}{}{}".format(random.randint(0,9), random.randint(0,9), random.randint(0,9), + random.randint(0,9), random.randint(0,9), random.randint(0,9), + random.randint(0,9), random.randint(0,9)) + payload = { + "username": username, + "nickname": nickname, + "password": password, + "email": "{}@test.com".format(username), + "mobile": mobile, + "sex": 1, + "remark": "测试用户" + } + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备新增用户: {}".format(username)) + + with allure.step("调用新增用户接口"): + response_data = self.test_case.kw_joyhub_user_create_post( + note="新增用户", + **payload + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ✓") + + logging.info("✓ 新增用户成功,用户ID: {}".format(response_data['data'])) + self.created_user_id = response_data['data'] + + @allure.story("验证获得用户详情") + def test_joyhub_user_get_get(self): + import random + + with allure.step("创建测试用户"): + username = "testuserget{}".format(random.randint(100000, 999999)) + nickname = "测试用户详情{}".format(random.randint(1000, 9999)) + create_resp = self.test_case.kw_joyhub_user_create_post( + note="创建测试用户", + username=username, + nickname=nickname, + password="123456" + ) + user_id = create_resp.get('data') + logging.info("创建测试用户成功,用户ID: {}".format(user_id)) + + with allure.step("调用查询用户详情接口"): + params = {"id": user_id} + allure.attach(json.dumps(params, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + response_data = self.test_case.kw_joyhub_user_get_get( + note="获得用户详情", + id=user_id + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + logging.info("断言: data字段不为空 ✓") + + data = response_data.get('data', {}) + assert 'id' in data, "用户详情中缺少id字段" + logging.info("断言: 用户详情包含id字段 ✓") + + assert data['id'] == user_id, "返回的用户ID与请求不一致" + logging.info("断言: 返回的用户ID与请求一致 ✓") + + assert 'username' in data, "用户详情中缺少username字段" + logging.info("断言: 用户详情包含username字段 ✓") + + assert data['username'] == username, "返回的用户名与创建时不一致" + logging.info("断言: 返回的用户名与创建时一致 ✓") + + logging.info("✓ 用户详情查询成功") + + @allure.story("验证修改用户") + def test_joyhub_user_update_put(self): + import random + + with allure.step("创建测试用户"): + username = "testuserupdate{}".format(random.randint(100000, 999999)) + nickname = "测试用户更新{}".format(random.randint(1000, 9999)) + create_resp = self.test_case.kw_joyhub_user_create_post( + note="创建测试用户", + username=username, + nickname=nickname, + password="123456" + ) + user_id = create_resp.get('data') + logging.info("创建测试用户成功,用户ID: {}".format(user_id)) + + with allure.step("准备修改参数"): + new_nickname = "修改后的昵称{}".format(random.randint(1000, 9999)) + payload = { + "id": user_id, + "username": username, + "nickname": new_nickname, + "remark": "修改后的备注" + } + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备修改用户,新昵称: {}".format(new_nickname)) + + with allure.step("调用修改用户接口"): + response_data = self.test_case.kw_joyhub_user_update_put( + note="修改用户", + **payload + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "用户修改失败" + logging.info("断言: 用户修改成功 ✓") + + logging.info("✓ 修改用户成功") + + @allure.story("验证重置用户密码") + def test_joyhub_user_update_password_put(self): + import random + + with allure.step("创建测试用户"): + username = "testuserpwd{}".format(random.randint(100000, 999999)) + create_resp = self.test_case.kw_joyhub_user_create_post( + note="创建测试用户", + username=username, + nickname="测试密码用户", + password="123456" + ) + user_id = create_resp.get('data') + logging.info("创建测试用户成功,用户ID: {}".format(user_id)) + + with allure.step("准备重置密码参数"): + payload = {"id": user_id, "password": "654321"} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备重置用户密码") + + with allure.step("调用重置密码接口"): + response_data = self.test_case.kw_joyhub_user_update_password_put( + note="重置用户密码", + **payload + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "密码重置失败" + logging.info("断言: 密码重置成功 ✓") + + logging.info("✓ 重置用户密码成功") + + @allure.story("验证修改用户状态") + def test_joyhub_user_update_status_put(self): + import random + + with allure.step("创建测试用户"): + username = "testuserstatus{}".format(random.randint(100000, 999999)) + create_resp = self.test_case.kw_joyhub_user_create_post( + note="创建测试用户", + username=username, + nickname="测试状态用户", + password="123456" + ) + user_id = create_resp.get('data') + logging.info("创建测试用户成功,用户ID: {}".format(user_id)) + + with allure.step("准备修改状态参数"): + payload = {"id": user_id, "status": 0} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备修改用户状态为: {}".format(0)) + + with allure.step("调用修改状态接口"): + response_data = self.test_case.kw_joyhub_user_update_status_put( + note="修改用户状态", + **payload + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "用户状态修改失败" + logging.info("断言: 用户状态修改成功 ✓") + + logging.info("✓ 修改用户状态成功") + + @allure.story("验证删除用户") + def test_joyhub_user_delete_post(self): + import random + + with allure.step("创建测试用户"): + username = "testuserdelete{}".format(random.randint(100000, 999999)) + create_resp = self.test_case.kw_joyhub_user_create_post( + note="创建测试用户", + username=username, + nickname="测试删除用户", + password="123456" + ) + user_id = create_resp.get('data') + logging.info("创建测试用户成功,用户ID: {}".format(user_id)) + + with allure.step("准备删除参数"): + payload = {"id": user_id} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备删除用户,用户ID: {}".format(user_id)) + + with allure.step("调用删除接口"): + response_data = self.test_case.kw_joyhub_user_delete_post( + note="删除用户", + id=user_id + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "用户删除失败" + logging.info("断言: 用户删除成功 ✓") + + logging.info("✓ 删除用户成功") + + @allure.story("验证批量删除用户") + def test_joyhub_user_delete_list_post(self): + import random + + with allure.step("创建测试用户"): + user_ids = [] + for i in range(2): + username = "testuserbatch{}{}".format(random.randint(100000, 999999), i) + create_resp = self.test_case.kw_joyhub_user_create_post( + note="创建测试用户{}".format(i), + username=username, + nickname="测试批量删除用户{}".format(i), + password="123456" + ) + user_ids.append(create_resp.get('data')) + logging.info("创建测试用户成功,用户ID列表: {}".format(user_ids)) + + with allure.step("准备批量删除参数"): + payload = {"ids": user_ids} + allure.attach(json.dumps(payload, ensure_ascii=False, indent=2), "请求参数", attachment_type=allure.attachment_type.JSON) + logging.info("准备批量删除用户") + + with allure.step("调用批量删除接口"): + response_data = self.test_case.kw_joyhub_user_delete_list_post( + note="批量删除用户", + ids=user_ids + ) + allure.attach(json.dumps(response_data, ensure_ascii=False, indent=2), "响应数据", attachment_type=allure.attachment_type.JSON) + + with allure.step("验证响应数据"): + assert response_data is not None, "响应数据不能为空" + logging.info("断言: 响应数据不为空 ✓") + + assert 'code' in response_data, "响应数据中缺少code字段" + logging.info("断言: 响应数据包含code字段 ✓") + + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + logging.info("断言: 接口调用成功,code=0 ✓") + + assert 'data' in response_data, "响应数据中缺少data字段" + logging.info("断言: 响应数据包含data字段 ✓") + + assert response_data['data'] is True, "批量删除失败" + logging.info("断言: 批量删除成功 ✓") + + logging.info("✓ 批量删除用户成功") diff --git a/dulizhan/test_case/TestCase/接口/JoyHub/__init__.py b/dulizhan/test_case/TestCase/接口/JoyHub/__init__.py new file mode 100644 index 0000000..3431531 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/JoyHub/__init__.py @@ -0,0 +1,7 @@ +# -*- coding:utf-8 -*- +""" +JoyHub接口测试用例模块 +""" +from .Joyhub_user import TestUserManage + +__all__ = ['TestUserManage'] diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/ContractManage.py b/dulizhan/test_case/TestCase/接口/SZPurchase/ContractManage.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py b/dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py new file mode 100644 index 0000000..ebe8fb4 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/SZPurchase/PurchaseOrderManage.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +import allure +import logging + +from zhyy.library.BusinessKw.SZPurchase.PurchaseOrderManage import PurchaseOrder + + +@allure.feature('深圳采购工作台采购订单页面') +class Test_purchase_order(object): + test_case = PurchaseOrder() + + def teardown_method(self): + logging.info("-----------------------------End-------------------------------") + + @allure.story("验证采购工作台采购订单页面列表查询") + def test_check_purchase_order_page(self): + purchase_order_code = 'PO251209048' # 采购单号 必填 + supplier_company_ids = ['334'] # 供应商id 非必填 + payment_status = '0' # 付款状态 非必填 + status = '0' # 采购单状态 非必填 + page_no = 1 # 页码 必填 + page_size = 10 # 每页条数 必填 + response_data = self.test_case.kw_zhyy_get_purchase_page_post( + note="采购工作台采购订单页面列表查询", + user='purchase', + order_sn=purchase_order_code, + supplier_company_ids=supplier_company_ids, + payment_status=payment_status, + status=status, + page_no=page_no, + page_size=page_size + ) + + # 断言检查 + assert response_data is not None, "响应数据不能为空" + assert 'code' in response_data, "响应数据中缺少code字段" + assert response_data['code'] == 0, "接口调用失败,code: {}, msg: {}".format( + response_data.get('code'), response_data.get('msg', '未知错误')) + assert 'data' in response_data, "响应数据中缺少data字段" + assert response_data['data'] is not None, "响应数据中的data字段不能为空" + + # 如果传入了采购单号,检查返回的数据中是否包含该采购单号 + if purchase_order_code: + data = response_data.get('data', {}) + order_found = False + + # 检查返回的数据结构,可能包含列表或其他结构 + if isinstance(data, dict): + # 如果data是字典,可能包含records、list、data等字段 + records = data.get('records') or data.get('list') or data.get('data') or [] + if isinstance(records, list) and len(records) > 0: + # 检查列表中是否包含指定的采购单号 + for item in records: + if isinstance(item, dict): + order_sn = item.get('order_sn') or item.get('orderSn') or item.get('orderSn') + if order_sn == purchase_order_code: + order_found = True + break + elif isinstance(data, list): + # 如果data本身就是列表 + for item in data: + if isinstance(item, dict): + order_sn = item.get('order_sn') or item.get('orderSn') or item.get('orderSn') + if order_sn == purchase_order_code: + order_found = True + break + + if order_found: + logging.info("✓ 断言通过:返回的数据中包含采购单号 {}".format(purchase_order_code)) + else: + logging.warning("⚠ 警告:返回的数据中未找到采购单号: {},但接口调用成功".format(purchase_order_code)) + + logging.info("✓ 所有断言检查通过") + print("✓ 查询成功,响应数据: {}".format(response_data)) \ No newline at end of file diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py b/dulizhan/test_case/TestCase/接口/SZPurchase/PurchasePlanManage.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/__init__.py b/dulizhan/test_case/TestCase/接口/SZPurchase/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/test_case/TestCase/接口/SZPurchase/index.py b/dulizhan/test_case/TestCase/接口/SZPurchase/index.py new file mode 100644 index 0000000..4db87c8 --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/SZPurchase/index.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +import allure +import logging + +from zhyy.library.BusinessKw.SZPurchase.index import PurchaseIndex + + +@allure.feature('深圳采购工作台首页') +class Test_purchase_index(object): + # config = ReadConfig.ReadConfig() # 调用读取配置文件的方法类 + test_case = PurchaseIndex() + + def teardown_method(self): + logging.info("-----------------------------End-------------------------------") + + @allure.story("验证采购工作台待办任务与在办任务功能") + def test_check_todo(self): + get_purchase_data = self.test_case.kw_zhyy_get_todo(note="采购工作台首页待办任务PO与在办任务PO", user='purchase') diff --git a/dulizhan/test_case/TestCase/接口/__init__.py b/dulizhan/test_case/TestCase/接口/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/test_case/TestCase/接口/conftest.py b/dulizhan/test_case/TestCase/接口/conftest.py new file mode 100644 index 0000000..889acff --- /dev/null +++ b/dulizhan/test_case/TestCase/接口/conftest.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" +测试配置文件 +用于设置测试环境的路径和配置 +""" +import os +import sys + +# 添加项目根目录到 Python 路径,确保能导入 zhyy 模块 +current_file_path = os.path.abspath(__file__) +# 从 test_case/TestCase/接口/conftest.py 向上找到项目根目录 d:\zhyy +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../../..')) +if project_root not in sys.path: + sys.path.insert(0, project_root) diff --git a/dulizhan/test_case/__init__.py b/dulizhan/test_case/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dulizhan/test_case/jenkins_build.bat b/dulizhan/test_case/jenkins_build.bat new file mode 100644 index 0000000..ca3212e --- /dev/null +++ b/dulizhan/test_case/jenkins_build.bat @@ -0,0 +1,44 @@ +@echo off +REM Jenkins构建脚本(Windows) +REM 用于在Jenkins中执行测试并生成Allure报告 + +setlocal enabledelayedexpansion + +REM 设置工作目录 +if defined WORKSPACE ( + cd /d %WORKSPACE% +) else ( + cd /d %~dp0.. +) + +REM 进入测试目录 +cd zhyy\test_case + +REM 运行测试(根据参数选择运行方式) +if "%RUN_TYPE%"=="" set RUN_TYPE=all + +if "%RUN_TYPE%"=="all" ( + python run_tests.py --all --no-report +) else if "%RUN_TYPE%"=="feature" ( + python run_tests.py --feature "%FEATURE_NAME%" --no-report +) else if "%RUN_TYPE%"=="story" ( + python run_tests.py --story "%STORY_NAME%" --no-report +) else if "%RUN_TYPE%"=="dir" ( + python run_tests.py --dir "%DIR_PATH%" --no-report +) else if "%RUN_TYPE%"=="file" ( + python run_tests.py --file "%FILE_PATH%" --no-report +) else if "%RUN_TYPE%"=="keyword" ( + python run_tests.py --keyword "%KEYWORD%" --no-report +) else if "%RUN_TYPE%"=="marker" ( + python run_tests.py --marker "%MARKER%" --no-report +) else ( + echo 未知的运行类型: %RUN_TYPE% + exit /b 1 +) + +REM 生成Allure报告(Jenkins插件会自动处理,这里可选) +REM allure generate reports\allure-results -o reports\allure-report --clean + +echo 测试执行完成,Allure结果已保存到: reports\allure-results + +endlocal diff --git a/dulizhan/test_case/jenkins_build.sh b/dulizhan/test_case/jenkins_build.sh new file mode 100644 index 0000000..cba769a --- /dev/null +++ b/dulizhan/test_case/jenkins_build.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Jenkins构建脚本(Linux/Mac) +# 用于在Jenkins中执行测试并生成Allure报告 + +set -e # 遇到错误立即退出 + +# 设置工作目录 +cd ${WORKSPACE:-$(pwd)} + +# 进入测试目录 +cd zhyy/test_case + +# 运行测试(根据参数选择运行方式) +RUN_TYPE=${RUN_TYPE:-all} + +case ${RUN_TYPE} in + all) + python run_tests.py --all --no-report + ;; + feature) + python run_tests.py --feature "${FEATURE_NAME}" --no-report + ;; + story) + python run_tests.py --story "${STORY_NAME}" --no-report + ;; + dir) + python run_tests.py --dir "${DIR_PATH}" --no-report + ;; + file) + python run_tests.py --file "${FILE_PATH}" --no-report + ;; + keyword) + python run_tests.py --keyword "${KEYWORD}" --no-report + ;; + marker) + python run_tests.py --marker "${MARKER}" --no-report + ;; + *) + echo "未知的运行类型: ${RUN_TYPE}" + exit 1 + ;; +esac + +# 生成Allure报告(Jenkins插件会自动处理,这里可选) +# allure generate reports/allure-results -o reports/allure-report --clean || true + +echo "测试执行完成,Allure结果已保存到: reports/allure-results" diff --git a/dulizhan/test_case/run_all.bat b/dulizhan/test_case/run_all.bat new file mode 100644 index 0000000..1fd734c --- /dev/null +++ b/dulizhan/test_case/run_all.bat @@ -0,0 +1,7 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo 运行所有测试用例 +echo ======================================== +python run_tests.py --all --report +pause diff --git a/dulizhan/test_case/run_purchase.bat b/dulizhan/test_case/run_purchase.bat new file mode 100644 index 0000000..cc8d6b0 --- /dev/null +++ b/dulizhan/test_case/run_purchase.bat @@ -0,0 +1,7 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo 运行采购相关测试用例 +echo ======================================== +python run_tests.py --dir "接口/SZPurchase" --report +pause diff --git a/dulizhan/test_case/run_tests.py b/dulizhan/test_case/run_tests.py new file mode 100644 index 0000000..d1e9a8d --- /dev/null +++ b/dulizhan/test_case/run_tests.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- +""" +统一测试执行文件 +支持批量运行所有用例、按标签运行、按目录运行等 +""" +import argparse +import os +import subprocess +import sys + +# 添加项目根目录到 Python 路径 +current_file_path = os.path.abspath(__file__) +project_root = os.path.abspath(os.path.join(os.path.dirname(current_file_path), '../../')) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +print(project_root) + +# 测试目录 - 已经包含了接口目录 +TEST_CASE_DIR = 'dulizhan/test_case/TestCase' +case_dir = os.path.join(project_root, TEST_CASE_DIR) + +# 报告目录 +REPORT_DIR = os.path.join(os.path.dirname(current_file_path), 'reports') +ALLURE_RESULTS_DIR = os.path.join(REPORT_DIR, 'allure-results') +ALLURE_REPORT_DIR = os.path.join(REPORT_DIR, 'allure-report') +ALLURE_PATH = os.path.join(project_root, 'allure', 'allure-2.28.0', 'bin', 'allure.bat') + +print(ALLURE_REPORT_DIR) + + +def ensure_dirs(): + """确保报告目录存在""" + os.makedirs(ALLURE_RESULTS_DIR, exist_ok=True) + os.makedirs(ALLURE_REPORT_DIR, exist_ok=True) + + +def run_pytest(args_list): + """执行pytest命令""" + # 设置PYTHONPATH环境变量 + env = os.environ.copy() + env['PYTHONPATH'] = project_root + (os.pathsep + env['PYTHONPATH'] if 'PYTHONPATH' in env else '') + + # 检测Jenkins环境 + is_jenkins = 'JENKINS_URL' in env or 'BUILD_NUMBER' in env + if is_jenkins and 'WORKSPACE' in env: + # Jenkins环境下使用绝对路径 + global ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR + ALLURE_RESULTS_DIR = os.path.join(env['WORKSPACE'], 'zhyy', 'test_case', 'reports', 'allure-results') + ALLURE_REPORT_DIR = os.path.join(env['WORKSPACE'], 'zhyy', 'test_case', 'reports', 'allure-report') + ensure_dirs() + + cmd = ['python', '-m', 'pytest'] + args_list + print("执行命令: {}".format(' '.join(cmd))) + + # 执行命令 + result = subprocess.run(' '.join(cmd), shell=True, cwd=project_root, env=env) + return result.returncode + + +def find_test_files(directory): + """递归查找所有测试文件""" + test_files = [] + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith('.py') and not file.startswith('__'): + test_files.append(os.path.join(root, file)) + return test_files + + +def run_tests(target, test_type='all', **kwargs): + """运行测试""" + base_args = ['-v', '--tb=short', '--alluredir={}'.format(ALLURE_RESULTS_DIR)] + + if test_type == 'all': + print("运行所有测试用例...") + test_files = find_test_files(case_dir) + if not test_files: + print("错误: 未找到测试文件") + return 1 + args = test_files + base_args + elif test_type == 'feature': + print("按feature标签运行: {}".format(target)) + test_files = find_test_files(case_dir) + if not test_files: + print("错误: 未找到测试文件") + return 1 + args = test_files + ['--allure-features={}'.format(target)] + base_args + elif test_type == 'story': + print("按story标签运行: {}".format(target)) + test_files = find_test_files(case_dir) + if not test_files: + print("错误: 未找到测试文件") + return 1 + args = test_files + ['--allure-stories={}'.format(target)] + base_args + elif test_type == 'marker': + print("按pytest标记运行: {}".format(target)) + test_files = find_test_files(case_dir) + if not test_files: + print("错误: 未找到测试文件") + return 1 + args = test_files + ['-m={}'.format(target)] + base_args + elif test_type == 'dir': + full_path = os.path.join(case_dir, target.replace('/', os.sep).replace('\\', os.sep)) + if not os.path.exists(full_path): + print("错误: 目录不存在: {}".format(full_path)) + return 1 + print("按目录运行: {}".format(target)) + test_files = find_test_files(full_path) + if not test_files: + print("错误: 未找到测试文件") + return 1 + args = test_files + base_args + elif test_type == 'file': + full_path = os.path.join(case_dir, target.replace('/', os.sep).replace('\\', os.sep)) + if not os.path.exists(full_path): + print("错误: 文件不存在: {}".format(full_path)) + return 1 + print("按文件运行: {}".format(target)) + args = [full_path] + base_args + elif test_type == 'keyword': + print("按关键字运行: {}".format(target)) + test_files = find_test_files(case_dir) + if not test_files: + print("错误: 未找到测试文件") + return 1 + args = test_files + ['-k={}'.format(target)] + base_args + else: + print("错误: 未知的测试类型: {}".format(test_type)) + return 1 + + return run_pytest(args) + + +def generate_allure_report(): + """生成allure报告""" + print("生成Allure报告...") + + if not os.path.exists(ALLURE_PATH): + print("警告: 未找到allure命令,请检查路径: {}".format(ALLURE_PATH)) + print("尝试使用系统环境变量中的allure...") + cmd = 'allure generate {} -o {} --clean'.format(ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR) + else: + cmd = '"{}" generate {} -o {} --clean'.format(ALLURE_PATH, ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR) + + print("执行命令: {}".format(cmd)) + + try: + subprocess.run(cmd, shell=True, check=True) + print("Allure报告生成成功: {}".format(ALLURE_REPORT_DIR)) + print("打开报告命令: allure open {}".format(ALLURE_REPORT_DIR)) + return 0 + except subprocess.CalledProcessError as e: + print("生成Allure报告失败: {}".format(e)) + return 1 + except FileNotFoundError: + print("警告: 未找到allure命令,请先安装allure") + return 1 + + +def open_allure_report(): + """打开allure报告""" + print("打开Allure报告...") + + if not os.path.exists(ALLURE_PATH): + cmd = 'allure open {}'.format(ALLURE_REPORT_DIR) + else: + cmd = '"{}" open {}'.format(ALLURE_PATH, ALLURE_REPORT_DIR) + + try: + subprocess.Popen(cmd, shell=True) + print("Allure报告已在浏览器中打开") + except FileNotFoundError: + print("警告: 未找到allure命令,请先安装allure") + + +def main(): + parser = argparse.ArgumentParser( + description='统一测试执行工具', + epilog=""" +使用示例: + # 运行所有测试 + python run_tests.py + + # 按feature标签运行 + python run_tests.py --feature "深圳采购工作台采购订单页面" + + # 按目录运行(相对于TestCase目录) + python run_tests.py --dir "接口/JoyHub" + + # 生成并打开报告 + python run_tests.py --report --open + """ + ) + + # 运行选项 + run_group = parser.add_mutually_exclusive_group(required=False) + run_group.add_argument('--feature', type=str, help='按allure feature标签运行') + run_group.add_argument('--story', type=str, help='按allure story标签运行') + run_group.add_argument('--dir', type=str, help='按目录运行(相对于TestCase目录)') + run_group.add_argument('--file', type=str, help='按文件运行(相对于TestCase目录)') + run_group.add_argument('--keyword', type=str, help='按关键字运行') + run_group.add_argument('--marker', type=str, help='按pytest标记运行') + + # 报告选项 + parser.add_argument('--report', action='store_true', help='生成Allure报告') + parser.add_argument('--open', action='store_true', help='打开Allure报告') + parser.add_argument('--no-report', action='store_true', help='不生成Allure报告') + + args = parser.parse_args() + + # 确保目录存在 + ensure_dirs() + + # 执行测试 + exit_code = 0 + if args.feature: + exit_code = run_tests(args.feature, 'feature') + elif args.story: + exit_code = run_tests(args.story, 'story') + elif args.dir: + exit_code = run_tests(args.dir, 'dir') + elif args.file: + exit_code = run_tests(args.file, 'file') + elif args.keyword: + exit_code = run_tests(args.keyword, 'keyword') + elif args.marker: + exit_code = run_tests(args.marker, 'marker') + else: + # 默认运行所有测试 + exit_code = run_tests(None, 'all') + + # 生成报告 + if args.report or (not args.no_report and exit_code == 0): + generate_allure_report() + if args.open: + open_allure_report() + + print("=" * 80) + if exit_code == 0: + print("测试执行完成") + else: + print("测试执行失败,退出码: {}".format(exit_code)) + print("=" * 80) + + sys.exit(exit_code) + + +if __name__ == '__main__': + main() diff --git a/extract_allure.py b/extract_allure.py new file mode 100644 index 0000000..67541f5 --- /dev/null +++ b/extract_allure.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +import zipfile +import os + +# 解压Allure压缩包 +zip_path = r'C:\Users\a\PyCharmMiscProject\smart-management-auto-test\allure.zip' +extract_path = r'C:\Users\a\PyCharmMiscProject\smart-management-auto-test\allure' + +try: + with zipfile.ZipFile(zip_path, 'r') as zip_ref: + zip_ref.extractall(extract_path) + print("Allure解压成功") +except Exception as e: + print(f"解压失败: {e}") \ No newline at end of file diff --git a/generate_allure_report.bat b/generate_allure_report.bat new file mode 100644 index 0000000..86622c2 --- /dev/null +++ b/generate_allure_report.bat @@ -0,0 +1,20 @@ +@echo off +chcp 65001 +echo ================================================ +echo JoyHub接口自动化测试报告生成器 +echo ================================================ +echo. + +:: 生成Allure报告 +echo [1/2] 正在生成Allure报告... +allure\allure-2.28.0\bin\allure.bat generate dulizhan\test_case\reports\allure-results -o dulizhan\test_case\reports\allure-report --clean + +if %errorlevel% equ 0 ( + echo ✓ 报告生成成功! + echo. + echo [2/2] 正在启动预览服务器... + allure\allure-2.28.0\bin\allure.bat open dulizhan\test_case\reports\allure-report -p 8080 +) else ( + echo ✗ 报告生成失败,请检查测试结果目录 + pause +) \ No newline at end of file diff --git a/generate_report.py b/generate_report.py new file mode 100644 index 0000000..bbce213 --- /dev/null +++ b/generate_report.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +import json +import os + +# 读取allure-results目录中的result.json文件 +results_dir = r'C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\reports\allure-results' +result_files = [f for f in os.listdir(results_dir) if f.endswith('-result.json')] + +test_results = [] +for result_file in result_files: + file_path = os.path.join(results_dir, result_file) + with open(file_path, 'r', encoding='utf-8') as f: + data = json.load(f) + test_results.append({ + 'name': data.get('name', 'Unknown'), + 'status': data.get('status', 'unknown'), + 'statusDetails': data.get('statusDetails', {}), + 'fullName': data.get('fullName', '') + }) + +# 统计结果 +passed = [r for r in test_results if r['status'] == 'passed'] +failed = [r for r in test_results if r['status'] == 'failed'] +broken = [r for r in test_results if r['status'] == 'broken'] + +# 生成HTML报告 +html_content = f""" + + + + + + JoyHub用户模块接口自动化测试报告 + + + +

+

JoyHub用户模块接口自动化测试报告

+ +
+
+
{len(test_results)}
+
总用例数
+
+
+
{len(passed)}
+
通过
+
+
+
{len(failed) + len(broken)}
+
失败
+
+
+ +
+

测试用例详情

+ {''.join([f''' +
+
{result['name']}
+
{result['status']}
+
+ ''' for result in test_results])} +
+ +
测试时间: {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
+
+ + +""" + +# 保存HTML报告 +report_path = r'C:\Users\a\PyCharmMiscProject\smart-management-auto-test\dulizhan\test_case\reports\test_report.html' +with open(report_path, 'w', encoding='utf-8') as f: + f.write(html_content) + +print(f"测试报告已生成: {report_path}") \ No newline at end of file