凭证组件¶
凭证组件(模型)是对凭证模型相关接口的二次封装,主要提供凭证数据保存、查询、校验、过账和取消过账等功能
实例化凭证组件¶
[2]:
from debug import para1, para2
from deepfos.element.journal import JournalModel
# 创建凭证组件元素对象
journal = JournalModel('ZHY_TEST_0703_10')
凭证模型数据保存¶
凭证组件类的save
方法提供了通过SDK保存凭证模型数据的功能。
save
方法有以下参数:
head_df: DataFrame类型,凭证头表的数据(字段名与凭证模型上头表的字段名一一对应)
line_df: DataFrame类型,凭证行表的数据(字段名与凭证模型上行表的字段名一一对应)
callback: 回调脚本配置信息,若为None,则保存模型数据在结束后不会调用脚本,如果配置了回调, 则不论保存是否保存成功,都将在结束后调用回调该脚本
relation_field:用于指定凭证头、行表的关联字段,即通过该字段确定凭证头表对应的 凭证行表数据,默认值是 journal_id
enable_create:bool类型,是否启用创建人、创建时间自动赋值,默认为True
enable_default_value:bool类型,是否启用字段值为空时使用默认值填充,默认为True
enable_repeat_check:bool类型,是否启用业务主键重复的校验,默认为True
enable_required:bool类型,是否启用 必填字段的校验,默认为True
enable_valid_range:bool类型,是否启用 有效性范围的校验,默认为True
enable_all_errors:bool类型,是否启用 一次性校验所有规则和数据,默认为True
enable_need_one_line:bool类型,是否启用 凭证行表至少需要一条数据的校验,默认为True
sync: bool类型,调用模型数据保存接口的类型,同步(True)/异步(False),默认为同步, 异步保存接口会在收到保存请求时立刻响应,同步保存接口会等保存数据完成后才响应,并返回保存信息, 如果设置为同步,当数据量过大时可能会时间过长时,可能因超出SDK的接口响应超时时间而报错
[3]:
import pandas as pd
t = journal.table
where = (t.journal_id.isin(['head_main_id_202306080001', 'head_main_id_202306080002']))
# 调用删除接口
journal.delete(where)
# 凭证头表数据
head_df = pd.DataFrame([
{
"_type": "type_account_01", "journal_id": "head_main_id_202306080001",
"is_balance": "true", "scenario": "Actual", "version": "Working",
"value": "CNY", "entity": "[TotalEntity].[A]", "year": "2023",
"period": "12", "approve_time": "2023-05-23 15:56:00", "convert_date": "2023-05-23"
},
{
"_type": "type_account_01", "journal_id": "head_main_id_202306080002",
"is_balance": "true", "scenario": "Actual","version": "Working",
"value": "CNY","entity": "[TotalEntity].[A]", "year": "2023",
"period": "12", "approve_time": "2023-05-23 15:56:00","convert_date": "2023-05-23"
}
])
# 凭证行表数据
line_df = pd.DataFrame([
{
"journal_id": "head_main_id_202306080001","line_no": "1","account": "100101",
"movement": "INC","trx_debit": "130","debit": "130","comment_line": "line1"
},
{
"journal_id": "head_main_id_202306080001","line_no": "2","account": "100101",
"movement": "INC","trx_credit": "130","credit": "130","comment_line": "line2"
},
{
"journal_id": "head_main_id_202306080002","line_no": "1","account": "100101",
"movement": "INC","trx_debit": "130","debit": "130","comment_line": "line1"
},
{
"journal_id": "head_main_id_202306080002","line_no": "2", "account": "100101",
"movement": "INC", "trx_credit": "130","credit": "130","comment_line": "line2"
}
])
# 回调脚本
callback_info = {"elementName": "testPy01", "elementType": "PY", "path": "/zhy_test","callbackParams": {"year": "2023", "period": "03"}}
# 调用保存
res = journal.save(head_df=head_df,
line_df=line_df,
callback=callback_info,
enable_default_value=True,
enable_required=True,
sync=True)
凭证数据查询¶
凭证组件类的query
方法提供了通过SDK查询凭证模型数据的功能
query
方法有以下参数:
where: 查询条件,条件字段名必须与凭证头、行表上字段名保持一致(格式 可参考 数据表(DataTableMySQL)的条件格式) 当查询条件为空时,将返回该凭证模型下的所有数据
head_column: 查询返回的头表字段集合,为空时,将返回凭证头表上所有字段 如: [“entity”,“year”,“journal_id”] (不管是否指定了返回字段,其中 journal_id 字段一定会返回)
line_column: 查询返回的行表字段集合,为空时,将返回凭证行表上所有字段 如: [“journal_id”,“line_no”,“account”,“trx_amount”] (不管是否指定了返回字段,其中 journal_id 和 line_no 字段一定会返回)
sort_config: 排序配置集合 如: [{“col”: “journal_id”,“type”: “asc”},{“col”: “line_no”,“type”: “asc”}] (默认按journal_id和line_no 升序,type 为空时,默认按ASC排序)
[5]:
t = journal.table
# 查询数据的条件 (格式 请参考 数据表(DataTableMySQL)的条件格式写法)
where = (t.year == '2023')
# 指定返回的头表DataFrame 列字段
head_column = ["entity", "journal_id", "year", "period", "journal_name"]
# 指定返回的行表DataFrame 列字段
line_column = ["journal_id", "line_no", "account", "trx_amount", "debit", "credit"]
# 指定排序字段
sort = [{"col": "journal_id", "type": "desc"}, {"col": "line_no", "type": "asc"}]
# 调用查询接口,并返回 头、行 的DataFrame
head_df, line_df = journal.query(where=where, head_column=head_column, line_column=line_column, sort_config=sort)
[4]:
head_df
[4]:
entity | journal_id | period | year | journal_name | |
---|---|---|---|---|---|
0 | [TotalEntity].[B] | head_main_id_202306080006 | 12 | 2021 | NaN |
1 | [TotalEntity].[B] | head_main_id_202306080005 | 12 | 2021 | NaN |
2 | [TotalEntity].[B] | 2023062500002 | 2 | 2021 | 2023062500002-name |
3 | A | 2023062500001 | 2 | 2021 | 2023062500001-name |
[5]:
line_df
[5]:
account | debit | journal_id | line_no | credit | |
---|---|---|---|---|---|
0 | 100101 | 130.0 | head_main_id_202306080006 | 1 | NaN |
1 | 100101 | NaN | head_main_id_202306080006 | 2 | 130.0 |
2 | 100101 | 130.0 | head_main_id_202306080005 | 1 | NaN |
3 | 100101 | NaN | head_main_id_202306080005 | 2 | 130.0 |
4 | 110101 | NaN | 2023062500002 | 1 | NaN |
5 | 110101 | 1.0 | 2023062500001 | 1 | NaN |
凭证数据校验¶
凭证组件元素类的check
方法提供了通过程序校验凭证数据的功能。
check
方法传递一个where条件来筛选数据,如果有符合条件的数据,且校验成功,则会将凭证头表上的check_status字段的值改为’true’,失败则不改
[6]:
# 筛选条件 (格式 请参考 数据表(DataTableMySQL)的条件格式写法)
where = (
((t.year == '2023') | (t.journal_id == 'head_main_id_202306080001'))
&
(t.entity.isin(['A','B']) | t.journal_id.like('head_main_id_202306080002%'))
)
# 调用校验接口
journal.check(where)
[6]:
JmPostResultVO(fmPostMsg=None, msg=None, postResult=None, success=False)
凭证数据删除¶
[8]:
# 删除数据的条件 (格式 请参考 数据表(DataTableMySQL)的条件格式写法)
where = (
((t.year == '2023') | (t.journal_id == 'head_main_id_202306080001'))
&
(t.entity.isin(['A','B']) | t.journal_id.like('head_main_id_202306080002%'))
)
# 调用删除接口
journal.delete(where)
凭证数据过账¶
凭证组件元素类的posting
方法提供了凭证数据过账(过账到模型上配置的财务模型)的功能。
posting
方法传递一个where条件来筛选数据,如果有符合条件的数据 且过账成功,则会将凭证头表上的post_status字段的值改为’true’,失败则不改
[9]:
# 筛选条件 (格式 请参考 数据表(DataTableMySQL)的条件格式写法)
where = (
((t.year == '2023') | (t.journal_id == 'head_main_id_202306080001'))
&
(t.entity.isin(['A','B']) | t.journal_id.like('head_main_id_202306080002%'))
)
# 调用过账接口
journal.posting(where)
凭证数据取消过账¶
凭证组件元素类的cancel_post
方法提供了凭证数据取消过账(从模型上配置的财务模型中删除已经过账的数据)的功能。
cancel_post
方法传递一个where条件来筛选数据,如果有符合条件的数据 且取消过账成功,则会将凭证头表上的post_status字段的值改为’false’,失败则不改
[11]:
# 筛选条件 (格式 请参考 数据表(DataTableMySQL)的条件格式写法)
where = (
((t.year == '2023') | (t.journal_id == 'head_main_id_202306080001'))
&
(t.entity.isin(['A','B']) | t.journal_id.like('head_main_id_202306080002%'))
)
journal.cancel_post(where)