zoukankan      html  css  js  c++  java
  • Dynamic CRM 2013学习笔记(三十五)自定义审批流6

    最近有个特殊的需求,客户想做二次审批,就是审批通过后,再走一次审批流程。最开始一想,这还不简单,审批通过后,直接把状态改成draft就完了,后来一试,发现一堆问题,比如第一次审批完后,界面是不允许修改的,直接改成draft就又可以修改了;再比如审批活动记录的查找以及死循环的问题等等。于是自己动手单独写了一个公用的再审批插件,下面介绍详细的实现步骤:

     

    一、添加字段以控制再审批的次数

    添加一个字段 new_approval_count, 再审批一次就把它加1。如果只要再审批一次,那么大于1就退出。

     

    二、获取模板
                        ApproveTempleteHelper templetehelper = new ApproveTempleteHelper();
                        Entity approveTempleteEntity = templetehelper.GetApproveTemplete(service, importCurrentEntity.LogicalName);

    /// <summary>
    /// 获取审批模板
    /// </summary>
    /// <param name="service"></param>
    /// <param name="entityName"></param>
    /// <returns></returns>
    public Entity GetApproveTemplete(IOrganizationService service, string entityName)
    {
    try
    {
    QueryExpression query = new QueryExpression();

    query.EntityName = ApproveTempleteSchemaName;
    query.ColumnSet.AllColumns = true;

    query.Criteria = new FilterExpression();
    query.Criteria.FilterOperator = LogicalOperator.And;

    ConditionExpression condition1 = new ConditionExpression();
    condition1.AttributeName = ApproveTempleteEntityNameSchemaName;
    condition1.Operator = ConditionOperator.Equal;
    condition1.Values.Add(entityName);
    query.Criteria.AddCondition(condition1);

    ConditionExpression condition2 = new ConditionExpression();
    condition2.AttributeName = StateCodeSchemaName;
    condition2.Operator = ConditionOperator.Equal;
    condition2.Values.Add(0);
    query.Criteria.AddCondition(condition2);

    ConditionExpression condition3 = new ConditionExpression();
    condition3.AttributeName = ApproveTempleteDefaultFlagSchemaName;
    condition3.Operator = ConditionOperator.Equal;
    condition3.Values.Add(true);
    query.Criteria.AddCondition(condition3);

    EntityCollection results = service.RetrieveMultiple(query);
    if (results.Entities.Count > 0)
    {
    return results.Entities[0];
    }
    else
    {
    //throw new Exception("没有为该实体定义默认的审批工作流。");
    throw new Exception("No custom default approval workflow for current entity");
    }
    }
    catch (Exception ex)
    {
    throw new Exception(MethodBase.GetCurrentMethod().Name + " " + ex.Message);
    }
    }

     

    三、获取节点
                       ApproveTempleteNodeHelper nodehelper = new ApproveTempleteNodeHelper();
                        Entity approveNode = nodehelper.GetBeginNodeEntity(service, (Guid)approveTempleteEntity["crm_approve_templeteid"]);

    /// <summary>
    /// 获取开始节点
    /// </summary>
    /// <param name="service"></param>
    /// <returns></returns>
    public Entity GetBeginNodeEntity(IOrganizationService service, Guid templeteId)
    {
    try
    {
    QueryExpression query = new QueryExpression();

    query.EntityName = TempleteNodeSchemaName;
    query.ColumnSet.AllColumns = true;

    query.Criteria = new FilterExpression();
    query.Criteria.FilterOperator = LogicalOperator.And;

    ConditionExpression condition1 = new ConditionExpression();
    condition1.AttributeName = TempleteNodeClassSchemaName;
    condition1.Operator = ConditionOperator.Equal;
    condition1.Values.Add(0);
    query.Criteria.AddCondition(condition1);

    ConditionExpression condition2 = new ConditionExpression();
    condition2.AttributeName = StateCodeSchemaName;
    condition2.Operator = ConditionOperator.Equal;
    condition2.Values.Add(0);
    query.Criteria.AddCondition(condition2);

    ConditionExpression condition3 = new ConditionExpression();
    condition3.AttributeName = TempleteIDSchemaName;
    condition3.Operator = ConditionOperator.Equal;
    condition3.Values.Add(templeteId);
    query.Criteria.AddCondition(condition3);

    EntityCollection results = service.RetrieveMultiple(query);

    if (results.Entities.Count > 0)
    {
    return results.Entities[0];
    }
    else
    {
    //throw new Exception("没有未改实体定义开始节点。");
    throw new Exception("No begin activity");
    }
    }
    catch (Exception ex)
    {
    throw new Exception(MethodBase.GetCurrentMethod().Name + " " + ex.Message);
    }
    }

     

    四、创建Instance
                        ApproveInstanceHelper instanceHelper = new ApproveInstanceHelper();
                        Guid instanceId = instanceHelper.CreateApproveInstance(service, approveTempleteEntity, billEntityReference);
                        EntityReference instanceReference = new EntityReference(ApproveInstanceSchemaName, instanceId);

    /// <summary>
    /// 创建流程实例
    /// </summary>
    /// <param name="service"></param>
    /// <param name="templeteEntity"></param>
    /// <param name="subject"></param>
    /// <param name="billEntity"></param>
    /// <returns></returns>
    public Guid CreateApproveInstance(IOrganizationService service, Entity templeteEntity, EntityReference billEntityReference)
    {
    try
    {
    Entity instance = new Entity(ApproveInstanceSchemaName);

    instance[ApproveInstanceTempleteIdSchemaName] = new EntityReference(templeteEntity.LogicalName, (Guid)templeteEntity[templeteEntity.LogicalName + "id"]);
    instance[ApproveInstanceEntityNameSchemaName] = billEntityReference.LogicalName;
    //EntityReference ef = new EntityReference(billEntity.LogicalName, (Guid)templeteEntity[billEntity.LogicalName + "id"]);
    instance[ApproveInstanceBillObjectSchemaName] = billEntityReference;
    instance[ApproveInstancecrmSubjectSchemaName] = DateTime.Now.ToString() + "流程实例";
    instance[ApproveInstanceSubjectSchemaName] = DateTime.Now.ToString() + "流程实例";
    return service.Create(instance);
    }
    catch (Exception ex)
    {
    throw new Exception(MethodBase.GetCurrentMethod().Name + " " + ex.Message);
    }
    }

     

    五、更新业务表Instance
                        BillHelper billHelper = new BillHelper();
                        billHelper.SetBillWFInstance(service, importCurrentEntity, instanceReference, (string)approveTempleteEntity["crm_wf_instanceid_field"], "new_approval_count", iCount);

    /// <summary>
    /// 修改业务单据状态
    /// </summary>
    /// <param name="service"></param>
    /// <param name="billEntity"></param>
    /// <param name="instanceRefence"></param>
    /// <param name="instanceField"></param>
    public void SetBillWFInstance(IOrganizationService service, Entity billEntity, EntityReference instanceRefence, string instanceField, string sField, int sValue)
    {
    try
    {
    billEntity[sField] = Convert.ToDecimal(sValue); //审批计数
    billEntity[instanceField] = instanceRefence;
    service.Update(billEntity);
    }
    catch (Exception ex)
    {
    throw new Exception(MethodBase.GetCurrentMethod().Name + " " + ex.Message);
    }
    }

     

    六、创建审批活动
                        CreateApproveActivityHelper helper = new CreateApproveActivityHelper();
                        helper.CreateBeginApproveActivity(service, approveTempleteEntity, approveNode, currentEntity, instanceReference, context.UserId, owner);

    /// <summary>
    /// 创建第一个审批活动
    /// </summary>
    /// <param name="service"></param>
    /// <param name="approveTemplete"></param>
    /// <param name="approveNode"></param>
    /// <param name="billEntity"></param>
    public void CreateBeginApproveActivity(IOrganizationService service, Entity approveTemplete, Entity approveNode, Entity billEntity, EntityReference instanceReference, Guid userid, EntityReference owner)
    {
    try
    {
    //获取下一个审批节点
    ApproveTempleteNodeHelper nodeHelper = new ApproveTempleteNodeHelper();
    ApproveNode BeginApproveNode = nodeHelper.GetApproveNode(approveNode);
    BeginApproveNode.CallBackValue = 3; //change to draft awen
    EntityReference billEntityReference = new EntityReference(billEntity.LogicalName, (Guid)billEntity[billEntity.LogicalName + "id"]);
    BeginApproveNode.BillEntityReference = billEntityReference;
    EntityReference approveNodeReference = new EntityReference(approveNode.LogicalName, (Guid)approveNode[approveNode.LogicalName + "id"]);
    EntityReference approveTempleteReference = new EntityReference(approveTemplete.LogicalName, (Guid)approveTemplete[approveTemplete.LogicalName + "id"]);

    //更改业务单据中的状态
    nodeHelper.ChangeBillStatus(service, BeginApproveNode, billEntity);

    string subjectField = "";
    if (approveTemplete.Attributes.Keys.Contains(ApproveTempleteSubjectFieldSchemaName))
    {
    subjectField = (string)approveTemplete[ApproveTempleteSubjectFieldSchemaName];
    }

    //主题
    string subject = GetApproveActivitySuject(service, billEntityReference.LogicalName, subjectField, billEntityReference.Id);

    EntityReference userReference = new EntityReference("systemuser", userid);

    CreateApproveActivity(service, subject, billEntityReference, userReference, approveNodeReference, approveTempleteReference, instanceReference, 3, true, owner);

    }
    catch (Exception ex)
    {
    throw new Exception(MethodBase.GetCurrentMethod().Name + " " + ex.Message);
    }
    }

     

    最后记得注册这个插件时,要在step里加上一个image:image

     

     

    [置顶]Dynamic CRM 2013学习笔记 系列汇总 -- 持续更新中

  • 相关阅读:
    UVA11988 Broken Keyboard (a.k.a. Beiju Text)【输入输出】
    UVA11645 Bits【位运算+大数】
    运维工程师和网络工程师的区别?
    一句话总结云计算是什么
    面向切面编程
    Entity FrameWork和Dapper的使用
    使用Autofac实现依赖注入注入
    亲手搭建一个基于Asp.Net WebApi的项目基础框架4
    亲手搭建一个基于Asp.Net WebApi的项目基础框架3
    亲手搭建一个基于Asp.Net WebApi的项目基础框架2
  • 原文地址:https://www.cnblogs.com/fengwenit/p/4293680.html
Copyright © 2011-2022 走看看