本人刚接触星空几个月,售后技术岗位,出于个人小兴趣看看开发,感觉星空资料太少了,尤其是开发方面,很多方法、属性根本不知道咋写,无奈.net也不懂【emoji】
一边社区搜,一边百度搜,嘿嘿,简单写过几个插件了,每次做的时候都会发现前面的代码写的一团糟啊,每次都有点小进步,小窃喜,这篇帖子算是社区发的第一个了,只是记录一下我的学习过程,大佬轻拍,我也知道里面好多不足,我只是把我想要的功能实现了,继续学习,继续进步,好了,废话不多说,开始正题。
这个服务插件实现了审核后,将审核完成的单据分录内容记录到数据库单品记录表中,内容字段根据实际情况更改,主要是审核完成后返回的"e.DataEntitys"数据包中取值。
新手第一次看到“e.DataEntitys”数据包里面庞大的数据结构肯定一脸懵的,数据层级太多,根本不知道怎么取。由于数据层数太多,截图截不全,大家可参考自己的数据包情况查看。
我搜索过论坛,其实也有不少帖子介绍过,但对于新人不太友好,我也是尝试了多次调试,查看数据包慢慢尝试出来的,我这个单据中其实还增加了一些自定义字段,看到过一篇帖子说:为了性能,保存插件时完整数据包,审核插件是精简数据包。
大概意思是这样,帖子连接看过之后也没记,不好意思大佬,嘿嘿【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");
}
之后数据包截图如下:
因为我是审核完后需要把分录信息保存到我自己建的表中,表中其实包含了其他不属于分录的信息,取值赋值分为不同类型
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”就可以。
//首层数据包辊号,如果存在辊号,则其他属性都存在,所以后面不再加判断条件
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”段对应即可取到相应的值,部分基础资料或子单据体就需要解析下层数据包,例如物料:
基础资料“物料”本身又是一个数据包,所以不能直接通过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、第三层数据包
由于我这个物料是启用了辅助属性的,所以在辅助属性值上还存在更下层的数据包。
例如:
辅助属性本身数据包比基础资料物料还下沉了一层,实例化数据包需要更深一层。
参考代码
//辅助属性数据包
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);
}
}
}
}
}
}
----
推荐阅读