diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4522504137c7a321b6ede2383b2c04e8312599c9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.idea
+*.iml
+.DS_Store
+.project
+target
+*.pyc
+log
+.pyc
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/autotest-airtest-web-cmdc.iml b/.idea/autotest-airtest-web-cmdc.iml
new file mode 100644
index 0000000000000000000000000000000000000000..d0876a78d06ac03b5d78c8dcdb95570281c6f1d6
--- /dev/null
+++ b/.idea/autotest-airtest-web-cmdc.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f0ffb67318cd6143ca7250f2d54823060280723c
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7f44e8eb4363a25e3009df952212a46ee4f8e6f5
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6f13432a078912dacfe232dfa9eabf0471264f71
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/air_case/cmdc-qos/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\345\220\246.air/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\345\220\246.py" "b/air_case/cmdc-qos/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\345\220\246.air/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\345\220\246.py"
new file mode 100644
index 0000000000000000000000000000000000000000..5dbd7c3f2105310cd115687353b2f63668fc182d
--- /dev/null
+++ "b/air_case/cmdc-qos/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\345\220\246.air/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\345\220\246.py"
@@ -0,0 +1,38 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc站点不满足快速下单,2250,2250-3,sit,bs
+主数据平台:多彩商城快速下单权限判定接口
+"""
+
+from common.common_func import commonFuc
+import requests
+import json
+
+module = "cmdc-qos"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# url = "https://service-slb.cmic.com.cn/cms/public/isQuickOrderSign"
+# 获取公司ID
+companyId = commonFuc().get_business_data(module, "companyId2")
+print(companyId)
+request_body = commonFuc().get_business_data(module, "payload", companyId)
+print(request_body)
+"""
+ 场景:站点不具有快速下单权限入口
+ 用例名称:快速下单权限判定接口-站点不满足条件显示快速下单入口
+ 输入:companyId
+ 输出:"quickOrderSign": 0
+"""
+# 发送请求
+result = requests.get(url, params=request_body)
+result = json.loads(result.text)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
+
diff --git "a/air_case/cmdc-qos/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\350\203\275.air/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\350\203\275.py" "b/air_case/cmdc-qos/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\350\203\275.air/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\350\203\275.py"
new file mode 100644
index 0000000000000000000000000000000000000000..870612d1dc286094647586d9b68a7a1eb4d5810d
--- /dev/null
+++ "b/air_case/cmdc-qos/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\350\203\275.air/\345\277\253\351\200\237\344\270\213\345\215\225\346\235\203\351\231\220_\350\203\275.py"
@@ -0,0 +1,37 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc站点满足快速下单,2250,2250-3,sit,bs
+主数据平台:多彩商城快速下单权限判定接口
+"""
+
+from common.common_func import commonFuc
+import requests
+import json
+
+module = "cmdc-qos"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# url = "https://service-slb.cmic.com.cn/cms/public/isQuickOrderSign"
+# 获取公司ID
+companyId = commonFuc().get_business_data(module, "companyId1")
+print(companyId)
+request_body = commonFuc().get_business_data(module, "payload", companyId)
+print(request_body)
+"""
+ 场景:站点拥有快速下单权限入口
+ 用例名称:快速下单权限判定接口-站点满足条件显示快速下单入口
+ 输入:companyId
+ 输出:"quickOrderSign": 1
+"""
+# 发送请求
+result = requests.get(url, params=request_body)
+result = json.loads(result.text)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_buyercar_list/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\345\225\206\345\223\201\350\207\263\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.air/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\345\225\206\345\223\201\350\207\263\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.py" "b/air_case/cmdc_buyercar_list/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\345\225\206\345\223\201\350\207\263\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.air/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\345\225\206\345\223\201\350\207\263\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..0533001821f5db3ecf686e15ae05963b0491fa70
--- /dev/null
+++ "b/air_case/cmdc_buyercar_list/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\345\225\206\345\223\201\350\207\263\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.air/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\345\225\206\345\223\201\350\207\263\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.py"
@@ -0,0 +1,44 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc新增不存在的商品至购物车列表,2252,2252-3,sit,
+主数据平台:多彩商城购物车列表新增商品接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_buyercar_list"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers4", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload4")
+print(request_body)
+"""
+ 场景:新增不存在的商品至购物车列表
+ 用例名称:新增不存在的商品至购物车列表
+ 输出:{"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict4")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
+
diff --git "a/air_case/cmdc_buyercar_list/\350\216\267\345\217\226\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.air/\350\216\267\345\217\226\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.py" "b/air_case/cmdc_buyercar_list/\350\216\267\345\217\226\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.air/\350\216\267\345\217\226\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..10e9dac35a6f708bb0dc1742ab2812b718eef821
--- /dev/null
+++ "b/air_case/cmdc_buyercar_list/\350\216\267\345\217\226\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.air/\350\216\267\345\217\226\350\264\255\347\211\251\350\275\246\345\210\227\350\241\250.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc获取购物车列表,2252,2252-2,sit,bs
+主数据平台:多彩商城购物车列表接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_buyercar_list"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:获取到登录用户对应的购物车列表
+ 用例名称:获取购物车列表
+ 输出:{"success":true,"code":"200","message":"OK"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_buyercar_list/\350\264\255\347\211\251\350\275\246\345\225\206\345\223\201\347\247\273\351\231\244.air/\350\264\255\347\211\251\350\275\246\345\225\206\345\223\201\347\247\273\351\231\244.py" "b/air_case/cmdc_buyercar_list/\350\264\255\347\211\251\350\275\246\345\225\206\345\223\201\347\247\273\351\231\244.air/\350\264\255\347\211\251\350\275\246\345\225\206\345\223\201\347\247\273\351\231\244.py"
new file mode 100644
index 0000000000000000000000000000000000000000..ac12dcd04468f014a0d1808775169bfdca14ed7f
--- /dev/null
+++ "b/air_case/cmdc_buyercar_list/\350\264\255\347\211\251\350\275\246\345\225\206\345\223\201\347\247\273\351\231\244.air/\350\264\255\347\211\251\350\275\246\345\225\206\345\223\201\347\247\273\351\231\244.py"
@@ -0,0 +1,67 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc用户购物车商品移除,2252,2252-4,sit,bs
+主数据平台:多彩商城购物车列表商品删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+module = "cmdc_buyercar_list"
+
+# 第一步进行用户登录获取Cmdc_access_token
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers3", cmdc_access_token)
+print(headers)
+# 第二步在购物车中新增商品
+url1 = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url1)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+result = requests.post(url1, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 第三步查询购物车中新增的商品信息
+url2 = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url2)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+result = requests.post(url2, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取所添加商品id
+product_id = commonFuc().get_business_data(module, "payload2")["productId"]
+print(product_id, type(product_id))
+result_product_id = result["data"]["list"][0]["list"][0]["productId"]
+print(result_product_id, type(result_product_id))
+if result_product_id == product_id:
+ buyer_cart_id = result["data"]["list"][0]["list"][0]["buyerCartId"]
+ print(buyer_cart_id)
+ request_body = commonFuc().get_business_data(module, "payload3", buyer_cart_id)
+ print(request_body)
+ # 第三步删除新增加至购物车列表的商品
+ url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url3")
+ print(url)
+ """
+ 场景:从用户购物车列表移除商品
+ 用例名称:从用户购物车列表移除商品
+ 输出:{"success":true,"code":"200","message":"OK","data":"ok"}
+ """
+ # 发送请求
+ result = requests.post(url, json=request_body, headers=headers)
+ result = json.loads(result.content)
+ print(result)
+ # 获取预期结果
+ check_dict = commonFuc().get_business_data(module, "checkDict2")
+ print(check_dict)
+ # 断言实际结果中是否包含预期结果的内容
+ commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_buyercar_list/\350\264\255\347\211\251\350\275\246\346\226\260\345\242\236\345\225\206\345\223\201.air/\350\264\255\347\211\251\350\275\246\346\226\260\345\242\236\345\225\206\345\223\201.py" "b/air_case/cmdc_buyercar_list/\350\264\255\347\211\251\350\275\246\346\226\260\345\242\236\345\225\206\345\223\201.air/\350\264\255\347\211\251\350\275\246\346\226\260\345\242\236\345\225\206\345\223\201.py"
new file mode 100644
index 0000000000000000000000000000000000000000..91eec57a8f8aa7b822570875496a37366269b613
--- /dev/null
+++ "b/air_case/cmdc_buyercar_list/\350\264\255\347\211\251\350\275\246\346\226\260\345\242\236\345\225\206\345\223\201.air/\350\264\255\347\211\251\350\275\246\346\226\260\345\242\236\345\225\206\345\223\201.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc用户购物车新增商品,2252,2252-3,sit,
+主数据平台:多彩商城购物车列表新增商品接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_buyercar_list"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers2", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:添加商品至用户购物车列表
+ 用例名称:添加商品至用户购物车列表
+ 输出:{"success":true,"code":"200","message":"OK","data":"ok"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_audit/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\344\273\243\345\256\242\344\270\213\345\215\225.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\344\273\243\345\256\242\344\270\213\345\215\225.py" "b/air_case/cmdc_demand_audit/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\344\273\243\345\256\242\344\270\213\345\215\225.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\344\273\243\345\256\242\344\270\213\345\215\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..f4a402edf91dc16c0bf71515171e4786ffb584a4
--- /dev/null
+++ "b/air_case/cmdc_demand_audit/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\344\273\243\345\256\242\344\270\213\345\215\225.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\344\273\243\345\256\242\344\270\213\345\215\225.py"
@@ -0,0 +1,61 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单审核通过1,2250,2250-9,sit,bs
+主数据平台:运营后台管理系统需求单审核接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_audit"
+# 第一步登录后台管理系统
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers", cmdc_access_token)
+print(headers)
+# 第二步提交创建需求单(代客下单)
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 第三步在需求单列表查询到已创建的需求单
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 第四步审核刚刚创建的需求单
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url3")
+print(url)
+request_body = commonFuc().get_business_data(module, "payload3")
+print(request_body)
+"""
+ 场景:通过代客下单提交创建需求单,并完成审核
+ 用例名称:需求单审核通过
+ 输出:{"success":true,"code":"200","message":null,"data":[],"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_audit/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\345\277\253\351\200\237\344\270\213\345\215\225.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\345\277\253\351\200\237\344\270\213\345\215\225.py" "b/air_case/cmdc_demand_audit/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\345\277\253\351\200\237\344\270\213\345\215\225.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\345\277\253\351\200\237\344\270\213\345\215\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..0bddadc6270a6498d3146a9dc120fe1f64629104
--- /dev/null
+++ "b/air_case/cmdc_demand_audit/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\345\277\253\351\200\237\344\270\213\345\215\225.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\351\200\232\350\277\207_\345\277\253\351\200\237\344\270\213\345\215\225.py"
@@ -0,0 +1,74 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单审核通过,2252,2252-8,sit,bs
+主数据平台:多彩商城获取需求单审核接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+module = "cmdc_demand_audit"
+
+# 第一步登录多彩商城
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username1")
+password = commonFuc().get_business_data(module, "password1")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers1 = commonFuc().get_business_data(module, "json_headers1", cmdc_access_token)
+print(headers1)
+
+# 第二步创建并提交需求单
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url4")
+print(url)
+request_body = commonFuc().get_business_data(module, "payload4")
+print(request_body)
+result = requests.post(url, json=request_body, headers=headers1)
+result = json.loads(result.content)
+print(result)
+
+# 第三步登录后台管理系统
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers", cmdc_access_token)
+print(headers)
+
+# 第四步在需求单列表查询刚刚创建的需求单
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+
+# 第五步进行需求单审核处理
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url3")
+print(url)
+request_body = commonFuc().get_business_data(module, "payload3")
+print(request_body)
+"""
+ 场景:通过快速下单入口提交创建需求单,并进行审核通过操作
+ 用例名称:通过快速下单入口提交创建并审核需求单
+ 输出:{"success":true,"code":"200","message":"ok","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDic1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_create_pc/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.py" "b/air_case/cmdc_demand_create_pc/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.py"
new file mode 100644
index 0000000000000000000000000000000000000000..85e588096deb76639f9df926c1d98049012aa91f
--- /dev/null
+++ "b/air_case/cmdc_demand_create_pc/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.py"
@@ -0,0 +1,41 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单创建(快速下单),2252,2252-8,sit,bs
+主数据平台:多彩商城获取需求单创建接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+module = "cmdc_demand_create_pc"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload")
+print(request_body)
+"""
+ 场景:通过快速下单入口提交创建需求单
+ 用例名称:通过快速下单入口提交创建需求单
+ 输出:{"success":true,"code":"200","message":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_creation/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.py" "b/air_case/cmdc_demand_creation/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.py"
new file mode 100644
index 0000000000000000000000000000000000000000..080e6bced284081878b33a2559527ea32bdbe842
--- /dev/null
+++ "b/air_case/cmdc_demand_creation/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\345\215\225\345\210\233\345\273\272.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单创建(代客下单),2250,2250-9,sit,bs
+主数据平台:运营后台管理系统需求单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_creation"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:需求创建
+ 用例名称:需求单创建
+ 输出:{"success":true,"code":"200","message":"ok","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/cmdc_demand_creation/\351\234\200\346\261\202\350\215\211\347\250\277\350\256\242\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\350\215\211\347\250\277\350\256\242\345\215\225\345\210\233\345\273\272.py" "b/air_case/cmdc_demand_creation/\351\234\200\346\261\202\350\215\211\347\250\277\350\256\242\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\350\215\211\347\250\277\350\256\242\345\215\225\345\210\233\345\273\272.py"
new file mode 100644
index 0000000000000000000000000000000000000000..5d54b59158abb3eb540211997fb119f4e216b118
--- /dev/null
+++ "b/air_case/cmdc_demand_creation/\351\234\200\346\261\202\350\215\211\347\250\277\350\256\242\345\215\225\345\210\233\345\273\272.air/\351\234\200\346\261\202\350\215\211\347\250\277\350\256\242\345\215\225\345\210\233\345\273\272.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求草稿订单创建,2250,2250-8,sit,bs
+主数据平台:运营后台管理系统需求单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_creation"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:需求草稿订单的创建
+ 用例名称:需求草稿订单的创建
+ 输出:{"success":true,"code":"200","message":"ok","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/cmdc_demand_delete/\345\210\240\351\231\244\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\210\240\351\231\244\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.py" "b/air_case/cmdc_demand_delete/\345\210\240\351\231\244\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\210\240\351\231\244\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..b578ff50929382c4fe3da57de7b1bd997f7644cb
--- /dev/null
+++ "b/air_case/cmdc_demand_delete/\345\210\240\351\231\244\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\210\240\351\231\244\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc删除不存在的需求单,2250,2250-7,sit,bs
+主数据平台:运营后台管理系统需求单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_delete"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:删除不存在的需求单
+ 用例名称:删除不存在的需求单
+ 输出:{"success":false,"code":"demand","message":"审核拒绝没有找到子需求单","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict3")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_delete/\351\207\215\345\244\215\345\210\240\351\231\244\351\234\200\346\261\202\345\215\225.air/\351\207\215\345\244\215\345\210\240\351\231\244\351\234\200\346\261\202\345\215\225.py" "b/air_case/cmdc_demand_delete/\351\207\215\345\244\215\345\210\240\351\231\244\351\234\200\346\261\202\345\215\225.air/\351\207\215\345\244\215\345\210\240\351\231\244\351\234\200\346\261\202\345\215\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..054a267fd12a5ce538cceccdfa65793fbaeab97e
--- /dev/null
+++ "b/air_case/cmdc_demand_delete/\351\207\215\345\244\215\345\210\240\351\231\244\351\234\200\346\261\202\345\215\225.air/\351\207\215\345\244\215\345\210\240\351\231\244\351\234\200\346\261\202\345\215\225.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc重复删除需求单,2250,2250-7,sit,bs
+主数据平台:运营后台管理系统需求单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_delete"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload3")
+print(request_body)
+"""
+ 场景:重复删除需求单
+ 用例名称:重复删除需求单
+ 输出:{"success":false,"code":"demand","message":"订单已拒绝,无法重复拒绝","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict4")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_delete/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244.air/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244.py" "b/air_case/cmdc_demand_delete/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244.air/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244.py"
new file mode 100644
index 0000000000000000000000000000000000000000..8cfb8f44d628d0dbb8770e29931cdf07a75c13c9
--- /dev/null
+++ "b/air_case/cmdc_demand_delete/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244.air/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单删除,2250,2250-7,sit,bs
+主数据平台:运营后台管理系统需求单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_delete"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:需求删除
+ 用例名称:需求单删除
+ 输出:{"success":true,"code":"200","message":"OK","data":1,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_fail/\345\256\241\346\240\270\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\256\241\346\240\270\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.py" "b/air_case/cmdc_demand_fail/\345\256\241\346\240\270\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\256\241\346\240\270\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..355d4e493e56cb0928e3af3c1c3d92aee75583e8
--- /dev/null
+++ "b/air_case/cmdc_demand_fail/\345\256\241\346\240\270\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\256\241\346\240\270\344\270\215\345\255\230\345\234\250\347\232\204\351\234\200\346\261\202\345\215\225.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc审核不存在的需求单,2250,2250-6,sit,bs
+主数据平台:运营后台管理系统需求单审核拒绝接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_fail"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload3")
+print(request_body)
+"""
+ 场景:审核不存在的需求单
+ 用例名称:审核不存在的需求单
+ 输出:{"success":false,"code":"demand","message":"审核拒绝没有找到子需求单","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict3")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_fail/\345\256\241\346\240\270\345\205\266\344\273\226\347\212\266\346\200\201\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\256\241\346\240\270\345\205\266\344\273\226\347\212\266\346\200\201\347\232\204\351\234\200\346\261\202\345\215\225.py" "b/air_case/cmdc_demand_fail/\345\256\241\346\240\270\345\205\266\344\273\226\347\212\266\346\200\201\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\256\241\346\240\270\345\205\266\344\273\226\347\212\266\346\200\201\347\232\204\351\234\200\346\261\202\345\215\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..235f7c38beba2aac76929cacb82a2f2b30da6572
--- /dev/null
+++ "b/air_case/cmdc_demand_fail/\345\256\241\346\240\270\345\205\266\344\273\226\347\212\266\346\200\201\347\232\204\351\234\200\346\261\202\345\215\225.air/\345\256\241\346\240\270\345\205\266\344\273\226\347\212\266\346\200\201\347\232\204\351\234\200\346\261\202\345\215\225.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc审核其他状态的需求单,2250,2250-6,sit,bs
+主数据平台:运营后台管理系统需求单审核拒绝接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_fail"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload4")
+print(request_body)
+"""
+ 场景:审核其他状态下的需求单
+ 用例名称:审核其他状态下的需求单
+ 输出:{"success":true,"code":"200","message":"OK","data":1,"freshToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjIsInVzZXJOYW1lIjoiYWRtaW4yIiwidGltZSI6MTY5NDM5NDA0NjA3N30.JQgyXjLa5rH9XKIebln5rpPG4aasKNmVJbWA9UYu7PU"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict4")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_fail/\351\207\215\345\244\215\345\256\241\346\240\270.air/\351\207\215\345\244\215\345\256\241\346\240\270.py" "b/air_case/cmdc_demand_fail/\351\207\215\345\244\215\345\256\241\346\240\270.air/\351\207\215\345\244\215\345\256\241\346\240\270.py"
new file mode 100644
index 0000000000000000000000000000000000000000..7345a88588864304f0197861a8453d768d4f057a
--- /dev/null
+++ "b/air_case/cmdc_demand_fail/\351\207\215\345\244\215\345\256\241\346\240\270.air/\351\207\215\345\244\215\345\256\241\346\240\270.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc重复审核,2250,2250-6,sit,bs
+主数据平台:运营后台管理系统需求单审核拒绝接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_fail"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:重复审核同一个需求单
+ 用例名称:重复审核同一个需求单
+ 输出:{"success":false,"code":"demand","message":"订单已拒绝,无法重复拒绝","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/cmdc_demand_fail/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\344\270\215\351\200\232\350\277\207.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\344\270\215\351\200\232\350\277\207.py" "b/air_case/cmdc_demand_fail/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\344\270\215\351\200\232\350\277\207.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\344\270\215\351\200\232\350\277\207.py"
new file mode 100644
index 0000000000000000000000000000000000000000..524a12b21860b3429222be29bae9909de25b837d
--- /dev/null
+++ "b/air_case/cmdc_demand_fail/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\344\270\215\351\200\232\350\277\207.air/\351\234\200\346\261\202\345\215\225\345\256\241\346\240\270\344\270\215\351\200\232\350\277\207.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单审核不通过,2250,2250-6,sit,bs
+主数据平台:运营后台管理系统需求单审核拒绝接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_fail"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+# cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:需求单审核不通过
+ 用例名称:需求单审核不通过
+ 输出:{"success":true,"code":"200","message":"OK","data":1,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/cmdc_demand_list/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.py" "b/air_case/cmdc_demand_list/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..9f96e808bedd9b7af2e4204634679d855659c5b9
--- /dev/null
+++ "b/air_case/cmdc_demand_list/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc获取需求单列表,2250,2250-4,sit,bs
+主数据平台:运营后台管理系统需求单列表接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_list"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:传入正确参数,获取到需求列表
+ 用例名称:获取需求列表
+ 输出:{"success":true,"code":"200","message":"OK"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
+
diff --git "a/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244-\351\200\206\345\220\221.air/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244-\351\200\206\345\220\221.py" "b/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244-\351\200\206\345\220\221.air/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244-\351\200\206\345\220\221.py"
new file mode 100644
index 0000000000000000000000000000000000000000..b467abbfbf5eb2dbeb3e8bd2c4ec180e9a997c15
--- /dev/null
+++ "b/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244-\351\200\206\345\220\221.air/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244-\351\200\206\345\220\221.py"
@@ -0,0 +1,42 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单-草稿订单删除逆向用例功能验证,2250,2250-5,sit,bs
+主数据平台:运营后台管理系统需求单-草稿订单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_list"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers2", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload3")
+print(request_body)
+"""
+ 场景:不可重复删除已保存订单状态下需求单,以及其他状态的需求单
+ 用例名称:需求草稿订单删除逆向功能验证
+ 输出:{"success":true,"code":"200","message":"OK","data":null}
+"""
+# 发送请求
+result = requests.get(url, params=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict4")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244.air/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244.py" "b/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244.air/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244.py"
new file mode 100644
index 0000000000000000000000000000000000000000..d385070d52e82f3f3f556b33e19aa18e32f373aa
--- /dev/null
+++ "b/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244.air/\351\234\200\346\261\202\345\215\225-\350\215\211\347\250\277\350\256\242\345\215\225\345\210\240\351\231\244.py"
@@ -0,0 +1,42 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单-草稿订单删除功能验证,2250,2250-5,sit,bs
+主数据平台:运营后台管理系统需求单-草稿订单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_demand_list"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers2", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:需求草稿订单可正常删除,删除后不再显示在需求列表中
+ 用例名称:需求草稿订单删除功能验证
+ 输出:{"success":true,"code":"200","message":"OK","data":null}
+"""
+# 发送请求
+result = requests.get(url, params=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict3")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225_\350\216\267\345\217\226\347\224\250\346\210\267\344\277\241\346\201\257\345\244\261\350\264\245.air/\351\234\200\346\261\202\345\215\225_\350\216\267\345\217\226\347\224\250\346\210\267\344\277\241\346\201\257\345\244\261\350\264\245.py" "b/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225_\350\216\267\345\217\226\347\224\250\346\210\267\344\277\241\346\201\257\345\244\261\350\264\245.air/\351\234\200\346\261\202\345\215\225_\350\216\267\345\217\226\347\224\250\346\210\267\344\277\241\346\201\257\345\244\261\350\264\245.py"
new file mode 100644
index 0000000000000000000000000000000000000000..8cc6b8612acb20c4952a2fb04aaa80347335d520
--- /dev/null
+++ "b/air_case/cmdc_demand_list/\351\234\200\346\261\202\345\215\225_\350\216\267\345\217\226\347\224\250\346\210\267\344\277\241\346\201\257\345\244\261\350\264\245.air/\351\234\200\346\261\202\345\215\225_\350\216\267\345\217\226\347\224\250\346\210\267\344\277\241\346\201\257\345\244\261\350\264\245.py"
@@ -0,0 +1,36 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单获取失败,2250,2250-4,sit,bs
+主数据平台:运营后台管理系统需求单列表接口
+"""
+
+from common.common_func import commonFuc
+import requests
+import json
+
+
+module = "cmdc_demand_list"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+# url = "https://service-slb.cmic.com.cn/order/back/listDemand"
+print(url)
+headers = commonFuc().get_business_data(module, "json_headers")
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload")
+print(request_body)
+"""
+ 场景:用户信息过期或获取失败,无法访问需求列表
+ 用例名称:需求单-获取用户信息失败
+ 输出:{"code":"401","message":"Unauthorized","success":false}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/cmdc_demand_list_pc/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.py" "b/air_case/cmdc_demand_list_pc/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..d9a02a81d8d51356ccf7ca54a5b7a22174b8d699
--- /dev/null
+++ "b/air_case/cmdc_demand_list_pc/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\351\234\200\346\261\202\345\215\225\345\210\227\350\241\250.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc获取需求单列表,2252,2252-7,sit,bs
+主数据平台:多彩商城获取需求单列表接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_demand_list_pc"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:获取到登录用户对应的需求单列表
+ 用例名称:获取需求单列表
+ 输出:{"success":true,"code":"200","message":"OK"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_list_pc/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244\346\223\215\344\275\234.air/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244\346\223\215\344\275\234.py" "b/air_case/cmdc_demand_list_pc/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244\346\223\215\344\275\234.air/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244\346\223\215\344\275\234.py"
new file mode 100644
index 0000000000000000000000000000000000000000..dbd9d374238fae922a9759041d2a9cafef82a86e
--- /dev/null
+++ "b/air_case/cmdc_demand_list_pc/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244\346\223\215\344\275\234.air/\351\234\200\346\261\202\345\215\225\345\210\240\351\231\244\346\223\215\344\275\234.py"
@@ -0,0 +1,42 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求删除功能验证,2250,2250-5,sit,bs
+主数据平台:多彩商城需求单删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_demand_list_pc"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url3")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers3", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload3")
+print(request_body)
+"""
+ 场景:需求草稿订单可正常删除,删除后不再显示在需求列表中
+ 用例名称:需求草稿订单删除功能验证
+ 输出:{"success":true,"code":"200","message":"OK","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.get(url, params=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict3")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_demand_list_pc/\351\234\200\346\261\202\345\215\225\345\217\226\346\266\210\346\223\215\344\275\234.air/\351\234\200\346\261\202\345\215\225\345\217\226\346\266\210\346\223\215\344\275\234.py" "b/air_case/cmdc_demand_list_pc/\351\234\200\346\261\202\345\215\225\345\217\226\346\266\210\346\223\215\344\275\234.air/\351\234\200\346\261\202\345\215\225\345\217\226\346\266\210\346\223\215\344\275\234.py"
new file mode 100644
index 0000000000000000000000000000000000000000..d7405e2e1d91b50f8e965171c484af900a1a3535
--- /dev/null
+++ "b/air_case/cmdc_demand_list_pc/\351\234\200\346\261\202\345\215\225\345\217\226\346\266\210\346\223\215\344\275\234.air/\351\234\200\346\261\202\345\215\225\345\217\226\346\266\210\346\223\215\344\275\234.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc需求单列表商品取消操作,2252,2252-6,sit,bs
+主数据平台:多彩商城需求单列表取消商品接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_demand_list_pc"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers2",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:在用户对应的多彩商城中的需求单列表进行需求单取消操作验证
+ 用例名称:需求单取消操作
+ 输出:{"success":true,"code":"200","message":"OK","data":1,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_frequent_purchase/\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250\345\225\206\345\223\201\347\247\273\351\231\244.air/\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250\345\225\206\345\223\201\347\247\273\351\231\244.py" "b/air_case/cmdc_frequent_purchase/\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250\345\225\206\345\223\201\347\247\273\351\231\244.air/\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250\345\225\206\345\223\201\347\247\273\351\231\244.py"
new file mode 100644
index 0000000000000000000000000000000000000000..737d38cd63b795d4a0e0e75feebe78ca9bbe6c81
--- /dev/null
+++ "b/air_case/cmdc_frequent_purchase/\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250\345\225\206\345\223\201\347\247\273\351\231\244.air/\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250\345\225\206\345\223\201\347\247\273\351\231\244.py"
@@ -0,0 +1,67 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc常购清单列表商品移除,2252,2252-7,sit,bs
+主数据平台:多彩商城常购清单列表商品删除接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+module = "cmdc_frequent_purchase"
+
+# 第一步进行用户登录获取Cmdc_access_token
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers3", cmdc_access_token)
+print(headers)
+# 第二步在购物车中新增商品
+url1 = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url1)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+result = requests.post(url1, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 第三步查询购物车中新增的商品信息
+url2 = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url2)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+result = requests.post(url2, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取所添加商品id
+product_id = int(commonFuc().get_business_data(module, "payload1")["productId"])
+print(product_id, type(product_id))
+result_product_id = result["data"]["list"][0]["list"][0]["productId"]
+print(result_product_id, type(result_product_id))
+if result_product_id == product_id:
+ frequent_purchase_id = result["data"]["list"][0]["list"][0]["frequentPurchaseId"]
+ print(frequent_purchase_id)
+ request_body = commonFuc().get_business_data(module, "payload3", frequent_purchase_id)
+ print(request_body)
+ # 第三步删除新增加至购物车列表的商品
+ url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url3")
+ print(url)
+ """
+ 场景:从用户购物车列表移除商品
+ 用例名称:从用户购物车列表移除商品
+ 输出:{"success":true,"code":"200","message":"OK","data":"ok"}
+ """
+ # 发送请求
+ result = requests.post(url, json=request_body, headers=headers)
+ result = json.loads(result.content)
+ print(result)
+ # 获取预期结果
+ check_dict = commonFuc().get_business_data(module, "checkDict3")
+ print(check_dict)
+ # 断言实际结果中是否包含预期结果的内容
+ commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_frequent_purchase/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\347\232\204\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\347\232\204\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py" "b/air_case/cmdc_frequent_purchase/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\347\232\204\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\347\232\204\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..973b3ebc2e194c3b542fa364a3158e893457a908
--- /dev/null
+++ "b/air_case/cmdc_frequent_purchase/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\347\232\204\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\346\226\260\345\242\236\344\270\215\345\255\230\345\234\250\347\232\204\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc新增不存在的商品至常购清单列表,2252,2252-5,sit,bs
+主数据平台:多彩商城常购清单列表新增商品接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_frequent_purchase"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers4", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload4")
+print(request_body)
+"""
+ 场景:新增不存在的商品至常购清单列表
+ 用例名称:新增不存在的商品至常购清单列表
+ 输出:{"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict4")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_frequent_purchase/\346\226\260\345\242\236\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\346\226\260\345\242\236\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py" "b/air_case/cmdc_frequent_purchase/\346\226\260\345\242\236\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\346\226\260\345\242\236\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..01ff45b2da56f32c3e456cee81478ce9025479b8
--- /dev/null
+++ "b/air_case/cmdc_frequent_purchase/\346\226\260\345\242\236\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\346\226\260\345\242\236\345\225\206\345\223\201\350\207\263\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc新增商品至常购清单列表,2252,2252-5,sit,bs
+主数据平台:多彩商城常购清单列表新增商品接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_frequent_purchase"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url1")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1", cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:新增商品至常购清单列表
+ 用例名称:新增商品至常购清单列表
+ 输出:{"success":true,"code":"200","message":"OK","data":"ok"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict1")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_frequent_purchase/\350\216\267\345\217\226\347\224\250\346\210\267\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\347\224\250\346\210\267\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py" "b/air_case/cmdc_frequent_purchase/\350\216\267\345\217\226\347\224\250\346\210\267\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\347\224\250\346\210\267\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py"
new file mode 100644
index 0000000000000000000000000000000000000000..9aca0200d930aa52aa86b206efc6dfc12db07652
--- /dev/null
+++ "b/air_case/cmdc_frequent_purchase/\350\216\267\345\217\226\347\224\250\346\210\267\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.air/\350\216\267\345\217\226\347\224\250\346\210\267\345\270\270\350\264\255\346\270\205\345\215\225\345\210\227\350\241\250.py"
@@ -0,0 +1,43 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc获取用户常购清单列表,2252,2252-6,sit,bs
+主数据平台:多彩商城常购清单列表接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.多彩商城登录.多彩商城登录 import CmdcMaiiLogin
+import requests
+import json
+
+
+module = "cmdc_frequent_purchase"
+
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url2")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcMaiiLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload2")
+print(request_body)
+"""
+ 场景:获取用户常购清单列表
+ 用例名称:获取用户常购清单列表
+ 输出:{"success":true,"code":"200","message":"OK","data":"ok"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_login/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.air/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.py" "b/air_case/cmdc_login/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.air/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..1fefb6fb7efd5b3f1e66c666599148abfa1ff717
--- /dev/null
+++ "b/air_case/cmdc_login/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.air/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.py"
@@ -0,0 +1,64 @@
+# -*- encoding=utf8 -*-
+
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc-dologin,多彩商城登录,sit,bs
+"""
+from common.common_func import commonFuc
+import requests
+import uuid
+from common.verification_code_ocr import VerificationCodeOcr
+import json
+import os
+
+
+module = "cmdc_login"
+
+
+class CmdcDoLogin():
+
+ """国药运营后台管理系统登录"""
+
+ def __init__(self, username, password):
+ self.username = username
+ self.password = password
+
+ def get_token(self):
+ # 获取唯一识别码
+ uuid_handle = uuid.uuid4()
+ # 获取验证码报文
+ param = {"uuid": uuid_handle}
+ # 获取多彩商城登录页面获取验证码地址
+ code_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "getVerifyCode_url")
+ # code_url = "https://service-slb.cmic.com.cn/sso/getVerifyCode"
+ # 发送请求获取验证码
+ result = requests.get(code_url, params=param)
+ # print(result.content)
+ with open("verifycode.png", 'wb') as f:
+ f.write(result.content)
+ # 获取当前文件路径
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ code_path = BASE_DIR + "/多彩商城登录.air/verifycode.png"
+ # 识别并获取验证码
+ code = VerificationCodeOcr(code_path, "rainbow123","rainbow123").base64_api()
+ # 获取多彩商城登录地址
+ cmdc_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "do_login_url")
+ # cmdc_url = "https://service-slb.cmic.com.cn/sso/mallLogin"
+ # 组装请求报文
+ request_body = {"userName": self.username, "password": self.password, "validateCode": code, "uuid": uuid_handle}
+ print(request_body)
+ # 发送请求
+ result = requests.post(cmdc_url, params=request_body)
+ # 获取预期结果
+ # check_dict = commonFuc().get_business_data(module, "checkDict")
+ # print(check_dict)
+ # # 断言实际结果中是否包含预期结果的内容
+ # commonFuc().check_result(check_dict, result)
+ result = json.loads(result.content)
+ token = commonFuc().analysis_json('accessToken', result)
+ return token
+
+
+if __name__ == "__main__":
+ print(CmdcDoLogin("Test001", "Aa123456").get_token())
diff --git "a/air_case/cmdc_login/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.py" "b/air_case/cmdc_login/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..94d33efe83ff3fdf23bb19a6c050596bf44ff0b6
--- /dev/null
+++ "b/air_case/cmdc_login/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225/\345\220\216\345\217\260\347\256\241\347\220\206\347\263\273\347\273\237\347\231\273\345\275\225.py"
@@ -0,0 +1,72 @@
+# -*- encoding=utf8 -*-
+
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc-dologin,多彩商城登录,sit,bs
+"""
+from common.common_func import commonFuc
+import requests
+import uuid
+from common.verification_code_ocr import VerificationCodeOcr
+import json
+import os
+import hashlib
+
+
+module = "cmdc_login"
+
+
+class CmdcDoLogin():
+
+ """国药运营后台管理系统登录"""
+
+ def __init__(self, username, password):
+ self.username = username
+ self.password = password
+
+ def get_token(self):
+ # 获取唯一识别码
+ uuid_handle = uuid.uuid4()
+ # 获取验证码报文
+ param = {"uuid": uuid_handle}
+ # 获取多彩商城登录页面获取验证码地址
+ code_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "getVerifyCode_url")
+ # code_url = "https://service-slb.cmic.com.cn/sso/getVerifyCode"
+ # 发送请求获取验证码
+ result = requests.get(code_url, params=param)
+ # print(result.content)
+ # 获取当前文件路径
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ code_path = BASE_DIR + "/后台管理系统登录/verifycode.png"
+ # 获取到验证码存入本地文件
+ with open(code_path, 'wb') as f:
+ f.write(result.content)
+ # 识别并获取验证码
+ code = VerificationCodeOcr(code_path, "rainbow123","rainbow123").base64_api()
+ # 获取多彩商城登录地址
+ cmdc_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "do_login_url")
+ # cmdc_url = "https://service-slb.cmic.com.cn/sso/doLogin"
+ md = hashlib.md5(self.password.encode()) # 创建md5对象
+ EncryptPassword = md.hexdigest() # 登录密码进行md5加密
+ print('加密后的密码', EncryptPassword) # 加密后的密码
+ # 组装请求报文
+ request_body = {"userName": self.username, "password": EncryptPassword, "validateCode": code, "uuid": uuid_handle}
+ print(request_body)
+ # 发送请求
+ result = requests.post(cmdc_url, params=request_body)
+ # 获取预期结果
+ # check_dict = commonFuc().get_business_data(module, "checkDict")
+ # print(check_dict)
+ # # 断言实际结果中是否包含预期结果的内容
+ # commonFuc().check_result(check_dict, result)
+ result = json.loads(result.content)
+ print(result)
+ access_token = commonFuc().analysis_json('accessToken', result)
+ return access_token
+
+
+if __name__ == "__main__":
+ cmdc_access_token = CmdcDoLogin("admin2", "FFtmods@365y").get_token()
+ print(cmdc_access_token)
+
diff --git "a/air_case/cmdc_login/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.air/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.py" "b/air_case/cmdc_login/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.air/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..cf0f490f88f3e3b29cd8b0e0bf0f35ac59baffee
--- /dev/null
+++ "b/air_case/cmdc_login/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.air/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.py"
@@ -0,0 +1,64 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc-maiilogin,多彩商城登录,sit,bs
+"""
+from common.common_func import commonFuc
+import requests
+import uuid
+from common.verification_code_ocr import VerificationCodeOcr
+import json
+import os
+
+
+module = "cmdc_login"
+
+
+class CmdcMaiiLogin():
+
+ """多彩商城登录"""
+
+ def __init__(self, username, password):
+ self.username = username
+ self.password = password
+
+ def get_token(self):
+ # 获取唯一识别码
+ uuid_handle = uuid.uuid4()
+ # 获取验证码报文
+ param = {"uuid": uuid_handle}
+ # 获取多彩商城登录页面获取验证码地址
+ code_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "getVerifyCode_url")
+ # code_url = "https://service-slb.cmic.com.cn/sso/getVerifyCode"
+ # 发送请求获取验证码
+ result = requests.get(code_url, params=param)
+ # print(result.content)
+ # 获取当前文件路径
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ code_path = BASE_DIR + "/多彩商城登录/verifycode.png"
+ # 获取到验证码存入本地文件
+ with open(code_path, 'wb') as f:
+ f.write(result.content)
+ # 识别并获取验证码
+ code = VerificationCodeOcr(code_path, "rainbow123", "rainbow123").base64_api()
+ # 获取多彩商城登录地址
+ cmdc_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "maii_login_url")
+ # cmdc_url = "https://service-slb.cmic.com.cn/sso/mallLogin"
+ # 组装请求报文
+ request_body = {"userName": self.username,"password": self.password,"validateCode": code,"uuid": uuid_handle}
+ print(request_body)
+ # 发送请求
+ result = requests.post(cmdc_url, params=request_body)
+ # 获取预期结果
+ # check_dict = commonFuc().get_business_data(module, "checkDict")
+ # print(check_dict)
+ # # 断言实际结果中是否包含预期结果的内容
+ # commonFuc().check_result(check_dict, result)
+ result = json.loads(result.content)
+ token = commonFuc().analysis_json('accessToken', result)
+ return token
+
+
+if __name__ == "__main__":
+ print(CmdcMaiiLogin("Test001", "Aa123456").get_token())
diff --git "a/air_case/cmdc_login/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.py" "b/air_case/cmdc_login/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.py"
new file mode 100644
index 0000000000000000000000000000000000000000..cf0f490f88f3e3b29cd8b0e0bf0f35ac59baffee
--- /dev/null
+++ "b/air_case/cmdc_login/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225/\345\244\232\345\275\251\345\225\206\345\237\216\347\231\273\345\275\225.py"
@@ -0,0 +1,64 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc-maiilogin,多彩商城登录,sit,bs
+"""
+from common.common_func import commonFuc
+import requests
+import uuid
+from common.verification_code_ocr import VerificationCodeOcr
+import json
+import os
+
+
+module = "cmdc_login"
+
+
+class CmdcMaiiLogin():
+
+ """多彩商城登录"""
+
+ def __init__(self, username, password):
+ self.username = username
+ self.password = password
+
+ def get_token(self):
+ # 获取唯一识别码
+ uuid_handle = uuid.uuid4()
+ # 获取验证码报文
+ param = {"uuid": uuid_handle}
+ # 获取多彩商城登录页面获取验证码地址
+ code_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "getVerifyCode_url")
+ # code_url = "https://service-slb.cmic.com.cn/sso/getVerifyCode"
+ # 发送请求获取验证码
+ result = requests.get(code_url, params=param)
+ # print(result.content)
+ # 获取当前文件路径
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ code_path = BASE_DIR + "/多彩商城登录/verifycode.png"
+ # 获取到验证码存入本地文件
+ with open(code_path, 'wb') as f:
+ f.write(result.content)
+ # 识别并获取验证码
+ code = VerificationCodeOcr(code_path, "rainbow123", "rainbow123").base64_api()
+ # 获取多彩商城登录地址
+ cmdc_url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "maii_login_url")
+ # cmdc_url = "https://service-slb.cmic.com.cn/sso/mallLogin"
+ # 组装请求报文
+ request_body = {"userName": self.username,"password": self.password,"validateCode": code,"uuid": uuid_handle}
+ print(request_body)
+ # 发送请求
+ result = requests.post(cmdc_url, params=request_body)
+ # 获取预期结果
+ # check_dict = commonFuc().get_business_data(module, "checkDict")
+ # print(check_dict)
+ # # 断言实际结果中是否包含预期结果的内容
+ # commonFuc().check_result(check_dict, result)
+ result = json.loads(result.content)
+ token = commonFuc().analysis_json('accessToken', result)
+ return token
+
+
+if __name__ == "__main__":
+ print(CmdcMaiiLogin("Test001", "Aa123456").get_token())
diff --git "a/air_case/cmdc_purchase_list/\351\207\207\350\264\255\345\215\225\346\237\245\350\257\242.air/\351\207\207\350\264\255\345\215\225\346\237\245\350\257\242.py" "b/air_case/cmdc_purchase_list/\351\207\207\350\264\255\345\215\225\346\237\245\350\257\242.air/\351\207\207\350\264\255\345\215\225\346\237\245\350\257\242.py"
new file mode 100644
index 0000000000000000000000000000000000000000..6c48b07fcfdfb1c33d7cbc5068aa3512b5b45da7
--- /dev/null
+++ "b/air_case/cmdc_purchase_list/\351\207\207\350\264\255\345\215\225\346\237\245\350\257\242.air/\351\207\207\350\264\255\345\215\225\346\237\245\350\257\242.py"
@@ -0,0 +1,42 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc采购单查询,2250,2250-1,sit,bs
+主数据平台:运营后台管理系统采购单查询接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_purchase_list"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:传入正确参数,获取到采购单列表
+ 用例名称:获取采购单列表
+ 输出:{"success":true,"code":"200","message":null}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git "a/air_case/cmdc_query_customer/\345\256\242\346\210\267\346\237\245\350\257\242.air/\345\256\242\346\210\267\346\237\245\350\257\242.py" "b/air_case/cmdc_query_customer/\345\256\242\346\210\267\346\237\245\350\257\242.air/\345\256\242\346\210\267\346\237\245\350\257\242.py"
new file mode 100644
index 0000000000000000000000000000000000000000..a4d58f3f0284a11be0972ac23602215ae2785ff9
--- /dev/null
+++ "b/air_case/cmdc_query_customer/\345\256\242\346\210\267\346\237\245\350\257\242.air/\345\256\242\346\210\267\346\237\245\350\257\242.py"
@@ -0,0 +1,42 @@
+# -*- encoding=utf8 -*-
+__author__ = "liguangyu"
+
+"""
+case_tag:api,cmdc客户查询,2250,2250-2,sit,bs
+主数据平台:运营后台管理系统客户接口
+"""
+
+from common.common_func import commonFuc
+from air_case.cmdc_login.后台管理系统登录.后台管理系统登录 import CmdcDoLogin
+import requests
+import json
+
+
+module = "cmdc_query_customer"
+
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "url")
+print(url)
+# 获取登录所需账号密码
+username = commonFuc().get_business_data(module, "username")
+password = commonFuc().get_business_data(module, "password")
+# 获取登录后Cmdc_access_token
+cmdc_access_token = CmdcDoLogin(username, password).get_token()
+print(cmdc_access_token)
+headers = commonFuc().get_business_data(module, "json_headers1",cmdc_access_token)
+print(headers)
+request_body = commonFuc().get_business_data(module, "payload1")
+print(request_body)
+"""
+ 场景:传入正确参数,获取到客户列表
+ 用例名称:获取客户列表
+ 输出:{"success":true,"code":"200","message":"OK"}
+"""
+# 发送请求
+result = requests.post(url, json=request_body, headers=headers)
+result = json.loads(result.content)
+print(result)
+# 获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict2")
+print(check_dict)
+# 断言实际结果中是否包含预期结果的内容
+commonFuc().check_result(check_dict, result)
diff --git a/air_case/demo-ui/demo-spd3-login.air/demo-spd3-login.py b/air_case/demo-ui/demo-spd3-login.air/demo-spd3-login.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c161dfa7a3ac8757a3d9aa9c4b52d16185333dd
--- /dev/null
+++ b/air_case/demo-ui/demo-spd3-login.air/demo-spd3-login.py
@@ -0,0 +1,33 @@
+# -*- encoding=utf8 -*-
+__author__ = "xiaohesheng"
+
+"""
+case_tag:spd3-web,10087
+spd登录的ui自动化例子1
+"""
+
+
+from common.common_func import commonFuc
+from airtest.core.api import *
+from airtest_selenium.proxy import *
+module = "demo-ui"
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "spd3_login_url")
+print(url)
+chrome=WebChrome()
+chrome=commonFuc().openBrowser(url,chrome)
+chrome.maximize_window()
+chrome.implicitly_wait(20)
+username=commonFuc().get_business_data(module, "username")
+password=commonFuc().get_business_data(module, "password")
+login_button=commonFuc().get_business_data(module, "login_button")
+print(username,password)
+commonFuc().logIn(username,password,login_button,chrome)
+name1=commonFuc().get_business_data(module,"name1")
+print(name1)
+result=commonFuc().check_login_result(name1,chrome)
+print(result)
+#断言实际结果中是否包含预期的文本
+commonFuc().check_text_exist_result_text(name1,result)
+chrome.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100)))
+commonFuc().quit_chrome(chrome)
+
diff --git a/air_case/demo-ui/demo-spd3-login.air/tpl1691374901526.png b/air_case/demo-ui/demo-spd3-login.air/tpl1691374901526.png
new file mode 100644
index 0000000000000000000000000000000000000000..c871b9ca684aae23d61a24ae9fa65ad87e9467a7
Binary files /dev/null and b/air_case/demo-ui/demo-spd3-login.air/tpl1691374901526.png differ
diff --git a/air_case/demo/baidu.air/baidu.py b/air_case/demo/baidu.air/baidu.py
new file mode 100644
index 0000000000000000000000000000000000000000..e40475a493b4d65dc2cfa4ab9f376de6e77b30b6
--- /dev/null
+++ b/air_case/demo/baidu.air/baidu.py
@@ -0,0 +1,29 @@
+# -*- encoding=utf8 -*-
+__author__ = "Administrator"
+
+
+"""
+case_tag:api,baidu,sit,on
+"""
+from airtest.core.api import *
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+from airtest_selenium.proxy import *
+driver = WebChrome()
+driver.implicitly_wait(20)
+driver.get("https://www.baidu.com")
+sleep(4)
+driver.find_element_by_id("kw").send_keys("airtest")
+sleep(4)
+
+driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100)))
+
+
+
+
+
+
+
+
+
+
diff --git a/air_case/demo/baidu.air/tpl1691374901523.png b/air_case/demo/baidu.air/tpl1691374901523.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ffd5af4c861fc8bbfb9766c4a5bd9819f2494b2
Binary files /dev/null and b/air_case/demo/baidu.air/tpl1691374901523.png differ
diff --git a/air_case/demo/baidu.air/tpl1691374901526.png b/air_case/demo/baidu.air/tpl1691374901526.png
new file mode 100644
index 0000000000000000000000000000000000000000..934889ce7271e6c611d50aa16fede484a7485b7c
Binary files /dev/null and b/air_case/demo/baidu.air/tpl1691374901526.png differ
diff --git a/air_case/demo/baidu.air/tpl1691375285206.png b/air_case/demo/baidu.air/tpl1691375285206.png
new file mode 100644
index 0000000000000000000000000000000000000000..7970a269177baa880b83a462fad289d9db62d2a7
Binary files /dev/null and b/air_case/demo/baidu.air/tpl1691375285206.png differ
diff --git a/air_case/demo/httpget-demo.air/httpget-demo.py b/air_case/demo/httpget-demo.air/httpget-demo.py
new file mode 100644
index 0000000000000000000000000000000000000000..274c8a0457dbcfc279f73bd05d672ded7ecfed8f
--- /dev/null
+++ b/air_case/demo/httpget-demo.air/httpget-demo.py
@@ -0,0 +1,55 @@
+# -*- encoding=utf8 -*-
+from common.common_func import commonFuc
+
+__author__ = "meimengting"
+
+"""
+case_tag:api,medical-web,sit,on
+"""
+
+from airtest.core.api import *
+import sys
+sys.path.append('..')
+from common.db.db import dbOP
+import time
+# using("common_steps.air")
+# import common_steps
+# result_db = dbOP().selectSql('exp_expert', [0, 20])
+
+"""
+enc_user_id可替换成接口实际所需要id,默认是u779700044448
+获取token和时间戳
+"""
+enc_user_id = 'u97969333801'
+# token = common_steps.check_token(enc_user_id)
+timestamp = str(int(time.time()))
+
+# "按照环境将url管理起来,更改api url后的接口名即可"
+# url = common_steps.get_api_url()
+# url = url + "/newapi/router/medical/expert/info"
+
+"""
+querystring: 业务参数
+headers: header参数
+"""
+# exId = result_db[0][0]
+# exName = result_db[0][1]
+# querystring = {"expertIds": exId}
+# headers = {
+# 'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}',
+# 'platform': "1",
+# 'signature': "144c6b3c78fc20ad57da1ebdb879615b",
+# 'token': token,
+# 'timestamp': timestamp,
+# }
+
+"""
+get方法
+"""
+# result = common_steps.get(url, headers, querystring)
+
+"""
+出参校验
+"""
+# check_dict = {"rtn_code": 0, "rtn_msg": "请求成功", "expertName": str(exName)}
+# commonFuc().check_result(check_dict, result)
\ No newline at end of file
diff --git "a/air_case/mdm3_es/\347\273\217\351\224\200\345\225\206_\344\274\201\344\270\232\346\263\250\345\206\214\346\217\220\344\272\244_\346\255\243\345\270\270\346\263\250\345\206\214.air/\347\273\217\351\224\200\345\225\206_\344\274\201\344\270\232\346\263\250\345\206\214\346\217\220\344\272\244_\346\255\243\345\270\270\346\263\250\345\206\214.py" "b/air_case/mdm3_es/\347\273\217\351\224\200\345\225\206_\344\274\201\344\270\232\346\263\250\345\206\214\346\217\220\344\272\244_\346\255\243\345\270\270\346\263\250\345\206\214.air/\347\273\217\351\224\200\345\225\206_\344\274\201\344\270\232\346\263\250\345\206\214\346\217\220\344\272\244_\346\255\243\345\270\270\346\263\250\345\206\214.py"
new file mode 100644
index 0000000000000000000000000000000000000000..3fcaecafae4d6c8d660aaf118fdcaf0ae4e3ee91
--- /dev/null
+++ "b/air_case/mdm3_es/\347\273\217\351\224\200\345\225\206_\344\274\201\344\270\232\346\263\250\345\206\214\346\217\220\344\272\244_\346\255\243\345\270\270\346\263\250\345\206\214.air/\347\273\217\351\224\200\345\225\206_\344\274\201\344\270\232\346\263\250\345\206\214\346\217\220\344\272\244_\346\255\243\345\270\270\346\263\250\345\206\214.py"
@@ -0,0 +1,38 @@
+# -*- encoding=utf8 -*-
+__author__ = "xiaohesheng"
+
+"""
+case_tag:api,mdm-web,经销商正常注册,id2232,id2232-8,sit,on
+主数据平台:经销商_企业注册提交_正常注册
+"""
+
+
+from common.common_func import commonFuc
+import time
+
+module = "mdm3_es"
+#企业注册接口
+import os
+url = commonFuc().get_api_url() + commonFuc().get_business_data(module, "CompanyRegist_url")
+print(url)
+# #获取请求头信息
+headers = commonFuc().get_business_data(module, "json_headers", commonFuc().get_business_data(module,"json_contentType"))
+print(headers)
+name=commonFuc().get_business_data(module,"name1")#获取前缀name
+cname=name+commonFuc().randomString(5)#随机数生成拼接企业名称
+request_body = commonFuc().get_business_data(module, "payload6",cname,cname,cname,cname,cname,cname)
+print(request_body)
+"""
+ 场景:经销商_企业注册提交_正常注册
+ 用例名称:经销商_企业注册提交_正常注册
+ 输入:cname
+ 输出:"rtn_msg": "返回注册企业信息"
+"""
+#发送请求
+result = commonFuc().http_post(url, request_body, headers)
+print(result)
+#获取预期结果
+check_dict = commonFuc().get_business_data(module, "checkDict")
+print(check_dict)
+#断言实际结果中是否不包含预期的文本
+commonFuc().check_text_exist(name,result)
diff --git a/common/aesUtils.py b/common/aesUtils.py
new file mode 100644
index 0000000000000000000000000000000000000000..7ccd3b65656b09270ec3024d7f205cb4035d3d41
--- /dev/null
+++ b/common/aesUtils.py
@@ -0,0 +1,48 @@
+import os
+from jpype import *
+import jpype
+
+curPath = os.path.abspath(os.path.dirname(__file__))
+rootPath = rootPath = os.path.split(curPath)[0]
+
+startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % rootPath + os.sep + "jar" + os.sep + "utils.jar")
+jclass = JClass("com.babytree.AesUtils")
+
+
+class aesUtils:
+
+ def encrypt(self, content):
+ """
+ aes_ecb模式加密
+ :param content:
+ :return:
+ """
+ result = jclass.encrypt(content)
+ return result
+
+ def decrypt(self, content):
+ """
+ aes_ecb模式解密
+ :param content:
+ :return:
+ """
+ result = jclass.decrypt(content)
+ return result
+
+
+ def shutdown(self):
+ """
+ 关闭虚拟机
+ :return:
+ """
+ shutdownJVM()
+
+
+if __name__ == '__main__':
+ sign = aesUtils().encrypt("helloword")
+ print("加密:", sign)
+ sign2 = aesUtils().decrypt(sign)
+ print("解密: ", sign2)
+ aesUtils().shutdown()
+
+
diff --git a/common/case_tag_get.py b/common/case_tag_get.py
new file mode 100644
index 0000000000000000000000000000000000000000..10e35e9cb06c33c479360516dc4288c18dbc0e0c
--- /dev/null
+++ b/common/case_tag_get.py
@@ -0,0 +1,98 @@
+import re
+import os
+
+
+def get_message(case_path, case_name):
+ """
+ 从注释中获取某个文件的 case tag 信息
+ """
+ tags = []
+ pyfile = open(case_path + os.sep + case_name + '.py', 'r', encoding='utf-8')
+ lines = pyfile.readlines()
+ for line in lines:
+ if 'case_tag' in line:
+ line = line.split('case_tag')[-1]
+ #对不规范的写法做一些处理,如中文分号, 中文逗号,多空格等。。
+ line = re.sub(' ', '', line)
+ line = line.replace(',', ',').replace(':', '').replace(':', '')
+ line = line.strip().strip('\n')
+ tags = line.split(',')
+ pyfile.close()
+ return tags
+
+
+def get_case_tag_list(case_path, cases):
+ """
+ 遍历case目录下的文件,从文件中获取case tag,加入列表中
+ 再加个判断,判断是跑线上还是线下
+ """
+ tagList = cases.split('#')
+ env = os.environ['ENV']
+ case_list = []
+ for f in os.listdir(case_path):
+ nf_path = os.path.join(case_path, f)
+ if os.path.isdir(nf_path) and nf_path.endswith(".air") == False:
+ for nf in os.listdir(nf_path):
+ script = os.path.join(nf_path, nf)
+ if script.endswith(".air"):
+ air_name = nf.replace('.air', '')
+ case_tags = get_message(script, air_name)
+ flag = False
+ for con in tagList:
+ conList = con.split(',')
+ if list(set(case_tags) & set(conList)):
+ flag = True
+ else:
+ flag = False
+ break
+ if flag and (env in case_tags or env in ('sit', 'sita')):
+ case_hash = {}
+ case_hash["air_path"] = str(script)
+ case_hash["air_name"] = str(air_name)
+ case_hash["module"] = str(script.split(os.sep)[-2])
+ case_list.append(case_hash)
+ else:
+ script = os.path.join(case_path, f)
+ if f.endswith(".air"):
+ air_name = f.replace('.air', '')
+ case_tags = get_message(script, air_name)
+ flag = False
+ for con in tagList:
+ conList = con.split(',')
+ if list(set(case_tags) & set(conList)):
+ flag = True
+ else:
+ flag = False
+ break
+ if flag and (env in case_tags or env in ('sit', 'sita')):
+ case_hash = {}
+ case_hash["air_path"] = str(script)
+ case_hash["air_name"] = str(air_name)
+ case_hash["module"] = str(script.split(os.sep)[-2])
+ case_list.append(case_hash)
+ return case_list
+
+
+def get_case_tag_list_2(case_path, cases):
+ """
+ 遍历case目录下的文件,从文件中获取case tag,加入列表中
+ """
+ tagList = cases.split('#')
+ case_list = []
+ for f in os.listdir(case_path):
+ script = os.path.join(case_path, f)
+ air_name = f.replace('.air', '')
+ case_tags = get_message(script, air_name)
+ flag = False
+ for con in tagList:
+ conList = con.split(',')
+ if list(set(case_tags) & set(conList)):
+ flag = True
+ else:
+ flag = False
+ break
+ if flag:
+ case_list.append(air_name)
+ return case_list
+
+
diff --git a/common/cli/runner.py b/common/cli/runner.py
new file mode 100644
index 0000000000000000000000000000000000000000..83099cf2ed74871e830689c26b2cc92dfc715538
--- /dev/null
+++ b/common/cli/runner.py
@@ -0,0 +1,142 @@
+# -*- coding: utf-8 -*-
+
+import unittest
+import os
+import sys
+import six
+import re
+import shutil
+import traceback
+import warnings
+from io import open
+from airtest.core.api import G, auto_setup, log
+from airtest.core.settings import Settings as ST
+from airtest.utils.compat import decode_path, script_dir_name, script_log_dir
+from copy import copy
+
+
+class AirtestCase(unittest.TestCase):
+
+ PROJECT_ROOT = "."
+ SCRIPTEXT = ".air"
+ TPLEXT = ".png"
+
+ @classmethod
+ def setUpClass(cls):
+ cls.args = args
+
+ setup_by_args(args)
+
+ # setup script exec scope
+ cls.scope = copy(globals())
+ cls.scope["exec_script"] = cls.exec_other_script
+
+ def setUp(self):
+ if self.args.log and self.args.recording:
+ for dev in G.DEVICE_LIST:
+ try:
+ dev.start_recording()
+ except:
+ traceback.print_exc()
+
+ def tearDown(self):
+ if self.args.log and self.args.recording:
+ for k, dev in enumerate(G.DEVICE_LIST):
+ try:
+ output = os.path.join(self.args.log, "recording_%d.mp4" % k)
+ dev.stop_recording(output)
+ except:
+ traceback.print_exc()
+
+ def runTest(self):
+ scriptpath, pyfilename = script_dir_name(self.args.script)
+ pyfilepath = os.path.join(scriptpath, pyfilename)
+ pyfilepath = os.path.abspath(pyfilepath)
+ self.scope["__file__"] = pyfilepath
+ with open(pyfilepath, 'r', encoding="utf8") as f:
+ code = f.read()
+ pyfilepath = pyfilepath.encode(sys.getfilesystemencoding())
+
+ try:
+ exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope)
+ except Exception as err:
+ tb = traceback.format_exc()
+ log("Final Error", tb)
+ six.reraise(*sys.exc_info())
+
+ @classmethod
+ def exec_other_script(cls, scriptpath):
+ """run other script in test script"""
+
+ warnings.simplefilter("always")
+ warnings.warn("please use using() api instead.", PendingDeprecationWarning)
+
+ def _sub_dir_name(scriptname):
+ dirname = os.path.splitdrive(os.path.normpath(scriptname))[-1]
+ dirname = dirname.strip(os.path.sep).replace(os.path.sep, "_").replace(cls.SCRIPTEXT, "_sub")
+ return dirname
+
+ def _copy_script(src, dst):
+ if os.path.isdir(dst):
+ shutil.rmtree(dst, ignore_errors=True)
+ os.mkdir(dst)
+ for f in os.listdir(src):
+ srcfile = os.path.join(src, f)
+ if not (os.path.isfile(srcfile) and f.endswith(cls.TPLEXT)):
+ continue
+ dstfile = os.path.join(dst, f)
+ shutil.copy(srcfile, dstfile)
+
+ # find script in PROJECT_ROOT
+ scriptpath = os.path.join(ST.PROJECT_ROOT, scriptpath)
+ # copy submodule's images into sub_dir
+ sub_dir = _sub_dir_name(scriptpath)
+ sub_dirpath = os.path.join(cls.args.script, sub_dir)
+ _copy_script(scriptpath, sub_dirpath)
+ # read code
+ pyfilename = os.path.basename(scriptpath).replace(cls.SCRIPTEXT, ".py")
+ pyfilepath = os.path.join(scriptpath, pyfilename)
+ pyfilepath = os.path.abspath(pyfilepath)
+ with open(pyfilepath, 'r', encoding='utf8') as f:
+ code = f.read()
+ # replace tpl filepath with filepath in sub_dir
+ code = re.sub("[\'\"](\w+.png)[\'\"]", "\"%s/\g<1>\"" % sub_dir, code)
+ exec(compile(code.encode("utf8"), pyfilepath, 'exec'), cls.scope)
+
+
+def setup_by_args(args):
+ # init devices
+ if isinstance(args.device, list):
+ devices = args.device
+ elif args.device:
+ devices = [args.device]
+ else:
+ devices = []
+
+ # set base dir to find tpl
+ dirpath, _ = script_dir_name(args.script)
+
+ # set log dir
+ if args.log:
+ args.log = script_log_dir(dirpath, args.log)
+ print("save log in '%s'" % args.log)
+ else:
+ print("do not save log")
+
+ # guess project_root to be basedir of current .air path
+ project_root = os.path.dirname(args.script) if not ST.PROJECT_ROOT else None
+ try:
+ auto_setup(dirpath, devices, args.log, project_root)
+ except:
+ os.system('adb devices')
+ auto_setup(dirpath, devices, args.log, project_root)
+
+
+def run_script(parsed_args, testcase_cls=AirtestCase):
+ global args # make it global deliberately to be used in AirtestCase & test scripts
+ args = parsed_args
+ suite = unittest.TestSuite()
+ suite.addTest(testcase_cls())
+ result = unittest.TextTestRunner(verbosity=0).run(suite)
+ if not result.wasSuccessful():
+ sys.exit(-1)
diff --git a/common/common_func.py b/common/common_func.py
new file mode 100644
index 0000000000000000000000000000000000000000..b1a8c9d9e6ccc646b3244d63b1f53d46644876e9
--- /dev/null
+++ b/common/common_func.py
@@ -0,0 +1,541 @@
+import base64
+import json
+
+import requests
+from airtest.core.api import *
+
+from common.confop import confOP
+from common.dubboUtils import GetDubboService2, InvokeDubboApi
+from common.rw import Rw
+
+workspace = os.path.abspath(".")
+business_path = workspace + os.sep + "data" + os.sep
+
+
+class commonFuc(object):
+
+ def find_path(self, module=""):
+ if module == "":
+ return business_path
+ else:
+ return business_path + module + os.sep
+
+ def get_business_data(self, module, key, *args):
+ env = os.environ['ENV']
+ data_list = confOP().getBusiYamlValue(self.find_path(module), "data")
+ if args is not None and len(args) > 0:
+ if isinstance(data_list[key], dict):
+ result = json.loads(json.dumps(data_list[key]) % args)
+ else:
+ if str(data_list[key]) == "":
+ result = data_list[key]
+ else:
+ result = data_list[key] % args
+ else:
+ result = data_list[key]
+ if "_sit_" in str(result) and "_on_" in str(result):
+ if env == "on":
+ return result["_on_"]
+ else:
+ return result["_sit_"]
+ else:
+ return result
+
+ def get_message(self, module, key):
+ message_list = confOP().getBusiYamlValue(self.find_path(module), "message")
+ return message_list[key]
+
+ def get_openauth_url(self):
+ return "http://openauth.meitun.com/tools/sign/create"
+
+ def get_api_url(self):
+ """
+ 接口类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'https://m.meitun.com'
+ elif env == 'pre':
+ url = 'http://pre-m.meitun.com'
+ elif env == 'sita':
+ url = 'http://sita-m.meitun.com'
+ elif env == "spd3": # spd3.0
+ # url = 'http://sit-m.meitun.com'
+ url = 'http://spddev.cmic.com.cn'
+ elif env == "spd2": # spd2.0
+ url = ""
+ elif env == "od": # 骨科
+ url = ""
+ elif env == "bs": # 电商
+ url = "https://service-slb.cmic.com.cn"
+ else:
+ url = 'http://spddev.cmic.com.cn'
+
+ return url
+
+ def get_token(self, module, enc_user_id="enc_user_id"):
+ enc_user_id = self.get_business_data(module, enc_user_id)
+ token = self.check_token(enc_user_id)
+ return token
+
+ def check_token(self, enc_user_id='u779700044448'):
+ """
+ 多个case同一个token不用一直查数据库
+ :param enc_user_id:
+ :return:
+ """
+ env = os.environ['ENV']
+ result = Rw().r_token(enc_user_id, env)
+ if result is None:
+ return Rw().w_token(enc_user_id, env)
+ else:
+ return result["token"]
+
+ def http_get(self, url, headers="", params=""):
+ """
+ 一个get请求,返回json
+ """
+ result = requests.request("GET", url, headers=headers, params=params)
+ result = json.loads(result.text)
+ return result
+
+ def http_post(self, url, postdata=None, header=None):
+ """
+ 一个post请求,返回json
+ """
+ # result = requests.post(url, data=postdata, headers=header)
+ result = requests.post(url, data=json.dumps(postdata), headers=header)
+ result = json.loads(result.content)
+ return result
+
+ def check_result(self, check_dict, result):
+ """
+ 结果检查,要检查的字段及值放在字典里, 结果是完全匹配
+ result 是json
+ """
+ assert_not_equal(result, [], "只想看下result的值")
+ for k, v in check_dict.items():
+ actual_value = self.analysis_json(k, result)
+ assert_equal(str(v).replace(" ", ""), str(actual_value).replace(" ", ""))
+
+ def analysis_json(self, key, result):
+ """
+ 解析json
+ """
+ res = None
+ if self.typeof(result) == 'dict':
+ if key in result.keys():
+ return result[key]
+ else:
+ for k, v in result.items():
+ res = self.analysis_json(key, v)
+ if res is not None:
+ break
+ elif self.typeof(result) == 'list':
+ for value in result:
+ res = self.analysis_json(key, value)
+ if res is not None:
+ break
+ else:
+ pass
+ return res
+
+
+ def typeof(self, variate):
+ """
+ 变量类型
+ :param variate:
+ :return:
+ """
+ if isinstance(variate, int):
+ return "int"
+ elif isinstance(variate, str):
+ return "str"
+ elif isinstance(variate, float):
+ return "float"
+ elif isinstance(variate, list):
+ return "list"
+ elif isinstance(variate, tuple):
+ return "tuple"
+ elif isinstance(variate, dict):
+ return "dict"
+ elif isinstance(variate, set):
+ return "set"
+ else:
+ return None
+
+ def get_openApi_url(self):
+ """
+ 获取openapi的接口
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'https://openapi.meitun.com'
+ elif env == 'pre':
+ url = 'http://pre-openapi.meitun.com'
+ elif env == 'sita':
+ url = 'http://sita-openapi.meitun.com'
+ else:
+ url = 'http://sit-openapi.meitun.com'
+ return url
+
+ def get_ip_by_pool(self, poolName, type='sit'):
+ """
+ 根据hostname获取ip地址
+ :param poolName: ip:端口/应用名:端口
+ :param type: local/sit
+ :return:
+ """
+ if str(type).lower() == 'local':
+ return poolName
+ else:
+ pool = str(poolName).split(":")[0]
+ print("pool: ", pool)
+ port = str(poolName).split(":")[1]
+ result = self.http_get(
+ "http://apollo.baobaoshu.com/apiv1/united_devices/?stage=%s&application=%s&usage=SERVER" % (type, pool))
+ ip = result["results"][0]["ip"]
+ return str(ip) + ":" + port
+
+ def run_local_dubbo(self, content, dubbo_service, dubbo_method, *args):
+ """
+ 运行本地dubbo接口
+ :param dubbo_service: dubbo中 服务名 如:com.zl.mall.api.IItemService
+ :param dubbo_method: 服务中的方法 如:updateItem
+ :param args: 方法请求需要的参数
+ :return:
+ """
+ dubbo_info = GetDubboService2().get_dubbo_info2(content)
+ invokeDubboApi = InvokeDubboApi(server_host=dubbo_info.get("server_host"),
+ server_post=dubbo_info.get("server_post"))
+ return invokeDubboApi.invoke_dubbo_api(dubbo_service, dubbo_method, *args)
+
+ def get_open_url(self):
+ """
+ 获取openapi的接口
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'https://openapi.meitun.com'
+ elif env == 'pre':
+ url = 'http://pre-openapi.meitun.com'
+ elif env == 'sita':
+ url = 'http://sita-openapi.meitun.com'
+ else:
+ url = 'http://sit-openapi.meitun.com'
+ return url
+
+ def get_openapi_signature(self, module, params):
+ """
+ 获取openapi的验签
+ :param module:
+ :param params:
+ :return:
+ """
+ private_key = self.get_business_data(module, "private_key")
+ app_secret = self.get_business_data(module, "app_secret")
+ openauth_url = self.get_openauth_url()
+ data = self.get_business_data(module, "openapi_data", private_key, app_secret, params)
+ result = commonFuc().http_post(openauth_url, data)
+ signature = result['signature']
+ return signature
+
+ def get_url(self, pool=None):
+ """
+ 根据环境或者url
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if pool == "bid":
+ if env == 'on':
+ url = 'http://bid.babytree.com'
+ else:
+ url = 'https://bid.babytree-test.com'
+ elif pool == "advertise-go-web":
+ url = 'http://g.kexin001.com'
+ elif pool == "ad_Delivery":
+ url = 'http://go.kexin001.com'
+ elif pool == "search-platform-index":
+ if env == 'on':
+ url = 'http://search-index.babytree.com/index/build'
+ else:
+ url = 'http://search-index.babytree-test.com/index/build'
+ elif pool == "search-platform-web":
+ if env == 'on':
+ url = 'http://search-query.babytree.com/search/query'
+ else:
+ url = 'http://search-query.babytree-test.com/search/query'
+ elif pool == "search-merger":
+ if env == 'on':
+ url = 'http://merger.babytree.com/search'
+ else:
+ url = 'http://merger.babytree-test.com/search'
+ elif pool == "search-suggest":
+ if env == 'on':
+ url = 'http://suggest.babytree.com'
+ else:
+ url = 'http://suggest.babytree-test.com'
+ else:
+ if env == 'on':
+ url = 'https://backend.meitunmama.com/'
+ elif env == 'pre':
+ url = 'http://pre-backend.meitunmama.com'
+ elif env == 'sita':
+ url = 'http://sita-backend.meitunmama.com'
+ else:
+ url = 'http://sit-backend.meitunmama.com'
+
+ return url
+
+ def login_backend(self, driver):
+ driver.get(self.get_url())
+ sleep(3)
+ # driver.assert_template(Template(r"tpl1580989830894.png", record_pos=(3.27, 2.99), resolution=(100, 100)),
+ # "请填写测试点")
+ driver.set_window_size(1366, 868)
+ if os.environ['ENV'] == 'on' or os.environ['ENV'] == 'pre':
+ es = 'aG9uZ2xp'
+ driver.find_element_by_id("loginName").send_keys(base64.b64decode(es.encode('utf-8')).decode("utf-8"))
+ sleep(1)
+ es = 'aGxiYjEyMTA5Mg=='
+ driver.find_element_by_xpath("//input[@type='password']").send_keys(
+ base64.b64decode(es.encode('utf-8')).decode("utf-8"))
+ sleep(1)
+ driver.find_element_by_id("smsCode").send_keys("111111")
+ sleep(1)
+ else:
+ driver.find_element_by_id("loginName").send_keys('autotest')
+ driver.find_element_by_xpath("//input[@type='password']").send_keys('123@qwe')
+ driver.find_element_by_id("smsCode").send_keys("111111")
+ driver.find_element_by_id("sub_btn").click()
+ sleep(2)
+ # driver.assert_template(Template(r"tpl1579258499558.png", record_pos=(0.47, 0.975), resolution=(100, 100)),
+ # "验证登录成功了")
+
+ # 选择打开页面的路径,如: 大健康-课程包-课程包管理
+ def enter_channel_manage(self, driver, title, classfy, content):
+ driver.find_element_by_xpath("//a[@title='%s']" % title).click()
+ driver.find_element_by_id("east").find_element_by_xpath("//*[text()='%s']" % classfy).click()
+ driver.find_element_by_xpath("//a[@title='%s']" % content).click()
+
+ def enter_album_check(self, driver):
+ """
+ 进入专辑审核页
+ """
+ driver.get(
+ self.get_url() + "/bighealth-service/outcourse/list.htm?source=1&linkId=big_health_audit_sync_btn1_link&tabId=big_health_audit_sync_btn1")
+
+ def remove_readonly(self, driver):
+ """
+ 去除input的只读属性
+ """
+ inputs = driver.find_elements_by_tag_name("input")
+ for input in inputs:
+ driver.execute_script('arguments[0].removeAttribute(\"readonly\")', input)
+ driver.execute_script('arguments[0].removeAttribute(\"autocomplete\")', input)
+
+ def check_variable_exist(self, check_list, result):
+ """
+ 结果检查,检查字段值存在
+ """
+ Flag = False
+ for variable in check_list:
+ if variable in result.keys():
+ Flag = True
+ assert_equal(Flag, True, '验证参数' + variable + "存在")
+
+ def check_text_exist(self, check_text, result):
+ """
+ 结果检查,检查文本内容是否存在于返回结果中
+ """
+ Flag = False
+ check_text=str(check_text)
+ # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
+ if check_text in str(result.values()):
+ Flag = True
+ # print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag)
+ assert_equal(Flag, True, '验证文本' + check_text + "存在")
+ def check_text_no_exist(self, check_text, result):
+ """
+ 结果检查,检查文本内容是否存在于返回结果中
+ """
+ Flag = False
+ # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
+ if check_text not in str(result.values()):
+ Flag = True
+ # print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag)
+ assert_equal(Flag, True, '验证文本' + check_text + "不存在")
+
+ def check_text_exist_result_text(self, check_text, result_text):
+ """
+ 结果检查,检查文本内容是否存在于返回结果中,返回结果也是文本
+ """
+ Flag = False
+ check_text=str(check_text)
+ # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values()))
+ if check_text in result_text:
+ Flag = True
+ # print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag)
+ assert_equal(Flag, True, '验证文本' + check_text + "存在")
+
+ def enter_h5_page(self, driver, params):
+ """
+ :param driver:
+ :param params: 请求的URL
+ :return:
+ """
+ url = self.get_api_url()
+ driver.get(url + params)
+
+ def get_start(self, pageno, pagesize):
+ """
+ 获取limit的start数
+ :param pageno:
+ :param pagesize:
+ :return:
+ """
+ return (pageno - 1) * pagesize
+
+ def click_iterm(self, driver, el_list, name):
+ """
+ 点击对应元素
+ """
+ for el in el_list:
+ print(el.text)
+ if el.text == name:
+ driver.execute_script("arguments[0].scrollIntoView();", el)
+ el.click()
+ break
+
+ def get_mapi_babytree_url(self):
+ """
+ 接口mapi_babytree类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'http://mapiweb.babytree.com'
+ elif env == 'pre':
+ url = 'http://pre-mapiweb.babytree.com'
+ else:
+ url = 'http://mapiweb.babytree-test.com'
+ return url
+
+ def get_localhome_babytree_url(self):
+ """
+ 接口mapi_babytree类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'http://localhome.babytree.com'
+ elif env == 'pre':
+ url = 'http://pre-localhome.babytree.com'
+ else:
+ url = 'http://localhome.babytree-test.com'
+ return url
+
+ def get_go_babytree_url(self):
+ """
+ 接口go_babytree类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'http://go.babytree.com'
+ elif env == 'pre':
+ url = 'http://go.babytree.com'
+ else:
+ url = 'http://go-1.babytree-test.com'
+ return url
+
+ def get_inno_babytree_url(self):
+ """
+ 接口mapi_babytree类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'http://apilocal.babytree.com'
+ elif env == 'pre':
+ url = 'http://pre-apilocal.babytree.com'
+ else:
+ url = 'http://apilocal.babytree-test.com'
+ return url
+
+ def get_localfront_babytree_url(self):
+ """
+ 接口mapi_babytree类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ print(env)
+ if env == 'on':
+ url = 'http://localfront.babytree.com'
+ elif env == 'pre':
+ url = 'http://pre-localfront.babytree.com'
+ else:
+ url = 'http://localfront.babytree-test.com'
+ return url
+
+ def get_search_platform_hz_index_url(self):
+ """
+ 接口类型的请求
+ :return:
+ """
+ env = os.environ['ENV']
+ if env == 'on':
+ url = 'http://search-index.babytree.com'
+ else:
+ url = 'http://sit-search-index.babytree.com'
+ return url
+
+ # 随机n位字符串,返回n位字符串
+ def randomString(self, n):
+ import string
+ import random
+ s = "".join(random.sample(string.ascii_letters + string.digits + "!@#$%^&*()", n))
+ return s
+
+ # 打开网页
+ def openBrowser(self, url, chrome):
+
+ chrome.implicitly_wait(10) # 隐式等待 10秒
+ chrome.get(url)
+ return chrome
+
+ def logIn(self, username, password, login_button,chrome):
+ chrome.find_element_by_xpath(username).clear()
+ chrome.find_element_by_xpath(username).send_keys('xhs')
+ chrome.find_element_by_xpath(password).clear()
+ chrome.find_element_by_xpath(password).send_keys('a123456!')
+ chrome.find_element_by_xpath(login_button).click()
+ def check_login_result(self,username,chrome):
+ for i in range(10000):
+ sleep(1)
+ try:
+ if (chrome.find_element_by_xpath('//div[text()=" %s "]' % username)).is_displayed():
+ print('看看这里显示了没有',username)
+ break
+ except:
+ continue
+ return chrome.find_element_by_xpath('//div[text()=" %s "]' % username).text
+ def quit_chrome(self,chrome):
+ chrome.quit()
+
+ # 获取当前项目的根目录的路径
+ def get_pro_path(self):
+ import os
+ curPath = os.path.abspath(os.path.dirname(__file__)) # 获取当前文件的所在目录的绝对路径
+ # print(os.path.split(curPath))
+ rootPath = os.path.split(curPath)[0]
+ return rootPath
\ No newline at end of file
diff --git a/common/config/module_name.py b/common/config/module_name.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c50dec9e786f0145a1bcc4e6b56145970278fce
--- /dev/null
+++ b/common/config/module_name.py
@@ -0,0 +1,8 @@
+
+class ModuleName(object):
+
+ SEARCH_MERGER = "search-merger"
+ SEARCH_SUGGEST = "search-suggest"
+
+ SEARCH_PLATFORM_INDEX = "search-platform-index"
+ SEARCH_PLATFORM_WEB = "search-platform-web"
diff --git a/common/confop.py b/common/confop.py
new file mode 100644
index 0000000000000000000000000000000000000000..87f02a71e66c6b4effbee524d744793678f3596f
--- /dev/null
+++ b/common/confop.py
@@ -0,0 +1,47 @@
+import configparser
+import os
+import yaml
+
+cf = configparser.ConfigParser()
+curPath = os.path.abspath(os.path.dirname(__file__))
+rootPath = rootPath = os.path.split(curPath)[0]
+
+class confOP:
+ def getConfValue(self, filename, section, option, type='string'):
+ cf.read(filename)
+ if (type == 'string'):
+ value = cf.get(section, option)
+ else:
+ value = cf.getint(section, option)
+ return value
+
+ def getYamlValue(self, filename):
+ """
+ 获取公共sql中的sql
+ :param filename:
+ :return:
+ """
+ file = os.path.join(rootPath, "data" + os.sep + filename)
+ f = open(file, 'r', encoding='utf-8')
+ cont = f.read()
+ value = yaml.load(cont, Loader=yaml.FullLoader)
+ f.close()
+ return value
+
+ def getBusiYamlValue(self, path, filename):
+ """
+ 获取业务中的yaml文件数据
+ :param path:
+ :param filename:
+ :return:
+ """
+ file = os.path.join(path, filename)
+ f = open(file, 'r', encoding='utf-8')
+ cont = f.read()
+ value = yaml.load(cont, Loader=yaml.FullLoader)
+ f.close()
+ return value
+
+
+
+
diff --git a/common/data b/common/data
new file mode 100644
index 0000000000000000000000000000000000000000..7fa420f82ed9af236e52f4e530d98a3c85f1e17d
--- /dev/null
+++ b/common/data
@@ -0,0 +1,3 @@
+loginusername1:
+ loginusername: 国药集团公司!n0d(
+ goodsname: 一次性注射器NbfHr
diff --git a/common/dateUtils.py b/common/dateUtils.py
new file mode 100644
index 0000000000000000000000000000000000000000..09f31633fda21bc256545710d3160b2cecac18ce
--- /dev/null
+++ b/common/dateUtils.py
@@ -0,0 +1,150 @@
+import datetime
+import calendar
+
+
+
+
+class dateUtils:
+
+ def get_current_start_end(self):
+ """
+ 获取当日的开始时间和结束时间
+ :return:
+ """
+ start, end = datetime.datetime.now().replace(hour=0, minute=0, second=0).strftime(
+ "%Y-%m-%d %H:%M:%S"), datetime.datetime.now().replace(hour=23, minute=59, second=59).strftime(
+ "%Y-%m-%d %H:%M:%S")
+ return start, end
+
+
+ def get_week_start_end(self):
+ """
+ 获取本周的第一天和最后一天
+ :return:
+ """
+ monday, sunday = datetime.date.today(), datetime.date.today()
+ one_day = datetime.timedelta(days=1)
+ while monday.weekday() != 0:
+ monday -= one_day
+ while sunday.weekday() != 6:
+ sunday += one_day
+ # 返回当前的星期一和星期天的日期
+ monday, sunday = monday.strftime("%Y-%m-%d %H:%M:%S"), sunday.strftime("%Y-%m-%d %H:%M:%S").replace("00:00:00", "23:59:59")
+ return monday, sunday
+
+ def get_current_time(self):
+ """
+ 获取当前时间,返回格式是yyyy-mm-dd hh:mm:ss
+ :return:
+ """
+ curr_time = datetime.datetime.now()
+ time = datetime.datetime.strftime(curr_time, '%Y-%m-%d %H:%M:%S')
+ return time
+
+ def get_current_date(self):
+ """
+ 获取当前日期,返回格式是yyyy-mm-dd
+ :return:
+ """
+ curr_time = datetime.datetime.now()
+ date = datetime.datetime.strftime(curr_time, '%Y-%m-%d')
+ return date
+
+ def get_week_of_date(self, date):
+ """
+ 获取传入的日期是星期几
+ :param date:
+ :return:
+ """
+ week_day_dict = {
+ 0: '星期一',
+ 1: '星期二',
+ 2: '星期三',
+ 3: '星期四',
+ 4: '星期五',
+ 5: '星期六',
+ 6: '星期日',
+ }
+ day = datetime.datetime.strptime(date, "%Y-%m-%d").weekday()
+ return week_day_dict[day]
+
+ def add_days(self, date, days):
+ """
+ 获取新的日期
+ :param date: 日期
+ :param days: 天数(可正数,可负数)
+ :return:
+ """
+ dt = datetime.datetime.strptime(date, "%Y-%m-%d")
+ out_date = (dt + datetime.timedelta(days=days)).strftime("%Y-%m-%d")
+ return out_date
+
+ def add_hours(self, date, hours):
+ """
+ 获取新的时间
+ :param date:
+ :param hours:
+ :return:
+ """
+ dt = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
+ out_date = (dt + datetime.timedelta(hours=hours)).strftime("%Y-%m-%d %H:%M:%S")
+ return out_date
+
+ def get_month_start_end(self, year, month):
+ """
+ 获取本月的第一天和最后一天
+ :return:
+ """
+ weekDay, monthCountDay = calendar.monthrange(year, month)
+ firstDay = datetime.date(year, month, day=1)
+ lastDay = datetime.date(year, month, day=monthCountDay)
+ return firstDay, lastDay
+
+ def get_every_month_start_end(self, year):
+ """
+ 获取某年的每个月的第一天和最后一天
+ :param year:
+ :return:
+ """
+ start = []
+ end = []
+ for x in range(1, 13):
+ dt_start = (datetime.datetime(int(year), x, 1)).strftime("%Y%m%d")
+ if 12 == x:
+ dt_end = (datetime.datetime(int(year), 12, 31)).strftime("%Y%m%d")
+ else:
+ dt_end = (datetime.datetime(int(year), x + 1, 1) - datetime.timedelta(days=1)).strftime("%Y%m%d")
+ start.append(dt_start)
+ end.append(dt_end)
+ return start, end
+
+ def get_year_month(self, time):
+ """
+ 获取某个时间的年、月份
+ :param time:
+ :return:
+ """
+ dt = datetime.datetime.strptime(time, "%Y-%m-%d %H:%M:%S")
+ return dt.year, dt.month
+
+
+
+
+
+if __name__ == '__main__':
+ print(dateUtils().get_current_date())
+ print(" \n ")
+ print(dateUtils().get_current_start_end())
+ print(" \n ")
+ print(dateUtils().add_days("2020-10-18", 10))
+ print(" \n ")
+ print(dateUtils().add_hours("2020-10-18 00:00:00", 3))
+ print(" \n ")
+ print(dateUtils().get_current_time())
+ print(" \n ")
+ print(dateUtils().get_every_month_start_end("2020"))
+ print(" \n ")
+ print(dateUtils().get_week_of_date("2020-10-18"))
+
+
+
diff --git a/common/db/conf.ini b/common/db/conf.ini
new file mode 100644
index 0000000000000000000000000000000000000000..ed5445574e346444168eaec34b7d67415764e08f
--- /dev/null
+++ b/common/db/conf.ini
@@ -0,0 +1,29 @@
+[meitun_db]
+host = rm-bp18as20m3solyi69.mysql.rds.aliyuncs.com
+port = 3306
+user = test_admin
+password = ahdp0b.cr76_Pje1
+
+[bj_db]
+host = 172.25.1.6
+port = 3320
+user = local_rw
+password = baidugoogleyahoo
+
+[promotion]
+livedb = 19
+liveenv = 4
+liveserver = 129
+predb = 19
+preenv = 2
+preserver = 58
+
+[mongo]
+ip = 127.0.0.1
+port = 27017
+
+[redis]
+redis_host=192.168.24.31
+
+
+
diff --git a/common/db/db.py b/common/db/db.py
new file mode 100644
index 0000000000000000000000000000000000000000..6dfd8e746f14c096d1a738bcec5570d54c4eb3a8
--- /dev/null
+++ b/common/db/db.py
@@ -0,0 +1,135 @@
+import pymysql
+import os
+import sys
+from common.confop import confOP
+from common.db.sql.sqlByIdb import sqlByIdb
+import pymongo
+curPath = os.path.abspath(os.path.dirname(__file__))
+rootPath = os.path.split(curPath)[0]
+sys.path.append(rootPath)
+
+class dbOP():
+ def __init__(self, path=rootPath):
+ self.path = path
+
+ def selectSql(self, schema, param=[], db="bj_db"):
+ host = mySql().getConf(db)[0]
+ port = mySql().getConf(db)[1]
+ user = mySql().getConf(db)[2]
+ pwd = mySql().getConf(db)[3]
+ value = confOP().getYamlValue("sql")
+ if schema not in value:
+ value = confOP().getBusiYamlValue(self.path, "sql")
+ env = os.environ["ENV"]
+ if env == "on" or env == "pre":
+ database = value[schema][0]
+ sql = value[schema][1]
+ param = param
+ result = sqlByIdb().selectSql(database, sql, param, env)
+ else:
+ result = mySql().selectSql(host, port, user, pwd, value[schema][0], value[schema][1], param)
+ return result
+
+ def ddlSql(self, schema, param=[], db="bj_db"):
+ host = mySql().getConf(db)[0]
+ port = mySql().getConf(db)[1]
+ user = mySql().getConf(db)[2]
+ pwd = mySql().getConf(db)[3]
+ value = confOP().getYamlValue("sql")
+ if schema not in value:
+ value = confOP().getBusiYamlValue(self.path, "sql")
+ result = mySql().executeUpdate(host, port, user, pwd, value[schema][0], value[schema][1], param)
+ return result
+
+
+class mySql:
+ def __init__(self):
+ pass
+
+ def getConf(self, db="bj_db"):
+ host = confOP().getConfValue(curPath + "/conf.ini", db, "host")
+ port = confOP().getConfValue(curPath + "/conf.ini", db, "port", "int")
+ user = confOP().getConfValue(curPath + "/conf.ini", db, "user")
+ pwd = confOP().getConfValue(curPath + "/conf.ini", db, "password")
+ return host,port,user,pwd
+
+ def connection(self, host, port, user, pwd, database):
+ return pymysql.connect(host=host, port=port,user=user,passwd=pwd,db=database)
+
+ def selectSql(self, host, port, user, pwd, database, sql, param=[]):
+ conn = self.connection(host, port, user, pwd, database)
+ cursor = conn.cursor()
+ try:
+ cursor.execute(sql, param)
+ data = cursor.fetchall()
+ cols = cursor.description
+ col = []
+ for i in cols:
+ col.append(i[0])
+ data = list(map(list, data))
+ return data
+ except Exception as e:
+ print(e)
+ conn.rollback()
+ cursor.close()
+ conn.close()
+
+ def executeUpdate(self, host, port, user, pwd, database, sql, param=[]):
+ conn = self.connection(host, port, user, pwd, database)
+ cursor = conn.cursor()
+ try:
+ ret = cursor.execute(sql, param)
+ conn.commit()
+ return ret
+ except Exception as e:
+ print(e)
+ conn.rollback()
+ cursor.close()
+ conn.close()
+
+
+
+class mongodb:
+ def connection(self,db,collect):
+ ip = confOP().getConfValue(curPath + "/conf.ini", "mongo", "ip")
+ port = confOP().getConfValue(curPath + "/conf.ini", "mongo", "port")
+ path = "mongodb://" + ip + ":" + port + "/"
+ myclient = pymongo.MongoClient(path)
+ mydb = myclient[db]
+ mycol = mydb[collect]
+ return mycol
+
+ #查询所有的值
+ def findALl(self, db, collect):
+ result = []
+ mycol = self.connection(db, collect)
+ for x in mycol.find():
+ result.append(x)
+ return result
+
+ #按照条件查询:条件为{}类型
+ def findByCon(self, db, collect, condition):
+ result = []
+ mycol = self.connection(db, collect)
+ for x in mycol.find(condition):
+ result.append(x)
+ return result
+
+
+
+
+
+if __name__ == '__main__':
+ env = 'sit'
+ os.environ['ENV'] = env.lower()
+ path = "D:\\myCode\\autotest-airtest-local\\data\\月嫂"
+ #mysql的例子
+ result = dbOP(path).selectSql("local_worker_info")
+ print(result[0])
+ #monggdb的例子
+ #mongodb().findByCon("yapi","user", {"role": "admin"})
+ #redis的例子
+ #redisClass().connect()
+
+
+
diff --git a/common/db/redis.py b/common/db/redis.py
new file mode 100644
index 0000000000000000000000000000000000000000..e03c865fc8b8a8166c997478299ad695c76aa402
--- /dev/null
+++ b/common/db/redis.py
@@ -0,0 +1,921 @@
+import redis
+import os
+curPath = os.path.abspath(os.path.dirname(__file__))
+rootPath = os.path.split(curPath)[0]
+import sys
+sys.path.append(rootPath)
+from common.confop import confOP
+
+class redisClass:
+ def connect(self):
+ redis_host = confOP.getConfValue(curPath + "/conf.ini", "redis", "redis_host")
+ pool = redis.ConnectionPool(host=redis_host)
+ r = redis.Redis(connection_pool=pool)
+ return r
+
+ def randomkey(self):
+ """
+ 获取随机的一个键
+ :return: b'name'
+ """
+ r = redisClass().connect()
+ return r.randomkey()
+
+ def exists(self, name):
+ """
+ 判断一个键是否存在
+ :param name:键名
+ :return: True
+ 例子: .exists('name')
+ 是否存在name这个键
+ """
+ r = redisClass().connect()
+ return r.exists(name)
+
+ def delete(self, name):
+ """
+ 删除一个键
+ :param name:键名
+ :return: 1
+ 例子: .delete('name')
+ 删除name这个键
+ """
+ r = redisClass().connect()
+ return r.delete(name)
+
+ def type(self, name):
+ """
+ 判断键类型
+ :param name:
+ :return:b'string'
+ 例子:.type('name')
+ 判断name这个键类型
+ """
+ r = redisClass().connect()
+ return r.type(name)
+
+ def keys(self, pattern):
+ """
+ 获取所有符合规则的键
+ :param pattern:匹配规则
+ :return:[b'name']
+ 例子:.keys('n*')
+ 获取所有以n开头的键
+ """
+ r = redisClass().connect()
+ return r.keys(pattern)
+
+ def rename(self, src, dst):
+ """
+ 重命名键
+ :param src: 原键名;
+ :param dst: 新键名
+ :return:True
+ 例子:.rename('name', 'nickname')
+ 将name重命名为nickname
+ """
+ r = redisClass().connect()
+ return r.rename(src, dst)
+
+ def dbsize(self):
+ """
+ 获取当前数据库中键的数目
+ :return: 100
+ """
+ r = redisClass().connect()
+ return r.dbsize()
+
+ def expire(self, name, time):
+ """
+ 设定键的过期时间,单位为秒
+ :param name:键名;
+ :param time:秒数
+ :return:True
+ 例子:.expire('name', 2)
+ 将name键的过期时间设置为2秒
+ """
+ r = redisClass().connect()
+ return r.expire(name, time)
+
+ def ttl(self, name):
+ """
+ 获取键的过期时间,单位为秒,-1表示永久不过期
+ :param name: 键名
+ :return: -1
+ 例子:.ttl('name')
+ 获取name这个键的过期时间
+ """
+ r = redisClass().connect()
+ return r.ttl(name)
+
+ def move(self, name, db):
+ """
+ 将键移动到其他数据库
+ :param name: 键名;
+ :param db: 数据库代号
+ :return: True
+ 例子: .move('name', 2)
+ 将name移动到2号数据库
+ """
+ r = redisClass().connect()
+ return r.move(name, db)
+
+ def flushdb(self):
+ """
+ 删除当前选择数据库中的所有键
+ :return: True
+ """
+ r = redisClass().connect()
+ return r.flushdb()
+
+ def flushall(self):
+ """
+ 删除所有数据库中的所有键
+ :return: True
+ """
+ r = redisClass().connect()
+ return r.flushall()
+
+ def set(self, name, value):
+ """
+ 给数据库中键为name的string赋予值value
+ :param name: 键名;
+ :param value:值
+ :return: True
+ 例子: .set('name', 'Bob')
+ 给name这个键的value赋值为Bob
+ """
+ r = redisClass().connect()
+ return r.set(name, value)
+
+ def get(self, name):
+ """
+ 返回数据库中键为name的string的value
+ :param name: 键名
+ :return: b'Bob'
+ 例子: .get('name')
+ 返回name这个键的value
+ """
+ r = redisClass().connect()
+ return r.get(name)
+
+ def getset(self, name, value):
+ """
+ 给数据库中键为name的string赋予值value并返回上次的value
+ :param name: 键名;
+ :param value: 新值
+ :return: b'Bob'
+ 例子: .getset('name', 'Mike')
+ 赋值name为Mike并得到上次的value
+ """
+ r = redisClass().connect()
+ return r.getset(name, value)
+
+ def mget(self, keys, *args):
+ """
+ 返回多个键对应的value
+ :param keys: 键的列表
+ :param args:
+ :return: [b'Mike', b'Miker']
+ 例子: .mget(['name', 'nickname'])
+ 返回name和nickname的value
+ """
+ r = redisClass().connect()
+ return r.mget(keys, *args)
+
+ def setnx(self, name, value):
+ """
+ 如果不存在这个键值对,则更新value,否则不变
+ :param name: 键名
+ :param value:
+ :return: 第一次运行结果是True,第二次运行结果是False
+ 例子: .setnx('newname', 'James')
+ 如果newname这个键不存在,则设置值为James
+ """
+ r = redisClass().connect()
+ return r.setnx(name, value)
+
+ def setex(self, name, time, value):
+ """
+ 设置可以对应的值为string类型的value,并指定此键值对应的有效期
+ :param name: 键名;
+ :param time: 有效期;
+ :param value: 值
+ :return: True
+ 例子: .setex('name', 1, 'James')
+ 将name这个键的值设为James,有效期为1秒
+ """
+ r = redisClass().connect()
+ return r.setex(name, time, value)
+
+ def setrange(self, name, offset, value):
+ """
+ 设置指定键的value值的子字符串
+ :param name: 键名;
+ :param offset: 偏移量;
+ :param value: 值
+ :return:xx,修改后的字符串长度
+ 例子:
+ .set('name', 'Hello')
+ .setrange('name', 6, 'World')
+ 设置name为Hello字符串,并在index为6的位置补World
+ """
+ r = redisClass().connect()
+ return r.setrange(name, offset, value)
+
+ def mset(self, mapping):
+ """
+ 批量赋值
+ :param mapping: 字典
+ :return: True
+ 例子: .mset({'name1': 'Durant', 'name2': 'James'})
+ 将name1设为Durant,name2设为James
+ """
+ r = redisClass().connect()
+ return r.mset(mapping)
+
+ def msetnx(self, mapping):
+ """
+ 键均不存在时才批量赋值
+ :param mapping: 字典
+ :return: True
+ 例子: .msetnx({'name3': 'Smith', 'name4': 'Curry'})
+ 在name3和name4均不存在的情况下才设置二者值
+ """
+ r = redisClass().connect()
+ return r.msetnx(mapping)
+
+ def incr(self, name, amount=1):
+ """
+ 键为name的value增值操作,默认为1,键不存在则被创建并设为amount
+ :param name: 键名;
+ :param amount: 增长的值
+ :return: 1,即修改后的值
+ 例子: .incr('age', 1)
+ age对应的值增1,若不存在,则会创建并设置为1
+ """
+ r = redisClass().connect()
+ return r.incr(name, amount)
+
+ def decr(self, name, amount=1):
+ """
+ 键为name的value减值操作,默认为1,键不存在则被创建并将value设置为-amount
+ :param name: 键名;
+ :param amount: 减少的值
+ :return: -1,即修改后的值
+ 例子: .decr('age', 1)
+ age对应的值减1,若不存在,则会创建并设置为-1
+ """
+ r = redisClass().connect()
+ return r.decr(name, amount)
+
+ def append(self, key, value):
+ """
+ 键为name的string的值附加value
+ :param key: 键名
+ :param value:
+ :return: 13,即修改后的字符串长度
+ 例子: .append('nickname', 'OK')
+ 向键为nickname的值后追加OK
+ """
+ r = redisClass().connect()
+ return r.append(key, value)
+
+ def substr(self, name, start, end=-1):
+ """
+ 返回键为name的string的子串
+ :param name: 键名;
+ :param start: 起始索引;
+ :param end: 终止索引,默认为-1,表示截取到末尾
+ :return: b'ello'
+ 例子:.substr('name', 1, 4)
+ 返回键为name的值的字符串,截取索引为1~4的字符
+ """
+ r = redisClass().connect()
+ return r.substr(name, start, end)
+
+ def getrange(self, key, start, end):
+ """
+ 获取键的value值从start到end的子字符串
+ :param key: 键名;
+ :param start: 起始索引;
+ :param end: 终止索引
+ :return: b'ello'
+ 例子: .getrange('name', 1, 4)
+ 返回键为name的值的字符串,截取索引为1~4的字符
+ """
+ r = redisClass().connect()
+ return r.getrange(key, start, end)
+
+ def rpush(self, name, *values):
+ """
+ 在键为name的列表末尾添加值为value的元素,可以传多个
+ :param name: 键名;
+ :param values: 值
+ :return: 3,列表大小
+ 例子: .rpush('list', 1, 2, 3)
+ 向键为list的列表尾添加1、2、3
+ """
+ r = redisClass().connect()
+ return r.rpush(name, *values)
+
+ def lpush(self, name, *values):
+ """
+ 在键为name的列表头添加值为value的元素,可以传多个
+ :param name: 键名;
+ :param values: 值
+ :return: 4,列表大小
+ 例子:.lpush('list', 0)
+ 向键为list的列表头部添加0
+ """
+ r = redisClass().connect()
+ return r.lpush(name, *values)
+
+ def llen(self, name):
+ """
+ 返回键为name的列表的长度
+ :param name: 键名
+ :return: 4
+ 例子:.llen('list')
+ 返回键为list的列表的长度
+ """
+ r = redisClass().connect()
+ return r.llen(name)
+
+ def lrange(self, name, start, end):
+ """
+ 返回键为name的列表中start至end之间的元素
+ :param name: 键名;
+ :param start: 起始索引;
+ :param end: 终止索引
+ :return: [b'3', b'2', b'1']
+ 例子:.lrange('list', 1, 3)
+ 返回起始索引为1终止索引为3的索引范围对应的列表
+ """
+ r = redisClass().connect()
+ return r.lrange(name, start, end)
+
+ def ltrim(self, name, start, end):
+ """
+ 截取键为name的列表,保留索引为start到end的内容
+ :param name: 键名;
+ :param start: 起始索引;
+ :param end: 终止索引
+ :return: True
+ 例子:ltrim('list', 1, 3)
+ 保留键为list的索引为1到3的元素
+ """
+ r = redisClass().connect()
+ return r.ltrim(name, start, end)
+
+ def lindex(self, name, index):
+ """
+ 返回键为name的列表中index位置的元素
+ :param name: 键名;
+ :param index: 索引
+ :return: b’2’
+ 例子:.lindex('list', 1)
+ 返回键为list的列表索引为1的元素
+ """
+ r = redisClass().connect()
+ return r.lindex(name, index)
+
+ def lset(self, name, index, value):
+ """
+ 给键为name的列表中index位置的元素赋值,越界则报错
+ :param name: 键名;
+ :param index: 索引位置;
+ :param value: 值
+ :return: True
+ 例子:.lset('list', 1, 5)
+ 将键为list的列表中索引为1的位置赋值为5
+ """
+ r = redisClass().connect()
+ return r.lset(name, index, value)
+
+ def lrem(self, name, count, value):
+ """
+ 删除count个键的列表中值为value的元素
+ :param name: 键名;
+ :param count: 删除个数;
+ :param value: 值
+ :return: 1,即删除的个数
+ 例子:.lrem('list', 2, 3)
+ 将键为list的列表删除两个3
+ """
+ r = redisClass().connect()
+ return r.lrem(name, count, value)
+
+ def lpop(self, name):
+ """
+ 返回并删除键为name的列表中的首元素
+ :param name: 键名
+ :return: b'5'
+ 例子:.lpop('list')
+ 返回并删除名为list的列表中的第一个元素
+ """
+ r = redisClass().connect()
+ return r.lpop(name)
+
+ def rpop(self, name):
+ """
+ 返回并删除键为name的列表中的尾元素
+ :param name: 键名
+ :return: b'2'
+ 例子:.rpop('list')
+ 返回并删除名为list的列表中的最后一个元素
+ """
+ r = redisClass().connect()
+ return r.rpop(name)
+
+ def blpop(self, keys, timeout=0):
+ """
+ 返回并删除名称在keys中的list中的首个元素,如果列表为空,则会一直阻塞等待
+ :param keys: 键列表;
+ :param timeout: 超时等待时间,0为一直等待
+ :return: [b'5']
+ 例子:.blpop('list')
+ 返回并删除键为list的列表中的第一个元素
+ """
+ r = redisClass().connect()
+ return r.blpop(keys, timeout)
+
+ def brpop(self, keys, timeout=0):
+ """
+ 返回并删除键为name的列表中的尾元素,如果list为空,则会一直阻塞等待
+ :param keys: 键列表;
+ :param timeout: 超时等待时间,0为一直等待
+ :return: [b'2']
+ 例子:.brpop('list')
+ 返回并删除名为list的列表中的最后一个元素
+ """
+ r = redisClass().connect()
+ return r.brpop(keys, timeout)
+
+ def rpoplpush(self, src, dst):
+ """
+ 返回并删除名称为src的列表的尾元素,并将该元素添加到名称为dst的列表头部
+ :param src: 源列表的键;
+ :param dst: 目标列表的key
+ :return: b'2'
+ 例子:.rpoplpush('list', 'list2')
+ 将键为list的列表尾元素删除并将其添加到键为list2的列表头部,然后返回
+ """
+ r = redisClass().connect()
+ return r.rpoplpush(src, dst)
+
+ def sadd(self, name, *values):
+ """
+ 向键为name的集合中添加元素
+ :param name: 键名;
+ :param values: 值,可为多个
+ :return: 3,即插入的数据个数
+ 例子: .sadd('tags', 'Book', 'Tea', 'Coffee')
+ 向键为tags的集合中添加Book、Tea和Coffee这3个内容
+ """
+ r = redisClass().connect()
+ return r.sadd(name, *values)
+
+ def srem(self, name, *values):
+ """
+ 从键为name的集合中删除元素
+ :param name: 键名;
+ :param values: 值,可为多个
+ :return: 1,即删除的数据个数
+ 例子: .srem('tags', 'Book')
+ 从键为tags的集合中删除Book
+ """
+ r = redisClass().connect()
+ return r.srem(name, *values)
+
+ def spop(self, name):
+ """
+ 随机返回并删除键为name的集合中的一个元素
+ :param name: 键名
+ :return:b'Tea'
+ 例子:.spop('tags')
+ 从键为tags的集合中随机删除并返回该元素
+ """
+ r = redisClass().connect()
+ return r.spop(name)
+
+ def smove(self, src, dst, value):
+ """
+ 从src对应的集合中移除元素并将其添加到dst对应的集合中
+ :param src: 源集合;
+ :param dst: 目标集合;
+ :param value: 元素值
+ :return: True
+ 例子:.smove('tags', 'tags2', 'Coffee')
+ 从键为tags的集合中删除元素Coffee并将其添加到键为tags2的集合
+ """
+ r = redisClass().connect()
+ return r.smove(src, dst, value)
+
+ def scard(self, name):
+ """
+ 返回键为name的集合的元素个数
+ :param name:
+ :return: 3
+ 例子:.scard('tags')
+ 获取键为tags的集合中的元素个数
+ """
+ r = redisClass().connect()
+ return r.scard(name)
+
+ def sismember(self, name, value):
+ """
+ 测试member是否是键为name的集合的元素
+ :param name: 键值
+ :param value:
+ :return: True
+ 例子:.sismember('tags', 'Book')
+ 判断Book是否是键为tags的集合元素
+ """
+ r = redisClass().connect()
+ return r.sismember(name, value)
+
+ def sinter(self, keys, *args):
+ """
+ 返回所有给定键的集合的交集
+ :param keys: 键列表
+ :param args:
+ :return: {b'Coffee'}
+ 例子:.sinter(['tags', 'tags2'])
+ 返回键为tags的集合和键为tags2的集合的交集
+ """
+ r = redisClass().connect()
+ return r.sinter(keys, *args)
+
+ def sinterstore(self, dest, keys, *args):
+ """
+ 求交集并将交集保存到dest的集合
+ :param dest: 结果集合;
+ :param keys: 键列表
+ :param args:
+ :return: 1
+ 例子:.sinterstore('inttag', ['tags', 'tags2'])
+ 求键为tags的集合和键为tags2的集合的交集并将其保存为inttag
+ """
+ r = redisClass().connect()
+ return r.sinterstore(dest, keys, *args)
+
+ def sunion(self, keys, *args):
+ """
+ 返回所有给定键的集合的并集
+ :param keys: 键列表
+ :param args:
+ :return: {b'Coffee', b'Book', b'Pen'}
+ 例子:.sunion(['tags', 'tags2'])
+ 返回键为tags的集合和键为tags2的集合的并集
+ """
+ r = redisClass().connect()
+ return r.sunion(keys, *args)
+
+ def sunionstore(self, dest, keys, *args):
+ """
+ 求并集并将并集保存到dest的集合
+ :param dest: 结果集合;
+ :param keys: 键列表
+ :param args:
+ :return: 3
+ 例子:.sunionstore('inttag', ['tags', 'tags2'])
+ 求键为tags的集合和键为tags2的集合的并集并将其保存为inttag
+ """
+ r = redisClass().connect()
+ return r.sunionstore(dest, keys, *args)
+
+ def sdiff(self, keys, *args):
+ """
+ 返回所有给定键的集合的差集
+ :param keys: 键列表
+ :param args:
+ :return: {b'Book', b'Pen'}
+ 例子:.sdiff(['tags', 'tags2'])
+ 返回键为tags的集合和键为tags2的集合的差集
+ """
+ r = redisClass().connect()
+ return r.sdiff(keys, *args)
+
+ def sdiffstore(self, dest, keys, *args):
+ """
+ 求差集并将差集保存到dest集合
+ :param dest: 结果集合;
+ :param keys: 键列表
+ :param args:
+ :return: 3
+ 例子:.sdiffstore('inttag', ['tags', 'tags2'])
+ 求键为tags的集合和键为tags2的集合的差集并将其保存为inttag
+ """
+ r = redisClass().connect()
+ return r.sdiffstore(dest, keys, *args)
+
+ def smembers(self, name):
+ """
+ 返回键为name的集合的所有元素
+ :param name: 键名
+ :return: {b'Pen', b'Book', b'Coffee'}
+ 例子:.smembers('tags')
+ 返回键为tags的集合的所有元素
+ """
+ r = redisClass().connect()
+ return r.smembers(name)
+
+ def srandmember(self, name):
+ """
+ 随机返回键为name的集合中的一个元素,但不删除元素
+ :param name: 键值
+ :return:
+ 例子:.srandmember('tags')
+ 随机返回键为tags的集合中的一个元素
+ """
+ r = redisClass().connect()
+ return r.srandmember(name)
+
+ def zadd(self, name, *args, **kwargs):
+ """
+ 向键为name的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序
+ :param name: 键名;
+ :param args: 可变参数
+ :param kwargs:
+ :return: 2,即添加的元素个数
+ 例子:.zadd('grade', 100, 'Bob', 98, 'Mike')
+ 向键为grade的zset中添加Bob(其score为100),并添加Mike(其score为98)
+ """
+ r = redisClass().connect()
+ return r.zadd(name, *args, **kwargs)
+
+ def zrem(self, name, *values):
+ """
+ 删除键为name的zset中的元素
+ :param name: 键名;
+ :param values: 元素
+ :return: 1,即删除的元素个数
+ 例子:.zrem('grade', 'Mike')
+ 从键为grade的zset中删除Mike
+ """
+ r = redisClass().connect()
+ return r.zrem(name, *values)
+
+ def zincrby(self, name, value, amount=1):
+ """
+ 如果在键为name的zset中已经存在元素value,则将该元素的score增加amount;否则向该集合中添加该元素,其score的值为amount
+ :param name: key名;
+ :param value: 元素;
+ :param amount: 增长的score值
+ :return: 98.0,即修改后的值
+ 例子:.zincrby('grade', 'Bob', -2)
+ 键为grade的zset中Bob的score减2
+ """
+ r = redisClass().connect()
+ return r.zincrby(name, value, amount)
+
+ def zrank(self, name, value):
+ """
+ 返回键为name的zset中元素的排名,按score从小到大排序,即名次
+ :param name: 键名;
+ :param value: 元素值
+ :return: 1
+ 例子:.zrank('grade', 'Amy')
+ 得到键为grade的zset中Amy的排名
+ """
+ r = redisClass().connect()
+ return r.zrank(name, value)
+
+ def zrevrank(self, name, value):
+ """
+ 返回键为name的zset中元素的倒数排名(按score从大到小排序),即名次
+ :param name: 键名;
+ :param value: 元素值
+ :return: 2
+ 例子:.zrevrank('grade', 'Amy')
+ 得到键为grade的zset中Amy的倒数排名
+ """
+ r = redisClass().connect()
+ return r.zrevrank(name, value)
+
+ def zrevrange(self, name, start, end, withscores=False):
+ """
+ 返回键为name的zset(按score从大到小排序)中index从start到end的所有元素
+ :param name: 键值;
+ :param start: 开始索引;
+ :param end: 结束索引;
+ :param withscores: 是否带score
+ :return: [b'Bob', b'Mike', b'Amy', b'James']
+ 例子:.zrevrange('grade', 0, 3)
+ 返回键为grade的zset中前四名元素
+ """
+ r = redisClass().connect()
+ return r.zrevrange(name, start, end, withscores)
+
+ def zrangebyscore(self, name, min, max, start=None, num=None, withscores=False):
+ """
+ 返回键为name的zset中score在给定区间的元素
+ :param name: 键名;
+ :param min: 最低score;
+ :param max: 最高score;
+ :param start: 起始索引;
+ :param num: 个数;
+ :param withscores: 是否带score
+ :return: [b'Bob', b'Mike', b'Amy', b'James']
+ 例子:.zrangebyscore('grade', 80, 95)
+ 返回键为grade的zset中score在80和95之间的元素
+ """
+ r = redisClass().connect()
+ return r.zrangebyscore(name, min, max, start, num, withscores)
+
+ def zcount(self, name, min, max):
+ """
+ 返回键为name的zset中score在给定区间的数量
+ :param name: 键名;
+ :param min: 最低score;
+ :param max: 最高score
+ :return: 2
+ 例子:.zcount('grade', 80, 95)
+ 返回键为grade的zset中score在80到95的元素个数
+ """
+ r = redisClass().connect()
+ return r.zcount(name, min, max)
+
+ def zcard(self, name):
+ """
+ 返回键为name的zset的元素个数
+ :param name: 键名
+ :return: 3
+ 例子:.zcard('grade')
+ 获取键为grade的zset中元素的个数
+ """
+ r = redisClass().connect()
+ return r.zcard(name)
+
+ def zremrangebyrank(self, name, min, max):
+ """
+ 删除键为name的zset中排名在给定区间的元素
+ :param name: 键名;
+ :param min: 最低位次;
+ :param max: 最高位次
+ :return: 1,即删除的元素个数
+ 例子:.zremrangebyrank('grade', 0, 0)
+ 删除键为grade的zset中排名第一的元素
+ """
+ r = redisClass().connect()
+ return r.zremrangebyrank(name, min, max)
+
+ def zremrangebyscore(self, name, min, max):
+ """
+ 删除键为name的zset中score在给定区间的元素
+ :param name: 键名;
+ :param min: 最低score;
+ :param max: 最高score
+ :return: 1,即删除的元素个数
+ 例子:.zremrangebyscore('grade', 80, 90)
+ 删除score在80到90之间的元素
+ """
+ r = redisClass().connect()
+ return r.zremrangebyscore(name, min, max)
+
+ def hset(self, name, key, value):
+ """
+ 向键为name的散列表中添加映射
+ :param name: 键名;
+ :param key: 映射键名;
+ :param value: 映射键值
+ :return: 1,即添加的映射个数
+ 例子:.hset('price', 'cake', 5)
+ 向键为price的散列表中添加映射关系,cake的值为5
+ """
+ r = redisClass().connect()
+ return r.hset(name, key, value)
+
+ def hsetnx(self, name, key, value):
+ """
+ 如果映射键名不存在,则向键为name的散列表中添加映射
+ :param name: 键名;
+ :param key: 映射键名;
+ :param value: 映射键值
+ :return: 1,即添加的映射个数
+ 例子:.hsetnx('price', 'book', 6)
+ 向键为price的散列表中添加映射关系,book的值为6
+ """
+ r = redisClass().connect()
+ return r.hsetnx(name, key, value)
+
+ def hget(self, name, key):
+ """
+ 返回键为name的散列表中key对应的值
+ :param name: 键名;
+ :param key: 映射键名;
+ :return: 5
+ 例子:.hget('price', 'cake')
+ 获取键为price的散列表中键名为cake的值
+ """
+ r = redisClass().connect()
+ return r.hget(name, key)
+
+ def hmget(self, name, keys, *args):
+ """
+ 返回键为name的散列表中各个键对应的值
+ :param name: 键名;
+ :param keys: 映射键名列表
+ :param args:
+ :return: [b'3', b'7']
+ 例子:.hmget('price', ['apple', 'orange'])
+ 获取键为price的散列表中apple和orange的值
+ """
+ r = redisClass().connect()
+ return r.hmget(name, keys, *args)
+
+ def hmset(self, name, mapping):
+ """
+ 向键为name的散列表中批量添加映射
+ :param name: 键名;
+ :param mapping: 映射字典
+ :return: True
+ 例子:.hmset('price', {'banana': 2, 'pear': 6})
+ 向键为price的散列表中批量添加映射
+ """
+ r = redisClass().connect()
+ return r.hmset(name, mapping)
+
+ def hincrby(self, name, key, amount=1):
+ """
+ 将键为name的散列表中映射的值增加amount
+ :param name: 键名;
+ :param key: 映射键名;
+ :param amount: 增长量
+ :return: 6,修改后的值
+ 例子:.hincrby('price', 'apple', 3)
+ key为price的散列表中apple的值增加3
+ """
+ r = redisClass().connect()
+ return r.hincrby(name, key, amount)
+
+ def hexists(self, name, key):
+ """
+ 键为name的散列表中是否存在键名为键的映射
+ :param name: 键名;
+ :param key: 映射键名;
+ :return: True
+ 例子:.hexists('price', 'banana')
+ 键为price的散列表中banana的值是否存在
+ """
+ r = redisClass().connect()
+ return r.hexists(name, key)
+
+ def hdel(self, name, *keys):
+ """
+ 在键为name的散列表中,删除键名为键的映射
+ :param name: 键名;
+ :param key: 映射键名;
+ :return: True
+ 例子:.hdel('price', 'banana')
+ 从键为price的散列表中删除键名为banana的映射
+ """
+ r = redisClass().connect()
+ return r.hdel(name, *keys)
+
+ def hlen(self, name):
+ """
+ 从键为name的散列表中获取映射个数
+ :param name: 键名
+ :return: 6
+ 例子:.hlen('price')
+ 从键为price的散列表中获取映射个数
+ """
+ r = redisClass().connect()
+ return r.hlen(name)
+
+ def hkeys(self, name):
+ """
+ 从键为name的散列表中获取所有映射键名
+ :param name: 键名
+ :return: [b'cake', b'book', b'banana', b'pear']
+ 例子:.hkeys('price')
+ 从键为price的散列表中获取所有映射键名
+ """
+ r = redisClass().connect()
+ return r.hkeys(name)
+
+ def hvals(self, name):
+ """
+ 从键为name的散列表中获取所有映射键值
+ :param name: 键名
+ :return:[b'5', b'6', b'2', b'6']
+ 例子:.hvals('price')
+ 从键为price的散列表中获取所有映射键值
+ """
+ r = redisClass().connect()
+ return r.hvals(name)
+
+ def hgetall(self, name):
+ """
+ 从键为name的散列表中获取所有映射键值对
+ :param name: 键名
+ :return:{b'cake': b'5', b'book': b'6', b'orange': b'7', b'pear': b'6'}
+ 例子:.hgetall('price')
+ 从键为price的散列表中获取所有映射键值对
+ """
+ r = redisClass().connect()
+ return r.hgetall(name)
+
+
diff --git a/common/db/sql/sqlByIdb.py b/common/db/sql/sqlByIdb.py
new file mode 100644
index 0000000000000000000000000000000000000000..535e1f9ca9e97519fab1424adb695e597eeb6575
--- /dev/null
+++ b/common/db/sql/sqlByIdb.py
@@ -0,0 +1,51 @@
+# -*- encoding=utf8 -*-
+
+import base64
+import requests
+import json
+from common.confop import confOP
+
+class sqlByIdb:
+
+ # 登录
+ def login(self):
+ url = "http://docp.plt.babytree-inc.com/api/v1/passport/login/"
+ header = {
+ 'Content-Type': 'application/json'
+ }
+ username = "dGVzdF9jbG91ZA=="
+ password = "eDZpbkRITnJVRWRl"
+ postdata = json.dumps({
+ "username": base64.b64decode(username.encode('utf-8')).decode("utf-8"),
+ "password": base64.b64decode(password.encode('utf-8')).decode("utf-8")
+ })
+ response = requests.request("POST", url, headers=header, data=postdata)
+ result = json.loads(response.text.encode('utf8'))
+ return result
+
+ def selectSql(self, database, sql, param, env):
+ login_result = sqlByIdb().login()
+ sql = sql.replace('%d', '%s')
+ for pa in param:
+ pa = "'" + str(pa) + "'"
+ sql = sql.replace('%s', pa, 1)
+ print(sql)
+ value = confOP().getYamlValue("idbSet")
+ if env == "on":
+ env = "live"
+ instance_id = value[database][env]
+ url = "http://docp.plt.babytree-inc.com/api/v1/sql/mysql/query/query/"
+ payload = json.dumps({
+ "instance_id": instance_id,
+ "db_name": database,
+ "tb_name": database,
+ "limit_num": 3000,
+ "sqlContent": sql
+ })
+ headers = {
+ 'Authorization': login_result["sid"],
+ 'Content-Type': 'application/json'
+ }
+ response = requests.request("POST", url, headers=headers, data=payload)
+ result = json.loads(response.text.encode('utf8'))
+ return result["results"][0]["rows"]
diff --git a/common/dubboUtils.py b/common/dubboUtils.py
new file mode 100644
index 0000000000000000000000000000000000000000..9ddfb04f170447cf71ca37ec480d5c92044d4039
--- /dev/null
+++ b/common/dubboUtils.py
@@ -0,0 +1,93 @@
+import time
+import telnetlib
+import re
+
+
+class TelnetClient(object):
+ """通过telnet连接dubbo服务, 执行shell命令, 可用来调用dubbo接口
+ """
+ def __init__(self, server_host, server_post):
+ self.tn = telnetlib.Telnet()
+ self.server_host = server_host
+ self.server_port = server_post
+
+ # 此函数实现telnet登录主机
+ def connect_dubbo(self):
+ try:
+ print("telent连接dubbo服务端: telnet {} {} ……".format(self.server_host, self.server_port))
+ self.tn.open(self.server_host, port=self.server_port)
+ return True
+ except Exception as e:
+ print('连接失败, 原因是: {}'.format(str(e)))
+ return False
+
+ # 此函数实现执行传过来的命令,并输出其执行结果
+ def execute_some_command(self, command):
+ # 执行命令
+ cmd = (command + '\n').encode("gbk")
+ self.tn.write(cmd)
+
+ # 获取命令结果,字符串类型
+ retry_count = 0
+ # 如果响应未及时返回,则等待后重新读取,并记录重试次数
+ result = self.tn.read_very_eager().decode(encoding='gbk')
+ while result == '':
+ time.sleep(1)
+ result = self.tn.read_very_eager().decode(encoding='gbk')
+ retry_count += 1
+ return result
+
+ # 退出telnet
+ def logout_host(self):
+ self.tn.write(b"exit\n")
+ print("登出成功")
+
+
+class InvokeDubboApi(object):
+
+ def __init__(self, server_host, server_post):
+ try:
+ self.telnet_client = TelnetClient(server_host, server_post)
+ self.login_flag = self.telnet_client.connect_dubbo()
+ except Exception as e:
+ print("invokedubboapi init error" + str(e))
+
+
+
+ def invoke_dubbo_api(self, dubbo_service, dubbor_method, args):
+ api_name = dubbo_service + "." + dubbor_method + "({})"
+ cmd = "invoke " + api_name.format(args)
+ # print("调用命令是:{}".format(cmd))
+ resp0 = None
+ try:
+ if self.login_flag:
+ resp0 = self.telnet_client.execute_some_command(cmd)
+ # print("接口响应是,resp={}".format(resp0))
+ # dubbo接口返回的数据中有 elapsed: 4 ms. 耗时,需要使用elapsed 进行切割
+ return str(re.compile(".+").findall(resp0).pop(0)).split("elapsed").pop(0).strip()
+ else:
+ print("登陆失败!")
+ except Exception as e:
+ raise Exception("调用接口异常, 接口响应是resp={}, 异常信息为:{}".format(resp0, str(e)))
+ self.logout()
+
+ def logout(self):
+ self.telnet_client.logout_host()
+
+class GetDubboService2(object):
+ def __init__(self):
+ pass
+
+ def get_dubbo_info2(self,content):
+ try:
+ dubbore = re.compile(r"([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)", re.I)
+ result = dubbore.search(str(content)).group()
+ print("获取到dubbo部署信息" + result)
+ return {"server_host": result.split(":")[0], "server_post": result.split(":")[1]}
+ except Exception as e:
+ raise Exception("获取dubbo部署信息失败:{}".format(str(e)))
+
+
+
+
+
diff --git a/common/fileUtls.py b/common/fileUtls.py
new file mode 100644
index 0000000000000000000000000000000000000000..53ffb1911d358a7c3a4344dc9e9f5edc3fc9410c
--- /dev/null
+++ b/common/fileUtls.py
@@ -0,0 +1,54 @@
+import os
+from ruamel import yaml
+
+from common.db.db import dbOP
+import datetime
+curpath = os.path.dirname(os.path.realpath(__file__))
+rootPath = os.path.split(curpath)[0]
+
+# 数据读入和写入文件
+class FileUtils(object):
+ def w_info(self, info,keyname):
+ module=info[2]
+ dict = {}
+ value = {}
+ value['username'] = info[0]
+ value['goodsname'] = info[1]
+ key=keyname
+ dict[key] = value
+ w_path=rootPath+os.sep+'data'+os.sep+module
+ # print(w_path)
+ yamlpath = os.path.join(w_path, "message")
+ # 写入到yaml文件
+ with open(yamlpath, "w", encoding="utf-8") as f:
+ yaml.dump(dict, f, Dumper=yaml.RoundTripDumper,allow_unicode=True)
+
+ def r_info(self, module,keyname):
+ w_path = rootPath + os.sep + 'data' + os.sep + module
+ yamlpath = os.path.join(w_path, "message")
+ file_value = open(yamlpath, 'r',encoding='utf-8')
+ result = yaml.load(file_value.read(), Loader=yaml.Loader)
+ if result is not None:
+ key = keyname
+ if key in result:
+ return result[key]
+ else:
+ return None
+ else:
+ return None
+if __name__ == '__main__':
+ # info=("aaaa","bbbbbb","mdm3-pim")
+ # FileUtils().w_info(info,"产品新增")
+ aa=FileUtils().r_info("mdm3-pim","产品新增")
+ print(aa['username'])
+
+
+
+
+
+
+
+
+
+
+
diff --git a/common/message b/common/message
new file mode 100644
index 0000000000000000000000000000000000000000..520cec2ad8b93e70d4b0e9935d112fd7a669e01f
--- /dev/null
+++ b/common/message
@@ -0,0 +1,3 @@
+loginusername1:
+ aaaa: aaaa
+ bbbbbb: bbbbbb
diff --git a/common/passwordUtils.py b/common/passwordUtils.py
new file mode 100644
index 0000000000000000000000000000000000000000..d86cf32114058a0e3c53d47fcf93589cbd3f641e
--- /dev/null
+++ b/common/passwordUtils.py
@@ -0,0 +1,59 @@
+import hashlib
+
+
+from Crypto.Cipher import AES
+
+
+class PasswordEncrypt(object):
+ """通过对密码进行加密,方便spd系统登录之后获取token
+ spd项目token不存于数据库中,token只存在于内存中
+ """
+
+ def __init__(self, username, userpwd, verifyCodeId):
+ self.username = username # 用户名
+ self.userpwd = userpwd # 密码
+ self.verifyCodeId = verifyCodeId # 验证码id
+
+ # 此函数实现密码加密
+ def pwd_Encrypt(self):
+
+ '''
+ {"username":"gyqxadmin",
+ "passwd":"af5d87060df01ce434e4a397b51a0b9bd960416aa873177889f6a0104b28e450acc980ab8d6391931a8470a91c37c94fad5d14f4925d860fb3314aca9bc4677a3ade29e23fb469b8710680995f8e218f",
+ "verifyCodeId":"512cdfebc1a042fa89d0f5a56d744f4d","verifyCode":"ece6","projectCode":"warehouse.pc"}
+ '''
+
+ # verifyCodeId = b'512cdfebc1a042fa89d0f5a56d744f4d'
+ verifyCodeId = self.verifyCodeId
+ verifyCode = bytes(verifyCodeId[0:16])
+ # print("verifyCode:", verifyCode)
+ username_and_pwd = self.username + self.userpwd
+ sha256EncodeStr = hashlib.sha256(username_and_pwd.encode("utf-8"))
+ # print("sha256EncodeStr:", sha256EncodeStr.hexdigest())
+ # print("encode sha256EncodeStr:", sha256EncodeStr.hexdigest().encode("utf-8"))
+
+ aes = AES.new(key=bytes(verifyCodeId), iv=verifyCode, mode=AES.MODE_CBC)
+ en_text = aes.encrypt(self.pad(sha256EncodeStr.hexdigest()).encode("utf-8")) # 加密明文
+
+ # print("en_text:", en_text)
+ # print("base64 de_text2:", en_text.hex())
+ # print('en_text',en_text)
+ return en_text.hex()
+
+ def pad(slef, text):
+ # print(type(text))
+ text_length = len(text)
+ amount_to_pad = AES.block_size - (text_length % AES.block_size)
+ # print('amount_to_pad',amount_to_pad)
+ # print(type(amount_to_pad))
+ if amount_to_pad == 0:
+ amount_to_pad = AES.block_size
+ pad = chr(amount_to_pad)
+ # print('pad',pad)
+ # print(text+pad * amount_to_pad)
+ return text + pad * amount_to_pad
+
+
+if __name__ == '__main__':
+ aa = PasswordEncrypt('1679886114521', 'a123456!', b'7382a248d0e94645ba8b5b0cd942370d')
+ print(aa.pwd_Encrypt())
diff --git a/common/run_case_conditions.py b/common/run_case_conditions.py
new file mode 100644
index 0000000000000000000000000000000000000000..548c7a170c032eb98ae3922874572d82804b8713
--- /dev/null
+++ b/common/run_case_conditions.py
@@ -0,0 +1,865 @@
+# -*- encoding=utf8 -*-
+from common.cli.runner import AirtestCase, run_script
+from argparse import *
+import jinja2
+import shutil
+import os
+import io
+import time
+import re
+import report.report.report as report
+import logging
+from airtest.utils.logger import get_logger
+from multiprocessing import Pool
+import math
+import requests
+import json
+import random
+from common.confop import confOP
+
+
+class CustomAirTestCase(AirtestCase):
+ # @classMethod
+ # def setUpClass(cls):
+ # super(CustomAirTestCase,cls).setUpClass()
+ #
+ # 类变量,多进程跑任务的时候用到
+ summary_message = {}
+ summary_message["caseNum"] = 0
+ summary_message["passNum"] = 0
+ summary_message['passRate'] = 0.0
+ case_results = []
+ log_list = []
+
+ def __init__(self, work_space, case_path, log_path, runtime_log, log_level):
+ """
+ 初始化一些环境变量
+ :param work_space:
+ :param case_path:
+ :param log_path:
+ :param runtime_log:
+ """
+ self.workspace = work_space
+ self.case_path = case_path
+ self.log_path = log_path
+ self.runtime_log = runtime_log
+
+ level = self.get_log_level(log_level)
+ logger = get_logger("airtest")
+ logger.setLevel(level)
+
+ def get_phone_by_user(self, user):
+ url = "http://cloud.baobaoshu.com/cloud/groupUser/findPhoneByUser?name=%s" % user
+ payload = {}
+ headers = {
+ 'Content-Type': 'application/json'
+ }
+ response = requests.request("GET", url, headers=headers, data=payload)
+ result = json.loads(response.text)
+ return result["data"]
+
+ def dingding_send_markdown(self, env, title, content, job_url, author, token):
+ at_phones = "@"
+ at = {
+ "atMobiles": [
+ # 需要填写自己的手机号,钉钉通过手机号@对应人
+ ],
+ "isAtAll": True # 是否@所有人,默认否
+ }
+ if author in ["zhangaizhen", "caiyubing", "hongli", "lihong", "wuchenlong"]:
+ at_phones = "@ALL"
+ else:
+ phones = self.get_phone_by_user(author)
+ if phones.isdigit():
+ at_phones = at_phones + phones
+ at["isAtAll"] = False
+ else:
+ at_phones = "@ALL"
+ at["isAtAll"] = True
+ phoneArr = []
+ phoneArr.append(str(phones))
+ at["atMobiles"] = phoneArr
+
+ """
+ 报错的用例以markdown的格式发钉钉群
+ :param title: 消息主题
+ :param content: 消息内容
+ :return:
+ """
+ url = 'https://oapi.dingtalk.com/robot/send?access_token=%s' % token
+ pagrem = {
+ "msgtype": "markdown",
+ "markdown": {
+ "title": "自动化执行结果",
+ "text": "#### **[" + str(env) + "环境]" + str(title) + " 用例报错** \n> ##### 执行链接: " + str(
+ job_url) + "\n> ##### 接口返回值: " + str(content) + " " + str(at_phones)
+ },
+ "at": at
+ }
+ headers = {
+ 'Content-Type': 'application/json'
+ }
+ response = requests.post(url, data=json.dumps(pagrem), headers=headers)
+ return response.text
+
+ def get_error_log_info(self, log):
+ """
+ 获取报错的日志
+ :param log:
+ :return:
+ """
+ txt_log = os.path.join(log, 'log.txt')
+ f = open(txt_log, 'r', encoding='utf-8')
+ lines = f.readlines()
+ f.close()
+ for line in lines:
+ if "assert_not_equal" in line:
+ expect_val = json.loads(line)["data"]["call_args"]["first"]
+ return expect_val
+ else:
+ return ""
+
+ def get_log_level(self, log_level):
+ if log_level == 'warn':
+ return logging.WARN
+ elif log_level == 'debug':
+ return logging.DEBUG
+ elif log_level == 'info':
+ return logging.INFO
+ else:
+ print("输入日志信息不对")
+ return logging.DEBUG
+
+ def setUp(self):
+ print("custom setup")
+ super(CustomAirTestCase, self).setUp()
+
+ def tearDown(self):
+ print("custom tearDown")
+ super(CustomAirTestCase, self).tearDown()
+
+ def get_author(self, case_name, filepath):
+ """
+ 获取case是谁写的
+ :return:
+ """
+ name = 'Unknown'
+ pyfile = open(filepath + os.sep + case_name + '.air' + os.sep + case_name + '.py', 'r', encoding='utf-8')
+ lines = pyfile.readlines()
+ for line in lines:
+ line = line.replace(" ", "")
+ if '__author__' in line:
+ line = line.split('__author__=')[-1]
+ name = line.replace('"', '')
+ name = name.strip().strip('\n')
+ pyfile.close()
+ return name
+
+ def create_log(self, log_path, air_name):
+ """
+ 创建对应case的log 文件
+ :return:
+ """
+ if os.path.isdir(log_path):
+ pass
+ else:
+ os.makedirs(log_path)
+ log = os.path.join(log_path, air_name)
+ if os.path.isdir(log):
+ shutil.rmtree(log)
+ else:
+ os.makedirs(log)
+ return log
+
+ def get_case_runtime(self, log):
+ """
+ 读取case运行日志,获取case执行开始时间,结束时间
+ :param log:
+ :return:
+ """
+ txt_log = os.path.join(log, 'log.txt')
+ f = open(txt_log, 'r', encoding='utf-8')
+ lines = f.readlines()
+
+ f.close()
+ start_time = float(re.findall('.*"start_time": (.*), "ret".*', lines[0])[0])
+ start_time = int(start_time * 1000)
+ try:
+ end_time = float(re.findall('.*"end_time": (.*)}}.*', lines[-1])[0])
+ except:
+ # case执行失败的话没打end_time
+ end_time = float(re.findall('.*"time": (.*), "data".*', lines[-2])[0])
+ end_time = int(end_time * 1000)
+ return start_time, end_time
+
+ def assign_tasks(self, task_list, num):
+ """
+ 将任务平均分配给num个设备跑
+ :param task_list: 待分配任务列表
+ :param num: num个设备
+ :return:
+ """
+ all_list = []
+ length = len(task_list)
+ for i in range(num):
+ one_list = task_list[math.floor(i / num * length):math.floor((i + 1) / num * length)]
+ all_list.append(one_list)
+ return all_list
+
+ def get_device(self, case_dict, script):
+ """
+ 根据之间跑case时候记录的设备对应执行的case,获取某个脚本是在哪个设备上执行的
+ :param case_dict:
+ :param script:
+ :return: devie
+ """
+ for k in case_dict:
+ if script in case_dict[k]:
+ return k
+
+ def get_cases_and_log(self, case_name, device_list):
+ """
+ :return: 获得需要执行的所有air的文件夹,同时对每个设备创建log目录
+ """
+ dirs_ls = []
+ for dirs in os.listdir(self.case_path):
+ isdir = os.path.join(self.case_path, dirs)
+ if os.path.isdir(isdir) and isdir.endswith(".air"):
+ air_name = dirs.replace('.air', '')
+ if case_name == 'all' or air_name in case_name:
+ script = os.path.join(self.case_path, isdir)
+ dirs_ls.append(script)
+ for device in device_list:
+ self.create_log(os.path.join(self.log_path, device), air_name)
+ return dirs_ls
+
+ def get_all_dir(self, case_name):
+ """
+ :return: 获得需要执行的所有air的文件夹,同时创建单个log目录
+ """
+ dirs_ls = []
+ for dirs in os.listdir(self.case_path):
+ isdir = os.path.join(self.case_path, dirs)
+ if os.path.isdir(isdir) and isdir.endswith(".air"):
+ air_name = dirs.replace('.air', '')
+ if 'all' in case_name or air_name in case_name:
+ script = os.path.join(self.case_path, isdir)
+ dirs_ls.append(script)
+ log = self.create_log(self.log_path, air_name)
+ CustomAirTestCase.log_list.append(log)
+ return dirs_ls
+
+ def do_run_by_pool(self, run_device, cases, log_path):
+ """
+ 在指定设备上跑指定脚本
+ :param run_device:
+ :param script:
+ :param log:
+ :return:
+ """
+ run_device = 'Android:///' + run_device
+ for script in cases:
+ air_name = script.split(os.sep)[-1].replace('.air', '')
+ log = os.path.join(log_path, air_name)
+ print(run_device + ' run ' + script + ' ---->start')
+ args = Namespace(device=run_device, log=log, recording=None, script=script)
+ try:
+ run_script(args, AirtestCase)
+ except:
+ pass
+ print(run_device + ' run ' + script + ' ---->end')
+
+ def doReport(self, results, total, report_name):
+ """
+ 输出具体报告
+ :param case_results:
+ :param summary_message:
+ :param device:
+ :return:
+ """
+ report_path = os.path.join(self.workspace, 'report')
+ if len(results) == 0:
+ print("没有执行case")
+ return
+ else:
+ env = jinja2.Environment(
+ loader=jinja2.FileSystemLoader(os.path.join(self.workspace, 'templates')),
+ extensions=(),
+ autoescape=True
+ )
+ total["passRate"] = round(total["passNum"]*100/total["caseNum"], 2)
+ template = env.get_template("summary_template.html")
+ # log_path必须传相对路径,要不在jenkins上展示报告会报错
+ log_path = '../log'
+ # report_name 是根据设备命名的,如果report_name里有设备名的话,那log_path得加一层设备名
+ if '_' in report_name:
+ log_path = '../log/' + report_name.split('_')[-1].replace('.html', '')
+ html = template.render({"case_results": results, "summary_message": total, "log_path": log_path})
+ output_file = os.path.join(report_path, report_name)
+ with io.open(output_file, 'w', encoding="utf-8") as f:
+ f.write(html)
+ print("报告文件: " + output_file)
+
+ def delWithLogToReportByDevice(self, script_list, device):
+ """
+ 根据日志信息产出报告,一个设备出一份日志
+ :param workspace:
+ :param script_list:
+ :param log_path:
+ :param device:
+ :return:
+ """
+ summary_message = {}
+ summary_message["caseNum"] = 0
+ summary_message["passNum"] = 0
+ log_path = os.path.join(self.log_path, device)
+ case_results = []
+ count = len(script_list)
+ for i in range(count):
+ script = script_list[i]
+ air_name = script.split(os.sep)[-1].replace('.air', '')
+ log = os.path.join(log_path, air_name)
+ rpt = report.LogToHtml(script, log)
+ output_file = log + os.sep + 'log.html'
+ report_dir = '../../../report/report/'
+ case_image_dir = '../../../air_case'
+ rpt.report("log_template.html", report_dir, case_image_dir, output_file=output_file)
+ result = {}
+ result["name"] = air_name
+ result["result"] = rpt.test_result
+ if result["result"]:
+ summary_message["passNum"] += 1
+ start, end = self.get_case_runtime(log)
+ result["time"] = (end - start)/1000 if end > start else 0
+ case_results.append(result)
+ summary_message["caseNum"] = count
+ report_name = 'summary_' + device + '.html'
+ self.doReport(case_results, summary_message, report_name)
+
+ def delWithLogToReport(self, case_list):
+ """
+ 读取运行case的日志,获取case数,case运行成功数等信息,生成html 报告
+ :return:
+ """
+ count = len(CustomAirTestCase.log_list)
+ for i in range(count):
+ script = case_list[i]
+ log = CustomAirTestCase.log_list[i]
+ air_name = script.split(os.sep)[-1].replace('.air', '')
+ rpt = report.LogToHtml(script, log)
+ output_file = os.path.join(log, 'log.html')
+ report_dir = '../../report/report/'
+ case_image_dir = '../../air_case'
+ try:
+ rpt.report("log_template.html", report_dir, case_image_dir, output_file=output_file)
+ except:
+ pass
+ result = {}
+ result["name"] = air_name
+ result["result"] = rpt.test_result
+ if result["result"]:
+ CustomAirTestCase.summary_message["passNum"] += 1
+ try:
+ start, end = self.get_case_runtime(log)
+ except:
+ start = 1
+ end = 60
+ result["time"] = (end - start) / 1000 if end > start else 0
+ author = self.get_author(air_name, self.case_path)
+ result["author"] = author
+ CustomAirTestCase.case_results.append(result)
+ CustomAirTestCase.summary_message["caseNum"] = count
+ CustomAirTestCase.summary_message["passRate"] = round(CustomAirTestCase.summary_message["passNum"] \
+ * 100 / CustomAirTestCase.summary_message["caseNum"], 2)
+ self.doReport(CustomAirTestCase.case_results, CustomAirTestCase.summary_message, 'summary.html')
+
+ def run_case(self, run_case, case_name, job_url, case_scenario_name):
+ """
+ 运行单个case
+ :param case_name:
+ :return: 返回case的运行结果集合,包括case名,case执行起止时间,供校验埋点的时候用
+ """
+ summary_message = {}
+ summary_message["caseNum"] = 0
+ summary_message["passNum"] = 0
+ all_start = int(time.time() * 1000)
+ fp = open(self.runtime_log, 'w+', encoding='utf-8')
+ report_dir = '../../report/report/'
+ static_root = report_dir
+ case_image_dir = '../../air_case'
+ lang = 'zh'
+ plugin = ['airtest_selenium.report']
+ # 聚合结果
+ case_results = []
+ # d获取所有用例集
+ for filepath, dirnames, filenames in os.walk(self.case_path):
+ for f in dirnames:
+ if f.endswith(".air"):
+ # f为.air用例名称:demo.air
+ air_name = f.replace('.air', '')
+ if 'all' in case_name or air_name in case_name:
+ script = os.path.join(filepath, f)
+ # 创建日志
+ log = self.create_log(self.log_path, air_name)
+ output_file = os.path.join(log, 'log.html')
+ # global args
+ args = Namespace(device=None, log=log, recording=None, script=script)
+ start = int(time.time() * 1000)
+ try:
+ flag = False
+ i = 0
+ if "AutoTest_" in log:
+ while flag == False and i < 2:
+ try:
+ run_script(args, AirtestCase)
+ flag = True
+ i += 1
+ print("yes,SUCCESS")
+ except:
+ i += 1
+ pass
+ else:
+ run_script(args, AirtestCase)
+ flag = True
+ print("yes,SUCCESS")
+ except:
+ pass
+ print("oh, FAILED")
+ finally:
+ end = int(time.time() * 1000)
+ author = self.get_author(air_name, filepath)
+ fp.write(air_name + '\t' + str(start) + '\t' + str(end) + '\t' + author + '\n')
+ log_root = 'log/' + air_name
+ report.main(log_root, static_root, script, lang, plugin, report_dir, case_image_dir, output_file)
+ result = {}
+ result["name"] = air_name
+ result["result"] = flag
+ result["author"] = author
+ result["time"] = (end - start) / 1000 if end > start else 0
+ case_results.append(result)
+ if flag == False:
+ msg = confOP().getYamlValue("msg")
+ token = msg["dingding_msg"][0]
+ if "AutoTest_" in log and token != None:
+ title = air_name
+ if air_name in case_scenario_name:
+ title = case_scenario_name[air_name] + "---" + air_name
+ content = self.get_error_log_info(log)
+ env = os.environ['ENV']
+ if len(str(content)) > 20000:
+ content = str(content)[1:300]
+ self.dingding_send_markdown(env, title, content, job_url, author, token)
+ print("case 执行完毕,开始生成报告")
+ fp.close()
+ seconds = (int(time.time() * 1000) - all_start) / 1000
+ m, s = divmod(seconds, 60)
+ summary_message["time"] = "%d分%d秒" % (m, s)
+ new_case_result, summary_message = self.merge_run_result(run_case, case_results, summary_message)
+ self.doReport(new_case_result, summary_message, 'summary.html')
+ self.merge_log_txt(run_case, static_root, lang, plugin, report_dir, case_image_dir)
+ print("报告已生成")
+
+ def run_case_single(self, device, case_name):
+ """
+ 运行单个case
+ :param device:
+ :param case_name:
+ :return: 返回case的运行结果集合,包括case名,case执行起止时间,供校验埋点的时候用
+ """
+ summary_message = {}
+ summary_message["caseNum"] = 0
+ summary_message["passNum"] = 0
+ all_start = int(time.time() * 1000)
+ fp = open(self.runtime_log, 'w+', encoding='utf-8')
+ # 聚合结果
+ case_results = []
+ # d获取所有用例集
+ for f in os.listdir(self.case_path):
+ if f.endswith(".air"):
+ # f为.air用例名称:demo.air
+ air_name = f.replace('.air', '')
+ if 'all' in case_name or air_name in case_name:
+ script = os.path.join(self.case_path, f)
+ # 创建日志
+ log = self.create_log(self.log_path, air_name)
+ output_file = os.path.join(log, 'log.html')
+ # global args
+ dev = 'Android:///' + device
+ args = Namespace(device=dev, log=log, recording=None, script=script)
+ start = int(time.time() * 1000)
+ try:
+ run_script(args, AirtestCase)
+ summary_message["passNum"] += 1
+ except:
+ pass
+ finally:
+ end = int(time.time() * 1000)
+ author = self.get_author(air_name, self.case_path)
+ fp.write(device + '\t' + air_name + '\t' + str(start) + '\t' + str(end) + '\t' + author + '\n')
+ rpt = report.LogToHtml(script, log)
+ report_dir = '../../report/report/'
+ case_image_dir = '../../air_case'
+ rpt.report("log_template.html", report_dir, case_image_dir, output_file=output_file)
+ result = {}
+ result["name"] = air_name
+ result["result"] = rpt.test_result
+ result["time"] = (end - start) / 1000 if end > start else 0
+ case_results.append(result)
+ summary_message["caseNum"] += 1
+ print("case 执行完毕,开始生成报告")
+ fp.close()
+ seconds = (int(time.time() * 1000) - all_start) / 1000
+ m, s = divmod(seconds, 60)
+ summary_message["time"] = "%d分%d秒" % (m, s)
+ self.doReport(case_results, summary_message, 'summary.html')
+ print("报告已生成")
+ return True
+
+ def run_case_by_Multi(self, device_list, case_name):
+ """
+ 兼容性测试,case在每个机器上跑一遍
+ :param device_list:
+ :param case_name:
+ :return:
+ """
+ all_start = int(time.time() * 1000)
+ p = Pool(len(device_list))
+ # 获取所有需要执行的用例集
+ script_list = self.get_cases_and_log(case_name, device_list)
+ print("任务列表:")
+ print(script_list)
+ for device in device_list:
+ # 设置进程数和设备数一样
+ try:
+ p.apply_async(self.do_run_by_pool, args=(device, script_list, os.path.join(self.log_path, device)))
+ except:
+ pass
+ p.close()
+ p.join()
+ print("all subprocesses done")
+ seconds = (int(time.time() * 1000) - all_start) / 1000
+ m, s = divmod(seconds, 60)
+ CustomAirTestCase.summary_message["time"] = "%d分%d秒" % (m, s)
+ for device in device_list:
+ self.delWithLogToReportByDevice(script_list, device)
+
+ def run_case_by_distri(self, device_list, case_name):
+ """
+ 多进程跑case,将任务平均分给不同的设备,多进程跑,都跑完后,读取各case的log.txt 文件,获取case的开始结束时间信息
+ :param device_list
+ :param case_name:
+ :return:
+ """
+ all_start = int(time.time() * 1000)
+ # 获取所有需要执行的用例集
+ script_list = self.get_all_dir(case_name)
+ device_count = len(device_list)
+ #把任务分配给不同的设备,分布式跑就是不同机器跑不同任务最终完成所有任务
+ case_list = self.assign_tasks(script_list, device_count)
+ print("任务列表:")
+ print(case_list)
+ # 记录case 及脚本对应关系
+ case_dict = {}
+ #设置进程数和设备数一样
+ p = Pool(device_count)
+ for i in range(device_count):
+ run_device = device_list[i]
+ cases = case_list[i]
+ case_dict[run_device] = cases
+ try:
+ p.apply_async(self.do_run_by_pool, args=(run_device, cases, self.log_path))
+ except:
+ pass
+ p.close()
+ p.join()
+ print("all SubProcesses done")
+ seconds = (int(time.time() * 1000) - all_start) /1000
+ m, s = divmod(seconds, 60)
+ CustomAirTestCase.summary_message["time"] = "%d分%d秒" % (m, s)
+ self.delWithLogToReport(script_list, case_dict)
+
+ def analysis_air_file(self, case_name, case_path, new_air_name):
+ """
+ 解析需要执行的air文件,将场景和场景之间隔开
+ :param case_name: 需要分开场景的air文件
+ :return:
+ """
+ case_name_list = []
+ file_name = case_path + os.sep + case_name + '.py'
+ pyfile = open(file_name, 'r', encoding='utf-8')
+ lines = pyfile.readlines()
+ for line in lines:
+ line = line.replace(" ", "").replace("\n", "")
+ if re.match("^场景", line):
+ line = line.replace("\\", "").replace("/", "").replace(":", "").replace("*", "").replace("?", "").replace("\"", "").replace("<", "").replace(">", "").replace("|", "")
+ if line in new_air_name:
+ line = line + str(random.randint(1, 500)) + str(random.choice("abcdefghijklmnopqrstuvwxyz"))
+ case_name_list.append(line)
+ pyfile.close()
+ """
+ 如果含有多条(>1)场景,则对场景进行代码块划分
+ """
+ if len(case_name_list) > 1:
+ i = 0
+ header_file = open(case_path + os.sep + 'header.py', 'w', encoding='utf-8')
+ for line in lines:
+ if re.match("^场景", line.replace(" ", "").replace("\n", "")):
+ new_file = open(case_path + os.sep + case_name_list[i] + '.py', 'w', encoding='utf-8')
+ new_file.write(line)
+ new_file.close()
+ i += 1
+ else:
+ if i == 0:
+ header_file.write(line)
+ else:
+ new_file = open(case_path + os.sep + case_name_list[i-1] + '.py', 'a+', encoding='utf-8')
+ new_file.write(line)
+ new_file.close()
+ header_file.close()
+ new_air_name.extend(case_name_list)
+ return case_name_list, new_air_name
+ else:
+ case_name_list = []
+ if case_name in new_air_name:
+ case_name = case_name + str(random.randint(1, 500)) + str(random.choice("abcdefghijklmnopqrstuvwxyz"))
+ case_name_list.append(case_name)
+ new_air_name.extend(case_name_list)
+ return case_name_list, new_air_name
+
+ def merge_new_file(self, case_list):
+ """
+ 将公共文件和场景文件合并成一个新的air文件
+ :param case_list:
+ :return:
+ """
+ new_case_list = []
+ new_air_name = []
+ case_scenario_name = {}
+ for i in range(len(case_list)):
+ case_hash = {}
+ air_name = case_list[i]["air_name"]
+ air_path = case_list[i]["air_path"]
+ module_name = case_list[i]["module"]
+ case_hash["run_case"] = air_name
+ case_hash["module"] = module_name
+ case_name_list, new_air_name = self.analysis_air_file(air_name, air_path, new_air_name)
+ if len(case_name_list) > 1:
+ case_hash["scene_run_cases"] = case_name_list
+ for j in range(len(case_name_list)):
+ case_scenario_name[case_name_list[j]] = air_name
+ if not os.path.exists(air_path):
+ os.mkdir(air_path)
+ header_file = open(air_path + os.sep + 'header.py', 'r', encoding='utf-8')
+ header_lines = header_file.readlines()
+ header_file.close()
+ new_file = open(air_path + os.sep + case_name_list[j] + '.py', 'r', encoding='utf-8')
+ new_file_lines = new_file.readlines()
+ last_line = new_file_lines[-1]
+ if re.match("^[\"]+$", last_line):
+ new_file_lines = new_file_lines[:-1]
+ new_file.close()
+ dir_name = self.case_path + os.sep + module_name + os.sep + case_name_list[j] + ".air"
+ if not os.path.exists(dir_name):
+ os.mkdir(dir_name)
+ new_air = open(dir_name + os.sep + case_name_list[j] + '.py', 'w', encoding='utf-8')
+ new_air.writelines(header_lines)
+ for line in new_file_lines:
+ new_air.write(line)
+ new_air.close()
+ os.remove(air_path + os.sep + case_name_list[j] + '.py')
+ os.remove(air_path + os.sep + 'header.py')
+ new_case_list.append(case_hash)
+ return new_case_list, new_air_name, case_scenario_name
+
+ def merge_run_result(self, run_case_list, case_result, summary_message):
+ """
+ 将场景执行结果合并,确定最后场景执行的最后状态,成功or失败
+ :return:
+ """
+ new_case_result = []
+ """
+ 遍历跑的所有用例,包括拆分出来的所有场景
+ 判断每一个list中是否存在scene_run_cases,
+ 如果存在,则一个接口中有多个场景,遍历scene_run_cases,去case_result中找执行的结果,进行合并
+ 如果不存在,则将执行结果赋值到新的结果中
+ """
+ count = 0
+ summary_message["result"] = True
+ for i in range(len(run_case_list)):
+ new_dict_result = {}
+ json_case = run_case_list[i]
+ if 'scene_run_cases' in json_case:
+ time = 0
+ new_dict_result["result"] = True
+ scene_names = json_case["scene_run_cases"]
+ new_dict_result["name"] = json_case["run_case"]
+ # 遍历scene_run_cases
+ break_flag = False
+ for m in range(len(scene_names)):
+ air_name = scene_names[m]
+ for j in range(len(case_result)):
+ dict_case = case_result[j]
+ if air_name == dict_case["name"]:
+ new_dict_result["author"] = dict_case["author"]
+ time = float(time) + float(dict_case["time"])
+ if dict_case["result"] == False:
+ new_dict_result["result"] = False
+ count += 1
+ break_flag = True
+ summary_message["result"] = False
+ break
+ if break_flag:
+ break
+ new_dict_result["time"] = time
+ new_case_result.append(new_dict_result)
+ else:
+ air_name = json_case["run_case"]
+ for j in range(len(case_result)):
+ dict_case = case_result[j]
+ if air_name == dict_case["name"]:
+ if dict_case["result"] == False:
+ count += 1
+ new_case_result.append(dict_case)
+ break
+ summary_message["caseNum"] = len(run_case_list)
+ summary_message["passNum"] = len(run_case_list) - count
+ return new_case_result, summary_message
+
+ def merge_log_txt(self, run_case_list, static_root, lang, plugin, report_dir, case_image_dir):
+ """
+ 将log.txt内容合并
+ :param run_case_list:
+ :return:
+ """
+ for i in range(len(run_case_list)):
+ json_case = run_case_list[i]
+ module_name = json_case["module"]
+ if 'scene_run_cases' in json_case:
+ air_name = json_case["run_case"]
+ script = self.case_path + os.sep + module_name + os.sep + air_name + ".air"
+ log_root = "log" + os.sep + air_name
+ air_log_path = self.log_path + os.sep + air_name
+ if not os.path.exists(air_log_path):
+ os.mkdir(air_log_path)
+ new_log = open(self.log_path + os.sep + air_name + os.sep + 'log.txt', 'w', encoding='utf-8')
+ scene_run_cases = json_case["scene_run_cases"]
+ for j in range(len(scene_run_cases)):
+ sub_air_name = scene_run_cases[j]
+ try:
+ sub_log = open(self.log_path + os.sep + sub_air_name + os.sep + 'log.txt', 'r', encoding='utf-8')
+ lines = sub_log.readlines()
+ if len(lines) > 0:
+ json_line = json.loads(lines[0])
+ total_time = str(json_line["time"])
+ if "start_time" in json_line["data"]:
+ start_time = json_line["data"]["start_time"]
+ end_time = json_line["data"]["end_time"]
+ else:
+ start_time = "1603779572.984517"
+ end_time = "1603779572.984517"
+ else:
+ total_time = "1603779572.984517"
+ start_time = "1603779572.984517"
+ end_time = "1603779572.984517"
+ new_log.write('{"tag": "function", "depth": 1, "time": %s, "data": {"name": "assert_equal", "call_args": {"first": "autotest", "second": "autotest", "msg": ""}, "start_time": %s, "ret": null, "end_time": %s}, "scene_name": "%s"}\n' % (total_time, start_time, end_time, str(sub_air_name)))
+ new_log.writelines(lines)
+ sub_log.close()
+ new_air_path = self.case_path + os.sep + module_name
+ os.remove(new_air_path + os.sep + sub_air_name + ".air" + os.sep + sub_air_name + ".py")
+ shutil.rmtree(new_air_path + os.sep + sub_air_name + ".air")
+ except Exception as e:
+ print("mergeLogTxt: ", e)
+ new_air_path = self.case_path + os.sep + module_name
+ os.remove(new_air_path + os.sep + sub_air_name + ".air" + os.sep + sub_air_name + ".py")
+ shutil.rmtree(new_air_path + os.sep + sub_air_name + ".air")
+ new_log.close()
+ output_file = self.log_path + os.sep + air_name + os.sep + "log.html"
+ report.main(log_root, static_root, script, lang, plugin, report_dir, case_image_dir, output_file)
+
+ def run_by_scenario(self, module_name, case_name, scenario_name):
+ case_results = []
+ """
+ 按照一条用例中的场景执行
+ :return:
+ """
+ case_path = self.case_path + os.sep + module_name + os.sep + case_name + ".air"
+ case_name_list = self.analysis_air_file(case_name, case_path, [])
+ for i in range(len(case_name_list)):
+ if scenario_name in case_name_list[i]:
+ scenario_name = case_name_list[i]
+ script = self.case_path + os.sep + module_name + os.sep + scenario_name + ".air"
+ air_path = self.case_path + os.sep + module_name + os.sep + scenario_name + ".air"
+ if not os.path.exists(air_path):
+ os.mkdir(air_path)
+ header_file = open(case_path + os.sep + 'header.py', 'r', encoding='utf-8')
+ header_lines = header_file.readlines()
+ header_file.close()
+ new_file = open(case_path + os.sep + scenario_name + '.py', 'r', encoding='utf-8')
+ new_file_lines = new_file.readlines()
+ last_line = new_file_lines[-1]
+ if re.match("^[\"]+$", last_line):
+ new_file_lines = new_file_lines[:-1]
+ new_file.close()
+ dir_name = self.case_path + os.sep + module_name + os.sep + scenario_name + ".air"
+ if os.path.isdir(dir_name):
+ new_air = open(dir_name + os.sep + scenario_name + '.py', 'w', encoding='utf-8')
+ new_air.writelines(header_lines)
+ for line in new_file_lines:
+ new_air.write(line)
+ new_air.close()
+ for j in range(len(case_name_list)):
+ os.remove(case_path + os.sep + case_name_list[j] + '.py')
+ os.remove(case_path + os.sep + 'header.py')
+ summary_message = {}
+ summary_message["caseNum"] = 0
+ summary_message["passNum"] = 0
+ fp = open(self.runtime_log, 'w+', encoding='utf-8')
+ # 创建日志
+ log = self.create_log(self.log_path, scenario_name)
+ output_file = os.path.join(log, 'log.html')
+ # global args
+ args = Namespace(device=None, log=log, recording=None, script=script)
+ start = int(time.time() * 1000)
+ try:
+ run_script(args, AirtestCase)
+ summary_message["passNum"] += 1
+ except:
+ pass
+ finally:
+ end = int(time.time() * 1000)
+ author = self.get_author(scenario_name, self.case_path + os.sep + module_name)
+ fp.write(scenario_name + '\t' + str(start) + '\t' + str(end) + '\t' + author + '\n')
+ rpt = report.LogToHtml(script, log)
+ report_dir = '../../report/report/'
+ case_image_dir = '../../air_case'
+ rpt.report("log_template.html", report_dir, case_image_dir, output_file=output_file)
+ result = {}
+ result["name"] = scenario_name
+ result["result"] = rpt.test_result
+ result["time"] = (end - start) / 1000 if end > start else 0
+ case_results.append(result)
+ summary_message["caseNum"] += 1
+ self.doReport(case_results, summary_message, 'summary.html')
+ os.remove(dir_name + os.sep + scenario_name + ".py")
+ shutil.rmtree(dir_name)
+ print("报告已生成")
+ return True
+
+ def insert_api_path_to_cloud(self, case_list):
+ for i in range(len(case_list)):
+ every_case = case_list[i]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/common/rw.py b/common/rw.py
new file mode 100644
index 0000000000000000000000000000000000000000..058b054102818cd57978b986dd46305ebf17c4d4
--- /dev/null
+++ b/common/rw.py
@@ -0,0 +1,91 @@
+import os
+from ruamel import yaml
+
+from common.db.db import dbOP
+import datetime
+curpath = os.path.dirname(os.path.realpath(__file__))
+
+
+# 数据读入和写入文件
+class Rw:
+ def w_token(self, enc_user_id='u779700044448', env='on'):
+ result = dbOP().selectSql('select_user_token', [enc_user_id], "meitun_db")
+ token = result[0][0]
+ dict = {}
+ token_value = {}
+ token_value["time"] = datetime.datetime.now()
+ token_value["token"] = token
+ token_value["enc_user_id"] = enc_user_id
+ key = enc_user_id + "_" + env
+ dict[key] = token_value
+ yamlpath = os.path.join(curpath, "data")
+ # 写入到yaml文件
+ with open(yamlpath, "w", encoding="utf-8") as f:
+ yaml.dump(dict, f, Dumper=yaml.RoundTripDumper)
+ return token
+
+ def w_info(self, info):
+ dict = {}
+ value = {}
+ value["loginusername"] = info[0]
+ value["goodsname"] = info[1]
+ key="loginusername1"
+ dict[key] = value
+ yamlpath = os.path.join(curpath, "data")
+ # 写入到yaml文件
+ with open(yamlpath, "w", encoding="utf-8") as f:
+ yaml.dump(dict, f, Dumper=yaml.RoundTripDumper,allow_unicode=True)
+
+ def r_token(self, enc_user_id='u779700044448', env='on'):
+ yamlpath = os.path.join(curpath, "data")
+ file_value = open(yamlpath, 'r')
+ result = yaml.load(file_value.read(), Loader=yaml.Loader)
+ if result is not None:
+ key = enc_user_id + "_" + env
+ if key in result:
+ return result[key]
+ else:
+ return None
+ else:
+ return None
+
+
+
+
+ def r_temp_file(self, key):
+ """
+ 读临时文件
+ :return:
+ """
+ yamlPath = os.path.join(curpath, "temp.yaml")
+ file_value = open(yamlPath, 'r')
+ result = yaml.load(file_value.read(), Loader=yaml.Loader)
+ return result[key]
+
+
+ def w_temp_file(self, dict):
+ """
+ 写临时文件,没有会自动生成
+ :param content:
+ :return:
+ """
+ yamlpath = os.path.join(curpath, "temp.yaml")
+ # 写入到yaml文件
+ with open(yamlpath, "w", encoding="utf-8") as f:
+ yaml.dump(dict, f, Dumper=yaml.RoundTripDumper)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/common/timeUtils.py b/common/timeUtils.py
new file mode 100644
index 0000000000000000000000000000000000000000..9bae16c2f48c907a82db97b5d51e12830893edb1
--- /dev/null
+++ b/common/timeUtils.py
@@ -0,0 +1,12 @@
+from common.db.db import dbOP
+import datetime
+
+
+# 数据读入和写入文件
+class timeUtils(object):
+
+ def get_time_hms(self):
+ '''2023-05-06 09:39:30'''
+ import time
+ t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
+ return t
\ No newline at end of file
diff --git a/common/tokenUtils.py b/common/tokenUtils.py
new file mode 100644
index 0000000000000000000000000000000000000000..dca48a1d50ab419c285256955bff1349431e629d
--- /dev/null
+++ b/common/tokenUtils.py
@@ -0,0 +1,14 @@
+from common.passwordUtils import PasswordEncrypt
+
+
+class TokenUtils(object):
+
+ def __init__(self, username, userpwd, verifyCodeId):
+ self.username = username # 用户名
+ self.userpwd = userpwd # 密码
+ self.verifyCodeId = verifyCodeId # 验证码id
+
+
+ def get_PasswordEncrypt(self):
+ #获取加密后的密码
+ return PasswordEncrypt(self.username,self.userpwd,bytes(self.verifyCodeId.encode())).pwd_Encrypt()
\ No newline at end of file
diff --git a/common/verification_code_ocr.py b/common/verification_code_ocr.py
new file mode 100644
index 0000000000000000000000000000000000000000..24c103b4bbefbf4368414c50589603197aa071f1
--- /dev/null
+++ b/common/verification_code_ocr.py
@@ -0,0 +1,35 @@
+import base64
+import json
+import requests
+
+
+class VerificationCodeOcr:
+ """
+ 1、用于识别数字二维码
+ 2、本方法使用的是第三方识别接口(图鉴),因此需要账号和密码
+ 3、通过验证码获取接口获取到验证码之后需保存到png文件,再使用此类进行识别
+ filename:文件
+ username:图鉴系统用户名
+ password:图鉴系统密码
+ """
+
+ def __init__(self, filename, username, password):
+ self.filename = filename
+ self.username = username
+ self.password = password
+
+ def base64_api(self):
+ with open(self.filename, 'rb') as f:
+ base64_data = base64.b64encode(f.read())
+ b64 = base64_data.decode()
+ data = {"username": self.username, "password": self.password, "typeid": 1, "image": b64}
+ result = json.loads(requests.post(r"http://api.ttshitu.com/predict", json=data).text)
+ if result['success']:
+ return result["data"]["result"]
+ else:
+ return result["message"]
+ return ""
+
+
+if __name__ == '__main__':
+ print(VerificationCodeOcr(r"air_case/cmdc_login/多彩商城登录.air/verifycode.png","rainbow123","rainbow123").base64_api())
diff --git a/data/business_func.py b/data/business_func.py
new file mode 100644
index 0000000000000000000000000000000000000000..d66179ae805c37c9d1cf8c56b10fb3e817471fdd
--- /dev/null
+++ b/data/business_func.py
@@ -0,0 +1,44 @@
+from math import radians, cos, sin, asin, sqrt
+from common.common_func import commonFuc
+import json
+
+
+class businessFuc(object):
+
+ def diff_years(self, source_year, target_year):
+ """
+ 计算两个日期之间相差的年数
+ :param target_year: 当前时间
+ :param source_year: 原始年日期
+ :return:
+ """
+ years = int(target_year.strftime('%Y')) - int(str(source_year).split("-")[0])
+ return years
+
+ def geopy_distance(self, lng1, lat1, lng2, lat2):
+ """
+ 计算两个经纬度之间的距离
+ :return:
+ """
+ lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)])
+ dlon = lng2 - lng1
+ dlat = lat2 - lat1
+ a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
+ distance = 2 * asin(sqrt(a)) * 6371 * 1000 # 地球平均半径,6371km
+ distance = round(distance / 1000, 3)
+ return distance
+
+ def get_globalsid(self):
+ login_url = commonFuc().get_business_data("", "login_url")
+ result = commonFuc().http_get(login_url)
+ return result["sid"]
+
+
+
+
+
+
+
+
+
+
diff --git a/data/cmdc-qos/data b/data/cmdc-qos/data
new file mode 100644
index 0000000000000000000000000000000000000000..95643d1af253f868d2647d21814892fa59ebadba
--- /dev/null
+++ b/data/cmdc-qos/data
@@ -0,0 +1,22 @@
+# 快速下单下单权限判定接口url
+"url": "/cms/public/isQuickOrderSign"
+"companyId1": "2"
+"companyId2": "57"
+
+"payload": {
+ "companyId": "%s"
+}
+
+# 预期结果
+checkDict1: {"success":true,"code":"200","message":null,"data":{"quickOrderSign":1},"freshToken":null}
+checkDict2: {"success":true,"code":"200","message":null,"data":{"quickOrderSign":0},"freshToken":null}
+
+
+
+# 数据库相关信息
+"host": "39.106.228.69"
+"port": "3306"
+"user": "cmdc"
+"pwd": "GHEyi.414"
+"database": "cmdc-user"
+"sql": "select t.companyId from `cmdc-user`.cmdc_user t where t.deleteSign = "0" and userName = "Test001";"
diff --git a/data/cmdc_buyercar_list/data b/data/cmdc_buyercar_list/data
new file mode 100644
index 0000000000000000000000000000000000000000..f0810df4b84608d07be7ac92f5d8c3035e7729e2
--- /dev/null
+++ b/data/cmdc_buyercar_list/data
@@ -0,0 +1,125 @@
+# 多彩商城登录信息
+"username": "Test001"
+"password": "Aa123456"
+
+#后台运营管理系统登录信息
+"username1": "admin2"
+"password1": "Aa123456"
+
+json_headers: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+#商品列表接口地址
+"url": "/product/mall/queryProductInfoByPage"
+
+
+#购物车列表接口地址
+"url1": "/product/mall/queryTotalBuyerCartList"
+
+#测试场景:获取用户对应的购物车列表信息
+json_headers1: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload1": {"productName":"","materialCode":"","manufacturer":"","licenseCode":"","timeSortStatus":0,"pageSize":100,"pageStart":1}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":"OK"}
+
+
+
+#购物车新增商品接口地址
+"url2": "/product/mall/addBuyerCart"
+
+#测试场景:增加新的商品至购物车
+json_headers2: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload2": {"currentCompanyId":2,"productId":111462,"quantity":1,"agreementPriceId":0,"price":12,"filialeCode":"00102"}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":"OK","data":"ok"}
+
+
+#测试场景:增加新的不存在的商品至购物车
+json_headers4: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload4": {"currentCompanyId":2,"productId":1114654363453453532,"quantity":1,"agreementPriceId":0,"price":12,"filialeCode":"00102"}
+#预期结果
+checkDict4: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+#测试场景:增加已下架商品至购物车
+json_headers5: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+#查询已下架商品列表请求报文
+"payload50": {"isFbList":0,"filialeCode":null,"productName":null,"productCode":null,"specifications":null,"materialCode":null,"manufacturer":null,"lineName":null,"riskRank":null,"isRelease":null,"isExistImage":null,"jdeStatus":null,"isGift":null,"description":null,"tbsj":[],"pageNum":1,"pageSize":8,"total":28,"firstQuery":true,"flag":true,"preInvalidStatus":null,"isControlSales":null,"startTime":null,"endTime":null,"status":102}
+#增加已下架商品至购物车报文
+"payload5": {"currentCompanyId":%s,"productId":%s,"quantity":1,"agreementPriceId":%s,"price":%s}
+#预期结果
+checkDict5: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+#测试场景:增加已失效商品至购物车
+json_headers6: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload6": {"currentCompanyId":2,"productId":1114654363453453532,"quantity":1,"agreementPriceId":0,"price":12,"filialeCode":"00102"}
+#预期结果
+checkDict6: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+#测试场景:增加控销商品至购物车
+json_headers7: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload7": {"currentCompanyId":2,"productId":1114654363453453532,"quantity":1,"agreementPriceId":0,"price":12,"filialeCode":"00102"}
+#预期结果
+checkDict7: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+#测试场景:增加赠品至购物车
+json_headers8: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload8": {"currentCompanyId":2,"productId":1114654363453453532,"quantity":1,"agreementPriceId":0,"price":12,"filialeCode":"00102"}
+#预期结果
+checkDict8: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+
+#测试场景:增加跨站点商品至购物车
+json_headers9: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload9": {"currentCompanyId":2,"productId":1114654363453453532,"quantity":1,"agreementPriceId":0,"price":12,"filialeCode":"00102"}
+#预期结果
+checkDict9: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+
+
+
+
+#购物车商品删除接口地址
+"url3": "/product/mall/removeBuyerCart"
+
+#测试场景:从用户购物车列表删除已添加的商品
+json_headers3: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload3": {"buyerCartIdList":["%s"]}
+#预期结果
+checkDict3: {"success":true,"code":"200","message":"OK","data":"ok"}
+
diff --git a/data/cmdc_demand_audit/data b/data/cmdc_demand_audit/data
new file mode 100644
index 0000000000000000000000000000000000000000..2eba09c529810e92c1c722c8ae8615d8c894a94f
--- /dev/null
+++ b/data/cmdc_demand_audit/data
@@ -0,0 +1,2751 @@
+#后台管理系统代客下单
+#步骤一登录后台管理系统
+#后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+
+#步骤二提交创建需求单(代客下单)
+#需求单创建接口地址
+"url1": "/order/saveBackDemandOrder"
+#需求单创建
+"payload1": {"orderStatus":102,"demandItems":[{"maxProductNum":999999,"minProductNum":1,"addMinProductNum":1,"minProductNumSign":false,"isMultiple":false,"quantityTip":"","productId":10,"productCode":"10145929","materialCode":"","productName":"威尔特","specifications":"1","manufacturer":"北京康思润业生物技术有限公司-黄翼","productLineName":null,"productLineCode":null,"zonePriceVOList":null,"price":100,"storageType":"999","optionStr":"1","measuringUnit":"EA","ippMiniPurchaseNum":null,"ippMultipleSign":null,"ippPurchaseMultiple":null,"ippStatus":null,"quantity":1,"isGift":0,"measuringUnit1":"个","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","companyCode":"00102","areaName":null,"areaPrice":100,"agreementPriceId":null,"hidden":null,"description":"","taxRate":"0.17","allMaterialSign":null,"materialCodeExact":null,"specificationsExact":null,"hospitalOrderType":null,"hospitalHopeDate":null,"siteCompanyCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"mustInstallDate":false,"showDemandAuditLineLabel":false,"editProductCode":false,"quantityErr":false,"fresenuis":false,"singleFresenuis":null,"zeroSign":false,"purchaseZeroProductList":[],"activityBasicId":null,"giftList":[],"selectGiftArr":[],"selectZeroGiftObj":{"mainProductList":[],"giftProductList":[]},"giftGroupQuantity":1,"giftSign":0,"customerCode":"1000086","realPay":"100.00","purchaseId":18,"purchaseCode":"P2306281500002","purchaseEntryId":null}],"paymentAmount":100,"productAmount":100,"userId":130,"userNo":"1000086","customerCode":"1000086","userName":"北京海德锐视科技有限公司","companyId":"2","paymentType":1,"receiveBankName":"国药集团联合医疗器械有限公司","receiveBankAccount":"108902839271937437","accountId":32,"receiverName":"查杉","receiverContact":"18999998888","receiverAddress":"上海市普啊撒旦吉萨","addressNumber":17986,"remark":"","receiverNote":"查杉","receiverPhoneNote":"18999998888","receiverAddressNote":"上海市普啊撒旦吉萨","addressNoNote":17986,"fileList":[],"sellerCompanyCode":"00102","sellerCompanyName":"国药集团联合医疗器械有限公司","orderSource":2,"replaceCustomerOrder":{"orderStatus":102,"demandItems":[{"maxProductNum":999999,"minProductNum":1,"addMinProductNum":1,"minProductNumSign":false,"isMultiple":false,"quantityTip":"","productId":10,"productCode":"10145929","materialCode":"","productName":"威尔特","specifications":"1","manufacturer":"北京康思润业生物技术有限公司-黄翼","productLineName":null,"productLineCode":null,"zonePriceVOList":null,"price":100,"storageType":"999","optionStr":"1","measuringUnit":"EA","ippMiniPurchaseNum":null,"ippMultipleSign":null,"ippPurchaseMultiple":null,"ippStatus":null,"quantity":1,"isGift":0,"measuringUnit1":"个","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","companyCode":"00102","areaName":null,"areaPrice":100,"agreementPriceId":null,"hidden":null,"description":"","taxRate":"0.17","allMaterialSign":null,"materialCodeExact":null,"specificationsExact":null,"hospitalOrderType":null,"hospitalHopeDate":null,"siteCompanyCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"mustInstallDate":false,"showDemandAuditLineLabel":false,"editProductCode":false,"quantityErr":false,"fresenuis":false,"singleFresenuis":null,"zeroSign":false,"purchaseZeroProductList":[],"activityBasicId":null,"giftList":[],"selectGiftArr":[],"selectZeroGiftObj":{"mainProductList":[],"giftProductList":[]},"giftGroupQuantity":1}],"paymentAmount":100,"productAmount":100,"userId":130,"userNo":"1000086","customerCode":"1000086","userName":"北京海德锐视科技有限公司","companyId":"2","paymentType":1,"receiveBankName":"国药集团联合医疗器械有限公司","receiveBankAccount":"108902839271937437","accountId":32,"receiverName":"查杉","receiverContact":"18999998888","receiverAddress":"上海市普啊撒旦吉萨","addressNumber":17986,"remark":"","receiverNote":"查杉","receiverPhoneNote":"18999998888","receiverAddressNote":"上海市普啊撒旦吉萨","addressNoNote":17986,"fileList":[],"sellerCompanyCode":"00102","sellerCompanyName":"国药集团联合医疗器械有限公司","orderSource":2,"customerInfo":{"userId":130,"userName":"Test001","rejectUserName":null,"password":null,"realName":"王春晖","userNo":"1000086","telephone":"18008613535","rejectTelephone":null,"registerAddress":"[]","detailAddress":"武汉市洪山区南湖花园","businessScope":"[]","companyProperty":101,"companyId":null,"companyCode":null,"companyName":"国药集团联合医疗器械有限公司","companyNameList":null,"customerCompanyName":"北京海德锐视科技有限公司","lienceNo":"91110106579004448R","userType":2,"companyType":null,"status":3,"disableSign":0,"deleteSign":null,"createBy":null,"updateBy":null,"createTime":null,"updateTime":null,"licenceSketchUrl":null,"licenceUrl":null,"openId":null,"referrer":null,"gift":null,"identity":null,"department":null,"platformStatus":1,"rejectionReason":null,"registerType":null,"siteType":null,"departmentCode":null,"personName":null,"registration":null,"realPassword":null,"recommend":null,"taxRate":0.17,"roleNames":null,"subCompanyName":"国药集团联合医疗器械有限公司","roleIds":null,"addressList":null,"licenseList":null,"labelList":null,"managerList":null,"createTimeStr":null,"categoriesList":null,"merchantsAddress":null,"merchantStatus":null,"refuseReason":null,"merchantsId":null,"userTransactionAmount":"47166.7815","gray":null,"bindingTime":"2022-07-28 10:38:33","bindSign":1,"jdeStatus":0,"jdePhone":"","recommender":null,"coopeSgin":0,"bindflowList":null,"userJDEInfo":null}},"purchaseId":18,"purchaseCode":"P2306281500002","draftId":518,"demands":[{"demandId":null,"demandParentId":null,"demandParentCode":null,"demandCode":null,"customerId":null,"customerName":null,"customerCode":1000086,"loginName":null,"realName":null,"addressNumber":null,"mobile":null,"productName":null,"productCode":null,"sellerCompanyName":null,"sellerCompanyCode":null,"paymentType":null,"receiveBankName":null,"receiveBankAccount":null,"paymentAmount":"100.00","productAmount":100,"payableAmount":100,"refundAmount":null,"cancelAmount":null,"discountAmount":0,"orderStatus":null,"refundStatus":null,"receiverName":null,"receiverContact":null,"receiverAddress":null,"remark":null,"revokedReason":null,"auditById":null,"auditByName":null,"auditTime":null,"auditRemark":null,"flhsStatus":null,"pushJdeStatus":null,"createTime":null,"updateTime":null,"submitTime":null,"pushJdeTime":null,"successTime":null,"auditStatus":null,"deleteSign":null,"firstOrderFlag":null,"demandItems":[{"demandSkuId":null,"demandId":null,"distributionId":null,"companyCode":"00102","demandCode":null,"demandParentId":null,"sellerCompanyId":null,"sellerCompanyName":null,"sellerCompanyCode":null,"customerCode":1000086,"productLineCode":null,"productLineName":null,"propertyStr":null,"storageType":"999","suppDist":null,"productId":10,"productName":"威尔特","productCode":"10145929","productNature":null,"brandName":null,"optionStr":"1","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","lineNumber":null,"price":100,"rebateId":null,"originalPrice":null,"biddingDiscountTax":null,"salesDiscountTax":null,"quantity":1,"sumQuantity":null,"sendQuantity":null,"lackQuantity":null,"cancelQuantity":null,"cancelAmount":null,"refundQuantity":null,"refundAmount":null,"discountQuantity":null,"discountAmount":null,"subtotal":100,"measuringUnit":"个","auxiliaryMeasuringUnit":null,"procurementMeasuringUnit":null,"pricingMeasuringUnit":null,"materialCode":"","manufacturer":"北京康思润业生物技术有限公司-黄翼","produceRegisterNum":null,"riskRank":null,"productClassify":null,"createTime":null,"updateTime":null,"deleteSign":null,"calCancelFlag":null,"refundFlag":null,"discountRate":0,"realPay":100,"promotionPrice":null,"promotionTotalPrice":0,"demandParentCode":null,"regionId":null,"regionName":null,"spitSign":null,"activityAmount":null,"couponAmount":null,"activityUnitAmount":0,"couponUnitAmount":null,"activityBasicId":null,"couponSgin":null,"couponSgin2":null,"returnQuantity":null,"returnAmount":null,"customerId":null,"prescription":null,"specifications":"1","lineCodeDelete":null,"sdOutStorage":null,"licenseNo":null,"demandCodes":null,"areaName":null,"agreementPriceId":null,"offerPrice":null,"orderMark":null,"totalPrice":null,"productLimitBuyList":null,"giftSign":0,"giftProductCode":null,"activityCarDataVoList":null,"orderSource":null,"receiverName":null,"receiverContact":null,"receiverAddress":null,"rebateTripId":null,"allSign":null,"salesReturn":null,"nowAmount":null,"taxSign":0,"plusMinuKey":null,"rebateRule":null,"lockType":null,"lineNumberOrg":null,"changeSgin":null,"addSgin":null,"ptbfa1":null,"ptbfa2":null,"ptbfa3":null,"ptbfa4":null,"ptbfa5":null,"yapeiPriceId":null,"ypLinePromotion":null,"yapeiPrice":null,"companyId":null,"buyerCartId":0,"userReceiveIdx":null,"userReceiveIdx2":null,"limitNum":null,"productLimitBuyId":null,"alreadyBuyNum":null,"limitBuySign":0,"proposeNum":null,"takeEffectRange":null,"takeEffectTime":null,"endTime1":null,"groupId":null,"fsGroupId":null,"proposalQuantity":null,"proposalSign":0,"manufacturerUserNo":null,"manufacturerUserDesc":null,"manufacturerProductNo":null,"manufacturerProductDesc":null,"manufacturerUserId":null,"manufacturerProductId":null,"busProductCode":null,"paidTime":null,"customerName":null,"paymentAmount":null,"specQuantity":null,"disQuantity":null,"fulfilledQuantity":null,"fulCancelQuantity":null,"couponId":null,"couponId2":null,"limitS":null,"starts":null,"ends":null,"userId":null,"productTax":null,"taxRate":0.17,"demandSplitSign":"1","hospitalHopeDate":null,"uniqueKey":null,"productType":null,"activityRuleId":null,"allowanceBeginTime":null,"allowanceEndTime":null,"sign":null,"differenceActivityUserId":null,"groupNumber":1,"groupName":null,"skuGroup":null,"subList":null,"dataJson":null,"skuMergeSign":null,"freseniusPriceId":null,"quantityAndGroupAll":null,"booleaTime":null,"spitSgin":0,"groupSpitSign":0,"purchaseEntryId":null,"activityType":0,"giftSettlementMethod":null,"giftInitQuantity":null,"packageCode":null,"giftGroupQuantity":1,"mustInstallDate":false,"installedDate":null,"installedDateStr":null,"demandLines":null,"subLineNumber":null,"demandSubCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"sendManualSign":0,"sort":0,"circleArea":null,"siteCompanyCode":null,"hospitalOrderType":null,"isCollectionAllocation":null,"orderStatus":null,"distributionType":null,"groupCode":null,"groupProductType":null,"pSign":0,"backSign":0,"description":"","stockNumber":null,"rebate":false,"userBalance":null,"purchaseQuantity":1,"purchaseZeroProductList":[]}],"demandSubItems":null,"rebateDetail":null,"rebateAmountList":null,"productLineCode":null,"productLineName":null,"auditLoginName":null,"showPurchaseNo":false,"isRebate":null,"isShowReate":null,"taxRate":0.17,"rebateType":0,"paymentAmountWholeLine":100,"discountAmountWholeLine":0,"payableAmountWholeLine":100,"discountRate":0,"singleRebateAmount":null,"isRebateEdit":null,"payCertUrl":null,"rebateAmount":null,"demandCance":null,"soAdd":null,"soCance":null,"orderReturn":null,"needCustomerConfirm":false,"measuringUnit":null,"productId":null,"version":null,"mainVersion":null,"agencyConfigId":null,"confirmSign":null,"replySign":null,"agencySign":null,"editIng":null,"editIngStr":null,"jdeType":null,"isElectronicSeal":null,"contractAgreementNo":null,"alesDepartmentNo":null,"alesDepartmentName":null,"salesPersonNo":null,"salesPersonName":null,"customerNote":null,"otherNote":null,"contractAgreementCode":null,"projectName":null,"projectCode":null,"regionId":null,"regionName":null,"productLineBindSign":null,"shipVia":null,"orderSource":null,"userBalance":null,"liquidCode":null,"shipmentTypeStr":null,"specifications":"1","pageStart":null,"pageSize":null,"changeSgin":null,"yapei":2,"companyId":null,"userReceiveId2":null,"preemptConfig":null,"productSpec":null,"secondAuditSign":null,"secondAuditById":null,"secondAuditByName":null,"secondAuditTime":null,"secondAuditRemark":null,"secondAuditStatus":null,"rebateRule":"0","rebateControlSign":0,"rebateId":null,"preferenceType":null,"preferenceName":null,"disPrice":null,"lineNum":0,"auditStaySign":0,"fileList":null,"imageUrls":null,"total":null,"submitTimeStr":null,"updateTimeStr":null,"auditTimeStr":null,"acceptTime":null,"acceptTimeStr":null,"paidTime":null,"paidTimeStr":null,"erpHandingTime":null,"erpHandingTimeStr":null,"partShippingTime":null,"partShippingTimeStr":null,"allShippingTime":null,"allShippingTimeStr":null,"pushJdeTimeStr":null,"successTimeStr":null,"onlinePaySuccessTime":null,"onlinePaySuccessTimeStr":null,"bankTransactionSerial":null,"newIsTax":null,"countFormula":null,"countNumber":null,"noTaxRebateAmount":0,"isCollectionAllocation":0,"siteCompanyCode":null,"hospitalOrderType":null,"proofTime":null,"proofURL":null,"proofRemark":null,"proofSign":0,"customerCancelSign":null,"cancelRecords":null,"cancelCount":0,"updateNewTime":null,"updateNewTimeStr":null,"fsDedUseSign":null,"preDisSign":0,"shareType":null,"singleRebateSign":null,"cf":false,"notice":null,"isPre":null,"showDemandAuditLineLabel":false,"orderType":null,"newDiscountRate":null,"oldOrderType":null,"oldNewDiscountRate":null,"pendding":null,"pushJdeStatusDemandSub":null,"circleGiftSign":0,"delay":null,"limitS":null,"starts":null,"ends":null,"completedS":null,"confirmDays":null,"remindS":null,"skuGroupList":null,"groupProductType":0,"purchaseId":18,"purchaseCode":"P2306281500002","sdCancelTime":null,"sdTipSign":0,"receiverNote":null,"receiverPhoneNote":null,"receiverAddressNote":null,"flag":null,"sourceStr":null,"addressNoNote":null,"detailIsSpit":false,"spitSgin":null,"distributionType":null,"rebateValidity":null,"orderChangeType":null,"logoIcon":null,"detail":null,"changeBigType":null,"promotionType":null,"activityTotalAmount":null,"couponTotalAmount":null,"userReceiveId":null,"editSgin":null,"snSgin":null,"jdeOutAmount":null,"totalAllPaAmount":null,"diffShowSgin":0,"lineCodeDelete":null,"startTime":null,"endTime":null,"changeSign":null,"distributionId":null,"limitBuySign":0,"companyType":null,"afterSale":null,"csId":null,"sdStatusNodeParamList":null,"ypPromotionTotal":null,"acrossMainCode":null,"forceApprovedSign":0,"circleGiftContinueSgin":0,"customerCharge":null,"onlinePaySign":0,"recodeDemandSkuList":null,"mergeDemandSkuList":null,"inventoryNode":null,"customCode":null,"terminalSource":null,"potentialClientsId":null,"settlementStatus":null,"firstOrderAuditStatus":null,"confirmReceiptSign":null,"confirmReceiptTime":null,"afterSaleDays":null,"deliveryCompletedTime":null,"taxSign":0,"orderSplitSign":0,"demandRebateSkuList":null,"confirmTime":null,"customerPurchaseNo":null,"mustInstallDate":false,"secondAddressList":null,"splitOrMerge":0,"spitOrderSign":null,"productAmountWholeLine":100,"auditCompanyName":null,"auditCompanyNameCode":null,"edit":false,"showMoreAttribute":false,"ratio":null,"ratioFlag":false,"rebateFlags":false,"userBalancePrice":0,"allQuantity":1,"totalPriceNum":0,"maxTotalLimitPrice":0,"lastNoTaxDiscountAmount":0,"lastDiscountAmount":0}]}
+
+#步骤三查询已创建的需求单
+#需求单列表接口地址
+"url2": "/order/back/listDemand"
+#根据订单状态(102-待审核)、订单来源(2-代客下单)、供应商名称查询需求单
+"payload2": {"times":[null],"listOrderStatus":["102"],"productName":null,"demandCode":null,"demandParentCode":null,"customerName":"北京海德锐视科技有限公司","manufacturer":null,"materialCode":null,"sellerCompanyName":null,"produceRegisterNum":null,"productLineName":null,"auditByName":null,"orderSource":2,"changeTypeList":null,"isRebateEdit":null,"jdeType":null,"pageSize":8,"pageStart":1,"orderChangeType":null,"snSgin":null,"changeSign":null,"customerCode":null,"distributionType":null,"busCustomerCode":null,"loginName":null,"cancelSign":0,"shipmentType":null,"startTime":null,"itemStart":0}
+
+#步骤四对已创建的需求单进行审核处理
+#需求单审核接口地址
+"url3": "/order/back/auditDemand"
+#审核通过
+"payload3": {
+ "demandId":41632,
+ "demandParentId":39610,
+ "demandParentCode":"s2309181900001",
+ "demandCode":"16950376476542072",
+ "customerId":130,
+ "customerName":"北京海德锐视科技有限公司",
+ "customerCode":1000086,
+ "loginName":"Test001",
+ "realName":"王春晖",
+ "addressNumber":19199,
+ "mobile":"18008613535",
+ "productName":null,
+ "productCode":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "paymentType":1,
+ "receiveBankName":"国药集团联合医疗器械有限公司",
+ "receiveBankAccount":"108902839271937437",
+ "paymentAmount":100,
+ "productAmount":100,
+ "payableAmount":100,
+ "refundAmount":0,
+ "cancelAmount":0,
+ "discountAmount":0,
+ "orderStatus":102,
+ "refundStatus":null,
+ "receiverName":"查杉",
+ "receiverContact":"18999998888",
+ "receiverAddress":"上海市普啊撒旦吉萨",
+ "remark":null,
+ "revokedReason":null,
+ "auditById":null,
+ "auditByName":null,
+ "auditTime":null,
+ "auditRemark":null,
+ "flhsStatus":0,
+ "pushJdeStatus":null,
+ "createTime":"2023-09-18 19:47:27",
+ "updateTime":"2023-09-18 19:47:27",
+ "submitTime":"2023-09-18 19:47:28",
+ "pushJdeTime":null,
+ "successTime":null,
+ "auditStatus":1,
+ "deleteSign":0,
+ "firstOrderFlag":0,
+ "demandItems":[
+ {
+ "demandSkuId":29940,
+ "productName":"威尔特",
+ "productId":10,
+ "productCode":"10145929",
+ "productLineCode":null,
+ "productLineName":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "optionStr":"1",
+ "imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg",
+ "price":100,
+ "quantity":1,
+ "subtotal":100,
+ "materialCode":"",
+ "manufacturer":"北京康思润业生物技术有限公司-黄翼",
+ "produceRegisterNum":null,
+ "riskRank":null,
+ "productClassify":null,
+ "storageType":"999",
+ "measuringUnit":"个",
+ "auxiliaryMeasuringUnit":null,
+ "procurementMeasuringUnit":null,
+ "pricingMeasuringUnit":null,
+ "productNature":null,
+ "productInventory":[
+
+ ],
+ "totalInventory":0,
+ "promotionPrice":0,
+ "promotionTotalPrice":0,
+ "discountRate":0,
+ "realPay":100,
+ "customerCode":"1000086",
+ "isRebate":"0",
+ "rebateId":null,
+ "rebateDetail":null,
+ "useMaxLimit":null,
+ "useBalance":0,
+ "taxRate":0.17,
+ "rebateType":0,
+ "singleRebateAmount":null,
+ "multipleCodeProductList":null,
+ "stockNumber":0,
+ "prescription":null,
+ "ippMiniPurchaseNum":null,
+ "ippMultipleSign":null,
+ "ippPurchaseMultiple":null,
+ "ippStatus":null,
+ "simpleMultipleCodeProductList":[
+
+ ],
+ "activityAmount":0,
+ "couponAmount":0,
+ "activityUnitAmount":0,
+ "couponUnitAmount":null,
+ "activityBasicId":null,
+ "useLimitStart":null,
+ "lineNumberOrg":1,
+ "ptbfa1":null,
+ "ptbfa2":null,
+ "ptbfa3":null,
+ "ptbfa4":null,
+ "ptbfa5":null,
+ "yapeiPriceId":null,
+ "areaName":null,
+ "agreementPriceId":null,
+ "offerPrice":null,
+ "limitNum":null,
+ "productLimitBuyId":null,
+ "alreadyBuyNum":null,
+ "takeEffectRange":null,
+ "limitBuySign":0,
+ "overdueSign":0,
+ "sxPrice":null,
+ "invalidStr":null,
+ "submitTime":"2023-09-18T11:47:28.000+0000",
+ "manufacturerUserNo":null,
+ "manufacturerUserDesc":null,
+ "manufacturerProductNo":"018",
+ "manufacturerProductDesc":"威尔特",
+ "manufacturerUserId":null,
+ "manufacturerProductId":175,
+ "groupId":null,
+ "groupNumber":1,
+ "groupProductType":null,
+ "groupCode":null,
+ "giftSign":0,
+ "giftProductCode":"10145929",
+ "description":"",
+ "demandCode":"16950376476542072",
+ "lineNum":1,
+ "threeRebateBalance":null,
+ "threeRebateMaxScale":null,
+ "rebateTripId":null,
+ "companyType":null,
+ "busProductCode":null,
+ "rebateControlSign":0,
+ "rebateRule":null,
+ "hospitalHopeDate":null,
+ "uniqueKey":null,
+ "activityRuleId":null,
+ "differenceActivityUserId":null,
+ "replaceSgin":0,
+ "skuGroup":{
+
+ },
+ "fsGroupId":null,
+ "demandSkuVOList":null,
+ "companyCode":null,
+ "demandId":null,
+ "dataJson":null,
+ "lineNumber":null,
+ "freseniusPriceId":null,
+ "groupSpitSign":0,
+ "plusMinuKey":null,
+ "purchaseEntryId":null,
+ "activityType":0,
+ "giftSettlementMethod":null,
+ "giftInitQuantity":null,
+ "packageCode":null,
+ "installedDate":null,
+ "propertyName":null,
+ "propertyVal":null,
+ "propertyNote":null,
+ "sdOutStorage":0,
+ "lineCodeDelete":1,
+ "showState":true,
+ "purchaseZeroProductList":[
+
+ ],
+ "giftList":[
+
+ ],
+ "selectGiftArr":[
+
+ ]
+ }
+ ],
+ "demandSubItems":[
+ {
+ "demandId":41632,
+ "demandParentId":39610,
+ "demandParentCode":"s2309181900001",
+ "demandCode":"16950376476542072",
+ "customerId":130,
+ "customerName":"北京海德锐视科技有限公司",
+ "customerCode":1000086,
+ "loginName":"Test001",
+ "realName":"王春晖",
+ "addressNumber":19199,
+ "mobile":"18008613535",
+ "productName":null,
+ "productCode":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "paymentType":1,
+ "receiveBankName":"国药集团联合医疗器械有限公司",
+ "receiveBankAccount":"108902839271937437",
+ "paymentAmount":100,
+ "productAmount":100,
+ "payableAmount":100,
+ "refundAmount":0,
+ "cancelAmount":0,
+ "discountAmount":0,
+ "orderStatus":102,
+ "refundStatus":null,
+ "receiverName":"查杉",
+ "receiverContact":"18999998888",
+ "receiverAddress":"上海市普啊撒旦吉萨",
+ "remark":null,
+ "revokedReason":null,
+ "auditById":null,
+ "auditByName":null,
+ "auditTime":null,
+ "auditRemark":null,
+ "flhsStatus":0,
+ "pushJdeStatus":null,
+ "createTime":null,
+ "updateTime":null,
+ "submitTime":null,
+ "pushJdeTime":null,
+ "successTime":null,
+ "auditStatus":1,
+ "deleteSign":0,
+ "firstOrderFlag":0,
+ "demandItems":null,
+ "demandSubItems":[
+ {
+ "demandSkuId":29940,
+ "demandId":null,
+ "distributionId":null,
+ "companyCode":null,
+ "demandCode":"16950376476542072",
+ "demandParentId":null,
+ "sellerCompanyId":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "customerCode":1000086,
+ "productLineCode":null,
+ "productLineName":null,
+ "propertyStr":null,
+ "storageType":"999",
+ "suppDist":null,
+ "productId":10,
+ "productName":"威尔特",
+ "productCode":"10145929",
+ "productNature":null,
+ "brandName":null,
+ "optionStr":"1",
+ "imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg",
+ "lineNumber":null,
+ "price":100,
+ "rebateId":null,
+ "originalPrice":null,
+ "biddingDiscountTax":null,
+ "salesDiscountTax":null,
+ "quantity":1,
+ "sumQuantity":null,
+ "sendQuantity":null,
+ "lackQuantity":null,
+ "cancelQuantity":null,
+ "cancelAmount":null,
+ "refundQuantity":null,
+ "refundAmount":null,
+ "discountQuantity":null,
+ "discountAmount":null,
+ "subtotal":100,
+ "measuringUnit":"个",
+ "auxiliaryMeasuringUnit":null,
+ "procurementMeasuringUnit":null,
+ "pricingMeasuringUnit":null,
+ "materialCode":"",
+ "manufacturer":"北京康思润业生物技术有限公司-黄翼",
+ "produceRegisterNum":null,
+ "riskRank":null,
+ "productClassify":null,
+ "createTime":null,
+ "updateTime":null,
+ "deleteSign":null,
+ "calCancelFlag":null,
+ "refundFlag":null,
+ "discountRate":0,
+ "realPay":100,
+ "promotionPrice":0,
+ "promotionTotalPrice":0,
+ "demandParentCode":null,
+ "regionId":null,
+ "regionName":null,
+ "spitSign":null,
+ "activityAmount":0,
+ "couponAmount":0,
+ "activityUnitAmount":0,
+ "couponUnitAmount":null,
+ "activityBasicId":null,
+ "couponSgin":null,
+ "couponSgin2":null,
+ "returnQuantity":null,
+ "returnAmount":null,
+ "customerId":null,
+ "prescription":null,
+ "specifications":null,
+ "lineCodeDelete":1,
+ "sdOutStorage":0,
+ "licenseNo":null,
+ "demandCodes":null,
+ "areaName":null,
+ "agreementPriceId":null,
+ "offerPrice":null,
+ "orderMark":null,
+ "totalPrice":null,
+ "productLimitBuyList":null,
+ "giftSign":0,
+ "giftProductCode":"10145929",
+ "activityCarDataVoList":null,
+ "orderSource":null,
+ "receiverName":null,
+ "receiverContact":null,
+ "receiverAddress":null,
+ "rebateTripId":null,
+ "allSign":null,
+ "salesReturn":null,
+ "nowAmount":null,
+ "taxSign":0,
+ "plusMinuKey":null,
+ "rebateRule":null,
+ "lockType":null,
+ "lineNumberOrg":1,
+ "changeSgin":null,
+ "addSgin":null,
+ "ptbfa1":null,
+ "ptbfa2":null,
+ "ptbfa3":null,
+ "ptbfa4":null,
+ "ptbfa5":null,
+ "yapeiPriceId":null,
+ "ypLinePromotion":null,
+ "yapeiPrice":null,
+ "companyId":null,
+ "buyerCartId":null,
+ "userReceiveIdx":null,
+ "userReceiveIdx2":null,
+ "limitNum":null,
+ "productLimitBuyId":null,
+ "alreadyBuyNum":null,
+ "limitBuySign":0,
+ "proposeNum":null,
+ "takeEffectRange":null,
+ "takeEffectTime":null,
+ "endTime1":null,
+ "groupId":null,
+ "fsGroupId":null,
+ "proposalQuantity":null,
+ "proposalSign":0,
+ "manufacturerUserNo":null,
+ "manufacturerUserDesc":null,
+ "manufacturerProductNo":"018",
+ "manufacturerProductDesc":"威尔特",
+ "manufacturerUserId":null,
+ "manufacturerProductId":175,
+ "busProductCode":null,
+ "paidTime":null,
+ "customerName":null,
+ "paymentAmount":null,
+ "specQuantity":null,
+ "disQuantity":null,
+ "fulfilledQuantity":null,
+ "fulCancelQuantity":null,
+ "couponId":null,
+ "couponId2":null,
+ "limitS":null,
+ "starts":null,
+ "ends":null,
+ "userId":null,
+ "productTax":null,
+ "taxRate":0.17,
+ "demandSplitSign":null,
+ "hospitalHopeDate":null,
+ "uniqueKey":null,
+ "productType":null,
+ "activityRuleId":null,
+ "allowanceBeginTime":null,
+ "allowanceEndTime":null,
+ "sign":null,
+ "differenceActivityUserId":null,
+ "groupNumber":1,
+ "groupName":null,
+ "skuGroup":{
+ "id":null,
+ "groupId":null,
+ "companyCode":null,
+ "groupProductType":null,
+ "createTime":null,
+ "updateTime":null,
+ "demandSkuId":null,
+ "demandId":null,
+ "dataJson":null,
+ "lineNumber":null,
+ "freseniusPriceId":null,
+ "groupNumber":null,
+ "demandSkuList":null,
+ "demandSkuVOList":null
+ },
+ "subList":null,
+ "dataJson":null,
+ "skuMergeSign":"10145929-100-0-0-0-100",
+ "freseniusPriceId":null,
+ "quantityAndGroupAll":null,
+ "booleaTime":null,
+ "spitSgin":0,
+ "groupSpitSign":0,
+ "purchaseEntryId":null,
+ "activityType":0,
+ "giftSettlementMethod":null,
+ "giftInitQuantity":null,
+ "packageCode":null,
+ "giftGroupQuantity":null,
+ "mustInstallDate":false,
+ "installedDate":null,
+ "installedDateStr":"",
+ "demandLines":null,
+ "subLineNumber":null,
+ "demandSubCode":null,
+ "propertyName":null,
+ "propertyVal":null,
+ "propertyNote":null,
+ "sendManualSign":0,
+ "sort":0,
+ "circleArea":null,
+ "siteCompanyCode":null,
+ "hospitalOrderType":null,
+ "isCollectionAllocation":null,
+ "orderStatus":null,
+ "distributionType":null,
+ "groupCode":null,
+ "groupProductType":null,
+ "pSign":0,
+ "backSign":0,
+ "description":"",
+ "stockNumber":"0",
+ "rebate":false,
+ "shipmentType":0,
+ "isRebate":"0",
+ "hideInTable":false
+ }
+ ],
+ "rebateDetail":null,
+ "rebateAmountList":null,
+ "productLineCode":null,
+ "productLineName":null,
+ "auditLoginName":null,
+ "showPurchaseNo":false,
+ "isRebate":null,
+ "isShowReate":1,
+ "taxRate":0.17,
+ "rebateType":0,
+ "paymentAmountWholeLine":null,
+ "discountAmountWholeLine":null,
+ "payableAmountWholeLine":null,
+ "discountRate":0,
+ "singleRebateAmount":null,
+ "isRebateEdit":0,
+ "payCertUrl":null,
+ "rebateAmount":0,
+ "demandCance":0,
+ "soAdd":0,
+ "soCance":0,
+ "orderReturn":0,
+ "needCustomerConfirm":false,
+ "measuringUnit":null,
+ "productId":null,
+ "version":null,
+ "mainVersion":null,
+ "agencyConfigId":null,
+ "confirmSign":null,
+ "replySign":null,
+ "agencySign":null,
+ "editIng":0,
+ "editIngStr":null,
+ "jdeType":0,
+ "isElectronicSeal":null,
+ "contractAgreementNo":"SD销售合同",
+ "alesDepartmentNo":"102007",
+ "alesDepartmentName":"国联销售服务部",
+ "salesPersonNo":"17000263",
+ "salesPersonName":"卢温东",
+ "customerNote":"",
+ "otherNote":"",
+ "contractAgreementCode":"",
+ "projectName":"赛多利斯纯水设备",
+ "projectCode":"16000609",
+ "regionId":null,
+ "regionName":null,
+ "productLineBindSign":0,
+ "shipVia":"2",
+ "orderSource":2,
+ "userBalance":null,
+ "liquidCode":"02",
+ "shipmentTypeStr":"",
+ "specifications":null,
+ "pageStart":null,
+ "pageSize":null,
+ "changeSgin":0,
+ "yapei":2,
+ "companyId":null,
+ "userReceiveId2":null,
+ "preemptConfig":null,
+ "productSpec":1,
+ "secondAuditSign":0,
+ "secondAuditById":null,
+ "secondAuditByName":null,
+ "secondAuditTime":null,
+ "secondAuditRemark":null,
+ "secondAuditStatus":null,
+ "rebateRule":null,
+ "rebateControlSign":0,
+ "rebateId":null,
+ "preferenceType":null,
+ "preferenceName":null,
+ "disPrice":null,
+ "lineNum":0,
+ "auditStaySign":0,
+ "fileList":null,
+ "imageUrls":null,
+ "total":null,
+ "submitTimeStr":"2023-09-18 19:47:28",
+ "updateTimeStr":"2023-09-18 19:47:27",
+ "auditTimeStr":null,
+ "acceptTime":null,
+ "acceptTimeStr":null,
+ "paidTime":null,
+ "paidTimeStr":null,
+ "erpHandingTime":null,
+ "erpHandingTimeStr":null,
+ "partShippingTime":null,
+ "partShippingTimeStr":null,
+ "allShippingTime":null,
+ "allShippingTimeStr":null,
+ "pushJdeTimeStr":null,
+ "successTimeStr":null,
+ "onlinePaySuccessTime":null,
+ "onlinePaySuccessTimeStr":null,
+ "bankTransactionSerial":null,
+ "newIsTax":null,
+ "countFormula":null,
+ "countNumber":null,
+ "noTaxRebateAmount":0,
+ "isCollectionAllocation":0,
+ "siteCompanyCode":null,
+ "hospitalOrderType":null,
+ "proofTime":null,
+ "proofURL":null,
+ "proofRemark":null,
+ "proofSign":0,
+ "customerCancelSign":0,
+ "cancelRecords":[
+
+ ],
+ "cancelCount":0,
+ "updateNewTime":null,
+ "updateNewTimeStr":null,
+ "fsDedUseSign":0,
+ "preDisSign":0,
+ "shareType":null,
+ "singleRebateSign":null,
+ "cf":false,
+ "notice":null,
+ "isPre":null,
+ "showDemandAuditLineLabel":false,
+ "orderType":null,
+ "newDiscountRate":null,
+ "oldOrderType":null,
+ "oldNewDiscountRate":null,
+ "pendding":null,
+ "pushJdeStatusDemandSub":[
+ {
+ "demandSubId":68544,
+ "demandId":41632,
+ "demandParentId":39610,
+ "demandCode":"16950376476542072",
+ "demandSubCode":"16950376476542072",
+ "customerId":130,
+ "customerName":"北京海德锐视科技有限公司",
+ "customerCode":1000086,
+ "loginName":"Test001",
+ "realName":"王春晖",
+ "addressNumber":19199,
+ "mobile":"18008613535",
+ "productLineCode":null,
+ "productLineName":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "productAmount":100,
+ "cancelAmount":0,
+ "payableAmount":0,
+ "discountAmount":0,
+ "receiverName":"查杉",
+ "receiverContact":"18999998888",
+ "receiverAddress":"上海市普啊撒旦吉萨",
+ "remark":null,
+ "pushJdeStatus":null,
+ "submitTime":"2023-09-18T11:47:28.000+0000",
+ "pushJdeTime":null,
+ "successTime":null,
+ "deleteSign":null,
+ "taxRate":0.17,
+ "singleRebateAmount":null,
+ "rebateType":0,
+ "isRebateEdit":0,
+ "discountRate":0,
+ "changeType":null,
+ "payCertUrl":null,
+ "rebateAmount":0,
+ "demandCance":0,
+ "soAdd":0,
+ "soCance":0,
+ "orderReturn":0,
+ "needCustomerConfirm":false,
+ "isEdit":null,
+ "agencyConfigId":null,
+ "confirmSign":null,
+ "replySign":null,
+ "contractAgreementNo":null,
+ "alesDepartmentNo":null,
+ "alesDepartmentName":null,
+ "salesPersonNo":null,
+ "salesPersonName":null,
+ "customerNote":"",
+ "otherNote":null,
+ "jdeType":0,
+ "shipVia":null,
+ "contractAgreementCode":null,
+ "projectName":null,
+ "projectCode":null,
+ "orderSource":2,
+ "regionId":null,
+ "regionName":null,
+ "receiverNote":null,
+ "receiverPhoneNote":null,
+ "receiverAddressNote":null,
+ "addressNoNote":17986,
+ "rebateValidity":null,
+ "liquidCode":null,
+ "promotionType":1,
+ "activityTotalAmount":null,
+ "couponTotalAmount":null,
+ "userReceiveId":null,
+ "editSgin":0,
+ "snSgin":0,
+ "totalAllPaAmount":null,
+ "jdeOutAmount":null,
+ "diffShowSgin":0,
+ "changeSgin":0,
+ "yapei":2,
+ "acrossMainCode":null,
+ "sdCancelTime":null,
+ "sdTipSign":0,
+ "customerCharge":8,
+ "isElectronicSeal":null,
+ "userReceiveId2":null,
+ "inventoryNode":null,
+ "customCode":null,
+ "terminalSource":1,
+ "confirmReceiptSign":null,
+ "confirmReceiptTime":null,
+ "deliveryCompletedTime":null,
+ "taxSign":0,
+ "delay":null,
+ "rebateControlSign":0,
+ "erpRejectTime":null,
+ "erpHandingTime":null,
+ "allShippingTime":null,
+ "partShippingTime":null,
+ "confirmTime":null,
+ "noTaxRebateAmount":0,
+ "newIsTax":null,
+ "countFormula":null,
+ "countNumber":null,
+ "siteCompanyCode":null,
+ "hospitalOrderType":null,
+ "shipmentType":null,
+ "distributionType":null,
+ "isShowReate":null,
+ "spitSgin":null,
+ "detailIsSpit":false,
+ "createTime":"2023-09-18T11:47:27.000+0000",
+ "updateTime":"2023-09-18T11:47:27.000+0000",
+ "paymentAmount":null,
+ "demandSubItems":null,
+ "sdlnty":null
+ }
+ ],
+ "circleGiftSign":0,
+ "delay":0,
+ "limitS":null,
+ "starts":null,
+ "ends":null,
+ "completedS":null,
+ "confirmDays":null,
+ "remindS":null,
+ "skuGroupList":null,
+ "groupProductType":0,
+ "purchaseId":18,
+ "purchaseCode":"P2306281500002",
+ "sdCancelTime":null,
+ "sdTipSign":0,
+ "receiverNote":null,
+ "receiverPhoneNote":null,
+ "receiverAddressNote":null,
+ "flag":null,
+ "sourceStr":null,
+ "addressNoNote":"17986",
+ "detailIsSpit":false,
+ "spitSgin":null,
+ "distributionType":"2",
+ "rebateValidity":null,
+ "orderChangeType":null,
+ "logoIcon":null,
+ "detail":null,
+ "changeBigType":null,
+ "promotionType":1,
+ "activityTotalAmount":0,
+ "couponTotalAmount":0,
+ "userReceiveId":null,
+ "editSgin":0,
+ "snSgin":0,
+ "jdeOutAmount":null,
+ "totalAllPaAmount":null,
+ "diffShowSgin":0,
+ "lineCodeDelete":0,
+ "startTime":null,
+ "endTime":null,
+ "changeSign":null,
+ "distributionId":null,
+ "limitBuySign":0,
+ "companyType":"2",
+ "afterSale":null,
+ "csId":null,
+ "sdStatusNodeParamList":null,
+ "ypPromotionTotal":null,
+ "acrossMainCode":null,
+ "forceApprovedSign":0,
+ "circleGiftContinueSgin":0,
+ "customerCharge":8,
+ "onlinePaySign":0,
+ "recodeDemandSkuList":null,
+ "mergeDemandSkuList":null,
+ "inventoryNode":null,
+ "customCode":null,
+ "terminalSource":1,
+ "potentialClientsId":null,
+ "settlementStatus":"000",
+ "firstOrderAuditStatus":null,
+ "confirmReceiptSign":"0",
+ "confirmReceiptTime":null,
+ "afterSaleDays":null,
+ "deliveryCompletedTime":null,
+ "taxSign":0,
+ "orderSplitSign":0,
+ "demandRebateSkuList":null,
+ "confirmTime":null,
+ "customerPurchaseNo":null,
+ "mustInstallDate":false,
+ "secondAddressList":null,
+ "splitOrMerge":0,
+ "spitOrderSign":1,
+ "productAmountWholeLine":null,
+ "auditCompanyName":null,
+ "auditCompanyNameCode":null,
+ "edit":false,
+ "serialNumber":1,
+ "lockHover":false,
+ "shipmentType":0,
+ "activityAmount":0,
+ "couponAmount":0
+ }
+ ],
+ "rebateDetail":null,
+ "rebateAmountList":null,
+ "productLineCode":null,
+ "productLineName":null,
+ "auditLoginName":null,
+ "showPurchaseNo":false,
+ "isRebate":null,
+ "isShowReate":1,
+ "taxRate":0.17,
+ "rebateType":0,
+ "paymentAmountWholeLine":null,
+ "discountAmountWholeLine":null,
+ "payableAmountWholeLine":null,
+ "discountRate":0,
+ "singleRebateAmount":null,
+ "isRebateEdit":0,
+ "payCertUrl":null,
+ "rebateAmount":0,
+ "demandCance":0,
+ "soAdd":0,
+ "soCance":0,
+ "orderReturn":0,
+ "needCustomerConfirm":false,
+ "measuringUnit":null,
+ "productId":null,
+ "version":null,
+ "mainVersion":null,
+ "agencyConfigId":null,
+ "confirmSign":null,
+ "replySign":null,
+ "agencySign":null,
+ "editIng":0,
+ "editIngStr":null,
+ "jdeType":0,
+ "isElectronicSeal":0,
+ "contractAgreementNo":null,
+ "alesDepartmentNo":null,
+ "alesDepartmentName":null,
+ "salesPersonNo":null,
+ "salesPersonName":null,
+ "customerNote":"",
+ "otherNote":null,
+ "contractAgreementCode":null,
+ "projectName":null,
+ "projectCode":null,
+ "regionId":null,
+ "regionName":null,
+ "productLineBindSign":0,
+ "shipVia":1,
+ "orderSource":2,
+ "userBalance":null,
+ "liquidCode":null,
+ "shipmentTypeStr":"",
+ "specifications":null,
+ "pageStart":null,
+ "pageSize":null,
+ "changeSgin":0,
+ "yapei":2,
+ "companyId":null,
+ "userReceiveId2":null,
+ "preemptConfig":null,
+ "productSpec":1,
+ "secondAuditSign":0,
+ "secondAuditById":"",
+ "secondAuditByName":"",
+ "secondAuditTime":null,
+ "secondAuditRemark":null,
+ "secondAuditStatus":null,
+ "rebateRule":null,
+ "rebateControlSign":0,
+ "rebateId":null,
+ "preferenceType":null,
+ "preferenceName":null,
+ "disPrice":null,
+ "lineNum":0,
+ "auditStaySign":0,
+ "fileList":null,
+ "imageUrls":null,
+ "total":null,
+ "submitTimeStr":"2023-09-18 19:47:28",
+ "updateTimeStr":"2023-09-18 19:47:27",
+ "auditTimeStr":null,
+ "acceptTime":null,
+ "acceptTimeStr":null,
+ "paidTime":null,
+ "paidTimeStr":null,
+ "erpHandingTime":null,
+ "erpHandingTimeStr":null,
+ "partShippingTime":null,
+ "partShippingTimeStr":null,
+ "allShippingTime":null,
+ "allShippingTimeStr":null,
+ "pushJdeTimeStr":null,
+ "successTimeStr":null,
+ "onlinePaySuccessTime":null,
+ "onlinePaySuccessTimeStr":null,
+ "bankTransactionSerial":null,
+ "newIsTax":null,
+ "countFormula":null,
+ "countNumber":null,
+ "noTaxRebateAmount":0,
+ "isCollectionAllocation":0,
+ "siteCompanyCode":null,
+ "hospitalOrderType":null,
+ "proofTime":null,
+ "proofURL":null,
+ "proofRemark":null,
+ "proofSign":0,
+ "customerCancelSign":0,
+ "cancelRecords":[
+
+ ],
+ "cancelCount":0,
+ "updateNewTime":null,
+ "updateNewTimeStr":null,
+ "fsDedUseSign":0,
+ "preDisSign":0,
+ "shareType":null,
+ "singleRebateSign":null,
+ "cf":false,
+ "notice":null,
+ "isPre":null,
+ "showDemandAuditLineLabel":false,
+ "orderType":null,
+ "newDiscountRate":null,
+ "oldOrderType":null,
+ "oldNewDiscountRate":null,
+ "pendding":null,
+ "pushJdeStatusDemandSub":[
+ {
+ "demandSubId":68544,
+ "demandId":41632,
+ "demandParentId":39610,
+ "demandCode":"16950376476542072",
+ "demandSubCode":"16950376476542072",
+ "customerId":130,
+ "customerName":"北京海德锐视科技有限公司",
+ "customerCode":1000086,
+ "loginName":"Test001",
+ "realName":"王春晖",
+ "addressNumber":19199,
+ "mobile":"18008613535",
+ "productLineCode":null,
+ "productLineName":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "productAmount":100,
+ "cancelAmount":0,
+ "payableAmount":0,
+ "discountAmount":0,
+ "receiverName":"查杉",
+ "receiverContact":"18999998888",
+ "receiverAddress":"上海市普啊撒旦吉萨",
+ "remark":null,
+ "pushJdeStatus":null,
+ "submitTime":"2023-09-18T11:47:28.000+0000",
+ "pushJdeTime":null,
+ "successTime":null,
+ "deleteSign":null,
+ "taxRate":0.17,
+ "singleRebateAmount":null,
+ "rebateType":0,
+ "isRebateEdit":0,
+ "discountRate":0,
+ "changeType":null,
+ "payCertUrl":null,
+ "rebateAmount":0,
+ "demandCance":0,
+ "soAdd":0,
+ "soCance":0,
+ "orderReturn":0,
+ "needCustomerConfirm":false,
+ "isEdit":null,
+ "agencyConfigId":null,
+ "confirmSign":null,
+ "replySign":null,
+ "contractAgreementNo":null,
+ "alesDepartmentNo":null,
+ "alesDepartmentName":null,
+ "salesPersonNo":null,
+ "salesPersonName":null,
+ "customerNote":"",
+ "otherNote":null,
+ "jdeType":0,
+ "shipVia":null,
+ "contractAgreementCode":null,
+ "projectName":null,
+ "projectCode":null,
+ "orderSource":2,
+ "regionId":null,
+ "regionName":null,
+ "receiverNote":null,
+ "receiverPhoneNote":null,
+ "receiverAddressNote":null,
+ "addressNoNote":17986,
+ "rebateValidity":null,
+ "liquidCode":null,
+ "promotionType":1,
+ "activityTotalAmount":null,
+ "couponTotalAmount":null,
+ "userReceiveId":null,
+ "editSgin":0,
+ "snSgin":0,
+ "totalAllPaAmount":null,
+ "jdeOutAmount":null,
+ "diffShowSgin":0,
+ "changeSgin":0,
+ "yapei":2,
+ "acrossMainCode":null,
+ "sdCancelTime":null,
+ "sdTipSign":0,
+ "customerCharge":8,
+ "isElectronicSeal":null,
+ "userReceiveId2":null,
+ "inventoryNode":null,
+ "customCode":null,
+ "terminalSource":1,
+ "confirmReceiptSign":null,
+ "confirmReceiptTime":null,
+ "deliveryCompletedTime":null,
+ "taxSign":0,
+ "delay":null,
+ "rebateControlSign":0,
+ "erpRejectTime":null,
+ "erpHandingTime":null,
+ "allShippingTime":null,
+ "partShippingTime":null,
+ "confirmTime":null,
+ "noTaxRebateAmount":0,
+ "newIsTax":null,
+ "countFormula":null,
+ "countNumber":null,
+ "siteCompanyCode":null,
+ "hospitalOrderType":null,
+ "shipmentType":null,
+ "distributionType":null,
+ "isShowReate":null,
+ "spitSgin":null,
+ "detailIsSpit":false,
+ "createTime":"2023-09-18T11:47:27.000+0000",
+ "updateTime":"2023-09-18T11:47:27.000+0000",
+ "paymentAmount":null,
+ "demandSubItems":null,
+ "sdlnty":null
+ }
+ ],
+ "circleGiftSign":0,
+ "delay":0,
+ "limitS":null,
+ "starts":null,
+ "ends":null,
+ "completedS":null,
+ "confirmDays":null,
+ "remindS":null,
+ "skuGroupList":null,
+ "groupProductType":0,
+ "purchaseId":18,
+ "purchaseCode":"P2306281500002",
+ "sdCancelTime":null,
+ "sdTipSign":0,
+ "receiverNote":null,
+ "receiverPhoneNote":null,
+ "receiverAddressNote":null,
+ "flag":null,
+ "sourceStr":null,
+ "addressNoNote":17986,
+ "detailIsSpit":false,
+ "spitSgin":null,
+ "distributionType":null,
+ "rebateValidity":null,
+ "orderChangeType":null,
+ "logoIcon":null,
+ "detail":null,
+ "changeBigType":null,
+ "promotionType":1,
+ "activityTotalAmount":0,
+ "couponTotalAmount":null,
+ "userReceiveId":null,
+ "editSgin":0,
+ "snSgin":0,
+ "jdeOutAmount":null,
+ "totalAllPaAmount":null,
+ "diffShowSgin":0,
+ "lineCodeDelete":0,
+ "startTime":null,
+ "endTime":null,
+ "changeSign":null,
+ "distributionId":null,
+ "limitBuySign":0,
+ "companyType":"2",
+ "afterSale":null,
+ "csId":null,
+ "sdStatusNodeParamList":null,
+ "ypPromotionTotal":null,
+ "acrossMainCode":null,
+ "forceApprovedSign":0,
+ "circleGiftContinueSgin":0,
+ "customerCharge":8,
+ "onlinePaySign":0,
+ "recodeDemandSkuList":null,
+ "mergeDemandSkuList":[
+ {
+ "demandSkuId":29940,
+ "demandId":null,
+ "distributionId":null,
+ "companyCode":null,
+ "demandCode":"16950376476542072",
+ "demandParentId":null,
+ "sellerCompanyId":null,
+ "sellerCompanyName":"国药集团联合医疗器械有限公司",
+ "sellerCompanyCode":"00102",
+ "customerCode":1000086,
+ "productLineCode":null,
+ "productLineName":null,
+ "propertyStr":null,
+ "storageType":"999",
+ "suppDist":null,
+ "productId":10,
+ "productName":"威尔特",
+ "productCode":"10145929",
+ "productNature":null,
+ "brandName":null,
+ "optionStr":"1",
+ "imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg",
+ "lineNumber":null,
+ "price":100,
+ "rebateId":null,
+ "originalPrice":null,
+ "biddingDiscountTax":null,
+ "salesDiscountTax":null,
+ "quantity":1,
+ "sumQuantity":null,
+ "sendQuantity":null,
+ "lackQuantity":null,
+ "cancelQuantity":null,
+ "cancelAmount":null,
+ "refundQuantity":null,
+ "refundAmount":null,
+ "discountQuantity":null,
+ "discountAmount":null,
+ "subtotal":100,
+ "measuringUnit":"个",
+ "auxiliaryMeasuringUnit":null,
+ "procurementMeasuringUnit":null,
+ "pricingMeasuringUnit":null,
+ "materialCode":"",
+ "manufacturer":"北京康思润业生物技术有限公司-黄翼",
+ "produceRegisterNum":null,
+ "riskRank":null,
+ "productClassify":null,
+ "createTime":null,
+ "updateTime":null,
+ "deleteSign":null,
+ "calCancelFlag":null,
+ "refundFlag":null,
+ "discountRate":0,
+ "realPay":100,
+ "promotionPrice":0,
+ "promotionTotalPrice":0,
+ "demandParentCode":null,
+ "regionId":null,
+ "regionName":null,
+ "spitSign":null,
+ "activityAmount":0,
+ "couponAmount":0,
+ "activityUnitAmount":0,
+ "couponUnitAmount":null,
+ "activityBasicId":null,
+ "couponSgin":null,
+ "couponSgin2":null,
+ "returnQuantity":null,
+ "returnAmount":null,
+ "customerId":null,
+ "prescription":null,
+ "specifications":null,
+ "lineCodeDelete":1,
+ "sdOutStorage":0,
+ "licenseNo":null,
+ "demandCodes":null,
+ "areaName":null,
+ "agreementPriceId":null,
+ "offerPrice":null,
+ "orderMark":null,
+ "totalPrice":null,
+ "productLimitBuyList":null,
+ "giftSign":0,
+ "giftProductCode":"10145929",
+ "activityCarDataVoList":null,
+ "orderSource":null,
+ "receiverName":null,
+ "receiverContact":null,
+ "receiverAddress":null,
+ "rebateTripId":null,
+ "allSign":null,
+ "salesReturn":null,
+ "nowAmount":null,
+ "taxSign":0,
+ "plusMinuKey":null,
+ "rebateRule":null,
+ "lockType":null,
+ "lineNumberOrg":1,
+ "changeSgin":null,
+ "addSgin":null,
+ "ptbfa1":null,
+ "ptbfa2":null,
+ "ptbfa3":null,
+ "ptbfa4":null,
+ "ptbfa5":null,
+ "yapeiPriceId":null,
+ "ypLinePromotion":null,
+ "yapeiPrice":null,
+ "companyId":null,
+ "buyerCartId":null,
+ "userReceiveIdx":null,
+ "userReceiveIdx2":null,
+ "limitNum":null,
+ "productLimitBuyId":null,
+ "alreadyBuyNum":null,
+ "limitBuySign":0,
+ "proposeNum":null,
+ "takeEffectRange":null,
+ "takeEffectTime":null,
+ "endTime1":null,
+ "groupId":null,
+ "fsGroupId":null,
+ "proposalQuantity":null,
+ "proposalSign":0,
+ "manufacturerUserNo":null,
+ "manufacturerUserDesc":null,
+ "manufacturerProductNo":"018",
+ "manufacturerProductDesc":"威尔特",
+ "manufacturerUserId":null,
+ "manufacturerProductId":175,
+ "busProductCode":null,
+ "paidTime":null,
+ "customerName":null,
+ "paymentAmount":null,
+ "specQuantity":null,
+ "disQuantity":null,
+ "fulfilledQuantity":null,
+ "fulCancelQuantity":null,
+ "couponId":null,
+ "couponId2":null,
+ "limitS":null,
+ "starts":null,
+ "ends":null,
+ "userId":null,
+ "productTax":null,
+ "taxRate":0.17,
+ "demandSplitSign":null,
+ "hospitalHopeDate":null,
+ "uniqueKey":null,
+ "productType":null,
+ "activityRuleId":null,
+ "allowanceBeginTime":null,
+ "allowanceEndTime":null,
+ "sign":null,
+ "differenceActivityUserId":null,
+ "groupNumber":1,
+ "groupName":null,
+ "skuGroup":{
+ "id":null,
+ "groupId":null,
+ "companyCode":null,
+ "groupProductType":null,
+ "createTime":null,
+ "updateTime":null,
+ "demandSkuId":null,
+ "demandId":null,
+ "dataJson":null,
+ "lineNumber":null,
+ "freseniusPriceId":null,
+ "groupNumber":null,
+ "demandSkuList":null,
+ "demandSkuVOList":null
+ },
+ "subList":null,
+ "dataJson":null,
+ "skuMergeSign":"10145929-100-0-0-0-100",
+ "freseniusPriceId":null,
+ "quantityAndGroupAll":null,
+ "booleaTime":null,
+ "spitSgin":0,
+ "groupSpitSign":0,
+ "purchaseEntryId":null,
+ "activityType":0,
+ "giftSettlementMethod":null,
+ "giftInitQuantity":null,
+ "packageCode":null,
+ "giftGroupQuantity":null,
+ "mustInstallDate":false,
+ "installedDate":null,
+ "installedDateStr":"",
+ "demandLines":null,
+ "subLineNumber":null,
+ "demandSubCode":null,
+ "propertyName":null,
+ "propertyVal":null,
+ "propertyNote":null,
+ "sendManualSign":0,
+ "sort":0,
+ "circleArea":null,
+ "siteCompanyCode":null,
+ "hospitalOrderType":null,
+ "isCollectionAllocation":null,
+ "orderStatus":null,
+ "distributionType":null,
+ "groupCode":null,
+ "groupProductType":null,
+ "pSign":0,
+ "backSign":0,
+ "description":"",
+ "stockNumber":"0",
+ "rebate":false,
+ "shipmentType":0,
+ "isRebate":"0",
+ "hideInTable":false
+ }
+ ],
+ "inventoryNode":null,
+ "customCode":null,
+ "terminalSource":1,
+ "potentialClientsId":null,
+ "settlementStatus":"000",
+ "firstOrderAuditStatus":null,
+ "confirmReceiptSign":"0",
+ "confirmReceiptTime":null,
+ "afterSaleDays":null,
+ "deliveryCompletedTime":null,
+ "taxSign":0,
+ "orderSplitSign":0,
+ "demandRebateSkuList":null,
+ "confirmTime":null,
+ "customerPurchaseNo":null,
+ "mustInstallDate":false,
+ "secondAddressList":null,
+ "splitOrMerge":0,
+ "spitOrderSign":1,
+ "productAmountWholeLine":null,
+ "auditCompanyName":null,
+ "auditCompanyNameCode":null,
+ "edit":false,
+ "serialNumber":1,
+ "lockHover":false
+}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":null,"data":[],"freshToken":null}
+
+
+#多彩商场快速下单
+#步骤一登录多彩商城
+#多彩商城登录信息
+"username1": "Test001"
+"password1": "Aa123456"
+
+json_headers1: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+#步骤二创建并提交需求单
+#需求单创建接口地址
+"url4": "/order/public/saveAllDemandOrder"
+#需求单创建
+"payload4": {
+ "国药集团联合医疗器械有限公司": {
+ "datas": [
+ {
+ "demandId": null,
+ "demandParentId": null,
+ "demandParentCode": null,
+ "demandCode": null,
+ "customerId": null,
+ "customerName": null,
+ "customerCode": 1000086,
+ "loginName": null,
+ "realName": null,
+ "addressNumber": null,
+ "mobile": null,
+ "productName": null,
+ "productCode": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "paymentType": null,
+ "receiveBankName": null,
+ "receiveBankAccount": null,
+ "paymentAmount": "0.3300",
+ "productAmount": 0.33,
+ "payableAmount": 0.3333,
+ "refundAmount": null,
+ "cancelAmount": null,
+ "discountAmount": 0,
+ "orderStatus": null,
+ "refundStatus": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "remark": null,
+ "revokedReason": null,
+ "auditById": null,
+ "auditByName": null,
+ "auditTime": null,
+ "auditRemark": null,
+ "flhsStatus": null,
+ "pushJdeStatus": null,
+ "createTime": null,
+ "updateTime": null,
+ "submitTime": null,
+ "pushJdeTime": null,
+ "successTime": null,
+ "auditStatus": null,
+ "deleteSign": null,
+ "firstOrderFlag": null,
+ "demandItems": [
+ {
+ "demandSkuId": null,
+ "demandId": null,
+ "distributionId": null,
+ "companyCode": "00102",
+ "demandCode": null,
+ "demandParentId": null,
+ "sellerCompanyId": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "customerCode": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "propertyStr": null,
+ "storageType": "999",
+ "suppDist": null,
+ "productId": 111579,
+ "productName": "起搏电极导线-电商专用",
+ "productCode": "10212287",
+ "productNature": null,
+ "brandName": null,
+ "optionStr": "5075",
+ "imageUrl": null,
+ "lineNumber": null,
+ "price": 0.3333,
+ "rebateId": null,
+ "originalPrice": null,
+ "biddingDiscountTax": null,
+ "salesDiscountTax": null,
+ "quantity": 1,
+ "sumQuantity": null,
+ "sendQuantity": null,
+ "lackQuantity": null,
+ "cancelQuantity": null,
+ "cancelAmount": null,
+ "refundQuantity": null,
+ "refundAmount": null,
+ "discountQuantity": null,
+ "discountAmount": null,
+ "subtotal": 0.33,
+ "measuringUnit": "块",
+ "auxiliaryMeasuringUnit": null,
+ "procurementMeasuringUnit": null,
+ "pricingMeasuringUnit": null,
+ "materialCode": "",
+ "manufacturer": "11320766+李桂阳",
+ "produceRegisterNum": null,
+ "riskRank": null,
+ "productClassify": null,
+ "createTime": 1606823961000,
+ "updateTime": 1694624401000,
+ "deleteSign": null,
+ "calCancelFlag": null,
+ "refundFlag": null,
+ "discountRate": 100,
+ "realPay": 0.33,
+ "promotionPrice": null,
+ "promotionTotalPrice": 0,
+ "demandParentCode": null,
+ "regionId": null,
+ "regionName": null,
+ "spitSign": null,
+ "activityAmount": 0,
+ "couponAmount": 0,
+ "activityUnitAmount": 0,
+ "couponUnitAmount": null,
+ "activityBasicId": null,
+ "couponSgin": null,
+ "couponSgin2": null,
+ "returnQuantity": null,
+ "returnAmount": null,
+ "customerId": null,
+ "prescription": null,
+ "specifications": "5075",
+ "lineCodeDelete": null,
+ "sdOutStorage": null,
+ "licenseNo": null,
+ "demandCodes": null,
+ "areaName": null,
+ "agreementPriceId": null,
+ "offerPrice": null,
+ "orderMark": null,
+ "totalPrice": null,
+ "productLimitBuyList": null,
+ "giftSign": 0,
+ "giftProductCode": null,
+ "activityCarDataVoList": null,
+ "orderSource": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "rebateTripId": null,
+ "allSign": null,
+ "salesReturn": null,
+ "nowAmount": null,
+ "taxSign": 0,
+ "plusMinuKey": null,
+ "rebateRule": null,
+ "lockType": null,
+ "lineNumberOrg": null,
+ "changeSgin": null,
+ "addSgin": null,
+ "ptbfa1": null,
+ "ptbfa2": null,
+ "ptbfa3": null,
+ "ptbfa4": null,
+ "ptbfa5": null,
+ "yapeiPriceId": null,
+ "ypLinePromotion": null,
+ "yapeiPrice": null,
+ "companyId": 2,
+ "buyerCartId": null,
+ "userReceiveIdx": null,
+ "userReceiveIdx2": null,
+ "limitNum": null,
+ "productLimitBuyId": null,
+ "alreadyBuyNum": null,
+ "limitBuySign": 0,
+ "proposeNum": null,
+ "takeEffectRange": null,
+ "takeEffectTime": null,
+ "endTime1": null,
+ "groupId": null,
+ "fsGroupId": null,
+ "proposalQuantity": null,
+ "proposalSign": 0,
+ "manufacturerUserNo": null,
+ "manufacturerUserDesc": null,
+ "manufacturerProductNo": null,
+ "manufacturerProductDesc": null,
+ "manufacturerUserId": null,
+ "manufacturerProductId": null,
+ "busProductCode": null,
+ "paidTime": null,
+ "customerName": null,
+ "paymentAmount": null,
+ "specQuantity": null,
+ "disQuantity": null,
+ "fulfilledQuantity": null,
+ "fulCancelQuantity": null,
+ "couponId": null,
+ "couponId2": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "userId": null,
+ "productTax": "",
+ "taxRate": 0.17,
+ "demandSplitSign": "1",
+ "hospitalHopeDate": null,
+ "uniqueKey": null,
+ "productType": null,
+ "activityRuleId": null,
+ "allowanceBeginTime": null,
+ "allowanceEndTime": null,
+ "sign": null,
+ "differenceActivityUserId": null,
+ "groupNumber": null,
+ "groupName": null,
+ "skuGroup": null,
+ "subList": null,
+ "dataJson": null,
+ "skuMergeSign": null,
+ "freseniusPriceId": null,
+ "quantityAndGroupAll": null,
+ "booleaTime": null,
+ "spitSgin": 0,
+ "groupSpitSign": 0,
+ "purchaseEntryId": null,
+ "activityType": 0,
+ "giftSettlementMethod": null,
+ "giftInitQuantity": null,
+ "packageCode": null,
+ "giftGroupQuantity": null,
+ "mustInstallDate": false,
+ "installedDate": null,
+ "installedDateStr": null,
+ "demandLines": null,
+ "subLineNumber": null,
+ "demandSubCode": null,
+ "propertyName": null,
+ "propertyVal": null,
+ "propertyNote": null,
+ "sendManualSign": 0,
+ "sort": 0,
+ "circleArea": null,
+ "siteCompanyCode": "",
+ "hospitalOrderType": null,
+ "isCollectionAllocation": 0,
+ "orderStatus": null,
+ "distributionType": null,
+ "groupCode": null,
+ "groupProductType": null,
+ "pSign": 0,
+ "backSign": 0,
+ "description": "",
+ "stockNumber": null,
+ "rebate": true,
+ "purchaseZeroProductList": [],
+ "prePromotionPrice": null,
+ "prepromotionTotalPrice": 0,
+ "preDiscountRate": null,
+ "userBalance": 0,
+ "useLimitEnd": 0.05,
+ "useLimitStart": 0.01,
+ "maxuseLimit": 0.01
+ }
+ ],
+ "demandSubItems": null,
+ "rebateDetail": [
+ {
+ "rebateoperaskuid": null,
+ "filialecode": "00102",
+ "rebateid": 64,
+ "customercode": null,
+ "transactionamount": null,
+ "transactiontype": null,
+ "rebateStartTime": null,
+ "rebateValidity": null,
+ "balance": null,
+ "deletesign": null,
+ "note": null,
+ "createtime": null,
+ "updatetime": null,
+ "demandId": null,
+ "demandCode": null,
+ "relevanceName": null,
+ "rebateName": null,
+ "customerCompanyName": null,
+ "lineCodeDelete": null,
+ "rebateTripId": null,
+ "monNum": null,
+ "relevanceCode": "DS-电商专用",
+ "pageSize": null,
+ "pageNum": null,
+ "startTime": null,
+ "endTime": null,
+ "userId": null,
+ "customerCodeList": null,
+ "filialeCodeList": null,
+ "companyName": null,
+ "reSign": null,
+ "demandParentCode": null,
+ "distributionCode": null,
+ "frontNote": null,
+ "backNote": null,
+ "cancelId": null,
+ "effectivetype": null,
+ "validityperiodSign": null,
+ "rebatename": "起搏电极导线",
+ "useLimitStart": 0.01,
+ "useLimitEnd": 0.05,
+ "istax": 1,
+ "taxround": 0,
+ "isdisposable": 0,
+ "productCode": null,
+ "isOperated": null,
+ "userPrice": null,
+ "rebateFalg": null
+ }
+ ],
+ "rebateAmountList": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "auditLoginName": null,
+ "showPurchaseNo": false,
+ "isRebate": null,
+ "isShowReate": null,
+ "taxRate": 0.17,
+ "rebateType": 1,
+ "paymentAmountWholeLine": 0.3333,
+ "discountAmountWholeLine": 0,
+ "payableAmountWholeLine": 0.3333,
+ "discountRate": null,
+ "singleRebateAmount": null,
+ "isRebateEdit": null,
+ "payCertUrl": null,
+ "rebateAmount": null,
+ "demandCance": null,
+ "soAdd": null,
+ "soCance": null,
+ "orderReturn": null,
+ "needCustomerConfirm": false,
+ "measuringUnit": null,
+ "productId": null,
+ "version": null,
+ "mainVersion": null,
+ "agencyConfigId": null,
+ "confirmSign": null,
+ "replySign": null,
+ "agencySign": null,
+ "editIng": null,
+ "editIngStr": null,
+ "jdeType": null,
+ "isElectronicSeal": null,
+ "contractAgreementNo": null,
+ "alesDepartmentNo": null,
+ "alesDepartmentName": null,
+ "salesPersonNo": null,
+ "salesPersonName": null,
+ "customerNote": null,
+ "otherNote": null,
+ "contractAgreementCode": null,
+ "projectName": null,
+ "projectCode": null,
+ "regionId": null,
+ "regionName": null,
+ "productLineBindSign": null,
+ "shipVia": null,
+ "orderSource": null,
+ "userBalance": null,
+ "liquidCode": null,
+ "shipmentTypeStr": null,
+ "specifications": "5075",
+ "pageStart": null,
+ "pageSize": null,
+ "changeSgin": null,
+ "yapei": 2,
+ "companyId": 2,
+ "preemptConfig": null,
+ "productSpec": null,
+ "secondAuditSign": null,
+ "secondAuditById": null,
+ "secondAuditByName": null,
+ "secondAuditTime": null,
+ "secondAuditRemark": null,
+ "secondAuditStatus": null,
+ "rebateRule": "1;2;3;4",
+ "rebateControlSign": 0,
+ "rebateId": null,
+ "preferenceType": null,
+ "preferenceName": null,
+ "disPrice": null,
+ "lineNum": 0,
+ "auditStaySign": 0,
+ "fileList": null,
+ "imageUrls": null,
+ "total": null,
+ "submitTimeStr": null,
+ "updateTimeStr": null,
+ "auditTimeStr": null,
+ "acceptTime": null,
+ "acceptTimeStr": null,
+ "paidTime": null,
+ "paidTimeStr": null,
+ "erpHandingTime": null,
+ "erpHandingTimeStr": null,
+ "partShippingTime": null,
+ "partShippingTimeStr": null,
+ "allShippingTime": null,
+ "allShippingTimeStr": null,
+ "pushJdeTimeStr": null,
+ "successTimeStr": null,
+ "onlinePaySuccessTime": null,
+ "onlinePaySuccessTimeStr": null,
+ "bankTransactionSerial": null,
+ "newIsTax": 1,
+ "countFormula": 3,
+ "countNumber": 1.13,
+ "noTaxRebateAmount": 0,
+ "isCollectionAllocation": 0,
+ "siteCompanyCode": "",
+ "hospitalOrderType": 0,
+ "proofTime": null,
+ "proofURL": null,
+ "proofRemark": null,
+ "proofSign": 0,
+ "customerCancelSign": null,
+ "cancelRecords": null,
+ "cancelCount": 0,
+ "updateNewTime": null,
+ "updateNewTimeStr": null,
+ "fsDedUseSign": null,
+ "preDisSign": 0,
+ "shareType": 1,
+ "singleRebateSign": 0,
+ "cf": false,
+ "notice": "yyds测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试",
+ "isPre": null,
+ "showDemandAuditLineLabel": false,
+ "orderType": null,
+ "newDiscountRate": null,
+ "oldOrderType": null,
+ "oldNewDiscountRate": null,
+ "pendding": null,
+ "pushJdeStatusDemandSub": null,
+ "circleGiftSign": 0,
+ "delay": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "completedS": null,
+ "confirmDays": null,
+ "remindS": null,
+ "skuGroupList": null,
+ "groupProductType": 0,
+ "purchaseId": null,
+ "purchaseCode": null,
+ "sdCancelTime": null,
+ "sdTipSign": 0,
+ "receiverNote": null,
+ "receiverPhoneNote": null,
+ "receiverAddressNote": null,
+ "flag": null,
+ "sourceStr": null,
+ "addressNoNote": null,
+ "detailIsSpit": false,
+ "spitSgin": null,
+ "distributionType": null,
+ "rebateValidity": null,
+ "orderChangeType": null,
+ "logoIcon": null,
+ "detail": null,
+ "changeBigType": null,
+ "promotionType": 1,
+ "activityTotalAmount": 0,
+ "couponTotalAmount": 0,
+ "userReceiveId": null,
+ "editSgin": null,
+ "snSgin": null,
+ "jdeOutAmount": null,
+ "totalAllPaAmount": null,
+ "diffShowSgin": 0,
+ "lineCodeDelete": null,
+ "startTime": null,
+ "endTime": null,
+ "changeSign": null,
+ "distributionId": null,
+ "limitBuySign": 0,
+ "companyType": null,
+ "afterSale": null,
+ "csId": null,
+ "sdStatusNodeParamList": null,
+ "ypPromotionTotal": null,
+ "acrossMainCode": null,
+ "forceApprovedSign": 0,
+ "circleGiftContinueSgin": 0,
+ "customerCharge": null,
+ "onlinePaySign": 0,
+ "recodeDemandSkuList": null,
+ "mergeDemandSkuList": null,
+ "inventoryNode": null,
+ "customCode": null,
+ "terminalSource": null,
+ "potentialClientsId": null,
+ "settlementStatus": null,
+ "firstOrderAuditStatus": null,
+ "confirmReceiptSign": null,
+ "confirmReceiptTime": null,
+ "afterSaleDays": null,
+ "deliveryCompletedTime": null,
+ "taxSign": 0,
+ "orderSplitSign": 0,
+ "demandRebateSkuList": null,
+ "confirmTime": null,
+ "customerPurchaseNo": null,
+ "mustInstallDate": true,
+ "secondAddressList": null,
+ "splitOrMerge": 0,
+ "spitOrderSign": null,
+ "productAmountWholeLine": 0.3333,
+ "auditCompanyName": null,
+ "auditCompanyNameCode": null,
+ "edit": false,
+ "ratio": null,
+ "showMoreAttribute": false,
+ "lastNoTaxDiscountAmount": 0,
+ "lastDiscountAmount": 0,
+ "settementQuantity": 1,
+ "userBalancePrice": 0,
+ "isEdit": true,
+ "discountRateOne": 100,
+ "_rebateType": true
+ }
+ ],
+ "addressConfig": 2,
+ "openPreTaxAmount": 1,
+ "notice": "888品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服",
+ "promotionOrRebate": 1,
+ "promotionType": 1,
+ "showChangePromotionOrRebate": false,
+ "couponTotalAmount": 0,
+ "activityTotalAmount": 0,
+ "totalQuantity": 1,
+ "totalPrice": 0.33,
+ "discountAmount": 0,
+ "demandItems": [
+ {
+ "demandSkuId": null,
+ "demandId": null,
+ "distributionId": null,
+ "companyCode": "00102",
+ "demandCode": null,
+ "demandParentId": null,
+ "sellerCompanyId": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "customerCode": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "propertyStr": null,
+ "storageType": "999",
+ "suppDist": null,
+ "productId": 111579,
+ "productName": "起搏电极导线-电商专用",
+ "productCode": "10212287",
+ "productNature": null,
+ "brandName": null,
+ "optionStr": "5075",
+ "imageUrl": null,
+ "lineNumber": null,
+ "price": 0.3333,
+ "rebateId": null,
+ "originalPrice": null,
+ "biddingDiscountTax": null,
+ "salesDiscountTax": null,
+ "quantity": 1,
+ "sumQuantity": null,
+ "sendQuantity": null,
+ "lackQuantity": null,
+ "cancelQuantity": null,
+ "cancelAmount": null,
+ "refundQuantity": null,
+ "refundAmount": null,
+ "discountQuantity": null,
+ "discountAmount": null,
+ "subtotal": 0.33,
+ "measuringUnit": "块",
+ "auxiliaryMeasuringUnit": null,
+ "procurementMeasuringUnit": null,
+ "pricingMeasuringUnit": null,
+ "materialCode": "",
+ "manufacturer": "11320766+李桂阳",
+ "produceRegisterNum": null,
+ "riskRank": null,
+ "productClassify": null,
+ "createTime": 1606823961000,
+ "updateTime": 1694624401000,
+ "deleteSign": null,
+ "calCancelFlag": null,
+ "refundFlag": null,
+ "discountRate": 100,
+ "realPay": 0.33,
+ "promotionPrice": null,
+ "promotionTotalPrice": 0,
+ "demandParentCode": null,
+ "regionId": null,
+ "regionName": null,
+ "spitSign": null,
+ "activityAmount": 0,
+ "couponAmount": 0,
+ "activityUnitAmount": 0,
+ "couponUnitAmount": null,
+ "activityBasicId": null,
+ "couponSgin": null,
+ "couponSgin2": null,
+ "returnQuantity": null,
+ "returnAmount": null,
+ "customerId": null,
+ "prescription": null,
+ "specifications": "5075",
+ "lineCodeDelete": null,
+ "sdOutStorage": null,
+ "licenseNo": null,
+ "demandCodes": null,
+ "areaName": null,
+ "agreementPriceId": null,
+ "offerPrice": null,
+ "orderMark": null,
+ "totalPrice": null,
+ "productLimitBuyList": null,
+ "giftSign": 0,
+ "giftProductCode": null,
+ "activityCarDataVoList": null,
+ "orderSource": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "rebateTripId": null,
+ "allSign": null,
+ "salesReturn": null,
+ "nowAmount": null,
+ "taxSign": 0,
+ "plusMinuKey": null,
+ "rebateRule": null,
+ "lockType": null,
+ "lineNumberOrg": null,
+ "changeSgin": null,
+ "addSgin": null,
+ "ptbfa1": null,
+ "ptbfa2": null,
+ "ptbfa3": null,
+ "ptbfa4": null,
+ "ptbfa5": null,
+ "yapeiPriceId": null,
+ "ypLinePromotion": null,
+ "yapeiPrice": null,
+ "companyId": 2,
+ "buyerCartId": null,
+ "userReceiveIdx": null,
+ "userReceiveIdx2": null,
+ "limitNum": null,
+ "productLimitBuyId": null,
+ "alreadyBuyNum": null,
+ "limitBuySign": 0,
+ "proposeNum": null,
+ "takeEffectRange": null,
+ "takeEffectTime": null,
+ "endTime1": null,
+ "groupId": null,
+ "fsGroupId": null,
+ "proposalQuantity": null,
+ "proposalSign": 0,
+ "manufacturerUserNo": null,
+ "manufacturerUserDesc": null,
+ "manufacturerProductNo": null,
+ "manufacturerProductDesc": null,
+ "manufacturerUserId": null,
+ "manufacturerProductId": null,
+ "busProductCode": null,
+ "paidTime": null,
+ "customerName": null,
+ "paymentAmount": null,
+ "specQuantity": null,
+ "disQuantity": null,
+ "fulfilledQuantity": null,
+ "fulCancelQuantity": null,
+ "couponId": null,
+ "couponId2": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "userId": null,
+ "productTax": "",
+ "taxRate": 0.17,
+ "demandSplitSign": "1",
+ "hospitalHopeDate": null,
+ "uniqueKey": null,
+ "productType": null,
+ "activityRuleId": null,
+ "allowanceBeginTime": null,
+ "allowanceEndTime": null,
+ "sign": null,
+ "differenceActivityUserId": null,
+ "groupNumber": null,
+ "groupName": null,
+ "skuGroup": null,
+ "subList": null,
+ "dataJson": null,
+ "skuMergeSign": null,
+ "freseniusPriceId": null,
+ "quantityAndGroupAll": null,
+ "booleaTime": null,
+ "spitSgin": 0,
+ "groupSpitSign": 0,
+ "purchaseEntryId": null,
+ "activityType": 0,
+ "giftSettlementMethod": null,
+ "giftInitQuantity": null,
+ "packageCode": null,
+ "giftGroupQuantity": null,
+ "mustInstallDate": false,
+ "installedDate": null,
+ "installedDateStr": null,
+ "demandLines": null,
+ "subLineNumber": null,
+ "demandSubCode": null,
+ "propertyName": null,
+ "propertyVal": null,
+ "propertyNote": null,
+ "sendManualSign": 0,
+ "sort": 0,
+ "circleArea": null,
+ "siteCompanyCode": "",
+ "hospitalOrderType": null,
+ "isCollectionAllocation": 0,
+ "orderStatus": null,
+ "distributionType": null,
+ "groupCode": null,
+ "groupProductType": null,
+ "pSign": 0,
+ "backSign": 0,
+ "description": "",
+ "stockNumber": null,
+ "rebate": true,
+ "purchaseZeroProductList": [],
+ "prePromotionPrice": null,
+ "prepromotionTotalPrice": 0,
+ "preDiscountRate": null,
+ "userBalance": 0,
+ "useLimitEnd": 0.05,
+ "useLimitStart": 0.01,
+ "maxuseLimit": 0.01
+ }
+ ],
+ "productPrice": "0.3300",
+ "fileList": [],
+ "showInfo": false,
+ "pageStart": 1,
+ "pageSize": 5,
+ "defaultBankInfo": {
+ "accountId": 32,
+ "companyId": 2,
+ "companyName": "国药集团联合医疗器械有限公司",
+ "registeredAddress": "北京市顺义区金航中路3号院社科中心1号楼3单元2层301",
+ "bank": "中国工商银行北京支行",
+ "accountName": "国药集团联合医疗器械有限公司",
+ "accountNumber": "108902839271937437",
+ "disableSign": 0,
+ "deleteSign": 0,
+ "createTime": "2021-01-12 16:12:03",
+ "updateTime": "2021-01-12 16:12:33",
+ "createBy": 2,
+ "updateBy": 2,
+ "realName": "子公司1admin"
+ },
+ "receiveInfo": [
+ {
+ "addressId": 15195,
+ "addressNo": 17986,
+ "addressName": "上海市普啊撒旦吉萨",
+ "provinceCode": null,
+ "userId": null,
+ "companyId": null,
+ "receiverName": "查杉",
+ "address": "",
+ "isDefault": 0,
+ "type": null,
+ "postcode": null,
+ "mobile": "18999998888",
+ "updateDate": null,
+ "updateTime": null,
+ "flag": null,
+ "deleteSign": null,
+ "province": null,
+ "city": null,
+ "area": null,
+ "dateTime": null,
+ "provinceStr": null,
+ "cityStr": null,
+ "areaStr": null,
+ "isJde": 0
+ }
+ ],
+ "addressList": [
+ {
+ "addressId": 15195,
+ "addressNo": 17986,
+ "addressName": null,
+ "provinceCode": null,
+ "userId": null,
+ "companyId": 2,
+ "receiverName": "查杉",
+ "address": "上海市普啊撒旦吉萨",
+ "isDefault": 0,
+ "type": 3,
+ "postcode": null,
+ "mobile": "18999998888",
+ "updateDate": 123074,
+ "updateTime": 103533,
+ "flag": null,
+ "deleteSign": null,
+ "province": 0,
+ "city": 0,
+ "area": 0,
+ "dateTime": null,
+ "provinceStr": "",
+ "cityStr": "",
+ "areaStr": "",
+ "isJde": 0,
+ "cityList": [],
+ "areaList": []
+ }
+ ],
+ "selecteAddresId": 15195,
+ "receiverNote": "查杉",
+ "receiverPhoneNote": "18999998888",
+ "receiverAddressNote": "上海市普啊撒旦吉萨",
+ "addressNoNote": 17986,
+ "province": 0,
+ "city": 0,
+ "cityList": [],
+ "area": 0,
+ "areaList": [],
+ "paymentAmount": "0.3300",
+ "taxRate": 0.17,
+ "demands": [
+ {
+ "demandId": null,
+ "demandParentId": null,
+ "demandParentCode": null,
+ "demandCode": null,
+ "customerId": null,
+ "customerName": null,
+ "customerCode": 1000086,
+ "loginName": null,
+ "realName": null,
+ "addressNumber": null,
+ "mobile": null,
+ "productName": null,
+ "productCode": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "paymentType": null,
+ "receiveBankName": null,
+ "receiveBankAccount": null,
+ "paymentAmount": "0.3300",
+ "productAmount": 0.33,
+ "payableAmount": 0.3333,
+ "refundAmount": null,
+ "cancelAmount": null,
+ "discountAmount": 0,
+ "orderStatus": null,
+ "refundStatus": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "remark": null,
+ "revokedReason": null,
+ "auditById": null,
+ "auditByName": null,
+ "auditTime": null,
+ "auditRemark": null,
+ "flhsStatus": null,
+ "pushJdeStatus": null,
+ "createTime": null,
+ "updateTime": null,
+ "submitTime": null,
+ "pushJdeTime": null,
+ "successTime": null,
+ "auditStatus": null,
+ "deleteSign": null,
+ "firstOrderFlag": null,
+ "demandItems": [
+ {
+ "demandSkuId": null,
+ "demandId": null,
+ "distributionId": null,
+ "companyCode": "00102",
+ "demandCode": null,
+ "demandParentId": null,
+ "sellerCompanyId": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "customerCode": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "propertyStr": null,
+ "storageType": "999",
+ "suppDist": null,
+ "productId": 111579,
+ "productName": "起搏电极导线-电商专用",
+ "productCode": "10212287",
+ "productNature": null,
+ "brandName": null,
+ "optionStr": "5075",
+ "imageUrl": null,
+ "lineNumber": null,
+ "price": 0.3333,
+ "rebateId": null,
+ "originalPrice": null,
+ "biddingDiscountTax": null,
+ "salesDiscountTax": null,
+ "quantity": 1,
+ "sumQuantity": null,
+ "sendQuantity": null,
+ "lackQuantity": null,
+ "cancelQuantity": null,
+ "cancelAmount": null,
+ "refundQuantity": null,
+ "refundAmount": null,
+ "discountQuantity": null,
+ "discountAmount": null,
+ "subtotal": 0.33,
+ "measuringUnit": "块",
+ "auxiliaryMeasuringUnit": null,
+ "procurementMeasuringUnit": null,
+ "pricingMeasuringUnit": null,
+ "materialCode": "",
+ "manufacturer": "11320766+李桂阳",
+ "produceRegisterNum": null,
+ "riskRank": null,
+ "productClassify": null,
+ "createTime": 1606823961000,
+ "updateTime": 1694624401000,
+ "deleteSign": null,
+ "calCancelFlag": null,
+ "refundFlag": null,
+ "discountRate": 100,
+ "realPay": 0.33,
+ "promotionPrice": null,
+ "promotionTotalPrice": 0,
+ "demandParentCode": null,
+ "regionId": null,
+ "regionName": null,
+ "spitSign": null,
+ "activityAmount": 0,
+ "couponAmount": 0,
+ "activityUnitAmount": 0,
+ "couponUnitAmount": null,
+ "activityBasicId": null,
+ "couponSgin": null,
+ "couponSgin2": null,
+ "returnQuantity": null,
+ "returnAmount": null,
+ "customerId": null,
+ "prescription": null,
+ "specifications": "5075",
+ "lineCodeDelete": null,
+ "sdOutStorage": null,
+ "licenseNo": null,
+ "demandCodes": null,
+ "areaName": null,
+ "agreementPriceId": null,
+ "offerPrice": null,
+ "orderMark": null,
+ "totalPrice": null,
+ "productLimitBuyList": null,
+ "giftSign": 0,
+ "giftProductCode": null,
+ "activityCarDataVoList": null,
+ "orderSource": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "rebateTripId": null,
+ "allSign": null,
+ "salesReturn": null,
+ "nowAmount": null,
+ "taxSign": 0,
+ "plusMinuKey": null,
+ "rebateRule": null,
+ "lockType": null,
+ "lineNumberOrg": null,
+ "changeSgin": null,
+ "addSgin": null,
+ "ptbfa1": null,
+ "ptbfa2": null,
+ "ptbfa3": null,
+ "ptbfa4": null,
+ "ptbfa5": null,
+ "yapeiPriceId": null,
+ "ypLinePromotion": null,
+ "yapeiPrice": null,
+ "companyId": 2,
+ "buyerCartId": null,
+ "userReceiveIdx": null,
+ "userReceiveIdx2": null,
+ "limitNum": null,
+ "productLimitBuyId": null,
+ "alreadyBuyNum": null,
+ "limitBuySign": 0,
+ "proposeNum": null,
+ "takeEffectRange": null,
+ "takeEffectTime": null,
+ "endTime1": null,
+ "groupId": null,
+ "fsGroupId": null,
+ "proposalQuantity": null,
+ "proposalSign": 0,
+ "manufacturerUserNo": null,
+ "manufacturerUserDesc": null,
+ "manufacturerProductNo": null,
+ "manufacturerProductDesc": null,
+ "manufacturerUserId": null,
+ "manufacturerProductId": null,
+ "busProductCode": null,
+ "paidTime": null,
+ "customerName": null,
+ "paymentAmount": null,
+ "specQuantity": null,
+ "disQuantity": null,
+ "fulfilledQuantity": null,
+ "fulCancelQuantity": null,
+ "couponId": null,
+ "couponId2": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "userId": null,
+ "productTax": "",
+ "taxRate": 0.17,
+ "demandSplitSign": "1",
+ "hospitalHopeDate": null,
+ "uniqueKey": null,
+ "productType": null,
+ "activityRuleId": null,
+ "allowanceBeginTime": null,
+ "allowanceEndTime": null,
+ "sign": null,
+ "differenceActivityUserId": null,
+ "groupNumber": null,
+ "groupName": null,
+ "skuGroup": null,
+ "subList": null,
+ "dataJson": null,
+ "skuMergeSign": null,
+ "freseniusPriceId": null,
+ "quantityAndGroupAll": null,
+ "booleaTime": null,
+ "spitSgin": 0,
+ "groupSpitSign": 0,
+ "purchaseEntryId": null,
+ "activityType": 0,
+ "giftSettlementMethod": null,
+ "giftInitQuantity": null,
+ "packageCode": null,
+ "giftGroupQuantity": null,
+ "mustInstallDate": false,
+ "installedDate": null,
+ "installedDateStr": null,
+ "demandLines": null,
+ "subLineNumber": null,
+ "demandSubCode": null,
+ "propertyName": null,
+ "propertyVal": null,
+ "propertyNote": null,
+ "sendManualSign": 0,
+ "sort": 0,
+ "circleArea": null,
+ "siteCompanyCode": "",
+ "hospitalOrderType": null,
+ "isCollectionAllocation": 0,
+ "orderStatus": null,
+ "distributionType": null,
+ "groupCode": null,
+ "groupProductType": null,
+ "pSign": 0,
+ "backSign": 0,
+ "description": "",
+ "stockNumber": null,
+ "rebate": true,
+ "purchaseZeroProductList": [],
+ "prePromotionPrice": null,
+ "prepromotionTotalPrice": 0,
+ "preDiscountRate": null,
+ "userBalance": 0,
+ "useLimitEnd": 0.05,
+ "useLimitStart": 0.01,
+ "maxuseLimit": 0.01,
+ "orderType": null
+ }
+ ],
+ "demandSubItems": null,
+ "rebateDetail": [
+ {
+ "rebateoperaskuid": null,
+ "filialecode": "00102",
+ "rebateid": 64,
+ "customercode": null,
+ "transactionamount": null,
+ "transactiontype": null,
+ "rebateStartTime": null,
+ "rebateValidity": null,
+ "balance": null,
+ "deletesign": null,
+ "note": null,
+ "createtime": null,
+ "updatetime": null,
+ "demandId": null,
+ "demandCode": null,
+ "relevanceName": null,
+ "rebateName": null,
+ "customerCompanyName": null,
+ "lineCodeDelete": null,
+ "rebateTripId": null,
+ "monNum": null,
+ "relevanceCode": "DS-电商专用",
+ "pageSize": null,
+ "pageNum": null,
+ "startTime": null,
+ "endTime": null,
+ "userId": null,
+ "customerCodeList": null,
+ "filialeCodeList": null,
+ "companyName": null,
+ "reSign": null,
+ "demandParentCode": null,
+ "distributionCode": null,
+ "frontNote": null,
+ "backNote": null,
+ "cancelId": null,
+ "effectivetype": null,
+ "validityperiodSign": null,
+ "rebatename": "起搏电极导线",
+ "useLimitStart": 0.01,
+ "useLimitEnd": 0.05,
+ "istax": 1,
+ "taxround": 0,
+ "isdisposable": 0,
+ "productCode": null,
+ "isOperated": null,
+ "userPrice": null,
+ "rebateFalg": null
+ }
+ ],
+ "rebateAmountList": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "auditLoginName": null,
+ "showPurchaseNo": false,
+ "isRebate": null,
+ "isShowReate": null,
+ "taxRate": 0.17,
+ "rebateType": 1,
+ "paymentAmountWholeLine": 0.3333,
+ "discountAmountWholeLine": 0,
+ "payableAmountWholeLine": 0.3333,
+ "discountRate": null,
+ "singleRebateAmount": null,
+ "isRebateEdit": null,
+ "payCertUrl": null,
+ "rebateAmount": null,
+ "demandCance": null,
+ "soAdd": null,
+ "soCance": null,
+ "orderReturn": null,
+ "needCustomerConfirm": false,
+ "measuringUnit": null,
+ "productId": null,
+ "version": null,
+ "mainVersion": null,
+ "agencyConfigId": null,
+ "confirmSign": null,
+ "replySign": null,
+ "agencySign": null,
+ "editIng": null,
+ "editIngStr": null,
+ "jdeType": null,
+ "isElectronicSeal": null,
+ "contractAgreementNo": null,
+ "alesDepartmentNo": null,
+ "alesDepartmentName": null,
+ "salesPersonNo": null,
+ "salesPersonName": null,
+ "customerNote": null,
+ "otherNote": null,
+ "contractAgreementCode": null,
+ "projectName": null,
+ "projectCode": null,
+ "regionId": null,
+ "regionName": null,
+ "productLineBindSign": null,
+ "shipVia": null,
+ "orderSource": null,
+ "userBalance": null,
+ "liquidCode": null,
+ "shipmentTypeStr": null,
+ "specifications": "5075",
+ "pageStart": null,
+ "pageSize": null,
+ "changeSgin": null,
+ "yapei": 2,
+ "companyId": 2,
+ "preemptConfig": null,
+ "productSpec": null,
+ "secondAuditSign": null,
+ "secondAuditById": null,
+ "secondAuditByName": null,
+ "secondAuditTime": null,
+ "secondAuditRemark": null,
+ "secondAuditStatus": null,
+ "rebateRule": "1;2;3;4",
+ "rebateControlSign": 0,
+ "rebateId": null,
+ "preferenceType": null,
+ "preferenceName": null,
+ "disPrice": null,
+ "lineNum": 0,
+ "auditStaySign": 0,
+ "fileList": null,
+ "imageUrls": null,
+ "total": null,
+ "submitTimeStr": null,
+ "updateTimeStr": null,
+ "auditTimeStr": null,
+ "acceptTime": null,
+ "acceptTimeStr": null,
+ "paidTime": null,
+ "paidTimeStr": null,
+ "erpHandingTime": null,
+ "erpHandingTimeStr": null,
+ "partShippingTime": null,
+ "partShippingTimeStr": null,
+ "allShippingTime": null,
+ "allShippingTimeStr": null,
+ "pushJdeTimeStr": null,
+ "successTimeStr": null,
+ "onlinePaySuccessTime": null,
+ "onlinePaySuccessTimeStr": null,
+ "bankTransactionSerial": null,
+ "newIsTax": 1,
+ "countFormula": 3,
+ "countNumber": 1.13,
+ "noTaxRebateAmount": 0,
+ "isCollectionAllocation": 0,
+ "siteCompanyCode": "",
+ "hospitalOrderType": 0,
+ "proofTime": null,
+ "proofURL": null,
+ "proofRemark": null,
+ "proofSign": 0,
+ "customerCancelSign": null,
+ "cancelRecords": null,
+ "cancelCount": 0,
+ "updateNewTime": null,
+ "updateNewTimeStr": null,
+ "fsDedUseSign": null,
+ "preDisSign": 0,
+ "shareType": 1,
+ "singleRebateSign": 0,
+ "cf": false,
+ "notice": "yyds测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试",
+ "isPre": null,
+ "showDemandAuditLineLabel": false,
+ "orderType": null,
+ "newDiscountRate": null,
+ "oldOrderType": null,
+ "oldNewDiscountRate": null,
+ "pendding": null,
+ "pushJdeStatusDemandSub": null,
+ "circleGiftSign": 0,
+ "delay": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "completedS": null,
+ "confirmDays": null,
+ "remindS": null,
+ "skuGroupList": null,
+ "groupProductType": 0,
+ "purchaseId": null,
+ "purchaseCode": null,
+ "sdCancelTime": null,
+ "sdTipSign": 0,
+ "receiverNote": null,
+ "receiverPhoneNote": null,
+ "receiverAddressNote": null,
+ "flag": null,
+ "sourceStr": null,
+ "addressNoNote": null,
+ "detailIsSpit": false,
+ "spitSgin": null,
+ "distributionType": null,
+ "rebateValidity": null,
+ "orderChangeType": null,
+ "logoIcon": null,
+ "detail": null,
+ "changeBigType": null,
+ "promotionType": 1,
+ "activityTotalAmount": 0,
+ "couponTotalAmount": 0,
+ "userReceiveId": null,
+ "editSgin": null,
+ "snSgin": null,
+ "jdeOutAmount": null,
+ "totalAllPaAmount": null,
+ "diffShowSgin": 0,
+ "lineCodeDelete": null,
+ "startTime": null,
+ "endTime": null,
+ "changeSign": null,
+ "distributionId": null,
+ "limitBuySign": 0,
+ "companyType": null,
+ "afterSale": null,
+ "csId": null,
+ "sdStatusNodeParamList": null,
+ "ypPromotionTotal": null,
+ "acrossMainCode": null,
+ "forceApprovedSign": 0,
+ "circleGiftContinueSgin": 0,
+ "customerCharge": null,
+ "onlinePaySign": 0,
+ "recodeDemandSkuList": null,
+ "mergeDemandSkuList": null,
+ "inventoryNode": null,
+ "customCode": null,
+ "terminalSource": null,
+ "potentialClientsId": null,
+ "settlementStatus": null,
+ "firstOrderAuditStatus": null,
+ "confirmReceiptSign": null,
+ "confirmReceiptTime": null,
+ "afterSaleDays": null,
+ "deliveryCompletedTime": null,
+ "taxSign": 0,
+ "orderSplitSign": 0,
+ "demandRebateSkuList": null,
+ "confirmTime": null,
+ "customerPurchaseNo": null,
+ "mustInstallDate": true,
+ "secondAddressList": null,
+ "splitOrMerge": 0,
+ "spitOrderSign": null,
+ "productAmountWholeLine": 0.3333,
+ "auditCompanyName": null,
+ "auditCompanyNameCode": null,
+ "edit": false,
+ "ratio": null,
+ "showMoreAttribute": false,
+ "lastNoTaxDiscountAmount": 0,
+ "lastDiscountAmount": 0,
+ "settementQuantity": 1,
+ "userBalancePrice": 0,
+ "isEdit": true,
+ "discountRateOne": 100,
+ "_rebateType": true,
+ "pSign": 0
+ }
+ ],
+ "orderStatus": 102,
+ "userReceiveId": null,
+ "userReceiveId2": null,
+ "productAmount": 0.33,
+ "paymentType": 0,
+ "accountId": 32,
+ "buyerCartIds": [
+ null
+ ],
+ "sellerCompanyCode": "00102",
+ "companyId": 2
+ }
+}
+
+
diff --git a/data/cmdc_demand_create_pc/data b/data/cmdc_demand_create_pc/data
new file mode 100644
index 0000000000000000000000000000000000000000..1d52e8255ceb9aad482db29b4de572fffd411f11
--- /dev/null
+++ b/data/cmdc_demand_create_pc/data
@@ -0,0 +1,1399 @@
+# 多彩商城登录信息
+"username": "Test001"
+"password": "Aa123456"
+
+
+#需求单创建接口地址
+"url": "/order/public/saveAllDemandOrder"
+
+#测试场景:需求单创建
+json_headers: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload": {
+ "国药集团联合医疗器械有限公司": {
+ "datas": [
+ {
+ "demandId": null,
+ "demandParentId": null,
+ "demandParentCode": null,
+ "demandCode": null,
+ "customerId": null,
+ "customerName": null,
+ "customerCode": 1000086,
+ "loginName": null,
+ "realName": null,
+ "addressNumber": null,
+ "mobile": null,
+ "productName": null,
+ "productCode": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "paymentType": null,
+ "receiveBankName": null,
+ "receiveBankAccount": null,
+ "paymentAmount": "0.3300",
+ "productAmount": 0.33,
+ "payableAmount": 0.3333,
+ "refundAmount": null,
+ "cancelAmount": null,
+ "discountAmount": 0,
+ "orderStatus": null,
+ "refundStatus": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "remark": null,
+ "revokedReason": null,
+ "auditById": null,
+ "auditByName": null,
+ "auditTime": null,
+ "auditRemark": null,
+ "flhsStatus": null,
+ "pushJdeStatus": null,
+ "createTime": null,
+ "updateTime": null,
+ "submitTime": null,
+ "pushJdeTime": null,
+ "successTime": null,
+ "auditStatus": null,
+ "deleteSign": null,
+ "firstOrderFlag": null,
+ "demandItems": [
+ {
+ "demandSkuId": null,
+ "demandId": null,
+ "distributionId": null,
+ "companyCode": "00102",
+ "demandCode": null,
+ "demandParentId": null,
+ "sellerCompanyId": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "customerCode": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "propertyStr": null,
+ "storageType": "999",
+ "suppDist": null,
+ "productId": 111579,
+ "productName": "起搏电极导线-电商专用",
+ "productCode": "10212287",
+ "productNature": null,
+ "brandName": null,
+ "optionStr": "5075",
+ "imageUrl": null,
+ "lineNumber": null,
+ "price": 0.3333,
+ "rebateId": null,
+ "originalPrice": null,
+ "biddingDiscountTax": null,
+ "salesDiscountTax": null,
+ "quantity": 1,
+ "sumQuantity": null,
+ "sendQuantity": null,
+ "lackQuantity": null,
+ "cancelQuantity": null,
+ "cancelAmount": null,
+ "refundQuantity": null,
+ "refundAmount": null,
+ "discountQuantity": null,
+ "discountAmount": null,
+ "subtotal": 0.33,
+ "measuringUnit": "块",
+ "auxiliaryMeasuringUnit": null,
+ "procurementMeasuringUnit": null,
+ "pricingMeasuringUnit": null,
+ "materialCode": "",
+ "manufacturer": "11320766+李桂阳",
+ "produceRegisterNum": null,
+ "riskRank": null,
+ "productClassify": null,
+ "createTime": 1606823961000,
+ "updateTime": 1694624401000,
+ "deleteSign": null,
+ "calCancelFlag": null,
+ "refundFlag": null,
+ "discountRate": 100,
+ "realPay": 0.33,
+ "promotionPrice": null,
+ "promotionTotalPrice": 0,
+ "demandParentCode": null,
+ "regionId": null,
+ "regionName": null,
+ "spitSign": null,
+ "activityAmount": 0,
+ "couponAmount": 0,
+ "activityUnitAmount": 0,
+ "couponUnitAmount": null,
+ "activityBasicId": null,
+ "couponSgin": null,
+ "couponSgin2": null,
+ "returnQuantity": null,
+ "returnAmount": null,
+ "customerId": null,
+ "prescription": null,
+ "specifications": "5075",
+ "lineCodeDelete": null,
+ "sdOutStorage": null,
+ "licenseNo": null,
+ "demandCodes": null,
+ "areaName": null,
+ "agreementPriceId": null,
+ "offerPrice": null,
+ "orderMark": null,
+ "totalPrice": null,
+ "productLimitBuyList": null,
+ "giftSign": 0,
+ "giftProductCode": null,
+ "activityCarDataVoList": null,
+ "orderSource": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "rebateTripId": null,
+ "allSign": null,
+ "salesReturn": null,
+ "nowAmount": null,
+ "taxSign": 0,
+ "plusMinuKey": null,
+ "rebateRule": null,
+ "lockType": null,
+ "lineNumberOrg": null,
+ "changeSgin": null,
+ "addSgin": null,
+ "ptbfa1": null,
+ "ptbfa2": null,
+ "ptbfa3": null,
+ "ptbfa4": null,
+ "ptbfa5": null,
+ "yapeiPriceId": null,
+ "ypLinePromotion": null,
+ "yapeiPrice": null,
+ "companyId": 2,
+ "buyerCartId": null,
+ "userReceiveIdx": null,
+ "userReceiveIdx2": null,
+ "limitNum": null,
+ "productLimitBuyId": null,
+ "alreadyBuyNum": null,
+ "limitBuySign": 0,
+ "proposeNum": null,
+ "takeEffectRange": null,
+ "takeEffectTime": null,
+ "endTime1": null,
+ "groupId": null,
+ "fsGroupId": null,
+ "proposalQuantity": null,
+ "proposalSign": 0,
+ "manufacturerUserNo": null,
+ "manufacturerUserDesc": null,
+ "manufacturerProductNo": null,
+ "manufacturerProductDesc": null,
+ "manufacturerUserId": null,
+ "manufacturerProductId": null,
+ "busProductCode": null,
+ "paidTime": null,
+ "customerName": null,
+ "paymentAmount": null,
+ "specQuantity": null,
+ "disQuantity": null,
+ "fulfilledQuantity": null,
+ "fulCancelQuantity": null,
+ "couponId": null,
+ "couponId2": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "userId": null,
+ "productTax": "",
+ "taxRate": 0.17,
+ "demandSplitSign": "1",
+ "hospitalHopeDate": null,
+ "uniqueKey": null,
+ "productType": null,
+ "activityRuleId": null,
+ "allowanceBeginTime": null,
+ "allowanceEndTime": null,
+ "sign": null,
+ "differenceActivityUserId": null,
+ "groupNumber": null,
+ "groupName": null,
+ "skuGroup": null,
+ "subList": null,
+ "dataJson": null,
+ "skuMergeSign": null,
+ "freseniusPriceId": null,
+ "quantityAndGroupAll": null,
+ "booleaTime": null,
+ "spitSgin": 0,
+ "groupSpitSign": 0,
+ "purchaseEntryId": null,
+ "activityType": 0,
+ "giftSettlementMethod": null,
+ "giftInitQuantity": null,
+ "packageCode": null,
+ "giftGroupQuantity": null,
+ "mustInstallDate": false,
+ "installedDate": null,
+ "installedDateStr": null,
+ "demandLines": null,
+ "subLineNumber": null,
+ "demandSubCode": null,
+ "propertyName": null,
+ "propertyVal": null,
+ "propertyNote": null,
+ "sendManualSign": 0,
+ "sort": 0,
+ "circleArea": null,
+ "siteCompanyCode": "",
+ "hospitalOrderType": null,
+ "isCollectionAllocation": 0,
+ "orderStatus": null,
+ "distributionType": null,
+ "groupCode": null,
+ "groupProductType": null,
+ "pSign": 0,
+ "backSign": 0,
+ "description": "",
+ "stockNumber": null,
+ "rebate": true,
+ "purchaseZeroProductList": [],
+ "prePromotionPrice": null,
+ "prepromotionTotalPrice": 0,
+ "preDiscountRate": null,
+ "userBalance": 0,
+ "useLimitEnd": 0.05,
+ "useLimitStart": 0.01,
+ "maxuseLimit": 0.01
+ }
+ ],
+ "demandSubItems": null,
+ "rebateDetail": [
+ {
+ "rebateoperaskuid": null,
+ "filialecode": "00102",
+ "rebateid": 64,
+ "customercode": null,
+ "transactionamount": null,
+ "transactiontype": null,
+ "rebateStartTime": null,
+ "rebateValidity": null,
+ "balance": null,
+ "deletesign": null,
+ "note": null,
+ "createtime": null,
+ "updatetime": null,
+ "demandId": null,
+ "demandCode": null,
+ "relevanceName": null,
+ "rebateName": null,
+ "customerCompanyName": null,
+ "lineCodeDelete": null,
+ "rebateTripId": null,
+ "monNum": null,
+ "relevanceCode": "DS-电商专用",
+ "pageSize": null,
+ "pageNum": null,
+ "startTime": null,
+ "endTime": null,
+ "userId": null,
+ "customerCodeList": null,
+ "filialeCodeList": null,
+ "companyName": null,
+ "reSign": null,
+ "demandParentCode": null,
+ "distributionCode": null,
+ "frontNote": null,
+ "backNote": null,
+ "cancelId": null,
+ "effectivetype": null,
+ "validityperiodSign": null,
+ "rebatename": "起搏电极导线",
+ "useLimitStart": 0.01,
+ "useLimitEnd": 0.05,
+ "istax": 1,
+ "taxround": 0,
+ "isdisposable": 0,
+ "productCode": null,
+ "isOperated": null,
+ "userPrice": null,
+ "rebateFalg": null
+ }
+ ],
+ "rebateAmountList": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "auditLoginName": null,
+ "showPurchaseNo": false,
+ "isRebate": null,
+ "isShowReate": null,
+ "taxRate": 0.17,
+ "rebateType": 1,
+ "paymentAmountWholeLine": 0.3333,
+ "discountAmountWholeLine": 0,
+ "payableAmountWholeLine": 0.3333,
+ "discountRate": null,
+ "singleRebateAmount": null,
+ "isRebateEdit": null,
+ "payCertUrl": null,
+ "rebateAmount": null,
+ "demandCance": null,
+ "soAdd": null,
+ "soCance": null,
+ "orderReturn": null,
+ "needCustomerConfirm": false,
+ "measuringUnit": null,
+ "productId": null,
+ "version": null,
+ "mainVersion": null,
+ "agencyConfigId": null,
+ "confirmSign": null,
+ "replySign": null,
+ "agencySign": null,
+ "editIng": null,
+ "editIngStr": null,
+ "jdeType": null,
+ "isElectronicSeal": null,
+ "contractAgreementNo": null,
+ "alesDepartmentNo": null,
+ "alesDepartmentName": null,
+ "salesPersonNo": null,
+ "salesPersonName": null,
+ "customerNote": null,
+ "otherNote": null,
+ "contractAgreementCode": null,
+ "projectName": null,
+ "projectCode": null,
+ "regionId": null,
+ "regionName": null,
+ "productLineBindSign": null,
+ "shipVia": null,
+ "orderSource": null,
+ "userBalance": null,
+ "liquidCode": null,
+ "shipmentTypeStr": null,
+ "specifications": "5075",
+ "pageStart": null,
+ "pageSize": null,
+ "changeSgin": null,
+ "yapei": 2,
+ "companyId": 2,
+ "preemptConfig": null,
+ "productSpec": null,
+ "secondAuditSign": null,
+ "secondAuditById": null,
+ "secondAuditByName": null,
+ "secondAuditTime": null,
+ "secondAuditRemark": null,
+ "secondAuditStatus": null,
+ "rebateRule": "1;2;3;4",
+ "rebateControlSign": 0,
+ "rebateId": null,
+ "preferenceType": null,
+ "preferenceName": null,
+ "disPrice": null,
+ "lineNum": 0,
+ "auditStaySign": 0,
+ "fileList": null,
+ "imageUrls": null,
+ "total": null,
+ "submitTimeStr": null,
+ "updateTimeStr": null,
+ "auditTimeStr": null,
+ "acceptTime": null,
+ "acceptTimeStr": null,
+ "paidTime": null,
+ "paidTimeStr": null,
+ "erpHandingTime": null,
+ "erpHandingTimeStr": null,
+ "partShippingTime": null,
+ "partShippingTimeStr": null,
+ "allShippingTime": null,
+ "allShippingTimeStr": null,
+ "pushJdeTimeStr": null,
+ "successTimeStr": null,
+ "onlinePaySuccessTime": null,
+ "onlinePaySuccessTimeStr": null,
+ "bankTransactionSerial": null,
+ "newIsTax": 1,
+ "countFormula": 3,
+ "countNumber": 1.13,
+ "noTaxRebateAmount": 0,
+ "isCollectionAllocation": 0,
+ "siteCompanyCode": "",
+ "hospitalOrderType": 0,
+ "proofTime": null,
+ "proofURL": null,
+ "proofRemark": null,
+ "proofSign": 0,
+ "customerCancelSign": null,
+ "cancelRecords": null,
+ "cancelCount": 0,
+ "updateNewTime": null,
+ "updateNewTimeStr": null,
+ "fsDedUseSign": null,
+ "preDisSign": 0,
+ "shareType": 1,
+ "singleRebateSign": 0,
+ "cf": false,
+ "notice": "yyds测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试",
+ "isPre": null,
+ "showDemandAuditLineLabel": false,
+ "orderType": null,
+ "newDiscountRate": null,
+ "oldOrderType": null,
+ "oldNewDiscountRate": null,
+ "pendding": null,
+ "pushJdeStatusDemandSub": null,
+ "circleGiftSign": 0,
+ "delay": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "completedS": null,
+ "confirmDays": null,
+ "remindS": null,
+ "skuGroupList": null,
+ "groupProductType": 0,
+ "purchaseId": null,
+ "purchaseCode": null,
+ "sdCancelTime": null,
+ "sdTipSign": 0,
+ "receiverNote": null,
+ "receiverPhoneNote": null,
+ "receiverAddressNote": null,
+ "flag": null,
+ "sourceStr": null,
+ "addressNoNote": null,
+ "detailIsSpit": false,
+ "spitSgin": null,
+ "distributionType": null,
+ "rebateValidity": null,
+ "orderChangeType": null,
+ "logoIcon": null,
+ "detail": null,
+ "changeBigType": null,
+ "promotionType": 1,
+ "activityTotalAmount": 0,
+ "couponTotalAmount": 0,
+ "userReceiveId": null,
+ "editSgin": null,
+ "snSgin": null,
+ "jdeOutAmount": null,
+ "totalAllPaAmount": null,
+ "diffShowSgin": 0,
+ "lineCodeDelete": null,
+ "startTime": null,
+ "endTime": null,
+ "changeSign": null,
+ "distributionId": null,
+ "limitBuySign": 0,
+ "companyType": null,
+ "afterSale": null,
+ "csId": null,
+ "sdStatusNodeParamList": null,
+ "ypPromotionTotal": null,
+ "acrossMainCode": null,
+ "forceApprovedSign": 0,
+ "circleGiftContinueSgin": 0,
+ "customerCharge": null,
+ "onlinePaySign": 0,
+ "recodeDemandSkuList": null,
+ "mergeDemandSkuList": null,
+ "inventoryNode": null,
+ "customCode": null,
+ "terminalSource": null,
+ "potentialClientsId": null,
+ "settlementStatus": null,
+ "firstOrderAuditStatus": null,
+ "confirmReceiptSign": null,
+ "confirmReceiptTime": null,
+ "afterSaleDays": null,
+ "deliveryCompletedTime": null,
+ "taxSign": 0,
+ "orderSplitSign": 0,
+ "demandRebateSkuList": null,
+ "confirmTime": null,
+ "customerPurchaseNo": null,
+ "mustInstallDate": true,
+ "secondAddressList": null,
+ "splitOrMerge": 0,
+ "spitOrderSign": null,
+ "productAmountWholeLine": 0.3333,
+ "auditCompanyName": null,
+ "auditCompanyNameCode": null,
+ "edit": false,
+ "ratio": null,
+ "showMoreAttribute": false,
+ "lastNoTaxDiscountAmount": 0,
+ "lastDiscountAmount": 0,
+ "settementQuantity": 1,
+ "userBalancePrice": 0,
+ "isEdit": true,
+ "discountRateOne": 100,
+ "_rebateType": true
+ }
+ ],
+ "addressConfig": 2,
+ "openPreTaxAmount": 1,
+ "notice": "888品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服务省天天低价,畅选无忧品类齐全,轻松购物快多仓直发,极速配送好正品行货,精致服",
+ "promotionOrRebate": 1,
+ "promotionType": 1,
+ "showChangePromotionOrRebate": false,
+ "couponTotalAmount": 0,
+ "activityTotalAmount": 0,
+ "totalQuantity": 1,
+ "totalPrice": 0.33,
+ "discountAmount": 0,
+ "demandItems": [
+ {
+ "demandSkuId": null,
+ "demandId": null,
+ "distributionId": null,
+ "companyCode": "00102",
+ "demandCode": null,
+ "demandParentId": null,
+ "sellerCompanyId": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "customerCode": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "propertyStr": null,
+ "storageType": "999",
+ "suppDist": null,
+ "productId": 111579,
+ "productName": "起搏电极导线-电商专用",
+ "productCode": "10212287",
+ "productNature": null,
+ "brandName": null,
+ "optionStr": "5075",
+ "imageUrl": null,
+ "lineNumber": null,
+ "price": 0.3333,
+ "rebateId": null,
+ "originalPrice": null,
+ "biddingDiscountTax": null,
+ "salesDiscountTax": null,
+ "quantity": 1,
+ "sumQuantity": null,
+ "sendQuantity": null,
+ "lackQuantity": null,
+ "cancelQuantity": null,
+ "cancelAmount": null,
+ "refundQuantity": null,
+ "refundAmount": null,
+ "discountQuantity": null,
+ "discountAmount": null,
+ "subtotal": 0.33,
+ "measuringUnit": "块",
+ "auxiliaryMeasuringUnit": null,
+ "procurementMeasuringUnit": null,
+ "pricingMeasuringUnit": null,
+ "materialCode": "",
+ "manufacturer": "11320766+李桂阳",
+ "produceRegisterNum": null,
+ "riskRank": null,
+ "productClassify": null,
+ "createTime": 1606823961000,
+ "updateTime": 1694624401000,
+ "deleteSign": null,
+ "calCancelFlag": null,
+ "refundFlag": null,
+ "discountRate": 100,
+ "realPay": 0.33,
+ "promotionPrice": null,
+ "promotionTotalPrice": 0,
+ "demandParentCode": null,
+ "regionId": null,
+ "regionName": null,
+ "spitSign": null,
+ "activityAmount": 0,
+ "couponAmount": 0,
+ "activityUnitAmount": 0,
+ "couponUnitAmount": null,
+ "activityBasicId": null,
+ "couponSgin": null,
+ "couponSgin2": null,
+ "returnQuantity": null,
+ "returnAmount": null,
+ "customerId": null,
+ "prescription": null,
+ "specifications": "5075",
+ "lineCodeDelete": null,
+ "sdOutStorage": null,
+ "licenseNo": null,
+ "demandCodes": null,
+ "areaName": null,
+ "agreementPriceId": null,
+ "offerPrice": null,
+ "orderMark": null,
+ "totalPrice": null,
+ "productLimitBuyList": null,
+ "giftSign": 0,
+ "giftProductCode": null,
+ "activityCarDataVoList": null,
+ "orderSource": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "rebateTripId": null,
+ "allSign": null,
+ "salesReturn": null,
+ "nowAmount": null,
+ "taxSign": 0,
+ "plusMinuKey": null,
+ "rebateRule": null,
+ "lockType": null,
+ "lineNumberOrg": null,
+ "changeSgin": null,
+ "addSgin": null,
+ "ptbfa1": null,
+ "ptbfa2": null,
+ "ptbfa3": null,
+ "ptbfa4": null,
+ "ptbfa5": null,
+ "yapeiPriceId": null,
+ "ypLinePromotion": null,
+ "yapeiPrice": null,
+ "companyId": 2,
+ "buyerCartId": null,
+ "userReceiveIdx": null,
+ "userReceiveIdx2": null,
+ "limitNum": null,
+ "productLimitBuyId": null,
+ "alreadyBuyNum": null,
+ "limitBuySign": 0,
+ "proposeNum": null,
+ "takeEffectRange": null,
+ "takeEffectTime": null,
+ "endTime1": null,
+ "groupId": null,
+ "fsGroupId": null,
+ "proposalQuantity": null,
+ "proposalSign": 0,
+ "manufacturerUserNo": null,
+ "manufacturerUserDesc": null,
+ "manufacturerProductNo": null,
+ "manufacturerProductDesc": null,
+ "manufacturerUserId": null,
+ "manufacturerProductId": null,
+ "busProductCode": null,
+ "paidTime": null,
+ "customerName": null,
+ "paymentAmount": null,
+ "specQuantity": null,
+ "disQuantity": null,
+ "fulfilledQuantity": null,
+ "fulCancelQuantity": null,
+ "couponId": null,
+ "couponId2": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "userId": null,
+ "productTax": "",
+ "taxRate": 0.17,
+ "demandSplitSign": "1",
+ "hospitalHopeDate": null,
+ "uniqueKey": null,
+ "productType": null,
+ "activityRuleId": null,
+ "allowanceBeginTime": null,
+ "allowanceEndTime": null,
+ "sign": null,
+ "differenceActivityUserId": null,
+ "groupNumber": null,
+ "groupName": null,
+ "skuGroup": null,
+ "subList": null,
+ "dataJson": null,
+ "skuMergeSign": null,
+ "freseniusPriceId": null,
+ "quantityAndGroupAll": null,
+ "booleaTime": null,
+ "spitSgin": 0,
+ "groupSpitSign": 0,
+ "purchaseEntryId": null,
+ "activityType": 0,
+ "giftSettlementMethod": null,
+ "giftInitQuantity": null,
+ "packageCode": null,
+ "giftGroupQuantity": null,
+ "mustInstallDate": false,
+ "installedDate": null,
+ "installedDateStr": null,
+ "demandLines": null,
+ "subLineNumber": null,
+ "demandSubCode": null,
+ "propertyName": null,
+ "propertyVal": null,
+ "propertyNote": null,
+ "sendManualSign": 0,
+ "sort": 0,
+ "circleArea": null,
+ "siteCompanyCode": "",
+ "hospitalOrderType": null,
+ "isCollectionAllocation": 0,
+ "orderStatus": null,
+ "distributionType": null,
+ "groupCode": null,
+ "groupProductType": null,
+ "pSign": 0,
+ "backSign": 0,
+ "description": "",
+ "stockNumber": null,
+ "rebate": true,
+ "purchaseZeroProductList": [],
+ "prePromotionPrice": null,
+ "prepromotionTotalPrice": 0,
+ "preDiscountRate": null,
+ "userBalance": 0,
+ "useLimitEnd": 0.05,
+ "useLimitStart": 0.01,
+ "maxuseLimit": 0.01
+ }
+ ],
+ "productPrice": "0.3300",
+ "fileList": [],
+ "showInfo": false,
+ "pageStart": 1,
+ "pageSize": 5,
+ "defaultBankInfo": {
+ "accountId": 32,
+ "companyId": 2,
+ "companyName": "国药集团联合医疗器械有限公司",
+ "registeredAddress": "北京市顺义区金航中路3号院社科中心1号楼3单元2层301",
+ "bank": "中国工商银行北京支行",
+ "accountName": "国药集团联合医疗器械有限公司",
+ "accountNumber": "108902839271937437",
+ "disableSign": 0,
+ "deleteSign": 0,
+ "createTime": "2021-01-12 16:12:03",
+ "updateTime": "2021-01-12 16:12:33",
+ "createBy": 2,
+ "updateBy": 2,
+ "realName": "子公司1admin"
+ },
+ "receiveInfo": [
+ {
+ "addressId": 15195,
+ "addressNo": 17986,
+ "addressName": "上海市普啊撒旦吉萨",
+ "provinceCode": null,
+ "userId": null,
+ "companyId": null,
+ "receiverName": "查杉",
+ "address": "",
+ "isDefault": 0,
+ "type": null,
+ "postcode": null,
+ "mobile": "18999998888",
+ "updateDate": null,
+ "updateTime": null,
+ "flag": null,
+ "deleteSign": null,
+ "province": null,
+ "city": null,
+ "area": null,
+ "dateTime": null,
+ "provinceStr": null,
+ "cityStr": null,
+ "areaStr": null,
+ "isJde": 0
+ }
+ ],
+ "addressList": [
+ {
+ "addressId": 15195,
+ "addressNo": 17986,
+ "addressName": null,
+ "provinceCode": null,
+ "userId": null,
+ "companyId": 2,
+ "receiverName": "查杉",
+ "address": "上海市普啊撒旦吉萨",
+ "isDefault": 0,
+ "type": 3,
+ "postcode": null,
+ "mobile": "18999998888",
+ "updateDate": 123074,
+ "updateTime": 103533,
+ "flag": null,
+ "deleteSign": null,
+ "province": 0,
+ "city": 0,
+ "area": 0,
+ "dateTime": null,
+ "provinceStr": "",
+ "cityStr": "",
+ "areaStr": "",
+ "isJde": 0,
+ "cityList": [],
+ "areaList": []
+ }
+ ],
+ "selecteAddresId": 15195,
+ "receiverNote": "查杉",
+ "receiverPhoneNote": "18999998888",
+ "receiverAddressNote": "上海市普啊撒旦吉萨",
+ "addressNoNote": 17986,
+ "province": 0,
+ "city": 0,
+ "cityList": [],
+ "area": 0,
+ "areaList": [],
+ "paymentAmount": "0.3300",
+ "taxRate": 0.17,
+ "demands": [
+ {
+ "demandId": null,
+ "demandParentId": null,
+ "demandParentCode": null,
+ "demandCode": null,
+ "customerId": null,
+ "customerName": null,
+ "customerCode": 1000086,
+ "loginName": null,
+ "realName": null,
+ "addressNumber": null,
+ "mobile": null,
+ "productName": null,
+ "productCode": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "paymentType": null,
+ "receiveBankName": null,
+ "receiveBankAccount": null,
+ "paymentAmount": "0.3300",
+ "productAmount": 0.33,
+ "payableAmount": 0.3333,
+ "refundAmount": null,
+ "cancelAmount": null,
+ "discountAmount": 0,
+ "orderStatus": null,
+ "refundStatus": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "remark": null,
+ "revokedReason": null,
+ "auditById": null,
+ "auditByName": null,
+ "auditTime": null,
+ "auditRemark": null,
+ "flhsStatus": null,
+ "pushJdeStatus": null,
+ "createTime": null,
+ "updateTime": null,
+ "submitTime": null,
+ "pushJdeTime": null,
+ "successTime": null,
+ "auditStatus": null,
+ "deleteSign": null,
+ "firstOrderFlag": null,
+ "demandItems": [
+ {
+ "demandSkuId": null,
+ "demandId": null,
+ "distributionId": null,
+ "companyCode": "00102",
+ "demandCode": null,
+ "demandParentId": null,
+ "sellerCompanyId": null,
+ "sellerCompanyName": null,
+ "sellerCompanyCode": null,
+ "customerCode": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "propertyStr": null,
+ "storageType": "999",
+ "suppDist": null,
+ "productId": 111579,
+ "productName": "起搏电极导线-电商专用",
+ "productCode": "10212287",
+ "productNature": null,
+ "brandName": null,
+ "optionStr": "5075",
+ "imageUrl": null,
+ "lineNumber": null,
+ "price": 0.3333,
+ "rebateId": null,
+ "originalPrice": null,
+ "biddingDiscountTax": null,
+ "salesDiscountTax": null,
+ "quantity": 1,
+ "sumQuantity": null,
+ "sendQuantity": null,
+ "lackQuantity": null,
+ "cancelQuantity": null,
+ "cancelAmount": null,
+ "refundQuantity": null,
+ "refundAmount": null,
+ "discountQuantity": null,
+ "discountAmount": null,
+ "subtotal": 0.33,
+ "measuringUnit": "块",
+ "auxiliaryMeasuringUnit": null,
+ "procurementMeasuringUnit": null,
+ "pricingMeasuringUnit": null,
+ "materialCode": "",
+ "manufacturer": "11320766+李桂阳",
+ "produceRegisterNum": null,
+ "riskRank": null,
+ "productClassify": null,
+ "createTime": 1606823961000,
+ "updateTime": 1694624401000,
+ "deleteSign": null,
+ "calCancelFlag": null,
+ "refundFlag": null,
+ "discountRate": 100,
+ "realPay": 0.33,
+ "promotionPrice": null,
+ "promotionTotalPrice": 0,
+ "demandParentCode": null,
+ "regionId": null,
+ "regionName": null,
+ "spitSign": null,
+ "activityAmount": 0,
+ "couponAmount": 0,
+ "activityUnitAmount": 0,
+ "couponUnitAmount": null,
+ "activityBasicId": null,
+ "couponSgin": null,
+ "couponSgin2": null,
+ "returnQuantity": null,
+ "returnAmount": null,
+ "customerId": null,
+ "prescription": null,
+ "specifications": "5075",
+ "lineCodeDelete": null,
+ "sdOutStorage": null,
+ "licenseNo": null,
+ "demandCodes": null,
+ "areaName": null,
+ "agreementPriceId": null,
+ "offerPrice": null,
+ "orderMark": null,
+ "totalPrice": null,
+ "productLimitBuyList": null,
+ "giftSign": 0,
+ "giftProductCode": null,
+ "activityCarDataVoList": null,
+ "orderSource": null,
+ "receiverName": null,
+ "receiverContact": null,
+ "receiverAddress": null,
+ "rebateTripId": null,
+ "allSign": null,
+ "salesReturn": null,
+ "nowAmount": null,
+ "taxSign": 0,
+ "plusMinuKey": null,
+ "rebateRule": null,
+ "lockType": null,
+ "lineNumberOrg": null,
+ "changeSgin": null,
+ "addSgin": null,
+ "ptbfa1": null,
+ "ptbfa2": null,
+ "ptbfa3": null,
+ "ptbfa4": null,
+ "ptbfa5": null,
+ "yapeiPriceId": null,
+ "ypLinePromotion": null,
+ "yapeiPrice": null,
+ "companyId": 2,
+ "buyerCartId": null,
+ "userReceiveIdx": null,
+ "userReceiveIdx2": null,
+ "limitNum": null,
+ "productLimitBuyId": null,
+ "alreadyBuyNum": null,
+ "limitBuySign": 0,
+ "proposeNum": null,
+ "takeEffectRange": null,
+ "takeEffectTime": null,
+ "endTime1": null,
+ "groupId": null,
+ "fsGroupId": null,
+ "proposalQuantity": null,
+ "proposalSign": 0,
+ "manufacturerUserNo": null,
+ "manufacturerUserDesc": null,
+ "manufacturerProductNo": null,
+ "manufacturerProductDesc": null,
+ "manufacturerUserId": null,
+ "manufacturerProductId": null,
+ "busProductCode": null,
+ "paidTime": null,
+ "customerName": null,
+ "paymentAmount": null,
+ "specQuantity": null,
+ "disQuantity": null,
+ "fulfilledQuantity": null,
+ "fulCancelQuantity": null,
+ "couponId": null,
+ "couponId2": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "userId": null,
+ "productTax": "",
+ "taxRate": 0.17,
+ "demandSplitSign": "1",
+ "hospitalHopeDate": null,
+ "uniqueKey": null,
+ "productType": null,
+ "activityRuleId": null,
+ "allowanceBeginTime": null,
+ "allowanceEndTime": null,
+ "sign": null,
+ "differenceActivityUserId": null,
+ "groupNumber": null,
+ "groupName": null,
+ "skuGroup": null,
+ "subList": null,
+ "dataJson": null,
+ "skuMergeSign": null,
+ "freseniusPriceId": null,
+ "quantityAndGroupAll": null,
+ "booleaTime": null,
+ "spitSgin": 0,
+ "groupSpitSign": 0,
+ "purchaseEntryId": null,
+ "activityType": 0,
+ "giftSettlementMethod": null,
+ "giftInitQuantity": null,
+ "packageCode": null,
+ "giftGroupQuantity": null,
+ "mustInstallDate": false,
+ "installedDate": null,
+ "installedDateStr": null,
+ "demandLines": null,
+ "subLineNumber": null,
+ "demandSubCode": null,
+ "propertyName": null,
+ "propertyVal": null,
+ "propertyNote": null,
+ "sendManualSign": 0,
+ "sort": 0,
+ "circleArea": null,
+ "siteCompanyCode": "",
+ "hospitalOrderType": null,
+ "isCollectionAllocation": 0,
+ "orderStatus": null,
+ "distributionType": null,
+ "groupCode": null,
+ "groupProductType": null,
+ "pSign": 0,
+ "backSign": 0,
+ "description": "",
+ "stockNumber": null,
+ "rebate": true,
+ "purchaseZeroProductList": [],
+ "prePromotionPrice": null,
+ "prepromotionTotalPrice": 0,
+ "preDiscountRate": null,
+ "userBalance": 0,
+ "useLimitEnd": 0.05,
+ "useLimitStart": 0.01,
+ "maxuseLimit": 0.01,
+ "orderType": null
+ }
+ ],
+ "demandSubItems": null,
+ "rebateDetail": [
+ {
+ "rebateoperaskuid": null,
+ "filialecode": "00102",
+ "rebateid": 64,
+ "customercode": null,
+ "transactionamount": null,
+ "transactiontype": null,
+ "rebateStartTime": null,
+ "rebateValidity": null,
+ "balance": null,
+ "deletesign": null,
+ "note": null,
+ "createtime": null,
+ "updatetime": null,
+ "demandId": null,
+ "demandCode": null,
+ "relevanceName": null,
+ "rebateName": null,
+ "customerCompanyName": null,
+ "lineCodeDelete": null,
+ "rebateTripId": null,
+ "monNum": null,
+ "relevanceCode": "DS-电商专用",
+ "pageSize": null,
+ "pageNum": null,
+ "startTime": null,
+ "endTime": null,
+ "userId": null,
+ "customerCodeList": null,
+ "filialeCodeList": null,
+ "companyName": null,
+ "reSign": null,
+ "demandParentCode": null,
+ "distributionCode": null,
+ "frontNote": null,
+ "backNote": null,
+ "cancelId": null,
+ "effectivetype": null,
+ "validityperiodSign": null,
+ "rebatename": "起搏电极导线",
+ "useLimitStart": 0.01,
+ "useLimitEnd": 0.05,
+ "istax": 1,
+ "taxround": 0,
+ "isdisposable": 0,
+ "productCode": null,
+ "isOperated": null,
+ "userPrice": null,
+ "rebateFalg": null
+ }
+ ],
+ "rebateAmountList": null,
+ "productLineCode": "DS-电商专用",
+ "productLineName": "DS-电商产品线",
+ "auditLoginName": null,
+ "showPurchaseNo": false,
+ "isRebate": null,
+ "isShowReate": null,
+ "taxRate": 0.17,
+ "rebateType": 1,
+ "paymentAmountWholeLine": 0.3333,
+ "discountAmountWholeLine": 0,
+ "payableAmountWholeLine": 0.3333,
+ "discountRate": null,
+ "singleRebateAmount": null,
+ "isRebateEdit": null,
+ "payCertUrl": null,
+ "rebateAmount": null,
+ "demandCance": null,
+ "soAdd": null,
+ "soCance": null,
+ "orderReturn": null,
+ "needCustomerConfirm": false,
+ "measuringUnit": null,
+ "productId": null,
+ "version": null,
+ "mainVersion": null,
+ "agencyConfigId": null,
+ "confirmSign": null,
+ "replySign": null,
+ "agencySign": null,
+ "editIng": null,
+ "editIngStr": null,
+ "jdeType": null,
+ "isElectronicSeal": null,
+ "contractAgreementNo": null,
+ "alesDepartmentNo": null,
+ "alesDepartmentName": null,
+ "salesPersonNo": null,
+ "salesPersonName": null,
+ "customerNote": null,
+ "otherNote": null,
+ "contractAgreementCode": null,
+ "projectName": null,
+ "projectCode": null,
+ "regionId": null,
+ "regionName": null,
+ "productLineBindSign": null,
+ "shipVia": null,
+ "orderSource": null,
+ "userBalance": null,
+ "liquidCode": null,
+ "shipmentTypeStr": null,
+ "specifications": "5075",
+ "pageStart": null,
+ "pageSize": null,
+ "changeSgin": null,
+ "yapei": 2,
+ "companyId": 2,
+ "preemptConfig": null,
+ "productSpec": null,
+ "secondAuditSign": null,
+ "secondAuditById": null,
+ "secondAuditByName": null,
+ "secondAuditTime": null,
+ "secondAuditRemark": null,
+ "secondAuditStatus": null,
+ "rebateRule": "1;2;3;4",
+ "rebateControlSign": 0,
+ "rebateId": null,
+ "preferenceType": null,
+ "preferenceName": null,
+ "disPrice": null,
+ "lineNum": 0,
+ "auditStaySign": 0,
+ "fileList": null,
+ "imageUrls": null,
+ "total": null,
+ "submitTimeStr": null,
+ "updateTimeStr": null,
+ "auditTimeStr": null,
+ "acceptTime": null,
+ "acceptTimeStr": null,
+ "paidTime": null,
+ "paidTimeStr": null,
+ "erpHandingTime": null,
+ "erpHandingTimeStr": null,
+ "partShippingTime": null,
+ "partShippingTimeStr": null,
+ "allShippingTime": null,
+ "allShippingTimeStr": null,
+ "pushJdeTimeStr": null,
+ "successTimeStr": null,
+ "onlinePaySuccessTime": null,
+ "onlinePaySuccessTimeStr": null,
+ "bankTransactionSerial": null,
+ "newIsTax": 1,
+ "countFormula": 3,
+ "countNumber": 1.13,
+ "noTaxRebateAmount": 0,
+ "isCollectionAllocation": 0,
+ "siteCompanyCode": "",
+ "hospitalOrderType": 0,
+ "proofTime": null,
+ "proofURL": null,
+ "proofRemark": null,
+ "proofSign": 0,
+ "customerCancelSign": null,
+ "cancelRecords": null,
+ "cancelCount": 0,
+ "updateNewTime": null,
+ "updateNewTimeStr": null,
+ "fsDedUseSign": null,
+ "preDisSign": 0,
+ "shareType": 1,
+ "singleRebateSign": 0,
+ "cf": false,
+ "notice": "yyds测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试",
+ "isPre": null,
+ "showDemandAuditLineLabel": false,
+ "orderType": null,
+ "newDiscountRate": null,
+ "oldOrderType": null,
+ "oldNewDiscountRate": null,
+ "pendding": null,
+ "pushJdeStatusDemandSub": null,
+ "circleGiftSign": 0,
+ "delay": null,
+ "limitS": null,
+ "starts": null,
+ "ends": null,
+ "completedS": null,
+ "confirmDays": null,
+ "remindS": null,
+ "skuGroupList": null,
+ "groupProductType": 0,
+ "purchaseId": null,
+ "purchaseCode": null,
+ "sdCancelTime": null,
+ "sdTipSign": 0,
+ "receiverNote": null,
+ "receiverPhoneNote": null,
+ "receiverAddressNote": null,
+ "flag": null,
+ "sourceStr": null,
+ "addressNoNote": null,
+ "detailIsSpit": false,
+ "spitSgin": null,
+ "distributionType": null,
+ "rebateValidity": null,
+ "orderChangeType": null,
+ "logoIcon": null,
+ "detail": null,
+ "changeBigType": null,
+ "promotionType": 1,
+ "activityTotalAmount": 0,
+ "couponTotalAmount": 0,
+ "userReceiveId": null,
+ "editSgin": null,
+ "snSgin": null,
+ "jdeOutAmount": null,
+ "totalAllPaAmount": null,
+ "diffShowSgin": 0,
+ "lineCodeDelete": null,
+ "startTime": null,
+ "endTime": null,
+ "changeSign": null,
+ "distributionId": null,
+ "limitBuySign": 0,
+ "companyType": null,
+ "afterSale": null,
+ "csId": null,
+ "sdStatusNodeParamList": null,
+ "ypPromotionTotal": null,
+ "acrossMainCode": null,
+ "forceApprovedSign": 0,
+ "circleGiftContinueSgin": 0,
+ "customerCharge": null,
+ "onlinePaySign": 0,
+ "recodeDemandSkuList": null,
+ "mergeDemandSkuList": null,
+ "inventoryNode": null,
+ "customCode": null,
+ "terminalSource": null,
+ "potentialClientsId": null,
+ "settlementStatus": null,
+ "firstOrderAuditStatus": null,
+ "confirmReceiptSign": null,
+ "confirmReceiptTime": null,
+ "afterSaleDays": null,
+ "deliveryCompletedTime": null,
+ "taxSign": 0,
+ "orderSplitSign": 0,
+ "demandRebateSkuList": null,
+ "confirmTime": null,
+ "customerPurchaseNo": null,
+ "mustInstallDate": true,
+ "secondAddressList": null,
+ "splitOrMerge": 0,
+ "spitOrderSign": null,
+ "productAmountWholeLine": 0.3333,
+ "auditCompanyName": null,
+ "auditCompanyNameCode": null,
+ "edit": false,
+ "ratio": null,
+ "showMoreAttribute": false,
+ "lastNoTaxDiscountAmount": 0,
+ "lastDiscountAmount": 0,
+ "settementQuantity": 1,
+ "userBalancePrice": 0,
+ "isEdit": true,
+ "discountRateOne": 100,
+ "_rebateType": true,
+ "pSign": 0
+ }
+ ],
+ "orderStatus": 102,
+ "userReceiveId": null,
+ "userReceiveId2": null,
+ "productAmount": 0.33,
+ "paymentType": 0,
+ "accountId": 32,
+ "buyerCartIds": [
+ null
+ ],
+ "sellerCompanyCode": "00102",
+ "companyId": 2
+ }
+}
+#预期结果
+checkDict: {"success":true,"code":"200","message":null}
+
+#参数化
+#商品列表接口地址
+"url1": "/product/public/totalListQuickOrderProduct"
+
+
+
+
+
diff --git a/data/cmdc_demand_creation/data b/data/cmdc_demand_creation/data
new file mode 100644
index 0000000000000000000000000000000000000000..f068dcf0e5d24f93e5b75605a4af642a9e279b29
--- /dev/null
+++ b/data/cmdc_demand_creation/data
@@ -0,0 +1,24 @@
+#需求单列表接口地址
+"url": "/order/saveBackDemandOrder"
+
+# 后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers1: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+
+
+#测试场景一:需求单创建
+
+"payload1": {"orderStatus":102,"demandItems":[{"maxProductNum":999999,"minProductNum":1,"addMinProductNum":1,"minProductNumSign":false,"isMultiple":false,"quantityTip":"","productId":10,"productCode":"10145929","materialCode":"","productName":"威尔特","specifications":"1","manufacturer":"北京康思润业生物技术有限公司-黄翼","productLineName":null,"productLineCode":null,"zonePriceVOList":null,"price":100,"storageType":"999","optionStr":"1","measuringUnit":"EA","ippMiniPurchaseNum":null,"ippMultipleSign":null,"ippPurchaseMultiple":null,"ippStatus":null,"quantity":1,"isGift":0,"measuringUnit1":"个","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","companyCode":"00102","areaName":null,"areaPrice":100,"agreementPriceId":null,"hidden":null,"description":"","taxRate":"0.17","allMaterialSign":null,"materialCodeExact":null,"specificationsExact":null,"hospitalOrderType":null,"hospitalHopeDate":null,"siteCompanyCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"mustInstallDate":false,"showDemandAuditLineLabel":false,"editProductCode":false,"quantityErr":false,"fresenuis":false,"singleFresenuis":null,"zeroSign":false,"purchaseZeroProductList":[],"activityBasicId":null,"giftList":[],"selectGiftArr":[],"selectZeroGiftObj":{"mainProductList":[],"giftProductList":[]},"giftGroupQuantity":1,"giftSign":0,"customerCode":"1000086","realPay":"100.00","purchaseId":18,"purchaseCode":"P2306281500002","purchaseEntryId":null}],"paymentAmount":100,"productAmount":100,"userId":130,"userNo":"1000086","customerCode":"1000086","userName":"北京海德锐视科技有限公司","companyId":"2","paymentType":1,"receiveBankName":"国药集团联合医疗器械有限公司","receiveBankAccount":"108902839271937437","accountId":32,"receiverName":"查杉","receiverContact":"18999998888","receiverAddress":"上海市普啊撒旦吉萨","addressNumber":17986,"remark":"","receiverNote":"查杉","receiverPhoneNote":"18999998888","receiverAddressNote":"上海市普啊撒旦吉萨","addressNoNote":17986,"fileList":[],"sellerCompanyCode":"00102","sellerCompanyName":"国药集团联合医疗器械有限公司","orderSource":2,"replaceCustomerOrder":{"orderStatus":102,"demandItems":[{"maxProductNum":999999,"minProductNum":1,"addMinProductNum":1,"minProductNumSign":false,"isMultiple":false,"quantityTip":"","productId":10,"productCode":"10145929","materialCode":"","productName":"威尔特","specifications":"1","manufacturer":"北京康思润业生物技术有限公司-黄翼","productLineName":null,"productLineCode":null,"zonePriceVOList":null,"price":100,"storageType":"999","optionStr":"1","measuringUnit":"EA","ippMiniPurchaseNum":null,"ippMultipleSign":null,"ippPurchaseMultiple":null,"ippStatus":null,"quantity":1,"isGift":0,"measuringUnit1":"个","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","companyCode":"00102","areaName":null,"areaPrice":100,"agreementPriceId":null,"hidden":null,"description":"","taxRate":"0.17","allMaterialSign":null,"materialCodeExact":null,"specificationsExact":null,"hospitalOrderType":null,"hospitalHopeDate":null,"siteCompanyCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"mustInstallDate":false,"showDemandAuditLineLabel":false,"editProductCode":false,"quantityErr":false,"fresenuis":false,"singleFresenuis":null,"zeroSign":false,"purchaseZeroProductList":[],"activityBasicId":null,"giftList":[],"selectGiftArr":[],"selectZeroGiftObj":{"mainProductList":[],"giftProductList":[]},"giftGroupQuantity":1}],"paymentAmount":100,"productAmount":100,"userId":130,"userNo":"1000086","customerCode":"1000086","userName":"北京海德锐视科技有限公司","companyId":"2","paymentType":1,"receiveBankName":"国药集团联合医疗器械有限公司","receiveBankAccount":"108902839271937437","accountId":32,"receiverName":"查杉","receiverContact":"18999998888","receiverAddress":"上海市普啊撒旦吉萨","addressNumber":17986,"remark":"","receiverNote":"查杉","receiverPhoneNote":"18999998888","receiverAddressNote":"上海市普啊撒旦吉萨","addressNoNote":17986,"fileList":[],"sellerCompanyCode":"00102","sellerCompanyName":"国药集团联合医疗器械有限公司","orderSource":2,"customerInfo":{"userId":130,"userName":"Test001","rejectUserName":null,"password":null,"realName":"王春晖","userNo":"1000086","telephone":"18008613535","rejectTelephone":null,"registerAddress":"[]","detailAddress":"武汉市洪山区南湖花园","businessScope":"[]","companyProperty":101,"companyId":null,"companyCode":null,"companyName":"国药集团联合医疗器械有限公司","companyNameList":null,"customerCompanyName":"北京海德锐视科技有限公司","lienceNo":"91110106579004448R","userType":2,"companyType":null,"status":3,"disableSign":0,"deleteSign":null,"createBy":null,"updateBy":null,"createTime":null,"updateTime":null,"licenceSketchUrl":null,"licenceUrl":null,"openId":null,"referrer":null,"gift":null,"identity":null,"department":null,"platformStatus":1,"rejectionReason":null,"registerType":null,"siteType":null,"departmentCode":null,"personName":null,"registration":null,"realPassword":null,"recommend":null,"taxRate":0.17,"roleNames":null,"subCompanyName":"国药集团联合医疗器械有限公司","roleIds":null,"addressList":null,"licenseList":null,"labelList":null,"managerList":null,"createTimeStr":null,"categoriesList":null,"merchantsAddress":null,"merchantStatus":null,"refuseReason":null,"merchantsId":null,"userTransactionAmount":"47166.7815","gray":null,"bindingTime":"2022-07-28 10:38:33","bindSign":1,"jdeStatus":0,"jdePhone":"","recommender":null,"coopeSgin":0,"bindflowList":null,"userJDEInfo":null}},"purchaseId":18,"purchaseCode":"P2306281500002","draftId":518,"demands":[{"demandId":null,"demandParentId":null,"demandParentCode":null,"demandCode":null,"customerId":null,"customerName":null,"customerCode":1000086,"loginName":null,"realName":null,"addressNumber":null,"mobile":null,"productName":null,"productCode":null,"sellerCompanyName":null,"sellerCompanyCode":null,"paymentType":null,"receiveBankName":null,"receiveBankAccount":null,"paymentAmount":"100.00","productAmount":100,"payableAmount":100,"refundAmount":null,"cancelAmount":null,"discountAmount":0,"orderStatus":null,"refundStatus":null,"receiverName":null,"receiverContact":null,"receiverAddress":null,"remark":null,"revokedReason":null,"auditById":null,"auditByName":null,"auditTime":null,"auditRemark":null,"flhsStatus":null,"pushJdeStatus":null,"createTime":null,"updateTime":null,"submitTime":null,"pushJdeTime":null,"successTime":null,"auditStatus":null,"deleteSign":null,"firstOrderFlag":null,"demandItems":[{"demandSkuId":null,"demandId":null,"distributionId":null,"companyCode":"00102","demandCode":null,"demandParentId":null,"sellerCompanyId":null,"sellerCompanyName":null,"sellerCompanyCode":null,"customerCode":1000086,"productLineCode":null,"productLineName":null,"propertyStr":null,"storageType":"999","suppDist":null,"productId":10,"productName":"威尔特","productCode":"10145929","productNature":null,"brandName":null,"optionStr":"1","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","lineNumber":null,"price":100,"rebateId":null,"originalPrice":null,"biddingDiscountTax":null,"salesDiscountTax":null,"quantity":1,"sumQuantity":null,"sendQuantity":null,"lackQuantity":null,"cancelQuantity":null,"cancelAmount":null,"refundQuantity":null,"refundAmount":null,"discountQuantity":null,"discountAmount":null,"subtotal":100,"measuringUnit":"个","auxiliaryMeasuringUnit":null,"procurementMeasuringUnit":null,"pricingMeasuringUnit":null,"materialCode":"","manufacturer":"北京康思润业生物技术有限公司-黄翼","produceRegisterNum":null,"riskRank":null,"productClassify":null,"createTime":null,"updateTime":null,"deleteSign":null,"calCancelFlag":null,"refundFlag":null,"discountRate":0,"realPay":100,"promotionPrice":null,"promotionTotalPrice":0,"demandParentCode":null,"regionId":null,"regionName":null,"spitSign":null,"activityAmount":null,"couponAmount":null,"activityUnitAmount":0,"couponUnitAmount":null,"activityBasicId":null,"couponSgin":null,"couponSgin2":null,"returnQuantity":null,"returnAmount":null,"customerId":null,"prescription":null,"specifications":"1","lineCodeDelete":null,"sdOutStorage":null,"licenseNo":null,"demandCodes":null,"areaName":null,"agreementPriceId":null,"offerPrice":null,"orderMark":null,"totalPrice":null,"productLimitBuyList":null,"giftSign":0,"giftProductCode":null,"activityCarDataVoList":null,"orderSource":null,"receiverName":null,"receiverContact":null,"receiverAddress":null,"rebateTripId":null,"allSign":null,"salesReturn":null,"nowAmount":null,"taxSign":0,"plusMinuKey":null,"rebateRule":null,"lockType":null,"lineNumberOrg":null,"changeSgin":null,"addSgin":null,"ptbfa1":null,"ptbfa2":null,"ptbfa3":null,"ptbfa4":null,"ptbfa5":null,"yapeiPriceId":null,"ypLinePromotion":null,"yapeiPrice":null,"companyId":null,"buyerCartId":0,"userReceiveIdx":null,"userReceiveIdx2":null,"limitNum":null,"productLimitBuyId":null,"alreadyBuyNum":null,"limitBuySign":0,"proposeNum":null,"takeEffectRange":null,"takeEffectTime":null,"endTime1":null,"groupId":null,"fsGroupId":null,"proposalQuantity":null,"proposalSign":0,"manufacturerUserNo":null,"manufacturerUserDesc":null,"manufacturerProductNo":null,"manufacturerProductDesc":null,"manufacturerUserId":null,"manufacturerProductId":null,"busProductCode":null,"paidTime":null,"customerName":null,"paymentAmount":null,"specQuantity":null,"disQuantity":null,"fulfilledQuantity":null,"fulCancelQuantity":null,"couponId":null,"couponId2":null,"limitS":null,"starts":null,"ends":null,"userId":null,"productTax":null,"taxRate":0.17,"demandSplitSign":"1","hospitalHopeDate":null,"uniqueKey":null,"productType":null,"activityRuleId":null,"allowanceBeginTime":null,"allowanceEndTime":null,"sign":null,"differenceActivityUserId":null,"groupNumber":1,"groupName":null,"skuGroup":null,"subList":null,"dataJson":null,"skuMergeSign":null,"freseniusPriceId":null,"quantityAndGroupAll":null,"booleaTime":null,"spitSgin":0,"groupSpitSign":0,"purchaseEntryId":null,"activityType":0,"giftSettlementMethod":null,"giftInitQuantity":null,"packageCode":null,"giftGroupQuantity":1,"mustInstallDate":false,"installedDate":null,"installedDateStr":null,"demandLines":null,"subLineNumber":null,"demandSubCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"sendManualSign":0,"sort":0,"circleArea":null,"siteCompanyCode":null,"hospitalOrderType":null,"isCollectionAllocation":null,"orderStatus":null,"distributionType":null,"groupCode":null,"groupProductType":null,"pSign":0,"backSign":0,"description":"","stockNumber":null,"rebate":false,"userBalance":null,"purchaseQuantity":1,"purchaseZeroProductList":[]}],"demandSubItems":null,"rebateDetail":null,"rebateAmountList":null,"productLineCode":null,"productLineName":null,"auditLoginName":null,"showPurchaseNo":false,"isRebate":null,"isShowReate":null,"taxRate":0.17,"rebateType":0,"paymentAmountWholeLine":100,"discountAmountWholeLine":0,"payableAmountWholeLine":100,"discountRate":0,"singleRebateAmount":null,"isRebateEdit":null,"payCertUrl":null,"rebateAmount":null,"demandCance":null,"soAdd":null,"soCance":null,"orderReturn":null,"needCustomerConfirm":false,"measuringUnit":null,"productId":null,"version":null,"mainVersion":null,"agencyConfigId":null,"confirmSign":null,"replySign":null,"agencySign":null,"editIng":null,"editIngStr":null,"jdeType":null,"isElectronicSeal":null,"contractAgreementNo":null,"alesDepartmentNo":null,"alesDepartmentName":null,"salesPersonNo":null,"salesPersonName":null,"customerNote":null,"otherNote":null,"contractAgreementCode":null,"projectName":null,"projectCode":null,"regionId":null,"regionName":null,"productLineBindSign":null,"shipVia":null,"orderSource":null,"userBalance":null,"liquidCode":null,"shipmentTypeStr":null,"specifications":"1","pageStart":null,"pageSize":null,"changeSgin":null,"yapei":2,"companyId":null,"userReceiveId2":null,"preemptConfig":null,"productSpec":null,"secondAuditSign":null,"secondAuditById":null,"secondAuditByName":null,"secondAuditTime":null,"secondAuditRemark":null,"secondAuditStatus":null,"rebateRule":"0","rebateControlSign":0,"rebateId":null,"preferenceType":null,"preferenceName":null,"disPrice":null,"lineNum":0,"auditStaySign":0,"fileList":null,"imageUrls":null,"total":null,"submitTimeStr":null,"updateTimeStr":null,"auditTimeStr":null,"acceptTime":null,"acceptTimeStr":null,"paidTime":null,"paidTimeStr":null,"erpHandingTime":null,"erpHandingTimeStr":null,"partShippingTime":null,"partShippingTimeStr":null,"allShippingTime":null,"allShippingTimeStr":null,"pushJdeTimeStr":null,"successTimeStr":null,"onlinePaySuccessTime":null,"onlinePaySuccessTimeStr":null,"bankTransactionSerial":null,"newIsTax":null,"countFormula":null,"countNumber":null,"noTaxRebateAmount":0,"isCollectionAllocation":0,"siteCompanyCode":null,"hospitalOrderType":null,"proofTime":null,"proofURL":null,"proofRemark":null,"proofSign":0,"customerCancelSign":null,"cancelRecords":null,"cancelCount":0,"updateNewTime":null,"updateNewTimeStr":null,"fsDedUseSign":null,"preDisSign":0,"shareType":null,"singleRebateSign":null,"cf":false,"notice":null,"isPre":null,"showDemandAuditLineLabel":false,"orderType":null,"newDiscountRate":null,"oldOrderType":null,"oldNewDiscountRate":null,"pendding":null,"pushJdeStatusDemandSub":null,"circleGiftSign":0,"delay":null,"limitS":null,"starts":null,"ends":null,"completedS":null,"confirmDays":null,"remindS":null,"skuGroupList":null,"groupProductType":0,"purchaseId":18,"purchaseCode":"P2306281500002","sdCancelTime":null,"sdTipSign":0,"receiverNote":null,"receiverPhoneNote":null,"receiverAddressNote":null,"flag":null,"sourceStr":null,"addressNoNote":null,"detailIsSpit":false,"spitSgin":null,"distributionType":null,"rebateValidity":null,"orderChangeType":null,"logoIcon":null,"detail":null,"changeBigType":null,"promotionType":null,"activityTotalAmount":null,"couponTotalAmount":null,"userReceiveId":null,"editSgin":null,"snSgin":null,"jdeOutAmount":null,"totalAllPaAmount":null,"diffShowSgin":0,"lineCodeDelete":null,"startTime":null,"endTime":null,"changeSign":null,"distributionId":null,"limitBuySign":0,"companyType":null,"afterSale":null,"csId":null,"sdStatusNodeParamList":null,"ypPromotionTotal":null,"acrossMainCode":null,"forceApprovedSign":0,"circleGiftContinueSgin":0,"customerCharge":null,"onlinePaySign":0,"recodeDemandSkuList":null,"mergeDemandSkuList":null,"inventoryNode":null,"customCode":null,"terminalSource":null,"potentialClientsId":null,"settlementStatus":null,"firstOrderAuditStatus":null,"confirmReceiptSign":null,"confirmReceiptTime":null,"afterSaleDays":null,"deliveryCompletedTime":null,"taxSign":0,"orderSplitSign":0,"demandRebateSkuList":null,"confirmTime":null,"customerPurchaseNo":null,"mustInstallDate":false,"secondAddressList":null,"splitOrMerge":0,"spitOrderSign":null,"productAmountWholeLine":100,"auditCompanyName":null,"auditCompanyNameCode":null,"edit":false,"showMoreAttribute":false,"ratio":null,"ratioFlag":false,"rebateFlags":false,"userBalancePrice":0,"allQuantity":1,"totalPriceNum":0,"maxTotalLimitPrice":0,"lastNoTaxDiscountAmount":0,"lastDiscountAmount":0}]}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":"ok","data":null,"freshToken":null}
+
+#测试场景二:需求草稿订单创建
+
+"payload1": {"orderStatus":102,"demandItems":[{"maxProductNum":999999,"minProductNum":1,"addMinProductNum":1,"minProductNumSign":false,"isMultiple":false,"quantityTip":"","productId":10,"productCode":"10145929","materialCode":"","productName":"威尔特","specifications":"1","manufacturer":"北京康思润业生物技术有限公司-黄翼","productLineName":null,"productLineCode":null,"zonePriceVOList":null,"price":100,"storageType":"999","optionStr":"1","measuringUnit":"EA","ippMiniPurchaseNum":null,"ippMultipleSign":null,"ippPurchaseMultiple":null,"ippStatus":null,"quantity":1,"isGift":0,"measuringUnit1":"个","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","companyCode":"00102","areaName":null,"areaPrice":100,"agreementPriceId":null,"hidden":null,"description":"","taxRate":"0.17","allMaterialSign":null,"materialCodeExact":null,"specificationsExact":null,"hospitalOrderType":null,"hospitalHopeDate":null,"siteCompanyCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"mustInstallDate":false,"showDemandAuditLineLabel":false,"editProductCode":false,"quantityErr":false,"fresenuis":false,"singleFresenuis":null,"zeroSign":false,"purchaseZeroProductList":[],"activityBasicId":null,"giftList":[],"selectGiftArr":[],"selectZeroGiftObj":{"mainProductList":[],"giftProductList":[]},"giftGroupQuantity":1,"giftSign":0,"customerCode":"1000086","realPay":"100.00","purchaseId":18,"purchaseCode":"P2306281500002","purchaseEntryId":null}],"paymentAmount":100,"productAmount":100,"userId":130,"userNo":"1000086","customerCode":"1000086","userName":"北京海德锐视科技有限公司","companyId":"2","paymentType":1,"receiveBankName":"国药集团联合医疗器械有限公司","receiveBankAccount":"108902839271937437","accountId":32,"receiverName":"查杉","receiverContact":"18999998888","receiverAddress":"上海市普啊撒旦吉萨","addressNumber":17986,"remark":"","receiverNote":"查杉","receiverPhoneNote":"18999998888","receiverAddressNote":"上海市普啊撒旦吉萨","addressNoNote":17986,"fileList":[],"sellerCompanyCode":"00102","sellerCompanyName":"国药集团联合医疗器械有限公司","orderSource":2,"replaceCustomerOrder":{"orderStatus":102,"demandItems":[{"maxProductNum":999999,"minProductNum":1,"addMinProductNum":1,"minProductNumSign":false,"isMultiple":false,"quantityTip":"","productId":10,"productCode":"10145929","materialCode":"","productName":"威尔特","specifications":"1","manufacturer":"北京康思润业生物技术有限公司-黄翼","productLineName":null,"productLineCode":null,"zonePriceVOList":null,"price":100,"storageType":"999","optionStr":"1","measuringUnit":"EA","ippMiniPurchaseNum":null,"ippMultipleSign":null,"ippPurchaseMultiple":null,"ippStatus":null,"quantity":1,"isGift":0,"measuringUnit1":"个","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","companyCode":"00102","areaName":null,"areaPrice":100,"agreementPriceId":null,"hidden":null,"description":"","taxRate":"0.17","allMaterialSign":null,"materialCodeExact":null,"specificationsExact":null,"hospitalOrderType":null,"hospitalHopeDate":null,"siteCompanyCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"mustInstallDate":false,"showDemandAuditLineLabel":false,"editProductCode":false,"quantityErr":false,"fresenuis":false,"singleFresenuis":null,"zeroSign":false,"purchaseZeroProductList":[],"activityBasicId":null,"giftList":[],"selectGiftArr":[],"selectZeroGiftObj":{"mainProductList":[],"giftProductList":[]},"giftGroupQuantity":1}],"paymentAmount":100,"productAmount":100,"userId":130,"userNo":"1000086","customerCode":"1000086","userName":"北京海德锐视科技有限公司","companyId":"2","paymentType":1,"receiveBankName":"国药集团联合医疗器械有限公司","receiveBankAccount":"108902839271937437","accountId":32,"receiverName":"查杉","receiverContact":"18999998888","receiverAddress":"上海市普啊撒旦吉萨","addressNumber":17986,"remark":"","receiverNote":"查杉","receiverPhoneNote":"18999998888","receiverAddressNote":"上海市普啊撒旦吉萨","addressNoNote":17986,"fileList":[],"sellerCompanyCode":"00102","sellerCompanyName":"国药集团联合医疗器械有限公司","orderSource":2,"customerInfo":{"userId":130,"userName":"Test001","rejectUserName":null,"password":null,"realName":"王春晖","userNo":"1000086","telephone":"18008613535","rejectTelephone":null,"registerAddress":"[]","detailAddress":"武汉市洪山区南湖花园","businessScope":"[]","companyProperty":101,"companyId":null,"companyCode":null,"companyName":"国药集团联合医疗器械有限公司","companyNameList":null,"customerCompanyName":"北京海德锐视科技有限公司","lienceNo":"91110106579004448R","userType":2,"companyType":null,"status":3,"disableSign":0,"deleteSign":null,"createBy":null,"updateBy":null,"createTime":null,"updateTime":null,"licenceSketchUrl":null,"licenceUrl":null,"openId":null,"referrer":null,"gift":null,"identity":null,"department":null,"platformStatus":1,"rejectionReason":null,"registerType":null,"siteType":null,"departmentCode":null,"personName":null,"registration":null,"realPassword":null,"recommend":null,"taxRate":0.17,"roleNames":null,"subCompanyName":"国药集团联合医疗器械有限公司","roleIds":null,"addressList":null,"licenseList":null,"labelList":null,"managerList":null,"createTimeStr":null,"categoriesList":null,"merchantsAddress":null,"merchantStatus":null,"refuseReason":null,"merchantsId":null,"userTransactionAmount":"47166.7815","gray":null,"bindingTime":"2022-07-28 10:38:33","bindSign":1,"jdeStatus":0,"jdePhone":"","recommender":null,"coopeSgin":0,"bindflowList":null,"userJDEInfo":null}},"purchaseId":18,"purchaseCode":"P2306281500002","draftId":518,"demands":[{"demandId":null,"demandParentId":null,"demandParentCode":null,"demandCode":null,"customerId":null,"customerName":null,"customerCode":1000086,"loginName":null,"realName":null,"addressNumber":null,"mobile":null,"productName":null,"productCode":null,"sellerCompanyName":null,"sellerCompanyCode":null,"paymentType":null,"receiveBankName":null,"receiveBankAccount":null,"paymentAmount":"100.00","productAmount":100,"payableAmount":100,"refundAmount":null,"cancelAmount":null,"discountAmount":0,"orderStatus":null,"refundStatus":null,"receiverName":null,"receiverContact":null,"receiverAddress":null,"remark":null,"revokedReason":null,"auditById":null,"auditByName":null,"auditTime":null,"auditRemark":null,"flhsStatus":null,"pushJdeStatus":null,"createTime":null,"updateTime":null,"submitTime":null,"pushJdeTime":null,"successTime":null,"auditStatus":null,"deleteSign":null,"firstOrderFlag":null,"demandItems":[{"demandSkuId":null,"demandId":null,"distributionId":null,"companyCode":"00102","demandCode":null,"demandParentId":null,"sellerCompanyId":null,"sellerCompanyName":null,"sellerCompanyCode":null,"customerCode":1000086,"productLineCode":null,"productLineName":null,"propertyStr":null,"storageType":"999","suppDist":null,"productId":10,"productName":"威尔特","productCode":"10145929","productNature":null,"brandName":null,"optionStr":"1","imageUrl":"https://pro-cmdc.oss-cn-beijing.aliyuncs.com/productFile/2020/12/30/3801a639-0c99-41d4-941b-49aa118c8daa.jpg","lineNumber":null,"price":100,"rebateId":null,"originalPrice":null,"biddingDiscountTax":null,"salesDiscountTax":null,"quantity":1,"sumQuantity":null,"sendQuantity":null,"lackQuantity":null,"cancelQuantity":null,"cancelAmount":null,"refundQuantity":null,"refundAmount":null,"discountQuantity":null,"discountAmount":null,"subtotal":100,"measuringUnit":"个","auxiliaryMeasuringUnit":null,"procurementMeasuringUnit":null,"pricingMeasuringUnit":null,"materialCode":"","manufacturer":"北京康思润业生物技术有限公司-黄翼","produceRegisterNum":null,"riskRank":null,"productClassify":null,"createTime":null,"updateTime":null,"deleteSign":null,"calCancelFlag":null,"refundFlag":null,"discountRate":0,"realPay":100,"promotionPrice":null,"promotionTotalPrice":0,"demandParentCode":null,"regionId":null,"regionName":null,"spitSign":null,"activityAmount":null,"couponAmount":null,"activityUnitAmount":0,"couponUnitAmount":null,"activityBasicId":null,"couponSgin":null,"couponSgin2":null,"returnQuantity":null,"returnAmount":null,"customerId":null,"prescription":null,"specifications":"1","lineCodeDelete":null,"sdOutStorage":null,"licenseNo":null,"demandCodes":null,"areaName":null,"agreementPriceId":null,"offerPrice":null,"orderMark":null,"totalPrice":null,"productLimitBuyList":null,"giftSign":0,"giftProductCode":null,"activityCarDataVoList":null,"orderSource":null,"receiverName":null,"receiverContact":null,"receiverAddress":null,"rebateTripId":null,"allSign":null,"salesReturn":null,"nowAmount":null,"taxSign":0,"plusMinuKey":null,"rebateRule":null,"lockType":null,"lineNumberOrg":null,"changeSgin":null,"addSgin":null,"ptbfa1":null,"ptbfa2":null,"ptbfa3":null,"ptbfa4":null,"ptbfa5":null,"yapeiPriceId":null,"ypLinePromotion":null,"yapeiPrice":null,"companyId":null,"buyerCartId":0,"userReceiveIdx":null,"userReceiveIdx2":null,"limitNum":null,"productLimitBuyId":null,"alreadyBuyNum":null,"limitBuySign":0,"proposeNum":null,"takeEffectRange":null,"takeEffectTime":null,"endTime1":null,"groupId":null,"fsGroupId":null,"proposalQuantity":null,"proposalSign":0,"manufacturerUserNo":null,"manufacturerUserDesc":null,"manufacturerProductNo":null,"manufacturerProductDesc":null,"manufacturerUserId":null,"manufacturerProductId":null,"busProductCode":null,"paidTime":null,"customerName":null,"paymentAmount":null,"specQuantity":null,"disQuantity":null,"fulfilledQuantity":null,"fulCancelQuantity":null,"couponId":null,"couponId2":null,"limitS":null,"starts":null,"ends":null,"userId":null,"productTax":null,"taxRate":0.17,"demandSplitSign":"1","hospitalHopeDate":null,"uniqueKey":null,"productType":null,"activityRuleId":null,"allowanceBeginTime":null,"allowanceEndTime":null,"sign":null,"differenceActivityUserId":null,"groupNumber":1,"groupName":null,"skuGroup":null,"subList":null,"dataJson":null,"skuMergeSign":null,"freseniusPriceId":null,"quantityAndGroupAll":null,"booleaTime":null,"spitSgin":0,"groupSpitSign":0,"purchaseEntryId":null,"activityType":0,"giftSettlementMethod":null,"giftInitQuantity":null,"packageCode":null,"giftGroupQuantity":1,"mustInstallDate":false,"installedDate":null,"installedDateStr":null,"demandLines":null,"subLineNumber":null,"demandSubCode":null,"propertyName":null,"propertyVal":null,"propertyNote":null,"sendManualSign":0,"sort":0,"circleArea":null,"siteCompanyCode":null,"hospitalOrderType":null,"isCollectionAllocation":null,"orderStatus":null,"distributionType":null,"groupCode":null,"groupProductType":null,"pSign":0,"backSign":0,"description":"","stockNumber":null,"rebate":false,"userBalance":null,"purchaseQuantity":1,"purchaseZeroProductList":[]}],"demandSubItems":null,"rebateDetail":null,"rebateAmountList":null,"productLineCode":null,"productLineName":null,"auditLoginName":null,"showPurchaseNo":false,"isRebate":null,"isShowReate":null,"taxRate":0.17,"rebateType":0,"paymentAmountWholeLine":100,"discountAmountWholeLine":0,"payableAmountWholeLine":100,"discountRate":0,"singleRebateAmount":null,"isRebateEdit":null,"payCertUrl":null,"rebateAmount":null,"demandCance":null,"soAdd":null,"soCance":null,"orderReturn":null,"needCustomerConfirm":false,"measuringUnit":null,"productId":null,"version":null,"mainVersion":null,"agencyConfigId":null,"confirmSign":null,"replySign":null,"agencySign":null,"editIng":null,"editIngStr":null,"jdeType":null,"isElectronicSeal":null,"contractAgreementNo":null,"alesDepartmentNo":null,"alesDepartmentName":null,"salesPersonNo":null,"salesPersonName":null,"customerNote":null,"otherNote":null,"contractAgreementCode":null,"projectName":null,"projectCode":null,"regionId":null,"regionName":null,"productLineBindSign":null,"shipVia":null,"orderSource":null,"userBalance":null,"liquidCode":null,"shipmentTypeStr":null,"specifications":"1","pageStart":null,"pageSize":null,"changeSgin":null,"yapei":2,"companyId":null,"userReceiveId2":null,"preemptConfig":null,"productSpec":null,"secondAuditSign":null,"secondAuditById":null,"secondAuditByName":null,"secondAuditTime":null,"secondAuditRemark":null,"secondAuditStatus":null,"rebateRule":"0","rebateControlSign":0,"rebateId":null,"preferenceType":null,"preferenceName":null,"disPrice":null,"lineNum":0,"auditStaySign":0,"fileList":null,"imageUrls":null,"total":null,"submitTimeStr":null,"updateTimeStr":null,"auditTimeStr":null,"acceptTime":null,"acceptTimeStr":null,"paidTime":null,"paidTimeStr":null,"erpHandingTime":null,"erpHandingTimeStr":null,"partShippingTime":null,"partShippingTimeStr":null,"allShippingTime":null,"allShippingTimeStr":null,"pushJdeTimeStr":null,"successTimeStr":null,"onlinePaySuccessTime":null,"onlinePaySuccessTimeStr":null,"bankTransactionSerial":null,"newIsTax":null,"countFormula":null,"countNumber":null,"noTaxRebateAmount":0,"isCollectionAllocation":0,"siteCompanyCode":null,"hospitalOrderType":null,"proofTime":null,"proofURL":null,"proofRemark":null,"proofSign":0,"customerCancelSign":null,"cancelRecords":null,"cancelCount":0,"updateNewTime":null,"updateNewTimeStr":null,"fsDedUseSign":null,"preDisSign":0,"shareType":null,"singleRebateSign":null,"cf":false,"notice":null,"isPre":null,"showDemandAuditLineLabel":false,"orderType":null,"newDiscountRate":null,"oldOrderType":null,"oldNewDiscountRate":null,"pendding":null,"pushJdeStatusDemandSub":null,"circleGiftSign":0,"delay":null,"limitS":null,"starts":null,"ends":null,"completedS":null,"confirmDays":null,"remindS":null,"skuGroupList":null,"groupProductType":0,"purchaseId":18,"purchaseCode":"P2306281500002","sdCancelTime":null,"sdTipSign":0,"receiverNote":null,"receiverPhoneNote":null,"receiverAddressNote":null,"flag":null,"sourceStr":null,"addressNoNote":null,"detailIsSpit":false,"spitSgin":null,"distributionType":null,"rebateValidity":null,"orderChangeType":null,"logoIcon":null,"detail":null,"changeBigType":null,"promotionType":null,"activityTotalAmount":null,"couponTotalAmount":null,"userReceiveId":null,"editSgin":null,"snSgin":null,"jdeOutAmount":null,"totalAllPaAmount":null,"diffShowSgin":0,"lineCodeDelete":null,"startTime":null,"endTime":null,"changeSign":null,"distributionId":null,"limitBuySign":0,"companyType":null,"afterSale":null,"csId":null,"sdStatusNodeParamList":null,"ypPromotionTotal":null,"acrossMainCode":null,"forceApprovedSign":0,"circleGiftContinueSgin":0,"customerCharge":null,"onlinePaySign":0,"recodeDemandSkuList":null,"mergeDemandSkuList":null,"inventoryNode":null,"customCode":null,"terminalSource":null,"potentialClientsId":null,"settlementStatus":null,"firstOrderAuditStatus":null,"confirmReceiptSign":null,"confirmReceiptTime":null,"afterSaleDays":null,"deliveryCompletedTime":null,"taxSign":0,"orderSplitSign":0,"demandRebateSkuList":null,"confirmTime":null,"customerPurchaseNo":null,"mustInstallDate":false,"secondAddressList":null,"splitOrMerge":0,"spitOrderSign":null,"productAmountWholeLine":100,"auditCompanyName":null,"auditCompanyNameCode":null,"edit":false,"showMoreAttribute":false,"ratio":null,"ratioFlag":false,"rebateFlags":false,"userBalancePrice":0,"allQuantity":1,"totalPriceNum":0,"maxTotalLimitPrice":0,"lastNoTaxDiscountAmount":0,"lastDiscountAmount":0}]}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":"ok","data":null,"freshToken":null}
\ No newline at end of file
diff --git a/data/cmdc_demand_delete/data b/data/cmdc_demand_delete/data
new file mode 100644
index 0000000000000000000000000000000000000000..6ccca58643f5066c2ed9fb26934bef0a5479609d
--- /dev/null
+++ b/data/cmdc_demand_delete/data
@@ -0,0 +1,28 @@
+#需求单列表接口地址
+"url": "/order/back/refuseDemand"
+
+# 后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers1: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+
+
+#测试场景一:需求正常单删除
+
+"payload1": {"demandId":41472,"auditStatus":0,"auditRemark":"#待国药审核#"}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":"OK","data":1,"freshToken":null}
+
+#测试场景二:删除不存在的需求单
+"payload2": {"demandId":41506345345,"auditStatus":1,"auditRemark":"#待国药审核#"}
+#预期结果
+"checkDict3": {"success":false,"code":"demand","message":"审核拒绝没有找到子需求单","data":null,"freshToken":null}
+
+#测试场景三:重复删除已被删除的需求单
+"payload3": {"demandId":11151,"auditStatus":2,"auditRemark":"#未首营平台取消#"}
+#预期结果
+"checkDict4": {"success":false,"code":"demand","message":"订单已拒绝,无法重复拒绝","data":null,"freshToken":null}
diff --git a/data/cmdc_demand_fail/data b/data/cmdc_demand_fail/data
new file mode 100644
index 0000000000000000000000000000000000000000..b61e437c02d976e72b415402df88572342010ce6
--- /dev/null
+++ b/data/cmdc_demand_fail/data
@@ -0,0 +1,33 @@
+#需求单列表接口地址
+"url": "/order/back/refuseDemand"
+
+# 后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers1: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+
+
+#测试场景一:需求正常单审核拒绝
+
+"payload1": {"demandId":41512,"auditStatus":2,"auditRemark":"审核拒绝原因"}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":"OK","data":1,"freshToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjIsInVzZXJOYW1lIjoiYWRtaW4yIiwidGltZSI6MTY5NDM5NDA0NjA3N30.JQgyXjLa5rH9XKIebln5rpPG4aasKNmVJbWA9UYu7PU"}
+
+#测试场景二:重复拒绝同一个需求单
+"payload2": {"demandId":41512,"auditStatus":2,"auditRemark":"审核拒绝原因"}
+#预期结果
+"checkDict2": {"success":false,"code":"demand","message":"订单已拒绝,无法重复拒绝","data":null,"freshToken":null}
+
+#测试场景三:审核拒绝不存在的需求单
+"payload3": {"demandId":111513453535,"auditStatus":2,"auditRemark":"#未首营平台取消#"}
+#预期结果
+"checkDict3": {"success":false,"code":"demand","message":"审核拒绝没有找到子需求单","data":null,"freshToken":null}
+
+#测试场景四:审核拒绝其他状态下的需求单,例如,审核通过的需求单
+"payload4": {"demandId":41512,"auditStatus":2,"auditRemark":"审核拒绝原因"}
+#预期结果
+"checkDict4": {"success":true,"code":"200","message":"OK","data":1,"freshToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjIsInVzZXJOYW1lIjoiYWRtaW4yIiwidGltZSI6MTY5NDM5NDA0NjA3N30.JQgyXjLa5rH9XKIebln5rpPG4aasKNmVJbWA9UYu7PU"}
diff --git a/data/cmdc_demand_list/data b/data/cmdc_demand_list/data
new file mode 100644
index 0000000000000000000000000000000000000000..7814babbfcc6150fbe8d5c03ef9566708ecb95a3
--- /dev/null
+++ b/data/cmdc_demand_list/data
@@ -0,0 +1,38 @@
+#需求单列表接口地址
+"url1": "/order/back/listDemand"
+json_headers: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjIsInVzZXJOYW1lIjoiYWRtaW4yIiwidGltZSI6MTY5Mzk4ODY5NDg0M30.f71cshaaFyY2w2i53P87etu5-x2Y3gqMVKraUGYndp0"
+}
+
+"payload": {"times":[null],"listOrderStatus":[],"productName":null,"demandCode":null,"demandParentCode":null,"customerName":null,"manufacturer":null,"materialCode":null,"sellerCompanyName":null,"produceRegisterNum":null,"productLineName":null,"auditByName":null,"orderSource":null,"changeTypeList":null,"isRebateEdit":null,"jdeType":null,"pageSize":8,"pageStart":1,"orderChangeType":null,"snSgin":null,"changeSign":null,"customerCode":null,"distributionType":null,"busCustomerCode":null,"loginName":null,"cancelSign":0,"shipmentType":null,"startTime":null}
+#预期结果
+checkDict1: {"code":"401","message":"Unauthorized","success":false}
+
+# 后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers1: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+"payload1": {"times":[null],"listOrderStatus":[],"productName":null,"demandCode":null,"demandParentCode":null,"customerName":null,"manufacturer":null,"materialCode":null,"sellerCompanyName":null,"produceRegisterNum":null,"productLineName":null,"auditByName":null,"orderSource":null,"changeTypeList":null,"isRebateEdit":null,"jdeType":null,"pageSize":8,"pageStart":1,"orderChangeType":null,"snSgin":null,"changeSign":null,"customerCode":null,"distributionType":null,"busCustomerCode":null,"loginName":null,"cancelSign":0,"shipmentType":null,"startTime":null}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":"OK"}
+
+#需求单草稿订单删除接口地址
+"url": "/order/back/deleteDraft"
+json_headers2: {
+ "Cmdc_access_token": "%s"
+}
+
+#测试场景一:删除已保存订单状态的需求单
+"payload2": {"demandId": "6585"}
+#预期结果
+"checkDict3": {'success': True, 'code': '200', 'message': 'OK', 'data': None, 'freshToken': None}
+
+#测试场景二:重复删除已保存订单状态的需求单或删除其他状态下需求单
+"payload3": {"demandId": "11095"}
+#预期结果
+"checkDict4": {'success': True, 'code': '200', 'message': 'OK', 'data': None, 'freshToken': None}
diff --git a/data/cmdc_demand_list_pc/data b/data/cmdc_demand_list_pc/data
new file mode 100644
index 0000000000000000000000000000000000000000..d2da9288150a92f75fcc3dbcc760df92f4e2f736
--- /dev/null
+++ b/data/cmdc_demand_list_pc/data
@@ -0,0 +1,47 @@
+# 多彩商城登录信息
+"username": "Test001"
+"password": "Aa123456"
+
+
+#需求单列表接口地址
+"url1": "/order/public/ownListDemand"
+
+#测试场景:获取用户多彩商城对应的需求单列表信息
+json_headers1: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload1": {"sellerCompanyCodes":[],"materialCode":"","productCode":"","productInfoValue":"","manufacturerList":null,"orderNum":"","paymentType":null,"preferenceType":null,"changeSign":null,"mainOrderStatus":null,"shipmentType":null,"pageStart":1,"pageSize":10}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":"OK"}
+
+
+
+#需求单列表取消接口地址
+"url2": "/order/public/customerApplyCancel"
+
+#测试场景:在用户多彩商城中的需求单列表进行需求单取消操作
+json_headers2: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload2": {"demandCode":"16936462668632521","remark":"123"}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":"OK","data":1,"freshToken":null}
+
+
+#需求单列表删除接口地址
+"url3": "/order/mall/deleteDraft"
+
+#测试场景:在用户多彩商城中的需求单列表进行需求单删除操作
+json_headers3: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload3": {"demandParentId":"6297"}
+#预期结果
+checkDict3: {"success":true,"code":"200","message":"OK","data":null,"freshToken":null}
+
diff --git a/data/cmdc_frequent_purchase/data b/data/cmdc_frequent_purchase/data
new file mode 100644
index 0000000000000000000000000000000000000000..2317f39d249c2792f82c39f5c334994a0523f2ba
--- /dev/null
+++ b/data/cmdc_frequent_purchase/data
@@ -0,0 +1,64 @@
+# 多彩商城登录信息
+"username": "Test001"
+"password": "Aa123456"
+
+
+#常购清单列表新增商品接口地址
+"url1": "/product/mall/addFrequentPurchase"
+
+#测试场景:新增商品至用户的常购清单列表
+json_headers1: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+# 添加的商品不需要装机日期
+"payload1": {"currentCompanyId":2,"productId":"9","quantity":1,"agreementPriceId":0,"price":68.88}
+#预期结果
+checkDict1: {"success":true,"code":"200","message":"OK","data":"ok"}
+
+
+#测试场景:新增不存在的商品至用户的常购清单列表
+json_headers4: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload4": {"currentCompanyId":2,"productId":"954647456754764","quantity":1,"agreementPriceId":0,"price":68.88}
+#预期结果
+checkDict4: {"success":false,"code":"1078","message":"该商品不存在,加入购物车失败","data":null,"freshToken":null}
+
+
+
+
+
+
+
+#获取用户常购清单列表接口地址
+"url2": "/product/mall/queryTotalFrequentPurchaseList"
+
+#测试场景:获取用户常购清单列表
+json_headers2: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload2": {"productName":"","materialCode":"","manufacturer":"","licenseCode":"","timeSortStatus":0,"pageSize":100,"pageStart":1}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":"OK"}
+
+
+
+#常购清单商品删除接口地址
+"url3": "/product/mall/removeFrequentPurchase"
+
+#测试场景:从用户常购清单列表删除已添加的商品
+json_headers3: {
+ "Cmdc_access_token": "%s",
+ "Sourcetype": "mall"
+}
+
+"payload3": {"frequentPurchaseIdList":["%s"]}
+#预期结果
+checkDict3: {"success":true,"code":"200","message":"OK","data":"ok"}
+
diff --git a/data/cmdc_login/data b/data/cmdc_login/data
new file mode 100644
index 0000000000000000000000000000000000000000..828411e675910e9ce3159ab6073a63c880b576d1
--- /dev/null
+++ b/data/cmdc_login/data
@@ -0,0 +1,13 @@
+# 多彩商城图形验证码url
+"getVerifyCode_url": "/sso/getVerifyCode"
+# 多彩商城登录地址
+"maii_login_url": "/sso/mallLogin"
+# 多彩商城登录信息
+"do_username": "Test001"
+"do_password": "Aa123456"
+# 国药运营后台管理系统登录地址
+"do_login_url": "/sso/doLogin"
+# 多彩商城登录信息
+"username": "admin1"
+"password": "Aa123456"
+
diff --git a/data/cmdc_purchase_list/data b/data/cmdc_purchase_list/data
new file mode 100644
index 0000000000000000000000000000000000000000..5277203e2e4705898f715ed89e95b04118f9e518
--- /dev/null
+++ b/data/cmdc_purchase_list/data
@@ -0,0 +1,16 @@
+#采购单查询接口
+"url": "/order/purchase/list"
+
+
+# 后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers1: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+"payload1": {"billNo":"","billStatusList":[],"creator":"","demandNo":"","startTime":"","endTime":"","times":null,"status":null,"pageNumber":1,"pageSize":8}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":null}
+
diff --git a/data/cmdc_query_customer/data b/data/cmdc_query_customer/data
new file mode 100644
index 0000000000000000000000000000000000000000..ef4ee81a3a6f51d3d8f1fe696deb9da78b06b14b
--- /dev/null
+++ b/data/cmdc_query_customer/data
@@ -0,0 +1,16 @@
+#采购单查询接口
+"url": "/user/querySubCustomerPage"
+
+
+# 后台运营管理系统登录信息
+"username": "admin2"
+"password": "Aa123456"
+
+json_headers1: {
+ "Content-Type": "application/json",
+ "Cmdc_access_token": "%s"
+}
+"payload1": {"disableSign":0,"status":3,"telephone":"","userNo":"","userName":"","customerCompanyName":"","pageSize":10,"pageStart":1,"total":0}
+#预期结果
+checkDict2: {"success":true,"code":"200","message":"OK"}
+
diff --git a/data/data b/data/data
new file mode 100644
index 0000000000000000000000000000000000000000..a035c748276198b56d1434cb2767b607276903f8
--- /dev/null
+++ b/data/data
@@ -0,0 +1,21 @@
+# 默认数据
+"enc_user_id": "u779700044448"
+"headers": {
+ 'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}',
+ 'platform': "1",
+ 'signature': "144c6b3c78fc20ad57da1ebdb879615b",
+ 'token': "%s",
+ 'timestamp': "%s",
+}
+payload: {}
+"post_headers": {
+ 'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}',
+ 'platform': "1",
+ 'signature': "144c6b3c78fc20ad57da1ebdb879615b",
+ 'token': "%s",
+ 'timestamp': "%s",
+ 'Content-Type': "%s",
+}
+default_contentType: "application/x-www-form-urlencoded"
+
+login_url: "http://backend-web-backend-web.1.java.babytree-test.com/sso-service/login?loginName=test001&pwd=test001@123"
\ No newline at end of file
diff --git a/data/demo-ui/data b/data/demo-ui/data
new file mode 100644
index 0000000000000000000000000000000000000000..bcf051652a30377a92609280f8a8ee054590c519
--- /dev/null
+++ b/data/demo-ui/data
@@ -0,0 +1,6 @@
+# 登录内网测试环境地址
+"spd3_login_url": "/hospitaltest2/spd/#/login?redirect=/paltform/info0/paltform/product/calatog/paltform/product/calatog"
+"username": "//input[@placeholder='请输入用户名']"
+"password": "//input[@placeholder='请输入密码']"
+"login_button": "//span[text()='登 录']"
+"name1": "xhs"
\ No newline at end of file
diff --git a/data/hosts b/data/hosts
new file mode 100644
index 0000000000000000000000000000000000000000..c85b2c4b3e1587afe5fbbcd550ccf22ac9ce7735
--- /dev/null
+++ b/data/hosts
@@ -0,0 +1,25 @@
+
+172.16.10.203 api.babytree-dev.com
+172.16.10.203 api-test11.babytree-test.com
+172.16.10.203 api.test11.babytree-fpm.com
+172.16.10.203 api.babytree.com
+# online
+
+10.54.11.80 idb.baobaoshu.com
+10.54.11.80 grafana.baobaoshu.com
+10.54.11.80 zabbix.baobaoshu.com
+10.54.11.80 cacti.baobaoshu.com
+10.54.11.80 ucm.baobaoshu.com
+10.54.11.80 rundeck.baobaoshu.com dubbo.baobaoshu.com
+10.54.11.80 cmdb.baobaoshu.com
+10.54.11.80 apollo.baobaoshu.com muse.baobaoshu.com
+10.54.11.80 splunk.baobaoshu.com
+
+172.16.10.203 test100.babytree-dev.com g.babytree-dev.com
+122.9.41.244 gerrit.babytree-inc.com
+10.54.17.153 localproxy.baobaoshu.com
+192.168.24.43 gerrit.mtmm.com
+10.17.65.22 case.cmic.com.cn
+10.54.50.90 sso.baobaoshu.com
+8.131.247.52 docp.plt.babytree-inc.com
+
diff --git a/data/idbSet b/data/idbSet
new file mode 100644
index 0000000000000000000000000000000000000000..8cf1f2dd2d7ba04ed03c8ee09eace12837f5f7b8
--- /dev/null
+++ b/data/idbSet
@@ -0,0 +1,97 @@
+user:
+ live: 6ea032c10ef24b10aa7fcfe5424446afin01
+ pre: 6ea032c10ef24b10aa7fcfe5424446afin01
+
+health:
+ live: 6013c13418a245b9866e9cdec92ff9b9in01
+ pre : 6013c13418a245b9866e9cdec92ff9b9in01
+ sit: health
+
+alimall:
+ live: f4d539e7b8204a8890929320f2052d68in01
+ pre : f4d539e7b8204a8890929320f2052d68in01
+ sit: alimall
+
+promotion:
+ live: 9e33dd3e26a54c8caeaf871e873edb38in01
+ pre: 9e33dd3e26a54c8caeaf871e873edb38in01
+ sit: promotion
+
+salesorder:
+ live: 7f9c968b57084c0782aeb620e2a064b1in01
+ pre : 7f9c968b57084c0782aeb620e2a064b1in01
+ sit: salesorder
+
+seller:
+ live: 2888c1775daf4c60897073068b6c219ain01
+ pre: 2888c1775daf4c60897073068b6c219ain01
+ sit: seller
+
+cms:
+ live: 790afd094355416895ca39891c09c0d3in01
+ pre: 790afd094355416895ca39891c09c0d3in01
+ sit: cms
+
+community:
+ live: 790afd094355416895ca39891c09c0d3in01
+ pre: 790afd094355416895ca39891c09c0d3in01
+ sit: community
+
+price:
+ live: 6ea032c10ef24b10aa7fcfe5424446afin01
+ pre: 6ea032c10ef24b10aa7fcfe5424446afin01
+ sit: price
+
+medical:
+ live: 89a813f93c454db0a23c25f95c0d2e2cin01
+ pre: 89a813f93c454db0a23c25f95c0d2e2cin01
+ sit: medical
+
+bcoin:
+ live: f4d539e7b8204a8890929320f2052d68in01
+ pre: f4d539e7b8204a8890929320f2052d68in01
+ sit: bcoin
+
+edu:
+ live: 8e7f2572f92e49f4b0061f75682470eain01
+ pre: 8e7f2572f92e49f4b0061f75682470eain01
+ sit: edu
+
+account:
+ live: 2888c1775daf4c60897073068b6c219ain01
+ pre: 2888c1775daf4c60897073068b6c219ain01
+ sit: account
+
+finance:
+ live: 6013c13418a245b9866e9cdec92ff9b9in01
+ pre: 6013c13418a245b9866e9cdec92ff9b9in01
+ sit: finance
+
+socialec:
+ live: 89a813f93c454db0a23c25f95c0d2e2cin01
+ pre: 89a813f93c454db0a23c25f95c0d2e2cin01
+ sit: socialec
+
+item:
+ live: 2888c1775daf4c60897073068b6c219ain01
+ pre: 2888c1775daf4c60897073068b6c219ain01
+ sit: item
+
+new_wms:
+ live: 89a813f93c454db0a23c25f95c0d2e2cin01
+ pre: 89a813f93c454db0a23c25f95c0d2e2cin01
+ sit: new_wms
+
+distribution:
+ live: 8e7f2572f92e49f4b0061f75682470eain01
+ pre: 8e7f2572f92e49f4b0061f75682470eain01
+ sit: distribution
+
+supplier:
+ live: 790afd094355416895ca39891c09c0d3in01
+ sit: supplier
+
+local:
+ live: pc-2zerh8cqy748e33i8
+ sit : b9e5fbff-08e9-11ed-866f-00163e324a72
+
diff --git a/data/msg b/data/msg
new file mode 100644
index 0000000000000000000000000000000000000000..e5a0b6ebc82d429bda9d6ce6fe209851aff43827
--- /dev/null
+++ b/data/msg
@@ -0,0 +1,4 @@
+"dingding_msg":
+- 59d455293168352cecfaa4fb67f2568f3fa54453a2fdb87ce9817c316dc41b57
+
+
diff --git a/data/sql b/data/sql
new file mode 100644
index 0000000000000000000000000000000000000000..55789897be35bddc2f676399c4b3425e72a7825d
--- /dev/null
+++ b/data/sql
@@ -0,0 +1,11 @@
+"select_user_token":
+- user
+- select token from user.uc_user_token where enc_user_id=%s;
+
+"exp_expert":
+- medical
+- SELECT id,expert_name,base_service_count,service_count from exp_expert where deleted=%s and status=%s;
+
+"select_memberPrivilegeId":
+- user
+- SELECT id ,enc_user_id,privilege_type FROM uc_member_privilege WHERE left_times>0 and status=1 AND privilege_type IN (5,12,9,2,10,11) AND start_time NOW() AND enc_user_id IN (SELECT enc_user_id FROM uc_user_member WHERE final_end_time >NOW() AND level_type_code=001) order by id desc limit 1
\ No newline at end of file
diff --git "a/data/\347\224\265\345\225\206/data" "b/data/\347\224\265\345\225\206/data"
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git "a/data/\347\224\265\345\225\206/message" "b/data/\347\224\265\345\225\206/message"
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git "a/data/\347\224\265\345\225\206/sql" "b/data/\347\224\265\345\225\206/sql"
new file mode 100644
index 0000000000000000000000000000000000000000..f162a54c41386efd5fbdfc1cb4784e3ca9db7be2
--- /dev/null
+++ "b/data/\347\224\265\345\225\206/sql"
@@ -0,0 +1,6 @@
+# 存储业务sql
+
+"select_patient":
+- medical
+- SELECT relation_id,name,gender,id FROM `patient` where enc_user_id=%s and deleted=0;
+
diff --git a/distribute.py b/distribute.py
new file mode 100644
index 0000000000000000000000000000000000000000..9955fac3f87ab76d3af50feb9dcc67e60eda9b01
--- /dev/null
+++ b/distribute.py
@@ -0,0 +1,438 @@
+# -*- encoding=utf-8 -*-
+import os
+import sys
+import requests
+import math
+import re
+import time
+from bs4 import BeautifulSoup
+from random import shuffle
+import datetime
+import pypinyin
+import hashlib
+
+
+def exchange(word):
+ """
+ 中文转拼音
+ :param word:
+ :return:
+ """
+ s = ''
+ for i in pypinyin.pinyin(word, style=pypinyin.NORMAL):
+ s += ''.join(i)
+ return s
+
+
+def get_message(case_path, case_name):
+ # 从注释中获取某个文件的 case tag 信息
+ tags = []
+ pyfile = open(case_path + os.sep + case_name + '.py', 'r', encoding='utf-8')
+ lines = pyfile.readlines()
+ for line in lines:
+ if 'case_tag' in line:
+ line = line.split('case_tag')[-1]
+ # 对不规范的写法做一些处理,如中文分号, 中文逗号,多空格等。。
+ line = re.sub(' ', '', line)
+ line = line.replace(',', ',').replace(':', '').replace(':', '')
+ line = line.strip().strip('\n')
+ tags = line.split(',')
+ pyfile.close()
+ return tags
+
+
+def get_all_dir(case_name, case_path):
+ """
+ :return: 获得需要执行的所有air的文件夹,同时创建单个log目录
+ """
+ case_list = []
+ for dirs in os.listdir(case_path):
+ isdir = os.path.join(case_path, dirs)
+ if os.path.isdir(isdir) and isdir.endswith(".air"):
+ air_name = dirs.replace('.air', '')
+ if 'all' in case_name or air_name in case_name:
+ # script = os.path.join(case_path, isdir)
+ case_list.append(air_name)
+ return case_list
+
+
+def get_case_tag_list(case_path, cases):
+ """
+ 遍历case目录下的文件,从文件中获取case tag,加入列表中
+ 如果想同时满足两个条件,用#分割
+ """
+ tagList = cases.split('#')
+ env = os.environ['ENV']
+ case_list = []
+ for f in os.listdir(case_path):
+ script = os.path.join(case_path, f)
+ air_name = f.replace('.air', '')
+ case_tags = get_message(script, air_name)
+ flag = False
+ for con in tagList:
+ conList = con.split(',')
+ if list(set(case_tags) & set(conList)):
+ flag = True
+ else:
+ flag = False
+ break
+ if flag and (env in case_tags or env in ('sit', 'sita')):
+ case_list.append(air_name)
+ return case_list
+
+
+def get_dir_exist(path, div_num):
+ """
+ 判断报告文件夹是否存在
+ """
+ for i in range(div_num):
+ test_path = path + os.sep + 'report_' + str(i+1)
+ if not os.path.isdir(test_path):
+ return False
+ return True
+
+def merge_report(div_num, report_path):
+ """
+ 合并报告
+ """
+ total_cases = 0
+ succ_cases = 0
+ max_time = 0.0
+ time_str = ''
+ summary_r = open(report_path + os.sep + 'summary.html', 'r', encoding='utf-8')
+ lines = summary_r.readlines()[:43]
+ summary_r.close()
+ summary_w = open(report_path + os.sep + 'summary.html', 'w', encoding='utf-8')
+ for i in range(div_num):
+ file = report_path + os.sep + 'report_' + str(i+1) + os.sep + 'summary.html'
+ print(file)
+ htmlfile = open(file, 'r', encoding='utf-8')
+ htmlhandle = htmlfile.read()
+ soup = BeautifulSoup(htmlhandle, 'html.parser')
+ tables = soup.find_all("table")
+ #print(tables)
+ #第一个table存的是概要,第二个table存的是具体case。先读第一个表
+ tab = tables[0]
+ tr = tab.findAll('tr')[1]
+ tds = tr.findAll('td')
+ total_cases += int(tds[0].getText())
+ succ_cases += int(tds[1].getText())
+ minite = int(tds[2].getText().split('分')[0])
+ second = int(tds[2].getText().split('分')[1].split('秒')[0])
+ number = minite + second/60
+ #print(number)
+ if number > max_time:
+ max_time = number
+ time_str = tds[2].getText()
+ #再读第二个表
+ tab = tables[1]
+ trs = tab.findAll('tr')
+ print(len(trs))
+ for i in range(len(trs)):
+ if i == 0:
+ continue
+ tds = trs[i].findAll('td')
+ case_name = tds[0].getText()
+ status = tds[1].getText()
+ run_time = tds[2].getText()
+ if status == '成功':
+ html = '''
+
+ %s |
+ %s |
+ %s |
+
''' % (case_name, case_name, status, run_time)
+ else:
+ html = '''
+
+ %s |
+ %s |
+ %s |
+
''' % (case_name, case_name, status, run_time)
+ lines.append(html)
+ #print(html)
+ pass_rate = round(succ_cases*100/total_cases, 2)
+ summary = '''
+
+
+
+
+
+ 用例总数 |
+ 成功数 |
+ 运行用时 |
+ 成功率 |
+
+
+
+ %s |
+ %s |
+ %s |
+ %s |
+
+
+
+
+
+
+
+
+ 用例名称 |
+ 执行结果 |
+ 执行时间(秒) |
+
+
+''' % (total_cases, succ_cases, time_str, str(pass_rate))
+ summary_w.write(summary)
+ for line in lines:
+ summary_w.write(line)
+ end_html = '''
+
+
+
+