【插件分享】自动获取在库序列号填充到出库单
前提
正常业务情况下序列号需要根据实物保持一致出入库,但某些特定情况下没法保持一致,系统又启用了序列号管理,出库的时候又必须要选择。而且出库时单据明细行又特别多,所以就有了这个插件。
需求
根据单据体明细已选择的数据,匹配对应库存维度的序列号并自动填充到序列号子单据体
注意
需要在bos序列号主档适用组织页签里面添加一个枚举字段F_PHYE_COMBO,枚举值选择“在库状态”就好,因为同一个单据体有可能出现相同库存维度的明细行,加一个辅助值来更新判断SN是否被重复匹配赋值。
本案例只考虑了单体组织,如果同一序列号有多组织业务,还要获取对应库存组织匹配。
public class AutoSN : AbstractDynamicFormPlugIn { public override void EntryBarItemClick(BarItemClickEventArgs e) { base.EntryBarItemClick(e); if (e.BarItemKey.EqualsIgnoreCase("PHYE_tbButton_1")) { DynamicObjectCollection Entrys = this.View.Model.DataObject["SAL_OUTSTOCKENTRY"] as DynamicObjectCollection; DynamicObject snojb = null; //循环单据体数据包获取序列号数量、物料id、批号id foreach (var Entry in Entrys) { int Seq = Convert.ToInt32(Entry["Seq"]); int SNQty = Convert.ToInt32(Entry["SNQty"]); string stockId = Entry["StockID_id"].ToString(); string Materialid; string Lot_TEXT; if (!Entry["MATERIALID_id"].IsNullOrEmptyOrWhiteSpace() && !Entry["LOT_TEXT"].IsNullOrEmptyOrWhiteSpace()) { Materialid = Entry["MATERIALID_id"].ToString(); Lot_TEXT = Entry["LOT_TEXT"].ToString(); } else { this.View.ShowErrMessage("请检查是否录入了物料编码及批号,行号:"+ Entry["Seq"]); break; } //判断序列号数量,大于0才给序列号子单据体赋值 if (SNQty > 0) { //赋值序列号前,默认触发行点击事件,让系统创建子单据体序列号对应数量行 ((IDynamicFormViewService)this.View).EntityRowClick("FEntity", Seq-1); //根据物料id、批号id、仓库查询在库状态(stockstatus=1)的序列号,根据序列号数量查询前N条数据 string sql = "select top " + SNQty + " a.FSERIALID,a.FSERIALID,FNUMBER,FSTOCKSTATUS,c.FLOT from T_BD_SERIALMASTER a " + "left join T_BD_SERIALMASTERORG b on a.FSERIALID=b.FSERIALID " + "left join T_BD_SERIALMASTEROTHER c on c.FSERIALID=a.FSERIALID " + "where FMATERIALID='" + Materialid + "' and FLOT_TEXT ='" + Lot_TEXT + "' " + "and FSTOCKSTATUS=1 and F_PHYE_COMBO=1 and FSTOCKID = '"+stockId+"'"; DynamicObjectCollection dts = DBUtils.ExecuteDynamicObject(this.Context, sql); EntryEntity entryRow = this.View.BusinessInfo.GetEntryEntity("FSerialSubEntity"); DynamicObjectCollection subEntryRows = entryRow.DynamicProperty.GetValue(Entry) as DynamicObjectCollection; int i = 0; //判断查询的序列号数量是否和单据序列号行数一致,不一致不自动填充,人工判断选择 if (dts.Count == subEntryRows.Count) { foreach (var subEntry in subEntryRows) { if (subEntry["SerialNo"].IsNullOrEmptyOrWhiteSpace()) { subEntry["SerialNo"] = dts[i]["FNUMBER"]; //对本单已赋值使用的序列号更新标识,避免本单据其他相同批号物料行再次使用本序列号 var sqlx = string.Format("update T_BD_SERIALMASTERORG set F_PHYE_COMBO =2 where FSERIALID='" + dts[i]["FSERIALID"] +"' "); DBUtils.Execute(this.Context, sqlx); } i++; } } } } //序列号赋值循环完后更新辅助标识为1,以避免单据删除后,下次再下推无法再次匹配 foreach (var Entry in Entrys) { EntryEntity entryRow = this.View.BusinessInfo.GetEntryEntity("FSerialSubEntity"); DynamicObjectCollection subEntryRows = entryRow.DynamicProperty.GetValue(Entry) as DynamicObjectCollection; foreach(var subEntry in subEntryRows) { var sqlz = string.Format("/*dialect*/update T_BD_SERIALMASTERORG set F_PHYE_COMBO =1 " + "from T_BD_SERIALMASTERORG a left join T_BD_SERIALMASTER b on a.FSERIALID = b.FSERIALID " + "where FNUMBER = '" + subEntry["SerialNo"].ToString() +"'"); DBUtils.Execute(this.Context, sqlz); } } DBServiceHelper.LoadReferenceObject(this.Context, Entrys.ToArray(), Entrys.FirstOrDefault().DynamicObjectType, false); this.View.UpdateView("FSerialSubEntity"); } } }
实测发现:在入库时指定序列号,审核后,是从后台保存在序列号主档中的,所以增加的自定义辅助字段,默认值并不能写入数据库中,该字段在数据库中值为空,所以插件在第一次SQL查询时,是查不到数据的。
所以想让该字段有值的话,需要在数据库中设置字段的默认值。(如果在执行时再刷一遍默认值,那么遇到同时操作的话,可能会出错。)
【插件分享】自动获取在库序列号填充到出库单
前提 正常业务情况下序列号需要根据实物保持一致出入库,但某些特定情况下没法保持一致,系统又启用了序列号管理,出库的时候又必须...
点击下载文档
本文2024-09-16 18:16:45发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-21104.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章