金蝶云·星空|在插件中调用审批流,正向审批没有问题,但是反向驳回遇到问题

0

按照这个帖子https://club.kingdee.com/forum.php?mod=viewthread&tid=1343938
做了调整后,我根据assginid进行审批流的后台操作,正向操作都正常,
(我设置的审批流是两级审核)
但是再二级审核节点通过插件代码反向驳回时,上级审核人没有接受到消息,而且待办消息中也不存在需要代办的消息,单据处于审核中状态,再次点击审核后,单据直接被审核了。
代码如下:

  1. /************************************************************
  2. * 功能描述(Description):      后台审批流
  3. * 作者(Author):              倪斌斌
  4. * 日期(Create Date):         2019/3/18 14:48:57
  5. *
  6. * 修改记录(Revision History):
  7. *      R1:
  8. *      修改人:
  9. *      修改日期:
  10. *      修改事项:
  11. * **********************************************************/

  12. using Kingdee.BOS;
  13. using Kingdee.BOS.App.Data;
  14. using Kingdee.BOS.Core.DynamicForm;
  15. using Kingdee.BOS.Core.Metadata;
  16. using Kingdee.BOS.Orm;
  17. using Kingdee.BOS.Orm.DataEntity;
  18. using Kingdee.BOS.ServiceFacade.KDServiceFx;
  19. using Kingdee.BOS.ServiceHelper;
  20. using Kingdee.BOS.WebApi.ServicesStub;
  21. using Kingdee.BOS.Workflow.Assignment;
  22. using Kingdee.BOS.Workflow.Interface;
  23. using Kingdee.BOS.Workflow.Models.ApprovalAssignment;
  24. using Kingdee.BOS.Workflow.Models.EnumStatus;
  25. using Kingdee.BOS.Workflow.ServiceHelper;
  26. using Kingdee.BOS.WorkflowMember;
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Data;
  30. using System.Linq;
  31. using System.Text;

  32. namespace Unicre.wx.ApiServices.WorkFlow
  33. {
  34.     public class WorkFlowService: AbstractWebApiBusinessService
  35.     {
  36.         public WorkFlowService(KDServiceContext context)
  37.             : base(context)
  38.         { }

  39.         /// <summary>
  40.         /// 审批单据,actionName为空时,自动寻找第一个同意审批项;
  41.         /// 有多个类型为通过的审批项时,可用actionName指定审批项,如actionName="审批通过"
  42.         /// </summary>
  43.         /// <param name="assignId">待审批项标识</param>
  44.         /// <param name="disposition">审批意见</param>
  45.         /// <param name="isApprovalFlow">是否为审批流</param>
  46.         public string ApproveBillByAssignId(string assignId,string disposition, bool isApprovalFlow = false)
  47.         {
  48.             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(this.KDContext.Session.AppContext, this.KDContext.Session.AppContext.UserId, assignId, false);
  49.             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(this.KDContext.Session.AppContext, _approvalItemId);
  50.             List<AssignResult> assignResults = _approvalItem.Actions.ToList();

  51.             AssignResult approvalAssignResults = assignResults.FirstOrDefault(r => r.ApprovalType == AssignResultApprovalType.Forward);
  52.             if (approvalAssignResults == null) throw new Exception("未找到审批项。");
  53.             return SubmitWorkflow(assignId, approvalAssignResults.Id, disposition, isApprovalFlow);
  54.         }

  55.         /// <summary>
  56.         /// 驳回单据,actionName为空时,自动寻找一个驳回审批项;
  57.         /// 有多个类型为驳回的审批项时(如驳回、打回发起人),可用actionName指定审批项,如actionName="打回发起人"
  58.         /// </summary>
  59.         public string RejectBillByAssignId(string assignId, string disposition, bool isApprovalFlow = false, string actionName = null)
  60.         {
  61.             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(this.KDContext.Session.AppContext, this.KDContext.Session.AppContext.UserId, assignId, false);
  62.             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(this.KDContext.Session.AppContext, _approvalItemId);
  63.             List<AssignResult> assignResults = _approvalItem.Actions.ToList();
  64.             if (!string.IsNullOrEmpty(actionName))
  65.                 assignResults = assignResults.Where(r => r.Name.Any(p => p.Value == actionName)).ToList();
  66.             else
  67.                 assignResults = assignResults.OrderBy(r => r.Name.Any(p => p.Value == "打回发起人")).ToList();
  68.             AssignResult rejectAssignResults = assignResults.FirstOrDefault(r => r.ApprovalType == AssignResultApprovalType.Reject);
  69.             if (rejectAssignResults == null) throw new Exception("未找到驳回审批项。");
  70.             return SubmitWorkflow(assignId, rejectAssignResults.Id, disposition, isApprovalFlow,true);
  71.         }

  72.         private string SubmitWorkflow(string assignId, string actionResult, string disposition, bool isApprovalFlow, bool isRejectAssign = false)
  73.         {
  74.             DataSet ds = DBUtils.ExecuteDataSet(this.KDContext.Session.AppContext,
  75.                                 @"select b.FASSIGNID,b.FAPPROVALASSIGNID,a.FACTINSTID,b.FObjectTypeId,b.FKeyValue
  76.                                 from t_wf_assign a
  77.                                 join T_WF_APPROVALASSIGN b on a.fassignid=b.fassignid
  78.                                 where a.fassignid = @assignid and a.FSTATUS=0",
  79.                         new List<SqlParam>
  80.                         {
  81.                             new SqlParam("@assignid", KDDbType.String, assignId)
  82.                         });
  83.             DataRow row = ds.Tables[0].Rows.Cast<DataRow>().FirstOrDefault();
  84.             //if (row == null) throw new Exception("未找到待办任务");
  85.             if (row == null)
  86.                 return "未找到待办任务";
  87.             string approvalAssignId = row["FAPPROVALASSIGNID"].ToString();
  88.             string formId= row["FObjectTypeId"].ToString();
  89.             string pKValue= row["FKeyValue"].ToString();
  90.             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(this.KDContext.Session.AppContext, this.KDContext.Session.AppContext.UserId, assignId, false);
  91.             FormMetadata formMetadata = MetaDataServiceHelper.GetFormMetaData(this.KDContext.Session.AppContext, formId);
  92.             DynamicObject ObjData = BusinessDataServiceHelper.LoadSingle(this.KDContext.Session.AppContext, pKValue, formMetadata.BusinessInfo.GetDynamicObjectType());
  93.             BusinessInfo businessInfo = formMetadata.BusinessInfo;

  94.             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(this.KDContext.Session.AppContext, _approvalItemId);
  95.             //if (_approvalItem == null) throw new Exception("待办任务所在的流程实例不在运行中,不能进行处理!");
  96.             if (_approvalItem == null)
  97.                 return "待办任务所在的流程实例不在运行中,不能进行处理!";
  98.             _approvalItem.ObjData = ObjData;
  99.             _approvalItem.ReceiverPostId = 0;
  100.             _approvalItem.ActionResult = actionResult;
  101.             _approvalItem.Disposition = disposition.ToString();
  102.             AssignResult assignResult = _approvalItem.Actions != null ? _approvalItem.Actions.FirstOrDefault(i => i.Id == actionResult) : null;
  103.             AssignResultApprovalType approvalType = assignResult != null ? assignResult.ApprovalType : AssignResultApprovalType.None;
  104.             _approvalItem.ActionResultType = approvalType;
  105.             _approvalItem.Status = ApprovalItemStatus.Completed;
  106.             DateTime timeNow = TimeServiceHelper.GetSystemDateTime(this.KDContext.Session.AppContext);
  107.             _approvalItem.CompletedTime = timeNow;

  108.             ObjectActivityInstance _activityInstance = AssignmentServiceHelper.ConvertActivityModel(
  109.                     this.KDContext.Session.AppContext, businessInfo, approvalAssignId, _approvalItem);

  110.             var option = OperateOption.Create();

  111.             if (isApprovalFlow)
  112.             {
  113.                 ApprovalAssignmentContext assignCtx = new ApprovalAssignmentContext()
  114.                 {
  115.                     ApprovalItems = new List<ApprovalItem>() { _approvalItem },
  116.                     Info = businessInfo,
  117.                     Option = option
  118.                 };
  119.                 assignCtx.NextActHandler = null;
  120.                 assignCtx.RejectReturn = false;
  121.                 assignCtx.ActivityInstance = _activityInstance;
  122.                 if (actionResult == AssignResultApprovalType.Reject.ToString())
  123.                 {
  124.                     string actInstId = row["FACTINSTID"].ToString();
  125.                     Kingdee.BOS.Workflow.App.Core.ProcInstService procInstService = new Kingdee.BOS.Workflow.App.Core.ProcInstService();
  126.                     var rejectActivityIds = procInstService.GetBackActInstList(this.KDContext.Session.AppContext, actInstId, true).Select(r => r.ActivityId);
  127.                     //if (!rejectActivityIds.Any()) throw new Exception("无驳回节点");
  128.                     if (!rejectActivityIds.Any())
  129.                         return "无驳回节点";
  130.                     assignCtx.Target = rejectActivityIds.FirstOrDefault();
  131.                 }
  132.                 ApprovalAssignmentServiceHelper.SubmitApprovalItem(this.KDContext.Session.AppContext, assignCtx);
  133.                 return "ok";
  134.             }
  135.             else
  136.             {
  137.                 ApprovalAssignmentContext assignCtx = new ApprovalAssignmentContext()
  138.                 {
  139.                     ApprovalItems = new List<ApprovalItem>() { _approvalItem },
  140.                     Info = businessInfo,
  141.                     Option = option
  142.                 };
  143.                 assignCtx.NextActHandler = null;
  144.                 assignCtx.RejectReturn = isRejectAssign;
  145.                 assignCtx.ActivityInstance = _activityInstance;
  146.                 if (actionResult == AssignResultApprovalType.Reject.ToString())
  147.                 {
  148.                     string actInstId = row["FACTINSTID"].ToString();
  149.                     Kingdee.BOS.Workflow.App.Core.ProcInstService procInstService = new Kingdee.BOS.Workflow.App.Core.ProcInstService();
  150.                     var rejectActivityIds = procInstService.GetBackActInstList(this.KDContext.Session.AppContext, actInstId, true).Select(r => r.ActivityId);
  151.                     //if (!rejectActivityIds.Any()) throw new Exception("无驳回节点");
  152.                     if (!rejectActivityIds.Any())
  153.                         return "无驳回节点";
  154.                     assignCtx.Target = rejectActivityIds.FirstOrDefault();
  155.                     //var userlists= procInstService.GetBackActInstList(this.KDContext.Session.AppContext, actInstId, true).Select(r => r.UserList);
  156.                     //if (!userlists.Any())
  157.                     //    return "无驳回处理人";
  158.                     //var nextact = new Dictionary<int, IList<UserMember>>();
  159.                     //nextact.Add(0, userlists.FirstOrDefault());
  160.                     //assignCtx.NextActHandler = nextact;
  161.                 }
  162.                 IOperationResult result = new OperationResult
  163.                 {
  164.                     IsSuccess = false
  165.                 };


  166.                 result = AssignmentServiceHelper.SubmitApprovalItem(this.KDContext.Session.AppContext, assignCtx);
  167.                 return result.IsSuccess.ToString();
  168.             }
  169.         }

  170.     }
  171. }
复制代码

审批通过调用代码:

  1. string update_result = InvokeHelper.AbstractWebApiBusinessService("Unicre.wx.ApiServices.WorkFlow.WorkFlowService.ApproveBillByAssignId,Unicre.wx.ApiServices", new List<object> { assignid, disposition });
  2.             {

  3.                 Log.writeLog("审批通过:" + pKValue + "\r\n返回结果:" + update_result.ToString());

  4.             }
复制代码

审批驳回调用代码:

  1. string update_result = InvokeHelper.AbstractWebApiBusinessService("Unicre.wx.ApiServices.WorkFlow.WorkFlowService.RejectBillByAssignId,Unicre.wx.ApiServices", new List<object> { assignid, disposition,false,"驳回重审" });
  2.             {

  3.                 Log.writeLog("审批驳回:" + pKValue + "\r\n返回结果:" + update_result.ToString());

  4.             }
复制代码

哪位大神救救急啊~~~~~