电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

二开案例.动态表单插件.动态创建显示列

来源:金蝶云社区作者:金蝶2024-09-237

二开案例.动态表单插件.动态创建显示列

需求

显示某个产线下的所有序列号,并能够看出序列号加工到哪个作业,作业的列数不固定,需要动态显示

实现逻辑

OnSetBusinessInfo事件与OnSetLayoutInfo事件一起使用,通过捕获OnSetBusinessInfo事件,修改单据的逻辑元模型(BusinessInfo),动态添加字段,通过捕获OnSetLayoutInfo事件修改单据的布局元模型(LayoutInfo),设置动态添加字段的位置。

元数据

 

最终效果

 

示例代码

/// <summary>
/// 当前业务信息
/// </summary>
private BusinessInfo currBusinessInfo;
/// <summary>
/// 当前布局信息
/// </summary>
private LayoutInfo currLayoutInfo;
/// <summary>
/// 工作中心Id
/// </summary>
private long workCenterId;
/// <summary>
/// 生产订单单据类型(启用工序跟踪、柔性生产)
/// </summary>
private List<string> lstMoBillTypeFiltered = new List<string>();
/// <summary>
/// 工序信息,用于确定每个工序计划的工序及顺序
/// </summary>
private DynamicObjectCollection optInfos;
/// <summary>
/// 最大工序数,用于确定有多少列
/// </summary>
private int maxOptNumber;
/// <summary>
/// 序列号信息,用于展示最终数据
/// </summary>
private DynamicObjectCollection snInfos;
 
public override void AfterBindData(EventArgs e)
{
    base.AfterBindData(e);
 
    FillData();
}
 
/// <summary>
/// 填充数据
/// </summary>
private void FillData()
{
    //序列号条件
    string snCondition = Convert.ToString(this.Model.GetValue("FSnCondition"));
 
    IEnumerable<DynamicObject> snInfosByCondition;
    if (snCondition.IsNullOrEmptyOrWhiteSpace())
    {
        snInfosByCondition = snInfos;
    }
    else
    {
        snInfosByCondition = snInfos.Where(o => Convert.ToString(o["FSNNumber"]).Contains(snCondition));
    }
 
    List<IGrouping<object, DynamicObject>> snInfoGroupBySerialId = snInfosByCondition.GroupBy(o => o["FSerialId"]).ToList();
 
    //清除数据
    this.Model.DeleteEntryData("FEntity");
    //行
    for (int i = 0; i < snInfoGroupBySerialId.Count(); i++)
    {
 
        //添加一行
        this.Model.CreateNewEntryRow("FEntity");
 
        //当前行序列号信息
        IGrouping<object, DynamicObject> curRowSnInfo = snInfoGroupBySerialId[i];
        long optPlanId = Convert.ToInt64(curRowSnInfo.FirstOrDefault()["FOptPlanId"]);
        Dictionary<long, IGrouping<long, DynamicObject>> dicOptInfo = optInfos.GroupBy(o => Convert.ToInt64(o["FOptPlanId"])).ToDictionary(o => o.Key);
        //当前行工序信息
        List<DynamicObject> curRowOptInfo = dicOptInfo[optPlanId].OrderBy(o => Convert.ToInt64(o["FOperNumber"])).ToList();
 
        string snNumber = Convert.ToString(curRowSnInfo.FirstOrDefault()["FSNNumber"]);
        //序列号
        this.View.Model.SetValue("FSnNumber", snNumber, i);
 
        //列
        for (int j = 0; j < curRowOptInfo.Count; j++)
        {
            //当前列的序列号信息,存在返修序的时候满足条件的不止一个,取审核时间最近的一个(sql取数的时候已经排序)
            DynamicObject curColumnSnInfo = curRowSnInfo.Where(o => Convert.ToInt64(o["FOperNumber"]) == Convert.ToInt64(curRowOptInfo[j]["FOperNumber"])
                && Convert.ToInt64(o["FProcessId"]) == Convert.ToInt64(curRowOptInfo[j]["FProcessId"])).FirstOrDefault();
            if (curColumnSnInfo != null)
            {
                string key = "FProcess" + (j + 1).ToString();
                string value = string.Format("{0}-{1}-{2}-1", curColumnSnInfo["FOperNumber"], curColumnSnInfo["FProcessName"], curColumnSnInfo["FQtyType"]);
                this.View.Model.SetValue(key, value, i);
            }
        }
    }
    //刷新
    this.View.UpdateView("FEntity");
}
 
/// <summary>
/// 调整单据的逻辑元数据包,动态添加列
/// </summary>
/// <param name="e"></param>
public override void OnSetBusinessInfo(SetBusinessInfoArgs e)
{
    workCenterId = Convert.ToInt64(this.View.OpenParameter.GetCustomParameter("WorkCenterId"));
 
    //生产订单单据类型
    Dictionary<string, DynamicObject> dicMoBillType = SFCCommonServiceHelper.GetAllMoBillType(this.Context);
    foreach (var moBillType in dicMoBillType)
    {
        //工序跟踪
        bool isProcessTrack = moBillType.Value.GetDynamicObjectItemValue<bool>("IsProcessTrack");
        //柔性生产
        bool isFlexibleProduce = moBillType.Value.GetDynamicObjectItemValue<bool>("FlexibleProduce");
        //工序跟踪 and 柔性生产
        if (isProcessTrack && isFlexibleProduce)
        {
            lstMoBillTypeFiltered.Add(moBillType.Key);
        }
    }
 
    optInfos = GetOptInfos(workCenterId, lstMoBillTypeFiltered.ToArray());
 
    //optInfos.GroupBy(o => o["FOptPlanId"]).ToDictionary(o => o.Key, o => o.Count()).Max(o => o.Value);
    maxOptNumber = optInfos.GroupBy(o => o["FOptPlanId"]).Max(o => o.Count());
 
    snInfos = GetSnInfos(workCenterId, lstMoBillTypeFiltered.ToArray());
 
    // 创建当前单据元数据副本,避免直接修改原始元数据,并发时有问题
    FormMetadata currmetadata = (FormMetadata)ObjectUtils.CreateCopy(
                                this.View.OpenParameter.FormMetaData);
    currBusinessInfo = currmetadata.BusinessInfo;
    currLayoutInfo = currmetadata.GetLayoutInfo();
 
    // 取单据体的元数据模型
    string currEntityKey = "FEntity";
    Entity currEntity = currBusinessInfo.GetEntity(currEntityKey);
 
    // 取原始的字段。动态添加的字段,是基于原始字段的一个分身
    Field oriField = currBusinessInfo.GetField("FSnNumber");
    FieldAppearance oriFieldApp = currLayoutInfo.GetFieldAppearance("FSnNumber");
 
    AddNewFieldsToBusinessInfo(cur

二开案例.动态表单插件.动态创建显示列

需求显示某个产线下的所有序列号,并能够看出序列号加工到哪个作业,作业的列数不固定,需要动态显示实现逻辑OnSetBusinessInfo事件与OnSet...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信