OrderSnapshotApplication.cs 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. using Abp;
  2. using DataTransmission.Joint;
  3. using Hotline.Settings;
  4. using Mapster;
  5. using Mapster.Utils;
  6. using Microsoft.VisualBasic.ApplicationServices;
  7. using SnapshotWinFormsApp.Application.Dtos;
  8. using SnapshotWinFormsApp.Application.Interfaces;
  9. using SnapshotWinFormsApp.Entities.NewHotline;
  10. using SnapshotWinFormsApp.Entities.OldHotline;
  11. using SnapshotWinFormsApp.Repository;
  12. using SnapshotWinFormsApp.Repository.Enum;
  13. using SnapshotWinFormsApp.Repository.Interfaces;
  14. using SnapshotWinFormsApp.Tools;
  15. using SqlSugar;
  16. using SqlSugar.Extensions;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.ComponentModel;
  20. using System.Data;
  21. using System.Linq;
  22. using System.Reflection.Metadata.Ecma335;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using static System.Net.WebRequestMethods;
  26. using Order = SnapshotWinFormsApp.Entities.NewHotline.Order;
  27. using Workflow = SnapshotWinFormsApp.Entities.NewHotline.Workflow;
  28. using User = SnapshotWinFormsApp.Entities.NewHotline.User;
  29. using Abp.Extensions;
  30. using DataTransmission.Enum;
  31. using Kv = SnapshotWinFormsApp.Entities.NewHotline.Kv;
  32. using System.Diagnostics;
  33. using Microsoft.VisualBasic.Logging;
  34. using System.Drawing.Drawing2D;
  35. using System.Linq.Dynamic.Core.Tokenizer;
  36. namespace SnapshotWinFormsApp.Application;
  37. [Description("随手拍工单")]
  38. public class OrderSnapshotApplication : ImportApplicationBase<OrderFullEntity, Order>, IImportApplication
  39. {
  40. private readonly ITargetRepository<OrderSnapshot> _orderSnapshotRepo;
  41. private readonly ISourceRepository<Flow03_SearchEntity> _oldOrderRepo;
  42. private DataTransmission.Entity.Config config = new DataTransmission.Entity.Config();
  43. private readonly ITargetRepository<Citizen> _snapshotUserInfoRepo;
  44. private readonly ISelectRepository<Industry> _industryRepo;
  45. private readonly List<Industry> industries;
  46. private readonly ITargetRepository<CommunityInfo> _communityInfoRepo;
  47. private readonly List<CommunityInfo> communityInfos;
  48. private readonly ISelectRepository<User> _userRepo;
  49. private List<User> Users;
  50. private readonly ISelectRepository<SystemDicData> _systemDicDataRepo;
  51. private readonly List<SystemDicData> snapshotOrderLabels;
  52. private readonly List<SystemDicData> VisitSatisfaction;
  53. private readonly List<SystemDicData> DissatisfiedReason;
  54. private IList<ThirdAccount> ThirdAccounts;
  55. private readonly ISelectRepository<SelectOrderNo> OrderRepository;
  56. private readonly IList<SelectOrderNo> OrderNos;
  57. private readonly CreateInstanceInDto _inDto;
  58. private readonly IList<SystemOrganize> Organizers;
  59. private readonly ISourceRepository<Flow_Transfer01_RunBackups> _flowTransfer01RunBackupsRepository;
  60. private readonly ISelectRepository<WorkflowModule> _workflowModuleRepository;
  61. private readonly IList<WorkflowModule> WorkflowModules;
  62. private readonly ITargetRepository<WorkflowStep> _workflowStepRepository;
  63. private readonly ITargetRepository<Workflow> _workflowRepository;
  64. private readonly ITargetRepository<WorkflowTrace> _workflowTraceRepository;
  65. private readonly ISourceRepository<Flow16_PubIdeaEntity> _flow16PubIdeaRepository;
  66. private readonly ITargetRepository<OrderPublish> _orderPublishRepository;
  67. private readonly ISourceRepository<Flow18_AppraiseListEntity> _flow18AppraiseListRepository;
  68. private readonly ITargetRepository<OrderVisit> _orderVisitRepository;
  69. private readonly ITargetRepository<OrderVisitDetail> _orderVisitDetailRepository;
  70. private readonly ISourceRepository<Flow11_PostponeEntity> _flow11PostponeRepository;
  71. private readonly ITargetRepository<OrderDelay> _orderDelayRepository;
  72. private readonly ISelectRepository<IndustryCase> _industryCaseRepository;
  73. private readonly IList<IndustryCase> IndustryCase;
  74. private readonly ITargetRepository<SnapshotPointsRecord> _pointsRecordRepository;
  75. private readonly SnapshotUserInfoApplication _snapshotUserInfoApplication;
  76. public OrderSnapshotApplication(CreateInstanceInDto inDto) : base(inDto)
  77. {
  78. _inDto = inDto;
  79. StringConsts.BlukCount = 50;
  80. _orderSnapshotRepo = new TargetRepository<OrderSnapshot>(inDto);
  81. _oldOrderRepo = new SourceRepository<Flow03_SearchEntity>(inDto);
  82. _snapshotUserInfoRepo = new TargetRepository<Citizen>(inDto);
  83. _industryRepo = new SelectRepository<Industry>(inDto);
  84. industries = _industryRepo.Queryable().ToList();
  85. _communityInfoRepo = new TargetRepository<CommunityInfo>(inDto);
  86. communityInfos = _communityInfoRepo.Queryable().ToList();
  87. _userRepo = new SelectRepository<Entities.NewHotline.User>(inDto);
  88. Users = _userRepo.Queryable().ToList();
  89. _systemDicDataRepo = new SelectRepository<SystemDicData>(inDto);
  90. snapshotOrderLabels = _systemDicDataRepo.Queryable().Where(m => m.DicTypeCode == "SnapshotOrderLabel").ToList();
  91. VisitSatisfaction = _systemDicDataRepo.Queryable().Where(m => m.DicTypeCode == "VisitSatisfaction").ToList();
  92. DissatisfiedReason = _systemDicDataRepo.Queryable().Where(m => m.DicTypeCode == "DissatisfiedReason").ToList();
  93. ThirdAccounts = new TargetRepository<ThirdAccount>(inDto).Queryable().ToList();
  94. OrderRepository = new SelectRepository<SelectOrderNo>(inDto);
  95. OrderNos = OrderRepository.Queryable().Where(m => m.CreationTime >= inDto.StartTime && m.CreationTime <= inDto.EndTime).ToList();
  96. Organizers = new SelectRepository<SystemOrganize>(inDto).Queryable().ToList();
  97. _flowTransfer01RunBackupsRepository = new SourceRepository<Flow_Transfer01_RunBackups>(inDto);
  98. _workflowModuleRepository = new SelectRepository<WorkflowModule>(inDto);
  99. WorkflowModules = _workflowModuleRepository.Queryable().ToList();
  100. _workflowStepRepository = new TargetRepository<WorkflowStep>(inDto);
  101. _workflowRepository = new TargetRepository<Workflow>(inDto);
  102. _workflowTraceRepository = new TargetRepository<WorkflowTrace>(inDto);
  103. _flow16PubIdeaRepository = new SourceRepository<Flow16_PubIdeaEntity>(inDto);
  104. _orderPublishRepository = new TargetRepository<OrderPublish>(inDto);
  105. _flow18AppraiseListRepository = new SourceRepository<Flow18_AppraiseListEntity>(inDto);
  106. _orderVisitRepository = new TargetRepository<OrderVisit>(inDto);
  107. _orderVisitDetailRepository = new TargetRepository<OrderVisitDetail>(inDto);
  108. _flow11PostponeRepository = new SourceRepository<Flow11_PostponeEntity>(inDto);
  109. _orderDelayRepository = new TargetRepository<OrderDelay>(inDto);
  110. _industryCaseRepository = new SelectRepository<IndustryCase>(inDto);
  111. IndustryCase = _industryCaseRepository.Queryable().ToList();
  112. _pointsRecordRepository = new TargetRepository<SnapshotPointsRecord>(inDto);
  113. _snapshotUserInfoApplication = new SnapshotUserInfoApplication(inDto);
  114. config.Name = "自贡市";
  115. config.CenterId = "2";
  116. config.Paseword = "AQAAAAIAAYagAAAAEJZNauXWsvzHDvSCLEwNjA3qVJcQqEHAexlWDg6ONJJtK5hDNnL8gwwXxwZW5YszfA==";
  117. config.ModuleId = "2430d69a-59df-46a1-b155-85e69cfba010";
  118. }
  119. public override ISugarQueryable<OrderFullEntity> GetSourceList(string key = "")
  120. {
  121. var dto = GetOrderSql(this._inDto);
  122. return _sourceRepo.GetBySql(dto.sql).AddParameters(dto.parameters);
  123. }
  124. public override async Task<bool> HasOldDataAsync(OrderFullEntity item, CancellationToken token)
  125. {
  126. return OrderNos.Any(m => m.No == item.Id);
  127. }
  128. public override async Task<Order> GetTargetAsync(OrderFullEntity source, CancellationToken token)
  129. {
  130. var ActualHandleOrgCode = source.FSH_AcceptBMID.Trim();
  131. try
  132. {
  133. var orgRow = Organizers.First(x => x.oldBmid.ToString() == source.FSH_AcceptBMID.Trim());
  134. ActualHandleOrgCode = string.IsNullOrEmpty(orgRow.Id) ? "NULL" : orgRow.Id;
  135. }
  136. catch (Exception e)
  137. {
  138. Logs.Err($"{source.Id} 缺少部门数据: oldBmid [{source.FSH_AcceptBMID}]");
  139. return null;
  140. }
  141. var order = new Order();
  142. order.CallId = source.FSH_SessionID.Trim();
  143. if (order.CallId == "0")
  144. {
  145. order.CallId = null;
  146. }
  147. order.FromPhone = source.FSH_LinkTel.Trim();
  148. order.TransferPhone = source.FSH_HotlineNum.Trim();
  149. order.FromName = source.FSH_LinkName.Trim();
  150. order.FromGender = source.FLM_LKSex.Trim() == "1" ? 1 : source.FLM_LKSex.Trim() == "2" ? 0 : 2;
  151. order.IdentityType = source.FSH_PersonnelType.Trim() == "企业" ? 2 : 1;
  152. order.Contact = source.FSH_LinkTel.Trim();
  153. order.ContactMask = source.FSH_LinkTel.Trim().MaskPhoneNumber();
  154. order.AcceptSms = false;
  155. order.OldId = source.Id.Trim();
  156. order.AcceptType = source.FSH_PurTypeName.Trim();
  157. order.Title = source.FSH_Title_ys.Trim();
  158. order.HotspotId = source.FTE_ProvinceCode.Trim();
  159. order.HotspotName = source.FTE_TypeName.Trim();
  160. order.HotspotSpliceName = source.FTE_TypeNameFull.Trim();
  161. order.PushTypeCode = source.FSH_PushType.Trim();
  162. order.Content = source.受理内容;
  163. order.Status = DataTransmission.Enum.EOrderStatus.Visited;
  164. order.StartTime = string.IsNullOrEmpty(source.FSH_AddDate) ? null : Convert.ToDateTime(source.FSH_AddDate);
  165. order.ExpiredTime = string.IsNullOrEmpty(source.FSH_TTime) ? null : Convert.ToDateTime(source.FSH_TTime);
  166. order.FiledTime = string.IsNullOrEmpty(source.FSH_DisposeDate) ? null : Convert.ToDateTime(source.FSH_DisposeDate);
  167. order.ExpiredStatus = source.FSH_OverTimeState.Trim() == "正常" ? 0 : source.FSH_OverTimeState.Trim() == "即将超期" ? 1 : 2;
  168. order.AreaCode = source.SA_AreaCode.Trim();
  169. order.Street = source.FLM_LKAddress.Trim();
  170. order.ActualHandleTime = source.FSH_DisposeDate.ObjToDate();
  171. order.ActualHandleStepAcceptTime = order.ActualHandleTime;
  172. order.IsDeleted = false;
  173. order.CreationTime = source.FSH_AddDate.ObjToDate();
  174. order.SmsSended = false;
  175. order.ProcessType = source.FSH_AcceptBMID.Trim() == config.CenterId ? 10 : 20;
  176. if (config.Name == "自贡市")
  177. {
  178. order.Province = "四川省";
  179. order.City = "自贡市";
  180. order.IsPublicity = false;
  181. }
  182. else
  183. {
  184. order.IsPublicity = source.FSH_IsPublic == "1"; //0:不公开 ;1:公开 12345在线传递过来的状态
  185. }
  186. var oneOrg = Organizers.FirstOrDefault(m => m.oldBmid == source.OneOrgId);
  187. if (oneOrg != null)
  188. {
  189. order.OrgLevelOneName = oneOrg.Name;
  190. order.OrgLevelOneCode = oneOrg.Id;
  191. }
  192. order.IsSecret = source.FLM_SFlag == "1";
  193. order.ActualHandleOrgName = source.FSH_AcceptName.Trim();
  194. order.ActualHandleOrgCode = ActualHandleOrgCode;
  195. order.ActualOpinion = source.承办意见;
  196. order.SourceChannel = source.FSH_FromName;
  197. order.IsProvince = !(source.RCI_FlowID == "NULL");
  198. var acceptor = Users.FirstOrDefault(x => x.OldUserId.ToString() == source.FTRB_APUserID);
  199. SystemOrganize acceptorOrg = null;
  200. if (acceptor != null)
  201. {
  202. acceptorOrg = Organizers.FirstOrDefault(x => x.oldBmid.ToString() == acceptor.OrgId);
  203. }
  204. order.AcceptorId = source.FSH_CreateUserID;
  205. if (acceptor != null)
  206. {
  207. order.AcceptorId = acceptor.Id.ToString();
  208. order.AcceptorName = acceptor.Name.ToString();
  209. }
  210. order.AcceptorName = source.FSH_UserName;
  211. order.SourceChannelCode = source.FFM_ProFromCode.Trim() switch
  212. {
  213. "SJP" => "ZGSSP",
  214. _ => source.FFM_ProFromCode
  215. };
  216. order.ActualHandleOrgAreaCode = source.SA_AreaCode.Trim();
  217. order.ActualHandleOrgAreaName = source.SA_AreaName.Trim();
  218. order.CallAddress = source.FLM_LKAddress;
  219. order.TimeLimitCount = source.FTRB_TLimits.ObjToInt();
  220. order.TimeLimit = order.TimeLimitCount + "个工作日";
  221. order.AcceptTypeCode = GetAcceptTypeCode(source.FSH_PurTypeName.Trim());
  222. order.NearlyExpiredTime = string.IsNullOrEmpty(source.FSH_EightyTTime) ? null : source.FSH_EightyTTime.ObjToDate();
  223. order.Password = source.FED_ReultPWD.Trim();
  224. order.ProvinceNo = source.FSH_ProCode;
  225. order.IsUrgent = source.FSH_Urgent.Trim() == "1";
  226. order.OldOrderId = source.FSH_FlowID;
  227. order.CreatorId = await GetUserIdByOpenIdAsync(null, source.WFAT_WXOpenid, order.OldId, token);
  228. order.FileOpinion = source.FTRB_RRemark;
  229. order.CurrentStepName = source.FSH_ItemName;
  230. order.InitId();
  231. order.County = source.FSH_AreaName; // 自流井区
  232. //order.Town = ""; // 丹桂街道
  233. return order;
  234. }
  235. public override async Task<bool> InsertBeforAsync(Action<string> log, OrderFullEntity item, Order target, bool isEnd, CancellationToken token)
  236. {
  237. return await InsertWorkflowAsync(item, target, isEnd, token);
  238. }
  239. public override async Task InsertAfterAsync(Action<string> log, OrderFullEntity item, Order target, bool isEnd, CancellationToken token)
  240. {
  241. await InsertSnapshotAsync(item, target.Id, isEnd, token);
  242. await InsertVisitAsync(item.FSH_FlowID, target, isEnd, token);
  243. await InsertPublishAsync(item.FSH_FlowID, target.Id, isEnd, token);
  244. await InsertDelayAsync(item, target, isEnd, token);
  245. await InsertPointsAsync(log, item, target, isEnd, token);
  246. }
  247. public override async Task SubmitBluk()
  248. {
  249. _workflowRepository.SubmitBluk();
  250. _workflowStepRepository.SubmitBluk();
  251. _workflowTraceRepository.SubmitBluk();
  252. _orderSnapshotRepo.SubmitBluk();
  253. _orderPublishRepository.SubmitBluk();
  254. _orderVisitRepository.SubmitBluk();
  255. _orderVisitDetailRepository.SubmitBluk();
  256. _orderDelayRepository.SubmitBluk();
  257. _pointsRecordRepository.SubmitBluk();
  258. await Task.FromResult(0);
  259. }
  260. public override async Task EndTaskAsync(Action<string> log, CancellationToken token)
  261. {
  262. _pointsRecordRepository.SubmitBluk();
  263. }
  264. public async Task InsertSnapshotAsync(OrderFullEntity order, string orderId, bool isEnd, CancellationToken token)
  265. {
  266. var userId = _snapshotUserInfoRepo.Queryable().Where(m => m.PhoneNumber == order.FSH_LinkTel).Select(m => m.Id).First();
  267. var industryId = industries.FirstOrDefault(m => m.Name == order.FSH_IndustryName)?.Id;
  268. var community = communityInfos.FirstOrDefault(m => m.Id == order.FSH_SSPAreaID);
  269. var snapshot = new OrderSnapshot();
  270. snapshot.Id = orderId;
  271. snapshot.IndustryId = industryId;
  272. snapshot.IndustryName = order.FSH_IndustryName;
  273. var industryCase = IndustryCase.FirstOrDefault(m => m.Name.Trim() == order.SIC_Name?.Trim());
  274. if (industryCase != null)
  275. {
  276. snapshot.IndustryCase = industryCase.Id;
  277. }
  278. snapshot.CommunityId = order.FSH_SSPAreaID;
  279. snapshot.CommunityName = community?.Name;
  280. snapshot.CommunityFullName = community?.FullName;
  281. snapshot.JobType = order.WEA_OperationType == null ? null : order.WEA_OperationType.Trim() == "电焊" ? 0 : 1;
  282. snapshot.JobTypeName = order.WEA_OperationType == null ? null : order.WEA_OperationType;
  283. snapshot.BusinessUnitType = order.WEA_CompanyType; // 经营单位类别
  284. snapshot.Workplace = order.WEA_OperationPlace; // 作业场所
  285. snapshot.WorkplaceName = order.WEA_PlaceTypeName; // 场所名称(多个场所使用 - 连接)
  286. snapshot.WorkArea = order.WEA_AreaFullName; // 作业区域
  287. snapshot.WorkAreaId = order.WEA_AreaID; // 作业区域Id
  288. snapshot.StartWorkTime = order.WEA_OperationStartTime.ObjToDate(); // 作业时间
  289. snapshot.EndWorkTime = order.WEA_OperationEndTime.ObjToDate(); // 作业时间
  290. snapshot.IsEmphasis = false; // 是否重点
  291. snapshot.IsSafetyDepartment = order.STL_TagType.IsNullOrTarget("1"); // 部门标记是否安全生产
  292. snapshot.SignUserId = GetUserId(order.STL_AddUserID); // 标记人
  293. snapshot.SignUserName = order.STL_UserName; // 标记人
  294. snapshot.SignTime = order.STL_AddDate.ObjToDate(); // 标记时间
  295. snapshot.SignRemark = order.STL_TagRemark; // 标记备注
  296. snapshot.IsDangerDepartment = order.FSH_ReplyIsBMTrue.IsNullOrTarget("1"); // 部门是否存在安全隐患
  297. snapshot.IsTruthDepartment = order.FSH_ReplyIsBMTrue.IsNullOrTarget("1"); // 部门是否属实
  298. snapshot.IsRectifyDepartment = order.FSH_IsRectification.IsNullOrTarget("1"); // 部门是否整改
  299. snapshot.IndustryCase = order.FSH_IndustryIDType; // 线索分类
  300. snapshot.IsAppOpened = false; // 小程序公开
  301. snapshot.LabelName = order.SWLS_TypeName_All; // 工单标签(多个使用 | 分隔)
  302. snapshot.LabelUserName = GetUserName(order.SWLS_AddUserID); // 标签用户
  303. snapshot.LabelUserId = GetUserId(order.SWLS_AddUserID); // 标签用户Id
  304. snapshot.LabelTime = order.SWLS_AddDate.ObjToDate(); // 标签时间
  305. snapshot.IsAward = null; // 是否申请追加奖励
  306. snapshot.AwardOpenBank = null; // 追加奖励人开户银行
  307. snapshot.AwardName = null; // 追加奖励人姓名
  308. snapshot.AwardBankCardNo = null; // 追加奖励人银行卡号
  309. snapshot.AwardAmount = null; // 追加奖励金额(元)
  310. snapshot.ReplenishTypeId = null; // 补充奖励类型
  311. snapshot.ReplenishTypeName = null; // 补充奖励类型
  312. snapshot.VerifyType = null; // 核实方式
  313. snapshot.IsCheckList = order.FSH_Checklist.ObjToBool(); // 是否按清单检查
  314. snapshot.GuiderAccLog = null; // 网格员系统交互日志
  315. snapshot.DeadLine = null; // 网格员回复截止日期
  316. snapshot.NetworkENumber = order.FSH_SSPCode; // 网格E通编号
  317. snapshot.IsTruth = order.FPC_ISTrue.IsNullOrTarget("1"); // 网格员是否属实
  318. snapshot.IsRepetition = order.isRepeat.IsNullOrTarget("1"); // 是否重复
  319. snapshot.IsDanger = order.isHiddenDanger.IsNullOrTarget("1"); // 是否隐患
  320. snapshot.NetworkRemark = order.FPC_Content; // 网格员回复内容
  321. snapshot.ReplyDate = order.FPC_AcceptDate.ObjToDate(); // 网格员办理时间
  322. snapshot.MemberName = order.memberName; // 网格员姓名
  323. snapshot.MemberMobile = order.memberMobile; // 网格员电话
  324. snapshot.ReplyUserName = null; // 办理人账号
  325. snapshot.ReplyBMName = null; // 办理部门
  326. snapshot.ReplyResultType = order.FPC_ResultType.ObjToInt(); // 网格员办理状态
  327. snapshot.CompanyName = null; // 购气单位/个人名称
  328. snapshot.SendGuidSystemTime = order.FPC_AcceptDate.ObjToDate(); // 发送网格员系统时间
  329. snapshot.GuidSystemCallBackTime = order.FPC_InsertDate.ObjToDate(); // 网格员系统回调时间
  330. snapshot.IsGuidSystemCallBack = order.FPC_ID != null; // 网格员系统是否回调
  331. snapshot.SpecialReasonId = null; // 重办原因Id
  332. snapshot.SpecialReasonName = null; // 重办原因
  333. var typeName = order.SWLS_TypeName;
  334. if (typeName.NotNullOrEmpty())
  335. {
  336. var labelId = snapshotOrderLabels.Where(m => m.DicDataName == typeName).FirstOrDefault();
  337. var labels = new Kv { Key = labelId.DicDataValue, Value = labelId.DicDataName };
  338. snapshot.Labels = new List<Kv> { labels };
  339. }
  340. if (snapshot.NetworkENumber.NotNullOrEmpty())
  341. snapshot.IsDeal = true; // 网格员是否办理
  342. if (order.FSH_SSPAreaID.NotNullOrEmpty())
  343. {
  344. snapshot.CompliantType = order.FSH_Compliance?.Trim() switch
  345. {
  346. "1" => (ECompliantType?)ECompliantType.First,
  347. "2" => (ECompliantType?)ECompliantType.Second,
  348. "3" => (ECompliantType?)ECompliantType.Third,
  349. "0" => (ECompliantType?)ECompliantType.Not,
  350. _ => null,
  351. };
  352. }
  353. _orderSnapshotRepo.InsertBulk(snapshot, isEnd);
  354. }
  355. public async Task<bool> InsertWorkflowAsync(OrderFullEntity order, Order target, bool isEnd, CancellationToken token)
  356. {
  357. var workflowDtos = await GetWorkflow(order.FSH_FlowID, "CityHotline", token);
  358. var workflowEntities = workflowDtos.Adapt<List<Workflow>>();
  359. var module = WorkflowModules.First(x => x.Code == "OrderHandle");
  360. var startStep = workflowDtos.OrderBy(m => m.FTRB_RunID).First();
  361. var endStep = workflowDtos.OrderByDescending(m => m.FTRB_RunID).First();
  362. var actualStep = workflowDtos.First(m => m.FSH_AcceptBMID == m.FTRB_APBMID.ToString());
  363. if (order.FSH_AcceptBMID == config.CenterId)
  364. {
  365. actualStep = workflowDtos.FirstOrDefault(m => m.FSH_AcceptDate != null && m.FTRB_APDate != null && m.FSH_AcceptDate == m.FTRB_APDate);
  366. if (actualStep == null)
  367. actualStep = workflowDtos.First(m => m.FSH_AcceptBMID == m.FTRB_APBMID.ToString());
  368. }
  369. var creator = Users.FirstOrDefault(m => m.OldUserId == startStep.FTRB_MoveUserID);
  370. if (creator == null)
  371. {
  372. Users = _userRepo.Queryable().ToList();
  373. creator = Users.FirstOrDefault(m => m.OldUserId == startStep.FTRB_MoveUserID);
  374. Logs.Err($"{order.Id} 缺少User数据: UserId [{startStep.FTRB_MoveUserID}]");
  375. }
  376. var creatorOrg = Organizers.FirstOrDefault(m => m.Id == creator.OrgId);
  377. var workflow = workflowEntities.First();
  378. workflow.InitId();
  379. target.WorkflowId = workflow.Id;
  380. workflow.DefinitionId = module.DefinitionId;
  381. workflow.ModuleId = module.Id;
  382. workflow.ModuleCode = module.Code;
  383. workflow.ModuleName = module.Name;
  384. if (workflow.ModuleCode == "OrderDelay")
  385. {
  386. endStep = workflowDtos.OrderByDescending(m => m.FTRB_MoveDate).FirstOrDefault();
  387. actualStep = endStep;
  388. }
  389. workflow.EndTime = endStep.FTRB_DisposeDate.ObjToDate();
  390. workflow.ActualHandleStepCode = "";
  391. workflow.ActualHandleStepName = "";
  392. workflow.ActualHandleStepId = actualStep.FSH_RunID;
  393. workflow.ActualOpinion = actualStep.FTRB_RRemark;
  394. workflow.CreationTime = startStep.FSH_AddDate.ObjToDate();
  395. if (creator != null)
  396. {
  397. workflow.CreatorId = creator.Id;
  398. workflow.CreatorName = creator.Name;
  399. }
  400. if (creatorOrg != null)
  401. {
  402. workflow.CreatorOrgId = creatorOrg.Id;
  403. workflow.CreatorOrgName = creatorOrg.Name;
  404. workflow.CreatorOrgLevel = creatorOrg.Level;
  405. workflow.AreaId = creatorOrg.AreaId;
  406. }
  407. if (workflow.ModuleCode == "OrderHandle")
  408. {
  409. workflow.FlowType = DataTransmission.Enum.EFlowType.Handle;
  410. workflow.ReviewResult = DataTransmission.Enum.EReviewResult.Unknown;
  411. workflow.ExternalId = order.FSH_FlowID;
  412. }
  413. else if (workflow.ModuleCode == "OrderDelay")
  414. {
  415. workflow.FlowType = DataTransmission.Enum.EFlowType.Review;
  416. //workflow.ReviewResult = delay.DelayState == EDelayState.Pass ? EReviewResult.Approval : delay.DelayState == EDelayState.NoPass ? EReviewResult.Failed : EReviewResult.Unknown;
  417. //workflow.ExternalId = delay.Id;
  418. }
  419. for (int i = 0;i < workflowDtos.Count;i++)
  420. {
  421. await InsertWorkflowStepAsync(workflowDtos[i], workflow, i == 1, workflowDtos.Count == i + 1, isEnd, token);
  422. }
  423. _workflowRepository.InsertBulk(workflow, isEnd);
  424. return true;
  425. }
  426. public async Task InsertWorkflowStepAsync(WorkflowDto item, Workflow workflow, bool start, bool end, bool isEnd, CancellationToken token)
  427. {
  428. var step = new WorkflowStep();
  429. step.InitId();
  430. step.FlowAssignType = DataTransmission.Entity.EFlowAssignType.User;
  431. step.WorkflowId = workflow.Id;
  432. step.ModuleCode = workflow.ModuleCode;
  433. step.ModuleId = workflow.ModuleId;
  434. step.Code = string.Empty;
  435. var acceptor = Users.FirstOrDefault(m => m.OldUserId == item.FTRB_APUserID);
  436. var acceptorOrg = Organizers.FirstOrDefault(m => m.oldBmid == item.FTRB_APBMID);
  437. //Handler
  438. var handler = Users.FirstOrDefault(m => m.OldUserId.ToString() == item.FTRB_UserID);
  439. SystemOrganize handlerOrg = null;
  440. if (handler != null)
  441. {
  442. handlerOrg = Organizers.FirstOrDefault(m => m.Id == handler.OrgId);
  443. }
  444. //Creator
  445. var creator = Users.FirstOrDefault(m => m.OldUserId == item.FTRB_MoveUserID);
  446. SystemOrganize creatorOrg = null;
  447. if (creator != null)
  448. {
  449. creatorOrg = Organizers.FirstOrDefault(m => m.Id == creator.OrgId);
  450. }
  451. step.PrevStepId = item.FTRB_PRunID;
  452. step.PrevStepCode = string.Empty;
  453. step.AcceptorId = item.FTRB_APUserID.ToString();
  454. if (acceptor != null)
  455. {
  456. step.AcceptorId = acceptor.Id;
  457. step.AcceptorName = acceptor.Name;
  458. }
  459. step.AcceptorOrgId = item.FTRB_APBMID.ToString();
  460. if (acceptorOrg != null)
  461. {
  462. step.AcceptorOrgId = acceptorOrg.Id;
  463. step.AcceptorOrgName = acceptorOrg.Name;
  464. step.AcceptorOrgAreaCode = acceptorOrg.AreaCode;
  465. step.AcceptorOrgAreaName = acceptorOrg.AreaName;
  466. }
  467. step.AcceptTime = item.FTRB_APDate.IsNullOrEmpty() ? null : item.FTRB_APDate.ObjToDate();
  468. if (handler is null)
  469. {
  470. step.HandlerId = item.FTRB_UserID;
  471. step.HandlerName = string.Empty;
  472. }
  473. else
  474. {
  475. step.HandlerId = handler.Id;
  476. step.HandlerName = handler.Name;
  477. }
  478. if (handlerOrg != null)
  479. {
  480. step.HandlerOrgId = handlerOrg.Id;
  481. step.HandlerOrgName = handlerOrg.Name;
  482. step.HandlerOrgAreaCode = handlerOrg.AreaCode;
  483. step.HandlerOrgAreaName = handlerOrg.AreaName;
  484. step.HandlerOrgIsCenter = bool.Parse(handlerOrg.IsCenter.ToString());
  485. }
  486. else
  487. {
  488. step.HandlerOrgName = "热线中心";
  489. step.HandlerOrgId = config.CenterId.ToString();
  490. step.HandlerOrgAreaCode = string.Empty;
  491. step.HandlerOrgAreaName = string.Empty;
  492. step.HandlerOrgIsCenter = false;
  493. }
  494. step.HandleTime = item.FTRB_DisposeDate.ToDate();
  495. step.Name = item.FTRB_ItemName;
  496. step.StepType = start ? DataTransmission.Enum.EStepType.Start : end ? DataTransmission.Enum.EStepType.End : DataTransmission.Enum.EStepType.Normal;
  497. step.BusinessType = item.FTRB_ItemName.Contains("话务") ? DataTransmission.Enum.EBusinessType.Seat : item.FTRB_ItemName.Contains("派单") ? DataTransmission.Enum.EBusinessType.Send :
  498. item.FTRB_ItemName.Contains("结束") || item.FTRB_ItemName.Contains("发布") || item.FTRB_ItemName.Contains("回访") ? DataTransmission.Enum.EBusinessType.File : DataTransmission.Enum.EBusinessType.Department;
  499. step.Opinion = item.FTRB_RRemark;
  500. step.StepExpiredTime = item.FTRB_TTime.ToDate();
  501. step.CreationTime = item.FTRB_MoveDate.ObjToDate();
  502. if (creator != null)
  503. {
  504. step.CreatorId = creator.Id;
  505. step.CreatorName = creator.Name;
  506. }
  507. else
  508. {
  509. step.CreatorId = item.FTRB_MoveUserID.ToString();
  510. step.CreatorName = string.Empty;
  511. }
  512. if (creatorOrg != null)
  513. {
  514. step.CreatorOrgId = creatorOrg.Id;
  515. step.CreatorOrgName = creatorOrg.Name;
  516. step.CreatorOrgLevel = creatorOrg.Level;
  517. step.AreaId = creatorOrg.AreaId;
  518. step.AssignerOrgIsCenter = creatorOrg.IsCenter;
  519. }
  520. else
  521. {
  522. step.CreatorOrgName = "热线中心";
  523. step.CreatorOrgId = config.CenterId.ToString();
  524. step.CreatorOrgLevel = 1;
  525. step.AreaId = string.Empty;
  526. step.AssignerOrgIsCenter = true;
  527. }
  528. _workflowStepRepository.InsertBulk(step, isEnd);
  529. await InsertWorkflowTraceAsync(step, isEnd);
  530. }
  531. public async Task InsertWorkflowTraceAsync(WorkflowStep step, bool isEnd)
  532. {
  533. var trace = step.Adapt<WorkflowTrace>();
  534. trace.InitId();
  535. _workflowTraceRepository.InsertBulk(trace, isEnd);
  536. }
  537. public async Task InsertPublishAsync(string flowId, string orderId, bool isEnd, CancellationToken token)
  538. {
  539. var publishItems = await GetOldPublishAsync(flowId, token);
  540. foreach (var item in publishItems)
  541. {
  542. var creator = Users.FirstOrDefault(m => m.OldUserId == item.FPLT_PubUserID);
  543. var creatorOrg = Organizers.FirstOrDefault(m => m.Id == creator.OrgId);
  544. var publish = item.Adapt<OrderPublish>();
  545. publish.PublishState = item.FPLT_PubFlag == "2" ? true : false;
  546. if (creatorOrg != null)
  547. {
  548. publish.CreatorOrgId = creatorOrg.Id;
  549. publish.CreatorOrgName = creatorOrg.Name;
  550. publish.CreatorOrgLevel = creatorOrg.Level;
  551. publish.AreaId = creatorOrg.AreaId;
  552. }
  553. if (creator != null)
  554. {
  555. publish.CreatorId = creator.Id;
  556. publish.CreatorName = creator.Name;
  557. }
  558. publish.OrderId = orderId;
  559. _orderPublishRepository.InsertBulk(publish, isEnd);
  560. }
  561. }
  562. public async Task InsertVisitAsync(string flowId, Order order, bool isEnd, CancellationToken token)
  563. {
  564. var oldVisitItems = await GetVisitAsync(flowId, token);
  565. var item = oldVisitItems.FirstOrDefault();
  566. if (item == null) return;
  567. SystemOrganize ogrRow = Organizers.First(m => m.oldBmid == item.FALT_AppBMID);
  568. var VisitOrgCode = ogrRow.Id.IsNullOrEmpty() ? item.FALT_AppBMID.ToString() : ogrRow.Id;
  569. string? EmployeeId = null;
  570. try
  571. {
  572. EmployeeId = Users.First(m => m.OldUserId == item.FALT_UserID)?.Id;
  573. }
  574. catch (Exception e)
  575. {
  576. }
  577. var creator = Users.FirstOrDefault(m => m.OldUserId == item.FALT_InsertUserID);
  578. var creatorOrg = Organizers.FirstOrDefault(m => m.Id == creator.OrgId);
  579. var visit = new OrderVisit();
  580. visit.InitId();
  581. visit.No = order.OldId;
  582. visit.OrderId = order.Id;
  583. visit.PublishTime = item.FPLT_PubDate.ObjToDate();
  584. visit.EmployeeId = EmployeeId;
  585. visit.VisitTime = item.FALT_CallDate.ObjToDate();
  586. visit.CreationTime = item.FALT_InsertDate.ObjToDate();
  587. visit.CreatorId = item.FALT_InsertUserID.ToString();
  588. visit.VisitState = DataTransmission.Enum.EVisitState.Visited;
  589. visit.VisitType = DataTransmission.Enum.EVisitType.ArtificialVisit;
  590. visit.IsPutThrough = true;
  591. if (creator != null)
  592. {
  593. visit.CreatorId = creator.Id;
  594. visit.CreatorName = creator.Name;
  595. }
  596. if (creatorOrg != null)
  597. {
  598. visit.CreatorOrgId = creatorOrg.Id;
  599. visit.CreatorOrgName = creatorOrg.Name;
  600. visit.CreatorOrgLevel = creatorOrg.Level;
  601. visit.AreaId = creatorOrg.AreaId;
  602. }
  603. visit.NowEvaluate = new Kv
  604. {
  605. Key = GetSatisfaction(item.FALT_AppTypeBName),
  606. Value = item.FALT_AppTypeName
  607. };
  608. visit.AgainState = DataTransmission.Enum.EAgainState.NoAgain;
  609. visit.IsCanHandle = false;
  610. visit.IsCanAiVisit = false;
  611. visit.CallId = null;
  612. visit.FirstVisitTime = visit.VisitTime;
  613. visit.LastVisitTime = visit.VisitTime;
  614. visit.AiVisitCount = 0;
  615. _orderVisitRepository.InsertBulk(visit, isEnd);
  616. // 坐席
  617. var seatDetail = new OrderVisitDetail();
  618. seatDetail.InitId();
  619. seatDetail.VisitId = visit.Id;
  620. seatDetail.CreationTime = item.FALT_InsertDate.ObjToDate();
  621. seatDetail.VisitTarget = DataTransmission.Enum.EVisitTarget.Seat;
  622. seatDetail.VoiceEvaluate = GetSatisfaction(item.FALT_SeatsTypeName).ToEnum<EVoiceEvaluate>();
  623. seatDetail.SeatEvaluate = GetSeatSatisfaction(item.FALT_SeatsTypeName).ToEnum<ESeatEvaluate>();
  624. seatDetail.CreatorOrgId = visit.CreatorOrgId;
  625. seatDetail.CreatorId = visit.CreatorId;
  626. seatDetail.AreaId = visit.AreaId;
  627. seatDetail.CreatorOrgName = visit.CreatorOrgName;
  628. seatDetail.CreatorName = visit.CreatorName;
  629. seatDetail.CreatorOrgLevel = visit.CreatorOrgLevel;
  630. _orderVisitDetailRepository.InsertBulk(seatDetail, isEnd);
  631. foreach (var orgVisit in oldVisitItems)
  632. {
  633. // 部门
  634. var bmDetail = seatDetail.ToJson().FromJson<OrderVisitDetail>();
  635. bmDetail.InitId();
  636. bmDetail.VisitTarget = DataTransmission.Enum.EVisitTarget.Org;
  637. if ((orgVisit.FALT_AppTypeName == "非常不满意" || orgVisit.FALT_AppTypeName == "不满意") && !string.IsNullOrEmpty(orgVisit.SDICT_Name))
  638. {
  639. bmDetail.OrgNoSatisfiedReason = new List<Kv> {
  640. new() {
  641. Key = GetDissatisfiedReason(orgVisit.SDICT_Name, config),
  642. Value = orgVisit.SDICT_Name
  643. }
  644. };
  645. }
  646. bmDetail.OrgProcessingResults = new Kv
  647. {
  648. Key = GetVisitSatisfaction(orgVisit.FALT_AppTypeName),
  649. Value = orgVisit.FALT_AppTypeName
  650. };
  651. bmDetail.OrgHandledAttitude = new Kv
  652. {
  653. Key = GetVisitSatisfaction(orgVisit.FALT_AppTypeBName),
  654. Value = orgVisit.FALT_AppTypeBName
  655. };
  656. bmDetail.VisitContent = orgVisit.FALT_ZxRemark;
  657. bmDetail.VisitOrgCode = VisitOrgCode;
  658. bmDetail.VisitOrgName = orgVisit.SBM_Name;
  659. _orderVisitDetailRepository.InsertBulk(bmDetail, isEnd);
  660. }
  661. }
  662. public async Task InsertDelayAsync(OrderFullEntity order, Order target, bool isEnd, CancellationToken token)
  663. {
  664. var oldDelay = await GetDelayAsync(order.FSH_FlowID, token);
  665. foreach (var delay in oldDelay)
  666. {
  667. var model = new OrderDelay();
  668. model.InitId();
  669. var applyOrg = Organizers.FirstOrDefault(m => m.oldBmid.ToString() == delay.FPE_BMID);
  670. var applyUser = Users.FirstOrDefault(m => m.OldUserId == delay.FPE_UserID);
  671. model.No = order.Id;
  672. model.OrderId = target.Id;
  673. model.ApplyDelayTime = delay.FPE_FPDate.ObjToDate();
  674. model.ApplyOrgCode = delay.FPE_BMID;
  675. model.CreatorOrgId = model.ApplyOrgCode;
  676. if (applyOrg != null)
  677. {
  678. model.ApplyOrgCode = applyOrg.Id;
  679. model.ApplyOrgName = applyOrg.Name;
  680. model.CreatorOrgId = applyOrg.Id;
  681. model.AreaId = applyOrg.AreaId;
  682. model.CreatorOrgName = applyOrg.Name;
  683. model.CreatorOrgLevel = applyOrg.Level;
  684. }
  685. model.EmployeeId = delay.FPE_UserID.ToString();
  686. model.CreatorId = model.EmployeeId;
  687. if (applyUser != null)
  688. {
  689. model.EmployeeId = applyUser.Id;
  690. model.EmployeeName = applyUser.Name;
  691. model.CreatorId = applyUser.Id;
  692. model.CreatorName = applyUser.Name;
  693. }
  694. model.DelayNum = delay.FPE_SLimits.ObjToInt();
  695. model.DelayReason = delay.FPE_Reson;
  696. model.AfterDelay = delay.FPE_FPDate.ObjToDate();
  697. model.DelayState = (EDelayState)int.Parse(delay.FPE_AuditFlag);
  698. model.CreationTime = delay.FPE_FPDate.ObjToDate();
  699. _orderDelayRepository.InsertBulk(model, isEnd);
  700. }
  701. }
  702. public async Task InsertPointsAsync(Action<string> log, OrderFullEntity item, Order target, bool isEnd, CancellationToken token)
  703. {
  704. if (item.FSH_AddDate.ObjToDate() <= new DateTime(2024, 12, 31, 23, 59, 59)) return;
  705. if (item.FSH_IndustryName != "安全隐患" && item.FSH_IndustryName != "电气焊作业申报") return;
  706. var points = new SnapshotPointsRecord
  707. {
  708. UserId = await GetUserIdByOpenIdAsync(log, item.WFAT_WXOpenid, item.Id, token),
  709. Source = EPointsSource.Report,
  710. Points = 1,
  711. Direction = EPointsDirection.In,
  712. OrderId = target.Id,
  713. CreationTime = item.FSH_AddDate.ObjToDate()
  714. };
  715. if (points.UserId.IsNullOrEmpty())
  716. {
  717. return;
  718. }
  719. _pointsRecordRepository.InsertBulk(points, isEnd);
  720. }
  721. public string GetUserId(object oldId)
  722. {
  723. return Users.FirstOrDefault(m => m.OldUserId == oldId.ObjToInt())?.Id;
  724. }
  725. public string GetUserName(object oldId)
  726. {
  727. return Users.FirstOrDefault(m => m.OldUserId == oldId.ObjToInt())?.Name;
  728. }
  729. public async Task<string> GetUserIdByOpenIdAsync(Action<string> log, string openId, string fsh_code, CancellationToken token)
  730. {
  731. if (openId.IsNullOrEmpty()) return null;
  732. var user = ThirdAccounts.FirstOrDefault(m => m.OpenId == openId);
  733. if (user != null) return user.ExternalId;
  734. var newThirdAccounts = await _snapshotUserInfoApplication.InsertByOpenIdAsync(log, openId, token);
  735. foreach (var item in newThirdAccounts)
  736. {
  737. ThirdAccounts.Add(item);
  738. }
  739. user = ThirdAccounts.FirstOrDefault(m => m.OpenId == openId);
  740. if (user != null) return user.ExternalId;
  741. Logs.Err($"工单: {fsh_code} 缺少第三方账号数据: openId [{openId}]");
  742. return null;
  743. }
  744. public async Task<IList<Flow11_PostponeEntity>> GetDelayAsync(string flowId, CancellationToken token)
  745. {
  746. return await _flow11PostponeRepository.Queryable()
  747. .Where(m => m.FPE_FlowID == flowId && m.FPE_AuditFlag == "1")
  748. .ToListAsync(token);
  749. }
  750. public async Task<IList<OldVisitDto>> GetVisitAsync(string flowId, CancellationToken token)
  751. {
  752. var query = _flow18AppraiseListRepository.Queryable()
  753. .LeftJoin<Flow15_PubListEntity>((FA, FP) => FA.FALT_FlowID == FP.FPLT_FlowID)
  754. .LeftJoin<Flow18_AppraiseExpandEntity>((FA, FP, FAE) => FAE.FAED_FALTID == FA.Id)
  755. .LeftJoin<SYS15_DICTEntity>((FA, FP, FAE, SD) => SD.SDICT_Key == "Appraise_DissType" && SD.SDICT_PID != 0 && FAE.FAED_DissTypeID == SD.Id)
  756. .LeftJoin<SYS09_BMDIREntity>((FA, FP, FAE, SD, SBM) => FA.FALT_AppBMID == SBM.Id)
  757. .Where((FA, FP, FAE, SD, SBM) => FA.FALT_FlowID == flowId && FA.FALT_AppFlag == 1)
  758. .Select((FA, FP, FAE, SD, SBM) => new OldVisitDto(), true);
  759. return await query.ToListAsync(token);
  760. }
  761. public async Task<IList<OldPublishDto>> GetOldPublishAsync(string flowdId, CancellationToken token)
  762. {
  763. var query = _flow16PubIdeaRepository.Queryable()
  764. .LeftJoin<Flow03_Search>((FP, FS) => FP.FPIA_FlowID == FS.Id)
  765. .LeftJoin<Flow15_PubListEntity>((FP, FS, FPL) => FP.FPIA_FlowID == FPL.FPLT_FlowID)
  766. .Where((FP, FS, FPL) => FP.FPIA_FlowID == flowdId)
  767. .Select((FP, FS, FPL) => new OldPublishDto(), true);
  768. return await query.ToListAsync(token);
  769. }
  770. public async Task<IList<WorkflowDto>> GetWorkflow(string oldOrderId, string storeCode, CancellationToken token)
  771. {
  772. var query = _flowTransfer01RunBackupsRepository.Queryable()
  773. .LeftJoin<Flow_Set01_Store>((FTR, FSS) => FTR.FTRB_StoreID == FSS.Id)
  774. .LeftJoin<Flow03_Search>((FTR, FSS, FS) => FTR.FTRB_FlowID == FS.Id)
  775. .Where((FTR, FSS, FS) => FTR.FTRB_FlowID == oldOrderId && FSS.FSL_Code == storeCode)
  776. .OrderBy((FTR, FSS, FS) => FTR.FTRB_MoveDate)
  777. .Select((FTR, FSS, FS) => new WorkflowDto(), true);
  778. var sql = query.ToSqlString();
  779. return await query.ToListAsync(token);
  780. }
  781. private (string sql, List<SugarParameter> parameters) GetOrderSql(CreateInstanceInDto inDto)
  782. {
  783. var sql = "SELECT ROW_NUMBER() OVER (ORDER BY FSH_FlowID) AS Serial, CHPRCI.RCI_FlowID,*,REPLACE(CAST(FCT.FCT_Content AS NVARCHAR(MAX)),CHAR(13)+CHAR(10), '') 受理内容, CASE WHEN ISNULL(FSH_DisposeDate, GETDATE()) > FSH_TTime THEN '超期' WHEN ISNULL(FSH_DisposeDate, GETDATE()) > FSH_EightyTTime THEN '即将超期' ELSE '正常' END AS FSH_OverTimeState, REPLACE(REPLACE(FSH_Title, '</font>', ''), '<font color=mediumorchid>', '') AS FSH_Title_ys, REPLACE(CAST(ISNULL(FTC2.FTC_RRemark,FTRB.FTRB_RRemark) AS NVARCHAR(MAX)),CHAR(13)+CHAR(10), '') 承办意见, (case when bml.SBML_OneBMID =0 then FSH_AcceptBMID else SBML_OneBMID end) OneOrgId FROM dbo.Flow03_Search FSH " +
  784. "LEFT JOIN Flow02_From FRM ON FSH.FSH_FromID = FRM.FFM_FromID " +
  785. "LEFT JOIN dbo.Flow05_LinkMan FLM ON FSH.FSH_FlowID = FLM.FLM_FlowID " +
  786. "LEFT JOIN dbo.Flow01_Type FT ON FT.FTE_TypeFlag =2 AND FSH.FSH_ConTypeID = FT.FTE_TypeID " +
  787. "LEFT JOIN dbo.SYS19_Area SA ON FSH.FSH_AreaID = SA.SA_AreaID " +
  788. "LEFT JOIN dbo.Flow04_Expand FED ON FSH.FSH_FlowID = FED.FED_FlowID " +
  789. "LEFT JOIN Flow06_Content FCT WITH(NOLOCK) ON FCT.FCT_FlowID = FSH.FSH_FlowID " +
  790. "OUTER APPLY (SELECT TOP 1 * FROM ZG_CityHotline_Ver3.dbo.Flow18_AppraiseList pc WHERE pc.FALT_FlowID = FSH.FSH_FlowID ORDER BY pc.FALT_ListID DESC) AS FAL " +
  791. "LEFT JOIN Flow_Transfer04_Specialty FTS WITH(NOLOCK) ON FTS.FTS_FlowID = FSH.FSH_FlowID " +
  792. "LEFT JOIN Flow_Transfer02_Content FTC2 WITH(NOLOCK) ON FTC2.FTC_RunID = FTS.FTS_RunID " +
  793. "LEFT JOIN Flow_Transfer01_RunBackups FTRB WITH(NOLOCK) ON FTS.FTS_RunID =FTRB.FTRB_RunID " +
  794. "LEFT JOIN CityHotline_Province.dbo.receive_case_info CHPRCI ON CHPRCI.RCI_FlowID = FSH.FSH_FlowID " +
  795. "LEFT JOIN ZG_CityHotline_Web.dbo.Web09_FlowAccept Web09_FlowAccept ON Web09_FlowAccept.WFAT_SyncFlowID = FSH.FSH_FlowID " +
  796. "LEFT JOIN ZG_CityHotline_Web.dbo.Web60_EGWAccept Web60_EGWAccept ON Web60_EGWAccept.WEA_AcceptID = Web09_FlowAccept.WFAT_AcceptID " +
  797. "OUTER APPLY (SELECT TOP 1 * FROM ZG_CityHotline_Ver3.dbo.SSP_TagLog pc WHERE pc.STL_FlowID = FTS.FTS_FlowID ORDER BY pc.STL_ID DESC) AS SSP_TagLog " +
  798. "OUTER APPLY (SELECT TOP 1 SWLS.*,STUFF((SELECT '|' + SWLS2.SWLS_TypeName FROM ZG_CityHotline_Ver3.dbo.SSP_WorkLabelSign SWLS2 WHERE SWLS2.SWLS_FlowID = SWLS.SWLS_FlowID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS SWLS_TypeName_All FROM ZG_CityHotline_Ver3.dbo.SSP_WorkLabelSign SWLS WHERE SWLS.SWLS_FlowID = FSH.FSH_FlowID ORDER BY SWLS.SWLS_ID DESC) AS LabelSign " +
  799. "OUTER APPLY (SELECT TOP 1 * FROM ZG_CityHotline_Ver3.dbo.Flow03_PushContent pc WHERE pc.FPC_Code = FSH.FSH_Code ORDER BY pc.FPC_ID DESC) AS PushContent " +
  800. "LEFT JOIN ZG_CityHotline_Web.dbo.Web32_UserWrite UserWrite on UserWrite.WUW_AcceptID = Web09_FlowAccept.WFAT_AcceptID " +
  801. "left join SYS09_BMDIR_Level bml on SBML_BMID=FSH_AcceptBMID ";
  802. if (inDto.Keyword.NotNullOrEmpty())
  803. {
  804. var parameters = new List<SugarParameter>
  805. {
  806. new("@numberCode", inDto.Keyword),
  807. };
  808. sql += "WHERE FSH_Code = @numberCode;";
  809. return (sql, parameters);
  810. }
  811. else
  812. {
  813. var parameters = new List<SugarParameter>
  814. {
  815. new("@st_time", inDto.StartTime),
  816. new("@end_time", inDto.EndTime),
  817. };
  818. sql += "WHERE FSH_AddDate >= @st_time AND FSH_AddDate <= @end_time AND ISNULL(FAL.FALT_ListID,0) > 0 AND FAL.FALT_AppFlag ='1' AND (FSH_FromID = 25 OR FSH_FromID = 26);";
  819. return (sql, parameters);
  820. }
  821. }
  822. private string GetAcceptTypeCode(string name)
  823. {
  824. var acceptTypeCode = string.Empty;
  825. switch (name)
  826. {
  827. case "其他":
  828. acceptTypeCode = "40";
  829. break;
  830. case "表扬":
  831. acceptTypeCode = "25";
  832. break;
  833. case "举报":
  834. acceptTypeCode = "30";
  835. break;
  836. case "投诉":
  837. acceptTypeCode = "35";
  838. break;
  839. case "咨询":
  840. acceptTypeCode = "10";
  841. break;
  842. case "建议":
  843. acceptTypeCode = "15";
  844. break;
  845. case "求助":
  846. acceptTypeCode = "20";
  847. break;
  848. case "意见":
  849. acceptTypeCode = "1";
  850. break;
  851. case "惠民帮助":
  852. acceptTypeCode = "2";
  853. break;
  854. case "大气污染举报":
  855. acceptTypeCode = "3";
  856. break;
  857. default:
  858. acceptTypeCode = "0";
  859. break;
  860. }
  861. return acceptTypeCode;
  862. }
  863. private string GetVisitSatisfaction(string name)
  864. {
  865. var v = VisitSatisfaction.FirstOrDefault(m => m.DicDataName == name);
  866. if (v != null) return v.DicDataValue;
  867. return "-1";
  868. throw new Exception("没有对应的回访满意度");
  869. }
  870. private string GetSatisfaction(string name)
  871. {
  872. return name switch
  873. {
  874. "非常不满意" => "1",
  875. "不满意" => "2",
  876. "一般" => "3",
  877. "满意" => "4",
  878. "非常满意" => "5",
  879. "未接通" => "8",
  880. "未做评价" => "7",
  881. "视为满意" => "-1",
  882. "默认满意" => "9",
  883. _ => "-2",
  884. };
  885. }
  886. private string GetSeatSatisfaction(string name)
  887. {
  888. return name switch
  889. {
  890. "非常不满意" => "1",
  891. "不满意" => "2",
  892. "一般" => "3",
  893. "满意" => "4",
  894. "非常满意" => "5",
  895. "未接通" => "6",
  896. "未做评价" => "7",
  897. "视为满意" => "-1",
  898. "默认满意" => "0",
  899. _ => "-2",
  900. };
  901. }
  902. private string GetDissatisfiedReason(string name, DataTransmission.Entity.Config config)
  903. {
  904. switch (config.Name)
  905. {
  906. case "宜宾市":
  907. return GetDissatisfiedReason_YB(name);
  908. case "自贡市":
  909. return GetDissatisfiedReason_ZG(name);
  910. case "泸州市":
  911. return GetDissatisfiedReason_LZ(name);
  912. default:
  913. return "";
  914. }
  915. }
  916. private string GetDissatisfiedReason_YB(string name)
  917. {
  918. var dissatisfiedReason = string.Empty;
  919. switch (name)
  920. {
  921. case "回复敷衍":
  922. dissatisfiedReason = "1";
  923. break;
  924. case "办件推诿":
  925. dissatisfiedReason = "2";
  926. break;
  927. case "未有效处理工单问题":
  928. dissatisfiedReason = "3";
  929. break;
  930. case "处理案件力度不够":
  931. dissatisfiedReason = "4";
  932. break;
  933. case "未与市民联系":
  934. dissatisfiedReason = "5";
  935. break;
  936. case "阶段性回复":
  937. dissatisfiedReason = "6";
  938. break;
  939. case "未回复":
  940. dissatisfiedReason = "7";
  941. break;
  942. case "对部门工作人员态度不满意":
  943. dissatisfiedReason = "8";
  944. break;
  945. default:
  946. dissatisfiedReason = "";
  947. break;
  948. }
  949. return dissatisfiedReason;
  950. }
  951. private string GetDissatisfiedReason_ZG(string name)
  952. {
  953. var dissatisfiedReason = string.Empty;
  954. switch (name)
  955. {
  956. case "回复敷衍":
  957. dissatisfiedReason = "1";
  958. break;
  959. case "办件推诿":
  960. dissatisfiedReason = "2";
  961. break;
  962. case "未有效处理工单问题":
  963. dissatisfiedReason = "3";
  964. break;
  965. case "处理案件力度不够,重视程度不高":
  966. dissatisfiedReason = "4";
  967. break;
  968. case "部门回复与市民诉求不一致":
  969. dissatisfiedReason = "5";
  970. break;
  971. case "个人诉求未满足":
  972. dissatisfiedReason = "6";
  973. break;
  974. case "未与市民联系":
  975. dissatisfiedReason = "7";
  976. break;
  977. case "对部门工作人员态度不满意":
  978. dissatisfiedReason = "8";
  979. break;
  980. case "办件时间长":
  981. dissatisfiedReason = "9";
  982. break;
  983. case "阶段性回复":
  984. dissatisfiedReason = "10";
  985. break;
  986. case "其他":
  987. dissatisfiedReason = "11";
  988. break;
  989. default:
  990. dissatisfiedReason = "";
  991. break;
  992. }
  993. return dissatisfiedReason;
  994. }
  995. private string GetDissatisfiedReason_LZ(string name)
  996. {
  997. var dissatisfiedReason = string.Empty;
  998. switch (name)
  999. {
  1000. case "回复敷衍":
  1001. dissatisfiedReason = "1";
  1002. break;
  1003. case "办件推诿":
  1004. dissatisfiedReason = "2";
  1005. break;
  1006. case "未有效处理工单问题":
  1007. dissatisfiedReason = "3";
  1008. break;
  1009. case "处理案件力度不够":
  1010. dissatisfiedReason = "4";
  1011. break;
  1012. case "未与市民联系":
  1013. dissatisfiedReason = "5";
  1014. break;
  1015. case "阶段性回复":
  1016. dissatisfiedReason = "6";
  1017. break;
  1018. case "未回复":
  1019. dissatisfiedReason = "7";
  1020. break;
  1021. case "对部门工作人员态度不满意":
  1022. dissatisfiedReason = "8";
  1023. break;
  1024. default:
  1025. dissatisfiedReason = "";
  1026. break;
  1027. }
  1028. return dissatisfiedReason;
  1029. }
  1030. }