选择物料基础资料,将基础资料的附件携带至对应单据体分录附件列表上原创
7人赞赏了该文章
443次浏览
编辑于2024年01月12日 15:43:50
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; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.Bill.PlugIn.Args; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Core.Metadata.FieldElement; using Kingdee.BOS.Orm; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; namespace Running.Sample.PlugIn.BusinessPlugIn.Bill { [Description("基础资料字段赋值时,携带附件至对应单据体分录附件列表上"), HotUpdate] public class P20240108TakeMaterialAttachmentToEntryEdit : AbstractBillPlugIn { /// <summary> /// 物料字段标识。 /// </summary> private string BaseFieldKey = "FMaterialId"; /// <summary> /// 物料业务对象标识。 /// </summary> private string BaseFormId = "BD_MATERIAL"; /// <summary> /// 单据体字段标识。 /// </summary> private string EntityKey = "FPOOrderEntry"; /// <summary> /// 单据体附件数据集合。 /// </summary> private Dictionary<int, List<DynamicObject>> TempAttaDynObjs = new Dictionary<int, List<DynamicObject>>(); public override void DataChanged(DataChangedEventArgs e) { //物料字段值更新事件。 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; } //获取单据编号 string billNo = string.Empty; Field billNoField = this.View.BillBusinessInfo.GetBillNoField(); if (billNoField != null) { billNo = this.View.Model.GetValue(billNoField.Key).GetString(); } //构建单据附件信息数据包。 for (int i = 0; i < attaDynObjs.Length; i++) { DynamicObject newAttaDynObj = (DynamicObject)attaDynObjs[i].Clone(false, true); //赋值FBillType业务对象标识,指向业务对象。 newAttaDynObj["BillType"] = this.View.BillBusinessInfo.GetForm().Id; //赋值FEntryKey单据体标识,存放单据头,此处赋值空格。 newAttaDynObj["EntryKey"] = this.EntityKey; //赋值FBillNo单据编号,实际字段已弃用,数据仅做参考。 newAttaDynObj["BillNo"] = billNo; //创建人、创建时间、修改人、修改时间。 newAttaDynObj["CreateMen_Id"] = this.Context.UserId; newAttaDynObj["CreateTime"] = DateTime.Now; newAttaDynObj["ModifyMen_Id"] = this.Context.UserId; newAttaDynObj["ModifyTime"] = DateTime.Now; if (!TempAttaDynObjs.ContainsKey(e.Row)) { TempAttaDynObjs[e.Row] = new List<DynamicObject>(); } TempAttaDynObjs[e.Row].Add(newAttaDynObj); } } } public override void AfterSave(AfterSaveEventArgs e) { if (e.OperationResult.IsSuccess) { Entity entity = this.View.BillBusinessInfo.GetEntity(EntityKey); //保存单据附件信息。 FormMetadata attaMetadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, FormIdConst.BOS_Attachment); foreach (KeyValuePair<int, List<DynamicObject>> tempAttaDynObj in TempAttaDynObjs) { for (int i = 0; i < tempAttaDynObj.Value.Count; i++) { //赋值FInterId单据内码,指向具体的单据。 object pkValue = this.View.Model.GetPKValue(); tempAttaDynObj.Value[i]["InterID"] = pkValue.GetString(); //赋值FEntryInterID单据体分录内码。 tempAttaDynObj.Value[i]["EntryInterID"] = this.View.Model.GetEntityDataObject(entity, tempAttaDynObj.Key)["Id"].GetString(); } IOperationResult res = BusinessDataServiceHelper.Save(this.Context, attaMetadata.BusinessInfo, tempAttaDynObj.Value.ToArray()); if (res.IsSuccess) { //执行成功清空数据。 tempAttaDynObj.Value.Clear(); //更新单据头附件数。 UpdateAttachmentCount(tempAttaDynObj.Key, res.SuccessDataEnity.Count()); } } } } private void UpdateAttachmentCount(int rowIndex, int attaCount) { List<AttachmentCountField> attaCountFields = this.View.BillBusinessInfo.GetFieldList().OfType<AttachmentCountField>().ToList(); Entity entity = this.View.BillBusinessInfo.GetEntity(EntityKey); foreach (AttachmentCountField attaCountField in attaCountFields) { if (attaCountField == null || attaCountField.EntityKey.IsNullOrEmptyOrWhiteSpace()) { continue; } Entity attaEntity = this.View.BillBusinessInfo.GetEntity(attaCountField.EntityKey); if (entity != attaEntity) { continue; } //更新前端值,设置实体数据包附件数,待新增单据保存时直接更新数据库。 int fileCount = Convert.ToInt32(this.View.Model.GetValue(attaCountField.Key, rowIndex)) + attaCount; this.View.Model.SetValue(attaCountField.Key, fileCount, rowIndex); string pkValueId = attaEntity.DynamicObjectType.PrimaryKey.Name; string billPkValue = this.View.Model.GetEntityDataObject(attaEntity, 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); } } } }
赞 7
7人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读