PLM.变更申请单.自定义下推变更单二开方案

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

PLM.变更申请单.自定义下推变更单二开方案

前言

PLM变更申请单中的下推变更单功能,标准产品中两者为一对一映射,即一张申请单可以下推成一张变更单,这个关系无法改变,且下推内容暂只支持单据头字段的配置。

 

标准产品中的申请单下推功能,目前无法通过二开方式干预,因此对于一些特殊的业务场景,建议通过自定义自己的操作二开实现。PLM组件中,有部分公用方法可供代码开发使用。

二开示例

1. 场景说明

根据申请单中不同变更对象内容,下推生成不同的变更单类型。

2. 可行方案

由于标准功能无法通过二开干预,所以只能通过完全自定义操作实现。你可以通过扩展申请单,在申请单上加入表单按钮,然后编写表单插件或者服务拆建实现。本文不详细介绍插件部署方式,相关内容可以参考【汇总】星空PLM二开指南(持续更新)

3. 编码示例

对于上述场景,你可以参考下面的代码示例。

在此之前,你可能需要以下组件:

Kingdee.K3.PLM.Common.Core.dll

Kingdee.K3.PLM.Common.Framework.dll

Kingdee.K3.PLM.Common.BusinessEntity.dll

Kingdee.K3.PLM.Business.PlugIn.dll

Kingdee.K3.PLM.CFG.Common.BusinessEntity.dll

Kingdee.K3.PLM.CFG.Common.Core.dll

 

C# 编码示例:

//本示例通过重写表单插件的菜单按钮事件实现。也可以通过增加操作绑定服务操作实现

public override void BarItemClick(BarItemClickEventArgs e)

{

    if(e.BarItemKey == "PLM_tbSplitPush") // 自定义按钮名称

    {

        IOperationResult result = new SaveOperationResult();

        var ecrId = Convert.ToInt64(this.PLMView.CurrentView.Model.DataObject["Id"]);

        if(ECRModel.Instance.HasEcn(PLMContext, ecrId)) // 标准产品中的判断是否已经下推,也可以自定义其他标记做判断

        {

            result.IsSuccess = false;

            result.OperateResult.Add(OperationResultHelper.CreateOperateResult(ecrId.ToString(), 0, "下推变更单失败", false, "已经存在相关联变更单,不允许再下推!", MessageType.Warning));

        }

        else

        {

            using(KDTransactionScope trans = new KDTransactionScope(TransactionScopeOption.Required))

            {

                var changeObjectEntitys = this.PLMView.CurrentView.Model.DataObject["ChangeObjectEntity"] as DynamicObjectCollection;

                for(int index = 0; index < changeObjectEntitys.Count; index++)

                {

                    // 复制一个当前申请单对象,按需要修改自己的数据包内容

                    // 本示例演示,每一行创建一个变更单的场景

                    // 注意:实际场景还需要考虑不同变更类型,以及评估内容等

                    var targetECR = this.PLMView.CurrentView.Model.DataObject.Clone() as DynamicObject;

                    var targetECRChangeObjs = targetECR["ChangeObjectEntity"] as DynamicObjectCollection;

                    for(int delIndex = targetECRChangeObjs.Count - 1; delIndex > index; delIndex--)

                    {

                        targetECRChangeObjs.RemoveAt(delIndex);

                    }

                    for(int delIndex = 0; delIndex < index; delIndex++)

                    {

                        targetECRChangeObjs.RemoveAt(0);

                    }

                    var currrentResult = PushEcn(this.PLMContext, targetECR);

                    foreach(var res in currrentResult.OperateResult)

                    {

                        result.OperateResult.Add(res);

                    }

                    if(!currrentResult.IsSuccess)

                    {

                        result.IsSuccess = false;

                        break;

                    }

                    result.IsSuccess = true;

                }

                if(result.IsSuccess) // 一个不成功则回滚。可以根据场景自己控制

                {

                    trans.Complete();

                }

            }

        }

        PLMView.ShowOperateResult(OperationResultHelper.GetResults(result));

    }

    base.BarItemClick(e);

}

 

/// <summary>

/// 下推申请单至变更单

/// </summary>

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

/// <param name="ecr">ECR申请单单据体数据包</param>

/// <returns>操作结果</returns>

private IOperationResult PushEcn(PLMContext ctx, DynamicObject ecr)

{

    if(ecr == null) return null;

    long ecrId = Convert.ToInt64(ecr["Id"]);

    //获取申请单下推配置

    var headFeildMapCols = EcrConvertCfgManager.Instance.Load(ctx, string.Format(" FCategoryID = {0} AND FSTARTUP = '1' ", (long) StandardCategoryType.ECR));

    //获取字段映射

    var policy = ConvertPolicyManager.Instance.GetPolicy(ctx, StandardCategoryType.ECR, StandardCategoryType.ECN);

    //通过视图代理新建变更单对象

    using(CommonViewProxy proxy = new CommonViewProxy(ctx, CategoryManager.Instance.GetFormIdByCategory(ctx, (long) StandardCategoryType.ECN), false))

    {

        var view = proxy.GetEmptyView();

        // 根据映射关系赋值单据头信息

        ECRManager.Instance.SetHeadFieldValue(proxy, headFeildMapCols, view, ecr);

        var category = CategoryManager.Instance.Get(ctx, (long) StandardCategoryType.ECN);

        var obj = view.Model.DataObject;

        // 修改变更单信息,业务类型,映射的申请单ID、完成日期等。可根据自己需要赋值其他内容

        obj["CategoryID"] = category;

        obj["CategoryID_Id"] = category["Id"];

        obj["ApplyId"] = ecr;

        obj["ApplyId_Id"] = ecrId;

        obj["FinishDate"] = ecr["CompleteDate"];

        BaseObjectManager.Instance(ctx).SetIcon(ctx, obj); // PLM图标赋值

        CommonViewProxyManager.Instance.SetEntityRowsValue(proxy, policy.EntityMaps, view, ecr); // 单据体对象赋值

        IOperationResult result;

        var operation = view.GetFormOperation("Save") as AbstractFormOperation; //调用保存操作

        if(operation != null)

        {

            operation.Option.SetVariableValue("TBECRPUSHECN", true);

            OperationHelper.MarkBackCalling(operation.Option);

            bool ok = operation.Execute();

            try

            {

                result = operation.Option.GetVariableValue < IOperationResult > (BOSConst.CST_KEY_DynamicFormOperationResult); // 获取保存操作结果

            }

            catch(Exception e)

            {

                throw new PLMException(0, "保存失败!");

            }

            if(ok == false) result.IsSuccess = false;

        }

        else

        {

            throw new PLMException(0, "没有找到相关保存的处理!");

        }

        var message = string.Format("{1}({0})", obj["Code"], obj["Name"]); //记录变更单信息

        result.OperateResult.Insert(0, OperationResultHelper.CreateOperateResult(obj["Id"].ToString(), 0, message, true, "下推变更单成功完成!", MessageType.Normal));

        return result;

    }

}

4.     结果展示

PLM.变更申请单.自定义下推变更单二开方案

前言PLM变更申请单中的下推变更单功能,标准产品中两者为一对一映射,即一张申请单可以下推成一张变更单,这个关系无法改变,且下推内容暂...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息