二开插件-BeforeSelectF7动态构建单据体,并做过滤

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

二开插件-BeforeSelectF7动态构建单据体,并做过滤

一,具体实现功能如下:

    某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添加一个单据体,单据体内容均由代码动态构建,单据体的具体内容为某张单据的所有单据头字段的集合,可通过多选/单选返回数据至源单单据体上,动态绑定数据。

二,前期准备:

    仅需一个空白的动态表单上添加一个单据体,添加两个按钮tbReturnData返回数据 /tbClose-关闭
image.webp


三,代码思路

    1.动态表单上添加一个动态构建动态表单单据体的插件,在打开的时候构建该动态表单。

    2.源单上添加插件做BeforeSelectF7事件,弹出该动态表单。

四,具体代码

    1.创建动态表单

using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BL.K3.Plugln.Bill.ENGRouteProcess
{

    [Description("二开-【动态表单插件】-作业-作业参数动态表单动态去构建单据体数据包"),HotUpdate]
    public class CreateDynamicEntity : AbstractDynamicFormPlugIn
    {
        #region var
        private const string entityKey = "F_BL_EngProcessEntity";//单据体标识
        private String[] fieldNames = new String[] {"选中数据","字段标识", "字段名称", "字段类型" };//需要动态创建列的列名
        private BusinessInfo _currInfo;
        private LayoutInfo _currLayout;
        #endregion
        //获取作业单据的元数据
        private List<String[]> GetXmlData()
        {
            List<String[]> sum = new List<string[]>();
            FormMetadata formMetadata = (FormMetadata)MetaDataServiceHelper.Load(this.Context, "QPUB_BL_Parameter");
            var fields = formMetadata.BusinessInfo.GetFieldList().FindAll(o => o.FieldName.ToUpper() != "FBILLNO" 
                                                                            && o.FieldName.ToUpper() != "F_BL_ENGPROCESS" 
                                                                            && o.FieldName.ToUpper() != "FPROCESSID" 
                                                                            && o.FieldName.ToUpper() != "F_BL_ROUTEID" 
                                                                            && o.FieldName.ToUpper() != "F_BL_ROUTEOPERSEQ" 
                                                                            && o.FieldName.ToUpper() != "F_BL_PROCESSSEQNUMBER"
                                                                            && o.FieldName.ToUpper() != "F_BL_WORKHOUR"
                                                                           // && o.FieldName.ToUpper() != "F_BL_REMARK"
                                                                            && o.EntityKey == "FBillHead");
            var entity = formMetadata.BusinessInfo.Entrys.FindAll(o => o.EntryName != "BillHead");
            foreach (var field in fields)
            {
                String[] obj = new String[3];
                obj[0] = field.FieldName;//字段标识
                obj[1] = field.Name;//字段名称
                String sql = String.Format("Select Fname from T_MDL_ELEMENTTYPE_L where fid = '{0}'", field.ElementType);
                var result = DBServiceHelper.ExecuteDynamicObject(this.Context, sql);
                obj[2] = Convert.ToString(result[0][0]);//字段类型
                sum.Add(obj);
            }
            foreach (var entry in entity)
            {
                String[] obj = new String[3];
                obj[0] = entry.EntryName;
                obj[1] = entry.Name;
                String sql = String.Format("Select Fname from T_MDL_ELEMENTTYPE_L where fid = '{0}'", entry.ElementType);
                var result = DBServiceHelper.ExecuteDynamicObject(this.Context, sql);
                obj[2] = Convert.ToString(result[0][0]);//字段类型
                sum.Add(obj);
            }
            return sum;
        }
        //初始化数据后调用构建数据包
        public override void AfterBindData(EventArgs e)
        {
            base.AfterBindData(e);            
            Search();
        }
        //查询
        private void Search()
        {
            List<String[]> dyobj = GetXmlData();
            if (dyobj != null)
            {
                // 修改元数据
                this.ReBuildFields(dyobj);
                // 根据新的元数据,重构单据体表格列
                EntryGrid grid = this.View.GetControl<EntryGrid>(entityKey);
                grid.SetAllowLayoutSetting(false); // 列按照索引显示
                grid.Enabled = false; //不可编辑
                EntityAppearance listAppearance = _currLayout.GetEntityAppearance(entityKey);
                grid.CreateDyanmicList(listAppearance);
                // 填充数据
                this.SetData(dyobj);
                // 下达一个指令
                this.View.SendDynamicFormAction(this.View);
                this.View.UpdateView(entityKey); //解决单据体刷新
            }
        }
        //在此事件当中初始化元数据时触发该事件
        public override void OnSetBusinessInfo(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.SetBusinessInfoArgs e)
        {
            base.OnSetBusinessInfo(e);
            // 复制界面元数据到本地变量
            FormMetadata currMeta = (FormMetadata)ObjectUtils.CreateCopy(
            this.View.OpenParameter.FormMetaData);
            _currInfo = currMeta.BusinessInfo;
            _currLayout = currMeta.GetLayoutInfo();
            // 用本地的元数据,替换动态表单引擎持有的元数据
            e.BusinessInfo = _currInfo;
            e.BillBusinessInfo = _currInfo;
        }
        //通常在该事件当中去修改界面的元数据
        public override void OnSetLayoutInfo(SetLayoutInfoArgs e)
        {
             e.LayoutInfo = _currLayout;
             e.BillLayoutInfo = _currLayout;
        }
        //构建单据体字段
        private void ReBuildFields(List<String[]> dyobj)
        {
            Entity entity = _currInfo.GetEntity(entityKey);
            EntityAppearance entityApp = _currLayout.GetEntityAppearance(entityKey);
            // 添加字段,构建列   
            for (int i = 0; i < fieldNames.Count(); i++)
            {
                if (i == 0)
                {
                    //构建复选框按钮            
                    CheckBoxField cbField = new CheckBoxField();
                    cbField.Key = "F_BL_SelectData";
                    cbField.Id = "F_BL_SelectData";
                    cbField.Name = new LocaleValue("选中数据");
                    cbField.PropertyName = "F_BL_SelectData";
                    cbField.EntityKey = entityKey;
                    cbField.Entity = entity;
                    _currInfo.Add(cbField);
                    CheckBoxFieldAppearance fieldA = new CheckBoxFieldAppearance();
                    fieldA.Key = cbField.Key;
                    fieldA.Caption = cbField.Name;
                    fieldA.EntityKey = cbField.EntityKey;
                    fieldA.Width = new LocaleValue("90");
                    fieldA.LabelWidth = new LocaleValue("80");
                    fieldA.Tabindex = i;
                    fieldA.Field = cbField;
                    fieldA.TextEditStyle = 1;
                    _currLayout.Add(fieldA);
                }
                else
                {
                    //构建文本字段
                    Field fld = new TextField();
                    fld.Key = String.Format("F_BL_FieldIdent{0}", i);
                    fld.Id = String.Format("F_BL_FieldIdent{0}", i);
                    fld.Name = new LocaleValue(fieldNames[i]);
                    fld.PropertyName = String.Format("F_BL_FieldIdent{0}", i);
                    fld.EntityKey = entityKey;
                    fld.Entity = entity;
                    _currInfo.Add(fld);
                    TextFieldAppearance fldApp = new TextFieldAppearance();
                    fldApp.Key = fld.Key;
                    fldApp.Caption = fld.Name;
                    fldApp.EntityKey = fld.EntityKey;
                    fldApp.Width = new LocaleValue("100");
                    fldApp.LabelWidth = new LocaleValue("80");
                    fldApp.Tabindex = i;
                    fldApp.Field = fld;
                    fldApp.TextEditStyle = 1;
                    _currLayout.Add(fldApp);
                }
            }
        }
        //构建单据体数据
        private void SetData(List<String[]> dyobj)
        {
            // 使用最新的元数据,重新界面数据包
            _currInfo.GetDynamicObjectType(true);            
            //获取父窗体单据体已有数据            
            var FSelectId = this.View.OpenParameter.GetCustomParameter("FSelectId");
            if (!FSelectId.IsNullOrEmptyOrWhiteSpace())
            {
                List<object> List = (List<object>)FSelectId;
                //构建数据中去除已经选择在单据体当中的数据
                for (int i = 0; i < dyobj.Count; i++)
                {
                    for (int j = 0; j < List.Count; j++)
                    {
                        //用编码标识去进行判断,去除已选择的记录
                        if (dyobj[i][0] == List[j].ToString())
                        {
                            dyobj.RemoveAt(i);
                            i--;
                            break;
                        }
                    }
                }               
            }
            //构建数据中判断当前作业是否已经选择单据体表,若已选择,至多只允许选择一个单据体
            var SelectTypes = this.View.OpenParameter.GetCustomParameter("SelectTypes");
            if (!SelectTypes.IsNullOrEmptyOrWhiteSpace())
            {
                List<object> List = (List<object>)SelectTypes;
                var result = List.FindAll(o => o.ToString() == "单据体");
                //参数中已经选择了单据体字段,构建参数当中移除所有单据体字段
                if (result.Count > 0)
                {
                    dyobj.RemoveAll(o => o[2].ToString() == "单据体");
                }
            }
            this.Model.CreateNewData(); 
            this.Model.BeginIniti();
            this.View.GetControl("F_BL_SelectData").Enabled = true;
            for (int i = 0; i < dyobj.Count; i++)
            {
                this.Model.BatchCreateNewEntryRow(entityKey, 1);
                this.Model.SetValue("F_BL_FieldIdent1", dyobj[i][0], i);
                this.Model.SetValue("F_BL_FieldIdent2", dyobj[i][1], i);
                this.Model.SetValue("F_BL_FieldIdent3", dyobj[i][2], i);
            }
            this.Model.EndIniti();
        }
        /// <summary>
        /// 子窗体传值回父窗体
        /// </summary>
        /// <param name="ElementType"></param>
        /// <returns></returns>
        ///单据体行双击事件
        public override void EntityRowDoubleClick(EntityRowClickEventArgs e)
        {
            base.EntityRowDoubleClick(e);
            List<DynamicObject> sum = new List<DynamicObject>();
            int rowIndex = this.Model.GetEntryCurrentRowIndex(entityKey);//获取双击选中行的行号
            var billObj = this.View.Model.DataObject;
            var entity = (DynamicObjectCollection)billObj["EngProcessEntity"];
            var date = entity[rowIndex]; //获取选中行的数据包
            sum.Add(date);
            this.View.ReturnToParentWindow(sum);
            this.View.Close();
        }
        ///tbReturnData按钮点击事件
        public override void AfterBarItemClick(AfterBarItemClickEventArgs e)
        {
            base.AfterBarItemClick(e);
            if (e.BarItemKey == "tbReturnData")
            {
                List<DynamicObject> sum = new List<DynamicObject>();
                //单据体数据
                DynamicObjectCollection selectedRowsDy = this.Model.DataObject["EngProcessEntity"] as DynamicObjectCollection;
                if (selectedRowsDy.Count==0) return;
                //获取选中行数据
                for (int i = 0; i < selectedRowsDy.Count(); i++)
                {
                    if (Convert.ToString(selectedRowsDy[i][1]).ToUpper()=="TRUE")
                    {
                        sum.Add(selectedRowsDy[i]);
                    }
                }
                this.View.ReturnToParentWindow(sum);
                this.View.Close();
            }
        }       
    }
}


2.源单BeforeSelectF7事件

using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BL.K3.Plugln.Bill.ENGRouteProcess
{
    [Description("二开-作业表单插件,实现自定义单据体数据的动态绑定"), HotUpdate]
    public class EngProcessBillPlugln: AbstractBillPlugIn
    {      
        public override void BeforeF7Select(BeforeF7SelectEventArgs e)
        {
            base.BeforeF7Select(e);
            try
            {
                if (this.Context.CurrentOrganizationInfo.ID == 225169) return; //非101组织
                if (e.FieldKey.Equals("F_BL_parameterName"))
                {
                    List<object> ParameterIds = new List<object>();
                    List<object> ParameterTypes = new List<object>();
                    DynamicFormShowParameter form = new DynamicFormShowParameter();
                    form.FormId = "QPUB_EngParameter";//动态表单-作业参数
                    form.MultiSelect = true;
                    //获取单据体当前的数据进行过滤
                    Entity entry = this.View.BusinessInfo.GetEntity("FParaterEntity");
                    var entity = (DynamicObjectCollection)this.Model.GetEntityDataObject(entry);
                    if (entity.Count != 0 && entity != null)
                    {
                        foreach (var obj in entity)
                        {
                            //参数标识
                            var ParameterId = obj["F_BL_ParameterId"];
                            if (ParameterId != null && !ParameterId.IsNullOrEmptyOrWhiteSpace())
                            {
                                ParameterIds.Add(ParameterId);
                            }
                            //参数类型
                            if (obj["F_BL_ParameterTypes"] != null && !obj["F_BL_ParameterTypes"].IsNullOrEmptyOrWhiteSpace())
                            {
                                ParameterTypes.Add(obj["F_BL_ParameterTypes"]);
                            }
                        }                       
                    }
                    if (ParameterIds != null && ParameterIds.Count != 0)
                    {
                        //父窗体传值到子窗体
                        form.CustomComplexParams.Add("FSelectId", ParameterIds);
                    }
                    if (ParameterTypes.Count != 0 && ParameterTypes != null)
                    { 
                        //父窗体传值至子窗体
                        form.CustomComplexParams.Add("SelectTypes", ParameterTypes);
                    }
                    this.View.ShowForm(form, new Action<FormResult>((result) =>
                    {
                        //接受子窗体选中返回的数据
                        if (result.ReturnData != null&&result!=null)
                        {                                
                            List<DynamicObject> dt = (List<DynamicObject>)result.ReturnData;
                            bool first = false; 
                            for (int i = 0; i < dt.Count;i++ )
                            {
                                if (first) continue;
                                if (dt[i][4].ToString() == "单据体") first = true;                                
                                this.Model.BeginIniti();
                                this.Model.SetValue("F_BL_ParameterId", dt[i][2], e.Row+i);//参数标识
                                this.Model.SetValue("F_BL_parameterName", dt[i][3], e.Row + i);//参数名
                                this.Model.SetValue("F_BL_ParameterTypes", dt[i][4], e.Row + i);//参数类型
                                this.Model.BatchCreateNewEntryRow("FParaterEntity", 1);
                                this.Model.EndIniti();
                                this.View.UpdateView("FParaterEntity");
                            }
                        }
                    }));
                    this.View.UpdateView("F_BL_parameterName", e.Row);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}


二开插件-BeforeSelectF7动态构建单据体,并做过滤

一,具体实现功能如下: 某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息