SheetSubmitPane.cs
上传用户:li2971742
上传日期:2021-11-18
资源大小:39096k
文件大小:12k
源码类别:

OA系统

开发平台:

C#

  1. using System;
  2. using System.Web.UI;
  3. using System.Web.UI.WebControls;
  4. using System.ComponentModel;
  5. namespace OThinker.H3.WorkSheet
  6. {
  7.     /// <summary>
  8.     /// Summary description for SheetWorkItemActionPane.
  9.     /// </summary>
  10.     [DefaultProperty("Text"), ToolboxData("<{0}:SheetSubmitPane runat=server></{0}:SheetSubmitPane>")]
  11.     public class SheetSubmitPane : System.Web.UI.WebControls.WebControl
  12.     {
  13.         #region 获得参数信息
  14.         // 当前的任务
  15.         private OThinker.H3.WorkItem.WorkItem CurrentWorkItem
  16.         {
  17.             get
  18.             {
  19.                 return this.SheetPage.CurrentWorkItem;
  20.             }
  21.         }
  22.         private string DestActivityName;
  23.         // 目标任务
  24.         private OThinker.H3.Workflow.Activity DestActivity
  25.         {
  26.             get
  27.             {
  28.                 return this.SheetPage.Workflow.GetActivity(this.DestActivityName);
  29.             }
  30.         }
  31.         private bool Approval
  32.         {
  33.             get
  34.             {
  35.                 return this.SheetPage.Approval;
  36.             }
  37.         }
  38.         #endregion
  39.         #region 流程数据集
  40.         // 准备数据集
  41.         protected Data.InstanceData InstanceData
  42.         {
  43.             get
  44.             {
  45.                 return this.SheetPage.InstanceData;
  46.             }
  47.         }
  48.         private string[] GetOptionalParticipants()
  49.         {
  50.             // 获得后续的参与者
  51.             string originator = OThinker.H3.Server.Engine.InstancePool.GetInstanceOriginator(this.CurrentWorkItem.InstanceID);
  52.             return this.DestActivity.GetOptionalParticipants(
  53.                         this.SheetPage.Organization,
  54.                         originator,
  55.                         this.CurrentWorkItem.InstanceID,
  56.                         this.SheetPage.WorkItemManager,
  57.                         this.InstanceData);
  58.         }
  59.         #endregion
  60.         public SheetPage SheetPage
  61.         {
  62.             get
  63.             {
  64.                 return (WorkSheet.SheetPage)this.Page;
  65.             }
  66.         }
  67.         private RadioButtonList ReceiverSelector = new RadioButtonList();
  68.         private CheckBoxList ReceiversSelector = new CheckBoxList();
  69.         private LinkButton Submit = new LinkButton();
  70.         /// <summary>
  71.         /// 
  72.         /// </summary>
  73.         /// <param name="Job">用户任务</param>
  74.         /// <param name="Workflow">该用户任务对应的流程</param>
  75.         /// <param name="Submit">提交事件</param>
  76.         public SheetSubmitPane()
  77.         {
  78.             this.Submit.Text = "确定";
  79.             this.Controls.Add(this.Submit);
  80.             this.Submit.Click += new EventHandler(btnSubmit_Click);
  81.             this.Controls.Add(this.ReceiverSelector);
  82.             this.Controls.Add(this.ReceiversSelector);
  83.         }
  84.         private string Description;
  85.         public void Initialize(SheetPage SheetPage, string DestActivityName, string Description)
  86.         {
  87.             this.DestActivityName = DestActivityName;
  88.             this.Description = Description;
  89.             if (this.DestActivity == null)
  90.             {
  91.                 this.btnSubmit_Click(null, null);
  92.             }
  93.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.NoneParticipant)
  94.             {
  95.                 this.btnSubmit_Click(null, null);
  96.             }
  97.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.SingleParticipant)
  98.             {
  99.                 string[] participants = this.GetOptionalParticipants();
  100.                 if (participants == null || participants.Length == 0)
  101.                 {
  102.                     this.SheetPage.NotifyMessage("该任务设计有问题,没有可选择的处理人");
  103.                 }
  104.                 else
  105.                 {
  106.                     int optionalReceiverCount = 0;
  107.                     foreach (string receiver in participants)
  108.                     {
  109.                         if (receiver != null && receiver != "")
  110.                         {
  111.                             string receiverName = this.SheetPage.Organization.GetFullName(receiver);
  112.                             this.ReceiverSelector.Items.Add(receiverName);
  113.                             optionalReceiverCount++;
  114.                         }
  115.                     }
  116.                     this.ReceiverSelector.SelectedIndex = 0;
  117.                     this.ReceiverSelector.Visible = true;
  118.                     if (optionalReceiverCount == 1)
  119.                     {
  120.                         this.btnSubmit_Click(null, null);
  121.                     }
  122.                 }
  123.             }
  124.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.MultiParticipants)
  125.             {
  126.                 string[] participants = this.GetOptionalParticipants();
  127.                 if (participants == null || participants.Length == 0)
  128.                 {
  129.                     this.SheetPage.NotifyMessage("该任务设计有问题,没有可选择的处理人");
  130.                 }
  131.                 else
  132.                 {
  133.                     int optionalReceiverCount = 0;
  134.                     foreach (string receiver in participants)
  135.                     {
  136.                         if (receiver != null && receiver != "")
  137.                         {
  138.                             string receiverName = OThinker.H3.Server.Engine.Organization.GetFullName(receiver);
  139.                             this.ReceiversSelector.Items.Add(receiverName);
  140.                             optionalReceiverCount++;
  141.                         }
  142.                     }
  143.                     this.ReceiversSelector.SelectedIndex = 0;
  144.                     this.ReceiversSelector.Visible = true;
  145.                     if (optionalReceiverCount == 1)
  146.                     {
  147.                         this.btnSubmit_Click(null, null);
  148.                     }
  149.                 }
  150.             }
  151.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.AllParticipants)
  152.             {
  153.                 this.btnSubmit_Click(null, null);
  154.             }
  155.             else
  156.             {
  157.                 throw new NotImplementedException();
  158.             }
  159.         }
  160.         protected void btnSubmit_Click(object sender, System.EventArgs e)
  161.         {
  162.             OThinker.H3.Server.Engine.WorkItemManager.FinishWorkItem(this.CurrentWorkItem.WorkItemID, this.SheetPage.UserValidator.UserID, this.Approval);
  163.             // 准备触发后面Activity的消息
  164.             OThinker.H3.Messages.ActivateActivityMessage activateMessage;
  165.             string[] participants = null;
  166.             // 设置Session的工作项的状态
  167.             this.CurrentWorkItem.State = OThinker.H3.WorkItem.WorkItemState.Finished;
  168.             // 设置操作描述
  169.             string description = System.Web.HttpUtility.UrlDecode(this.Description);
  170.             OThinker.H3.Server.Engine.TokenPool.AppendDescription(this.CurrentWorkItem.InstanceID, this.CurrentWorkItem.TokenID, description);
  171.             if (this.DestActivity == null)
  172.             {
  173.                 // 采用自动路由的方式
  174.                 this.AutoRoute();
  175.             }
  176.             else
  177.             {
  178.                 // 触发后面的Activity
  179.                 participants = this.GetSelectedParticipants();
  180.                 activateMessage
  181.                     = new OThinker.H3.Messages.ActivateActivityMessage(
  182.                     OThinker.H3.Messages.MessageEmergencyType.Normal,
  183.                     this.CurrentWorkItem.InstanceID,
  184.                     this.DestActivity.Name,
  185.                     OThinker.H3.Instance.Token.UnspecifiedID,
  186.                     participants,
  187.                     new long[] { this.CurrentWorkItem.TokenID },
  188.                     null);
  189.                 OThinker.H3.Server.Engine.InstanceMessageSink.Notify(activateMessage);
  190.                 // 通知该Activity已经完成
  191.                 OThinker.H3.Messages.AsyncEndMessage endMessage =
  192.                     new OThinker.H3.Messages.AsyncEndMessage(
  193.                         OThinker.H3.Messages.MessageEmergencyType.Normal,
  194.                         this.CurrentWorkItem.InstanceID,
  195.                         this.CurrentWorkItem.ActivityName,
  196.                         this.CurrentWorkItem.ActivityEventType,
  197.                         this.CurrentWorkItem.ReplyID,
  198.                         false,
  199.                         null);
  200.                 OThinker.H3.Server.Engine.InstanceMessageSink.Notify(endMessage);
  201.             }
  202.             this.SheetPage.NotifyMessage("任务已完成");
  203.         }
  204.         private void AutoRoute()
  205.         {
  206.             // 需要通知实例事件管理器结束事件
  207.             Messages.AsyncEndMessage endMessage;
  208.             if (this.Approval)
  209.             {
  210.                 endMessage = new OThinker.H3.Messages.ApprovedMessage(
  211.                     Messages.MessageEmergencyType.Normal,
  212.                     this.CurrentWorkItem.InstanceID,
  213.                     this.CurrentWorkItem.ActivityName,
  214.                     this.CurrentWorkItem.ActivityEventType,
  215.                     this.CurrentWorkItem.ReplyID,
  216.                     true,
  217.                     this.SheetPage.UserValidator.UserID,
  218.                     true);
  219.             }
  220.             else
  221.             {
  222.                 endMessage
  223.                     = new OThinker.H3.Messages.AsyncEndMessage(
  224.                     Messages.MessageEmergencyType.Normal,
  225.                     this.CurrentWorkItem.InstanceID,
  226.                     this.CurrentWorkItem.ActivityName,
  227.                     this.CurrentWorkItem.ActivityEventType,
  228.                     this.CurrentWorkItem.ReplyID,
  229.                     true,
  230.                     null);
  231.             }
  232.             OThinker.H3.Server.Engine.InstanceMessageSink.Notify(endMessage);
  233.         }
  234.         private string[] GetSelectedParticipants()
  235.         {
  236.             // 参与者
  237.             string[] participants;
  238.             if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.NoneParticipant)
  239.             {
  240.                 // 参与人为空
  241.                 participants = new string[0];
  242.             }
  243.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.SingleParticipant)
  244.             {
  245.                 // 选中的参与人
  246.                 string receiver = this.ReceiverSelector.SelectedValue;
  247.                 int startIndex = receiver.LastIndexOf("[");
  248.                 int endIndex = receiver.LastIndexOf("]");
  249.                 string principalName = receiver.Substring(startIndex + 1, endIndex - startIndex - 1);
  250.                 participants = new string[] { principalName };
  251.             }
  252.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.MultiParticipants)
  253.             {
  254.                 System.Collections.ArrayList selectedReceivers = new System.Collections.ArrayList();
  255.                 foreach (System.Web.UI.WebControls.ListItem item in this.ReceiversSelector.Items)
  256.                 {
  257.                     if (item.Selected)
  258.                     {
  259.                         string receiver = item.Text;
  260.                         int startIndex = receiver.LastIndexOf("[");
  261.                         int endIndex = receiver.LastIndexOf("]");
  262.                         string principalName = receiver.Substring(startIndex + 1, endIndex - startIndex - 1);
  263.                         selectedReceivers.Add(principalName);
  264.                     }
  265.                 }
  266.                 // 获得可选择的接收者
  267.                 string[] receivers = new string[selectedReceivers.Count];
  268.                 for (int count = 0; count < receivers.Length; count++)
  269.                 {
  270.                     receivers[count] = (string)selectedReceivers[count];
  271.                 }
  272.                 // 选中的参与人
  273.                 participants = receivers;
  274.             }
  275.             else if (this.DestActivity.ParticipateType == OThinker.H3.Workflow.ActivityParticipateType.AllParticipants)
  276.             {
  277.                 participants = this.GetOptionalParticipants();
  278.             }
  279.             else
  280.             {
  281.                 throw new NotImplementedException();
  282.             }
  283.             return participants;
  284.         }
  285.     }
  286. }