Workflow.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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)
  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<int?>("oldBmid").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.ExternalId = row["FSH_FlowID"].ToString();
  47. workflow.CreationTime = DateTime.Parse(stStep["FSH_AddDate"].ToString());
  48. if (creator != null)
  49. {
  50. workflow.CreatorId = creator["Id"].ToString();
  51. workflow.CreatorName = creator["Name"].ToString();
  52. }
  53. if (creatorOrg != null)
  54. {
  55. workflow.CreatorOrgId = creatorOrg["Id"].ToString();
  56. workflow.CreatorOrgName = creatorOrg["Name"].ToString();
  57. workflow.CreatorOrgLevel = int.Parse(creatorOrg["Level"].ToString());
  58. workflow.AreaId = creatorOrg["AreaId"].ToString();
  59. //workflow.AssignerOrgIsCenter = bool.Parse(creatorOrg["IsCenter"].ToString());
  60. }
  61. if (workflow.ModuleCode == "OrderHandle")
  62. {
  63. workflow.FlowType = EFlowType.Handle;
  64. workflow.ReviewResult = EReviewResult.Unknown;
  65. }
  66. else {
  67. workflow.FlowType = EFlowType.Handle;
  68. workflow.ReviewResult = EReviewResult.Approval;
  69. }
  70. var order = 1;
  71. foreach (DataRow item in data.Rows) {
  72. var start = order == 1;
  73. var end = order == data.Rows.Count;
  74. var stepSql = GetWorkflowStepSql(item, org, user, start, end, ref workflow);
  75. pgSql += stepSql ;
  76. order++;
  77. }
  78. var sql = $@"INSERT INTO ""public"".""workflow"" (""Id"", ""DefinitionId"", ""ModuleId"", ""ModuleName"", ""ModuleCode"", ""Title"", ""Status"",
  79. ""ActualOpinion"", ""IsInCountersign"", ""AllDuration"", ""ExternalId"", ""HandlerUsers"", ""HandlerOrgs"", ""FlowedOrgIds"", ""FlowedUserIds"", ""CreationTime"",
  80. ""CreatorId"", ""CreatorName"", ""CreatorOrgId"", ""CreatorOrgName"", ""CreatorOrgLevel"", ""AreaId"", ""FlowType"", ""ReviewResult"")
  81. VALUES ('{workflow.Id}', '{workflow.DefinitionId}', '{workflow.ModuleId}', '{workflow.ModuleName}', '{workflow.ModuleCode}', '{workflow.Title}', 20,
  82. '{workflow.ActualOpinion}', 'f', '0', '{workflow.ExternalId}', '[]', '[]', '[]', '[]', '{workflow.CreationTime.ToString()}',
  83. '{workflow.CreatorId}', '{workflow.CreatorName}', '{workflow.CreatorOrgId}', '{workflow.CreatorOrgName}', {workflow.CreatorOrgLevel}, '{workflow.AreaId}', {(int)workflow.FlowType}, {(int)workflow.ReviewResult});";
  84. return pgSql;
  85. }
  86. /// <summary>
  87. /// 生成流程
  88. /// </summary>
  89. /// <param name="item"></param>
  90. /// <param name="org"></param>
  91. /// <param name="user"></param>
  92. /// <param name="start"></param>
  93. /// <param name="end"></param>
  94. /// <param name="workflow"></param>
  95. /// <returns></returns>
  96. private string GetWorkflowStepSql(DataRow item, DataTable org, DataTable user,bool start,bool end, ref Entity.Workflow workflow) {
  97. //Acceptor
  98. var acceptor = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == item["FTRB_APUserID"].ToString());
  99. var acceptorOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldBmid").ToString() == item["FTRB_APBMID"].ToString());
  100. //Handler
  101. var handler = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == item["FTRB_UserID"].ToString());
  102. var handlerOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldBmid").ToString() == handler["OrgId"].ToString());
  103. //Creator
  104. var creator = user.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldUserId").ToString() == item["FTRB_MoveUserID"].ToString());
  105. var creatorOrg = org.AsEnumerable().FirstOrDefault(x => x.Field<int?>("oldBmid").ToString() == creator["OrgId"].ToString());
  106. var step = new Entity.WorkflowStep();
  107. step.InitId();
  108. step.PrevStepId = item["FTRB_PRunID"].ToString();
  109. step.PrevStepCode = string.Empty;
  110. step.AcceptorId = item["FTRB_APUserID"].ToString();
  111. if (acceptor != null) {
  112. step.AcceptorId = acceptor["Id"].ToString();
  113. step.AcceptorName = acceptor["Name"].ToString();
  114. }
  115. step.AcceptorOrgId = item["FTRB_APBMID"].ToString();
  116. if (acceptorOrg != null) {
  117. step.AcceptorOrgId = acceptorOrg["Id"].ToString();
  118. step.AcceptorOrgName = acceptorOrg["Name"].ToString();
  119. step.AcceptorOrgAreaCode = acceptorOrg["AreaCode"].ToString();
  120. step.AcceptorOrgAreaName = acceptorOrg["AreaName"].ToString();
  121. }
  122. step.AcceptTime = DateTime.Parse(item["FTRB_APDate"].ToString());
  123. step.HandlerId = item["FTRB_UserID"].ToString();
  124. if (handler != null)
  125. {
  126. step.HandlerId = handler["Id"].ToString();
  127. step.HandlerName = handler["Name"].ToString();
  128. }
  129. if (handlerOrg != null)
  130. {
  131. step.HandlerOrgId = handlerOrg["Id"].ToString();
  132. step.HandlerOrgName = handlerOrg["Name"].ToString();
  133. step.HandlerOrgAreaCode = handlerOrg["AreaCode"].ToString();
  134. step.HandlerOrgAreaName = handlerOrg["AreaName"].ToString();
  135. step.HandlerOrgIsCenter =bool.Parse(handlerOrg["IsCenter"].ToString());
  136. }
  137. step.HandleTime = DateTime.Parse(item["FTRB_DisposeDate"].ToString());
  138. step.Name = item["FTRB_ItemName"].ToString();
  139. step.StepType = start ? Enum.EStepType.Start : end ? Enum.EStepType.End : Enum.EStepType.Normal;
  140. step.BusinessType = item["FTRB_ItemName"].ToString().Contains("话务") ? EBusinessType.Seat : item["FTRB_ItemName"].ToString().Contains("派单") ? EBusinessType.Send :
  141. item["FTRB_ItemName"].ToString().Contains("结束") || item["FTRB_ItemName"].ToString().Contains("发布") || item["FTRB_ItemName"].ToString().Contains("回访") ? EBusinessType.File : EBusinessType.Department;
  142. step.Opinion = item["FTRB_RRemark"].ToString();
  143. step.StepExpiredTime = DateTime.Parse(item["FTRB_TTime"].ToString());
  144. step.CreationTime = DateTime.Parse(item["FTRB_MoveDate"].ToString());
  145. step.CreatorId = item["FTRB_MoveUserID"].ToString();
  146. if (creator != null )
  147. {
  148. step.CreatorId = creator["Id"].ToString();
  149. step.CreatorName = creator["Name"].ToString();
  150. }
  151. if (creatorOrg != null)
  152. {
  153. step.CreatorOrgId = creatorOrg["Id"].ToString();
  154. step.CreatorOrgName = creatorOrg["Name"].ToString();
  155. step.CreatorOrgLevel =int.Parse(creatorOrg["Level"].ToString());
  156. step.AreaId = creatorOrg["AreaId"].ToString();
  157. step.AssignerOrgIsCenter = bool.Parse(creatorOrg["IsCenter"].ToString());
  158. }
  159. step.ExternalId = workflow.ExternalId;
  160. var stepSql = $@"INSERT INTO ""public"".""workflow_step"" (
  161. ""Id"", ""NextSteps"", ""PrevStepId"", ""PrevStepCode"", ""IsMain"", ""Status"", ""IsOrigin"", ""CountersignId"",""CountersignPosition"",
  162. ""IsStartedCountersignEnd"", ""StartCountersignId"", ""IsCountersignEndStep"", ""CountersignStartStepId"", ""WorkflowId"", ""FlowAssignType"", ""Handlers"", ""PrevChosenStepCode"",
  163. ""AcceptorId"", ""AcceptorName"", ""AcceptorOrgId"", ""AcceptorOrgName"", ""AcceptorOrgAreaCode"", ""AcceptorOrgAreaName"", ""AcceptTime"", ""HandlerId"", ""HandlerName"", ""HandlerOrgId"",
  164. ""HandlerOrgIsCenter"", ""HandlerOrgName"", ""HandlerOrgAreaCode"", ""HandlerOrgAreaName"", ""HandleTime"", ""Name"", ""Code"", ""StepType"",
  165. ""BusinessType"", ""HandlerType"", ""CanReject"",""ExecuteMode"", ""CanStartCountersign"", ""NextHandlers"", ""BackToCountersignEnd"", ""IsSms"", ""Opinion"", ""StepExpiredTime"",
  166. ""IsStartCountersign"", ""CreationTime"", ""CreatorId"", ""CreatorName"", ""CreatorOrgId"", ""CreatorOrgName"", ""CreatorOrgLevel"", ""AreaId"", ""FlowDirection"", ""FileJson"",
  167. ""IsActualHandled"", ""ModuleId"", ""ModuleName"", ""ModuleCode"", ""ExpiredStatus"", ""CountersignSteps"", ""ExternalId"", ""PrevStepName"", ""AssignerId"", ""AssignerName"", ""AssignerOrgId"", ""AssignerOrgName"", ""AssignerOrgIsCenter"", ""HandleMode"", ""ReviewResult"")
  168. VALUES ('{step.Id}', '[]', '{step.PrevStepId}', '{step.PrevStepCode}', 'f', 2, 'f', NULL, 0,
  169. 'f', NULL, 'f', NULL, '{workflow.Id}', 1, '[]', NULL,
  170. '{step.AcceptorId}', '{step.AcceptorName}', '{step.AcceptorOrgId}', '{step.AcceptorOrgName}', '{step.AcceptorOrgAreaCode}', '{step.AcceptorOrgAreaName}', '{step.AcceptTime.ToString()}', '{step.HandlerId}', '{step.HandlerName}', '{step.HandlerOrgId}',
  171. '{step.HandlerOrgIsCenter.ToString()}', '{step.HandlerOrgName}', {step.HandlerOrgAreaCode}, '{step.HandlerOrgAreaName}', '{step.HandleTime.ToString()}', '{step.Name}', '', {(int)step.StepType},
  172. {(int)step.BusinessType}, 3, 'f', 0, 'f', '[]', 'f', 'f', '{step.Opinion}', '{step.StepExpiredTime.ToString()}',
  173. 'f', '{step.CreationTime.ToString()}', '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', {step.CreatorOrgLevel}, '{step.AreaId}', NULL, NULL,
  174. 'f', '08db8db3-eea4-4737-88dd-6c7b990c7705', '工单办理', 'OrderHandle', 0, '[]', '{step.ExternalId}', '', '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', '{step.AssignerOrgIsCenter.ToString()}', 0, 0);";
  175. var traceSql = GetWorkflowTraceSql(item, step, org, user, start, end, ref workflow);
  176. return stepSql + traceSql;
  177. }
  178. /// <summary>
  179. /// 生成快照
  180. /// </summary>
  181. /// <param name="item"></param>
  182. /// <param name="step"></param>
  183. /// <param name="org"></param>
  184. /// <param name="user"></param>
  185. /// <param name="start"></param>
  186. /// <param name="end"></param>
  187. /// <param name="workflow"></param>
  188. /// <returns></returns>
  189. private string GetWorkflowTraceSql(DataRow item, Entity.WorkflowStep step , DataTable org, DataTable user, bool start, bool end, ref Entity.Workflow workflow)
  190. {
  191. var trace = new Entity.WorkflowTrace();
  192. trace.InitId();
  193. var traceSql = $@"INSERT INTO ""public"".""workflow_trace"" (""Id"", ""StepId"", ""Status"", ""ParentId"", ""WorkflowId"", ""FlowAssignType"", ""Handlers"", ""PrevChosenStepCode"", ""AcceptorId"", ""AcceptorName"",
  194. ""AcceptorOrgId"", ""AcceptorOrgName"", ""AcceptorOrgAreaCode"", ""AcceptorOrgAreaName"", ""AcceptTime"", ""HandlerId"", ""HandlerName"", ""HandlerOrgId"",
  195. ""HandlerOrgIsCenter"", ""HandlerOrgName"",""HandlerOrgAreaCode"", ""HandlerOrgAreaName"", ""HandleTime"", ""Name"", ""Code"", ""StepType"", ""BusinessType"",
  196. ""HandlerType"", ""CanReject"", ""ExecuteMode"", ""CanStartCountersign"", ""NextHandlers"", ""BackToCountersignEnd"", ""IsSms"", ""Opinion"", ""StepExpiredTime"",
  197. ""IsStartCountersign"", ""CreationTime"", ""CreatorId"", ""CreatorName"", ""CreatorOrgId"", ""CreatorOrgName"", ""CreatorOrgLevel"", ""AreaId"", ""FlowDirection"", ""FileJson"",
  198. ""IsActualHandled"", ""ModuleId"", ""ModuleName"", ""ModuleCode"", ""ExpiredStatus"", ""ExternalId"", ""TraceType"", ""NextSteps"", ""PrevStepId"", ""PrevStepCode"", ""IsMain"", ""IsOrigin"", ""CountersignId"",
  199. ""CountersignPosition"", ""CountersignSteps"", ""StartCountersignId"", ""IsStartedCountersignEnd"", ""IsCountersignEndStep"", ""CountersignStartStepId"", ""SendHandleTimes"", ""RoleId"", ""RoleName"", ""TraceState"",
  200. ""Remark"", ""TraceStyle"", ""OrderPublishId"", ""OrderVisitId"", ""PrevStepName"", ""AssignerId"", ""AssignerName"", ""AssignerOrgId"", ""AssignerOrgName"", ""AssignerOrgIsCenter"", ""HandleMode"", ""ReviewResult"")
  201. VALUES ('{trace}', '{step}', 2, NULL, '{workflow.Id}', 1, '[]', NULL, '{step.AcceptorId}', '{step.AcceptorName}',
  202. '{step.AcceptorOrgId}', '{step.AcceptorOrgName}', '{step.AcceptorOrgAreaCode}', '{step.AcceptorOrgAreaName}', '{step.AcceptTime.ToString()}', '{step.HandlerId}', '{step.HandlerName}', '{step.HandlerOrgId}',
  203. '{step.HandlerOrgIsCenter.ToString()}', '{step.HandlerOrgName}', '{step.HandlerOrgAreaCode}', '{step.HandlerOrgAreaName}', '{step.HandleTime.ToString()}', '{step.Name}', '', {(int)step.StepType}, {(int)step.BusinessType},
  204. 3, 'f', 0, 'f', '[]', 'f', 'f', '{step.Opinion}', '{step.StepExpiredTime.ToString()}',
  205. 'f', '{step.CreationTime.ToString()}', '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', {step.CreatorOrgLevel}, '{step.AreaId}', NULL, '[]',
  206. 'f', '08db8db3-eea4-4737-88dd-6c7b990c7705', '工单办理', 'OrderHandle', 0, '{step.ExternalId}', 1, '[]', '{step.PrevStepId}', NULL, 'f', 'f', '',
  207. 0, '[]', NULL, 'f', 'f', '', 0, NULL, NULL, 0,
  208. NULL, 0, NULL, NULL, NULL, '{step.CreatorId}', '{step.CreatorName}', '{step.CreatorOrgId}', '{step.CreatorOrgName}', '{step.AssignerOrgIsCenter.ToString()}', NULL, 0);";
  209. return traceSql;
  210. }
  211. }
  212. }