服务插件 代表性"e.DataEntitys"取值原创
金蝶云社区-ElvisNing
ElvisNing
13人赞赏了该文章 5,915次浏览 未经作者许可,禁止转载编辑于2021年10月18日 16:20:33

本人刚接触星空几个月,售后技术岗位,出于个人小兴趣看看开发,感觉星空资料太少了,尤其是开发方面,很多方法、属性根本不知道咋写,无奈.net也不懂【emoji】


一边社区搜,一边百度搜,嘿嘿,简单写过几个插件了,每次做的时候都会发现前面的代码写的一团糟啊,每次都有点小进步,小窃喜,这篇帖子算是社区发的第一个了,只是记录一下我的学习过程,大佬轻拍,我也知道里面好多不足,我只是把我想要的功能实现了,继续学习,继续进步,好了,废话不多说,开始正题。


这个服务插件实现了审核后,将审核完成的单据分录内容记录到数据库单品记录表中,内容字段根据实际情况更改,主要是审核完成后返回的"e.DataEntitys"数据包中取值。


新手第一次看到“e.DataEntitys”数据包里面庞大的数据结构肯定一脸懵的,数据层级太多,根本不知道怎么取。由于数据层数太多,截图截不全,大家可参考自己的数据包情况查看。


c39b783f03ec7494899c7fe815ccea8.png


我搜索过论坛,其实也有不少帖子介绍过,但对于新人不太友好,我也是尝试了多次调试,查看数据包慢慢尝试出来的,我这个单据中其实还增加了一些自定义字段,看到过一篇帖子说:为了性能,保存插件时完整数据包,审核插件是精简数据包。


大概意思是这样,帖子连接看过之后也没记,不好意思大佬,嘿嘿【emoji】。所以第一步我们要把需要的数据在数据包中加载

往数据包添加值使用“标识”,使用数据包字段用“绑定实体属性”,表单层使用字段是“标识”


代码如下:

public override void OnPreparePropertys(PreparePropertysEventArgs e)

        {

            base.OnPreparePropertys(e);

            e.FieldKeys.Add("F_THJY_FShiftGroupId");

            e.FieldKeys.Add("F_THJY_FRShiftGroupId");

            e.FieldKeys.Add("F_THJY_FTRewinding");

            e.FieldKeys.Add("F_THJY_FserialNO");

        }


之后数据包截图如下:

image.png


因为我是审核完后需要把分录信息保存到我自己建的表中,表中其实包含了其他不属于分录的信息,取值赋值分为不同类型


1、常量型字段,不需要取值,直接设置字符串值(这个大家都知道,我只是把我这个插件从头到尾解释清楚而已,后面会有完整代码)

State = "0";

Storage_Time = DateTime.Now.ToString("yyyy-MM-dd hh:mm"); 


审核完成的数据包“e.DataEntitys”其实包含了很多层,我们需要的数据分别处于不同的数据层中,后面只需要根据不同的层数定义不同的DynamicObject类型取值就可以。


首先将数据包分解成单条单据,存在一个数组obj中。

//数据包分解成单条单据

DynamicObject[] obj = e.DataEntitys;


在每个单据中获取单据体集合

//获取当前单据下单据体集合

for (int n = 0; n < obj.Length; n++)

{

        DynamicObjectCollection doc = obj[n]["STK_MISCELLANEOUSENTRY"] as DynamicObjectCollection;

}

2、首层数据包

例如:F_THJY_FserialNO,辊号处于数据包首层,那么取值只需要在“doc”中取“key”就可以。


image.png


//首层数据包辊号,如果存在辊号,则其他属性都存在,所以后面不再加判断条件

for (int z = 0; z < doc.Count; z++)

{                   

         serialNo = " ".Equals(doc[z]["F_THJY_FserialNO"].ToString()) ? " " : doc[z]["F_THJY_FserialNO"].ToString();

}

if(serialNo != " ")

//首层数据包其他字段

{

weight = doc[z]["FBaseQty"].ToString();

ProduceDate = doc[z]["PRODUCEDATE"].ToString();

TRewinding = doc[z]["F_THJY_FTRewinding"].ToString();

}


3、第二层数据包

只需要通过对应的“key”和“value”段对应即可取到相应的值,部分基础资料或子单据体就需要解析下层数据包,例如物料:


image.png


基础资料“物料”本身又是一个数据包,所以不能直接通过key值获取,所以需要再次实例化数据包

//物料数据包

//通过doc[z]["MaterialId"]获取到“MATERIAL”不是一个string值,而是另一个下层数据包,在这个数据包之下才可以通过Material["key"]获取实际的value值。

DynamicObject Material = doc[z]["MaterialId"] as DynamicObject;

FM_ID = Material["msterId"].ToString();

FM_Number = Material["Number"].ToString();

FM_Name = Material["Name"].ToString();

Specifications = Material["Specification"].ToString();


4、第三层数据包

由于我这个物料是启用了辅助属性的,所以在辅助属性值上还存在更下层的数据包。

例如:

1631267947(1).png


辅助属性本身数据包比基础资料物料还下沉了一层,实例化数据包需要更深一层。

参考代码

//辅助属性数据包

DynamicObject AuxPropId = doc[z]["AuxPropId"] as DynamicObject;

//幅宽数据包

DynamicObject width = AuxPropId["F100001"] as DynamicObject;

width_cloth_id = width["ID"].ToString();

width_cloth_code = width["FNumber"].ToString();

width_cloth_name = width["FDataValue"].ToString();


如上,主要的3层数据包取值都已经介绍完了,我现在脑子晕晕的,别跟我计较层数,这个分层只是单据体级别的,往上还有单据层面的,我只是从单据体下一层一层的往下分解取值,按照我现在开始取得地方是往下深入了3层而已

处于第一层数据包的字段类型有:文本,日期、整数、小数等

处于第二层数据包的字段类型有:物料、供应商、仓库等基础资料

处于第三层数据包的字段类型有:辅助属性、仓位等


如果需要取单据内码、编号等,不在上述讨论范围,须在更上层的obj[n]中取值

Id=obj[n]["Id"].ToString();

BillNo=obj[n]["BillNo"].ToString();


我觉得这个例子挺有代表性的,常量、普通字段、基础资料数据包、辅助属性数据包都有了。也算mark一下,我自己忘了也可以回来翻翻,哈哈【emoji】【emoji】


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


表达能力有限,技术更有限,罗里吧嗦也不知道说清楚了没有,新手可以看看,有问题可以留言一起讨论,转载请注明,谢谢!


完整代码:

----

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Orm.DataEntity;

using System.ComponentModel;

using Kingdee.BOS.ServiceHelper;

using System;

using Kingdee.BOS.Util;


namespace THJY.SCM.OtherStock.Business.PlugIn

{

    [Description("服务插件:审核")]

    [HotUpdate]

    public  class ServicePlugIn_Audit:AbstractOperationServicePlugIn

    {

        public override void OnPreparePropertys(PreparePropertysEventArgs e)

        {

            base.OnPreparePropertys(e);

            e.FieldKeys.Add("F_THJY_FShiftGroupId");

            e.FieldKeys.Add("F_THJY_FRShiftGroupId");

            e.FieldKeys.Add("F_THJY_FTRewinding");

            e.FieldKeys.Add("F_THJY_FserialNO");

        }

        public override void BeginOperationTransaction(BeginOperationTransactionArgs e)

        {

            base.BeginOperationTransaction(e);

            string FM_ID = "", FM_Number = "", FM_Name = "", serialNo = "", Warehouse_id = "", Warehouse_code = "", Warehouse_name = "", Position_id = "",

                  Position_code = "", Position_name = "", State = "", Specifications = "", width_cloth_id = "", width_cloth_code = "", width_cloth_name = "", levels_id = "", levels_code = "", levels_name = "",

                  Specific_level_id = "", Specific_level_code = "", Specific_level_name = "", weight = "", aux_qty = "", ShiftGroup_ID = "", ShiftGroup_Code = "", ShiftGroup_Name = "", RShiftGroup_ID = "",

                  RShiftGroup_Code = "", RShiftGroup_Name = "", ProduceDate = "", TRewinding = "", remarks = "", Inventory_Label = "", Storage_Time = "";

            //常量型

            State = "0";

            aux_qty = "1";

            remarks = "";

            Inventory_Label = "【其他入库】";

            Storage_Time = DateTime.Now.ToString("yyyy-MM-dd hh:mm");        

            //数据包分解成单条单据

            DynamicObject[] obj = e.DataEntitys;

            for (int n = 0; n < obj.Length; n++)

            {  //获取当前单据下单据体集合

                DynamicObjectCollection doc = obj[n]["STK_MISCELLANEOUSENTRY"] as DynamicObjectCollection;

                //当前单据分录

                for (int z = 0; z < doc.Count; z++)

                {                    

                    //首层数据包辊号,如果存在辊号,则其他属性都存在

                    serialNo = " ".Equals(doc[z]["F_THJY_FserialNO"].ToString()) ? " " : doc[z]["F_THJY_FserialNO"].ToString();

                    if (serialNo != " ")

                    {

                        //首层数据包其他字段

                        weight = doc[z]["FBaseQty"].ToString();

                        ProduceDate = doc[z]["PRODUCEDATE"].ToString();

                        TRewinding = doc[z]["F_THJY_FTRewinding"].ToString();

                        //物料数据包

                        DynamicObject Material = doc[z]["MaterialId"] as DynamicObject;

                        FM_ID = Material["msterId"].ToString();

                        FM_Number = Material["Number"].ToString();

                        FM_Name = Material["Name"].ToString();

                        Specifications = Material["Specification"].ToString();

                        //仓库数据包

                        DynamicObject FSTOCKID = doc[z]["FSTOCKID"] as DynamicObject;

                        Warehouse_id = FSTOCKID["ID"].ToString();

                        Warehouse_code = FSTOCKID["Number"].ToString();

                        Warehouse_name = FSTOCKID["Name"].ToString();

                        //仓位数据包

                        DynamicObject StockPlaceId = doc[z]["StockPlaceId"] as DynamicObject;

                        DynamicObject PositionId = StockPlaceId["F100001"] as DynamicObject;

                        Position_id = PositionId["ID"].ToString();

                        Position_code = PositionId["Number"].ToString();

                        Position_name = PositionId["Name"].ToString();

                        //辅助属性数据包

                        DynamicObject AuxPropId = doc[z]["AuxPropId"] as DynamicObject;

                        //幅宽数据包

                        DynamicObject width = AuxPropId["F100001"] as DynamicObject;

                        width_cloth_id = width["ID"].ToString();

                        width_cloth_code = width["FNumber"].ToString();

                        width_cloth_name = width["FDataValue"].ToString();

                        //等级数据包

                        DynamicObject levei = AuxPropId["F100002"] as DynamicObject;

                        levels_id = levei["ID"].ToString();

                        levels_code = levei["FNumber"].ToString();

                        levels_name = levei["FDataValue"].ToString();

                        //特殊等级数据包

                        DynamicObject speleveil = AuxPropId["F100003"] as DynamicObject;

                        Specific_level_id = speleveil["ID"].ToString();

                        Specific_level_code = speleveil["FNumber"].ToString();

                        Specific_level_name = speleveil["FDataValue"].ToString();

                        //生产班组数据包

                        DynamicObject ShiftGroup = doc[z]["F_THJY_FShiftGroupId"] as DynamicObject;

                        ShiftGroup_ID = ShiftGroup["ID"].ToString();

                        ShiftGroup_Code = ShiftGroup["Number"].ToString();

                        ShiftGroup_Name = ShiftGroup["Name"].ToString();

                        //复卷班组数据包                        

                        DynamicObject RShiftGroup = doc[z]["F_THJY_FRShiftGroupId"] as DynamicObject;

                        RShiftGroup_ID = RShiftGroup["ID"].ToString();

                        RShiftGroup_Code = RShiftGroup["Number"].ToString();

                        RShiftGroup_Name = RShiftGroup["Name"].ToString();


                        //tp_wms_in状态

                        string strUpdate = string.Format(@"update TP_WMS_In set [state] = 1 where serialNo='{0}'", serialNo);

                        DBServiceHelper.Execute(Context, strUpdate);

                        //单品删除

                        string strdel = string.Format(@"/*dialect*/delete from T_Material_Number_Relation where serialNo='{0}' and state=0", serialNo);

                        DBServiceHelper.Execute(Context, strdel);

                        //插入一条单品

                        string insertSerialNO = string.Format(@"/*dialect*/insert into T_Material_Number_Relation(FM_ID, FM_Number, FM_Name, serialNo, Warehouse_id, Warehouse_code, Warehouse_name, Position_id,

                                                               Position_code, Position_name, State, Specifications, width_cloth_id, width_cloth_code, width_cloth_name, levels_id, levels_code, levels_name,

                                                               Specific_level_id, Specific_level_code, Specific_level_name, weight, aux_qty, ShiftGroup_ID, ShiftGroup_Code, ShiftGroup_Name, RShiftGroup_ID,

                                                               RShiftGroup_Code, RShiftGroup_Name, ProduceDate, TRewinding, remarks, Inventory_Label, Storage_Time) 

                                                               values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','{23}','{24}','{25}','{26}','{27}','{28}','{29}','{30}','{31}','{32}','{33}')",

                                                                   FM_ID, FM_Number, FM_Name, serialNo, Warehouse_id, Warehouse_code, Warehouse_name, Position_id,

                                                                   Position_code, Position_name, State, Specifications, width_cloth_id, width_cloth_code, width_cloth_name, levels_id, levels_code, levels_name,

                                                                   Specific_level_id, Specific_level_code, Specific_level_name, weight, aux_qty, ShiftGroup_ID, ShiftGroup_Code, ShiftGroup_Name, RShiftGroup_ID,

                                                                   RShiftGroup_Code, RShiftGroup_Name, ProduceDate, TRewinding, remarks, Inventory_Label, Storage_Time);


                        DBServiceHelper.Execute(Context, insertSerialNO);

                    }

                }

            }

        }

    }

}

----



赞 13