凭证组件

凭证组件(模型)是对凭证模型相关接口的二次封装,主要提供凭证数据保存、查询、校验、过账和取消过账等功能

实例化凭证组件

[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)