选择物料基础资料,将基础资料的附件带到单据上原创
金蝶云社区-Running
Running
94人赞赏了该文章 1,022次浏览 未经作者许可,禁止转载编辑于2024年01月09日 19:24:22

1、应用场景:

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


2、案例演示:

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

image.png

    此为物料下的附件。

image.png


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