Workflow.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using DataTransmission.Enum;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace DataTransmission.Joint
  9. {
  10. public class Workflow
  11. {
  12. private readonly CommonTool tool = new CommonTool();
  13. public DataTable GetWorkflow(string OldOrderId,string StoreCode) {
  14. var conn = tool.GetConSqlServer();
  15. var orderSql = $@"SELECT * FROM Flow_Transfer01_RunBackups FTR
  16. LEFT JOIN Flow_Set01_Store FSS ON FTR.FTRB_StoreID = FSS.FSL_StoreID
  17. LEFT JOIN Flow03_Search FS ON FTR.FTRB_FlowID = FS.FSH_FlowID
  18. WHERE FTRB_FlowID ='{OldOrderId}' AND FSS.FSL_Code ='{StoreCode}' ORDER BY FTRB_MoveDate ";
  19. return tool.GetDataTable(orderSql, conn);
  20. }
  21. public string GetWorkflowSql(DataTable data, DataRow row, string orderId, DataTable org, DataTable user, DataRow module,Entity.OrderDelay delay)
  22. {
  23. var pgSql = string.Empty;
  24. var workflow = new Entity.Workflow();
  25. workflow.InitId();
  26. workflow.DefinitionId = module["DefinitionId"].ToString();
  27. workflow.ModuleId = module["Id"].ToString();
  28. workflow.ModuleCode = module["Code"].ToString();
  29. workflow.ModuleName = module["Name"].ToString();
  30. workflow.Title = row["FSH_Title_ys"].ToString();
  31. var stStep = data.AsEnumerable().OrderBy(x => x.Field<int?>("FTRB_RunID")).FirstOrDefault();
  32. var endStep = data.AsEnumerable().OrderByDescending(x=>x.Field<int?>("FTRB_RunID")).FirstOrDefault(x=> x.Field<string>("FTRB_ItemName").ToString() == "结束");
  33. var actualStep = data.AsEnumerable().FirstOrDefault(x => x.Field<int?>("FSH_AcceptBMID").ToString() == x.Field<int?>("FTRB_APBMID").ToString());
  34. if (row["FSH_AcceptBMID"].ToString() == Form1.CenterId)
  35. {
  36. actualStep = data.AsEnumerable().FirstOrDefault(x => x.Field<DateTime>("FSH_AcceptDate").ToString() == x.Field<DateTime>("FTRB_APDate").ToString());
  37. }
  38. //Creator
  39. var creator = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == stStep["FTRB_MoveUserID"].ToString());
  40. var creatorOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<string?>("Id").ToString() == creator["OrgId"].ToString());
  41. workflow.EndTime = DateTime.Parse(endStep["FTRB_DisposeDate"].ToString());
  42. workflow.ActualHandleStepCode = "";
  43. workflow.ActualHandleStepName = "";
  44. workflow.ActualHandleStepId = actualStep["FSH_RunID"].ToString();
  45. workflow.ActualOpinion = actualStep["FTRB_RRemark"].ToString();
  46. workflow.CreationTime = DateTime.Parse(stStep["FSH_AddDate"].ToString());
  47. if (creator != null)
  48. {
  49. workflow.CreatorId = creator["Id"].ToString();
  50. workflow.CreatorName = creator["Name"].ToString();
  51. }
  52. if (creatorOrg != null)
  53. {
  54. workflow.CreatorOrgId = creatorOrg["Id"].ToString();
  55. workflow.CreatorOrgName = creatorOrg["Name"].ToString();
  56. workflow.CreatorOrgLevel = int.Parse(creatorOrg["Level"].ToString());
  57. workflow.AreaId = creatorOrg["AreaId"].ToString();
  58. //workflow.AssignerOrgIsCenter = bool.Parse(creatorOrg["IsCenter"].ToString());
  59. }
  60. if (workflow.ModuleCode == "OrderHandle")
  61. {
  62. workflow.FlowType = EFlowType.Handle;
  63. workflow.ReviewResult = EReviewResult.Unknown;
  64. workflow.ExternalId = row["FSH_FlowID"].ToString();
  65. }
  66. else if (workflow.ModuleCode == "OrderDelay")
  67. {
  68. workflow.FlowType = EFlowType.Handle;
  69. workflow.ReviewResult = delay.DelayState == EDelayState.Pass ? EReviewResult.Approval : delay.DelayState == EDelayState.NoPass ? EReviewResult.Failed : EReviewResult.Unknown ;
  70. workflow.ExternalId = delay.Id;
  71. }
  72. var order = 1;
  73. foreach (DataRow item in data.Rows) {
  74. var start = order == 1;
  75. var end = order == data.Rows.Count;
  76. var stepSql = GetWorkflowStepSql(item, org, user, start, end, ref workflow);
  77. pgSql += stepSql ;
  78. order++;
  79. }
  80. var sql = $@"INSERT INTO ""public"".""workflow"" (""Id"", ""DefinitionId"", ""ModuleId"", ""ModuleName"", ""ModuleCode"", ""Title"", ""Status"",
  81. ""ActualOpinion"", ""IsInCountersign"", ""AllDuration"", ""ExternalId"", ""HandlerUsers"", ""HandlerOrgs"", ""FlowedOrgIds"", ""FlowedUserIds"", ""CreationTime"",
  82. ""CreatorId"", ""CreatorName"", ""CreatorOrgId"", ""CreatorOrgName"", ""CreatorOrgLevel"", ""AreaId"", ""FlowType"", ""ReviewResult"")
  83. VALUES ('{workflow.Id}', '{workflow.DefinitionId}', '{workflow.ModuleId}', '{workflow.ModuleName}', '{workflow.ModuleCode}', '{workflow.Title}', 20,
  84. '{workflow.ActualOpinion}', 'f', '0', '{workflow.ExternalId}', '[]', '[]', '[]', '[]', '{workflow.CreationTime.ToString()}',
  85. '{workflow.CreatorId}', '{workflow.CreatorName}', '{workflow.CreatorOrgId}', '{workflow.CreatorOrgName}', {workflow.CreatorOrgLevel}, '{workflow.AreaId}', {(int)workflow.FlowType}, {(int)workflow.ReviewResult});";
  86. return pgSql + sql;
  87. }
  88. /// <summary>
  89. /// 生成流程
  90. /// </summary>
  91. /// <param name="item"></param>
  92. /// <param name="org"></param>
  93. /// <param name="user"></param>
  94. /// <param name="start"></param>
  95. /// <param name="end"></param>
  96. /// <param name="workflow"></param>
  97. /// <returns></returns>
  98. private string GetWorkflowStepSql(DataRow item, DataTable org, DataTable user,bool start,bool end, ref Entity.Workflow workflow) {
  99. //Acceptor
  100. var acceptor = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == item["FTRB_APUserID"].ToString());
  101. var acceptorOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldBmid").ToString() == item["FTRB_APBMID"].ToString());
  102. //Handler
  103. var handler = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == item["FTRB_UserID"].ToString());
  104. var handlerOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<string?>("Id").ToString() == handler["OrgId"].ToString());
  105. //Creator
  106. var creator = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == item["FTRB_MoveUserID"].ToString());
  107. var creatorOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<string?>("Id").ToString() == creator["OrgId"].ToString());
  108. var step = new Entity.WorkflowStep();
  109. step.InitId();
  110. step.PrevStepId = item["FTRB_PRunID"].ToString();
  111. step.PrevStepCode = string.Empty;
  112. step.AcceptorId = item["FTRB_APUserID"].ToString();
  113. if (acceptor != null) {
  114. step.AcceptorId = acceptor["Id"].ToString();
  115. step.AcceptorName = acceptor["Name"].ToString();
  116. }
  117. step.AcceptorOrgId = item["FTRB_APBMID"].ToString();
  118. if (acceptorOrg != null) {
  119. step.AcceptorOrgId = acceptorOrg["Id"].ToString();
  120. step.AcceptorOrgName = acceptorOrg["Name"].ToString();
  121. step.AcceptorOrgAreaCode = acceptorOrg["AreaCode"].ToString();
  122. step.AcceptorOrgAreaName = acceptorOrg["AreaName"].ToString();
  123. }
  124. step.AcceptTime =string.IsNullOrEmpty(item["FTRB_APDate"].ToString()) ? "NULL" : item["FTRB_APDate"].ToString();
  125. //var AcceptTime = step.AcceptTime.HasValue ? "'" + step.AcceptTime.ToString() + "'" : step.AcceptTime;
  126. step.HandlerId = item["FTRB_UserID"].ToString();
  127. if (handler != null)
  128. {
  129. step.HandlerId = handler["Id"].ToString();
  130. step.HandlerName = handler["Name"].ToString();
  131. }
  132. if (handlerOrg != null)
  133. {
  134. step.HandlerOrgId = handlerOrg["Id"].ToString();
  135. step.HandlerOrgName = handlerOrg["Name"].ToString();
  136. step.HandlerOrgAreaCode = handlerOrg["AreaCode"].ToString();
  137. step.HandlerOrgAreaName = handlerOrg["AreaName"].ToString();
  138. step.HandlerOrgIsCenter =bool.Parse(handlerOrg["IsCenter"].ToString());
  139. }
  140. step.HandleTime = string.IsNullOrEmpty(item["FTRB_DisposeDate"].ToString()) ? "NULL" : item["FTRB_DisposeDate"].ToString();
  141. step.Name = item["FTRB_ItemName"].ToString();
  142. step.StepType = start ? Enum.EStepType.Start : end ? Enum.EStepType.End : Enum.EStepType.Normal;
  143. step.BusinessType = item["FTRB_ItemName"].ToString().Contains("话务") ? EBusinessType.Seat : item["FTRB_ItemName"].ToString().Contains("派单") ? EBusinessType.Send :
  144. item["FTRB_ItemName"].ToString().Contains("结束") || item["FTRB_ItemName"].ToString().Contains("发布") || item["FTRB_ItemName"].ToString().Contains("回访") ? EBusinessType.File : EBusinessType.Department;
  145. step.Opinion = item["FTRB_RRemark"].ToString();
  146. step.StepExpiredTime = string.IsNullOrEmpty(item["FTRB_TTime"].ToString()) ? "NULL" : item["FTRB_TTime"].ToString();
  147. step.CreationTime = Convert.ToDateTime(item["FTRB_MoveDate"]) ;
  148. step.CreatorId = item["FTRB_MoveUserID"].ToString();
  149. if (creator != null )
  150. {
  151. step.CreatorId = creator["Id"].ToString();
  152. step.CreatorName = creator["Name"].ToString();
  153. }
  154. if (creatorOrg != null)
  155. {
  156. step.CreatorOrgId = creatorOrg["Id"].ToString();
  157. step.CreatorOrgName = creatorOrg["Name"].ToString();
  158. step.CreatorOrgLevel =int.Parse(creatorOrg["Level"].ToString());
  159. step.AreaId = creatorOrg["AreaId"].ToString();
  160. step.AssignerOrgIsCenter = bool.Parse(creatorOrg["IsCenter"].ToString());
  161. }
  162. step.ExternalId = workflow.ExternalId;
  163. var stepSql = $@"INSERT INTO ""public"".""workflow_step"" (
  164. ""Id"", ""NextSteps"", ""PrevStepId"", ""PrevStepCode"", ""IsMain"", ""Status"", ""IsOrigin"", ""CountersignId"",""CountersignPosition"",
  165. ""IsStartedCountersignEnd"", ""StartCountersignId"", ""IsCountersignEndStep"", ""CountersignStartStepId"", ""WorkflowId"", ""FlowAssignType"", ""Handlers"", ""PrevChosenStepCode"",
  166. ""AcceptorId"", ""AcceptorName"", ""AcceptorOrgId"", ""AcceptorOrgName"", ""AcceptorOrgAreaCode"", ""AcceptorOrgAreaName"",
  167. ""AcceptTime"", ""HandlerId"", ""HandlerName"", ""HandlerOrgId"",
  168. ""HandlerOrgIsCenter"", ""HandlerOrgName"", ""HandlerOrgAreaCode"", ""HandlerOrgAreaName"", ""HandleTime"", ""Name"", ""Code"", ""StepType"",
  169. ""BusinessType"", ""HandlerType"", ""CanReject"",""ExecuteMode"", ""CanStartCountersign"", ""NextHandlers"", ""BackToCountersignEnd"", ""IsSms"", ""Opinion"", ""StepExpiredTime"",
  170. ""IsStartCountersign"", ""CreationTime"", ""CreatorId"", ""CreatorName"", ""CreatorOrgId"", ""CreatorOrgName"", ""CreatorOrgLevel"", ""AreaId"", ""FlowDirection"", ""FileJson"",
  171. ""IsActualHandled"", ""ModuleId"", ""ModuleName"", ""ModuleCode"", ""ExpiredStatus"", ""CountersignSteps"", ""ExternalId"", ""PrevStepName"", ""AssignerId"", ""AssignerName"", ""AssignerOrgId"", ""AssignerOrgName"", ""AssignerOrgIsCenter"", ""HandleMode"", ""ReviewResult"",""InstanceMode"")
  172. VALUES ('{step.Id}', '[]', '{step.PrevStepId}', '{step.PrevStepCode}', 'f', 2, 'f', NULL, 0,
  173. 'f', NULL, 'f', NULL, '{workflow.Id}', 1, '[]', NULL,
  174. '{step.AcceptorId}', '{step.AcceptorName}', '{step.AcceptorOrgId}', '{step.AcceptorOrgName}', '{step.AcceptorOrgAreaCode}', '{step.AcceptorOrgAreaName}',
  175. '{step.AcceptTime.ToString()}', '{step.HandlerId}', '{step.HandlerName}', '{step.HandlerOrgId}',
  176. '{step.HandlerOrgIsCenter.ToString()}', '{step.HandlerOrgName}', '{step.HandlerOrgAreaCode}', '{step.HandlerOrgAreaName}', '{step.HandleTime.ToString()}', '{step.Name}', '', {(int)step.StepType},
  177. {(int)step.BusinessType}, 3, 'f', 0, 'f', '[]', 'f', 'f', '{step.Opinion}', '{step.StepExpiredTime.ToString()}',
  178. 'f', '{step.CreationTime.ToString()}', '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', {step.CreatorOrgLevel}, '{step.AreaId}', NULL, NULL,
  179. 'f', '{workflow.ModuleId}', '{workflow.ModuleName}', '{workflow.ModuleCode}', 0, '[]', '{step.ExternalId}', '', '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', '{step.AssignerOrgIsCenter.ToString()}', 0, 0,0);";
  180. stepSql = stepSql.Replace("'NULL'", "NULL");
  181. var traceSql = GetWorkflowTraceSql(item, step, org, user, start, end, ref workflow);
  182. return stepSql + traceSql;
  183. }
  184. /// <summary>
  185. /// 生成快照
  186. /// </summary>
  187. /// <param name="item"></param>
  188. /// <param name="step"></param>
  189. /// <param name="org"></param>
  190. /// <param name="user"></param>
  191. /// <param name="start"></param>
  192. /// <param name="end"></param>
  193. /// <param name="workflow"></param>
  194. /// <returns></returns>
  195. private string GetWorkflowTraceSql(DataRow item, Entity.WorkflowStep step , DataTable org, DataTable user, bool start, bool end, ref Entity.Workflow workflow)
  196. {
  197. var trace = new Entity.WorkflowTrace();
  198. trace.InitId();
  199. var traceSql = $@"INSERT INTO ""public"".""workflow_trace"" (""Id"", ""StepId"", ""Status"", ""ParentId"", ""WorkflowId"", ""FlowAssignType"", ""Handlers"", ""PrevChosenStepCode"", ""AcceptorId"", ""AcceptorName"",
  200. ""AcceptorOrgId"", ""AcceptorOrgName"", ""AcceptorOrgAreaCode"", ""AcceptorOrgAreaName"", ""AcceptTime"", ""HandlerId"", ""HandlerName"", ""HandlerOrgId"",
  201. ""HandlerOrgIsCenter"", ""HandlerOrgName"",""HandlerOrgAreaCode"", ""HandlerOrgAreaName"", ""HandleTime"", ""Name"", ""Code"", ""StepType"", ""BusinessType"",
  202. ""HandlerType"", ""CanReject"", ""ExecuteMode"", ""CanStartCountersign"", ""NextHandlers"", ""BackToCountersignEnd"", ""IsSms"", ""Opinion"", ""StepExpiredTime"",
  203. ""IsStartCountersign"", ""CreationTime"", ""CreatorId"", ""CreatorName"", ""CreatorOrgId"", ""CreatorOrgName"", ""CreatorOrgLevel"", ""AreaId"", ""FlowDirection"", ""FileJson"",
  204. ""IsActualHandled"", ""ModuleId"", ""ModuleName"", ""ModuleCode"", ""ExpiredStatus"", ""ExternalId"", ""TraceType"", ""NextSteps"", ""PrevStepId"", ""PrevStepCode"", ""IsMain"", ""IsOrigin"", ""CountersignId"",
  205. ""CountersignPosition"", ""CountersignSteps"", ""StartCountersignId"", ""IsStartedCountersignEnd"", ""IsCountersignEndStep"", ""CountersignStartStepId"", ""SendHandleTimes"", ""RoleId"", ""RoleName"", ""TraceState"",
  206. ""Remark"", ""TraceStyle"", ""OrderPublishId"", ""OrderVisitId"", ""PrevStepName"", ""AssignerId"", ""AssignerName"", ""AssignerOrgId"", ""AssignerOrgName"", ""AssignerOrgIsCenter"", ""HandleMode"", ""ReviewResult"",""InstanceMode"")
  207. VALUES ('{trace.Id}', '{step.Id}', 2, NULL, '{workflow.Id}', 1, '[]', NULL, '{step.AcceptorId}', '{step.AcceptorName}',
  208. '{step.AcceptorOrgId}', '{step.AcceptorOrgName}', '{step.AcceptorOrgAreaCode}', '{step.AcceptorOrgAreaName}', '{step.AcceptTime.ToString()}', '{step.HandlerId}', '{step.HandlerName}', '{step.HandlerOrgId}',
  209. '{step.HandlerOrgIsCenter.ToString()}', '{step.HandlerOrgName}', '{step.HandlerOrgAreaCode}', '{step.HandlerOrgAreaName}', '{step.HandleTime.ToString()}', '{step.Name}', '', {(int)step.StepType}, {(int)step.BusinessType},
  210. 3, 'f', 0, 'f', '[]', 'f', 'f', '{step.Opinion}', '{step.StepExpiredTime.ToString()}',
  211. 'f', '{step.CreationTime.ToString()}', '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', {step.CreatorOrgLevel}, '{step.AreaId}', NULL, '[]',
  212. 'f', '{workflow.ModuleId}', '{workflow.ModuleName}', '{workflow.ModuleCode}', 0, '{step.ExternalId}', 1, '[]', '{step.PrevStepId}', NULL, 'f', 'f', '',
  213. 0, '[]', NULL, 'f', 'f', '', 0, NULL, NULL, 0,
  214. NULL, 0, NULL, NULL, NULL, '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', '{step.AssignerOrgIsCenter.ToString()}', NULL, 0,0);";
  215. traceSql = traceSql.Replace("'NULL'", "NULL");
  216. return traceSql;
  217. }
  218. }
  219. }