【插件分享】自动获取在库序列号填充到出库单

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

【插件分享】自动获取在库序列号填充到出库单

  • 前提

            正常业务情况下序列号需要根据实物保持一致出入库,但某些特定情况下没法保持一致,系统又启用了序列号管理,出库的时候又必须要选择。而且出库时单据明细行又特别多,所以就有了这个插件。

  • 需求

            根据单据体明细已选择的数据,匹配对应库存维度的序列号并自动填充到序列号子单据体

  • 注意

        需要在bos序列号主档适用组织页签里面添加一个枚举字段F_PHYE_COMBO,枚举值选择“在库状态”就好,因为同一个单据体有可能出现相同库存维度的明细行,加一个辅助值来更新判断SN是否被重复匹配赋值。

        本案例只考虑了单体组织,如果同一序列号有多组织业务,还要获取对应库存组织匹配。

image.webp


   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查询时,是查不到数据的。

所以想让该字段有值的话,需要在数据库中设置字段的默认值。(如果在执行时再刷一遍默认值,那么遇到同时操作的话,可能会出错。)

【插件分享】自动获取在库序列号填充到出库单

前提 正常业务情况下序列号需要根据实物保持一致出入库,但某些特定情况下没法保持一致,系统又启用了序列号管理,出库的时候又必须...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息