【分享】在插件中调用工作流审批原创
金蝶云社区-云社区用户GdP10544
云社区用户GdP10544
5人赞赏了该文章 1947次浏览 未经作者许可,禁止转载编辑于2020年01月07日 15:34:32

在插件中可以调用ApprovalAssignmentServiceHelper.SubmitApprovalItems()进行工作流审批。但SubmitApprovalItems()需要一个AssignmentContext参数,而AssignmentContext属性非常多,构造起来很麻烦。
因此我写了两个方法,将SubmitApprovalItems()再次封装,传入几个简单参数,就能完成审批。

  1. using Kingdee.BOS.App.Data;

  2. using Kingdee.BOS.Core.DynamicForm.PlugIn;

  3. using Kingdee.BOS.Core.Metadata;

  4. using Kingdee.BOS.Orm;

  5. using Kingdee.BOS.Orm.DataEntity;

  6. using Kingdee.BOS.ServiceHelper;

  7. using Kingdee.BOS.Workflow.Assignment;

  8. using Kingdee.BOS.Workflow.Interface;

  9. using Kingdee.BOS.Workflow.Models.ApprovalAssignment;

  10. using Kingdee.BOS.Workflow.Models.EnumStatus;

  11. using Kingdee.BOS.Workflow.ServiceHelper;

  12. using System;

  13. using System.Collections.Generic;

  14. using System.Data;

  15. using System.Linq;



/
  1. /// <summary>

  2.         /// 审批单据,actionName为空时,自动寻找第一个同意审批项;

  3.         /// 有多个类型为通过的审批项时,可用actionName指定审批项,如actionName="审批通过"

  4.         /// </summary>

  5.         /// <param name="formId">单据FormId</param>

  6.         /// <param name="pKValue">单据主键</param>

  7.         /// <param name="receiverName">处理人</param>

  8.         /// <param name="disposition">审批意见</param>

  9.         /// <param name="isApprovalFlow">是否为审批流</param>

  10.         public void ApproveBill(Context ctx,string formId, string pKValue, string receiverName, string disposition, bool isApprovalFlow = false, string actionName = null)

  11.         {

  12.             List<AssignResult> assignResults = GetApproveActions(ctx, formId, pKValue, receiverName);

  13.             AssignResult approvalAssignResults = assignResults.FirstOrDefault(r => r.ApprovalType == AssignResultApprovalType.Forward);

  14.             if (approvalAssignResults == null) throw new Exception("未找到审批项。");

  15.             SubmitWorkflow(ctx, formId, pKValue, receiverName, approvalAssignResults.Id, disposition, isApprovalFlow);

  16.         }


  17.         /// <summary>

  18.         /// 驳回单据,actionName为空时,自动寻找一个驳回审批项;

  19.         /// 有多个类型为驳回的审批项时(如驳回、打回发起人),可用actionName指定审批项,如actionName="打回发起人"

  20.         /// </summary>

  21.         public void RejectBill(Context ctx,string formId, string pKValue, string receiverName, string disposition, bool isApprovalFlow = false, string actionName = null)

  22.         {

  23.             List<AssignResult> assignResults = GetApproveActions(ctx, formId, pKValue, receiverName);

  24.             if (!string.IsNullOrEmpty(actionName))

  25.                 assignResults = assignResults.Where(r => r.Name.Any(p => p.Value == actionName)).ToList();

  26.             else

  27.                 assignResults = assignResults.OrderBy(r => r.Name.Any(p => p.Value == "打回发起人")).ToList();

  28.             AssignResult rejectAssignResults = assignResults.FirstOrDefault(r => r.ApprovalType == AssignResultApprovalType.Reject);

  29.             if (rejectAssignResults == null) throw new Exception("未找到驳回审批项。");

  30.             SubmitWorkflow(ctx, formId, pKValue, receiverName, rejectAssignResults.Id, disposition, isApprovalFlow);

  31.         }


  32. private List<AssignResult> GetApproveActions(Context ctx,string formId, string pKValue, string receiverName)

  33.         {

  34.             DataSet ds = DBUtils.ExecuteDataSet(ctx, @"select b.FASSIGNID,b.FAPPROVALASSIGNID,a.FRECEIVERNAMES

  35.                                 from t_wf_assign a 

  36.                                 join T_WF_APPROVALASSIGN b on a.fassignid=b.fassignid 

  37.                                 where b.Fobjecttypeid=@FormID 

  38.                                 and b.Fkeyvalue=@pKValue and a.FSTATUS=0",

  39.                         new List<SqlParam>

  40.                         {

  41.                             new SqlParam("@FormID", DbType.String, formId),

  42.                             new SqlParam("@pKValue", DbType.String, pKValue)

  43.                         });

  44.             DataRow row = ds.Tables[0].Rows.Cast<DataRow>().FirstOrDefault(dr => dr["FRECEIVERNAMES"].ToString().Split(',').Any(r => r == receiverName));

  45.             if (row == null) return new List<AssignResult> { };


  46.             string assignId = row["FASSIGNID"].ToString();

  47.             string approvalAssignId = row["FAPPROVALASSIGNID"].ToString();

  48.             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(ctx, ctx.UserId, assignId, false);

  49.             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(ctx, _approvalItemId);

  50.             return _approvalItem.Actions.ToList();

  51.         }



  52.         private void SubmitWorkflow(Context ctx,string formId, string pKValue, string receiverName, string actionResult, string disposition, bool isApprovalFlow)

  53.         {

  54.             DataSet ds = DBUtils.ExecuteDataSet(ctx, @"select b.FASSIGNID,b.FAPPROVALASSIGNID,a.FACTINSTID,a.FRECEIVERNAMES

  55.                                 from t_wf_assign a 

  56.                                 join T_WF_APPROVALASSIGN b on a.fassignid=b.fassignid 

  57.                                 where b.Fobjecttypeid=@FormID 

  58.                                 and b.Fkeyvalue=@pKValue and a.FSTATUS=0",

  59.                         new List<SqlParam>

  60.                         {

  61.                             new SqlParam("@FormID", DbType.String, formId),

  62.                             new SqlParam("@pKValue", DbType.String, pKValue)

  63.                         });

  64.             DataRow row = ds.Tables[0].Rows.Cast<DataRow>().FirstOrDefault(dr => dr["FRECEIVERNAMES"].ToString().Split(',').Any(r => r == receiverName));

  65.             if (row == null) throw new Exception("未找到待办任务");



  66.             string assignId = row["FASSIGNID"].ToString();

  67.             string approvalAssignId = row["FAPPROVALASSIGNID"].ToString();

  68.             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(ctx, ctx.UserId, assignId, false);

  69.             FormMetadata formMetadata = MetaDataServiceHelper.GetFormMetaData(ctx, formId);

  70.             DynamicObject ObjData = BusinessDataServiceHelper.LoadSingle(ctx, pKValue, formMetadata.BusinessInfo.GetDynamicObjectType());

  71.             BusinessInfo businessInfo = formMetadata.BusinessInfo;


  72.             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(ctx, _approvalItemId);

  73.             if (_approvalItem == null) throw new Exception("待办任务所在的流程实例不在运行中,不能进行处理!");

  74.             _approvalItem.ObjData = ObjData;

  75.             _approvalItem.ReceiverPostId = 0;

  76.             _approvalItem.ActionResult = actionResult;

  77.             _approvalItem.Disposition = disposition.ToString();

  78.             AssignResult assignResult = _approvalItem.Actions != null ? _approvalItem.Actions.FirstOrDefault(i => i.Id == actionResult) : null;

  79.             AssignResultApprovalType approvalType = assignResult != null ? assignResult.ApprovalType : AssignResultApprovalType.None;

  80.             _approvalItem.ActionResultType = approvalType;

  81.             _approvalItem.Status = ApprovalItemStatus.Completed;

  82.             DateTime timeNow = TimeServiceHelper.GetSystemDateTime(ctx);

  83.             _approvalItem.CompletedTime = timeNow;


  84.             ObjectActivityInstance _activityInstance = AssignmentServiceHelper.ConvertActivityModel(

  85.                     ctx, businessInfo, approvalAssignId, _approvalItem);


  86.             var option = OperateOption.Create();


  87.             if (isApprovalFlow)

  88.             {

  89.                 ApprovalAssignmentContext assignCtx = new ApprovalAssignmentContext()

  90.                 {

  91.                     ApprovalItems = new List<ApprovalItem>() { _approvalItem },

  92.                     Info = businessInfo,

  93.                     Option = option

  94.                 };

  95.                 assignCtx.NextActHandler = null;

  96.                 assignCtx.RejectReturn = false;

  97.                 assignCtx.ActivityInstance = _activityInstance;

  98.                 if (actionResult == AssignResultApprovalType.Reject.ToString())

  99.                 {

  100.                     var _policy = AssignmentServiceHelper.GetApprovalAssignByAssignId(ctx, assignId);

  101.                     var nextHandleWrapper = new Kingdee.BOS.ApprovalFlow.PlugIns.Mobile.MobNextHandleWrapper(assignId, ctx, _policy);

  102.                     assignCtx.Target = nextHandleWrapper.RejectActivityModel.ActivityId;

  103.                 }

  104.                 ApprovalAssignmentServiceHelper.SubmitApprovalItem(Context, assignCtx);

  105.             }

  106.             else

  107.             {

  108.                 ApprovalAssignmentContext assignCtx = new ApprovalAssignmentContext()

  109.                 {

  110.                     ApprovalItems = new List<ApprovalItem>() { _approvalItem },

  111.                     Info = businessInfo,

  112.                     Option = option

  113.                 };

  114.                 assignCtx.NextActHandler = null;

  115.                 assignCtx.RejectReturn = false;

  116.                 assignCtx.ActivityInstance = _activityInstance;

  117.                 AssignmentServiceHelper.SubmitApprovalItem(Context, assignCtx);

  118.             }

  119.         }


赞 5