分类 工作 下的文章

本文介绍了成本对象类型表、维度表、信息表等表之间的关联关系及生成时机,提供了相关的SQL查询脚本。同时,还阐述了如何查询成本计算结果表的表结构关联关系,并说明了如何查询历史期间数据和期间字段。此外,还提及了费用分配相关表结构和查询方法。

有用

反馈

持续更新......

---------------------------------------------------------------------------------------------------------


1、成本对象类型表、维度表、信息表关联关系,生成的时机

关联关系参考脚本:

select * from T_CB_PROORDERTYPE type1

       inner join T_BD_MATERIAL mat on mat.FMATERIALID=type1.FPRODUCTID

       inner join T_CB_PROORDERDIME dime1 on type1.FPROORDERTYPE=dime1.FPROORDERTYPE and type1.FCOSTCENTERID=dime1.FCOSTCENTERID

       and mat.FMASTERID=dime1.FPRODUCTID and type1.FNUMBER=dime1.FPRODUCTNO and type1.FSEQ=dime1.FBILLSEQ

       inner join T_CB_PROORDERINFO info on info.FPRODUCTDIMEID= dime1.FPRODUCTDIMEID  


生成时机:

T_CB_PROORDERTYPE   普通生产下达,委外生产下达,简单生产入库,重复生产入库;(同理:投入产量归集表T_CB_INPUTQTYENTRY )

T_CB_PROORDERDIME   费用分配之前,根据投入信息,入库信息获取工单信息;

T_CB_PROORDERINFO   期初和期末标识, 期初是结账的时候,期末是成本计算后写的。


关于许多小伙伴咨询数据字典的问题,请参考帖子答复的方法1下载数据字典:

https://vip.kingdee.com/questions/333685685569759744/answers/333813294701778688?productLineId=1


需注意此版数据字典是星空7.6版本的,后续版本若有添加新字段,数据字典中是没有的。

例如T_CB_PROORDERTYPE,在8.0版本添加了FMASTERID(物料FMASTERID内码) 和 FSUPPLIERID(供应商内码)

图片.png

FNUMBER:生产、委外订单的单据编号;简单生产手工录入的生产编号(前提是勾选了生产编号影响成本)

FSEQ:生产、委外订单分录行号,简单生产和重复生产都是0

FDATE:生产、委外订单的下达日期或简单生产入库单的单据日期

FPROORDERTYPE :业务类型,枚举值如下

PO:普通生产,生产订单

SPO:简单生产

OUTSRC:委外生产,委外订单

TSO:费用追踪至出库单 // 销售出库,费用追踪至产品,费用归集单录入的销售费用

TSR:费用追踪至退货单 //销售退货单

TP:费用追踪至产品

REM:重复生产


T_CB_PROORDERDIME

图片.png

FPRODUCTID:物料表的FMASTERID

FPRODUCTTYPE:1 主产品 2 联产品 3 副产品



2、成本计算结果表的表结构

关联关系参考脚本:

select * from T_CB_PROORDERTYPE type1

       inner join T_BD_MATERIAL mat on mat.FMATERIALID=type1.FPRODUCTID

       inner join T_CB_PROORDERDIME dime1 on type1.FPROORDERTYPE=dime1.FPROORDERTYPE and type1.FCOSTCENTERID=dime1.FCOSTCENTERID

       and mat.FMASTERID=dime1.FPRODUCTID and type1.FNUMBER=dime1.FPRODUCTNO and type1.FSEQ=dime1.FBILLSEQ

       inner join T_CB_PROORDERINFO info on info.FPRODUCTDIMEID= dime1.FPRODUCTDIMEID

       inner join T_CB_COSTCALEXPENSE exp1 on exp1.FID=info.FID

       inner join T_CB_COSTCALEXPENSEDETAIL exp1detail on exp1.FENTRYID=exp1detail.FENTRYID


若查询历史期间的数据,则是T_CB_PROORDERINFO_H、T_CB_COSTCALEXPENSE_H、T_CB_COSTCALEXPENSE_H

同理:T_CB_COSTMATTERIAL  T_CB_COSTMATTERIALDETAIL


如何查询期间字段

-- T_CB_PROORDERINFO(本期)或T_CB_PROORDERINFO_H(历史期间)的期间字段FACCTGID

-- FACCTGID  核算组织+核算体系+会计政策+期间

select syst.FNUMBER,org.FNUMBER,po.FNUMBER,U0.FYEAR,U0.FPERIOD,U0.FID as FACCTGID,U1.FDIMENSIONID

from T_HS_OUTACCTG U0

INNER JOIN T_HS_CALDIMENSIONS U1 ON U0.FDIMENSIONID = U1.FDIMENSIONID

inner join T_ORG_ACCOUNTSYSTEM syst on syst.FACCTSYSTEMID=U1.FACCTSYSTEMID --and syst.FNUMBER=''--核算体系编码

inner join T_ORG_ORGANIZATIONS org on  org.FORGID=U1.FFINORGID --and org.FNUMBER=''--组织编码

inner join T_FA_ACCTPOLICY po on po.FACCTPOLICYID=U1.FACCTPOLICYID --and po.FNUMBER=''--会计政策编码

--where U0.FYEAR = 2021 AND U0.FPERIOD = 7--期间

order by syst.FNUMBER,org.FNUMBER,po.FNUMBER,U0.FYEAR,U0.FPERIOD;


费用分配相关表结构:

--费用分配明细表

select * from T_CB_EXPALLORESULTSEND a inner join T_CB_EXPENSECOLLENTRY b on a.FBILLENTRYID=b.fentryid and a.FSRCBIILLFORMID='CB_EXPENSECOLLECTION' --费用分配结果发送方

left join T_CB_EXPALLORESULTREC c on a.FSENDID=c.FSENDID left join T_CB_PROORDERDIME dime on dime.FPRODUCTDIMEID=c.FPRODUCTDIMEID --费用分配结果接收方

where a.FOUTACCTGID=100001 -- FACCTGID


--材料费用分配明细表

select * from T_CB_COSTALLORESULTSEND a  --材料费用分配结果发送方

left join T_CB_COSTALLORESULTREC c on a.FSENDID=c.FSENDID left join T_CB_PROORDERDIME dime on dime.FPRODUCTDIMEID=c.FPRODUCTDIMEID --材料费用分配结果接收方

where a.FOUTACCTGID=100001 -- FACCTGID


若查询历史期间的数据,则是T_CB_EXPALLORESULTSEND_H、T_CB_EXPALLORESULTREC_H、T_CB_COSTALLORESULTSEND_H、T_CB_COSTALLORESULTREC_H



select * from  T_HS_OUTACCTG;

image.png

SELECT * FROM T_CB_PROORDERINFO;  历史数据在 T_CB_PROORDERINFO_H

image.png


SELECT * FROM T_CB_PROORDERDIME;

image.png


以下四个表都有历史表,存储在_H 中


  • SELECT * FROM T_CB_CostMatterial  ;--FEXPTYPE 0直接费用、1间接费用、2其他费用

image.png

  • SELECT * FROM T_CB_CostMatterialDetail ;--费用

image.png

  • SELECT * FROM T_CB_CostCalExpense;

    image.png

  • SELECT * FROM T_CB_CostCalExpenseDetail;--成本

image.png


作者:拿了你的糖

来源:金蝶云社区

原文链接:https://vip.kingdee.com/article/456499268162143232?productLineId=1&lang=zh-CN

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。


本文包含两个SQL查询语句。第一个语句用于跟踪销售订单到生产订单的每种成本项目的汇总金额,包括直接材料、直接材料钢材、拆卸费、差旅费和直接人工等成本项目的投入金额,并关联了销售订单、工单及其明细、成本计算等表。第二个语句用于显示工单的材料明细,即获取成本计算后的材料分配结果,包括材料编码、材料名称及本期投入金额,同样涉及生产订单、成本计算及材料表等。两个查询均从当前和历史数据中获取信息。

有用

反馈

一、按销售订单跟踪生产订单的每种成本项目的汇总金额

image.png

select T.订单编号,T.订单日期,T.客户名称,T.订单行号,T.产品编码,T.产品名称,T.订单数量,T.计量单位,T.工单号 ,T.工单行号
	,sum(case when t.成本项目='直接材料' then t.投入金额 else 0 end) as 直接材料
	,sum(case when t.成本项目='直接材料钢材' then t.投入金额 else 0 end) as 直接材料钢材
	,sum(case when t.成本项目='拆卸费' then t.投入金额 else 0 end) as 拆卸费
	,sum(case when t.成本项目='差旅费' then t.投入金额 else 0 end) as 差旅费
	,sum(case when t.成本项目='直接人工' then t.投入金额 else 0 end) as 直接人工From
	(		select 
		tm.FBILLNO as 订单编号,tm.FDATE as 订单日期,tbc.FNAME as 客户名称,td.fseq  as 订单行号,tbm.FNUMBER as 产品编码,tbml.FNAME as 产品名称,td.FQTY as 订单数量,tbul.FNAME as 计量单位
		,tmo.FBILLNO as 工单号 ,tmod.FSEQ as 工单行号,s.fcostname as 成本项目,s.FCURRINPUTAMOUNT as 投入金额		from T_SAL_ORDER tm--销售订单
		inner join T_SAL_ORDERentry td on tm.fid=td.fid		inner join T_BD_CUSTOMER_L tbc on tm.FCUSTID=tbc.FCUSTID--客户
		inner join T_BD_MATERIAL tbm on td.FMATERIALID=tbm.FMATERIALID--物料
		inner join T_BD_MATERIAL_L tbml on tbm.FMATERIALID=tbml.FMATERIALID--物料描述
		inner join T_BD_UNIT_L tbul on td.FUNITID=tbul.FUNITID--计量单位
		left join T_PRD_MOENTRY tmod on tmod.FSALEORDERID=td.FID and tmod.FSALEORDERENTRYID=td.FENTRYID--工单明细
		left join T_PRD_MO tmo on tmod.FID=tmo.FID--工单
		left join
		--select s.FPRODUCTNO as MONumbere,s.FBILLSEQ as MOSeq,s.fcostname,sum(FSumCurrInputAmount) as MOInAmount
		(				--成本计算后数据获取--当期
			select d.FPRODUCTNO,d.FBILLSEQ,d.FPROORDERTYPE				--订单行数据
				,ce.FSumCurrInputAmount --本期总投入
				,ce.FCurrInputAmount ---本期投入
				--成本项目明细行
				,ced.FCOSTITEMID ,tb1.fname  as fcostname --成本项目
			from T_CB_PROORDERINFO p 			inner join T_CB_PROORDERDIME d on p.FPRODUCTDIMEID=d.FPRODUCTDIMEID --生产订单维度信息表
			--成本计算结果费用表:成本项目,费用项目
			inner join T_CB_COSTCALEXPENSE ce on ce.FID=p.FID  --费用分配总表
			inner join T_CB_COSTCALEXPENSEDETAIL ced on ced.FENTRYID=ce.FENTRYID--费用分配细表
			inner join T_HS_COSTITEM_L tb1 on ced.FCOSTITEMID=tb1.fcostitemid--成本项目
			inner join T_CB_COSTCENTER_L tb2 on d.fcostcenterid=tb2.FCostcenterid--成本中心
			--成本计算结果材料表:若需要获取子项物料则关联以下两个表
			--inner join T_CB_COSTMATTERIAL cm on cm.FID=p.FID
			--inner join T_CB_COSTMATTERIALDETAIL cmd on cmd.FENTRYID=cm.FENTRYID
			where   p.FENDINITKEY='1'   -- 1-期末数据,0-期初数据
			and		d.FPROORDERTYPE='PO'	

			--and d.FPRODUCTNO='MO000004' and d.FBILLSEQ=1  --订单编号行号
			--and p.FACCTGID=100002   --核算内码,由核算体系组织年期唯一确定,获取时一定要加核算范围

			union all  --历史订单信息
			--成本计算后数据获取--历史期间
			select d.FPRODUCTNO,d.FBILLSEQ,d.FPROORDERTYPE				--订单行数据
				,ce.FSumCurrInputAmount --本期总投入
				,ce.FCurrInputAmount ---本期投入
				--成本项目明细行
				,ced.FCOSTITEMID ,tb1.fname  as fcostname --成本项目
			from T_CB_PROORDERINFO_H p 			inner join T_CB_PROORDERDIME d on p.FPRODUCTDIMEID=d.FPRODUCTDIMEID --生产订单维度信息表
			--成本计算结果费用表:成本项目,费用项目
			inner join T_CB_COSTCALEXPENSE_H ce on ce.FID=p.FID  --费用分配总表
			inner join T_CB_COSTCALEXPENSEDETAIL_H ced on ced.FENTRYID=ce.FENTRYID--费用分配细表
			inner join T_HS_COSTITEM_L tb1 on ced.FCOSTITEMID=tb1.fcostitemid--成本项目
			inner join T_CB_COSTCENTER_L tb2 on d.fcostcenterid=tb2.FCostcenterid--成本中心
			--成本计算结果材料表:若需要获取子项物料则关联以下两个表
			--inner join T_CB_COSTMATTERIAL cm on cm.FID=p.FID
			--inner join T_CB_COSTMATTERIALDETAIL cmd on cmd.FENTRYID=cm.FENTRYID
			where   p.FENDINITKEY='1'   -- 1-期末数据,0-期初数据
			and		d.FPROORDERTYPE='PO'	

			--and d.FPRODUCTNO='MO000004' and d.FBILLSEQ=1  --订单编号行号
			--and p.FACCTGID=100002   --核算内码,由核算体系组织年期唯一确定,获取时一定要加核算范围
		)s on s.FPRODUCTNO=tmo.FBILLNO and s.FBILLSEQ=tmod.FSEQ		--where  s.FPRODUCTNO='MO000008'
		--group by s.FPRODUCTNO,s.FBILLSEQ ,s.fcostname
	)T 	group by  T.订单编号,T.订单日期,T.客户名称,T.订单行号,T.产品编码,T.产品名称,T.订单数量,T.计量单位,T.工单号 ,T.工单行号


二、按工单显示材料明细-取值材料分配结果

image.png

	select s.FPRODUCTNO as 工单编号,s.FBILLSEQ as 工单行号,s.clnumber as 材料编码,s.clname as 材料名称,s.FCURRINPUTAMOUNT 本期投入金额--此金额是投入明细,没有按工单汇总
	from
	(		--成本计算后数据获取--当期
		select d.FPRODUCTNO,d.FBILLSEQ,d.FPROORDERTYPE			--订单行数据
			,tbb.FNUMBER as clnumber,tbbl.fname as clname
			,cm.FCurrInputAmount --本期投入金额

		from T_CB_PROORDERINFO p 		inner join T_CB_PROORDERDIME d on p.FPRODUCTDIMEID=d.FPRODUCTDIMEID --生产订单维度信息表
		--成本计算结果费用表:成本项目,费用项目
		--inner join T_CB_COSTCALEXPENSE ce on ce.FID=p.FID  --费用分配总表
		--inner join T_CB_COSTCALEXPENSEDETAIL ced on ced.FENTRYID=ce.FENTRYID--费用分配细表
		--inner join T_HS_COSTITEM_L tb1 on ced.FCOSTITEMID=tb1.fcostitemid--成本项目
		--inner join T_CB_COSTCENTER_L tb2 on d.fcostcenterid=tb2.FCostcenterid--成本中心
		--成本计算结果材料表:若需要获取子项物料则关联以下两个表
		inner join T_CB_COSTMATTERIAL cm on cm.FID=p.FID--材料分配明细表
		--inner join T_CB_COSTMATTERIALDETAIL cmd on cmd.FENTRYID=cm.FENTRYID
		inner join T_BD_MATERIAL tbb on cm.FMATERIALID=tbb.FMATERIALID		inner join T_BD_MATERIAL_L  tbbl on tbb.FMATERIALID=tbbl.FMATERIALID		where   p.FENDINITKEY='1'   -- 1-期末数据,0-期初数据
		and		d.FPROORDERTYPE='PO'	

		--and d.FPRODUCTNO='MO000004' and d.FBILLSEQ=1  --订单编号行号
		--and p.FACCTGID=100002   --核算内码,由核算体系组织年期唯一确定,获取时一定要加核算范围


		union all--历史期间
			--成本计算后数据获取--档期
		select d.FPRODUCTNO,d.FBILLSEQ,d.FPROORDERTYPE			--订单行数据
			,tbb.FNUMBER as clnumber,tbbl.fname as clname
			,cm.FCurrInputAmount --本期投入金额

		from T_CB_PROORDERINFO_H p 		inner join T_CB_PROORDERDIME d on p.FPRODUCTDIMEID=d.FPRODUCTDIMEID --生产订单维度信息表
		--成本计算结果费用表:成本项目,费用项目
		--inner join T_CB_COSTCALEXPENSE ce on ce.FID=p.FID  --费用分配总表
		--inner join T_CB_COSTCALEXPENSEDETAIL ced on ced.FENTRYID=ce.FENTRYID--费用分配细表
		--inner join T_HS_COSTITEM_L tb1 on ced.FCOSTITEMID=tb1.fcostitemid--成本项目
		--inner join T_CB_COSTCENTER_L tb2 on d.fcostcenterid=tb2.FCostcenterid--成本中心
		--成本计算结果材料表:若需要获取子项物料则关联以下两个表
		inner join T_CB_COSTMATTERIAL_H cm on cm.FID=p.FID--材料分配明细表
		--inner join T_CB_COSTMATTERIALDETAIL cmd on cmd.FENTRYID=cm.FENTRYID
		inner join T_BD_MATERIAL tbb on cm.FMATERIALID=tbb.FMATERIALID		inner join T_BD_MATERIAL_L  tbbl on tbb.FMATERIALID=tbbl.FMATERIALID		where   p.FENDINITKEY='1'   -- 1-期末数据,0-期初数据
		and		d.FPROORDERTYPE='PO'	

		--and d.FPRODUCTNO='MO000004' and d.FBILLSEQ=1  --订单编号行号
		--and p.FACCTGID=100002   --核算内码,由核算体系组织年期唯一确定,获取时一定要加核算范围)s



DeepSeek 作为一款开源大语言模型,凭借对中文语境的良好适配、适中的参数规模,它既能满足日常文本生成、行业分析等需求,又无需过高的硬件配置。成为不少用户本地部署的优选。这里分享一下部署deepseek的硬件以及工具,使新手用户快速快速部署成功。

一、deepseek本地部署的硬件需求

1、显卡(GPU)

  • 入门级(1.5B-7B模型)NVIDIA RTX 3060(8GB显存)或更高版本,如RTX 3050(6GB显存)可作为最低配置。

  • 专业级(14B-32B模型):推荐RTX 4090(24GB显存)或双卡RTX 3090(24GB显存×2),以支持模型分片加载。

  • 企业级(70B及以上模型):需多卡并行,如4块NVIDIA A100 80GB(通过NVLINK互联)或H100专业级GPU。

2、内存(RAM)

  • 入门级:至少16GB DDR4,推荐32GB以提升系统稳定性。

  • 专业级:32GB DDR5或更高,确保与显存容量匹配(通常为显存的1.5倍以上)。

  • 企业级:128GB ECC DDR5,满足高并发推理或模型微调需求。

3、存储

  • 入门级:NVMe SSD≥20GB,用于存储模型文件和临时数据。

  • 专业级:PCIe 4.0 SSD≥70GB,支持快速加载大型模型。

  • 企业级:4TB RAID阵列或分布式存储(如Ceph/Gluster),保障数据安全和高吞吐量。

4、处理器(CPU)

  • 入门级:Intel i5或更高版本,支持AVX指令集。

  • 专业级:未明确指定具体型号,但需满足多线程处理需求(如AMD Ryzen 9或Intel Core i9系列)。

  • 企业级:AMD EPYC 7763(64核)或Intel Xeon Platinum 8490H(128核),支持高并发任务。

5、其他硬件

  • 电源:企业级配置需≥2000W工业级冗余电源+UPS,确保稳定供电。

  • 网络:企业级需万兆以太网或InfiniBand HDR,满足低延迟高吞吐需求。

二、本地部署的工具

DS本地部署大师是一款专为简化开源大模型部署设计的软件,对 DeepSeek 的适配性尤为优化,软件支持多种主流大模型,包括DeepSeek全系列模型以及豆包、文心一言等国产模型,覆盖了从文本生成到代码调试等多种应用场景,还解决 “版本不兼容”“缺失组件” 等常见问题,让 DeepSeek 部署从 “技术活” 变为 “点击操作”。

进入软件,可以看到软件根据电脑配置推荐的模型,用户可以直接下载安装该模型,也可以点击【下载模型】进入模型库,根据自己的需求和设备配置来选择适合的模型下载。

三、本地部署后的使用效果

进入软件后,可以在下方看到刚刚部署成功的模型,另外软件也自带豆包、文心一言等常见的模型,用户都可以直接使用。

操作也很简单,只需要在首页选择需要的模型,在文本框中输入问题,随后点击【发送】按钮,即可快速生成高质量的回答。

也可以使用文心一言来生成问题,每种模型生成的内容不仅相同,用户如果有拿不准或者想要更多的灵感方法的话,可以多使用几个模型生成不同的回答,以完善自己的内容。

如果对生成的内容感到不满意,还可以拉倒生成的内容底部,点击【重新回答】,让它再次生成内容,还可以意见复制全部内容,非常实用。


以上就是今天分享的内容了,感兴趣的朋友记得点赞收藏一下~


summary-icon摘要

由AI智能服务提供

本文回顾了Python插件开发的前几篇内容,并重点介绍了单据转换插件的开发。单据转换是业务流程中的重要环节,通过插件可以控制单据的转换过程,调整生成的下游数据包。文章详细阐述了单据转换的两种类型(下推和选单)及其实现逻辑,并介绍了单据转换插件的注册、事件处理流程以及常用事件的处理方法。通过示例代码展示了如何在Python中实现单据转换插件,并提供了应用案例和事件处理示例。最后,感谢读者的关注与支持,并预告了下一篇关于插件常用工具类的分享。

有用

反馈

往期回顾:

【Python插件入门】第1篇:Python插件入门讲解

【Python插件入门】第2篇:基本开发过程介绍

【Python插件入门】第3篇:插件中如何进行数据操作

【Python插件入门】第4篇:单据表单插件

【Python插件入门】第5篇:单据列表插件

【Python插件入门】第6篇:操作服务插件

【Python插件入门】第7篇:简单账表服务插件

【Python插件入门】第8篇:账表表单插件

      

        前面的篇章讲解了各种类型的插件,这些插件都是在单个业务对象中触发使用,我们同时也了解了对单据数据的操作方法,是不是对这个系统的功能背后的实现逻辑有了更深的理解呢,当不同的业务对象"串联起来"就构成了系统中各种丰富的功能,形成了系统的业务流程,在"串联"各种单据的过程中,必不可少的就是"单据转换",他是业务流程连接过程中的一个重要枢纽,对于单据转换的过程 ,系统也支持了通过插件对这个过程进行干预,今天我们就来看一看如何用Python开发单据转换插件。

一、单据转换概述

  • 单据转换,是指把上游所选单据,按照转换规则,自动生成下游单据数据包的过程;不对下游单据进行保存、提交、审核等处理。

  • 单据转换插件,能够介入到单据转换的各个关键时刻,对转换行为进行控制,从而调整所生成的下游数据包;

  • 单据转换按照发起方不同,可分为下推、选单;

    下推是指在上游单据列表,把所选单据,生成下游单据数据包,并展示出来;

    选单是指在下游单据新增界面,弹出上游单据列表,选择源单返回,然后根据转换规则把源单数据填写到下游单据新增界面上;

  • 选单实际上分为两个独立的过程,一个是选单前过程,根据转换规则,生成源单数据筛选条件,传给源单列表。因此源单列表上显示的,都是允许下推的数据;另外一个就是选单过程,把用户选择返回的源单数据,迁移到目标单据上;

  • 下推与选单,采用相同单据转换规则,进行数据迁移;也采用相同的单据转换插件,但触发的事件略有差异,编写单据转换插件时,需要兼顾这些差异; 

二、单据转换规则简介

以下知识结构截图摘取自@eris 老师分享的学习资料,在此感谢老师的用心制作!

也强烈推荐大家看看老师的讲解文章和课程!金蝶云星空BOS专题中级课-业务流程

    单据转换的核心是单据转换规则基于单据转换规则才会有单据转换插件。单据转换规则配置可以实现我们常见的单据流转需求,我们先来简单回顾一下单据转换规则。

  • 单据关联配置:要实现关键关联,需要先在下游单据中设置单据关联配置

image.png


  • 单据转换规则说明

image.png

  • 单据转换规则策略要点

image.png

  • 可以触发单据转换规则的操作

image.png

三、单据转换插件介绍

    C#开发时,单据转换插件的基类是AbstractConvertPlugIn。Python插件在单据转换规则-插件策略中注册即可。

    单据转换插件开始支持Python插件的版本是PT-146836 [7.5.1.202005],高于此版本,应该都是可以使用的。

    单据转换插件是依赖于单据转换规则来触发的,单据转换从选择单据、指定单据类型、分组合并、过滤携带数据等整个转换过程都提供了插件干预方法,应对一些复杂的单据转换场景需求。所以只要触发了单据转换规则,就可以触发单据转换插件执行过程。

  • 单据下推执行过程

image.png

image.png

  • 单据选单执行过程

image.png

  • 单据转换插件一览图(含事件执行顺序)

image.png


  • 选单时,单据转换插件事件执行顺序:与下推有小部分差异

image.png

这里要说明的是,下推、选单前、选单过程,采用的插件是同一个。 从事件的覆盖度来看,下推过程触发的事件是最全面的,针对下推过程编写的插件,选单过程被自动覆盖。也就是说通常情况下,在不对选单界面做特殊干预的情况下,按照下推的运行过程来开发一个单据转换插件,对选单操作也是通用的。

四、单据转换插件常用事件

        前面的截图中已经将单据转换插件执行过程讲得比较清晰了,总的来说单据转换插件也是按照一条"流水线"执行的,我们只需要在需要干预的环节,去实现对应的事件,加入我们的代码逻辑就可以了。

  • 我们再整体看一下下推运行时序

image.png

  • 新建一个单据转换插件,以采购申请下推采购订单为例

image.png

  • 下面看看单据转换插件中的一些常用事件

#解析字段映射关系,并构建查询参数。
#这里可以加入你想要的额外的字段
def OnQueryBuilderParemeter(e):
    #插件常用全局属性,顺带介绍一下,不一定在此事件中使用  #*************************************************************************************************************
    #this.OperationNumber;#操作编码,如下推,选单操作等,值分别为Push,Draw,
    #paraDIC=this.Option.GetVariables();#获取自定义参数集,字典类型,例如是否整单下推、是否需要校验下游单据新增权限、WebAPI调下推时传入的自定义参数等等
    #if(paraDIC.ContainsKey("参数标识")==True):#判断是否含有某个参数
    #    paraValue=paraDIC["参数标识"];#取出参数标识
    #***********************************************************************************************************
    #e.SourceBusinessInfo;#上游单据的元数据信息,可从这里获取一些上游单据的关键信息
    # secFormId=e.SourceBusinessInfo.GetForm().Id;#上游单据FormId
     billNo=SelectorItemInfo("FBillNo");#加入单据转化规则中没有配置的,但需要额外加载的字段
     e.SelectItems.Add(billNo);

#解析过滤策略中配置的条件,可以在这里加自定义的下推过滤条件
#此事件开始前,刚完成选单条件策略中的过滤条件的解析
#e.FilterPolicySQL来自于:【选单条件策略中设置的过滤条件(JsonSetting)】+【选单条件策略中的附加条件(CustFilter)】+【按目标组织基础资料属性过滤的条件(TargetOrgBDFilterList)】
#此事件结束后,e.FilterPolicySQL将使用AND操作符合并到QueryBuilderParemeter.FilterClauseWihtKey,后续作用于选单列表取数
def OnParseFilter(e):
    filterStr=" FBillNo LIKE 'CGSQ%' "
    e.FilterPolicySQL=StringUtils.JoinFilterString(e.FilterPolicySQL,filterStr);#追加过滤条件,默认用AND连接
    e.PlugFilterDesc = "单据编号必须包含【CGSQ】";#过滤条件描述信息,下推不满足时,会提示出来。

#选单时才有,解析字段映射关系中配置的过滤选项:过滤/仅追加
#此事件开始前,刚完成用于选单列表取数的QueryBuilderParemeter的构建,e.FilterOptionsSQL来自于QueryBuilderParemeter.FilterClauseWihtKey
def OnParseFilterOptions(e):
    #e.TargetData;#目标单的数据包
    #e.SourceBusinessInfo;#源单元数据信息
    #e.TargetBusinessInfo;#目标单元数据信息
    filterStr=" FReqQty > 10 ";
    e.FilterOptionsSQL = StringUtils.JoinFilterString(e.FilterOptionsSQL,filterStr);#追加选单过滤条件

#获取到源单数据之后触发,(下推执行)
#可以在此事件中修改源单下推的数据包,不会真实修改源单,只会影响下推的携带值
#例如,可以动态修改源单分单依据字段的值,以此实现动态分单策略
def OnGetSourceData(e):
    #e.SourceBusinessInfo;#源单元数据信息
    srcData=e.SourceData;#源单数据,本次下推的所有数据行,DynamicObjectCollection类型
    #可循环从数据包集合中取数,只能取到参与转换规则中配置的字段和OnQueryBuilderParemeter额外加入的字段
    for row in srcData:
        srcId=row["Id"];#源单Id
        srcEntryId=str(dr["FEntity_FEntryID"]);#源单分录内码:单据体标识_FEntryId

#获取到源单数据之后触发,(选单执行)
#与OnGetSourceData类似,只不过一个是在下推执行,一个是选单执行
def OnGetDrawSourceData(e):
    #e.SourceBusinessInfo;#源单元数据信息
    srcData=e.SourceData;#源单数据,本次下推的所有数据行,DynamicObjectCollection类型
    #可循环从数据包集合中取数,只能取到参与转换规则中配置的字段和OnQueryBuilderParemeter额外加入的字段
    for row in srcData:
        srcId=row["Id"];#源单Id
        srcEntryId=str(dr["FEntity_FEntryID"]);#源单分录内码:单据体标识_FEntryId

#执行分组前触发,可以在此增加自定义的分组字段
def OnBeforeGroupBy(e):
    srcData= e.SourceData;#源单数据
    HeadGroupKey = e.HeadGroupKey;#分单依据
    e.HeadGroupKey =("{0},{1}").format(e.HeadGroupKey,"FXXX");#追加分组字段
    EntryGroupKey=e.EntryGroupKey;#单据体分组合并字段
    e.EntryGroupKey =("{0},{1}").format(e.EntryGroupKey,"FEXXX");#追加单据体分组合并字段
    SubEntryGroupKey=e.SubEntryGroupKey;#子单据体分组字段
    e.SubEntryGroupKey =("{0},{1}").format(e.SubEntryGroupKey,"FEXXX");#追加单据体分组字段

#下推执行,根据分组策略创建目标单,此时还没根据字段映射赋值目标单的字段,这个事件用得不多
#也没有创建关联数据包,接近一个"空白"的下游单据,当然有默认值的字段还是有值
def OnCreateTarget(e):
    headEntity=e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");#分组之后创建的所有目标单集合
    for entity in headEntity:
        billObj=entity.DataEntity;#下游单据的完整数据包,可以通过实体数据包操作方式处理下游单据字段

#选单执行,与OnCreateTarget类似,此时获取到了选单返回的数据,但是还没赋值到下游单据的字段上
def OnCreateDrawTarget(e):
    headEntity=e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");#获取根据分组创建好的目标单

#目标单赋值之前触发,主要用启动字段赋值事件OnFieldMapping,用于监听字段映射赋值过程,用得很少
def OnBeforeFieldMapping(e):
    e.FireFieldMappingEvent=True;#启动字段赋值
    
#字段赋值事件,每个数据包,每个字段都会触发,易影响性能,慎用!
def OnFieldMapping(e):
    headEntity=e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");#下游单据数据集
    fldKey=e.TargetField.Key.ToUpperInvariant();#赋值字段标识大写

#字段映射所有字段赋值完成之后触发,用得很少    
def OnAfterFieldMapping(e):
    headEntity=e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");#下游单据数据集

#创建关联关系之前触发,可以取消创建,用得很少
def OnCreateLink(e):
    headEntity=e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");#下游单据数据集
    #e.Cancel=True;#取消创建

#单据关联关系创建之后触发,表单服务策略执行之前
#如果需要干预下游单据,再执行表单服务策略,可以在此事件中对下游单据进行处理
#例如,要通过插件修改采购订单单价,之后系统自动执行表单服务策略计算金额
def OnAfterCreateLink(e):
    headEntity = e.Result.FindByEntityKey("FBillHead");#由于可能分单,所以可能有多个下游单据,是一个集合
    for entity in headEntity:#循环处理
        billObj=entity.DataEntity;#下游单据的完整数据包,可以通过实体数据包操作方式处理下游单据字段

#获取到服务策略之前触发,可在此事件中加入自定义的表单服务或者移除服务,用得少
def OnGetConvertBusinessService(e):
    FormSvcList=e.FormBusinessServices;#表单服务集合
    
#单据转换执行完成之后执行,在表单服务策略执行完成之后
#可以获取到下推完成之后,还未保存的下游单据,对下游单据数据包做最后的处理
#应用案例:单据转换插件提示消息
def AfterConvert(e):
    #整个单据转换执行完毕后的下游单据数据集合,相当于用户看到的推出来的下游单据,但是还没保存
    headEntity = e.Result.FindByEntityKey("FBillHead");#由于可能分单,所以可能有多个下游单据,是一个集合
    for entity in headEntity:#循环处理
        billObj=entity.DataEntity;


  • 相关应用案例参考推荐:

单据转换之多选基础资料下推携带

单据转换之多选辅助资料下推携带

单据转换插件提示消息

显示单据转换操作页面事件OnShowConvertOpForm

单据转换插件,动态表单插件,表单插件,服务插件,多单据体应用

案例四:AfterConvert事件

二开案例.单据转换插件.设置选单条件

单据转换实现多单据体到目标单的携带和关联

单据转换插件之携带子单据体

Python单据转换插件示例-自定义单据下推付款单

......

==========================本篇正文结束=====================================

截止到这一篇,Python插件开发各插件类型,已经介绍完了,感谢大家一如既往的关注与支持!

插件示例代码已经上传附件,老规矩,大家按需下载!

大家持续关注,点赞、评论、收藏,您的点赞、评论就是我前进的动力。

下一篇:【Python插件入门】第10篇(完结篇):插件常用工具类分享


Python单据转换插件示例.rar(3.12KB)