【插件开发】通过代码复制物料原创
金蝶云社区-dap
dap
4人赞赏了该文章 1869次浏览 未经作者许可,禁止转载编辑于2020年09月29日 15:20:49
private static IOperationResult CopyMaterial(string materialBaseId,IBillView materialView)
{
    // 获取物料的view 初始化
    var materialView = CreateMaterialView();
    // 执行copy操作
    materialView.Model.Copy(materialBaseId);
    // 设置物料的number  
    var modelDataObject = materialView.Model.DataObject;
    
    if (modelDataObject["MaterialBase"] is DynamicObjectCollection modelDataMaterialBase)
    {
       // 可以根据需求来改变物料,比如修改物料编码,属性
       // modelDataObject["Number"] = "Test";
   }

    // 保存
    var operationResult = materialView.Model.Save();
    // 提交
    materialView.InvokeFormOperation(FormOperationEnum.Submit);
    // 审核
    var isAudit = materialView.InvokeFormOperation(FormOperationEnum.Audit);
    // 如果审核成功就返回
    if (isAudit) return operationResult;
    
    operationResult.IsSuccess = false;
    return operationResult;
}

private IBillView CreateMaterialView()
{
    // 读取物料的元数据
    var meta = MetaDataServiceHelper.Load(this.Context, "BD_MATERIAL") as FormMetadata;
    var form = meta.BusinessInfo.GetForm();
    // 创建用于引入数据的单据view
    var type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
    Debug.Assert(type != null, nameof(type) + " != null");
    var billView = (IDynamicFormViewService) Activator.CreateInstance(type);
    // 开始初始化billView:
    // 创建视图加载参数对象,指定各种参数,如FormId, 视图(LayoutId)等
    var openParam = CreateOpenParameter(meta);
    // 动态领域模型服务提供类,通过此类,构建MVC实例
    var provider = form.GetFormServiceProvider();
    billView.Initialize(openParam, provider);
    return billView as IBillView;
}

/// 元数据
/// 视图加载参数对象
private BillOpenParameter CreateOpenParameter(FormMetadata meta)
{
    Form form = meta.BusinessInfo.GetForm();
    // 指定FormId, LayoutId
    BillOpenParameter openParam = new BillOpenParameter(form.Id, meta.GetLayoutInfo().Id);
    // 数据库上下文
    openParam.Context = this.Context;
    // 本单据模型使用的MVC框架
    openParam.ServiceName = form.FormServiceName;
    // 随机产生一个不重复的PageId,作为视图的标识
    openParam.PageId = Guid.NewGuid().ToString();
    // 元数据
    openParam.FormMetaData = meta;
    // 界面状态:新增 (修改、查看)
    openParam.Status = OperationStatus.ADDNEW;
    // 单据主键:本案例演示新建物料,不需要设置主键
    openParam.PkValue = null;
    // 界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等)
    openParam.CreateFrom = CreateFrom.Default;
    // 基础资料分组维度:基础资料允许添加多个分组字段,每个分组字段会有一个分组维度
    // 具体分组维度Id,请参阅 form.FormGroups 属性
    openParam.GroupId = "";
    // 基础资料分组:如果需要为新建的基础资料指定所在分组,请设置此属性
    openParam.ParentId = 0;
    // 单据类型
    openParam.DefaultBillTypeId = "";
    // 业务流程
    openParam.DefaultBusinessFlowId = "";
    // 主业务组织改变时,不用弹出提示界面
    openParam.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false);
    // 插件
    var plugs = form.CreateFormPlugIns();
    openParam.SetCustomParameter(FormConst.PlugIns, plugs);
    PreOpenFormEventArgs args = new PreOpenFormEventArgs(this.Context, openParam);
    foreach (var plug in plugs)
    {
        // 触发插件PreOpenForm事件,供插件确认是否允许打开界面
        plug.PreOpenForm(args);
    }

    // 返回
    return openParam;
}

参考https://vip.kingdee.com/article/24828

赞 4