RoadFlow2.1 临时演示

WorkFlowTask.cs 86KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace RoadFlow.Platform
  6. {
  7. public class WorkFlowTask : IEqualityComparer<RoadFlow.Data.Model.WorkFlowTask>
  8. {
  9. private WorkFlow bWorkFlow = new WorkFlow();
  10. private RoadFlow.Data.Interface.IWorkFlowTask dataWorkFlowTask;
  11. private RoadFlow.Data.Model.WorkFlowInstalled wfInstalled;
  12. private RoadFlow.Data.Model.WorkFlowExecute.Result result;
  13. private List<RoadFlow.Data.Model.WorkFlowTask> nextTasks = new List<RoadFlow.Data.Model.WorkFlowTask>();
  14. public WorkFlowTask()
  15. {
  16. this.dataWorkFlowTask = Data.Factory.Factory.GetWorkFlowTask();
  17. }
  18. /// <summary>
  19. /// 新增
  20. /// </summary>
  21. public int Add(RoadFlow.Data.Model.WorkFlowTask model)
  22. {
  23. return dataWorkFlowTask.Add(model);
  24. }
  25. /// <summary>
  26. /// 更新
  27. /// </summary>
  28. public int Update(RoadFlow.Data.Model.WorkFlowTask model)
  29. {
  30. return dataWorkFlowTask.Update(model);
  31. }
  32. /// <summary>
  33. /// 查询所有记录
  34. /// </summary>
  35. public List<RoadFlow.Data.Model.WorkFlowTask> GetAll()
  36. {
  37. return dataWorkFlowTask.GetAll();
  38. }
  39. /// <summary>
  40. /// 查询单条记录
  41. /// </summary>
  42. public RoadFlow.Data.Model.WorkFlowTask Get(Guid id)
  43. {
  44. return dataWorkFlowTask.Get(id);
  45. }
  46. /// <summary>
  47. /// 删除
  48. /// </summary>
  49. public int Delete(Guid id)
  50. {
  51. return dataWorkFlowTask.Delete(id);
  52. }
  53. /// <summary>
  54. /// 查询记录条数
  55. /// </summary>
  56. public long GetCount()
  57. {
  58. return dataWorkFlowTask.GetCount();
  59. }
  60. /// <summary>
  61. /// 去除重复的接收人,在退回任务时去重,避免一个人收到多条任务。
  62. /// </summary>
  63. /// <param name="task1"></param>
  64. /// <param name="task2"></param>
  65. /// <returns></returns>
  66. public bool Equals(RoadFlow.Data.Model.WorkFlowTask task1, RoadFlow.Data.Model.WorkFlowTask task2)
  67. {
  68. return task1.ReceiveID == task2.ReceiveID;
  69. }
  70. public int GetHashCode(RoadFlow.Data.Model.WorkFlowTask task)
  71. {
  72. return task.ToString().GetHashCode();
  73. }
  74. /// <summary>
  75. /// 更新打开时间
  76. /// </summary>
  77. /// <param name="id"></param>
  78. /// <param name="openTime"></param>
  79. /// <param name="isStatus">是否将状态更新为1</param>
  80. public void UpdateOpenTime(Guid id, DateTime openTime, bool isStatus = false)
  81. {
  82. dataWorkFlowTask.UpdateOpenTime(id, openTime, isStatus);
  83. }
  84. /// <summary>
  85. /// 得到一个流程实例的发起者
  86. /// </summary>
  87. /// <param name="flowID"></param>
  88. /// <param name="groupID"></param>
  89. /// <param name="isDefault">如果为空是否返回当前登录用户ID</param>
  90. /// <returns></returns>
  91. public Guid GetFirstSnderID(Guid flowID, Guid groupID, bool isDefault = false)
  92. {
  93. Guid senderID=dataWorkFlowTask.GetFirstSnderID(flowID, groupID);
  94. return senderID.IsEmptyGuid() && isDefault ? Users.CurrentUserID : senderID;
  95. }
  96. /// <summary>
  97. /// 得到一个流程实例的发起者部门
  98. /// </summary>
  99. /// <param name="flowID"></param>
  100. /// <param name="groupID"></param>
  101. /// <returns></returns>
  102. public Guid GetFirstSnderDeptID(Guid flowID, Guid groupID)
  103. {
  104. if (flowID.IsEmptyGuid() || groupID.IsEmptyGuid())
  105. {
  106. return Users.CurrentDeptID;
  107. }
  108. var senderID = dataWorkFlowTask.GetFirstSnderID(flowID, groupID);
  109. var dept = new Users().GetDeptByUserID(senderID);
  110. return dept == null ? Guid.Empty : dept.ID;
  111. }
  112. /// <summary>
  113. /// 得到一个流程实例一个步骤的处理者
  114. /// </summary>
  115. /// <param name="flowID"></param>
  116. /// <param name="groupID"></param>
  117. /// <returns></returns>
  118. public List<Guid> GetStepSnderID(Guid flowID, Guid stepID, Guid groupID)
  119. {
  120. return dataWorkFlowTask.GetStepSnderID(flowID, stepID, groupID);
  121. }
  122. /// <summary>
  123. /// 得到一个流程实例一个步骤的处理者字符串
  124. /// </summary>
  125. /// <param name="flowID"></param>
  126. /// <param name="stepID"></param>
  127. /// <param name="groupID"></param>
  128. /// <returns></returns>
  129. public string GetStepSnderIDString(Guid flowID, Guid stepID, Guid groupID)
  130. {
  131. var list = GetStepSnderID(flowID, stepID, groupID);
  132. StringBuilder sb = new StringBuilder(list.Count * 43);
  133. foreach (var li in list)
  134. {
  135. sb.Append(RoadFlow.Platform.Users.PREFIX);
  136. sb.Append(li);
  137. sb.Append(",");
  138. }
  139. return sb.ToString().TrimEnd(',');
  140. }
  141. /// <summary>
  142. /// 得到一个流程实例前一步骤的处理者
  143. /// </summary>
  144. /// <param name="flowID"></param>
  145. /// <param name="groupID"></param>
  146. /// <returns></returns>
  147. public List<Guid> GetPrevSnderID(Guid flowID, Guid stepID, Guid groupID)
  148. {
  149. return dataWorkFlowTask.GetPrevSnderID(flowID, stepID, groupID);
  150. }
  151. /// <summary>
  152. /// 得到一个流程实例前一步骤的处理者
  153. /// </summary>
  154. /// <param name="flowID"></param>
  155. /// <param name="groupID"></param>
  156. /// <returns></returns>
  157. public String GetPrevSnderIDString(Guid flowID, Guid stepID, Guid groupID)
  158. {
  159. var list = dataWorkFlowTask.GetPrevSnderID(flowID, stepID, groupID);
  160. StringBuilder sb = new StringBuilder(list.Count * 43);
  161. foreach (var li in list)
  162. {
  163. sb.Append(RoadFlow.Platform.Users.PREFIX);
  164. sb.Append(li);
  165. sb.Append(",");
  166. }
  167. return sb.ToString().TrimEnd(',');
  168. }
  169. /// <summary>
  170. /// 将json字符串转换为执行实体
  171. /// </summary>
  172. /// <param name="jsonString"></param>
  173. /// <returns></returns>
  174. private RoadFlow.Data.Model.WorkFlowExecute.Execute GetExecuteModel(string jsonString)
  175. {
  176. RoadFlow.Data.Model.WorkFlowExecute.Execute execute = new RoadFlow.Data.Model.WorkFlowExecute.Execute();
  177. RoadFlow.Platform.Organize borganize = new Organize();
  178. LitJson.JsonData jsondata = LitJson.JsonMapper.ToObject(jsonString);
  179. if (jsondata == null) return execute;
  180. execute.Comment = jsondata["comment"].ToString();
  181. string op = jsondata["type"].ToString().ToLower();
  182. switch (op)
  183. {
  184. case "submit":
  185. execute.ExecuteType = RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Submit;
  186. break;
  187. case "save":
  188. execute.ExecuteType = RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Save;
  189. break;
  190. case "back":
  191. execute.ExecuteType = RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Back;
  192. break;
  193. }
  194. execute.FlowID = jsondata["flowid"].ToString().ToGuid();
  195. execute.GroupID = jsondata["groupid"].ToString().ToGuid();
  196. execute.InstanceID = jsondata["instanceid"].ToString();
  197. execute.IsSign = jsondata["issign"].ToString().ToInt() == 1;
  198. execute.StepID = jsondata["stepid"].ToString().ToGuid();
  199. execute.TaskID = jsondata["taskid"].ToString().ToGuid();
  200. var stepsjson = jsondata["steps"];
  201. Dictionary<Guid, List<RoadFlow.Data.Model.Users>> steps = new Dictionary<Guid, List<RoadFlow.Data.Model.Users>>();
  202. if (stepsjson.IsArray)
  203. {
  204. foreach (LitJson.JsonData step in stepsjson)
  205. {
  206. var id = step["id"].ToString().ToGuid();
  207. var member = step["member"].ToString();
  208. if (id == Guid.Empty || member.IsNullOrEmpty())
  209. {
  210. continue;
  211. }
  212. steps.Add(id, borganize.GetAllUsers(member));
  213. }
  214. }
  215. execute.Steps = steps;
  216. return execute;
  217. }
  218. /// <summary>
  219. /// 处理流程
  220. /// </summary>
  221. /// <param name="jsonString"></param>
  222. /// <returns></returns>
  223. public RoadFlow.Data.Model.WorkFlowExecute.Result Execute(string jsonString)
  224. {
  225. return Execute(GetExecuteModel(jsonString));
  226. }
  227. /// <summary>
  228. /// 发起一个流程
  229. /// </summary>
  230. /// <param name="flowID"></param>
  231. /// <param name="users"></param>
  232. /// <param name="instanceID"></param>
  233. /// <returns></returns>
  234. public bool StartFlow(Guid flowID, List<Data.Model.Users> users, string title, string instanceID="")
  235. {
  236. if (users.Count == 0)
  237. {
  238. return false;
  239. }
  240. try
  241. {
  242. foreach (var user in users)
  243. {
  244. RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel = new Data.Model.WorkFlowExecute.Execute();
  245. executeModel.ExecuteType = Data.Model.WorkFlowExecute.EnumType.ExecuteType.Save;
  246. executeModel.FlowID = flowID;
  247. executeModel.InstanceID = instanceID;
  248. executeModel.Title = title;
  249. executeModel.Sender = user;
  250. createFirstTask(executeModel);
  251. }
  252. return true;
  253. }
  254. catch (Exception err)
  255. {
  256. Platform.Log.Add(err);
  257. return false;
  258. }
  259. }
  260. /// <summary>
  261. /// 处理流程
  262. /// </summary>
  263. /// <param name="executeModel">处理实体</param>
  264. /// <returns></returns>
  265. public RoadFlow.Data.Model.WorkFlowExecute.Result Execute(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel)
  266. {
  267. result = new RoadFlow.Data.Model.WorkFlowExecute.Result();
  268. nextTasks = new List<RoadFlow.Data.Model.WorkFlowTask>();
  269. if (executeModel.FlowID == Guid.Empty)
  270. {
  271. result.DebugMessages = "流程ID错误";
  272. result.IsSuccess = false;
  273. result.Messages = "执行参数错误";
  274. return result;
  275. }
  276. wfInstalled = bWorkFlow.GetWorkFlowRunModel(executeModel.FlowID);
  277. if (wfInstalled == null)
  278. {
  279. result.DebugMessages = "未找到流程运行时实体";
  280. result.IsSuccess = false;
  281. result.Messages = "流程运行时为空";
  282. return result;
  283. }
  284. lock (executeModel.GroupID.ToString())
  285. {
  286. switch (executeModel.ExecuteType)
  287. {
  288. case RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Back:
  289. executeBack(executeModel);
  290. break;
  291. //case RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Completed:
  292. // executeComplete(executeModel);
  293. // break;
  294. case RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Save:
  295. executeSave(executeModel);
  296. break;
  297. case RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Submit:
  298. case RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Completed:
  299. executeSubmit(executeModel);
  300. break;
  301. case RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Redirect:
  302. executeRedirect(executeModel);
  303. break;
  304. default:
  305. result.DebugMessages = "流程处理类型为空";
  306. result.IsSuccess = false;
  307. result.Messages = "流程处理类型为空";
  308. return result;
  309. }
  310. result.NextTasks = nextTasks;
  311. return result;
  312. }
  313. }
  314. private void executeSubmit(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel)
  315. {
  316. using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
  317. {
  318. //如果是第一步提交并且没有实例则先创建实例
  319. RoadFlow.Data.Model.WorkFlowTask currentTask = null;
  320. bool isFirst = executeModel.StepID == wfInstalled.FirstStepID && executeModel.TaskID == Guid.Empty && executeModel.GroupID == Guid.Empty;
  321. if (isFirst)
  322. {
  323. currentTask = createFirstTask(executeModel);
  324. }
  325. else
  326. {
  327. currentTask = Get(executeModel.TaskID);
  328. }
  329. if (currentTask == null)
  330. {
  331. result.DebugMessages = "未能创建或找到当前任务";
  332. result.IsSuccess = false;
  333. result.Messages = "未能创建或找到当前任务";
  334. return;
  335. }
  336. else if (currentTask.Status.In(2,3,4,5))
  337. {
  338. result.DebugMessages = "当前任务已处理";
  339. result.IsSuccess = false;
  340. result.Messages = "当前任务已处理";
  341. return;
  342. }
  343. var currentSteps = wfInstalled.Steps.Where(p => p.ID == executeModel.StepID);
  344. var currentStep = currentSteps.Count() > 0 ? currentSteps.First() : null;
  345. if (currentStep == null)
  346. {
  347. result.DebugMessages = "未找到当前步骤";
  348. result.IsSuccess = false;
  349. result.Messages = "未找到当前步骤";
  350. return;
  351. }
  352. //如果当前步骤是子流程步骤,并且策略是 子流程完成后才能提交 则要判断子流程是否已完成
  353. if (currentStep.Type == "subflow"
  354. && currentStep.SubFlowID.IsGuid()
  355. && currentStep.Behavior.SubFlowStrategy == 0
  356. && currentTask.SubFlowGroupID.HasValue
  357. && !currentTask.SubFlowGroupID.Value.IsEmptyGuid()
  358. && !GetInstanceIsCompleted(currentStep.SubFlowID.ToGuid(), currentTask.SubFlowGroupID.Value))
  359. {
  360. result.DebugMessages = "当前步骤的子流程实例未完成,子流程:" + currentStep.SubFlowID + ",实例组:" + currentTask.SubFlowGroupID.ToString();
  361. result.IsSuccess = false;
  362. result.Messages = "当前步骤的子流程未完成,不能提交!";
  363. return;
  364. }
  365. //如果是完成任务或者没有后续处理步骤,则完成任务
  366. if (executeModel.ExecuteType == Data.Model.WorkFlowExecute.EnumType.ExecuteType.Completed
  367. || executeModel.Steps == null || executeModel.Steps.Count == 0)
  368. {
  369. executeComplete(executeModel);
  370. scope.Complete();
  371. return;
  372. }
  373. int status = 0;
  374. #region 处理策略判断
  375. if (currentTask.StepID != wfInstalled.FirstStepID)//第一步不判断策略
  376. {
  377. switch (currentStep.Behavior.HanlderModel)
  378. {
  379. case 0://所有人必须处理
  380. var taskList = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort && p.Type != 5);
  381. if (taskList.Count > 1)
  382. {
  383. var noCompleted = taskList.Where(p => p.Status != 2);
  384. if (noCompleted.Count() - 1 > 0)
  385. {
  386. status = -1;
  387. }
  388. }
  389. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign);
  390. break;
  391. case 1://一人同意即可
  392. var taskList1 = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort && p.Type != 5);
  393. foreach (var task in taskList1)
  394. {
  395. if (task.ID != currentTask.ID)
  396. {
  397. if (task.Status.In(0, 1))
  398. {
  399. Completed(task.ID, "", false, 4);
  400. }
  401. }
  402. else
  403. {
  404. Completed(task.ID, executeModel.Comment, executeModel.IsSign);
  405. }
  406. }
  407. break;
  408. case 2://依据人数比例
  409. var taskList2 = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort && p.Type != 5);
  410. if (taskList2.Count > 1)
  411. {
  412. decimal percentage = currentStep.Behavior.Percentage <= 0 ? 100 : currentStep.Behavior.Percentage;//比例
  413. if ((((decimal)(taskList2.Where(p => p.Status == 2).Count() + 1) / (decimal)taskList2.Count) * 100).Round() < percentage)
  414. {
  415. status = -1;
  416. }
  417. else
  418. {
  419. foreach (var task in taskList2)
  420. {
  421. if (task.ID != currentTask.ID && task.Status.In(0, 1))
  422. {
  423. Completed(task.ID, "", false, 4);
  424. }
  425. }
  426. }
  427. }
  428. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign);
  429. break;
  430. case 3://独立处理
  431. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign);
  432. break;
  433. }
  434. }
  435. else
  436. {
  437. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign);
  438. }
  439. #endregion
  440. //如果条件不满足则创建一个状态为-1的后续任务,等条件满足后才修改状态,待办人员才能看到任务。
  441. if (status == -1)
  442. {
  443. var tempTasks = createTempTasks(executeModel, currentTask);
  444. List<string> nextStepName = new List<string>();
  445. foreach (var nstep in tempTasks)
  446. {
  447. nextStepName.Add(nstep.StepName);
  448. }
  449. nextTasks.AddRange(tempTasks);
  450. string stepName = nextStepName.Distinct().ToArray().Join1(",");
  451. result.DebugMessages += string.Format("已发送到:{0},其他人未处理,不创建后续任务", stepName);
  452. result.IsSuccess = true;
  453. result.Messages += string.Format("已发送到:{0},等待他人处理!", stepName);
  454. result.NextTasks = nextTasks;
  455. scope.Complete();
  456. return;
  457. }
  458. foreach (var step in executeModel.Steps)
  459. {
  460. foreach (var user in step.Value)
  461. {
  462. if (wfInstalled == null) //子流程有多个人员时此处会为空,所以判断并重新获取
  463. {
  464. wfInstalled = bWorkFlow.GetWorkFlowRunModel(executeModel.FlowID);
  465. }
  466. var nextSteps = wfInstalled.Steps.Where(p => p.ID == step.Key);
  467. if (nextSteps.Count() == 0)
  468. {
  469. continue;
  470. }
  471. var nextStep = nextSteps.First();
  472. bool isPassing = 0 == nextStep.Behavior.Countersignature;
  473. #region 如果下一步骤为会签,则要检查当前步骤的平级步骤是否已处理
  474. if (0 != nextStep.Behavior.Countersignature)
  475. {
  476. var prevSteps = bWorkFlow.GetPrevSteps(executeModel.FlowID, nextStep.ID);
  477. switch (nextStep.Behavior.Countersignature)
  478. {
  479. case 1://所有步骤同意
  480. isPassing = true;
  481. foreach (var prevStep in prevSteps)
  482. {
  483. if (!IsPassing(prevStep, executeModel.FlowID, executeModel.GroupID, currentTask.PrevID, currentTask.Sort))
  484. {
  485. isPassing = false;
  486. break;
  487. }
  488. }
  489. break;
  490. case 2://一个步骤同意即可
  491. isPassing = false;
  492. foreach (var prevStep in prevSteps)
  493. {
  494. if (IsPassing(prevStep, executeModel.FlowID, executeModel.GroupID, currentTask.PrevID, currentTask.Sort))
  495. {
  496. isPassing = true;
  497. break;
  498. }
  499. }
  500. break;
  501. case 3://依据比例
  502. int passCount = 0;
  503. foreach (var prevStep in prevSteps)
  504. {
  505. if (IsPassing(prevStep, executeModel.FlowID, executeModel.GroupID, currentTask.PrevID, currentTask.Sort))
  506. {
  507. passCount++;
  508. }
  509. }
  510. isPassing = (((decimal)passCount / (decimal)prevSteps.Count) * 100).Round() >= (nextStep.Behavior.CountersignaturePercentage <= 0 ? 100 : nextStep.Behavior.CountersignaturePercentage);
  511. break;
  512. }
  513. if (isPassing)
  514. {
  515. var tjTasks = GetTaskList(currentTask.ID, false);
  516. foreach (var tjTask in tjTasks)
  517. {
  518. if (tjTask.ID == currentTask.ID || tjTask.Status.In(2, 3, 4, 5))
  519. {
  520. continue;
  521. }
  522. Completed(tjTask.ID, "", false, 4);
  523. }
  524. }
  525. }
  526. #endregion
  527. if (isPassing)
  528. {
  529. RoadFlow.Data.Model.WorkFlowTask task = new RoadFlow.Data.Model.WorkFlowTask();
  530. if (nextStep.WorkTime > 0)
  531. {
  532. task.CompletedTime = RoadFlow.Utility.DateTimeNew.Now.AddHours((double)nextStep.WorkTime);
  533. }
  534. task.FlowID = executeModel.FlowID;
  535. task.GroupID = currentTask != null ? currentTask.GroupID : executeModel.GroupID;
  536. task.ID = Guid.NewGuid();
  537. task.Type = 0;
  538. task.InstanceID = executeModel.InstanceID;
  539. if (!executeModel.Note.IsNullOrEmpty())
  540. {
  541. task.Note = executeModel.Note;
  542. }
  543. task.PrevID = currentTask.ID;
  544. task.PrevStepID = currentTask.StepID;
  545. task.ReceiveID = user.ID;
  546. task.ReceiveName = user.Name;
  547. task.ReceiveTime = RoadFlow.Utility.DateTimeNew.Now;
  548. task.SenderID = executeModel.Sender.ID;
  549. task.SenderName = executeModel.Sender.Name;
  550. task.SenderTime = task.ReceiveTime;
  551. task.Status = status;
  552. task.StepID = step.Key;
  553. task.StepName = nextStep.Name;
  554. task.Sort = currentTask.Sort + 1;
  555. task.Title = executeModel.Title.IsNullOrEmpty() ? currentTask.Title : executeModel.Title;
  556. #region 如果当前步骤是子流程步骤,则要发起子流程实例
  557. if (nextStep.Type == "subflow" && nextStep.SubFlowID.IsGuid())
  558. {
  559. RoadFlow.Data.Model.WorkFlowExecute.Execute subflowExecuteModel = new RoadFlow.Data.Model.WorkFlowExecute.Execute();
  560. if (!nextStep.Event.SubFlowActivationBefore.IsNullOrEmpty())
  561. {
  562. object obj = ExecuteFlowCustomEvent(nextStep.Event.SubFlowActivationBefore.Trim(),
  563. new RoadFlow.Data.Model.WorkFlowCustomEventParams()
  564. {
  565. FlowID = executeModel.FlowID,
  566. GroupID = currentTask.GroupID,
  567. InstanceID = currentTask.InstanceID,
  568. StepID = executeModel.StepID,
  569. TaskID = currentTask.ID
  570. });
  571. if (obj is RoadFlow.Data.Model.WorkFlowExecute.Execute)
  572. {
  573. subflowExecuteModel = obj as RoadFlow.Data.Model.WorkFlowExecute.Execute;
  574. }
  575. }
  576. subflowExecuteModel.ExecuteType = RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Save;
  577. subflowExecuteModel.FlowID = nextStep.SubFlowID.ToGuid();
  578. subflowExecuteModel.Sender = user;
  579. if (subflowExecuteModel.Title.IsNullOrEmpty())
  580. {
  581. subflowExecuteModel.Title = bWorkFlow.GetFlowName(subflowExecuteModel.FlowID);
  582. }
  583. if (subflowExecuteModel.InstanceID.IsNullOrEmpty())
  584. {
  585. subflowExecuteModel.InstanceID = "";
  586. }
  587. var subflowTask = createFirstTask(subflowExecuteModel, true);
  588. task.SubFlowGroupID = subflowTask.GroupID;
  589. }
  590. #endregion
  591. if (!HasNoCompletedTasks(executeModel.FlowID, step.Key, currentTask.GroupID, user.ID))
  592. {
  593. Add(task);
  594. }
  595. nextTasks.Add(task);
  596. }
  597. }
  598. }
  599. if (nextTasks.Count > 0)
  600. {
  601. //激活临时任务
  602. dataWorkFlowTask.UpdateTempTasks(nextTasks.First().FlowID, nextTasks.First().StepID, nextTasks.First().GroupID,
  603. nextTasks.First().CompletedTime, nextTasks.First().ReceiveTime);
  604. #region 抄送
  605. if (wfInstalled == null)
  606. {
  607. wfInstalled = bWorkFlow.GetWorkFlowRunModel(executeModel.FlowID);
  608. }
  609. foreach (var step in executeModel.Steps)
  610. {
  611. var nextSteps = wfInstalled.Steps.Where(p => p.ID == step.Key);
  612. if (nextSteps.Count() > 0)
  613. {
  614. var nextStep = nextSteps.First();
  615. if (!nextStep.Behavior.CopyFor.IsNullOrEmpty())
  616. {
  617. var users = new Organize().GetAllUsers(nextStep.Behavior.CopyFor);
  618. foreach (var user in users)
  619. {
  620. RoadFlow.Data.Model.WorkFlowTask task = new RoadFlow.Data.Model.WorkFlowTask();
  621. if (nextStep.WorkTime > 0)
  622. {
  623. task.CompletedTime = RoadFlow.Utility.DateTimeNew.Now.AddHours((double)nextStep.WorkTime);
  624. }
  625. task.FlowID = executeModel.FlowID;
  626. task.GroupID = currentTask != null ? currentTask.GroupID : executeModel.GroupID;
  627. task.ID = Guid.NewGuid();
  628. task.Type = 5;
  629. task.InstanceID = executeModel.InstanceID;
  630. task.Note = executeModel.Note.IsNullOrEmpty() ? "抄送任务" : executeModel.Note + "(抄送任务)";
  631. task.PrevID = currentTask.ID;
  632. task.PrevStepID = currentTask.StepID;
  633. task.ReceiveID = user.ID;
  634. task.ReceiveName = user.Name;
  635. task.ReceiveTime = RoadFlow.Utility.DateTimeNew.Now;
  636. task.SenderID = executeModel.Sender.ID;
  637. task.SenderName = executeModel.Sender.Name;
  638. task.SenderTime = task.ReceiveTime;
  639. task.Status = status;
  640. task.StepID = step.Key;
  641. task.StepName = nextStep.Name;
  642. task.Sort = currentTask.Sort + 1;
  643. task.Title = executeModel.Title.IsNullOrEmpty() ? currentTask.Title : executeModel.Title;
  644. if (!HasNoCompletedTasks(executeModel.FlowID, step.Key, currentTask.GroupID, user.ID))
  645. {
  646. Add(task);
  647. }
  648. }
  649. }
  650. }
  651. }
  652. #endregion
  653. List<string> nextStepName = new List<string>();
  654. foreach (var nstep in nextTasks)
  655. {
  656. nextStepName.Add(nstep.StepName);
  657. }
  658. string stepName = nextStepName.Distinct().ToArray().Join1(",");
  659. result.DebugMessages += string.Format("已发送到:{0}", stepName);
  660. result.IsSuccess = true;
  661. result.Messages += string.Format("已发送到:{0}", stepName);
  662. result.NextTasks = nextTasks;
  663. }
  664. else
  665. {
  666. var tempTasks = createTempTasks(executeModel, currentTask);
  667. List<string> nextStepName = new List<string>();
  668. foreach (var nstep in tempTasks)
  669. {
  670. nextStepName.Add(nstep.StepName);
  671. }
  672. nextTasks.AddRange(tempTasks);
  673. string stepName = nextStepName.Distinct().ToArray().Join1(",");
  674. result.DebugMessages += string.Format("已发到:{0},等待其它步骤处理", stepName);
  675. result.IsSuccess = true;
  676. result.Messages += string.Format("已发送:{0},等待其它步骤处理", stepName);
  677. result.NextTasks = nextTasks;
  678. }
  679. scope.Complete();
  680. }
  681. }
  682. /// <summary>
  683. /// 退回任务
  684. /// </summary>
  685. /// <param name="executeModel"></param>
  686. private void executeBack(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel)
  687. {
  688. var currentTask = Get(executeModel.TaskID);
  689. if (currentTask == null)
  690. {
  691. result.DebugMessages = "未能找到当前任务";
  692. result.IsSuccess = false;
  693. result.Messages = "未能找到当前任务";
  694. return;
  695. }
  696. else if (currentTask.Status.In(2, 3, 4, 5))
  697. {
  698. result.DebugMessages = "当前任务已处理";
  699. result.IsSuccess = false;
  700. result.Messages = "当前任务已处理";
  701. return;
  702. }
  703. var currentSteps = wfInstalled.Steps.Where(p => p.ID == currentTask.StepID);
  704. var currentStep = currentSteps.Count() > 0 ? currentSteps.First() : null;
  705. if (currentStep == null)
  706. {
  707. result.DebugMessages = "未能找到当前步骤";
  708. result.IsSuccess = false;
  709. result.Messages = "未能找到当前步骤";
  710. return;
  711. }
  712. if (currentTask.StepID == wfInstalled.FirstStepID)
  713. {
  714. result.DebugMessages = "当前任务是流程第一步,不能退回";
  715. result.IsSuccess = false;
  716. result.Messages = "当前任务是流程第一步,不能退回";
  717. return;
  718. }
  719. if (executeModel.Steps.Count == 0)
  720. {
  721. result.DebugMessages = "没有选择要退回的步骤";
  722. result.IsSuccess = false;
  723. result.Messages = "没有选择要退回的步骤";
  724. return;
  725. }
  726. using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
  727. {
  728. List<RoadFlow.Data.Model.WorkFlowTask> backTasks = new List<RoadFlow.Data.Model.WorkFlowTask>();
  729. int status = 0;
  730. switch (currentStep.Behavior.BackModel)
  731. {
  732. case 0://不能退回
  733. result.DebugMessages = "当前步骤设置为不能退回";
  734. result.IsSuccess = false;
  735. result.Messages = "当前步骤设置为不能退回";
  736. return;
  737. #region 根据策略退回
  738. case 1:
  739. switch (currentStep.Behavior.HanlderModel)
  740. {
  741. case 0://所有人必须同意,如果一人不同意则全部退回
  742. var taskList = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort && p.Type != 5);
  743. foreach (var task in taskList)
  744. {
  745. if (task.ID != currentTask.ID)
  746. {
  747. if (task.Status.In(0, 1))
  748. {
  749. Completed(task.ID, "", false, 5);
  750. //backTasks.Add(task);
  751. }
  752. }
  753. else
  754. {
  755. Completed(task.ID, executeModel.Comment, executeModel.IsSign, 3);
  756. }
  757. }
  758. break;
  759. case 1://一人同意即可
  760. var taskList1 = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort && p.Type != 5);
  761. if (taskList1.Count > 1)
  762. {
  763. var noCompleted = taskList1.Where(p => p.Status != 3);
  764. if (noCompleted.Count() - 1 > 0)
  765. {
  766. status = -1;
  767. }
  768. }
  769. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign, 3);
  770. break;
  771. case 2://依据人数比例
  772. var taskList2 = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort && p.Type != 5);
  773. if (taskList2.Count > 1)
  774. {
  775. decimal percentage = currentStep.Behavior.Percentage <= 0 ? 100 : currentStep.Behavior.Percentage;//比例
  776. if ((((decimal)(taskList2.Where(p => p.Status == 3).Count() + 1) / (decimal)taskList2.Count) * 100).Round() < 100 - percentage)
  777. {
  778. status = -1;
  779. }
  780. else
  781. {
  782. foreach (var task in taskList2)
  783. {
  784. if (task.ID != currentTask.ID && task.Status.In(0, 1))
  785. {
  786. Completed(task.ID, "", false, 5);
  787. //backTasks.Add(task);
  788. }
  789. }
  790. }
  791. }
  792. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign, 3);
  793. break;
  794. case 3://独立处理
  795. Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign, 3);
  796. break;
  797. }
  798. backTasks.Add(currentTask);
  799. break;
  800. #endregion
  801. }
  802. if (status == -1)
  803. {
  804. result.DebugMessages += "已退回,等待他人处理";
  805. result.IsSuccess = true;
  806. result.Messages += "已退回,等待他人处理!";
  807. result.NextTasks = nextTasks;
  808. scope.Complete();
  809. return;
  810. }
  811. foreach (var backTask in backTasks)
  812. {
  813. if (backTask.Status.In(2, 3))//已完成的任务不能退回
  814. {
  815. continue;
  816. }
  817. if (backTask.ID == currentTask.ID)
  818. {
  819. Completed(backTask.ID, executeModel.Comment, executeModel.IsSign, 3);
  820. }
  821. else
  822. {
  823. Completed(backTask.ID, "", false, 3, "他人已退回");
  824. }
  825. }
  826. List<RoadFlow.Data.Model.WorkFlowTask> tasks = new List<RoadFlow.Data.Model.WorkFlowTask>();
  827. if (currentStep.Behavior.HanlderModel.In(0, 1, 2))//退回时要退回其它步骤发来的同级任务。
  828. {
  829. var tjTasks = GetTaskList(currentTask.FlowID, currentTask.StepID, currentTask.GroupID).FindAll(p => p.Sort == currentTask.Sort);
  830. foreach (var tjTask in tjTasks)
  831. {
  832. if (!executeModel.Steps.ContainsKey(tjTask.PrevStepID))
  833. {
  834. executeModel.Steps.Add(tjTask.PrevStepID, new List<Data.Model.Users>());
  835. }
  836. }
  837. }
  838. foreach (var step in executeModel.Steps)
  839. {
  840. var tasks1 = GetTaskList(executeModel.FlowID, step.Key, executeModel.GroupID);
  841. if (tasks1.Count > 0)
  842. {
  843. tasks1 = tasks1.OrderByDescending(p => p.Sort).ToList();
  844. int maxSort = tasks1.First().Sort;
  845. tasks.AddRange(tasks1.FindAll(p => p.Sort == maxSort));
  846. }
  847. }
  848. #region 处理会签形式的退回
  849. //当前步骤是否是会签步骤
  850. var countersignatureStep = bWorkFlow.GetNextSteps(executeModel.FlowID, executeModel.StepID).Find(p => p.Behavior.Countersignature != 0);
  851. bool IsCountersignature = countersignatureStep != null;
  852. bool isBack = true;
  853. if (IsCountersignature)
  854. {
  855. var steps = bWorkFlow.GetPrevSteps(executeModel.FlowID, countersignatureStep.ID);
  856. switch (countersignatureStep.Behavior.Countersignature)
  857. {
  858. case 1://所有步骤处理,如果一个步骤退回则退回
  859. isBack = false;
  860. foreach (var step in steps)
  861. {
  862. if (IsBack(step, executeModel.FlowID, currentTask.GroupID, currentTask.PrevID, currentTask.Sort))
  863. {
  864. isBack = true;
  865. break;
  866. }
  867. }
  868. break;
  869. case 2://一个步骤退回,如果有一个步骤同意,则不退回
  870. isBack = true;
  871. foreach (var step in steps)
  872. {
  873. if (!IsBack(step, executeModel.FlowID, currentTask.GroupID, currentTask.PrevID, currentTask.Sort))
  874. {
  875. isBack = false;
  876. break;
  877. }
  878. }
  879. break;
  880. case 3://依据比例退回
  881. int backCount = 0;
  882. foreach (var step in steps)
  883. {
  884. if (IsBack(step, executeModel.FlowID, currentTask.GroupID, currentTask.PrevID, currentTask.Sort))
  885. {
  886. backCount++;
  887. }
  888. }
  889. isBack = (((decimal)backCount / (decimal)steps.Count) * 100).Round() >= (countersignatureStep.Behavior.CountersignaturePercentage <= 0 ? 100 : countersignatureStep.Behavior.CountersignaturePercentage);
  890. break;
  891. }
  892. if (isBack)
  893. {
  894. var tjTasks = GetTaskList(currentTask.ID, false);
  895. foreach (var tjTask in tjTasks)
  896. {
  897. if (tjTask.ID == currentTask.ID || tjTask.Status.In(2, 3, 4, 5))
  898. {
  899. continue;
  900. }
  901. Completed(tjTask.ID, "", false, 5);
  902. }
  903. }
  904. }
  905. #endregion
  906. //如果退回步骤是子流程步骤,则要作废子流程实例
  907. if (currentStep.Type == "subflow" && currentStep.SubFlowID.IsGuid() && currentTask.SubFlowGroupID.HasValue)
  908. {
  909. DeleteInstance(currentStep.SubFlowID.ToGuid(), currentTask.SubFlowGroupID.Value, true);
  910. }
  911. if (isBack)
  912. {
  913. var backTaskList = tasks.Distinct(this);
  914. if (backTaskList.Count() == 0)
  915. {
  916. Completed(currentTask.ID, "", false, 0, "");
  917. result.DebugMessages += "没有接收人,退回失败!";
  918. result.IsSuccess = false;
  919. result.Messages += "没有接收人,退回失败!";
  920. result.NextTasks = nextTasks;
  921. scope.Complete();
  922. return;
  923. }
  924. foreach (var task in backTaskList)
  925. {
  926. if (task != null)
  927. {
  928. //删除抄送
  929. if (task.Type == 5)
  930. {
  931. Delete(task.ID);
  932. continue;
  933. }
  934. RoadFlow.Data.Model.WorkFlowTask newTask = task;
  935. newTask.ID = Guid.NewGuid();
  936. newTask.PrevID = currentTask.ID;
  937. newTask.Note = "退回任务";
  938. newTask.ReceiveTime = RoadFlow.Utility.DateTimeNew.Now;
  939. newTask.SenderID = currentTask.ReceiveID;
  940. newTask.SenderName = currentTask.ReceiveName;
  941. newTask.SenderTime = RoadFlow.Utility.DateTimeNew.Now;
  942. newTask.Sort = currentTask.Sort + 1;
  943. newTask.Status = 0;
  944. newTask.Type = 4;
  945. newTask.Comment = "";
  946. newTask.OpenTime = null;
  947. //newTask.PrevStepID = currentTask.StepID;
  948. if (currentStep.WorkTime > 0)
  949. {
  950. newTask.CompletedTime = RoadFlow.Utility.DateTimeNew.Now.AddHours((double)currentStep.WorkTime);
  951. }
  952. else
  953. {
  954. newTask.CompletedTime = null;
  955. }
  956. newTask.CompletedTime1 = null;
  957. Add(newTask);
  958. nextTasks.Add(newTask);
  959. }
  960. }
  961. //删除临时任务
  962. var nextSteps = bWorkFlow.GetNextSteps(executeModel.FlowID, executeModel.StepID);
  963. foreach(var step in nextSteps)
  964. {
  965. dataWorkFlowTask.DeleteTempTasks(currentTask.FlowID, step.ID, currentTask.GroupID,
  966. IsCountersignature ? Guid.Empty : currentStep.ID
  967. );
  968. }
  969. }
  970. scope.Complete();
  971. }
  972. if (nextTasks.Count > 0)
  973. {
  974. List<string> nextStepName = new List<string>();
  975. foreach (var nstep in nextTasks)
  976. {
  977. nextStepName.Add(nstep.StepName);
  978. }
  979. string msg = string.Format("已退回到:{0}", nextStepName.Distinct().ToArray().Join1(","));
  980. result.DebugMessages += msg;
  981. result.IsSuccess = true;
  982. result.Messages += msg;
  983. result.NextTasks = nextTasks;
  984. }
  985. else
  986. {
  987. result.DebugMessages += "已退回,等待其它步骤处理";
  988. result.IsSuccess = true;
  989. result.Messages += "已退回,等待其它步骤处理";
  990. result.NextTasks = nextTasks;
  991. }
  992. return;
  993. }
  994. /// <summary>
  995. /// 保存任务
  996. /// </summary>
  997. /// <param name="executeModel"></param>
  998. private void executeSave(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel)
  999. {
  1000. //如果是第一步提交并且没有实例则先创建实例
  1001. RoadFlow.Data.Model.WorkFlowTask currentTask = null;
  1002. bool isFirst = executeModel.StepID == wfInstalled.FirstStepID && executeModel.TaskID == Guid.Empty && executeModel.GroupID == Guid.Empty;
  1003. if (isFirst)
  1004. {
  1005. currentTask = createFirstTask(executeModel);
  1006. }
  1007. else
  1008. {
  1009. currentTask = Get(executeModel.TaskID);
  1010. }
  1011. if (currentTask == null)
  1012. {
  1013. result.DebugMessages = "未能创建或找到当前任务";
  1014. result.IsSuccess = false;
  1015. result.Messages = "未能创建或找到当前任务";
  1016. return;
  1017. }
  1018. else if (currentTask.Status.In(2, 3, 4))
  1019. {
  1020. result.DebugMessages = "当前任务已处理";
  1021. result.IsSuccess = false;
  1022. result.Messages = "当前任务已处理";
  1023. return;
  1024. }
  1025. else
  1026. {
  1027. currentTask.InstanceID = executeModel.InstanceID;
  1028. nextTasks.Add(currentTask);
  1029. if (isFirst)
  1030. {
  1031. currentTask.Title = executeModel.Title.IsNullOrEmpty() ? "未命名任务" : executeModel.Title;
  1032. Update(currentTask);
  1033. }
  1034. else
  1035. {
  1036. if (!executeModel.Title.IsNullOrEmpty())
  1037. {
  1038. currentTask.Title = executeModel.Title;
  1039. Update(currentTask);
  1040. }
  1041. }
  1042. }
  1043. result.DebugMessages = "保存成功";
  1044. result.IsSuccess = true;
  1045. result.Messages = "保存成功";
  1046. }
  1047. /// <summary>
  1048. /// 完成任务
  1049. /// </summary>
  1050. /// <param name="executeModel"></param>
  1051. /// <param name="isCompleteTask">是否需要调用Completed方法完成当前任务</param>
  1052. private void executeComplete(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel, bool isCompleteTask = true)
  1053. {
  1054. if (executeModel.TaskID == Guid.Empty || executeModel.FlowID == Guid.Empty)
  1055. {
  1056. result.DebugMessages = "完成流程参数错误";
  1057. result.IsSuccess = false;
  1058. result.Messages = "完成流程参数错误";
  1059. return;
  1060. }
  1061. var task = Get(executeModel.TaskID);
  1062. if (task == null)
  1063. {
  1064. result.DebugMessages = "未找到当前任务";
  1065. result.IsSuccess = false;
  1066. result.Messages = "未找到当前任务";
  1067. return;
  1068. }
  1069. else if (isCompleteTask && task.Status.In(2, 3, 4))
  1070. {
  1071. result.DebugMessages = "当前任务已处理";
  1072. result.IsSuccess = false;
  1073. result.Messages = "当前任务已处理";
  1074. return;
  1075. }
  1076. if (isCompleteTask)
  1077. {
  1078. Completed(task.ID, executeModel.Comment, executeModel.IsSign);
  1079. }
  1080. #region 更新业务表标识字段的值为1
  1081. if (wfInstalled.TitleField != null && wfInstalled.TitleField.LinkID != Guid.Empty && !wfInstalled.TitleField.Table.IsNullOrEmpty()
  1082. && !wfInstalled.TitleField.Field.IsNullOrEmpty() && wfInstalled.DataBases.Count() > 0)
  1083. {
  1084. var firstDB = wfInstalled.DataBases.First();
  1085. new DBConnection().UpdateFieldValue(
  1086. wfInstalled.TitleField.LinkID,
  1087. wfInstalled.TitleField.Table,
  1088. wfInstalled.TitleField.Field,
  1089. "1",
  1090. string.Format("{0}='{1}'", firstDB.PrimaryKey, task.InstanceID));
  1091. }
  1092. #endregion
  1093. #region 执行子流程完成后事件
  1094. var parentTasks = GetBySubFlowGroupID(task.GroupID);
  1095. if (parentTasks.Count > 0)
  1096. {
  1097. var parentTask = parentTasks.First();
  1098. var flowRunModel = bWorkFlow.GetWorkFlowRunModel(parentTask.FlowID);
  1099. if (flowRunModel != null)
  1100. {
  1101. var steps = flowRunModel.Steps.Where(p => p.ID == parentTask.StepID);
  1102. if (steps.Count() > 0 && !steps.First().Event.SubFlowCompletedBefore.IsNullOrEmpty())
  1103. {
  1104. ExecuteFlowCustomEvent(steps.First().Event.SubFlowCompletedBefore.Trim(), new RoadFlow.Data.Model.WorkFlowCustomEventParams()
  1105. {
  1106. FlowID = parentTask.FlowID,
  1107. GroupID = parentTask.GroupID,
  1108. InstanceID = parentTask.InstanceID,
  1109. StepID = parentTask.StepID,
  1110. TaskID = parentTask.ID
  1111. });
  1112. }
  1113. }
  1114. }
  1115. #endregion
  1116. result.DebugMessages += "已完成";
  1117. result.IsSuccess = true;
  1118. result.Messages += "已完成";
  1119. }
  1120. /// <summary>
  1121. /// 转交任务
  1122. /// </summary>
  1123. /// <param name="executeModel"></param>
  1124. private void executeRedirect(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel)
  1125. {
  1126. RoadFlow.Data.Model.WorkFlowTask currentTask = Get(executeModel.TaskID);
  1127. if (currentTask == null)
  1128. {
  1129. result.DebugMessages = "未能创建或找到当前任务";
  1130. result.IsSuccess = false;
  1131. result.Messages = "未能创建或找到当前任务";
  1132. return;
  1133. }
  1134. else if (currentTask.Status.In(2, 3, 4, 5))
  1135. {
  1136. result.DebugMessages = "当前任务已处理";
  1137. result.IsSuccess = false;
  1138. result.Messages = "当前任务已处理";
  1139. return;
  1140. }
  1141. else if (currentTask.Status == -1)
  1142. {
  1143. result.DebugMessages = "当前任务正在等待他人处理";
  1144. result.IsSuccess = false;
  1145. result.Messages = "当前任务正在等待他人处理";
  1146. return;
  1147. }
  1148. if (executeModel.Steps.First().Value.Count == 0)
  1149. {
  1150. result.DebugMessages = "未设置转交人员";
  1151. result.IsSuccess = false;
  1152. result.Messages = "未设置转交人员";
  1153. return;
  1154. }
  1155. string receiveName = currentTask.ReceiveName;
  1156. using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
  1157. {
  1158. foreach (var user in executeModel.Steps.First().Value)
  1159. {
  1160. currentTask.ID = Guid.NewGuid();
  1161. currentTask.ReceiveID = user.ID;
  1162. currentTask.ReceiveName = user.Name;
  1163. currentTask.OpenTime = null;
  1164. currentTask.Status = 0;
  1165. currentTask.IsSign = 0;
  1166. currentTask.Type = 3;
  1167. currentTask.Note = string.Format("该任务由{0}转交", receiveName);
  1168. if (!HasNoCompletedTasks(currentTask.FlowID, currentTask.StepID, currentTask.GroupID, user.ID))
  1169. {
  1170. Add(currentTask);
  1171. }
  1172. nextTasks.Add(currentTask);
  1173. }
  1174. Completed(executeModel.TaskID, executeModel.Comment, executeModel.IsSign, 2, "已转交他人处理");
  1175. scope.Complete();
  1176. }
  1177. List<string> nextStepName = new List<string>();
  1178. foreach (var user in executeModel.Steps.First().Value)
  1179. {
  1180. nextStepName.Add(user.Name);
  1181. }
  1182. string userName = nextStepName.Distinct().ToArray().Join1(",");
  1183. result.DebugMessages = string.Concat("已转交给:", userName);
  1184. result.IsSuccess = true;
  1185. result.Messages = string.Concat("已转交给:", userName);
  1186. return;
  1187. }
  1188. /// <summary>
  1189. /// 创建临时任务(待办人员看不到)
  1190. /// </summary>
  1191. /// <param name="executeModel"></param>
  1192. private List<Data.Model.WorkFlowTask> createTempTasks(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel, Data.Model.WorkFlowTask currentTask)
  1193. {
  1194. List<Data.Model.WorkFlowTask> tasks = new List<Data.Model.WorkFlowTask>();
  1195. foreach (var step in executeModel.Steps)
  1196. {
  1197. foreach (var user in step.Value)
  1198. {
  1199. var nextSteps = wfInstalled.Steps.Where(p => p.ID == step.Key);
  1200. if (nextSteps.Count() == 0)
  1201. {
  1202. continue;
  1203. }
  1204. var nextStep = nextSteps.First();
  1205. RoadFlow.Data.Model.WorkFlowTask task = new RoadFlow.Data.Model.WorkFlowTask();
  1206. if (nextStep.WorkTime > 0)
  1207. {
  1208. task.CompletedTime = RoadFlow.Utility.DateTimeNew.Now.AddHours((double)nextStep.WorkTime);
  1209. }
  1210. task.FlowID = executeModel.FlowID;
  1211. task.GroupID = currentTask != null ? currentTask.GroupID : executeModel.GroupID;
  1212. task.ID = Guid.NewGuid();
  1213. task.Type = 0;
  1214. task.InstanceID = executeModel.InstanceID;
  1215. if (!executeModel.Note.IsNullOrEmpty())
  1216. {
  1217. task.Note = executeModel.Note;
  1218. }
  1219. task.PrevID = currentTask.ID;
  1220. task.PrevStepID = currentTask.StepID;
  1221. task.ReceiveID = user.ID;
  1222. task.ReceiveName = user.Name;
  1223. task.ReceiveTime = RoadFlow.Utility.DateTimeNew.Now;
  1224. task.SenderID = executeModel.Sender.ID;
  1225. task.SenderName = executeModel.Sender.Name;
  1226. task.SenderTime = task.ReceiveTime;
  1227. task.Status = -1;
  1228. task.StepID = step.Key;
  1229. task.StepName = nextStep.Name;
  1230. task.Sort = currentTask.Sort + 1;
  1231. task.Title = executeModel.Title.IsNullOrEmpty() ? currentTask.Title : executeModel.Title;
  1232. if (!HasNoCompletedTasks(executeModel.FlowID, step.Key, currentTask.GroupID, user.ID))
  1233. {
  1234. Add(task);
  1235. }
  1236. tasks.Add(task);
  1237. }
  1238. }
  1239. return tasks;
  1240. }
  1241. /// <summary>
  1242. /// 判断一个步骤是否通过
  1243. /// </summary>
  1244. /// <param name="step"></param>
  1245. /// <param name="groupID"></param>
  1246. /// <returns></returns>
  1247. private bool IsPassing(RoadFlow.Data.Model.WorkFlowInstalledSub.Step step, Guid flowID, Guid groupID, Guid taskID, int sort)
  1248. {
  1249. var tasks = GetTaskList(flowID, step.ID, groupID).FindAll(p => p.Sort == sort && p.Type != 5);
  1250. if (tasks.Count == 0)
  1251. {
  1252. return false;
  1253. }
  1254. bool isPassing = true;
  1255. switch (step.Behavior.HanlderModel)
  1256. {
  1257. case 0://所有人必须处理
  1258. case 3://独立处理
  1259. isPassing = tasks.Where(p => p.Status != 2).Count() == 0;
  1260. break;
  1261. case 1://一人同意即可
  1262. isPassing = tasks.Where(p => p.Status == 2).Count() > 0;
  1263. break;
  1264. case 2://依据人数比例
  1265. isPassing = (((decimal)(tasks.Where(p => p.Status == 2).Count() + 1) / (decimal)tasks.Count) * 100).Round() >= (step.Behavior.Percentage <= 0 ? 100 : step.Behavior.Percentage);
  1266. break;
  1267. }
  1268. return isPassing;
  1269. }
  1270. /// <summary>
  1271. /// 判断一个步骤是否退回
  1272. /// </summary>
  1273. /// <param name="step"></param>
  1274. /// <param name="groupID"></param>
  1275. /// <returns></returns>
  1276. private bool IsBack(RoadFlow.Data.Model.WorkFlowInstalledSub.Step step, Guid flowID, Guid groupID, Guid taskID, int sort)
  1277. {
  1278. var tasks = GetTaskList(flowID, step.ID, groupID).FindAll(p => p.Sort == sort && p.Type != 5);
  1279. if (tasks.Count == 0)
  1280. {
  1281. return false;
  1282. }
  1283. bool isBack = true;
  1284. switch (step.Behavior.HanlderModel)
  1285. {
  1286. case 0://所有人必须处理
  1287. case 3://独立处理
  1288. isBack = tasks.Where(p => p.Status.In(3,5)).Count() > 0;
  1289. break;
  1290. case 1://一人同意即可
  1291. isBack = tasks.Where(p => p.Status.In(2,4)).Count() == 0;
  1292. break;
  1293. case 2://依据人数比例
  1294. isBack = (((decimal)(tasks.Where(p => p.Status.In(3, 5)).Count() + 1) / (decimal)tasks.Count) * 100).Round() >= 100 - (step.Behavior.Percentage <= 0 ? 100 : step.Behavior.Percentage);
  1295. break;
  1296. }
  1297. return isBack;
  1298. }
  1299. /// <summary>
  1300. /// 创建第一个任务
  1301. /// </summary>
  1302. /// <param name="executeModel"></param>
  1303. /// <param name="isSubFlow">是否是创建子流程任务</param>
  1304. /// <returns></returns>
  1305. private RoadFlow.Data.Model.WorkFlowTask createFirstTask(RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel, bool isSubFlow = false)
  1306. {
  1307. if (wfInstalled == null || isSubFlow)
  1308. {
  1309. wfInstalled = bWorkFlow.GetWorkFlowRunModel(executeModel.FlowID);
  1310. }
  1311. var nextSteps = wfInstalled.Steps.Where(p => p.ID == wfInstalled.FirstStepID);
  1312. if (nextSteps.Count() == 0)
  1313. {
  1314. return null;
  1315. }
  1316. RoadFlow.Data.Model.WorkFlowTask task = new RoadFlow.Data.Model.WorkFlowTask();
  1317. if (nextSteps.First().WorkTime > 0)
  1318. {
  1319. task.CompletedTime = RoadFlow.Utility.DateTimeNew.Now.AddHours((double)nextSteps.First().WorkTime);
  1320. }
  1321. task.FlowID = executeModel.FlowID;
  1322. task.GroupID = Guid.NewGuid();
  1323. task.ID = Guid.NewGuid();
  1324. task.Type = 0;
  1325. task.InstanceID = executeModel.InstanceID;
  1326. if (!executeModel.Note.IsNullOrEmpty())
  1327. {
  1328. task.Note = executeModel.Note;
  1329. }
  1330. task.PrevID = Guid.Empty;
  1331. task.PrevStepID = Guid.Empty;
  1332. task.ReceiveID = executeModel.Sender.ID;
  1333. task.ReceiveName = executeModel.Sender.Name;
  1334. task.ReceiveTime = RoadFlow.Utility.DateTimeNew.Now;
  1335. task.SenderID = executeModel.Sender.ID;
  1336. task.SenderName = executeModel.Sender.Name;
  1337. task.SenderTime = task.ReceiveTime;
  1338. task.Status = 0;
  1339. task.StepID = wfInstalled.FirstStepID;
  1340. task.StepName = nextSteps.First().Name;
  1341. task.Sort = 1;
  1342. task.Title = executeModel.Title.IsNullOrEmpty() ? "未命名任务(" + wfInstalled.Name + ")" : executeModel.Title;
  1343. Add(task);
  1344. if (isSubFlow)
  1345. {
  1346. wfInstalled = null;
  1347. }
  1348. return task;
  1349. }
  1350. /// <summary>
  1351. /// 查询待办任务
  1352. /// </summary>
  1353. /// <param name="userID"></param>
  1354. /// <param name="pager"></param>
  1355. /// <param name="query"></param>
  1356. /// <param name="title"></param>
  1357. /// <param name="flowid"></param>
  1358. /// <param name="date1"></param>
  1359. /// <param name="date2"></param>
  1360. /// <param name="type">0待办 1已完成</param>
  1361. /// <returns></returns>
  1362. public List<RoadFlow.Data.Model.WorkFlowTask> GetTasks(Guid userID, out string pager, string query = "", string title = "", string flowid = "", string sender = "", string date1 = "", string date2 = "", int type = 0)
  1363. {
  1364. return dataWorkFlowTask.GetTasks(userID, out pager, query, title, flowid, RoadFlow.Platform.Users.RemovePrefix(sender), date1, date2, type);
  1365. }
  1366. /// <summary>
  1367. /// 得到流程实例列表
  1368. /// </summary>
  1369. /// <param name="flowID"></param>
  1370. /// <param name="senderID"></param>
  1371. /// <param name="receiveID"></param>
  1372. /// <param name="pager"></param>
  1373. /// <param name="query"></param>
  1374. /// <param name="title"></param>
  1375. /// <param name="flowid"></param>
  1376. /// <param name="date1"></param>
  1377. /// <param name="date2"></param>
  1378. /// <param name="isCompleted">是否完成 0:全部 1:未完成 2:已完成</param>
  1379. /// <returns></returns>
  1380. public List<RoadFlow.Data.Model.WorkFlowTask> GetInstances(Guid[] flowID, Guid[] senderID, Guid[] receiveID, out string pager, string query = "", string title = "", string flowid = "", string date1 = "", string date2 = "", int status = 0)
  1381. {
  1382. return dataWorkFlowTask.GetInstances(flowID, senderID, receiveID, out pager, query, title, flowid, date1, date2, status);
  1383. }
  1384. /// <summary>
  1385. /// 执行自定义方法
  1386. /// </summary>
  1387. /// <param name="eventName"></param>
  1388. /// <returns></returns>
  1389. public object ExecuteFlowCustomEvent(string eventName, object eventParams, string dllName = "")
  1390. {
  1391. if (dllName.IsNullOrEmpty())
  1392. {
  1393. dllName = eventName.Substring(0, eventName.IndexOf('.'));
  1394. }
  1395. System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(dllName);
  1396. string typeName = System.IO.Path.GetFileNameWithoutExtension(eventName);
  1397. string methodName = eventName.Substring(typeName.Length + 1);
  1398. Type type = assembly.GetType(typeName, true);
  1399. object obj = System.Activator.CreateInstance(type, false);
  1400. var method = type.GetMethod(methodName);
  1401. if (method != null)
  1402. {
  1403. return method.Invoke(obj, new object[] { eventParams });
  1404. }
  1405. else
  1406. {
  1407. throw new MissingMethodException(typeName, methodName);
  1408. }
  1409. }
  1410. /// <summary>
  1411. /// 删除流程实例
  1412. /// </summary>
  1413. /// <param name="flowID"></param>
  1414. /// <param name="groupID"></param>
  1415. /// <returns></returns>
  1416. public int DeleteInstance(Guid flowID, Guid groupID, bool hasInstanceData = false)
  1417. {
  1418. if (hasInstanceData)
  1419. {
  1420. var tasks = GetTaskList(flowID, groupID);
  1421. if (tasks.Count > 0 && !tasks.First().InstanceID.IsNullOrEmpty())
  1422. {
  1423. var wfRunModel = bWorkFlow.GetWorkFlowRunModel(flowID);
  1424. if (wfRunModel != null && wfRunModel.DataBases.Count() > 0)
  1425. {
  1426. var dataBase = wfRunModel.DataBases.First();
  1427. new DBConnection().DeleteData(dataBase.LinkID, dataBase.Table, dataBase.PrimaryKey, tasks.First().InstanceID);
  1428. }
  1429. }
  1430. }
  1431. return dataWorkFlowTask.Delete(flowID, groupID);
  1432. }
  1433. /// <summary>
  1434. /// 完成一个任务
  1435. /// </summary>
  1436. /// <param name="taskID"></param>
  1437. /// <param name="comment"></param>
  1438. /// <param name="isSign"></param>
  1439. /// <returns></returns>
  1440. public int Completed(Guid taskID, string comment = "", bool isSign = false, int status = 2, string note = "")
  1441. {
  1442. return dataWorkFlowTask.Completed(taskID, comment, isSign, status, note);
  1443. }
  1444. /// <summary>
  1445. /// 得到一个流程实例一个步骤的任务
  1446. /// </summary>
  1447. /// <param name="flowID"></param>
  1448. /// <param name="groupID"></param>
  1449. /// <returns></returns>
  1450. public List<RoadFlow.Data.Model.WorkFlowTask> GetTaskList(Guid flowID, Guid stepID, Guid groupID)
  1451. {
  1452. return dataWorkFlowTask.GetTaskList(flowID, stepID, groupID);
  1453. }
  1454. /// <summary>
  1455. /// 得到一个实例的任务
  1456. /// </summary>
  1457. /// <param name="flowID"></param>
  1458. /// <param name="groupID"></param>
  1459. /// <returns></returns>
  1460. public List<RoadFlow.Data.Model.WorkFlowTask> GetTaskList(Guid flowID, Guid groupID)
  1461. {
  1462. return dataWorkFlowTask.GetTaskList(flowID, groupID);
  1463. }
  1464. /// <summary>
  1465. /// 得到和一个任务同级的任务
  1466. /// </summary>
  1467. /// <param name="taskID">任务ID</param>
  1468. /// <param name="isStepID">是否区分步骤ID,多步骤会签区分的是上一步骤ID</param>
  1469. /// <returns></returns>
  1470. public List<RoadFlow.Data.Model.WorkFlowTask> GetTaskList(Guid taskID, bool isStepID = true)
  1471. {
  1472. return dataWorkFlowTask.GetTaskList(taskID, isStepID);
  1473. }
  1474. /// <summary>
  1475. /// 得到和一个任务同级的任务(同一步骤内)
  1476. /// </summary>
  1477. /// <param name="taskID">任务ID</param>
  1478. /// <param name="stepID">步骤ID</param>
  1479. /// <returns></returns>
  1480. public List<RoadFlow.Data.Model.WorkFlowTask> GetTaskListByStepID(Guid taskID, Guid stepID)
  1481. {
  1482. return dataWorkFlowTask.GetTaskList(taskID).FindAll(p => p.StepID == stepID);
  1483. }
  1484. /// <summary>
  1485. /// 得到一个任务的前一任务
  1486. /// </summary>
  1487. /// <param name="flowID"></param>
  1488. /// <param name="groupID"></param>
  1489. /// <returns></returns>
  1490. public List<RoadFlow.Data.Model.WorkFlowTask> GetPrevTaskList(Guid taskID)
  1491. {
  1492. return dataWorkFlowTask.GetPrevTaskList(taskID);
  1493. }
  1494. /// <summary>
  1495. /// 得到一个任务的后续任务
  1496. /// </summary>
  1497. /// <param name="flowID"></param>
  1498. /// <param name="groupID"></param>
  1499. /// <returns></returns>
  1500. public List<RoadFlow.Data.Model.WorkFlowTask> GetNextTaskList(Guid taskID)
  1501. {
  1502. return dataWorkFlowTask.GetNextTaskList(taskID);
  1503. }
  1504. /// <summary>
  1505. /// 得到一个任务可以退回的步骤
  1506. /// </summary>
  1507. /// <param name="taskID">当前任务ID</param>
  1508. /// <param name="backType">退回类型</param>
  1509. /// <param name="stepID"></param>
  1510. /// <returns></returns>
  1511. public Dictionary<Guid, string> GetBackSteps(Guid taskID, int backType, Guid stepID, RoadFlow.Data.Model.WorkFlowInstalled wfInstalled)
  1512. {
  1513. Dictionary<Guid, string> dict = new Dictionary<Guid, string>();
  1514. var steps = wfInstalled.Steps.Where(p => p.ID == stepID);
  1515. if (steps.Count() == 0)
  1516. {
  1517. return dict;
  1518. }
  1519. var step = steps.First();
  1520. switch (backType)
  1521. {
  1522. case 0://退回前一步
  1523. var task = Get(taskID);
  1524. if (task != null)
  1525. {
  1526. if (step.Behavior.Countersignature != 0)//如果是会签步骤,则要退回到前面所有步骤
  1527. {
  1528. var backSteps = bWorkFlow.GetPrevSteps(task.FlowID, step.ID);
  1529. foreach (var backStep in backSteps)
  1530. {
  1531. dict.Add(backStep.ID, backStep.Name);
  1532. }
  1533. }
  1534. else
  1535. {
  1536. dict.Add(task.PrevStepID, bWorkFlow.GetStepName(task.PrevStepID, wfInstalled));
  1537. //switch (step.Behavior.HanlderModel)
  1538. //{
  1539. // case 0:
  1540. // case 2:
  1541. // //var tasks = GetTaskList(task.FlowID, task.StepID, task.GroupID).FindAll(p => p.Sort == task.Sort);
  1542. // //foreach (var t in tasks)
  1543. // //{
  1544. // // if (!dict.ContainsKey(t.PrevStepID))
  1545. // // {
  1546. // // dict.Add(t.PrevStepID, bWorkFlow.GetStepName(t.PrevStepID, wfInstalled));
  1547. // // }
  1548. // //}
  1549. // //break;
  1550. // case 1:
  1551. // //dict.Add(task.PrevStepID, bWorkFlow.GetStepName(task.PrevStepID, wfInstalled));
  1552. // //break;
  1553. // case 3:
  1554. // dict.Add(task.PrevStepID, bWorkFlow.GetStepName(task.PrevStepID, wfInstalled));
  1555. // break;
  1556. //}
  1557. }
  1558. }
  1559. break;
  1560. case 1://退回第一步
  1561. dict.Add(wfInstalled.FirstStepID, bWorkFlow.GetStepName(wfInstalled.FirstStepID, wfInstalled));
  1562. break;
  1563. case 2://退回某一步
  1564. if (step.Behavior.BackType == 2 && step.Behavior.BackStepID != Guid.Empty)
  1565. {
  1566. dict.Add(step.Behavior.BackStepID, bWorkFlow.GetStepName(step.Behavior.BackStepID, wfInstalled));
  1567. }
  1568. else
  1569. {
  1570. var task0 = Get(taskID);
  1571. if (task0 != null)
  1572. {
  1573. var taskList = GetTaskList(task0.FlowID, task0.GroupID).Where(p => p.Status.In(2,3,4)).OrderBy(p => p.Sort);
  1574. foreach (var task1 in taskList)
  1575. {
  1576. if (!dict.Keys.Contains(task1.StepID) && task1.StepID != stepID)
  1577. {
  1578. dict.Add(task1.StepID, bWorkFlow.GetStepName(task1.StepID, wfInstalled));
  1579. }
  1580. }
  1581. }
  1582. }
  1583. break;
  1584. }
  1585. return dict;
  1586. }
  1587. /// <summary>
  1588. /// 更新一个任务后续任务状态
  1589. /// </summary>
  1590. /// <param name="taskID"></param>
  1591. /// <param name="comment"></param>
  1592. /// <param name="isSign"></param>
  1593. /// <returns></returns>
  1594. public int UpdateNextTaskStatus(Guid taskID, int status)
  1595. {
  1596. int i = 0;
  1597. var taskList = GetTaskList(taskID);
  1598. foreach (var task in taskList)
  1599. {
  1600. i += dataWorkFlowTask.UpdateNextTaskStatus(task.ID, status);
  1601. }
  1602. return i;
  1603. }
  1604. /// <summary>
  1605. /// 查询一个流程是否有任务数据
  1606. /// </summary>
  1607. /// <param name="flowID"></param>
  1608. /// <returns></returns>
  1609. public bool HasTasks(Guid flowID)
  1610. {
  1611. return dataWorkFlowTask.HasTasks(flowID);
  1612. }
  1613. /// <summary>
  1614. /// 查询一个用户在一个步骤是否有未完成任务
  1615. /// </summary>
  1616. /// <param name="flowID"></param>
  1617. /// <returns></returns>
  1618. public bool HasNoCompletedTasks(Guid flowID, Guid stepID, Guid groupID, Guid userID)
  1619. {
  1620. return dataWorkFlowTask.HasNoCompletedTasks(flowID, stepID, groupID, userID);
  1621. }
  1622. /// <summary>
  1623. /// 得到状态显示标题
  1624. /// </summary>
  1625. /// <param name="status"></param>
  1626. /// <returns></returns>
  1627. public string GetStatusTitle(int status)
  1628. {
  1629. string title = string.Empty;
  1630. switch (status)
  1631. {
  1632. case -1:
  1633. title = "等待中";
  1634. break;
  1635. case 0:
  1636. title = "待处理";
  1637. break;
  1638. case 1:
  1639. title = "已打开";
  1640. break;
  1641. case 2:
  1642. title = "已完成";
  1643. break;
  1644. case 3:
  1645. title = "已退回";
  1646. break;
  1647. case 4:
  1648. title = "他人已处理";
  1649. break;
  1650. case 5:
  1651. title = "他人已退回";
  1652. break;
  1653. default:
  1654. title = "其它";
  1655. break;
  1656. }
  1657. return title;
  1658. }
  1659. /// <summary>
  1660. /// 得到一个流程实例一个步骤一个人员的任务
  1661. /// </summary>
  1662. /// <param name="flowID"></param>
  1663. /// <param name="stepID"></param>
  1664. /// <param name="groupID"></param>
  1665. /// <param name="userID"></param>
  1666. /// <returns></returns>
  1667. public List<RoadFlow.Data.Model.WorkFlowTask> GetUserTaskList(Guid flowID, Guid stepID, Guid groupID, Guid userID)
  1668. {
  1669. return dataWorkFlowTask.GetUserTaskList(flowID, stepID, groupID, userID);
  1670. }
  1671. /// <summary>
  1672. /// 判断一个任务是否可以收回
  1673. /// </summary>
  1674. /// <param name="taskID"></param>
  1675. /// <returns></returns>
  1676. public bool HasWithdraw(Guid taskID)
  1677. {
  1678. var taskList = GetNextTaskList(taskID);
  1679. if (taskList.Count == 0) return false;
  1680. foreach (var task in taskList)
  1681. {
  1682. if (task.Status.In(1,2,3,4,5))
  1683. {
  1684. return false;
  1685. }
  1686. }
  1687. return true;
  1688. }
  1689. /// <summary>
  1690. /// 收回任务
  1691. /// </summary>
  1692. /// <param name="taskID"></param>
  1693. /// <returns></returns>
  1694. public bool WithdrawTask(Guid taskID)
  1695. {
  1696. var taskList1 = GetTaskList(taskID);
  1697. using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
  1698. {
  1699. foreach (var task in taskList1)
  1700. {
  1701. var taskList2 = GetNextTaskList(task.ID);
  1702. foreach (var task2 in taskList2)
  1703. {
  1704. if (task2.Status.In(-1,0,1,5))
  1705. {
  1706. Delete(task2.ID);
  1707. }
  1708. if (task2.SubFlowGroupID.HasValue)
  1709. {
  1710. DeleteInstance(Guid.Empty, task2.SubFlowGroupID.Value);
  1711. }
  1712. }
  1713. if (task.ID == taskID || task.Status == 4)
  1714. {
  1715. Completed(task.ID, "", false, 1, "");
  1716. }
  1717. }
  1718. scope.Complete();
  1719. return true;
  1720. }
  1721. }
  1722. /// <summary>
  1723. /// 指派任务
  1724. /// </summary>
  1725. /// <param name="taskID">任务ID</param>
  1726. /// <param name="user">要指派的人员</param>
  1727. /// <returns></returns>
  1728. public string DesignateTask(Guid taskID, RoadFlow.Data.Model.Users user)
  1729. {
  1730. var task = Get(taskID);
  1731. if (task == null)
  1732. {
  1733. return "未找到任务";
  1734. }
  1735. else if (task.Status.In(2, 3, 4, 5))
  1736. {
  1737. return "该任务已处理";
  1738. }
  1739. string receiveName = task.ReceiveName;
  1740. task.ReceiveID = user.ID;
  1741. task.ReceiveName = user.Name;
  1742. task.OpenTime = null;
  1743. task.Status = 0;
  1744. task.Note = string.Format("该任务由{0}指派", receiveName);
  1745. Update(task);
  1746. return "指派成功";
  1747. }
  1748. /// <summary>
  1749. /// 管理员强制退回任务
  1750. /// </summary>
  1751. /// <param name="taskID"></param>
  1752. /// <returns></returns>
  1753. public string BackTask(Guid taskID)
  1754. {
  1755. var task = Get(taskID);
  1756. if (task == null)
  1757. {
  1758. return "未找到任务";
  1759. }
  1760. else if (task.Status.In(2, 3, 4, 5))
  1761. {
  1762. return "该任务已处理";
  1763. }
  1764. if(wfInstalled==null)
  1765. {
  1766. wfInstalled = bWorkFlow.GetWorkFlowRunModel(task.FlowID);
  1767. }
  1768. RoadFlow.Data.Model.WorkFlowExecute.Execute executeModel = new RoadFlow.Data.Model.WorkFlowExecute.Execute();
  1769. executeModel.ExecuteType = RoadFlow.Data.Model.WorkFlowExecute.EnumType.ExecuteType.Back;
  1770. executeModel.FlowID = task.FlowID;
  1771. executeModel.GroupID = task.GroupID;
  1772. executeModel.InstanceID = task.InstanceID;
  1773. executeModel.Note = "管理员退回";
  1774. executeModel.Sender = new Users().Get(task.ReceiveID);
  1775. executeModel.StepID = task.StepID;
  1776. executeModel.TaskID = task.ID;
  1777. executeModel.Title = task.Title;
  1778. var steps = wfInstalled.Steps.Where(p => p.ID == task.StepID);
  1779. if(steps.Count()==0)
  1780. {
  1781. return "未找到步骤";
  1782. }
  1783. else if (steps.First().Behavior.BackType == 2 && steps.First().Behavior.BackStepID == Guid.Empty)
  1784. {
  1785. return "未设置退回步骤";
  1786. }
  1787. Dictionary<Guid, List<RoadFlow.Data.Model.Users>> execSteps = new Dictionary<Guid, List<RoadFlow.Data.Model.Users>>();
  1788. var backsteps = GetBackSteps(taskID, steps.First().Behavior.BackType, task.StepID, wfInstalled);
  1789. foreach (var back in backsteps)
  1790. {
  1791. execSteps.Add(back.Key, new List<RoadFlow.Data.Model.Users>());
  1792. }
  1793. executeModel.Steps = execSteps;
  1794. var result = Execute(executeModel);
  1795. return result.Messages;
  1796. }
  1797. /// <summary>
  1798. /// 排序流程任务列表
  1799. /// </summary>
  1800. /// <param name="tasks"></param>
  1801. public List<RoadFlow.Data.Model.WorkFlowTask> Sort(List<RoadFlow.Data.Model.WorkFlowTask> tasks)
  1802. {
  1803. return tasks.OrderBy(p => p.Sort).ToList();
  1804. }
  1805. /// <summary>
  1806. /// 得到一个任务的状态
  1807. /// </summary>
  1808. /// <param name="taskID"></param>
  1809. /// <returns></returns>
  1810. public int GetTaskStatus(Guid taskID)
  1811. {
  1812. return dataWorkFlowTask.GetTaskStatus(taskID);
  1813. }
  1814. /// <summary>
  1815. /// 判断一个任务是否可以处理
  1816. /// </summary>
  1817. /// <param name="taskID"></param>
  1818. /// <returns></returns>
  1819. public bool IsExecute(Guid taskID)
  1820. {
  1821. return GetTaskStatus(taskID) <= 1;
  1822. }
  1823. /// <summary>
  1824. /// 判断sql流转条件是否满足
  1825. /// </summary>
  1826. /// <param name="linkID"></param>
  1827. /// <param name="table"></param>
  1828. /// <param name="tablepk"></param>
  1829. /// <param name="instabceID">实例ID</param>
  1830. /// <param name="where"></param>
  1831. /// <returns></returns>
  1832. public bool TestLineSql(Guid linkID, string table, string tablepk, string instabceID, string where)
  1833. {
  1834. if (instabceID.IsNullOrEmpty())
  1835. {
  1836. return false;
  1837. }
  1838. DBConnection dbconn = new DBConnection();
  1839. var conn = dbconn.Get(linkID);
  1840. if (conn == null)
  1841. {
  1842. return false;
  1843. }
  1844. string sql = "SELECT * FROM " + table + " WHERE " + tablepk + "='" + instabceID + "' AND (" + where + ")".ReplaceSelectSql();
  1845. if (!dbconn.TestSql(conn, sql))
  1846. {
  1847. return false;
  1848. }
  1849. System.Data.DataTable dt = dbconn.GetDataTable(conn, sql);
  1850. return dt.Rows.Count > 0;
  1851. }
  1852. /// <summary>
  1853. /// 判断实例是否已完成
  1854. /// </summary>
  1855. /// <param name="groupID"></param>
  1856. /// <returns></returns>
  1857. public bool GetInstanceIsCompleted(Guid flowID, Guid groupID)
  1858. {
  1859. var tasks = GetTaskList(flowID, groupID);
  1860. return tasks.Find(p => p.Status.In(0, 1)) == null;
  1861. }
  1862. /// <summary>
  1863. /// 根据SubFlowID得到一个任务
  1864. /// </summary>
  1865. /// <param name="subflowGroupID"></param>
  1866. /// <returns></returns>
  1867. public List<RoadFlow.Data.Model.WorkFlowTask> GetBySubFlowGroupID(Guid subflowGroupID)
  1868. {
  1869. return dataWorkFlowTask.GetBySubFlowGroupID(subflowGroupID);
  1870. }
  1871. }
  1872. }