选择物料基础资料,将基础资料的附件带到单据上原创
94人赞赏了该文章
1,168次浏览
编辑于2024年01月09日 19:24:22
1、应用场景:
单据选择基础资料字段,将基础资料字段对应的附件,携带到当前单据的附件列表上,如果单据有附件数字段,同时更新附件数。
2、案例演示:
以采购订单为例,单据体明细信息,选择物料时,将物料的附件携带至单据头附件管理内,同时更新单据头附件数。
此为物料下的附件。
3、实现步骤:
为采购订单注册表单插件,示例代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using Kingdee.BOS; using Kingdee.BOS.Core.Attachment; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Orm; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.BOS.Core; using Kingdee.BOS.Core.DependencyRules; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Core.Metadata.FieldElement; namespace Running.Sample.PlugIn.BusinessPlugIn.Bill { [Description("基础资料字段赋值时,携带附件至单据附件列表上"), HotUpdate] public class P20231102TakeMaterialAttachmentEdit : AbstractBillPlugIn { public override void DataChanged(DataChangedEventArgs e) { //物料字段值更新事件。 string baseFieldKey = "FMaterialId"; //物料字段标识。 string baseFormId = "BD_MATERIAL"; //物料业务对象标识。 if (e.Field.Key.EqualsIgnoreCase(baseFieldKey)) { //获取物料信息。 DynamicObject materialDynObj = this.Model.GetValue(baseFieldKey, e.Row) as DynamicObject; if (materialDynObj == null) { //物料为空,不支持携带附件。重选基础资料,历史已携带附件不做处理,如有需要可额外修改逻辑。 return; } //获取物料关联的附件信息。 string filterStr = string.Format("FBillType = '{0}' and FInterId IN ('{1}','{2}')", baseFormId, materialDynObj["ID"], materialDynObj["msterID"]); OQLFilter filter = OQLFilter.CreateHeadEntityFilter(filterStr); DynamicObject[] attaDynObjs = BusinessDataServiceHelper.Load(this.Context, FormIdConst.BOS_Attachment, null, filter); if (attaDynObjs.Length <= 0) { //查无附件信息,不支持携带附件。 return; } //获取单据内码,新增单据则使用临时内码。 object pkValue = this.View.Model.GetPKValue(); if (this.View.OpenParameter.Status == OperationStatus.ADDNEW || pkValue.IsEmptyPrimaryKey()) { //如果没有LoadTempBillInterId方法,说明是23年3月份之前版本,单据未保存不支持携带附件,可直接return。 //return; pkValue = AttachmentKey.LoadTempBillInterId(this.View); //打上新增单据上传附件标识,不可去掉,用于后续单据保存时更新临时内码。。 this.View.OpenParameter.SetCustomParameter(KeyConst.AddNewStatusUploadAttachment, "1"); } //获取单据编号 string billNo = string.Empty; Field billNoField = this.View.BillBusinessInfo.GetBillNoField(); if (billNoField != null) { billNo = this.View.Model.GetValue(billNoField.Key).GetString(); } //构建单据附件信息数据包。 DynamicObject[] newAttaDynObjs = new DynamicObject[attaDynObjs.Length]; for (int i = 0; i < attaDynObjs.Length; i++) { DynamicObject newAttaDynObj = (DynamicObject)attaDynObjs[i].Clone(false, true); //赋值FBillType业务对象标识,指向业务对象。 newAttaDynObj["BillType"] = this.View.BillBusinessInfo.GetForm().Id; //赋值FInterId单据内码,指向具体的单据。 newAttaDynObj["InterID"] = pkValue.GetString(); //赋值FEntryKey单据体标识,存放单据头,此处赋值空格。 newAttaDynObj["EntryKey"] = " "; //赋值FEntryInterID单据体分录内码,存放单据头,此处赋值-1。 newAttaDynObj["EntryInterID"] = "-1"; //赋值FBillNo单据编号,实际字段已弃用,数据仅做参考。 newAttaDynObj["BillNo"] = billNo; //创建人、创建时间、修改人、修改时间。 newAttaDynObj["CreateMen_Id"] = this.Context.UserId; newAttaDynObj["CreateTime"] = DateTime.Now; newAttaDynObj["ModifyMen_Id"] = this.Context.UserId; newAttaDynObj["ModifyTime"] = DateTime.Now; newAttaDynObjs[i] = newAttaDynObj; } //保存单据附件信息。 FormMetadata attaMetadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, FormIdConst.BOS_Attachment); IOperationResult res = BusinessDataServiceHelper.Save(this.Context, attaMetadata.BusinessInfo, newAttaDynObjs); if (res.IsSuccess) { //更新单据头附件数。 UpdateAttachmentCount(0, res.SuccessDataEnity.Count()); } } } private void UpdateAttachmentCount(int rowIndex, int attaCount) { List<AttachmentCountField> attaCountFields = this.View.BillBusinessInfo.GetFieldList().OfType<AttachmentCountField>().ToList(); foreach (AttachmentCountField attaCountField in attaCountFields) { if (attaCountField == null) { continue; } //更新前端值,设置实体数据包附件数,待新增单据保存时直接更新数据库。 int fileCount = Convert.ToInt32(this.View.Model.GetValue(attaCountField.Key, rowIndex)) + attaCount; this.View.Model.SetValue(attaCountField.Key, fileCount, rowIndex); Entity entity = this.View.BillBusinessInfo.GetEntity(attaCountField.EntityKey); string pkValueId = entity.DynamicObjectType.PrimaryKey.Name; string billPkValue = this.View.Model.GetEntityDataObject(entity, rowIndex)[pkValueId].ToString(); if (billPkValue.IsNullOrEmptyOrWhiteSpace() || billPkValue.EqualsIgnoreCase("0")) { continue; } string billTableName = attaCountField.TableName; //单据表格名称。 string billPkFieldName = attaCountField.Entity.EntryPkFieldName; //单据表格主键字段名称。 string attaCountFieldName = attaCountField.FieldName; //附件数字段名称。 string sql = string.Format("update {0} set {1} = {1} + {2} where {3} = @pkId", billTableName, attaCountFieldName, attaCount, billPkFieldName); List<SqlParam> sqlParams = new List<SqlParam>() { new SqlParam("@pkId", KDDbType.String, billPkValue) }; DBServiceHelper.Execute(this.View.Context, sql, sqlParams); } } } }
赞 94
94人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读