# coding = utf-8
# By TangRuCheng 2020-12-02
import requests
import json
"""定义API类"""
class K3CloudWebAPI():
def __init__(self,
serverip,
acctId,
username,
password,
lcid=2052):
self.serverip = serverip
self.acctId = acctId
self.username = username
self.password = password
self.lcid = lcid
# 构建登录请求参数
login_url = f'http://{self.serverip}/k3cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc'
login_data = {
"acctId": self.acctId,
"username": self.username,
"password": self.password,
"lcid": self.lcid
}
# 登录k3cloud,并返回cookies;登录超时设置为5分钟
login_response = requests.post(login_url, data=login_data, timeout=300*1000)
login_text = json.loads(login_response.text)
self.cookies = login_response.cookies
# 判断登录状态
if login_text['IsSuccessByAPI'] is True:
self.login_result = '登录成功'
else:
self.login_result = '登录失败'
"""定义查询"""
def query(self,
FormId,
FieldKeys, # 查询字段集合
FilterString='', # 过滤条件
OrderString='', # 排序字段
StartRow=0,
Limit=0):
# 构建查询请求的参数
query_url = f'http://{self.serverip}/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc'
data = json.dumps({
"FormId": FormId,
"FieldKeys": FieldKeys,
"FilterString": FilterString,
"OrderString": OrderString,
"StartRow": StartRow,
"Limit": Limit
}) # 编码json对象
post_data = {'data': data}
# 查询数据,并返回查询结果
query_response = requests.post(url=query_url, data=post_data, cookies=self.cookies)
response_text = json.loads(query_response.text)
field_keys_list = FieldKeys.split(',') # 将查询的字段拆分成列表
# 将查询的字段和单据数据打包成字典
bills = list()
for field_keys_data in response_text:
bill = {field_keys_list[i]: field_keys_data[i] for i in range(len(field_keys_list))} # 字典推导式
bills.append(bill) # 将所有的单据数据放在一个列表里
return bills
"""定义保存/修改/暂存"""
def save(self,
formid,
bill_head, # 单据头数据
body_name='', # 单据体名称
body_data=[{}], # 单据体明细
NeedReturnFields=[], # 需返回结果的字段集合
IsDeleteEntry=False, # 默认不删除已存在的分录
InterationFlags='',
IsAutoSubmitAndAudit=True, # 默认自动提交、审核单据
is_Draft=False # 是否暂存
):
# 默认是保存接口地址,如果is_Draft为True则为暂存接口地址
operate = 'Save'
if is_Draft == True:
operate = 'Draft'
save_url = f'http://{self.serverip}/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.{operate}.common.kdsvc' # 默认是保存接口地址,Draft是暂存
# 构建表单数据
Model = bill_head # 先赋值给Model
Model.update({body_name: body_data})
data = json.dumps({
'NeedReturnFields': NeedReturnFields,
'IsDeleteEntry': IsDeleteEntry,
'InterationFlags': InterationFlags,
'IsAutoSubmitAndAudit': IsAutoSubmitAndAudit,
'Model': Model
}) # 编码json对象
post_data = {
formid: formid,
data: data
} # 构建请求data参数
# 保存数据,接受返回信息
save_response = requests.post(url=save_url, data=post_data, cookies=self.cookies)
save_result = json.loads(save_response.text)
save_status = save_result['Result']['ResponseStatus']
# 判断保存结果
if save_status['IsSuccess'] is True:
if save_result['Result']['NeedReturnData'] == [{}]:
return '保存成功'
else:
return save_result['Result']['NeedReturnData']
else:
return save_status['Errors']
"""定义提交/审核/反审核/删除"""
def operate(self,
formid,
Numbers, # 单据编码,列表类型
operate_type):
operate_dict = {
'提交': 'Submit',
'审核': 'Audit',
'反审核': 'UnAudit',
'删除': 'Delete'
}
operate_url = f'http://{self.serverip}/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.{operate_dict[operate_type]}.common.kdsvc' # 操作类型对应的服务地址
data = json.dumps({Numbers: Numbers})
post_data = {
formid: formid,
data: data
}
operate_response = requests.post(url=operate_url, data=post_data, cookies=self.cookies)
operate_result = json.loads(operate_response.text)
operate_status = operate_result['Result']['ResponseStatus']
# 判断结果
if operate_status['IsSuccess'] is True:
return f'{operate_type}操作成功'
else:
return operate_result['Result']['Errors']