Workflow.cs 17 KB

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