选择物料基础资料,将基础资料的附件携带至对应单据体分录附件列表上原创
金蝶云社区-Running
Running
7人赞赏了该文章 280次浏览 未经作者许可,禁止转载编辑于2024年01月12日 15:43:50

1、应用场景:

    单据选择基础资料字段,将基础资料字段对应的附件,携带至对应单据体分录附件列表上,如果单据体上有附件数字段,同时更新附件数。

    留意单据体附件上传,并不支持未保存状态下上传附件,所以本案例实现的是选择物料,保存单据时才带出物料附件至对应单据体分录附件列表上。


2、案例演示:

    以采购订单为例,单据体明细信息,选择物料时,将物料的附件携带至单据体附件管理内,同时更新单据体上的附件数字段。

image.png

    此为物料下的附件。

image.png


3、实现步骤:

    设计器采购订单单据体拖附件菜单,关联单据体附件管理操作:

image.png


    为采购订单注册表单插件,示例代码如下:

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