Workflow.cs 16 KB

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