二开案例.服务插件.操作事务内修改并保存单据的多选基础资料数据

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

二开案例.服务插件.操作事务内修改并保存单据的多选基础资料数据

【应用场景】单据执行操作时,在该操作的事务内修改单据的多选基础资料数据。

【案例演示】采购订单,新增多选基础资料字段,提交单据时,在服务插件中修改单据的多选基础资料数据并保存到数据库。

【实现步骤】

<1>编写服务插件,代码如下。

using Kingdee.BOS;

using Kingdee.BOS.App.Core;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core.Metadata.FieldElement;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Util;

using System.Collections.Generic;

using System.ComponentModel;

using System.Linq;


namespace Jac.XkDemo.BOS.App.PlugIn

{

    /// <summary>

    /// 【服务插件】操作事务内修改并保存单据的多选基础资料数据

    /// </summary>

    [Description("【服务插件】操作事务内修改单据的多选基础资料数据"), HotUpdate]

    public class SetMulBaseDataFieldValueInTransactionOperationServicePlugIn : AbstractOperationServicePlugIn

    {

        /// <summary>

        /// 加载指定字段到实体数据包里

        /// 1.在列表上执行操作时,单据的字段并没有被完全加载。 如果操作插件用到了未被加载的字段,一定会中断。

        /// 2.本事件允许插件,强制要求加载某些字段,避免中断

        /// </summary>

        /// <param name="e"></param>

        public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e)

        {

            base.OnPreparePropertys(e);

            // 提前将要改的字段加入到当前操作的单据的数据包中

            e.FieldKeys.Add("F_Jac_MulBase");

        }


        /// <summary>

        /// 操作事物前事件(事务内触发)

        /// </summary>

        /// 1.此事件在操作校验之后

        /// 2.此事件在操作事务开始之后

        /// 3.此事件在操作执行代码之前

        /// 4.此事件中的数据库处理,受操作的事务保护

        /// 5.通常此事件,可以用来做数据准备,在操作之前,提前写数据到库

        /// <param name="e"></param>

        public override void BeginOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeginOperationTransactionArgs e)

        {

            base.BeginOperationTransaction(e);

            // 保存8提交9审核1反审核26

            if (this.FormOperation.OperationId == 9 || this.FormOperation.OperationId == 1)

            {

                //SetMulBaseDataFieldValue(e.DataEntitys);

            }

        }


        /// <summary>

        /// 操作事物后事件(事务内触发)

        /// </summary>

        /// <param name="e"></param>

        /// <remarks>

        /// 1. 此事件在操作执行代码之后,操作的内部逻辑已经执行完毕

        /// 2. 此事件在操作事务提交之前

        /// 3. 此事件中的数据库处理,受操作的事务保护

        /// 4. 通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护

        /// </remarks>

        public override void EndOperationTransaction(EndOperationTransactionArgs e)

        {

            base.EndOperationTransaction(e);

            // 保存8提交9审核1反审核26

            if (this.FormOperation.OperationId == 9 || this.FormOperation.OperationId == 1)

            {

                // 方式1

                SetMulBaseDataFieldValue(e.DataEntitys);

                // 方式2

                //SetMulBaseDataFieldValue2(e.DataEntitys);

            }

        }


        /// <summary>

        /// 修改单据的多选基础资料数据

        /// </summary>

        /// <param name="dataEntitys"></param>

        private void SetMulBaseDataFieldValue(DynamicObject[] dataEntitys)

        {

            // 获取多选基础资料字段

            var field = this.BusinessInfo.GetField("F_Jac_MulBase") as MulBaseDataField;

            if (field == null)

            {

                return;

            }


            // 使用基础资料内码进行赋值

            var ids = new object[] { "100211", "100212" };

            foreach (var dataEntity in dataEntitys)

            {

                DataObjectSetValue(this.Context, field, dataEntity, ids);

            }


            // 保存变更后的数据

            new BusinessDataWriter(Context).Save(dataEntitys);

        }


        /// <summary>

        /// 修改单据的多选基础资料数据(使用SQL直接修改)

        /// </summary>

        /// <param name="dataEntitys"></param>

        private void SetMulBaseDataFieldValue2(DynamicObject[] dataEntitys)

        {

            // 使用基础资料内码进行赋值

            var ids = new object[] { "100211", "100212" };

            // 批量获取多个待插入数据的主键

            var pkids = new SequenceReader(Context).GetSequence<long>("Jac_t_Cust_Entry100166", ids.Length * dataEntitys.Length).ToList();

            var sqlList = new List<SqlObject>();

            foreach (var dataEntity in dataEntitys)

            {

                foreach (var basedataPkId in ids)

                {

                    var billPkId = dataEntity["Id"];

                    sqlList.Add(new SqlObject(string.Format("INSERT INTO Jac_t_Cust_Entry100166 (FPKID,FID,F_JAC_MULBASE) VALUES ({0},{1},{2})", pkids[0], billPkId, basedataPkId), new List<SqlParam>()));

                    pkids.RemoveAt(0);

                }

            }


            // 保存变更后的数据

            DBUtils.ExecuteBatch(this.Context, sqlList);

        }


        /// <summary>

        /// 多选基础资料字段赋值(直接修改数据包)

        /// </summary>

        /// <param name="ctx">上下文</param>

        /// <param name="field">多选基础资料字段</param>

        /// <param name="entityObj">多选基础资料字段所在数据行</param>

        /// <param name="pkValues">多个基础资料的内码的集合</param>

        private static void DataObjectSetValue(Context ctx, MulBaseDataField field, DynamicObject entityObj, object[] pkValues)

        {

            // 获取多选基础资料字段的数据包集合

            var mulBaseDataEntitySet = entityObj["F_Jac_MulBase"] as DynamicObjectCollection;

            if (mulBaseDataEntitySet == null)

            {

                mulBaseDataEntitySet = new DynamicObjectCollection(field.RefEntityDynamicObjectType, entityObj);

                entityObj["F_Jac_MulBase"] = mulBaseDataEntitySet;

            }


            mulBaseDataEntitySet.Clear();

            // 从数据库读取指定的基础资料的数据包,并填充到当前多选基础资料字段的数据包集合中

            var baseDataObjects = new BusinessDataReader(ctx).LoadWithCache(pkValues, field.RefFormDynamicObjectType, true);

            foreach (var baseDataObject in baseDataObjects)

            {

                var mulBaseDataEntity = new DynamicObject(field.RefEntityDynamicObjectType);

                mulBaseDataEntitySet.Add(mulBaseDataEntity);

                //mulBaseDataEntity[0] = new SequenceReader(ctx).GetSequence<long>(field.TableName, 1).First();

                mulBaseDataEntity["PKId"] = new SequenceReader(ctx).GetSequence<long>(field.TableName, 1).First();

                mulBaseDataEntity["F_Jac_MulBase_Id"] = baseDataObject[0];

                mulBaseDataEntity["F_Jac_MulBase"] = baseDataObject;

            }

        }

    }

}


<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<3>BOSIDE扩展采购订单,添加一个多选基础资料字段,注册服务插件,保存元数据,开发完毕。


现在可以登录业务站点,打开采购订单编辑界面,执行提交操作,验证下插件对多选基础资料字段的赋值效果啦。




【知识点】

<1>提交和审核操作(保存操作以外的其它操作)使用的单据数据包是按操作实际需要而整合的最小数据包,不是完整数据包,如果要在插件里访问单据的某个字段的数据,需要在服务插件的OnPreparePropertys事件中提前将该字段加入到数据包。

<2>提交和审核操作默认不会执行单据数据的保存操作,所以修改完单据的数据包后要手动进行保存。




【参考资料】

【二开案例.元模型.多选基础资料字段】https://vip.kingdee.com/article/141576438863919104













【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

二开案例.服务插件.操作事务内修改并保存单据的多选基础资料数据

【应用场景】单据执行操作时,在该操作的事务内修改单据的多选基础资料数据。【案例演示】采购订单,新增多选基础资料字段,提交单据时,在...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息